diff --git a/development/idp-local/config/authsources.php b/development/idp-local/config/authsources.php index 2fb95e1b..a35db772 100644 --- a/development/idp-local/config/authsources.php +++ b/development/idp-local/config/authsources.php @@ -11,7 +11,7 @@ 'core:AdminPassword', ], - + // Set up example users for testing expirychecker module. 'example-userpass' => [ 'exampleauth:UserPass', @@ -448,6 +448,13 @@ 'last_used_utc' => null, 'data' => [ // Response from "POST /webauthn/login" MFA API call. + "id" => 88, + "label" => "My Webauthn Key", + "last_used_utc" => null, + "created_utc" => "2022-12-15 19:42:37", + "publicKey" => [ + "challenge" => "xxxxxxx", + ], ], ], ] diff --git a/features/bootstrap/MfaContext.php b/features/bootstrap/MfaContext.php index 988f1fb6..6ea146d4 100644 --- a/features/bootstrap/MfaContext.php +++ b/features/bootstrap/MfaContext.php @@ -208,7 +208,7 @@ protected function submitMfaValue($mfaValue) public function iSubmitACorrectBackupCode() { if (! $this->pageContainsElementWithText('h1', 'Printable code')) { - // find image of the backup code option presented in other_mfas.php + // find image of the backup code option presented in other_mfas.twig $printableCodeOption = $this->session->getPage()->find('css', 'img[src=mfa-backupcode\002Esvg]'); $printableCodeOption->click(); } @@ -661,6 +661,7 @@ public function iShouldSeeAPromptForAManagerRescueCode() $pageHtml = $page->getHtml(); Assert::assertContains('Ask Your Recovery Contact for Help', $pageHtml); Assert::assertContains('Enter code', $pageHtml); + Assert::assertContains('m*****r@e******.c**', $pageHtml); } /** diff --git a/modules/expirychecker/locales/es/LC_MESSAGES/.gitkeep b/modules/expirychecker/locales/es/LC_MESSAGES/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/modules/expirychecker/locales/fr/LC_MESSAGES/.gitkeep b/modules/expirychecker/locales/fr/LC_MESSAGES/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/modules/expirychecker/locales/ko/LC_MESSAGES/.gitkeep b/modules/expirychecker/locales/ko/LC_MESSAGES/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/modules/expirychecker/templates/.gitkeep b/modules/expirychecker/templates/.gitkeep new file mode 100644 index 00000000..57da54a3 --- /dev/null +++ b/modules/expirychecker/templates/.gitkeep @@ -0,0 +1 @@ +this directory will be filled in the Docker image with a copy of the material module templates diff --git a/modules/material/dictionaries/mfa.definition.json b/modules/material/dictionaries/mfa.definition.json deleted file mode 100644 index 287648eb..00000000 --- a/modules/material/dictionaries/mfa.definition.json +++ /dev/null @@ -1,399 +0,0 @@ - -{ - "title": { - "en": "2-Step Verification", - "es": "Verificación en 2 pasos", - "fr": "Vérification en deux étapes", - "ko": "2 단계 인증" - }, - "header": { - "en": "2-Step Verification", - "es": "Verificación en 2 pasos", - "fr": "Vérification en deux étapes", - "ko": "2 단계 인증" - }, - "backupcode_header": { - "en": "Printable code", - "es": "código imprimible", - "fr": "code imprimable", - "ko": "인쇄 가능한 코드" - }, - "backupcode_icon": { - "en": "Printable code icon", - "es": "icono de código imprimible", - "fr": "icône de code imprimable", - "ko": "인쇄 가능한 코드 아이콘" - }, - "backupcode_reminder": { - "en": "Each code can only be used once, so the code you enter this time will be used up and will not be available again.", - "es": "Cada código solo se puede usar una vez, por lo que el código que ingrese esta vez se agotará y no estará disponible nuevamente.", - "fr": "Chaque code ne peut être utilisé qu'une seule fois, de sorte que le code que vous entrez cette fois sera épuisé et ne sera plus disponible.", - "ko": "각 코드는 한번만 사용할 수 있으므로 이번에 입력한 코드는 소멸되어 다시 사용할 수 없습니다." - }, - "backupcode_input": { - "en": "Enter code", - "es": "Introduzca el código", - "fr": "Entrer le code", - "ko": "코드 입력" - }, - "totp_header": { - "en": "Get a code from your authenticator app", - "es": "Obtenga un código de su aplicación de autenticación", - "fr": "Obtenez un code depuis votre application d'authentification", - "ko": "인증 앱에서 코드 받기" - }, - "totp_icon": { - "en": "Authenticator app icon", - "es": "Icono de aplicación de teléfono inteligente", - "fr": "Icône de l'application Smartphone", - "ko": "인증 응용 프로그램 아이콘" - }, - "totp_instructions": { - "en": "You will need to check your authenticator app for the current code.", - "es": "Deberá verificar la aplicación de autenticación para ver el código actual.", - "fr": "Vous devriez vérifier l'application d'authentification pour voir le code actuel.", - "ko": "인증 앱에서 현재 코드를 확인해야합니다." - }, - "totp_input": { - "en": "Enter 6-digit code", - "es": "Ingrese el código de 6 dígitos", - "fr": "Entrer le code à 6 chiffres", - "ko": "6 자리 코드 입력" - }, - "u2f_header": { - "en": "Security key", - "es": "Clave de seguridad", - "fr": "Clé de sécurité", - "ko": "보안키" - }, - "webauthn_header": { - "en": "Security key", - "es": "Clave de seguridad", - "fr": "Clé de sécurité", - "ko": "보안키" - }, - "u2f_icon": { - "en": "USB key icon", - "es": "Icono de la llave USB", - "fr": "Icône de clé USB", - "ko": "USB 키 아이콘" - }, - "webauthn_icon": { - "en": "USB key icon", - "es": "Icono de la llave USB", - "fr": "Icône de clé USB", - "ko": "USB 키 아이콘" - }, - "u2f_instructions": { - "en": "You may now insert your security key and press its button.", - "es": "Ahora puede insertar su clave de seguridad y presionar su botón.", - "fr": "Vous pouvez maintenant insérer votre clé de sécurité et appuyer sur le bouton.", - "ko": "이제 보안 키를 삽입하고 단추를 누를 수 있습니다." - }, - "webauthn_instructions": { - "en": "You may now insert your security key and press its button.", - "es": "Ahora puede insertar su clave de seguridad y presionar su botón.", - "fr": "Vous pouvez maintenant insérer votre clé de sécurité et appuyer sur le bouton.", - "ko": "이제 보안 키를 삽입하고 단추를 누를 수 있습니다." - }, - "u2f_unsupported": { - "en": "Unsupported in your current browser. Please consider a more secure browser like Google Chrome.", - "es": "No compatible en su navegador actual. Considere un navegador más seguro como Google Chrome.", - "fr": "Non compatible avec votre navigateur actuel. Veuillez considérer un navigateur plus sûr comme Google Chrome.", - "ko": "현재 브라우저에서 지원되지 않습니다. Chrome과 같은 보다 안전한 브라우저를 고려하십시오." - }, - "webauthn_unsupported": { - "en": "Unsupported in your current browser. Please consider a more secure browser like Google Chrome.", - "es": "No compatible en su navegador actual. Considere un navegador más seguro como Google Chrome.", - "fr": "Non compatible avec votre navigateur actuel. Veuillez considérer un navigateur plus sûr comme Google Chrome.", - "ko": "현재 브라우저에서 지원되지 않습니다. Chrome과 같은 보다 안전한 브라우저를 고려하십시오." - }, - "u2f_error_unknown": { - "en": "Something went wrong with that request, unable to verify at this time.", - "es": "Algo salió mal con esa solicitud, no se pudo verificar en este momento.", - "fr": "Quelque chose s'est mal passé avec cette demande, impossible de vérifier pour le moment.", - "ko": "요청에 문제가 발생하여 지금은 확인할 수 없습니다." - }, - "webauthn_error_unknown": { - "en": "Something went wrong with that request, unable to verify at this time.", - "es": "Algo salió mal con esa solicitud, no se pudo verificar en este momento.", - "fr": "Quelque chose s'est mal passé avec cette demande, impossible de vérifier pour le moment.", - "ko": "요청에 문제가 발생하여 지금은 확인할 수 없습니다." - }, - "u2f_error_wrong_key": { - "en": "This may not be the correct key for this site.", - "es": "Esta puede no ser la clave correcta para este sitio.", - "fr": "Ce n'est peut-être pas la bonne clé pour ce site.", - "ko": "이 사이트의 올바른 키가 아닐 수도 있습니다." - }, - "u2f_error_timeout": { - "en": "That took a little too long, check to make sure your key is inserted right-side up.", - "es": "Eso llevó demasiado tiempo, verifique que su clave esté insertada boca arriba.", - "fr": "Cela a pris un peu trop de temps, vérifiez que votre clé est insérée dans le bons sens.", - "ko": "오랜 시간이 경과 되었으니 키가 오른쪽 위로 삽입되었는지 확인 하십시오." - }, - "webauthn_error_abort": { - "en": "It looks like you clicked cancel. Would you like us to try again?", - "es": "Parece que has hecho clic en cancelar. ¿Quieres que lo intentemos de nuevo?", - "fr": "Il semble que vous ayez cliqué sur annuler. Souhaitez-vous que nous essayions à nouveau ?", - "ko": "취소를 클릭하신 것 같습니다. 다시 시도해 보시겠어요?" - }, - "webauthn_error_not_allowed": { - "en": "Something about that didn't work. Please ensure that your security key is plugged in and that you touch it within 60 seconds when it blinks.", - "es": "Algo de eso no funcionó. Por favor, asegúrese de que su clave de seguridad está conectada y de que la toca en un plazo de 60 segundos cuando parpadea.", - "fr": "Quelque chose n'a pas fonctionné avec ça. Veuillez vous assurer que votre clé de sécurité est insérée et que vous la touchez dans les 60 secondes lorsqu'elle clignote.", - "ko": "문제가 해결되지 않았습니다. 보안 키가 연결되어 있고 깜박일 때 60초 이내에 터치했는지 확인하세요." - }, - "manager_icon": { - "en": "Recovery contact icon", - "es": "Icono de contacto de recuperación", - "fr": "Icône du contact de récupération", - "ko": "복구 연락처 아이콘" - }, - "manager_header": { - "en": "Ask Your Recovery Contact for Help", - "es": "Pida ayuda de contacto de recuperación", - "fr": "Demandez de l'aide à votre contact de récupération", - "ko": "복구 담당자에게 도움을 요청하십시오" - }, - "manager_info": { - "en": "You can send a 2-step verification code to your recovery contact (usually your supervisor). The email we have for your recovery contact is:

