diff --git a/integration/testUtils/usersService.ts b/integration/testUtils/usersService.ts index 3b88e971db0..52814990c92 100644 --- a/integration/testUtils/usersService.ts +++ b/integration/testUtils/usersService.ts @@ -76,7 +76,7 @@ export type UserService = { createFakeOrganization: (userId: string) => Promise; getUser: (opts: { id?: string; email?: string }) => Promise; createFakeAPIKey: (userId: string) => Promise; - passwordUntrusted: (userId: string) => Promise; + passwordCompromised: (userId: string) => Promise; }; /** @@ -211,8 +211,8 @@ export const createUserService = (clerkClient: ClerkClient) => { revoke: () => clerkClient.apiKeys.revoke({ apiKeyId: apiKey.id, revocationReason: 'For testing purposes' }), } satisfies FakeAPIKey; }, - passwordUntrusted: async (userId: string) => { - await clerkClient.users.__experimental_passwordUntrusted(userId); + passwordCompromised: async (userId: string) => { + await clerkClient.users.__experimental_passwordCompromised(userId); }, }; diff --git a/integration/tests/session-tasks-sign-in-reset-password.test.ts b/integration/tests/session-tasks-sign-in-reset-password.test.ts index 581e53a683d..cf82347cf09 100644 --- a/integration/tests/session-tasks-sign-in-reset-password.test.ts +++ b/integration/tests/session-tasks-sign-in-reset-password.test.ts @@ -1,4 +1,4 @@ -import { test } from '@playwright/test'; +import { expect, test } from '@playwright/test'; import { hash } from '../models/helpers'; import { appConfigs } from '../presets'; @@ -19,7 +19,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksResetPassword const user = u.services.users.createFakeUser(); const createdUser = await u.services.users.createBapiUser(user); - await u.services.users.passwordUntrusted(createdUser.id); + await u.services.users.passwordCompromised(createdUser.id); // Performs sign-in await u.po.signIn.goTo(); @@ -28,6 +28,13 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksResetPassword await u.po.signIn.setPassword(user.password); await u.po.signIn.continue(); + await expect( + u.page.getByText( + "Your password appears to have been compromised or it's no longer trusted and cannot be used. Please use another method to continue.", + ), + ).toBeVisible(); + await u.po.signIn.getAltMethodsEmailCodeButton().click(); + await u.page.getByRole('textbox', { name: 'code' }).click(); await u.page.keyboard.type('424242', { delay: 100 }); @@ -59,10 +66,11 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksResetPassword const user = u.services.users.createFakeUser(); const createdUser = await u.services.users.createBapiUser(user); - await u.services.users.passwordUntrusted(createdUser.id); + await u.services.users.passwordCompromised(createdUser.id); const fakeOrganization = u.services.organizations.createFakeOrganization(); await u.services.organizations.createBapiOrganization({ - ...fakeOrganization, + name: fakeOrganization.name, + slug: fakeOrganization.slug + Date.now().toString(), createdBy: createdUser.id, }); @@ -73,9 +81,15 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksResetPassword await u.po.signIn.setPassword(user.password); await u.po.signIn.continue(); - await u.page.getByRole('textbox', { name: 'code' }).fill('424242'); + await expect( + u.page.getByText( + "Your password appears to have been compromised or it's no longer trusted and cannot be used. Please use another method to continue.", + ), + ).toBeVisible(); + await u.po.signIn.getAltMethodsEmailCodeButton().click(); - await u.po.expect.toBeSignedIn(); + await u.page.getByRole('textbox', { name: 'code' }).click(); + await u.page.keyboard.type('424242', { delay: 100 }); // Redirects back to tasks when accessing protected route by `auth.protect` await u.page.goToRelative('/page-protected'); diff --git a/packages/backend/src/api/endpoints/UserApi.ts b/packages/backend/src/api/endpoints/UserApi.ts index a96f6051092..f883aa14685 100644 --- a/packages/backend/src/api/endpoints/UserApi.ts +++ b/packages/backend/src/api/endpoints/UserApi.ts @@ -448,11 +448,11 @@ export class UserAPI extends AbstractAPI { }); } - public async __experimental_passwordUntrusted(userId: string) { + public async __experimental_passwordCompromised(userId: string) { this.requireId(userId); return this.request({ method: 'POST', - path: joinPaths(basePath, userId, 'password_untrusted'), + path: joinPaths(basePath, userId, 'password_compromised'), bodyParams: { revokeAllSessions: false, }, diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts index 0c748dad894..f29d72f1c1f 100644 --- a/packages/localizations/src/ar-SA.ts +++ b/packages/localizations/src/ar-SA.ts @@ -690,9 +690,15 @@ export const arSA: LocalizationResource = { subtitle: 'للمتابعة إلى {{applicationName}}', title: 'ادخل كلمة المرور', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'كلمة المرور غير آمنة', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'رمز التحقق', resendButton: 'لم يصلك الرمز؟ حاول مرة أخرى', @@ -895,6 +901,7 @@ export const arSA: LocalizationResource = { form_password_pwned__sign_in: 'لا يمكن أستعمال كلمة السر هذه لانها غير أمنة, الرجاء اختيار كلمة مرور أخرى', form_password_size_in_bytes_exceeded: 'تجاوزت كلمة المرور الحد الأقصى للحروف المدخلة, الرجاء أدخال كلمة مرور أقصر أو حذف بعض الأحرف الخاصة', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'كلمة مرور خاطئة', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts index cfc808586fb..8c80a9f1ca7 100644 --- a/packages/localizations/src/be-BY.ts +++ b/packages/localizations/src/be-BY.ts @@ -697,9 +697,15 @@ export const beBY: LocalizationResource = { subtitle: 'каб працягнуць працу ў "{{applicationName}}"', title: 'Увядзіце пароль', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Пароль быў узламаны', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Код верыфікацыі', resendButton: 'Пераадправіць код', @@ -904,6 +910,7 @@ export const beBY: LocalizationResource = { form_password_pwned__sign_in: 'Гэты пароль быў узламаны, калі ласка, абярыце іншы.', form_password_size_in_bytes_exceeded: 'Ваш пароль перавышае максімальна дапушчальнае колькасць байтаў, скараціце яго або выдаліце некаторыя спецыяльныя сімвалы.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Неверагодны пароль', form_username_invalid_character: 'Імя карыстальніка змяшчае недапушчальныя сімвалы.', form_username_invalid_length: 'Імя карыстальніка павінна быць ад 3 да 50 сімвалаў.', diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts index 68854c51d96..db903a06907 100644 --- a/packages/localizations/src/bg-BG.ts +++ b/packages/localizations/src/bg-BG.ts @@ -693,9 +693,15 @@ export const bgBG: LocalizationResource = { subtitle: 'Въведете паролата, свързана с вашия акаунт', title: 'Въведете вашата парола', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: undefined, }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Код за потвърждение', resendButton: 'Не сте получили код? Изпрати отново', @@ -897,6 +903,7 @@ export const bgBG: LocalizationResource = { form_password_pwned: 'Тази парола е компрометирана в изтекли данни. Моля, изберете друга.', form_password_pwned__sign_in: undefined, form_password_size_in_bytes_exceeded: 'Паролата ви е твърде дълга. Моля, съкратете я.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Невалидна парола.', form_username_invalid_character: 'Потребителското име съдържа невалидни символи.', form_username_invalid_length: 'Потребителското име трябва да бъде между 3 и 256 символа.', diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts index e23fdd620e6..21c2d0d9390 100644 --- a/packages/localizations/src/bn-IN.ts +++ b/packages/localizations/src/bn-IN.ts @@ -696,9 +696,15 @@ export const bnIN: LocalizationResource = { subtitle: 'আপনার অ্যাকাউন্টের সাথে যুক্ত পাসওয়ার্ড লিখুন', title: 'আপনার পাসওয়ার্ড লিখুন', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'পাসওয়ার্ড সমঝোতা হয়েছে', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'যাচাইকরণ কোড', resendButton: 'কোনো কোড পাননি? পুনরায় পাঠান', @@ -906,6 +912,7 @@ export const bnIN: LocalizationResource = { 'এই পাসওয়ার্ডটি একটি ডেটা লঙ্ঘনের অংশ হিসাবে পাওয়া গেছে এবং ব্যবহার করা যাবে না, দয়া করে আপনার পাসওয়ার্ড রিসেট করুন।', form_password_size_in_bytes_exceeded: 'আপনার পাসওয়ার্ড অনুমোদিত সর্বাধিক বাইট সংখ্যা অতিক্রম করেছে, দয়া করে এটি ছোট করুন বা কিছু বিশেষ অক্ষর সরান।', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'ভুল পাসওয়ার্ড', form_username_invalid_character: 'আপনার ব্যবহারকারীর নামে অবৈধ অক্ষর রয়েছে। দয়া করে শুধুমাত্র অক্ষর, সংখ্যা এবং আন্ডারস্কোর ব্যবহার করুন।', diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts index 72f043c0776..248697ba84a 100644 --- a/packages/localizations/src/ca-ES.ts +++ b/packages/localizations/src/ca-ES.ts @@ -693,9 +693,15 @@ export const caES: LocalizationResource = { subtitle: 'Introdueix la contrasenya associada al teu compte', title: 'Introdueix la teva contrasenya', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: undefined, }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Codi de verificació', resendButton: 'No has rebut el codi? Reenvia', @@ -899,6 +905,7 @@ export const caES: LocalizationResource = { form_password_pwned__sign_in: undefined, form_password_size_in_bytes_exceeded: 'La teva contrasenya ha superat el nombre màxim de bytes permesos, si us plau, redueix-la o elimina alguns caràcters especials.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Contrasenya incorrecta', form_username_invalid_character: "El nom d'usuari conté caràcters no vàlids.", form_username_invalid_length: "El nom d'usuari ha de tenir entre 3 i 50 caràcters.", diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts index c941c2214ee..7fe22d20802 100644 --- a/packages/localizations/src/cs-CZ.ts +++ b/packages/localizations/src/cs-CZ.ts @@ -701,9 +701,15 @@ export const csCZ: LocalizationResource = { subtitle: 'Zadejte heslo spojené s vaším účtem', title: 'Zadejte své heslo', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Heslo kompromitováno', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Ověřovací kód', resendButton: 'Neobdrželi jste kód? Znovu poslat', @@ -910,6 +916,7 @@ export const csCZ: LocalizationResource = { 'Toto heslo bylo nalezeno jako součást prolomení a nelze ho použít, prosím resetujte si heslo.', form_password_size_in_bytes_exceeded: 'Vaše heslo překročilo maximální povolený počet bajtů, prosím zkrátit ho nebo odstranit některé speciální znaky.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Nesprávné heslo', form_username_invalid_character: 'Uživatelské jméno může obsahovat pouze alfanumerické znaky a podtržítka.', form_username_invalid_length: 'Vaše uživatelské jméno musí mít mezi {{min_length}} a {{max_length}} znaky.', diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts index 7c0b99d08d2..f47c6a17541 100644 --- a/packages/localizations/src/da-DK.ts +++ b/packages/localizations/src/da-DK.ts @@ -692,9 +692,15 @@ export const daDK: LocalizationResource = { subtitle: 'Fortsæt til {{applicationName}}', title: 'Indtast din adgangskode', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Sikkerhedsadvarsel', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Bekræftelseskode', resendButton: 'Send kode igen', @@ -896,6 +902,7 @@ export const daDK: LocalizationResource = { form_password_pwned__sign_in: 'Din adgangskode er blevet kompromitteret, vælg en ny.', form_password_size_in_bytes_exceeded: 'Din adgangskode har overskredet det maksimalt tilladte antal bytes, forkort den eller fjern nogle specialtegn.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Forkert adgangskode.', form_username_invalid_character: 'Brugernavnet indeholder ugyldige tegn.', form_username_invalid_length: 'Brugernavnet har en ugyldig længde.', diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts index f16a737073d..c88e726934e 100644 --- a/packages/localizations/src/de-DE.ts +++ b/packages/localizations/src/de-DE.ts @@ -706,9 +706,15 @@ export const deDE: LocalizationResource = { subtitle: 'weiter zu {{applicationName}}', title: 'Geben Sie Ihr Passwort ein', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Passwort kompromittiert', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Bestätigungscode', resendButton: 'Code erneut senden', @@ -915,6 +921,7 @@ export const deDE: LocalizationResource = { 'Dieses Passwort wurde in einem Datenleck gefunden und kann nicht verwendet werden. Bitte setzen Sie Ihr Passwort zurück.', form_password_size_in_bytes_exceeded: 'Das Passwort hat die maximale Anzahl an Bytes überschritten. Bitte kürzen oder Sonderzeichen entfernen.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Falsches Passwort.', form_username_invalid_character: 'Der Benutzername enthält ungültige Zeichen. Bitte verwenden Sie nur alphanumerische Zeichen und Unterstriche.', diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts index aee5ca92183..067ce743a37 100644 --- a/packages/localizations/src/el-GR.ts +++ b/packages/localizations/src/el-GR.ts @@ -694,9 +694,15 @@ export const elGR: LocalizationResource = { subtitle: 'για να συνεχίσετε στο {{applicationName}}', title: 'Εισαγωγή κωδικού πρόσβασης', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Παραβιασμένος κωδικός', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Κωδικός επαλήθευσης', resendButton: 'Δεν λάβατε κωδικό; Αποστολή ξανά', @@ -901,6 +907,7 @@ export const elGR: LocalizationResource = { form_password_pwned__sign_in: undefined, form_password_size_in_bytes_exceeded: 'Ο κωδικός πρόσβασής σας έχει υπερβεί το μέγιστο αριθμό bytes που επιτρέπεται. Παρακαλούμε, συντομεύστε τον ή αφαιρέστε μερικούς ειδικούς χαρακτήρες.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Λανθασμένος κωδικός', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts index 8256d3bf775..ae263ed220e 100644 --- a/packages/localizations/src/en-GB.ts +++ b/packages/localizations/src/en-GB.ts @@ -694,9 +694,15 @@ export const enGB: LocalizationResource = { subtitle: 'Enter the password associated with your account', title: 'Enter your password', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Password compromised', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Verification code', resendButton: "Didn't receive a code? Resend", @@ -902,6 +908,7 @@ export const enGB: LocalizationResource = { 'This password has been found as part of a breach and can not be used, please reset your password.', form_password_size_in_bytes_exceeded: 'Your password has exceeded the maximum number of bytes allowed, please shorten it or remove some special characters.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Incorrect Password', form_username_invalid_character: 'Your username contains invalid characters. Please use only letters, numbers, and underscores.', diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index bbda0fa79c3..eded6cc401f 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -691,9 +691,15 @@ export const enUS: LocalizationResource = { subtitle: 'Enter the password associated with your account', title: 'Enter your password', }, + passwordCompromised: { + title: 'Password compromised', + }, passwordPwned: { title: 'Password compromised', }, + passwordUntrusted: { + title: 'Password untrusted', + }, phoneCode: { formTitle: 'Verification code', resendButton: "Didn't receive a code? Resend", @@ -897,6 +903,10 @@ export const enUS: LocalizationResource = { form_password_pwned__sign_in: 'This password has been found as part of a breach and can not be used, please reset your password.', form_password_size_in_bytes_exceeded: undefined, + form_password_compromised__sign_in: + "Your password appears to have been compromised or it's no longer trusted and cannot be used. Please use another method to continue.", + form_password_untrusted__sign_in: + "Your password appears to have been compromised or it's no longer trusted and cannot be used. Please use another method to continue.", form_password_validation_failed: undefined, form_username_invalid_character: undefined, form_username_invalid_length: 'Your username must be between {{min_length}} and {{max_length}} characters long.', diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts index 582c683516d..6faf00279e7 100644 --- a/packages/localizations/src/es-CR.ts +++ b/packages/localizations/src/es-CR.ts @@ -698,9 +698,15 @@ export const esCR: LocalizationResource = { subtitle: 'para continuar con {{applicationName}}', title: 'Introduzca su contraseña', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Contraseña en peligro', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Código de verificación', resendButton: 'Reenviar código', @@ -907,6 +913,7 @@ export const esCR: LocalizationResource = { 'Esta contraseña se encontró como parte de una brecha y no se puede utilizar, por favor restablece tu contraseña.', form_password_size_in_bytes_exceeded: 'La contraseña excede el número máximo de bytes permitidos. Por favor, elimine algunos caracteres especiales o reduzca la longitud de la contraseña.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Contraseña incorrecta', form_username_invalid_character: 'El nombre de usuario contiene caracteres inválidos.', form_username_invalid_length: 'La longitud del nombre de usuario es demasiado corta.', diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts index 1d51a5e8397..c9370ff306e 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -694,9 +694,15 @@ export const esES: LocalizationResource = { subtitle: 'para continuar a {{applicationName}}', title: 'Introduzca su contraseña', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Tu contraseña ha sido comprometida', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Código de verificación', resendButton: 'Reenviar código', @@ -900,6 +906,7 @@ export const esES: LocalizationResource = { form_password_pwned__sign_in: 'La contraseña ya está en uso en otro servicio.', form_password_size_in_bytes_exceeded: 'Tu contraseña ha excedido el número máximo de bytes permitidos, por favor acórtala o elimina algunos caracteres especiales.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'La validación de la contraseña falló.', form_username_invalid_character: 'El nombre de usuario contiene caracteres inválidos.', form_username_invalid_length: 'El nombre de usuario debe tener entre 3 y 20 caracteres.', diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts index 54cfb0e8102..e8e72d4c4f8 100644 --- a/packages/localizations/src/es-MX.ts +++ b/packages/localizations/src/es-MX.ts @@ -699,9 +699,15 @@ export const esMX: LocalizationResource = { subtitle: 'para continuar con {{applicationName}}', title: 'Introduzca su contraseña', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Contraseña en peligro', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Código de verificación', resendButton: 'Reenviar código', @@ -908,6 +914,7 @@ export const esMX: LocalizationResource = { 'Esta contraseña se encontró como parte de una brecha y no se puede utilizar, por favor restablece tu contraseña.', form_password_size_in_bytes_exceeded: 'La contraseña excede el número máximo de bytes permitidos. Por favor, elimine algunos caracteres especiales o reduzca la longitud de la contraseña.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Contraseña incorrecta', form_username_invalid_character: 'El nombre de usuario contiene caracteres inválidos.', form_username_invalid_length: 'La longitud del nombre de usuario es demasiado corta.', diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts index cb8a218669f..f760c413d85 100644 --- a/packages/localizations/src/es-UY.ts +++ b/packages/localizations/src/es-UY.ts @@ -697,9 +697,15 @@ export const esUY: LocalizationResource = { subtitle: 'Ingresá la contraseña asociada a tu cuenta', title: 'Ingresá tu contraseña', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Contraseña comprometida', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Código de verificación', resendButton: '¿No recibiste un código? Reenviar', @@ -907,6 +913,7 @@ export const esUY: LocalizationResource = { 'Esta contraseña se encontró en una filtración y no se puede usar. Por favor, restablecé tu contraseña.', form_password_size_in_bytes_exceeded: 'Tu contraseña ha excedido el número máximo de bytes permitidos. Por favor, acortala o eliminá algunos caracteres especiales.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Contraseña incorrecta', form_username_invalid_character: 'Tu nombre de usuario contiene caracteres inválidos. Por favor, usá solo letras, números y guiones bajos.', diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts index 55ce823d65a..991b08b23b1 100644 --- a/packages/localizations/src/fa-IR.ts +++ b/packages/localizations/src/fa-IR.ts @@ -702,9 +702,15 @@ export const faIR: LocalizationResource = { subtitle: 'رمز عبور مرتبط با حساب کاربری خود را وارد کنید', title: 'رمز عبور خود را وارد کنید', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'رمز عبور به خطر افتاده است', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'کد تأیید', resendButton: 'کدی دریافت نکردید؟ ارسال دوباره', @@ -909,6 +915,7 @@ export const faIR: LocalizationResource = { form_password_pwned__sign_in: 'این رمز عبور به عنوان بخشی از یک نقض امنیتی یافت شده و قابل استفاده نیست، لطفاً رمز عبور خود را مجدداً تنظیم کنید.', form_password_size_in_bytes_exceeded: 'رمز عبور خیلی طولانی است.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'اعتبارسنجی رمز عبور ناموفق بود.', form_username_invalid_character: 'نام کاربری شامل کاراکترهای نامعتبر است.', form_username_invalid_length: 'نام کاربری شما باید بین {{min_length}} و {{max_length}} کاراکتر باشد.', diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts index 08a4fff3da4..4cf90f4bfc0 100644 --- a/packages/localizations/src/fi-FI.ts +++ b/packages/localizations/src/fi-FI.ts @@ -694,9 +694,15 @@ export const fiFI: LocalizationResource = { subtitle: 'Syötä tilisi salasana', title: 'Syötä salasanasi', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Salasana kompromisoitu', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Vahvistuskoodi', resendButton: 'Etkö saanut koodia? Lähetä uudelleen', @@ -899,6 +905,7 @@ export const fiFI: LocalizationResource = { form_password_pwned__sign_in: 'Salasana on ollut osallisena tietovuodossa. Vaihdathan salasanasi.', form_password_size_in_bytes_exceeded: 'Salasanasi on ylittänyt sallitun tavumäärän, lyhennä sitä tai poista joitain erikoismerkkejä.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Väärä salasana.', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts index c7d96d5d0af..7783f8f1169 100644 --- a/packages/localizations/src/fr-FR.ts +++ b/packages/localizations/src/fr-FR.ts @@ -707,9 +707,15 @@ export const frFR: LocalizationResource = { subtitle: 'pour continuer vers {{applicationName}}', title: 'Tapez votre mot de passe', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Mot de passe compromis', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Code de vérification', resendButton: "Vous n'avez pas reçu de code ? Renvoyer", @@ -915,6 +921,7 @@ export const frFR: LocalizationResource = { form_password_pwned__sign_in: 'Mot de passe compromis. Veuillez le réinitialiser.', form_password_size_in_bytes_exceeded: "Votre mot de passe a dépassé le nombre maximum d'octets autorisés. Veuillez le raccourcir ou supprimer certains caractères spéciaux.", + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Mot de passe incorrect', form_username_invalid_character: "L'identifiant contient des caractères invalides.", form_username_invalid_length: "Le nombre de caractères de l'identifiant est invalide.", diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts index 46ee40b40cb..394fcd4c8a3 100644 --- a/packages/localizations/src/he-IL.ts +++ b/packages/localizations/src/he-IL.ts @@ -685,9 +685,15 @@ export const heIL: LocalizationResource = { subtitle: 'להמשיך אל {{applicationName}}', title: 'הכנס את סיסמתך', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: undefined, }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'קוד אימות', resendButton: 'שלח את הקוד שוב', @@ -888,6 +894,7 @@ export const heIL: LocalizationResource = { 'הסיסמה הזו נמצאה כחלק מהפרטים שנחשפו בהפרת נתונים ולא ניתן להשתמש בה, אנא בצע איתחול לסיסמה שלך.', form_password_size_in_bytes_exceeded: 'הסיסמה שלך חורגת ממספר הבייטים המרבי המותר, נסה לקצר אותה או להסיר כמה תווים מיוחדים.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'סיסמה שגויה', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts index f10e586c598..36cefd321e2 100644 --- a/packages/localizations/src/hi-IN.ts +++ b/packages/localizations/src/hi-IN.ts @@ -695,9 +695,15 @@ export const hiIN: LocalizationResource = { subtitle: 'अपने खाते से जुड़ा पासवर्ड दर्ज करें', title: 'अपना पासवर्ड दर्ज करें', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'पासवर्ड समझौता हो गया', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'सत्यापन कोड', resendButton: 'कोड नहीं मिला? फिर से भेजें', @@ -905,6 +911,7 @@ export const hiIN: LocalizationResource = { 'यह पासवर्ड डेटा उल्लंघन के हिस्से के रूप में पाया गया है और इसका उपयोग नहीं किया जा सकता, कृपया अपना पासवर्ड रीसेट करें।', form_password_size_in_bytes_exceeded: 'आपके पासवर्ड ने अनुमत बाइट्स की अधिकतम संख्या से अधिक हो गया है, कृपया इसे छोटा करें या कुछ विशेष वर्णों को हटा दें।', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'गलत पासवर्ड', form_username_invalid_character: 'आपके उपयोगकर्ता नाम में अमान्य वर्ण हैं। कृपया केवल अक्षर, संख्या और अंडरस्कोर का उपयोग करें।', diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts index c4a9056969a..e8f53c22af3 100644 --- a/packages/localizations/src/hr-HR.ts +++ b/packages/localizations/src/hr-HR.ts @@ -694,9 +694,15 @@ export const hrHR: LocalizationResource = { subtitle: 'Unesite lozinku povezanu s vašim računom', title: 'Unesite svoju lozinku', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Lozinka je kompromitirana', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Verifikacijski kod', resendButton: 'Niste primili kod? Pošalji ponovno', @@ -902,6 +908,7 @@ export const hrHR: LocalizationResource = { 'Ova lozinka je pronađena kao dio curenja podataka i ne može se koristiti, molimo resetirajte svoju lozinku.', form_password_size_in_bytes_exceeded: 'Vaša lozinka je premašila maksimalni dopušteni broj bajtova, molimo skratite je ili uklonite neke posebne znakove.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Netočna lozinka', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts index 72de3c469a3..ec54f471ed4 100644 --- a/packages/localizations/src/hu-HU.ts +++ b/packages/localizations/src/hu-HU.ts @@ -693,9 +693,15 @@ export const huHU: LocalizationResource = { subtitle: 'Írd be a fiókhoz tartozó jelszavad', title: 'Írd be a jelszavad', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Jelszó kompromitálódott', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Visszaigazoló kód', resendButton: 'Nem kaptad meg a kódot? Újraküldés', @@ -899,6 +905,7 @@ export const huHU: LocalizationResource = { 'Úgy látjuk, hogy ez a jelszó kiszivárgott, ezért ezt nem használhatod, kérlek állítsd át a jelszavad.', form_password_size_in_bytes_exceeded: 'A jelszavad több bájtot tartalmaz mint a megadott maximum, kérlek rövidítsd vagy törölj ki néhány speciális karaktert.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Helytelen jelszó', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts index 56b3fba8f2b..39cd8f4b02a 100644 --- a/packages/localizations/src/id-ID.ts +++ b/packages/localizations/src/id-ID.ts @@ -696,9 +696,15 @@ export const idID: LocalizationResource = { subtitle: 'Masukkan kata sandi yang terkait dengan akun Anda', title: 'Masukkan kata sandi Anda', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Kata sandi terkompromi', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Kode verifikasi', resendButton: 'Tidak menerima kode? Kirim ulang', @@ -906,6 +912,7 @@ export const idID: LocalizationResource = { 'Kata sandi ini telah ditemukan sebagai bagian dari kebocoran data dan tidak dapat digunakan, silakan reset kata sandi Anda.', form_password_size_in_bytes_exceeded: 'Kata sandi Anda telah melebihi jumlah byte maksimum yang diizinkan, silakan persingkat atau hapus beberapa karakter khusus.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Kata Sandi Salah', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts index 1e08384e767..13e2b353593 100644 --- a/packages/localizations/src/is-IS.ts +++ b/packages/localizations/src/is-IS.ts @@ -695,9 +695,15 @@ export const isIS: LocalizationResource = { subtitle: 'Sláðu inn lykilorðið sem tengist reikningnum þínum', title: 'Sláðu inn lykilorðið þitt', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Lykilorð brotið', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Staðfestingarkóði', resendButton: 'Fékkstu ekki kóða? Senda aftur', @@ -902,6 +908,7 @@ export const isIS: LocalizationResource = { 'Þetta lykilorð hefur fundist sem hluti af öryggisbresti og má ekki nota, vinsamlegast endurstilltu lykilorðið þitt.', form_password_size_in_bytes_exceeded: 'Lykilorðið þitt hefur farið yfir hámarksfjölda bæta sem leyfðir eru, vinsamlegast styttu það eða fjarlægðu nokkra sérstafi.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Rangt lykilorð', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts index 71fd3f220f4..a00ee857c98 100644 --- a/packages/localizations/src/it-IT.ts +++ b/packages/localizations/src/it-IT.ts @@ -700,9 +700,15 @@ export const itIT: LocalizationResource = { subtitle: 'per continuare su {{applicationName}}', title: 'Inserisci la tua password', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'La tua password è stata trovata in un data breach.', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Codice di verifica', resendButton: 'Rinvia il codice', @@ -907,6 +913,7 @@ export const itIT: LocalizationResource = { 'Questa password è stata trovata in una violazione dei dati. Non può essere utilizzata. Reimposta la tua password.', form_password_size_in_bytes_exceeded: 'La tua password ha superato il numero massimo di byte consentiti, per favore accorciala o rimuovi alcuni caratteri speciali.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Password errata.', form_username_invalid_character: 'Il nome utente contiene caratteri non validi.', form_username_invalid_length: 'Il nome utente deve avere una lunghezza compresa tra 3 e 32 caratteri.', diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts index d1ece04d110..a0ca9c1a8ec 100644 --- a/packages/localizations/src/ja-JP.ts +++ b/packages/localizations/src/ja-JP.ts @@ -692,9 +692,15 @@ export const jaJP: LocalizationResource = { subtitle: '{{applicationName}}へのアクセスを続ける', title: 'パスワードを入力', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: undefined, }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: '検証コード', resendButton: 'コードを再送信', @@ -898,9 +904,11 @@ export const jaJP: LocalizationResource = { form_password_not_strong_enough: 'パスワードの強度が不十分です。', form_password_pwned: 'このパスワードは侵害の一部として見つかったため使用できません。別のパスワードを試してください。', - form_password_pwned__sign_in: undefined, + form_password_pwned__sign_in: + 'このパスワードは侵害の一部として見つかったため使用できません。パスワードをリセットしてください。', form_password_size_in_bytes_exceeded: 'パスワードのバイト数が上限を超えています。短くするか、一部の特殊文字を削除してください。', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'パスワードが間違っています', form_username_invalid_character: 'ユーザー名に無効な文字が含まれています。', form_username_invalid_length: 'ユーザー名の長さが無効です。', diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts index 51652ba0316..a1e1b55ef22 100644 --- a/packages/localizations/src/kk-KZ.ts +++ b/packages/localizations/src/kk-KZ.ts @@ -685,9 +685,15 @@ export const kkKZ: LocalizationResource = { subtitle: 'Есептік жазбаңыздың құпия сөзін енгізіңіз', title: 'Құпия сөзді енгізіңіз', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Құпия сөз қауіпті', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Растау коды', resendButton: 'Код алмадыңыз ба? Қайта жіберу', @@ -888,6 +894,7 @@ export const kkKZ: LocalizationResource = { form_password_pwned__sign_in: 'Бұл құпия сөз қауіпсіз емес. Құпия сөзді өзгертуге болады.', form_password_size_in_bytes_exceeded: 'Құпия сөзде тым көп байт бар. Оны қысқартыңыз немесе арнайы таңбаларды алып тастаңыз.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Құпия сөз қате', form_username_invalid_character: 'Пайдаланушы атында жарамсыз таңбалар бар. Тек әріптер, сандар және астыңғы сызықшаларды қолданыңыз.', diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts index 919f1bd5d8c..1c29c335b67 100644 --- a/packages/localizations/src/ko-KR.ts +++ b/packages/localizations/src/ko-KR.ts @@ -687,9 +687,15 @@ export const koKR: LocalizationResource = { subtitle: '계정에 등록된 비밀번호를 입력해 주세요', title: '비밀번호를 입력하세요', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: undefined, }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: '인증 코드', resendButton: '코드 다시 보내기', @@ -891,6 +897,7 @@ export const koKR: LocalizationResource = { form_password_pwned__sign_in: undefined, form_password_size_in_bytes_exceeded: '비밀번호가 허용되는 최대 바이트 수를 초과했습니다. 비밀번호를 줄이거나 일부 특수 문자를 제거해 주세요.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: '잘못된 비밀번호', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts index 6a83251942c..7710f935a4a 100644 --- a/packages/localizations/src/mn-MN.ts +++ b/packages/localizations/src/mn-MN.ts @@ -694,9 +694,15 @@ export const mnMN: LocalizationResource = { subtitle: 'Бүртгэлтэй холбоотой нууц үгээ оруулна уу', title: 'Нууц үгээ оруулна уу', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: undefined, }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Баталгаажуулах код', resendButton: 'Код хүлээж аваагүй юу? Дахин илгээх', @@ -899,6 +905,7 @@ export const mnMN: LocalizationResource = { form_password_pwned__sign_in: undefined, form_password_size_in_bytes_exceeded: 'Энэ нууц үгийг зөрчлийн нэг хэсэг гэж олсон тул ашиглах боломжгүй. Өөр нууц үг оруулж үзнэ үү.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Нууц үг буруу', form_username_invalid_character: 'Хэрэглэгчийн нэр буруу тэмдэгт агуулж байна.', form_username_invalid_length: 'Хэрэглэгчийн нэр буруу байна.', diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts index 10b5565164e..1ba51bae5ef 100644 --- a/packages/localizations/src/ms-MY.ts +++ b/packages/localizations/src/ms-MY.ts @@ -698,9 +698,15 @@ export const msMY: LocalizationResource = { subtitle: 'Masukkan kata laluan yang berkaitan dengan akaun anda', title: 'Masukkan kata laluan anda', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Kata laluan dikompromi', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Kod pengesahan', resendButton: 'Tidak menerima kod? Hantar semula', @@ -909,6 +915,7 @@ export const msMY: LocalizationResource = { 'Kata laluan ini telah dijumpai sebagai sebahagian daripada pelanggaran dan tidak boleh digunakan, sila tetapkan semula kata laluan anda.', form_password_size_in_bytes_exceeded: 'Kata laluan anda telah melebihi bilangan maksimum bait yang dibenarkan, sila pendekkannya atau keluarkan beberapa aksara khas.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Kata Laluan Tidak Betul', form_username_invalid_character: 'Nama pengguna anda mengandungi aksara yang tidak sah. Sila gunakan hanya huruf, nombor, dan garis bawah.', diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts index 3ad81e887d6..30a5ed65927 100644 --- a/packages/localizations/src/nb-NO.ts +++ b/packages/localizations/src/nb-NO.ts @@ -692,9 +692,15 @@ export const nbNO: LocalizationResource = { subtitle: 'for å fortsette til {{applicationName}}', title: 'Skriv inn passordet ditt', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: undefined, }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Verifiseringskode', resendButton: 'Send kode på nytt', @@ -898,6 +904,7 @@ export const nbNO: LocalizationResource = { form_password_pwned__sign_in: undefined, form_password_size_in_bytes_exceeded: 'Passordet ditt har overskredet maksimalt antall byte tillatt. Vennligst forkort det eller fjern noen spesialtegn.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Feil passord', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts index 7ce4fff3dd4..b67e1eb96cc 100644 --- a/packages/localizations/src/nl-BE.ts +++ b/packages/localizations/src/nl-BE.ts @@ -693,9 +693,15 @@ export const nlBE: LocalizationResource = { subtitle: 'om door te gaan naar {{applicationName}}', title: 'Vul je wachtwoord in', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Dit wachtwoord is gelekt bij een datalek. Kies een ander wachtwoord om veiligheidsredenen.', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Verificatiecode', resendButton: 'Verstuur code opnieuw', @@ -898,6 +904,7 @@ export const nlBE: LocalizationResource = { form_password_pwned__sign_in: 'Als je dit wachtwoord elders gebruikt, moet je het wijzigen.', form_password_size_in_bytes_exceeded: 'Je wachtwoord heeft het maximum aantal bytes overschreden, vermijd speciale tekens.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Wachtwoord is incorrect.', form_username_invalid_character: 'De gebruikersnaam bevat ongeldige tekens.', form_username_invalid_length: 'De gebruikersnaam is te kort of te lang.', diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts index a39c91c1168..435fd0d10ca 100644 --- a/packages/localizations/src/nl-NL.ts +++ b/packages/localizations/src/nl-NL.ts @@ -693,9 +693,15 @@ export const nlNL: LocalizationResource = { subtitle: 'om door te gaan naar {{applicationName}}', title: 'Vul je wachtwoord in', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Dit wachtwoord is gelekt bij een datalek. Kies een ander wachtwoord om veiligheidsredenen.', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Verificatiecode', resendButton: 'Verstuur code opnieuw', @@ -898,6 +904,7 @@ export const nlNL: LocalizationResource = { form_password_pwned__sign_in: 'Als je dit wachtwoord elders gebruikt, moet je het wijzigen.', form_password_size_in_bytes_exceeded: 'Je wachtwoord heeft het maximum aantal bytes overschreden, vermijd speciale tekens.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Wachtwoord is incorrect.', form_username_invalid_character: 'De gebruikersnaam bevat ongeldige tekens.', form_username_invalid_length: 'De gebruikersnaam is te kort of te lang.', diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts index 5fa5d7129fb..3a4fd9ddda1 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -695,9 +695,15 @@ export const plPL: LocalizationResource = { subtitle: 'aby kontynuować w {{applicationName}}', title: 'Wprowadź swoje hasło', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Hasło skompromitowane', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Kod weryfikacyjny', resendButton: 'Wyślij kod ponownie', @@ -904,6 +910,7 @@ export const plPL: LocalizationResource = { form_password_pwned__sign_in: 'To hasło zostało znalezione w wyniku włamania i nie można go użyć. Zresetuj hasło.', form_password_size_in_bytes_exceeded: 'Twoje hasło przekroczyło maksymalną dozwoloną liczbę bajtów, skróć je lub usuń niektóre znaki specjalne.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Podane hasło jest nieprawidłowe', form_username_invalid_character: 'Twoja nazwa użytkownika zawiera nieprawidłowe znaki. Prosimy o używanie wyłącznie liter, cyfr i podkreśleń.', diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts index 9d3eef9e152..ecc67af1b0f 100644 --- a/packages/localizations/src/pt-BR.ts +++ b/packages/localizations/src/pt-BR.ts @@ -702,9 +702,15 @@ export const ptBR: LocalizationResource = { subtitle: 'para continuar em {{applicationName}}', title: 'Insira sua senha', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Senha comprometida', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Código de verificação', resendButton: 'Reenviar código', @@ -910,6 +916,7 @@ export const ptBR: LocalizationResource = { form_password_pwned__sign_in: 'Esta senha foi comprometida, por favor redefina sua senha.', form_password_size_in_bytes_exceeded: 'Sua senha excedeu o número máximo de bytes permitidos, por favor, encurte-a ou remova alguns caracteres especiais.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Senha incorreta', form_username_invalid_character: 'Nome de usuário contém caracteres inválidos. Por favor, tente outro.', form_username_invalid_length: 'Nome de usuário deve ter entre 3 e 256 caracteres.', diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts index 4cda68f3624..e99a85289ea 100644 --- a/packages/localizations/src/pt-PT.ts +++ b/packages/localizations/src/pt-PT.ts @@ -691,9 +691,15 @@ export const ptPT: LocalizationResource = { subtitle: 'para continuar em {{applicationName}}', title: 'Insira a sua palavra-passe', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Este password foi comprometido em uma violação de dados. Escolha outro por motivos de segurança.', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Código de verificação', resendButton: 'Reenviar código', @@ -898,6 +904,7 @@ export const ptPT: LocalizationResource = { 'Esta palavra-passe foi encontrada como parte de uma violação e não pode ser utilizada para login. Por favor, escolha outra.', form_password_size_in_bytes_exceeded: 'A sua palavra-passe excedeu o número máximo de bytes permitidos, por favor, encurte-a ou remova alguns caracteres especiais.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Falha na validação da palavra-passe.', form_username_invalid_character: 'O nome de utilizador contém caracteres inválidos.', form_username_invalid_length: 'O nome de utilizador deve ter entre 3 e 50 caracteres.', diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts index 8284ca0a329..b48ac2b6722 100644 --- a/packages/localizations/src/ro-RO.ts +++ b/packages/localizations/src/ro-RO.ts @@ -704,9 +704,15 @@ export const roRO: LocalizationResource = { subtitle: 'Introdu parola asociată contului tău', title: 'Introdu parola', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Parola este compromisă', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Cod de verificare', resendButton: 'Nu ai primit un cod? Retrimite', @@ -911,6 +917,7 @@ export const roRO: LocalizationResource = { form_password_pwned__sign_in: 'Această parolă a fost găsită într-o breșă de securitate și nu poate fi folosită. Te rugăm resetează parola.', form_password_size_in_bytes_exceeded: undefined, + form_password_untrusted__sign_in: undefined, form_password_validation_failed: undefined, form_username_invalid_character: undefined, form_username_invalid_length: diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts index d8d6a010559..5208a202811 100644 --- a/packages/localizations/src/ru-RU.ts +++ b/packages/localizations/src/ru-RU.ts @@ -702,9 +702,15 @@ export const ruRU: LocalizationResource = { subtitle: 'чтобы продолжить работу в "{{applicationName}}"', title: 'Введите пароль', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Пароль скомпрометирован', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Верификационный код', resendButton: 'Не получили код? Отправить снова.', @@ -911,6 +917,7 @@ export const ruRU: LocalizationResource = { 'Этот пароль был найден в утечке данных и не может быть использован. Пожалуйста, сбросьте пароль.', form_password_size_in_bytes_exceeded: 'Ваш пароль превышает максимально допустимое количество байтов, сократите его или удалите некоторые специальные символы.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Неверный пароль', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts index d08d954746c..b7055e253bf 100644 --- a/packages/localizations/src/sk-SK.ts +++ b/packages/localizations/src/sk-SK.ts @@ -695,9 +695,15 @@ export const skSK: LocalizationResource = { subtitle: 'pre pokračovanie do {{applicationName}}', title: 'Zadajte svoje heslo', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: undefined, }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Overovací kód', resendButton: 'Znova odoslať kód', @@ -904,6 +910,7 @@ export const skSK: LocalizationResource = { 'Toto heslo bolo nájdené v rámci úniku dát a nemôže byť použité, prosím zvoľte iné heslo.', form_password_size_in_bytes_exceeded: 'Vaše heslo prekročilo maximálny povolený počet bytov, prosím skráťte ho alebo odstráňte niektoré špeciálne znaky.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Nesprávne heslo', form_username_invalid_character: 'Používateľské meno môže obsahovať len písmená, číslice, pomlčky a podčiarkovníky.', diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts index 952de397572..949b3bf3c42 100644 --- a/packages/localizations/src/sr-RS.ts +++ b/packages/localizations/src/sr-RS.ts @@ -692,9 +692,15 @@ export const srRS: LocalizationResource = { subtitle: 'Unesi lozinku koja je povezana sa tvojim nalogom', title: 'Unesi svoju lozinku', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Lozinka kompromitovana', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Verifikacioni kod', resendButton: 'Nisi primio kod? Pošalji ponovo', @@ -898,6 +904,7 @@ export const srRS: LocalizationResource = { 'Ova lozinka je pronađena kao deo kompromitovanih podataka i ne može se koristiti, molimo resetuj svoju lozinku.', form_password_size_in_bytes_exceeded: 'Tvoja lozinka je premašila maksimalni dozvoljeni broj bajtova, molimo skrati je ili ukloni neke specijalne znakove.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Neispravna lozinka', form_username_invalid_character: 'Korisničko ime sadrži nevažeće karaktere.', form_username_invalid_length: 'Dužina korisničkog imena nije validna.', diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts index d9b2c4f65a8..d385b3d8be5 100644 --- a/packages/localizations/src/sv-SE.ts +++ b/packages/localizations/src/sv-SE.ts @@ -695,9 +695,15 @@ export const svSE: LocalizationResource = { subtitle: 'för att fortsätta till {{applicationName}}', title: 'Ange ditt lösenord', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Lösenord är för osäkert', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Verifieringskod', resendButton: 'Skicka koden igen', @@ -901,6 +907,7 @@ export const svSE: LocalizationResource = { form_password_pwned__sign_in: 'Lösenordet har läckt, vänligen logga in för att ändra det.', form_password_size_in_bytes_exceeded: 'Ditt lösenord har överskridit det maximala antalet tillåtna bytes, vänligen förkorta det eller ta bort några specialtecken.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Felaktigt lösenord', form_username_invalid_character: 'Användarnamnet innehåller ogiltiga tecken.', form_username_invalid_length: 'Användarnamnets längd är ogiltig.', diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts index d18e325f5e5..d09f6401e94 100644 --- a/packages/localizations/src/ta-IN.ts +++ b/packages/localizations/src/ta-IN.ts @@ -698,9 +698,15 @@ export const taIN: LocalizationResource = { subtitle: 'உங்கள் கணக்குடன் தொடர்புடைய கடவுச்சொல்லை உள்ளிடவும்', title: 'உங்கள் கடவுச்சொல்லை உள்ளிடவும்', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'கடவுச்சொல் அபாயத்தில் உள்ளது', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'சரிபார்ப்புக் குறியீடு', resendButton: 'குறியீடு கிடைக்கவில்லையா? மீண்டும் அனுப்பு', @@ -908,6 +914,7 @@ export const taIN: LocalizationResource = { 'இந்த கடவுச்சொல் தரவு மீறலின் ஒரு பகுதியாக காணப்பட்டது மற்றும் பயன்படுத்த முடியாது, தயவுசெய்து உங்கள் கடவுச்சொல்லை மீட்டமைக்கவும்.', form_password_size_in_bytes_exceeded: 'உங்கள் கடவுச்சொல் அனுமதிக்கப்பட்ட அதிகபட்ச பைட்டுகளை மீறிவிட்டது, தயவுசெய்து அதை குறைக்கவும் அல்லது சில சிறப்பு எழுத்துக்களை நீக்கவும்.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'தவறான கடவுச்சொல்', form_username_invalid_character: 'உங்கள் பயனர்பெயரில் தவறான எழுத்துக்கள் உள்ளன. எழுத்துக்கள், எண்கள் மற்றும் அடிக்கோடுகளை மட்டும் பயன்படுத்தவும்.', diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts index 40134fa9f1b..360acba609d 100644 --- a/packages/localizations/src/te-IN.ts +++ b/packages/localizations/src/te-IN.ts @@ -697,9 +697,15 @@ export const teIN: LocalizationResource = { subtitle: 'మీ ఖాతాతో సంబంధం ఉన్న పాస్‌వర్డ్‌ను నమోదు చేయండి', title: 'మీ పాస్‌వర్డ్‌ను నమోదు చేయండి', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'పాస్‌వర్డ్ ప్రమాదంలో ఉంది', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'ధృవీకరణ కోడ్', resendButton: 'కోడ్ అందలేదా? మళ్ళీ పంపండి', @@ -907,6 +913,7 @@ export const teIN: LocalizationResource = { 'ఈ పాస్‌వర్డ్ డేటా ఉల్లంఘన భాగంగా కనుగొనబడింది మరియు ఉపయోగించడానికి వీలుపడదు, దయచేసి మీ పాస్‌వర్డ్‌ను రీసెట్ చేయండి.', form_password_size_in_bytes_exceeded: 'మీ పాస్‌వర్డ్ అనుమతించిన గరిష్ట బైట్ల సంఖ్యను మించింది, దయచేసి దాన్ని చిన్నదిగా చేయండి లేదా కొన్ని ప్రత్యేక అక్షరాలను తొలగించండి.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'తప్పు పాస్‌వర్డ్', form_username_invalid_character: 'మీ వినియోగదారు పేరులో చెల్లని అక్షరాలు ఉన్నాయి. దయచేసి అక్షరాలు, సంఖ్యలు మరియు అండర్‌స్కోర్‌లను మాత్రమే ఉపయోగించండి.', diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts index 99818db1309..07a1fce16b9 100644 --- a/packages/localizations/src/th-TH.ts +++ b/packages/localizations/src/th-TH.ts @@ -694,9 +694,15 @@ export const thTH: LocalizationResource = { subtitle: 'ใส่รหัสผ่านที่เชื่อมโยงกับบัญชีของคุณ', title: 'ใส่รหัสผ่านของคุณ', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'รหัสผ่านถูกโจรกรรม', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'รหัสยืนยัน', resendButton: 'ไม่ได้รับรหัส? ส่งใหม่', @@ -899,6 +905,7 @@ export const thTH: LocalizationResource = { form_password_pwned__sign_in: 'รหัสผ่านนี้ถูกพบว่าเป็นส่วนหนึ่งของรหัสผ่านที่เคยถูกโจรกรรมข้อมูลและไม่สามารถใช้ได้ โปรดรีเซ็ตรหัสผ่านของคุณ', form_password_size_in_bytes_exceeded: undefined, + form_password_untrusted__sign_in: undefined, form_password_validation_failed: undefined, form_username_invalid_character: undefined, form_username_invalid_length: 'ชื่อผู้ใช้ของคุณต้องมีความยาวระหว่าง {{min_length}} ถึง {{max_length}} ตัวอักษร', diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts index 5a65f006d58..97168de2838 100644 --- a/packages/localizations/src/tr-TR.ts +++ b/packages/localizations/src/tr-TR.ts @@ -694,9 +694,15 @@ export const trTR: LocalizationResource = { subtitle: '{{applicationName}} ile devam etmek için', title: 'Şifrenizi girin', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Şifre ele geçirildi', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Doğrulama kodu', resendButton: 'Kod almadınız mı? Tekrar gönderin', @@ -900,6 +906,7 @@ export const trTR: LocalizationResource = { 'Bu şifre bir veri ihlalinde tespit edildi ve oturum açmak için kullanılamaz. Lütfen başka bir şifre seçin.', form_password_size_in_bytes_exceeded: 'Şifreniz izin verilen maksimum byte sayısını aştı, lütfen kısaltın veya bazı özel karakterleri çıkarın.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Şifre doğrulaması başarısız.', form_username_invalid_character: 'Kullanıcı adı geçersiz karakterler içeriyor.', form_username_invalid_length: 'Kullanıcı adı 3 ile 50 karakter arasında olmalıdır.', diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts index f95d2b788a5..ffc3e812363 100644 --- a/packages/localizations/src/uk-UA.ts +++ b/packages/localizations/src/uk-UA.ts @@ -691,9 +691,15 @@ export const ukUA: LocalizationResource = { subtitle: 'щоб продовжити роботу в "{{applicationName}}"', title: 'Введіть пароль', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: undefined, }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Код підтвердження', resendButton: 'Не отримали код? повторно відправити', @@ -895,6 +901,7 @@ export const ukUA: LocalizationResource = { form_password_pwned__sign_in: undefined, form_password_size_in_bytes_exceeded: 'Ваш пароль перевищує максимально допустиму кількість байтів, скоротіть його або видаліть деякі спеціальні символи.', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: 'Невірний пароль', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts index fb594fe9d09..d8b38186bd6 100644 --- a/packages/localizations/src/vi-VN.ts +++ b/packages/localizations/src/vi-VN.ts @@ -700,9 +700,15 @@ export const viVN: LocalizationResource = { subtitle: 'Nhập mật khẩu được liên kết với tài khoản của bạn', title: 'Nhập mật khẩu', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: 'Mật khẩu bị rò rỉ', }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: 'Mã xác minh', resendButton: 'Không nhận được mã? Gửi lại', @@ -906,6 +912,7 @@ export const viVN: LocalizationResource = { form_password_pwned__sign_in: 'Mật khẩu này đã được tìm thấy trong một rò rỉ và không thể được sử dụng, vui lòng đặt lại mật khẩu của bạn.', form_password_size_in_bytes_exceeded: undefined, + form_password_untrusted__sign_in: undefined, form_password_validation_failed: undefined, form_username_invalid_character: undefined, form_username_invalid_length: 'Tên người dùng của bạn phải có giữa {{min_length}} và {{max_length}} ký tự.', diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts index 885f4473c11..ef8e11f1d77 100644 --- a/packages/localizations/src/zh-CN.ts +++ b/packages/localizations/src/zh-CN.ts @@ -681,9 +681,15 @@ export const zhCN: LocalizationResource = { subtitle: '继续使用 {{applicationName}}', title: '输入您的密码', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: undefined, }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: '验证码', resendButton: '重新发送验证码', @@ -882,6 +888,7 @@ export const zhCN: LocalizationResource = { form_password_pwned: '这个密码在数据泄露中被发现,不能使用,请换一个密码试试。', form_password_pwned__sign_in: undefined, form_password_size_in_bytes_exceeded: '您的密码超过了允许的最大字节数,请缩短它或去掉一些特殊字符。', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: '密码错误', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts index 679b8399d8a..5ba0befc600 100644 --- a/packages/localizations/src/zh-TW.ts +++ b/packages/localizations/src/zh-TW.ts @@ -681,9 +681,15 @@ export const zhTW: LocalizationResource = { subtitle: '以繼續前往 {{applicationName}}', title: '輸入您的密碼', }, + passwordCompromised: { + title: undefined, + }, passwordPwned: { title: undefined, }, + passwordUntrusted: { + title: undefined, + }, phoneCode: { formTitle: '驗證碼', resendButton: '重新傳送驗證碼', @@ -883,6 +889,7 @@ export const zhTW: LocalizationResource = { form_password_pwned: '此密碼已在已知的資料外洩事件中出現,請改用其他密碼。', form_password_pwned__sign_in: undefined, form_password_size_in_bytes_exceeded: '您的密碼超過允許的大小上限,請縮短或移除部分特殊字元。', + form_password_untrusted__sign_in: undefined, form_password_validation_failed: '密碼驗證失敗', form_username_invalid_character: undefined, form_username_invalid_length: undefined, diff --git a/packages/shared/src/error.ts b/packages/shared/src/error.ts index 14b32870d1f..ad8cea5ce3b 100644 --- a/packages/shared/src/error.ts +++ b/packages/shared/src/error.ts @@ -24,6 +24,7 @@ export { isMetamaskError, isNetworkError, isPasswordPwnedError, + isPasswordCompromisedError, isReverificationCancelledError, isUnauthorizedError, isUserLockedError, diff --git a/packages/shared/src/errors/helpers.ts b/packages/shared/src/errors/helpers.ts index 046270fedf9..5d28681e836 100644 --- a/packages/shared/src/errors/helpers.ts +++ b/packages/shared/src/errors/helpers.ts @@ -120,6 +120,15 @@ export function isPasswordPwnedError(err: any) { return isClerkAPIResponseError(err) && err.errors?.[0]?.code === 'form_password_pwned'; } +/** + * Checks if the provided error is a clerk api response error indicating a password was compromised. + * + * @internal + */ +export function isPasswordCompromisedError(err: any) { + return isClerkAPIResponseError(err) && err.errors?.[0]?.code === 'form_password_compromised'; +} + /** * Checks if the provided error is an EmailLinkError. * diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts index d80f9dbc54f..1776bfc87bf 100644 --- a/packages/shared/src/types/localization.ts +++ b/packages/shared/src/types/localization.ts @@ -400,6 +400,13 @@ export type __internal_LocalizationResource = { passwordPwned: { title: LocalizationValue; }; + /** @deprecated Use `passwordCompromised` instead */ + passwordUntrusted: { + title: LocalizationValue; + }; + passwordCompromised: { + title: LocalizationValue; + }; passkey: { title: LocalizationValue; subtitle: LocalizationValue; @@ -1312,6 +1319,9 @@ type UnstableErrors = WithParamName<{ web3_missing_identifier: LocalizationValue; form_password_pwned: LocalizationValue; form_password_pwned__sign_in: LocalizationValue; + /** @deprecated Use `form_password_compromised__sign_in` instead */ + form_password_untrusted__sign_in: LocalizationValue; + form_password_compromised__sign_in: LocalizationValue; form_username_invalid_length: LocalizationValue<'min_length' | 'max_length'>; form_username_invalid_character: LocalizationValue; form_param_format_invalid: LocalizationValue; diff --git a/packages/ui/src/components/SignIn/AlternativeMethods.tsx b/packages/ui/src/components/SignIn/AlternativeMethods.tsx index 8ca576bdab1..4cc452bf379 100644 --- a/packages/ui/src/components/SignIn/AlternativeMethods.tsx +++ b/packages/ui/src/components/SignIn/AlternativeMethods.tsx @@ -18,7 +18,7 @@ import { SignInSocialButtons } from './SignInSocialButtons'; import { useResetPasswordFactor } from './useResetPasswordFactor'; import { withHavingTrouble } from './withHavingTrouble'; -type AlternativeMethodsMode = 'forgot' | 'pwned' | 'default'; +export type AlternativeMethodsMode = 'forgot' | 'pwned' | 'passwordCompromised' | 'default'; export type AlternativeMethodsProps = { onBackLinkClick: React.MouseEventHandler | undefined; @@ -55,7 +55,9 @@ const AlternativeMethodsList = (props: AlternativeMethodListProps) => { - {!isReset && } + {!isReset && mode !== 'passwordCompromised' && ( + + )} {card.error} {/*TODO: extract main in its own component */} @@ -183,6 +185,8 @@ function determineFlowPart(mode: AlternativeMethodsMode) { return 'forgotPasswordMethods'; case 'pwned': return 'passwordPwnedMethods'; + case 'passwordCompromised': + return 'passwordCompromisedMethods'; default: return 'alternativeMethods'; } @@ -194,6 +198,8 @@ function determineTitle(mode: AlternativeMethodsMode): LocalizationKey { return localizationKeys('signIn.forgotPasswordAlternativeMethods.title'); case 'pwned': return localizationKeys('signIn.passwordPwned.title'); + case 'passwordCompromised': + return localizationKeys('signIn.passwordCompromised.title'); default: return localizationKeys('signIn.alternativeMethods.title'); } @@ -204,6 +210,8 @@ function determineIsReset(mode: AlternativeMethodsMode): boolean { case 'forgot': case 'pwned': return true; + case 'passwordCompromised': + return false; default: return false; } diff --git a/packages/ui/src/components/SignIn/SignInFactorOne.tsx b/packages/ui/src/components/SignIn/SignInFactorOne.tsx index e318345e719..c493c19dfd9 100644 --- a/packages/ui/src/components/SignIn/SignInFactorOne.tsx +++ b/packages/ui/src/components/SignIn/SignInFactorOne.tsx @@ -11,6 +11,7 @@ import { useCoreSignIn, useEnvironment } from '../../contexts'; import { useAlternativeStrategies } from '../../hooks/useAlternativeStrategies'; import { localizationKeys } from '../../localization'; import { useRouter } from '../../router'; +import type { AlternativeMethodsMode } from './AlternativeMethods'; import { AlternativeMethods } from './AlternativeMethods'; import { hasMultipleEnterpriseConnections } from './shared'; import { SignInFactorOneAlternativePhoneCodeCard } from './SignInFactorOneAlternativePhoneCodeCard'; @@ -19,6 +20,7 @@ import { SignInFactorOneEmailLinkCard } from './SignInFactorOneEmailLinkCard'; import { SignInFactorOneEnterpriseConnections } from './SignInFactorOneEnterpriseConnections'; import { SignInFactorOneForgotPasswordCard } from './SignInFactorOneForgotPasswordCard'; import { SignInFactorOnePasskey } from './SignInFactorOnePasskey'; +import type { PasswordErrorCode } from './SignInFactorOnePasswordCard'; import { SignInFactorOnePasswordCard } from './SignInFactorOnePasswordCard'; import { SignInFactorOnePhoneCodeCard } from './SignInFactorOnePhoneCodeCard'; import { useResetPasswordFactor } from './useResetPasswordFactor'; @@ -41,6 +43,25 @@ const factorKey = (factor: SignInFactor | null | undefined) => { return key; }; +function determineAlternativeMethodsMode( + showForgotPasswordStrategies: boolean, + passwordErrorCode: PasswordErrorCode | null, +): AlternativeMethodsMode { + if (!showForgotPasswordStrategies) { + return 'default'; + } + + if (passwordErrorCode === 'pwned') { + return 'pwned'; + } + + if (passwordErrorCode === 'compromised') { + return 'passwordCompromised'; + } + + return 'forgot'; +} + function SignInFactorOneInternal(): JSX.Element { const { __internal_setActiveInProgress } = useClerk(); const signIn = useCoreSignIn(); @@ -84,7 +105,7 @@ function SignInFactorOneInternal(): JSX.Element { const [showForgotPasswordStrategies, setShowForgotPasswordStrategies] = React.useState(false); - const [isPasswordPwned, setIsPasswordPwned] = React.useState(false); + const [passwordErrorCode, setPasswordErrorCode] = React.useState(null); React.useEffect(() => { if (__internal_setActiveInProgress) { @@ -139,11 +160,11 @@ function SignInFactorOneInternal(): JSX.Element { const toggle = showAllStrategies ? toggleAllStrategies : toggleForgotPasswordStrategies; const backHandler = () => { card.setError(undefined); - setIsPasswordPwned(false); + setPasswordErrorCode(null); toggle?.(); }; - const mode = showForgotPasswordStrategies ? (isPasswordPwned ? 'pwned' : 'forgot') : 'default'; + const mode = determineAlternativeMethodsMode(showForgotPasswordStrategies, passwordErrorCode); return ( { - setIsPasswordPwned(true); + onPasswordError={errorCode => { + setPasswordErrorCode(errorCode); toggleForgotPasswordStrategies(); }} /> diff --git a/packages/ui/src/components/SignIn/SignInFactorOnePasswordCard.tsx b/packages/ui/src/components/SignIn/SignInFactorOnePasswordCard.tsx index 34884e417fb..8acacb4021f 100644 --- a/packages/ui/src/components/SignIn/SignInFactorOnePasswordCard.tsx +++ b/packages/ui/src/components/SignIn/SignInFactorOnePasswordCard.tsx @@ -1,4 +1,4 @@ -import { isPasswordPwnedError, isUserLockedError } from '@clerk/shared/error'; +import { isPasswordCompromisedError, isPasswordPwnedError, isUserLockedError } from '@clerk/shared/error'; import { clerkInvalidFAPIResponse } from '@clerk/shared/internal/clerk-js/errors'; import { useClerk } from '@clerk/shared/react'; import React from 'react'; @@ -18,10 +18,12 @@ import { useRouter } from '../../router/RouteContext'; import { HavingTrouble } from './HavingTrouble'; import { useResetPasswordFactor } from './useResetPasswordFactor'; +export type PasswordErrorCode = 'compromised' | 'pwned'; + type SignInFactorOnePasswordProps = { onForgotPasswordMethodClick: React.MouseEventHandler | undefined; onShowAlternativeMethodsClick: React.MouseEventHandler | undefined; - onPasswordPwned?: () => void; + onPasswordError?: (errorCode: PasswordErrorCode) => void; }; const usePasswordControl = (props: SignInFactorOnePasswordProps) => { @@ -50,7 +52,7 @@ const usePasswordControl = (props: SignInFactorOnePasswordProps) => { }; export const SignInFactorOnePasswordCard = (props: SignInFactorOnePasswordProps) => { - const { onShowAlternativeMethodsClick, onPasswordPwned } = props; + const { onShowAlternativeMethodsClick, onPasswordError } = props; const passwordInputRef = React.useRef(null); const card = useCardState(); const { setActive } = useClerk(); @@ -64,20 +66,20 @@ export const SignInFactorOnePasswordCard = (props: SignInFactorOnePasswordProps) const clerk = useClerk(); const goBack = () => { - return navigate('../'); + void navigate('../'); }; - const handlePasswordSubmit: React.FormEventHandler = async e => { + const handlePasswordSubmit: React.FormEventHandler = e => { e.preventDefault(); - return signIn + void signIn .attemptFirstFactor({ strategy: 'password', password: passwordControl.value }) .then(res => { switch (res.status) { case 'complete': return setActive({ session: res.createdSessionId, - navigate: async ({ session }) => { - await navigateOnSetActive({ session, redirectUrl: afterSignInUrl }); + navigate: ({ session }) => { + void navigateOnSetActive({ session, redirectUrl: afterSignInUrl }); }, }); case 'needs_second_factor': @@ -92,10 +94,18 @@ export const SignInFactorOnePasswordCard = (props: SignInFactorOnePasswordProps) return clerk.__internal_navigateWithError('..', err.errors[0]); } - if (isPasswordPwnedError(err) && onPasswordPwned) { - card.setError({ ...err.errors[0], code: 'form_password_pwned__sign_in' }); - onPasswordPwned(); - return; + if (onPasswordError) { + if (isPasswordPwnedError(err)) { + card.setError({ ...err.errors[0], code: 'form_password_pwned__sign_in' }); + onPasswordError('pwned'); + return; + } + + if (isPasswordCompromisedError(err)) { + card.setError({ ...err.errors[0], code: 'form_password_compromised__sign_in' }); + onPasswordError('compromised'); + return; + } } handleError(err, [passwordControl], card.setError); diff --git a/packages/ui/src/components/SignIn/__tests__/SignInFactorOne.test.tsx b/packages/ui/src/components/SignIn/__tests__/SignInFactorOne.test.tsx index d610e2d9150..a4a2525ed61 100644 --- a/packages/ui/src/components/SignIn/__tests__/SignInFactorOne.test.tsx +++ b/packages/ui/src/components/SignIn/__tests__/SignInFactorOne.test.tsx @@ -352,6 +352,84 @@ describe('SignInFactorOne', () => { ), ).not.toBeInTheDocument(); }); + + it('using an compromised password should show the compromised password screen', async () => { + const { wrapper, fixtures } = await createFixtures(f => { + f.withEmailAddress(); + f.withPassword(); + f.withPreferredSignInStrategy({ strategy: 'password' }); + f.startSignInWithEmailAddress({ + supportEmailCode: true, + supportPassword: true, + supportResetPassword: true, + }); + }); + fixtures.signIn.prepareFirstFactor.mockReturnValueOnce(Promise.resolve({} as SignInResource)); + + const errJSON = { + code: 'form_password_compromised', + long_message: + "Your password appears to have been compromised or it's no longer trusted and cannot be used. Please use another method to continue.", + message: + "Your password appears to have been compromised or it's no longer trusted and cannot be used. Please use another method to continue.", + meta: { param_name: 'password' }, + }; + + fixtures.signIn.attemptFirstFactor.mockRejectedValueOnce( + new ClerkAPIResponseError('Error', { + data: [errJSON], + status: 422, + }), + ); + const { userEvent } = render(, { wrapper }); + await userEvent.type(screen.getByLabelText('Password'), '123456'); + await userEvent.click(screen.getByText('Continue')); + + await screen.findByText('Password compromised'); + await screen.findByText( + "Your password appears to have been compromised or it's no longer trusted and cannot be used. Please use another method to continue.", + ); + + await screen.findByText('Email code to hello@clerk.com'); + }); + + it('Prompts the user to use a different method if the password is compromised', async () => { + const { wrapper, fixtures } = await createFixtures(f => { + f.withEmailAddress(); + f.withPassword(); + f.withPreferredSignInStrategy({ strategy: 'password' }); + f.withSocialProvider({ provider: 'google', authenticatable: true }); + f.startSignInWithEmailAddress({ + supportEmailCode: true, + supportPassword: true, + supportResetPassword: true, + }); + }); + fixtures.signIn.prepareFirstFactor.mockReturnValueOnce(Promise.resolve({} as SignInResource)); + + const errJSON = { + code: 'form_password_compromised', + long_message: + "Your password appears to have been compromised or it's no longer trusted and cannot be used. Please use another method to continue.", + message: + "Your password appears to have been compromised or it's no longer trusted and cannot be used. Please use another method to continue.", + meta: { param_name: 'password' }, + }; + + fixtures.signIn.attemptFirstFactor.mockRejectedValueOnce( + new ClerkAPIResponseError('Error', { + data: [errJSON], + status: 422, + }), + ); + const { userEvent } = render(, { wrapper }); + await userEvent.type(screen.getByLabelText('Password'), '123456'); + await userEvent.click(screen.getByText('Continue')); + + await screen.findByText('Password compromised'); + await userEvent.click(screen.getByText('Email code to hello@clerk.com')); + await screen.findByText('Check your email'); + }); }); describe('Forgot Password', () => { diff --git a/packages/ui/src/elements/contexts/index.tsx b/packages/ui/src/elements/contexts/index.tsx index 6211f1a0b84..6f660525375 100644 --- a/packages/ui/src/elements/contexts/index.tsx +++ b/packages/ui/src/elements/contexts/index.tsx @@ -120,6 +120,7 @@ export type FlowMetadata = { | 'alternativeMethods' | 'forgotPasswordMethods' | 'passwordPwnedMethods' + | 'passwordCompromisedMethods' | 'havingTrouble' | 'ssoCallback' | 'popupCallback'