From e66d476c47632f8166b9524f7f8c136b8e9260f1 Mon Sep 17 00:00:00 2001 From: Miguel Cabrerizo <30386061+doncicuto@users.noreply.github.com> Date: Tue, 10 Oct 2023 14:02:16 +0200 Subject: [PATCH] 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 --- internal/api/http/domain_check.go | 17 +++++++++++++++-- internal/command/org_domain.go | 8 +++++--- internal/static/i18n/bg.yaml | 11 ++++++++--- internal/static/i18n/de.yaml | 13 +++++++++---- internal/static/i18n/en.yaml | 5 +++++ internal/static/i18n/es.yaml | 5 +++++ internal/static/i18n/fr.yaml | 5 +++++ internal/static/i18n/it.yaml | 5 +++++ internal/static/i18n/ja.yaml | 5 +++++ internal/static/i18n/mk.yaml | 5 +++++ internal/static/i18n/pl.yaml | 5 +++++ internal/static/i18n/pt.yaml | 5 +++++ internal/static/i18n/zh.yaml | 7 ++++++- 13 files changed, 83 insertions(+), 13 deletions(-) diff --git a/internal/api/http/domain_check.go b/internal/api/http/domain_check.go index 3d3989799..419682202 100644 --- a/internal/api/http/domain_check.go +++ b/internal/api/http/domain_check.go @@ -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) { diff --git a/internal/command/org_domain.go b/internal/command/org_domain.go index f08b92588..aae1b14b6 100644 --- a/internal/command/org_domain.go +++ b/internal/command/org_domain.go @@ -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) { diff --git a/internal/static/i18n/bg.yaml b/internal/static/i18n/bg.yaml index 3588c2531..ea8f06409 100644 --- a/internal/static/i18n/bg.yaml +++ b/internal/static/i18n/bg.yaml @@ -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: diff --git a/internal/static/i18n/de.yaml b/internal/static/i18n/de.yaml index 731d63962..6bf711547 100644 --- a/internal/static/i18n/de.yaml +++ b/internal/static/i18n/de.yaml @@ -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 diff --git a/internal/static/i18n/en.yaml b/internal/static/i18n/en.yaml index a05c418c3..03a7e16b7 100644 --- a/internal/static/i18n/en.yaml +++ b/internal/static/i18n/en.yaml @@ -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 diff --git a/internal/static/i18n/es.yaml b/internal/static/i18n/es.yaml index ceb031273..a6783a170 100644 --- a/internal/static/i18n/es.yaml +++ b/internal/static/i18n/es.yaml @@ -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 diff --git a/internal/static/i18n/fr.yaml b/internal/static/i18n/fr.yaml index d3b5bf7ee..2e9592fe3 100644 --- a/internal/static/i18n/fr.yaml +++ b/internal/static/i18n/fr.yaml @@ -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 diff --git a/internal/static/i18n/it.yaml b/internal/static/i18n/it.yaml index e8f09e0e9..9a3e48af7 100644 --- a/internal/static/i18n/it.yaml +++ b/internal/static/i18n/it.yaml @@ -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 diff --git a/internal/static/i18n/ja.yaml b/internal/static/i18n/ja.yaml index d30259610..3e2960dc2 100644 --- a/internal/static/i18n/ja.yaml +++ b/internal/static/i18n/ja.yaml @@ -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がありません diff --git a/internal/static/i18n/mk.yaml b/internal/static/i18n/mk.yaml index a11d1fb9f..f613eebb2 100644 --- a/internal/static/i18n/mk.yaml +++ b/internal/static/i18n/mk.yaml @@ -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 на членот diff --git a/internal/static/i18n/pl.yaml b/internal/static/i18n/pl.yaml index 6808de2eb..2e0c3a824 100644 --- a/internal/static/i18n/pl.yaml +++ b/internal/static/i18n/pl.yaml @@ -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 diff --git a/internal/static/i18n/pt.yaml b/internal/static/i18n/pt.yaml index 9888a2a49..7017e12cc 100644 --- a/internal/static/i18n/pt.yaml +++ b/internal/static/i18n/pt.yaml @@ -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 diff --git a/internal/static/i18n/zh.yaml b/internal/static/i18n/zh.yaml index 83b7b1839..27d719a82 100644 --- a/internal/static/i18n/zh.yaml +++ b/internal/static/i18n/zh.yaml @@ -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 短信