{managerEmail}

We've hidden most of the letters for your contact's protection.", - "es": "Puede enviar un código de verificación de dos pasos a su contacto de recuperación (normalmente su supervisor). La dirección de correo electrónico que tenemos para su contacto de recuperación es:

{managerEmail}

Ocultamos la mayoría de las letras para proteger a su contacto.", - "fr": "Vous pouvez envoyer un code de vérification en deux étapes à votre contact de récupération (en général votre superviseur). L'adresse électronique que nous avons pour votre contact de récupération est:

{managerEmail}

. Nous avons caché la plupart des lettres pour la protection de votre contact.", - "ko": "2단계 인증 코드를 복구 연락처(보통 상사)에게 보낼 수 있습니다. 복구 연락처에 대한 이메일은 다음과 같습니다.

{managerEmail}

연락처 보호를 위해 대부분의 편지를 숨겼습니다." - }, - "manager_sent": { - "en": "A temporary code was sent your recovery contact at {managerEmail}.", - "es": "Se envió un código temporal a su contacto de recuperación en {managerEmail}.", - "fr": "Un code temporaire a été envoyé à votre contact de récupération à l'adresse {managerEmail}.", - "ko": "{managerEmail} (으)로 복구 담당자에게 임시 코드를 보냈습니다." - }, - "manager_input": { - "en": "Enter code", - "es": "Introduzca el código", - "fr": "Entrer le code", - "ko": "코드 입력" - }, - "shield_icon": { - "en": "Shield icon", - "es": "Icono de escudo", - "fr": "Icône de bouclier", - "ko": "방패 아이콘" - }, - "required_header": { - "en": "Protect this account", - "es": "Protege esta cuenta", - "fr": "Protéger ce compte", - "ko": "이 계정 보호" - }, - "required_info": { - "en": "Your identity account requires additional security, you must set up 2-Step Verification at this time.", - "es": "Su cuenta de identidad requiere seguridad adicional, debe configurar la verificación en dos pasos en este momento.", - "fr": "Votre compte d'identité nécessite une sécurité supplémentaire, vous devez configurer la vérification en deux étapes en ce moment.", - "ko": "신원 계정에 추가 보안이 필요하므로 현재 2 단계 인증을 설정해야합니다." - }, - "running_out_header": { - "en": "Almost out of printable codes", - "es": "Casi sin códigos imprimibles", - "fr": "Codes imprimables presque épuisés", - "ko": "인쇄 ​가능한 ​코드​가 거의 남지 않았습니다" - }, - "running_out_info": { - "en": "You only have {numBackupCodesRemaining} more left.", - "es": "Solo tiene {numBackupCodesRemaining} más disponible.", - "fr": "Vous avez seulement {numBackupCodesRemaining} qui restent.", - "ko": "{numBackupCodesRemaining} 만 남았습니다." - }, - "no_more_codes_header": { - "en": "Last printable code used", - "es": "Último código imprimible utilizado", - "fr": "Dernier code imprimable utilisé", - "ko": "​​마지막 인쇄 가능 코드가​​ ​사용되었습니다." - }, - "new_codes_header": { - "en": "New printable codes", - "es": "Nuevos códigos imprimibles", - "fr": "Nouveaux codes imprimables", - "ko": "​​새로운 인쇄 가능 코드" - }, - "old_codes_gone": { - "en": "You may now discard any of your previous codes, they have been deleted.", - "es": "Ahora puede descartar cualquiera de sus códigos anteriores, se han eliminado.", - "fr": "Vous pouvez maintenant jeter tous vos codes précédents, ils ont été supprimés.", - "ko": "​​이제 이전 코드를 삭제해도 삭제 될 수 있습니다." - }, - "new_codes_info": { - "en": "Printable codes should be treated with the same level of attention as any password.", - "es": "Los códigos imprimibles deben tratarse con el mismo nivel de atención que cualquier contraseña.", - "fr": "Les codes imprimables doivent être traités avec le même niveau d'attention que les mots de passe.", - "ko": "​​인쇄 가능한 코드는 모든 비밀번호와 동일한주의 수준으로 처리되어야합니다." - }, - "new_codes_only_once": { - "en": "Each code may only be used once.", - "es": "Cada código solo puede usarse una vez.", - "fr": "Chaque code ne peut être utilisé qu'une seule fois.", - "ko": "​​각 코드는 한 번만 사용할 수 있습니다." - }, - "new_codes_failed": { - "en": "Something went wrong while creating new printable codes for you. We are sorry for the inconvenience, please check your configuration at the following address after continuing: ", - "es": "Algo salió mal al crear nuevos códigos imprimibles para usted. Disculpe las molestias, compruebe su configuración en la siguiente dirección después de continuar: ", - "fr": "Une erreur s'est produite lors de la création de nouveaux codes imprimables. Nous sommes désolés pour le dérangement. Veuillez vérifier votre configuration à l'adresse suivante après avoir continué: ", - "ko": "새로운 인쇄 가능한 코드를 만드는 동안 문제가 발생했습니다. 불편을 끼쳐 드려 죄송합니다. 계속 진행 한 후 다음 주소로 구성을 확인하십시오. " - }, - "new_codes_saved": { - "en": "I saved a personal copy of these for later use", - "es": "Guardé una copia personal de estos para uso posterior", - "fr": "J'ai sauvegardé une copie personnelle de ceux-ci pour une utilisation ultérieure", - "ko": "나는 나중에 사용하기 위해 이들의 개인 사본을 저장했다." - }, - "account": { - "en": "{idpName} identity account", - "es": "Cuenta de identidad de {idpName}", - "fr": "Compte d'identité {idpName}", - "ko": "{idpName} 신원 계정" - }, - "has_options_besides_codes": { - "en": "Thankfully you do have other 2-Step Verification options set up but you should create more Printable codes if you plan to need them in the future.", - "es": "Afortunadamente, tiene otras opciones de verificación en dos pasos configuradas, pero debe crear más códigos imprimibles si planea necesitarlos en el futuro.", - "fr": "Heureusement, vous avez d'autres options de vérification en deux étapes, mais vous devriez créer plus de codes imprimables si vous prévoyez en avoir besoin à l'avenir.", - "ko": "다른 2 단계 인증 옵션​은​ 설정​ 되었으나​ ​인쇄 가능 코드가 나중에 ​필요할 ​것으로 ​예상되면​ 코드를 ​더 ​만들어야​ ​합니다." - }, - "has_no_more_options": { - "en": "Since you do not have any other 2-Step Verification options set up at this time, you will need to get more Printable codes before another one is required.", - "es": "Como no tiene configuradas otras opciones de verificación en dos pasos en este momento, necesitará obtener más códigos imprimibles antes de que se requiera otro.", - "fr": "Comme aucune autre option de vérification en deux étapes n'est configurée pour l'instant, vous devez obtenir davantage de codes imprimables avant d'en avoir besoin d'un autre.", - "ko": "코드​가 요구되기 전에 인쇄 가능 코드를​ 더 가져와야​ ​합니다." - }, - "use_others": { - "en": "More options", - "es": "Mas opciones", - "fr": "Davantage d'options", - "ko": "추가 옵션" - }, - "use_u2f": { - "en": "Use my security key instead", - "es": "Use mi clave de seguridad en su lugar", - "fr": "Utiliser plutôt ma clé de sécurité", - "ko": "내 보안키 사용" - }, - "use_webauthn": { - "en": "Use my security key instead", - "es": "Use mi clave de seguridad en su lugar", - "fr": "Utiliser plutôt ma clé de sécurité", - "ko": "내 보안키 사용" - }, - "use_totp": { - "en": "Use my authenticator app instead", - "es": "Use la aplicación autenticación en su lugar", - "fr": "Utiliser plutôt mon application d'authentification", - "ko": "내 인증 앱 사용" - }, - "use_backupcode": { - "en": "Use a printable code instead", - "es": "Use un código imprimible en su lugar", - "fr": "Utiliser plutôt un code imprimable", - "ko": "인쇄 가능한 코드 사용" - }, - "use_help": { - "en": "I need help", - "es": "necesito ayuda", - "fr": "j'ai besoin d'aide", - "ko": "도움이 필요해." - }, - "use_manager": { - "en": "Use code from my recovery contact", - "es": "Usar código de mi contacto de recuperación", - "fr": "Utiliser le code de mon contact de récupération", - "ko": "복구 담당자의 코드 사용" - }, - "button_verify": { - "en": "Verify", - "es": "Verificar", - "fr": "Vérifier", - "ko": "검증" - }, - "button_later": { - "en": "Remind me later", - "es": "Recuérdame más tarde", - "fr": "Rappelez-moi plus tard", - "ko": "추후 알림" - }, - "button_enable": { - "en": "Enable now", - "es": "Habilite ahora", - "fr": "Activer maintenant", - "ko": "지금 사용" - }, - "button_set_up": { - "en": "Set up now", - "es": "Configurar ahora", - "fr": "Configurer maintenant", - "ko": "지금 설정" - }, - "button_try_again": { - "en": "Try again", - "es": "Inténtalo de nuevo", - "fr": "Essayer de nouveau", - "ko": "다시 시도" - }, - "button_get_more": { - "en": "Get more", - "es": "Obtenga más", - "fr": "Avoir plus", - "ko": "더​ ​​가져오기" - }, - "button_continue": { - "en": "Continue", - "es": "Continuar", - "fr": "Continuer", - "ko": "계속하다" - }, - "button_print": { - "en": "Print", - "es": "Imprimir", - "fr": "Imprimer", - "ko": "인쇄" - }, - "button_download": { - "en": "Download", - "es": "Descargar", - "fr": "Télécharger", - "ko": "다운로드" - }, - "button_copy": { - "en": "Copy", - "es": "Copiar", - "fr": "Copier", - "ko": "사본" - }, - "button_send": { - "en": "Send code", - "es": "Enviar código", - "fr": "Envoyer code", - "ko": "코드 보내기" - }, - "button_cancel": { - "en": "Cancel", - "es": "Cancelar", - "fr": "Annuler", - "ko": "취소" - }, - "button_copied": { - "en": "Copied ✓", - "es": "Copiado ✓", - "fr": "Copié ✓", - "ko": "복사 됨 ✓" - }, - "remember_this": { - "en": "Remember this browser for 30 days", - "es": "Recuerde esta navegador por 30 días", - "fr": "Se rappeler de ce navigatuer pour 30 jours", - "ko": "이 브라우저를 30일간 기억" - }, - "unsupported": { - "en": "Not supported in this browser", - "es": "No compatible con este navegador", - "fr": "Non pris en charge dans ce navigateur", - "ko": "이 브라우저에서는 지원되지 않습니다." - } -} diff --git a/modules/material/locales/en/LC_MESSAGES/material.po b/modules/material/locales/en/LC_MESSAGES/material.po index d388a34d..56c7384f 100644 --- a/modules/material/locales/en/LC_MESSAGES/material.po +++ b/modules/material/locales/en/LC_MESSAGES/material.po @@ -44,6 +44,183 @@ msgstr "Change" msgid "{footer:copyright}" msgstr "Unauthorized use of this site is prohibited and may be subjected to civil and criminal prosecution." +msgid "{mfa:title}" +msgstr "2-Step Verification" + +msgid "{mfa:header}" +msgstr "2-Step Verification" + +msgid "{mfa:backupcode_header}" +msgstr "Printable code" + +msgid "{mfa:backupcode_icon}" +msgstr "Printable code icon" + +msgid "{mfa:backupcode_reminder}" +msgstr "Each code can only be used once, so the code you enter this time will be used up and will not be available again." + +msgid "{mfa:backupcode_input}" +msgstr "Enter code" + +msgid "{mfa:totp_header}" +msgstr "Get a code from your authenticator app" + +msgid "{mfa:totp_icon}" +msgstr "Authenticator app icon" + +msgid "{mfa:totp_input}" +msgstr "Enter 6-digit code" + +msgid "{mfa:webauthn_header}" +msgstr "Security key" + +msgid "{mfa:u2f_icon}" +msgstr "USB key icon" + +msgid "{mfa:webauthn_icon}" +msgstr "USB key icon" + +msgid "{mfa:webauthn_instructions}" +msgstr "You may now insert your security key and press its button." + +msgid "{mfa:webauthn_unsupported}" +msgstr "Unsupported in your current browser. Please consider a more secure browser like Google Chrome." + +msgid "{mfa:webauthn_error_unknown}" +msgstr "Something went wrong with that request, unable to verify at this time." + +msgid "{mfa:webauthn_error_abort}" +msgstr "It looks like you clicked cancel. Would you like us to try again?" + +msgid "{mfa:webauthn_error_not_allowed}" +msgstr "Something about that didn't work. Please ensure that your security key is plugged in and that you touch it within 60 seconds when it blinks." + +msgid "{mfa:manager_icon}" +msgstr "Recovery contact icon" + +msgid "{mfa:manager_header}" +msgstr "Ask Your Recovery Contact for Help" + +msgid "{mfa:manager_info}" +msgstr "You can send a 2-step verification code to your recovery contact (usually your supervisor). The email we have for your recovery contact is:

