fix: meaningful error messages for domain validation (#6677)

* feat: meaningful error messages for domain validation

* fix: duplicated error code and fix some org codes

* fix: add @peintnermax i18n suggestions

---------

Co-authored-by: Elio Bischof <elio@zitadel.com>
This commit is contained in:
Miguel Cabrerizo 2023-10-10 14:02:16 +02:00 committed by GitHub
parent 89fffd6bd6
commit e66d476c47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 83 additions and 13 deletions

View File

@ -1,6 +1,7 @@
package http
import (
errorsAs "errors"
"fmt"
"io/ioutil"
"net"
@ -36,6 +37,9 @@ func ValidateDomainHTTP(domain, token, verifier string) error {
return errors.ThrowInternal(err, "HTTP-BH42h", "Errors.Internal")
}
if resp.StatusCode != 200 {
if resp.StatusCode == 404 {
return errors.ThrowNotFound(err, "ORG-F4zhw", "Errors.Org.DomainVerificationHTTPNotFound")
}
return errors.ThrowInternal(err, "HTTP-G2zsw", "Errors.Internal")
}
defer resp.Body.Close()
@ -46,12 +50,21 @@ func ValidateDomainHTTP(domain, token, verifier string) error {
if string(body) == verifier {
return nil
}
return errors.ThrowInvalidArgument(err, "HTTP-GH422", "Errors.Internal")
return errors.ThrowNotFound(err, "ORG-GH422", "Errors.Org.DomainVerificationHTTPNoMatch")
}
func ValidateDomainDNS(domain, verifier string) error {
txtRecords, err := net.LookupTXT(tokenUrlDNS(domain))
if err != nil {
var dnsError *net.DNSError
if errorsAs.As(err, &dnsError) {
if dnsError.IsNotFound {
return errors.ThrowNotFound(err, "ORG-G241f", "Errors.Org.DomainVerificationTXTNotFound")
}
if dnsError.IsTimeout {
return errors.ThrowNotFound(err, "ORG-K563l", "Errors.Org.DomainVerificationTimeout")
}
}
return errors.ThrowInternal(err, "HTTP-Hwsw2", "Errors.Internal")
}
@ -60,7 +73,7 @@ func ValidateDomainDNS(domain, verifier string) error {
return nil
}
}
return errors.ThrowInvalidArgument(err, "HTTP-G241f", "Errors.Internal")
return errors.ThrowNotFound(err, "ORG-G28if", "Errors.Org.DomainVerificationTXTNoMatch")
}
func TokenUrl(domain, token string, checkType CheckType) (string, error) {

View File

@ -213,9 +213,11 @@ func (c *Commands) ValidateOrgDomain(ctx context.Context, orgDomain *domain.OrgD
return writeModelToObjectDetails(&domainWriteModel.WriteModel), nil
}
events = append(events, org.NewDomainVerificationFailedEvent(ctx, orgAgg, orgDomain.Domain))
_, err = c.eventstore.Push(ctx, events...)
logging.LogWithFields("ORG-dhTE", "orgID", orgAgg.ID, "domain", orgDomain.Domain).OnError(err).Error("NewDomainVerificationFailedEvent push failed")
return nil, errors.ThrowInvalidArgument(err, "ORG-GH3s", "Errors.Org.DomainVerificationFailed")
_, errPush := c.eventstore.Push(ctx, events...)
logging.LogWithFields("ORG-dhTE", "orgID", orgAgg.ID, "domain", orgDomain.Domain).OnError(errPush).Error("NewDomainVerificationFailedEvent push failed")
return nil, err
}
func (c *Commands) SetPrimaryOrgDomain(ctx context.Context, orgDomain *domain.OrgDomain) (*domain.ObjectDetails, error) {

View File

@ -62,7 +62,7 @@ Errors:
DomainNotAllowedAsUsername: Домейнът вече е резервиран и не може да се използва
AlreadyInactive: Потребителят вече е неактивен
NotInactive: Потребителят не е неактивен
CantDeactivateInitial: 'Потребител с начално състояние може да бъде изтрит, но не и деактивиран'
CantDeactivateInitial: "Потребител с начално състояние може да бъде изтрит, но не и деактивиран"
ShouldBeActiveOrInitial: Потребителят не е активен или начален
AlreadyInitialised: Потребителят вече е инициализиран
NotInitialised: Потребителят все още не е инициализиран
@ -184,6 +184,11 @@ Errors:
DomainVerificationTypeInvalid: Типът проверка на домейна е невалиден
DomainVerificationMissing: Проверката на домейна все още не е започнала
DomainVerificationFailed: Неуспешна проверка на домейна
DomainVerificationTXTNotFound: TXT записът _zitadel-challenge не беше намерен за вашия домейн. Проверете дали сте го добавили към вашия DNS сървър или изчакайте, докато новият запис бъде разпространен
DomainVerificationTXTNoMatch: TXT записът _zitadel-challenge е намерен за вашия домейн, но не съдържа правилния текст на токена. Проверете дали сте добавили правилния токен към вашия DNS сървър или изчакайте, докато новият запис бъде разпространен
DomainVerificationHTTPNotFound: Файлът, съдържащ предизвикателството, не е намерен в очаквания URL адрес. Проверете дали сте качили файла на правилното място с разрешения за четене
DomainVerificationHTTPNoMatch: Файлът, съдържащ предизвикателството, е намерен в очаквания URL адрес, но не съдържа правилния текст на токена. Проверете съдържанието му
DomainVerificationTimeout: Имаше изчакване при запитване до DNS сървъра
PrimaryDomainNotDeletable: Основният домейн не трябва да се изтрива
DomainNotFound: Домейнът не е намерен
MemberIDMissing: Липсва ID на член
@ -198,7 +203,7 @@ Errors:
IdpIsNotOIDC: IDP конфигурацията не е от тип oidc
Domain:
AlreadyExists: Домейнът вече съществува
InvalidCharacter: 'Само буквено-цифрови знаци, . '
InvalidCharacter: "Само буквено-цифрови знаци, . "
IDP:
InvalidSearchQuery: Невалидна заявка за търсене
ClientIDMissing: Липсва ClientID
@ -838,7 +843,7 @@ EventTypes:
added: Вторият фактор е добавен към правилата за влизане
removed: Вторият фактор е премахнат от правилата за влизане
multifactor:
added: 'Много фактор, добавен към правилата за влизане'
added: "Много фактор, добавен към правилата за влизане"
removed: Мултифакторът е премахнат от правилата за влизане
password:
complexity:

View File

@ -182,6 +182,11 @@ Errors:
DomainVerificationTypeInvalid: Verifikationstyp der Domäne ist ungültig
DomainVerificationMissing: Verifikation der Domäne noch nicht erstellt
DomainVerificationFailed: Verifikation der Domäne ist fehlgeschlagen
DomainVerificationTXTNotFound: Der TXT-Eintrag _zitadel-challenge wurde für Ihre Domain nicht gefunden. Überprüfen Sie, ob Sie ihn zu Ihrem DNS-Server hinzugefügt haben, oder warten Sie, bis der neue Eintrag verbreitet wird
DomainVerificationTXTNoMatch: Der TXT-Eintrag _zitadel-challenge wurde für Ihre Domain gefunden, enthält jedoch nicht den richtigen Token-Text. Überprüfen Sie, ob Sie das richtige Token zu Ihrem DNS-Server hinzugefügt haben, oder warten Sie, bis der neue Eintrag verbreitet wird
DomainVerificationHTTPNotFound: Das File der Challenge wurde unter der erwarteten URL nicht gefunden. Überprüfen Sie, ob Sie die Datei mit Leseberechtigungen an der richtigen Stelle hochgeladen haben
DomainVerificationHTTPNoMatch: Das File der Challenge wurde in der erwarteten URL gefunden, enthält jedoch nicht den richtigen Token-Text. Überprüfen Sie den Inhalt
DomainVerificationTimeout: There was a timeout querying the DNS server.
PrimaryDomainNotDeletable: Primäre Domäne kann nicht gelöscht werden
DomainNotFound: Domäne konnte nicht gefunden werden
MemberIDMissing: Member ID fehlt
@ -527,7 +532,7 @@ EventTypes:
user:
added: Benutzer hinzugefügt
selfregistered: Benutzer hat sich selbst registriert
initialization:
initialization:
code:
added: Initialisierungscode generiert
sent: Initialisierungscode versendet
@ -569,7 +574,7 @@ EventTypes:
avatar:
added: Avatar hinzugefügt
removed: Avatar entfernt
initialization:
initialization:
code:
added: Initialisierungscode generiert
sent: Initialisierungscode versendet
@ -1225,9 +1230,9 @@ Action:
Flow:
Type:
Unspecified: Unspezifiziert
ExternalAuthentication: Externe Authentifizierung
ExternalAuthentication: Externe Authentifizierung
CustomiseToken: Token ergänzen
InternalAuthentication: Interne Authentifizierung
InternalAuthentication: Interne Authentifizierung
CustomizeSAMLResponse: SAMLResponse ergänzen
TriggerType:
Unspecified: Unspezifiziert

View File

@ -182,6 +182,11 @@ Errors:
DomainVerificationTypeInvalid: Domain verification type is invalid
DomainVerificationMissing: Domain verification not yet started
DomainVerificationFailed: Domain verification failed
DomainVerificationTXTNotFound: The _zitadel-challenge TXT record was not found for your domain. Check that you've added it to your DNS server or wait till the new record is propagated
DomainVerificationTXTNoMatch: The _zitadel-challenge TXT record has been found for your domain but it doesn't contain the right token text. Check that you've added the right token to your DNS server or wait till the new record is propagated
DomainVerificationHTTPNotFound: The file containing the challenge was not found in the expected URL. Check that you've uploaded the file in the right place with read permissions
DomainVerificationHTTPNoMatch: The file containing the challenge has been found in the expected URL but it doesn't contain the right token text. Check its content
DomainVerificationTimeout: There was a timeout querying the DNS server
PrimaryDomainNotDeletable: Primary domain must not be deleted
DomainNotFound: Domain not found
MemberIDMissing: Member ID missing

View File

@ -182,6 +182,11 @@ Errors:
DomainVerificationTypeInvalid: El tipo verificación del dominio no es válido
DomainVerificationMissing: La verificación del dominio no ha comenzado
DomainVerificationFailed: La verificación del dominio falló
DomainVerificationTXTNotFound: No se encontró el registro TXT _zitadel-challenge para su dominio. Verifique que lo haya agregado a su servidor DNS o espere hasta que se propague el nuevo registro
DomainVerificationTXTNoMatch: Se encontró el registro TXT _zitadel-challenge para su dominio, pero no contiene el texto del token correcto. Verifique que haya agregado el token correcto a su servidor DNS o espere hasta que se propague el nuevo registro
DomainVerificationHTTPNotFound: El archivo que contiene el desafío no se encontró en la URL esperada. Comprueba que has subido el archivo en el lugar correcto con permisos de lectura.
DomainVerificationHTTPNoMatch: El archivo que contiene el desafío se encontró en la URL esperada, pero no contiene el texto del token correcto. Consulta su contenido
DomainVerificationTimeout: Se superó el tiempo de espera al consultar el servidor DNS.
PrimaryDomainNotDeletable: El dominio primario no debe borrarse
DomainNotFound: Dominio no encontrado
MemberIDMissing: Falta el ID del miembro

View File

@ -182,6 +182,11 @@ Errors:
DomainVerificationTypeInvalid: Le type de vérification du domaine n'est pas valide
DomainVerificationMissing: La vérification du domaine n'a pas encore commencé
DomainVerificationFailed: La vérification du domaine a échoué
DomainVerificationTXTNotFound: L'enregistrement TXT _zitadel-challenge est introuvable pour votre domaine. Vérifiez que vous l'avez ajouté à votre serveur DNS ou attendez que le nouvel enregistrement se propage
DomainVerificationTXTNoMatch: L'enregistrement TXT _zitadel-challenge a été trouvé pour votre domaine mais il ne contient pas le bon texte de jeton. Vérifiez que vous avez ajouté le bon token à votre serveur DNS ou attendez que le nouvel enregistrement se propage
DomainVerificationHTTPNotFound: Le fichier contenant le défi n'a pas été trouvé dans l'URL attendue. Vérifiez que vous avez téléchargé le fichier au bon endroit avec les autorisations de lecture
DomainVerificationHTTPNoMatch: Le fichier contenant le défi a été trouvé dans l'URL attendue mais il ne contient pas le bon texte de token. Vérifiez son contenu
DomainVerificationTimeout: Il y a eu un délai d'attente lors de l'interrogation du serveur DNS
PrimaryDomainNotDeletable: Le domaine primaire ne doit pas être supprimé
DomainNotFound: Domaine non trouvé
MemberIDMissing: ID du membre manquant

View File

@ -182,6 +182,11 @@ Errors:
DomainVerificationTypeInvalid: Il tipo di verifica del dominio non è valido
DomainVerificationMissing: La verifica del dominio non è ancora iniziata
DomainVerificationFailed: Verifica del dominio fallita
DomainVerificationTXTNotFound: Il record TXT _zitadel-challenge non è stato trovato per il tuo dominio. Verifica di averlo aggiunto al tuo server DNS o attendi la propagazione del nuovo record
DomainVerificationTXTNoMatch: È stato trovato il record TXT _zitadel-challenge per il tuo dominio ma non contiene il testo del token corretto. Verifica di aver aggiunto il token corretto al tuo server DNS o attendi la propagazione del nuovo record
DomainVerificationHTTPNotFound: Il file della challenge non è stato trovato nell'URL previsto. Verifica di aver caricato il file nel posto giusto con permessi di lettura
DomainVerificationHTTPNoMatch: Il file della challenge è stato trovato nell'URL previsto ma non contiene il testo del token corretto. Controlla il suo contenuto
DomainVerificationTimeout: Si è verificato un timeout nella richiesta del server DNS
PrimaryDomainNotDeletable: Il dominio primario non deve essere cancellato
DomainNotFound: Dominio non trovato
MemberIDMissing: ID membro mancante

View File

@ -174,6 +174,11 @@ Errors:
DomainVerificationTypeInvalid: ドメイン認証タイプが無効です
DomainVerificationMissing: ドメイン認証はまだ開始されていません
DomainVerificationFailed: ドメイン認証に失敗しました
DomainVerificationTXTNotFound: _zitadel-challenge TXT レコードがドメインで見つかりませんでした。 DNS サーバーに追加したことを確認するか、新しいレコードが伝播されるまで待ちます
DomainVerificationTXTNoMatch: ドメインの _zitadel-challenge TXT レコードが見つかりましたが、正しいトークン テキストが含まれていません。 DNS サーバーに正しいトークンを追加したかどうかを確認するか、新しいレコードが伝播されるまで待ちます
DomainVerificationHTTPNotFound: チャレンジを含むファイルが予期された URL に見つかりませんでした。読み取り権限のある適切な場所にファイルがアップロードされていることを確認してください
DomainVerificationHTTPNoMatch: チャレンジを含むファイルが予期された URL で見つかりましたが、正しいトークン テキストが含まれていません。内容を確認してください
DomainVerificationTimeout: DNSサーバーへのクエリでタイムアウトが発生しました
PrimaryDomainNotDeletable: プライマリドメインは削除できません
DomainNotFound: ドメインが見つかりません
MemberIDMissing: メンバーIDがありません

View File

@ -182,6 +182,11 @@ Errors:
DomainVerificationTypeInvalid: Типот на верификација на доменот е невалиден
DomainVerificationMissing: Верификацијата на доменот сè уште не е започната
DomainVerificationFailed: Верификацијата на доменот не успеа
DomainVerificationTXTNotFound: Записот _zitadel-challenge TXT не беше пронајден за вашиот домен. Проверете дали сте го додале на вашиот DNS сервер или почекајте додека не се пропагира новиот запис
DomainVerificationTXTNoMatch: Записот _zitadel-challenge TXT е пронајден за вашиот домен, но не го содржи вистинскиот токен текст. Проверете дали сте го додале вистинскиот токен на вашиот DNS сервер или почекајте додека не се пропагира новиот запис
DomainVerificationHTTPNotFound: Датотеката што го содржи предизвикот не беше пронајдена во очекуваната URL-адреса. Проверете дали сте ја подигнале датотеката на вистинското место со дозволи за читање
DomainVerificationHTTPNoMatch: Датотеката што го содржи предизвикот е пронајдена во очекуваната URL-адреса, но не го содржи вистинскиот токен текст. Проверете ја неговата содржина
DomainVerificationTimeout: Имаше истек на барање на DNS-серверот
PrimaryDomainNotDeletable: Примарниот домен не смее да биде избришан
DomainNotFound: Доменот не е пронајден
MemberIDMissing: Недостасува ID на членот

View File

@ -182,6 +182,11 @@ Errors:
DomainVerificationTypeInvalid: Typ weryfikacji domeny jest nieprawidłowy
DomainVerificationMissing: Weryfikacja domeny nie została jeszcze rozpoczęta
DomainVerificationFailed: Weryfikacja domeny nie powiodła się
DomainVerificationTXTNotFound: Nie znaleziono rekordu TXT _zitadel-challenge dla Twojej domeny. Sprawdź, czy dodałeś go do swojego serwera DNS lub poczekaj, aż nowy rekord zostanie rozpropagowany
DomainVerificationTXTNoMatch: Znaleziono rekord TXT _zitadel-challenge dla Twojej domeny, ale nie zawiera on prawidłowego tekstu tokena. Sprawdź, czy dodałeś właściwy token do swojego serwera DNS lub poczekaj, aż nowy rekord zostanie rozpropagowany
DomainVerificationHTTPNotFound: Pod oczekiwanym adresem URL nie znaleziono pliku zawierającego wyzwanie. Sprawdź, czy przesłałeś plik we właściwe miejsce z uprawnieniami do odczytu
DomainVerificationHTTPNoMatch: Znaleziono plik zawierający wyzwanie pod oczekiwanym adresem URL, ale nie zawiera on prawidłowego tekstu tokena. Sprawdź jego zawartość
DomainVerificationTimeout: Upłynął limit czasu podczas wysyłania zapytania do serwera DNS
PrimaryDomainNotDeletable: Domena główna nie może być usunięta
DomainNotFound: Domena nie znaleziona
MemberIDMissing: Brak identyfikatora członka

View File

@ -180,6 +180,11 @@ Errors:
DomainVerificationTypeInvalid: O tipo de verificação do domínio é inválido
DomainVerificationMissing: A verificação do domínio ainda não foi iniciada
DomainVerificationFailed: Falha na verificação do domínio
DomainVerificationTXTNotFound: O registro TXT _zitadel-challenge não foi encontrado para seu domínio. Verifique se você o adicionou ao seu servidor DNS ou espere até que o novo registro seja propagado
DomainVerificationTXTNoMatch: O registro TXT _zitadel-challenge foi encontrado para seu domínio, mas não contém o texto do token correto. Verifique se você adicionou o token correto ao seu servidor DNS ou espere até que o novo registro seja propagado
DomainVerificationHTTPNotFound: O arquivo que contém o desafio não foi encontrado na URL esperada. Verifique se você carregou o arquivo no lugar certo com permissões de leitura
DomainVerificationHTTPNoMatch: O arquivo que contém o desafio foi encontrado na URL esperada, mas não contém o texto do token correto. Verifique seu conteúdo
DomainVerificationTimeout: Houve um tempo limite na consulta do servidor DNS
PrimaryDomainNotDeletable: O domínio principal não pode ser excluído
DomainNotFound: Domínio não encontrado
MemberIDMissing: ID do membro ausente

View File

@ -182,6 +182,11 @@ Errors:
DomainVerificationTypeInvalid: 域名验证类型无效
DomainVerificationMissing: 域名验证尚未开始
DomainVerificationFailed: 域名验证失败
DomainVerificationTXTNotFound: 未找到您的域的 _zitadel-challenge TXT 记录。检查您是否已将其添加到 DNS 服务器或等待新记录传播
DomainVerificationTXTNoMatch: 已找到您的域的 _zitadel-challenge TXT 记录,但它不包含正确的令牌文本。检查您是否已将正确的令牌添加到 DNS 服务器或等待新记录传播
DomainVerificationHTTPNotFound: 在预期的 URL 中找不到包含质询的文件。检查您是否已将文件上传到正确的位置并具有读取权限
DomainVerificationHTTPNoMatch: 已在预期 URL 中找到包含质询的文件,但它不包含正确的标记文本。检查其内容
DomainVerificationTimeout: 查询 DNS 服务器超时
PrimaryDomainNotDeletable: 不得删除主域名
DomainNotFound: 未找到域名
MemberIDMissing: 成员 ID 丢失
@ -623,7 +628,7 @@ EventTypes:
removed: 删除 MFA OTP
check:
succeeded: 验证 MFA OTP 成功
failed: 验证 MFA OTP 失败
failed: 验证 MFA OTP 失败
sms:
added: 添加了多因素 OTP 短信
removed: 删除了多因素 OTP 短信