%managerEmail%

We've hidden most of the letters for your contact's protection." + +msgid "{mfa:manager_sent}" +msgstr "A temporary code was sent your recovery contact at %managerEmail%." + +msgid "{mfa:manager_input}" +msgstr "Enter code" + +msgid "{mfa:shield_icon}" +msgstr "Shield icon" + +msgid "{mfa:required_header}" +msgstr "Protect this account" + +msgid "{mfa:required_info}" +msgstr "Your identity account requires additional security, you must set up 2-Step Verification at this time." + +msgid "{mfa:running_out_header}" +msgstr "Almost out of printable codes" + +msgid "{mfa:running_out_info}" +msgstr "You only have %numBackupCodesRemaining% more left." + +msgid "{mfa:no_more_codes_header}" +msgstr "Last printable code used" + +msgid "{mfa:new_codes_header}" +msgstr "New printable codes" + +msgid "{mfa:old_codes_gone}" +msgstr "You may now discard any of your previous codes, they have been deleted." + +msgid "{mfa:new_codes_info}" +msgstr "Printable codes should be treated with the same level of attention as any password." + +msgid "{mfa:new_codes_only_once}" +msgstr "Each code may only be used once." + +msgid "{mfa:new_codes_failed}" +msgstr "Something went wrong while creating new printable codes for you. We are sorry for the inconvenience, please check your configuration at the following address after continuing: " + +msgid "{mfa:new_codes_saved}" +msgstr "I saved a personal copy of these for later use" + +msgid "{mfa:account}" +msgstr "%idpName% identity account" + +msgid "{mfa:has_options_besides_codes}" +msgstr "Thankfully you do have other 2-Step Verification options set up but you should create more Printable codes if you plan to need them in the future." + +msgid "{mfa:has_no_more_options}" +msgstr "Since you do not have any other 2-Step Verification options set up at this time, you will need to get more Printable codes before another one is required." + +msgid "{mfa:use_others}" +msgstr "More options" + +msgid "{mfa:use_u2f}" +msgstr "Use my security key instead" + +msgid "{mfa:use_webauthn}" +msgstr "Use my security key instead" + +msgid "{mfa:use_totp}" +msgstr "Use my authenticator app instead" + +msgid "{mfa:use_backupcode}" +msgstr "Use a printable code instead" + +msgid "{mfa:use_help}" +msgstr "I need help" + +msgid "{mfa:use_manager}" +msgstr "Use code from my recovery contact" + +msgid "{mfa:button_verify}" +msgstr "Verify" + +msgid "{mfa:button_later}" +msgstr "Remind me later" + +msgid "{mfa:button_enable}" +msgstr "Enable now" + +msgid "{mfa:button_set_up}" +msgstr "Set up now" + +msgid "{mfa:button_try_again}" +msgstr "Try again" + +msgid "{mfa:button_get_more}" +msgstr "Get more" + +msgid "{mfa:button_continue}" +msgstr "Continue" + +msgid "{mfa:button_print}" +msgstr "Print" + +msgid "{mfa:button_download}" +msgstr "Download" + +msgid "{mfa:button_copy}" +msgstr "Copy" + +msgid "{mfa:button_send}" +msgstr "Send code" + +msgid "{mfa:button_cancel}" +msgstr "Cancel" + +msgid "{mfa:button_copied}" +msgstr "Copied ✓" + +msgid "{mfa:remember_this}" +msgstr "Remember this browser for 30 days" + +msgid "{mfa:unsupported}" +msgstr "Not supported in this browser" + msgid "{selectidp-links:title}" msgstr "Choose an identity account" diff --git a/modules/material/locales/es/LC_MESSAGES/material.po b/modules/material/locales/es/LC_MESSAGES/material.po index fe353d52..493bdc8c 100644 --- a/modules/material/locales/es/LC_MESSAGES/material.po +++ b/modules/material/locales/es/LC_MESSAGES/material.po @@ -9,7 +9,7 @@ msgid "{about2expire:expiring_in_a_day}" msgstr "Su contraseña caducará en un día." msgid "{about2expire:expiring_soon}" -msgstr "Su contraseña caducará en {daysLeft} días." +msgstr "Su contraseña caducará en %daysLeft% días." msgid "{about2expire:change_now}" msgstr "¿Quieres cambiarlo ahora?" @@ -44,6 +44,183 @@ msgstr "Cambiar" msgid "{footer:copyright}" msgstr "El uso no autorizado de este sitio está prohibido y puede ser sometido a procesamiento civil y penal." +msgid "{mfa:title}" +msgstr "Verificación en 2 pasos" + +msgid "{mfa:header}" +msgstr "Verificación en 2 pasos" + +msgid "{mfa:backupcode_header}" +msgstr "código imprimible" + +msgid "{mfa:backupcode_icon}" +msgstr "icono de código imprimible" + +msgid "{mfa:backupcode_reminder}" +msgstr "Cada código solo se puede usar una vez, por lo que el código que ingrese esta vez se agotará y no estará disponible nuevamente." + +msgid "{mfa:backupcode_input}" +msgstr "Introduzca el código" + +msgid "{mfa:totp_header}" +msgstr "Obtenga un código de su aplicación de autenticación" + +msgid "{mfa:totp_icon}" +msgstr "Icono de aplicación de teléfono inteligente" + +msgid "{mfa:totp_input}" +msgstr "Ingrese el código de 6 dígitos" + +msgid "{mfa:webauthn_header}" +msgstr "Clave de seguridad" + +msgid "{mfa:u2f_icon}" +msgstr "Icono de la llave USB" + +msgid "{mfa:webauthn_icon}" +msgstr "Icono de la llave USB" + +msgid "{mfa:webauthn_instructions}" +msgstr "Ahora puede insertar su clave de seguridad y presionar su botón." + +msgid "{mfa:webauthn_unsupported}" +msgstr "No compatible en su navegador actual. Considere un navegador más seguro como Google Chrome." + +msgid "{mfa:webauthn_error_unknown}" +msgstr "Algo salió mal con esa solicitud, no se pudo verificar en este momento." + +msgid "{mfa:webauthn_error_abort}" +msgstr "Parece que has hecho clic en cancelar. ¿Quieres que lo intentemos de nuevo?" + +msgid "{mfa:webauthn_error_not_allowed}" +msgstr "Algo de eso no funcionó. Por favor, asegúrese de que su clave de seguridad está conectada y de que la toca en un plazo de 60 segundos cuando parpadea." + +msgid "{mfa:manager_icon}" +msgstr "Icono de contacto de recuperación" + +msgid "{mfa:manager_header}" +msgstr "Pida ayuda de contacto de recuperación" + +msgid "{mfa:manager_info}" +msgstr "Puede enviar un código de verificación de dos pasos a su contacto de recuperación (normalmente su supervisor). La dirección de correo electrónico que tenemos para su contacto de recuperación es:

%managerEmail%

Ocultamos la mayoría de las letras para proteger a su contacto." + +msgid "{mfa:manager_sent}" +msgstr "Se envió un código temporal a su contacto de recuperación en %managerEmail%." + +msgid "{mfa:manager_input}" +msgstr "Introduzca el código" + +msgid "{mfa:shield_icon}" +msgstr "Icono de escudo" + +msgid "{mfa:required_header}" +msgstr "Protege esta cuenta" + +msgid "{mfa:required_info}" +msgstr "Su cuenta de identidad requiere seguridad adicional, debe configurar la verificación en dos pasos en este momento." + +msgid "{mfa:running_out_header}" +msgstr "Casi sin códigos imprimibles" + +msgid "{mfa:running_out_info}" +msgstr "Solo tiene %numBackupCodesRemaining% más disponible." + +msgid "{mfa:no_more_codes_header}" +msgstr "Último código imprimible utilizado" + +msgid "{mfa:new_codes_header}" +msgstr "Nuevos códigos imprimibles" + +msgid "{mfa:old_codes_gone}" +msgstr "Ahora puede descartar cualquiera de sus códigos anteriores, se han eliminado." + +msgid "{mfa:new_codes_info}" +msgstr "Los códigos imprimibles deben tratarse con el mismo nivel de atención que cualquier contraseña." + +msgid "{mfa:new_codes_only_once}" +msgstr "Cada código solo puede usarse una vez." + +msgid "{mfa:new_codes_failed}" +msgstr "Algo salió mal al crear nuevos códigos imprimibles para usted. Disculpe las molestias, compruebe su configuración en la siguiente dirección después de continuar: " + +msgid "{mfa:new_codes_saved}" +msgstr "Guardé una copia personal de estos para uso posterior" + +msgid "{mfa:account}" +msgstr "Cuenta de identidad de %idpName%" + +msgid "{mfa:has_options_besides_codes}" +msgstr "Afortunadamente, tiene otras opciones de verificación en dos pasos configuradas, pero debe crear más códigos imprimibles si planea necesitarlos en el futuro." + +msgid "{mfa:has_no_more_options}" +msgstr "Como no tiene configuradas otras opciones de verificación en dos pasos en este momento, necesitará obtener más códigos imprimibles antes de que se requiera otro." + +msgid "{mfa:use_others}" +msgstr "Mas opciones" + +msgid "{mfa:use_u2f}" +msgstr "Use mi clave de seguridad en su lugar" + +msgid "{mfa:use_webauthn}" +msgstr "Use mi clave de seguridad en su lugar" + +msgid "{mfa:use_totp}" +msgstr "Use la aplicación autenticación en su lugar" + +msgid "{mfa:use_backupcode}" +msgstr "Use un código imprimible en su lugar" + +msgid "{mfa:use_help}" +msgstr "necesito ayuda" + +msgid "{mfa:use_manager}" +msgstr "Usar código de mi contacto de recuperación" + +msgid "{mfa:button_verify}" +msgstr "Verificar" + +msgid "{mfa:button_later}" +msgstr "Recuérdame más tarde" + +msgid "{mfa:button_enable}" +msgstr "Habilite ahora" + +msgid "{mfa:button_set_up}" +msgstr "Configurar ahora" + +msgid "{mfa:button_try_again}" +msgstr "Inténtalo de nuevo" + +msgid "{mfa:button_get_more}" +msgstr "Obtenga más" + +msgid "{mfa:button_continue}" +msgstr "Continuar" + +msgid "{mfa:button_print}" +msgstr "Imprimir" + +msgid "{mfa:button_download}" +msgstr "Descargar" + +msgid "{mfa:button_copy}" +msgstr "Copiar" + +msgid "{mfa:button_send}" +msgstr "Enviar código" + +msgid "{mfa:button_cancel}" +msgstr "Cancelar" + +msgid "{mfa:button_copied}" +msgstr "Copiado ✓" + +msgid "{mfa:remember_this}" +msgstr "Recuerde esta navegador por 30 días" + +msgid "{mfa:unsupported}" +msgstr "No compatible con este navegador" + msgid "{selectidp-links:title}" msgstr "Elige una cuenta de identidad" diff --git a/modules/material/locales/fr/LC_MESSAGES/material.po b/modules/material/locales/fr/LC_MESSAGES/material.po index 5a1d423d..3534d3f0 100644 --- a/modules/material/locales/fr/LC_MESSAGES/material.po +++ b/modules/material/locales/fr/LC_MESSAGES/material.po @@ -9,7 +9,7 @@ msgid "{about2expire:expiring_in_a_day}" msgstr "Votre mot de passe expirera en un jour." msgid "{about2expire:expiring_soon}" -msgstr "Votre mot de passe expirera en {daysLeft} jours." +msgstr "Votre mot de passe expirera en %daysLeft% jours." msgid "{about2expire:change_now}" msgstr "Voulez-vous le changer maintenant?" @@ -44,6 +44,183 @@ msgstr "Changer" msgid "{footer:copyright}" msgstr "L'utilisation non autorisée de ce site est interdite et peut faire l'objet de poursuites civiles et pénales." +msgid "{mfa:title}" +msgstr "Vérification en deux étapes" + +msgid "{mfa:header}" +msgstr "Vérification en deux étapes" + +msgid "{mfa:backupcode_header}" +msgstr "code imprimable" + +msgid "{mfa:backupcode_icon}" +msgstr "icône de code imprimable" + +msgid "{mfa:backupcode_reminder}" +msgstr "Chaque code ne peut être utilisé qu'une seule fois, de sorte que le code que vous entrez cette fois sera épuisé et ne sera plus disponible." + +msgid "{mfa:backupcode_input}" +msgstr "Entrer le code" + +msgid "{mfa:totp_header}" +msgstr "Obtenez un code depuis votre application d'authentification" + +msgid "{mfa:totp_icon}" +msgstr "Icône de l'application Smartphone" + +msgid "{mfa:totp_input}" +msgstr "Entrer le code à 6 chiffres" + +msgid "{mfa:webauthn_header}" +msgstr "Clé de sécurité" + +msgid "{mfa:u2f_icon}" +msgstr "Icône de clé USB" + +msgid "{mfa:webauthn_icon}" +msgstr "Icône de clé USB" + +msgid "{mfa:webauthn_instructions}" +msgstr "Vous pouvez maintenant insérer votre clé de sécurité et appuyer sur le bouton." + +msgid "{mfa:webauthn_unsupported}" +msgstr "Non compatible avec votre navigateur actuel. Veuillez considérer un navigateur plus sûr comme Google Chrome." + +msgid "{mfa:webauthn_error_unknown}" +msgstr "Quelque chose s'est mal passé avec cette demande, impossible de vérifier pour le moment." + +msgid "{mfa:webauthn_error_abort}" +msgstr "Il semble que vous ayez cliqué sur annuler. Souhaitez-vous que nous essayions à nouveau ?" + +msgid "{mfa:webauthn_error_not_allowed}" +msgstr "Quelque chose n'a pas fonctionné avec ça. Veuillez vous assurer que votre clé de sécurité est insérée et que vous la touchez dans les 60 secondes lorsqu'elle clignote." + +msgid "{mfa:manager_icon}" +msgstr "Icône du contact de récupération" + +msgid "{mfa:manager_header}" +msgstr "Demandez de l'aide à votre contact de récupération" + +msgid "{mfa:manager_info}" +msgstr "Vous pouvez envoyer un code de vérification en deux étapes à votre contact de récupération (en général votre superviseur). L'adresse électronique que nous avons pour votre contact de récupération est:

%managerEmail%

. Nous avons caché la plupart des lettres pour la protection de votre contact." + +msgid "{mfa:manager_sent}" +msgstr "Un code temporaire a été envoyé à votre contact de récupération à l'adresse %managerEmail%." + +msgid "{mfa:manager_input}" +msgstr "Entrer le code" + +msgid "{mfa:shield_icon}" +msgstr "Icône de bouclier" + +msgid "{mfa:required_header}" +msgstr "Protéger ce compte" + +msgid "{mfa:required_info}" +msgstr "Votre compte d'identité nécessite une sécurité supplémentaire, vous devez configurer la vérification en deux étapes en ce moment." + +msgid "{mfa:running_out_header}" +msgstr "Codes imprimables presque épuisés" + +msgid "{mfa:running_out_info}" +msgstr "Vous avez seulement %numBackupCodesRemaining% qui restent." + +msgid "{mfa:no_more_codes_header}" +msgstr "Dernier code imprimable utilisé" + +msgid "{mfa:new_codes_header}" +msgstr "Nouveaux codes imprimables" + +msgid "{mfa:old_codes_gone}" +msgstr "Vous pouvez maintenant jeter tous vos codes précédents, ils ont été supprimés." + +msgid "{mfa:new_codes_info}" +msgstr "Les codes imprimables doivent être traités avec le même niveau d'attention que les mots de passe." + +msgid "{mfa:new_codes_only_once}" +msgstr "Chaque code ne peut être utilisé qu'une seule fois." + +msgid "{mfa:new_codes_failed}" +msgstr "Une erreur s'est produite lors de la création de nouveaux codes imprimables. Nous sommes désolés pour le dérangement. Veuillez vérifier votre configuration à l'adresse suivante après avoir continué: " + +msgid "{mfa:new_codes_saved}" +msgstr "J'ai sauvegardé une copie personnelle de ceux-ci pour une utilisation ultérieure" + +msgid "{mfa:account}" +msgstr "Compte d'identité %idpName%" + +msgid "{mfa:has_options_besides_codes}" +msgstr "Heureusement, vous avez d'autres options de vérification en deux étapes, mais vous devriez créer plus de codes imprimables si vous prévoyez en avoir besoin à l'avenir." + +msgid "{mfa:has_no_more_options}" +msgstr "Comme aucune autre option de vérification en deux étapes n'est configurée pour l'instant, vous devez obtenir davantage de codes imprimables avant d'en avoir besoin d'un autre." + +msgid "{mfa:use_others}" +msgstr "Davantage d'options" + +msgid "{mfa:use_u2f}" +msgstr "Utiliser plutôt ma clé de sécurité" + +msgid "{mfa:use_webauthn}" +msgstr "Utiliser plutôt ma clé de sécurité" + +msgid "{mfa:use_totp}" +msgstr "Utiliser plutôt mon application d'authentification" + +msgid "{mfa:use_backupcode}" +msgstr "Utiliser plutôt un code imprimable" + +msgid "{mfa:use_help}" +msgstr "j'ai besoin d'aide" + +msgid "{mfa:use_manager}" +msgstr "Utiliser le code de mon contact de récupération" + +msgid "{mfa:button_verify}" +msgstr "Vérifier" + +msgid "{mfa:button_later}" +msgstr "Rappelez-moi plus tard" + +msgid "{mfa:button_enable}" +msgstr "Activer maintenant" + +msgid "{mfa:button_set_up}" +msgstr "Configurer maintenant" + +msgid "{mfa:button_try_again}" +msgstr "Essayer de nouveau" + +msgid "{mfa:button_get_more}" +msgstr "Avoir plus" + +msgid "{mfa:button_continue}" +msgstr "Continuer" + +msgid "{mfa:button_print}" +msgstr "Imprimer" + +msgid "{mfa:button_download}" +msgstr "Télécharger" + +msgid "{mfa:button_copy}" +msgstr "Copier" + +msgid "{mfa:button_send}" +msgstr "Envoyer code" + +msgid "{mfa:button_cancel}" +msgstr "Annuler" + +msgid "{mfa:button_copied}" +msgstr "Copié ✓" + +msgid "{mfa:remember_this}" +msgstr "Se rappeler de ce navigatuer pour 30 jours" + +msgid "{mfa:unsupported}" +msgstr "Non pris en charge dans ce navigateur" + msgid "{selectidp-links:title}" msgstr "Choisissez un compte d'identité" diff --git a/modules/material/locales/ko/LC_MESSAGES/material.po b/modules/material/locales/ko/LC_MESSAGES/material.po index 0405ac2f..5f357566 100644 --- a/modules/material/locales/ko/LC_MESSAGES/material.po +++ b/modules/material/locales/ko/LC_MESSAGES/material.po @@ -9,7 +9,7 @@ msgid "{about2expire:expiring_in_a_day}" msgstr "암호는 하루 만료됩니다." msgid "{about2expire:expiring_soon}" -msgstr "비밀번호는 {daysLeft} 일 후에 만료됩니다." +msgstr "비밀번호는 %daysLeft% 일 후에 만료됩니다." msgid "{about2expire:change_now}" msgstr "지금 변경 하시겠습니까?" @@ -44,6 +44,183 @@ msgstr "바꾸다" msgid "{footer:copyright}" msgstr "이 사이트의 무단 사용은 금지되어 있으며 민사 및 형사 고발의 대상이 될 수 있습니다." +msgid "{mfa:title}" +msgstr "2 단계 인증" + +msgid "{mfa:header}" +msgstr "2 단계 인증" + +msgid "{mfa:backupcode_header}" +msgstr "인쇄 가능한 코드" + +msgid "{mfa:backupcode_icon}" +msgstr "인쇄 가능한 코드 아이콘" + +msgid "{mfa:backupcode_reminder}" +msgstr "각 코드는 한번만 사용할 수 있으므로 이번에 입력한 코드는 소멸되어 다시 사용할 수 없습니다." + +msgid "{mfa:backupcode_input}" +msgstr "코드 입력" + +msgid "{mfa:totp_header}" +msgstr "인증 앱에서 코드 받기" + +msgid "{mfa:totp_icon}" +msgstr "인증 응용 프로그램 아이콘" + +msgid "{mfa:totp_input}" +msgstr "6 자리 코드 입력" + +msgid "{mfa:webauthn_header}" +msgstr "보안키" + +msgid "{mfa:u2f_icon}" +msgstr "USB 키 아이콘" + +msgid "{mfa:webauthn_icon}" +msgstr "USB 키 아이콘" + +msgid "{mfa:webauthn_instructions}" +msgstr "이제 보안 키를 삽입하고 단추를 누를 수 있습니다." + +msgid "{mfa:webauthn_unsupported}" +msgstr "현재 브라우저에서 지원되지 않습니다. Chrome과 같은 보다 안전한 브라우저를 고려하십시오." + +msgid "{mfa:webauthn_error_unknown}" +msgstr "요청에 문제가 발생하여 지금은 확인할 수 없습니다." + +msgid "{mfa:webauthn_error_abort}" +msgstr "취소를 클릭하신 것 같습니다. 다시 시도해 보시겠어요?" + +msgid "{mfa:webauthn_error_not_allowed}" +msgstr "문제가 해결되지 않았습니다. 보안 키가 연결되어 있고 깜박일 때 60초 이내에 터치했는지 확인하세요." + +msgid "{mfa:manager_icon}" +msgstr "복구 연락처 아이콘" + +msgid "{mfa:manager_header}" +msgstr "복구 담당자에게 도움을 요청하십시오" + +msgid "{mfa:manager_info}" +msgstr "2단계 인증 코드를 복구 연락처(보통 상사)에게 보낼 수 있습니다. 복구 연락처에 대한 이메일은 다음과 같습니다.

%managerEmail%

연락처 보호를 위해 대부분의 편지를 숨겼습니다." + +msgid "{mfa:manager_sent}" +msgstr "%managerEmail% (으)로 복구 담당자에게 임시 코드를 보냈습니다." + +msgid "{mfa:manager_input}" +msgstr "코드 입력" + +msgid "{mfa:shield_icon}" +msgstr "방패 아이콘" + +msgid "{mfa:required_header}" +msgstr "이 계정 보호" + +msgid "{mfa:required_info}" +msgstr "신원 계정에 추가 보안이 필요하므로 현재 2 단계 인증을 설정해야합니다." + +msgid "{mfa:running_out_header}" +msgstr "인쇄 ​가능한 ​코드​가 거의 남지 않았습니다" + +msgid "{mfa:running_out_info}" +msgstr "%numBackupCodesRemaining% 만 남았습니다." + +msgid "{mfa:no_more_codes_header}" +msgstr "​​마지막 인쇄 가능 코드가​​ ​사용되었습니다." + +msgid "{mfa:new_codes_header}" +msgstr "​​새로운 인쇄 가능 코드" + +msgid "{mfa:old_codes_gone}" +msgstr "​​이제 이전 코드를 삭제해도 삭제 될 수 있습니다." + +msgid "{mfa:new_codes_info}" +msgstr "​​인쇄 가능한 코드는 모든 비밀번호와 동일한주의 수준으로 처리되어야합니다." + +msgid "{mfa:new_codes_only_once}" +msgstr "​​각 코드는 한 번만 사용할 수 있습니다." + +msgid "{mfa:new_codes_failed}" +msgstr "새로운 인쇄 가능한 코드를 만드는 동안 문제가 발생했습니다. 불편을 끼쳐 드려 죄송합니다. 계속 진행 한 후 다음 주소로 구성을 확인하십시오. " + +msgid "{mfa:new_codes_saved}" +msgstr "나는 나중에 사용하기 위해 이들의 개인 사본을 저장했다." + +msgid "{mfa:account}" +msgstr "%idpName% 신원 계정" + +msgid "{mfa:has_options_besides_codes}" +msgstr "다른 2 단계 인증 옵션​은​ 설정​ 되었으나​ ​인쇄 가능 코드가 나중에 ​필요할 ​것으로 ​예상되면​ 코드를 ​더 ​만들어야​ ​합니다." + +msgid "{mfa:has_no_more_options}" +msgstr "코드​가 요구되기 전에 인쇄 가능 코드를​ 더 가져와야​ ​합니다." + +msgid "{mfa:use_others}" +msgstr "추가 옵션" + +msgid "{mfa:use_u2f}" +msgstr "내 보안키 사용" + +msgid "{mfa:use_webauthn}" +msgstr "내 보안키 사용" + +msgid "{mfa:use_totp}" +msgstr "내 인증 앱 사용" + +msgid "{mfa:use_backupcode}" +msgstr "인쇄 가능한 코드 사용" + +msgid "{mfa:use_help}" +msgstr "도움이 필요해." + +msgid "{mfa:use_manager}" +msgstr "복구 담당자의 코드 사용" + +msgid "{mfa:button_verify}" +msgstr "검증" + +msgid "{mfa:button_later}" +msgstr "추후 알림" + +msgid "{mfa:button_enable}" +msgstr "지금 사용" + +msgid "{mfa:button_set_up}" +msgstr "지금 설정" + +msgid "{mfa:button_try_again}" +msgstr "다시 시도" + +msgid "{mfa:button_get_more}" +msgstr "더​ ​​가져오기" + +msgid "{mfa:button_continue}" +msgstr "계속하다" + +msgid "{mfa:button_print}" +msgstr "인쇄" + +msgid "{mfa:button_download}" +msgstr "다운로드" + +msgid "{mfa:button_copy}" +msgstr "사본" + +msgid "{mfa:button_send}" +msgstr "코드 보내기" + +msgid "{mfa:button_cancel}" +msgstr "취소" + +msgid "{mfa:button_copied}" +msgstr "복사 됨 ✓" + +msgid "{mfa:remember_this}" +msgstr "이 브라우저를 30일간 기억" + +msgid "{mfa:unsupported}" +msgstr "이 브라우저에서는 지원되지 않습니다." + msgid "{selectidp-links:title}" msgstr "ID 계정 선택" diff --git a/modules/material/themes/material/default/other_mfas.twig b/modules/material/themes/material/default/other_mfas.twig new file mode 100644 index 00000000..f333cddf --- /dev/null +++ b/modules/material/themes/material/default/other_mfas.twig @@ -0,0 +1,27 @@ +{% if otherOptions|length > 0 %} +
+ {# used type=button to avoid form submission on click since this is just used to display the ul #} + + +
+{% endif %} diff --git a/modules/material/themes/material/mfa/must-set-up-mfa.php b/modules/material/themes/material/mfa/must-set-up-mfa.php deleted file mode 100644 index 8ae5c34f..00000000 --- a/modules/material/themes/material/mfa/must-set-up-mfa.php +++ /dev/null @@ -1,48 +0,0 @@ - - - - <?= $this->t('{material:mfa:title}') ?> - - - - -
-
-
- - t('{material:mfa:header}') ?> - -
-
-
-
-
-
- <?= $this->t('{material:mfa:shield_icon}') ?> -
- -
-

- t('{material:mfa:required_header}') ?> -

-
- -
-

- t('{material:mfa:required_info}') ?> -

-
- -
- - - -
-
-
-
-
- - diff --git a/modules/material/themes/material/mfa/must-set-up-mfa.twig b/modules/material/themes/material/mfa/must-set-up-mfa.twig new file mode 100644 index 00000000..a8be1d5f --- /dev/null +++ b/modules/material/themes/material/mfa/must-set-up-mfa.twig @@ -0,0 +1,48 @@ + + + + {{ '{mfa:title}|trans' }} + + {% include 'header.twig' %} + + +
+
+
+ + {{ '{mfa:header}'|trans }} + +
+
+
+
+
+
+ {{ '{mfa:shield_icon}'|trans }} +
+ +
+

+ {{ '{mfa:required_header}'|trans }} +

+
+ +
+

+ {{ '{mfa:required_info}'|trans }} +

+
+ +
+ + + +
+
+
+
+
+ + diff --git a/modules/material/themes/material/mfa/other_mfas.php b/modules/material/themes/material/mfa/other_mfas.php deleted file mode 100644 index 7d466a59..00000000 --- a/modules/material/themes/material/mfa/other_mfas.php +++ /dev/null @@ -1,34 +0,0 @@ -data['otherOptions']; -if (count($otherOptions) > 0) { -?> -
- - - -
- diff --git a/modules/material/themes/material/mfa/prompt-for-mfa-backupcode.php b/modules/material/themes/material/mfa/prompt-for-mfa-backupcode.php deleted file mode 100644 index 7520467a..00000000 --- a/modules/material/themes/material/mfa/prompt-for-mfa-backupcode.php +++ /dev/null @@ -1,92 +0,0 @@ - - - - <?= $this->t('{material:mfa:title}') ?> - - - - -
-
-
- - t('{material:mfa:header}') ?> - -
-
-
-
-
-
- <?= $this->t('{material:mfa:backupcode_icon}') ?> -
- -
-

- t('{material:mfa:backupcode_header}') ?> -

-
- -
-

- t('{material:mfa:backupcode_reminder}') ?> -

-
- -
-
- - -
-
- - data['errorMessage']; - - if (! empty($message)) { - ?> -
-

- error - - - - -

-
- - - - -
- - -
- - -
- -
- -
-
-
-
- - diff --git a/modules/material/themes/material/mfa/prompt-for-mfa-backupcode.twig b/modules/material/themes/material/mfa/prompt-for-mfa-backupcode.twig new file mode 100644 index 00000000..a43b1783 --- /dev/null +++ b/modules/material/themes/material/mfa/prompt-for-mfa-backupcode.twig @@ -0,0 +1,83 @@ + + + + {{ '{mfa:title}'|trans }} + + {% include 'header.twig' %} + + +
+
+
+ + {{ '{mfa:header}'|trans }} + +
+
+
+
+
+
+ {{ '{mfa:backupcode_icon}'|trans }} +
+ +
+

+ {{ '{mfa:backupcode_header}'|trans }} +

+
+ +
+

+ {{ '{mfa:backupcode_reminder}'|trans }} +

+
+ +
+
+ + +
+
+ + {% if not errorMessage is empty %} +
+

+ error + + + {{ errorMessage|e }} + +

+
+ + + {% endif %} + +
+ + +
+ + {% include 'other_mfas.twig' %} +
+ +
+ +
+
+
+
+ + diff --git a/modules/material/themes/material/mfa/prompt-for-mfa-manager.php b/modules/material/themes/material/mfa/prompt-for-mfa-manager.php deleted file mode 100644 index e9899947..00000000 --- a/modules/material/themes/material/mfa/prompt-for-mfa-manager.php +++ /dev/null @@ -1,89 +0,0 @@ - - - - <?= $this->t('{material:mfa:title}') ?> - - - - -
-
-
- - t('{material:mfa:header}') ?> - -
-
-
-
-
-
- <?= $this->t('{material:mfa:manager_icon}') ?> -
- -
-

- t('{material:mfa:manager_header}') ?> -

-
- -
-

- t('{material:mfa:manager_sent}', ['{managerEmail}' => $this->data['managerEmail']]) ?> -

-
- -
-
- - -
-
- - data['errorMessage']; - - if (! empty($message)) { - ?> -
-

- error - - - - -

-
- - - - -
- - -
- - -
- -
- -
-
-
-
- - diff --git a/modules/material/themes/material/mfa/prompt-for-mfa-manager.twig b/modules/material/themes/material/mfa/prompt-for-mfa-manager.twig new file mode 100644 index 00000000..aa464f7e --- /dev/null +++ b/modules/material/themes/material/mfa/prompt-for-mfa-manager.twig @@ -0,0 +1,83 @@ + + + + {{ '{mfa:title}'|trans }} + + {% include 'header.twig' %} + + +
+
+
+ + {{ '{mfa:header}'|trans }} + +
+
+
+
+
+
+ {{ '{mfa:manager_icon}'|trans }} +
+ +
+

+ {{ '{mfa:manager_header}'|trans }} +

+
+ +
+

+ {{ '{mfa:manager_sent}'|trans({'%managerEmail%': managerEmail}) }} +

+
+ +
+
+ + +
+
+ + {% if not errorMessage is empty %} +
+

+ error + + + {{ errorMessage|e }} + +

+
+ + + {% endif %} + +
+ + +
+ + {% include 'other_mfas.twig' %} +
+ +
+ +
+
+
+
+ + diff --git a/modules/material/themes/material/mfa/prompt-for-mfa-totp.php b/modules/material/themes/material/mfa/prompt-for-mfa-totp.php deleted file mode 100644 index b0d10248..00000000 --- a/modules/material/themes/material/mfa/prompt-for-mfa-totp.php +++ /dev/null @@ -1,93 +0,0 @@ - - - - <?= $this->t('{material:mfa:title}') ?> - - - - -
-
-
- - t('{material:mfa:header}') ?> - -
-
-
-
-
-
- <?= $this->t('{material:mfa:totp_icon}') ?> -
- -
-

- t('{material:mfa:totp_header}') ?> -

-
- -
- configuration->getValue('idp_display_name', $this->configuration->getValue('idp_name', '—'))); - echo $this->t('{material:mfa:account}', ['{idpName}' => $idpName]); - ?> -
- -
-
- - -
-
- - data['errorMessage']; - - if (! empty($message)) { - ?> -
-

- error - - - - -

-
- - - - -
- - -
- - -
- -
- -
-
-
-
- - diff --git a/modules/material/themes/material/mfa/prompt-for-mfa-totp.twig b/modules/material/themes/material/mfa/prompt-for-mfa-totp.twig new file mode 100644 index 00000000..7fd9a92e --- /dev/null +++ b/modules/material/themes/material/mfa/prompt-for-mfa-totp.twig @@ -0,0 +1,81 @@ + + + + {{ '{mfa:title}'|trans }} + + {% include 'header.twig' %} + + +
+
+
+ + {{ '{mfa:header}'|trans }} + +
+
+
+
+
+
+ {{ '{mfa:totp_icon}'|trans }} +
+ +
+

+ {{ '{mfa:totp_header}'|trans }} +

+
+ +
+ {{ '{mfa:account}'|trans({'%idpName%': idpName}) }} +
+ +
+
+ + +
+
+ + {% if not errorMessage is empty %} +
+

+ error + + + {{ errorMessage|e }} + +

+
+ + + {% endif %} + +
+ + +
+ + {% include 'other_mfas.twig' %} +
+ +
+ +
+
+
+
+ + diff --git a/modules/material/themes/material/mfa/prompt-for-mfa-webauthn.php b/modules/material/themes/material/mfa/prompt-for-mfa-webauthn.php deleted file mode 100644 index 02fa6ff4..00000000 --- a/modules/material/themes/material/mfa/prompt-for-mfa-webauthn.php +++ /dev/null @@ -1,153 +0,0 @@ - - - - <?= $this->t('{material:mfa:title}') ?> - - - - - - - - -data['supportsWebAuthn']; ?> - - -
-
-
- - t('{material:mfa:header}') ?> - -
-
- -
-
-
-
- <?= $this->t('{material:mfa:webauthn_icon}') ?> -
- -
-

- t('{material:mfa:webauthn_header}') ?> -

-
- - -
-

- t('{material:mfa:webauthn_instructions}') ?> -

-
- -
-

- t('{material:mfa:webauthn_unsupported}') ?> -

-
- - - data['errorMessage']; - if (! empty($message)) { - ?> - - -
-

- error - - - - -

-
- -
- - - - -
- - -
- -
- -
-
-
-
- - diff --git a/modules/material/themes/material/mfa/prompt-for-mfa-webauthn.twig b/modules/material/themes/material/mfa/prompt-for-mfa-webauthn.twig new file mode 100644 index 00000000..327d5ba1 --- /dev/null +++ b/modules/material/themes/material/mfa/prompt-for-mfa-webauthn.twig @@ -0,0 +1,148 @@ + + + + {{ '{mfa:title}'|trans }} + + {% include 'header.twig' %} + + + + + + + +
+
+
+ + {{ '{mfa:header}'|trans }} + +
+
+ +
+
+
+
+ {{ '{mfa:webauthn_icon}'|trans }} +
+ +
+

+ {{ '{mfa:webauthn_header}'|trans }} +

+
+ + {% if supportsWebAuthn %} +
+

+ {{ '{mfa:webauthn_instructions}'|trans }} +

+
+ {% else %} +
+

+ {{ '{mfa:webauthn_unsupported}'|trans|raw }} +

+
+ {% endif %} + + {% if not errorMessage is empty %} + + {% endif %} +
+

+ error + + + {{ errorMessage|e }} + +

+
+ +
+ + + + +
+ + {% include 'other_mfas.twig' %} +
+ +
+ +
+
+
+
+ + diff --git a/modules/mfa/locales/en/LC_MESSAGES/.gitkeep b/modules/mfa/locales/en/LC_MESSAGES/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/modules/mfa/locales/es/LC_MESSAGES/.gitkeep b/modules/mfa/locales/es/LC_MESSAGES/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/modules/mfa/locales/fr/LC_MESSAGES/.gitkeep b/modules/mfa/locales/fr/LC_MESSAGES/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/modules/mfa/locales/ko/LC_MESSAGES/.gitkeep b/modules/mfa/locales/ko/LC_MESSAGES/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/modules/mfa/public/must-set-up-mfa.php b/modules/mfa/public/must-set-up-mfa.php index dbe44428..d1067c62 100644 --- a/modules/mfa/public/must-set-up-mfa.php +++ b/modules/mfa/public/must-set-up-mfa.php @@ -23,8 +23,8 @@ $globalConfig = Configuration::getInstance(); -$t = new Template($globalConfig, 'mfa:must-set-up-mfa.php'); -$t->show(); +$t = new Template($globalConfig, 'mfa:must-set-up-mfa'); +$t->send(); $logger->info(sprintf( 'mfa: Told Employee ID %s they they must set up MFA.', diff --git a/modules/mfa/public/prompt-for-mfa.php b/modules/mfa/public/prompt-for-mfa.php index 53b8bd32..c3a52f96 100644 --- a/modules/mfa/public/prompt-for-mfa.php +++ b/modules/mfa/public/prompt-for-mfa.php @@ -53,7 +53,7 @@ 'event' => 'MFA ID missing in URL. Choosing one and doing a redirect.', 'employeeId' => $state['employeeId'], ])); - + // Pick an MFA ID and do a redirect to put that into the URL. $mfaOption = Mfa::getMfaOptionToUse($mfaOptions, $userAgent); $moduleUrl = SimpleSAML\Module::getModuleURL('mfa/prompt-for-mfa.php', [ @@ -75,7 +75,7 @@ } $rememberMe = filter_input(INPUT_POST, 'rememberMe') ?? false; - + // NOTE: This will only return if validation fails. $errorMessage = Mfa::validateMfaSubmission( $mfaId, @@ -87,7 +87,7 @@ $mfaOption['type'], $state['rpOrigin'] ); - + $logger->warning(json_encode([ 'event' => 'MFA validation result: failed', 'employeeId' => $state['employeeId'], @@ -122,6 +122,7 @@ $t = new Template($globalConfig, $mfaTemplateToUse); $t->data['errorMessage'] = $errorMessage ?? null; $t->data['mfaOption'] = $mfaOption; +$t->data['mfaOptionData'] = json_encode($mfaOption['data']); $t->data['mfaOptions'] = $mfaOptions; $t->data['stateId'] = $stateId; $t->data['supportsWebAuthn'] = LoginBrowser::supportsWebAuthn($userAgent); @@ -129,7 +130,8 @@ $t->data['browserJsPath'] = '/module.php/mfa/simplewebauthn/browser.js?v=' . $browserJsHash; $t->data['managerEmail'] = $state['managerEmail']; $t->data['otherOptions'] = $otherOptions; -$t->show(); +$t->data['idpName'] = $globalConfig->getString('idp_display_name'); +$t->send(); $logger->info(json_encode([ 'event' => 'Prompted user for MFA', diff --git a/modules/mfa/src/Auth/Process/Mfa.php b/modules/mfa/src/Auth/Process/Mfa.php index 8e6415ac..51c2ce60 100644 --- a/modules/mfa/src/Auth/Process/Mfa.php +++ b/modules/mfa/src/Auth/Process/Mfa.php @@ -297,10 +297,10 @@ public static function getNumBackupCodesUserHad(array $mfaOptions): int public static function getTemplateFor(string $mfaType): string { $mfaOptionTemplates = [ - 'backupcode' => 'mfa:prompt-for-mfa-backupcode.php', - 'totp' => 'mfa:prompt-for-mfa-totp.php', - 'webauthn' => 'mfa:prompt-for-mfa-webauthn.php', - 'manager' => 'mfa:prompt-for-mfa-manager.php', + 'backupcode' => 'mfa:prompt-for-mfa-backupcode', + 'totp' => 'mfa:prompt-for-mfa-totp', + 'webauthn' => 'mfa:prompt-for-mfa-webauthn', + 'manager' => 'mfa:prompt-for-mfa-manager', ]; $template = $mfaOptionTemplates[$mfaType] ?? null; diff --git a/modules/mfa/templates/.gitkeep b/modules/mfa/templates/.gitkeep new file mode 100644 index 00000000..57da54a3 --- /dev/null +++ b/modules/mfa/templates/.gitkeep @@ -0,0 +1 @@ +this directory will be filled in the Docker image with a copy of the material module templates diff --git a/modules/profilereview/templates/.gitkeep b/modules/profilereview/templates/.gitkeep new file mode 100644 index 00000000..57da54a3 --- /dev/null +++ b/modules/profilereview/templates/.gitkeep @@ -0,0 +1 @@ +this directory will be filled in the Docker image with a copy of the material module templates