From 5eef44c9a5fe42b29480d00af58e93eca60984f9 Mon Sep 17 00:00:00 2001 From: rushannanayakkara Date: Tue, 21 May 2024 21:56:50 +0530 Subject: [PATCH 01/29] Revert "Revert "Update recovery portal to support SMS OTP based password recovery"" This reverts commit 6d99d83e90ad34e92acbddfe2d4b72e704848a87. --- .../custom-text-preference-constants.ts | 2 +- .../endpoint/i18n/Resources.properties | 26 +- .../endpoint/i18n/Resources_de_DE.properties | 13 +- .../endpoint/i18n/Resources_es_ES.properties | 13 +- .../endpoint/i18n/Resources_fr_FR.properties | 13 +- .../endpoint/i18n/Resources_ja_JP.properties | 13 +- .../endpoint/i18n/Resources_pt_BR.properties | 13 +- .../endpoint/i18n/Resources_pt_PT.properties | 13 +- .../endpoint/i18n/Resources_zh_CN.properties | 13 +- .../src/main/webapp/includes/init-url.jsp | 172 +++++++ .../src/main/webapp/password-recovery-otp.jsp | 308 ++++++++++++ .../password-recovery-tenant-request.jsp | 51 +- .../password-recovery-username-request.jsp | 60 ++- .../password-recovery-with-claims-options.jsp | 32 +- .../webapp/password-recovery-with-claims.jsp | 30 +- .../src/main/webapp/password-recovery.jsp | 172 ++++--- .../main/webapp/password-reset-complete.jsp | 41 +- .../src/main/webapp/password-reset.jsp | 32 +- .../src/main/webapp/recovery.jsp | 22 +- .../src/main/webapp/sms-otp.jsp | 452 ++++++++++++++++++ .../src/main/webapp/util/countdown.jsp | 235 +++++++++ .../src/main/webapp/util/modal.jsp | 135 ++++++ .../src/main/webapp/util/timeout.jsp | 199 ++++++++ .../resources/web.xml.j2 | 12 +- .../i18n/src/models/namespaces/branding-ns.ts | 2 +- .../translations/en-US/portals/branding.ts | 2 +- 26 files changed, 1895 insertions(+), 181 deletions(-) create mode 100755 identity-apps-core/apps/recovery-portal/src/main/webapp/includes/init-url.jsp create mode 100644 identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp create mode 100644 identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp create mode 100644 identity-apps-core/apps/recovery-portal/src/main/webapp/util/countdown.jsp create mode 100644 identity-apps-core/apps/recovery-portal/src/main/webapp/util/modal.jsp create mode 100644 identity-apps-core/apps/recovery-portal/src/main/webapp/util/timeout.jsp diff --git a/features/admin.branding.v1/constants/custom-text-preference-constants.ts b/features/admin.branding.v1/constants/custom-text-preference-constants.ts index 25ad34f8320..7d489448305 100644 --- a/features/admin.branding.v1/constants/custom-text-preference-constants.ts +++ b/features/admin.branding.v1/constants/custom-text-preference-constants.ts @@ -170,7 +170,7 @@ export class CustomTextPreferenceConstants { }, PASSWORD_RECOVERY: { BODY: "password.recovery.body", - BUTTON: "password.recovery.button", + BUTTON: "password.recovery.button.email.link", HEADING: "password.recovery.heading", IDENTIFIER: { INPUT: { diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties index 6af8c502e53..977b3974ae9 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties @@ -37,15 +37,29 @@ sign.up.heading=Sign Up sign.up.button=Sign Up # +# +sms.otp.heading=OTP Verification +enter.code.sent.smsotp=Enter the code sent to your mobile phone +sms.otp.resend.code=Resend Code +sms.otp.submit.button=Continue + # # EDITABLE=true,SCREEN="password-recovery",MULTI_LINE=false password.recovery.heading=Forgot Password? # EDITABLE=true,SCREEN="password-recovery",MULTI_LINE=true -password.recovery.body=Don't worry, it happens. We will send you an email to reset your password. +password.recovery.body=We've got you covered. Enter your username to begin resetting your password. # EDITABLE=true,SCREEN="password-recovery",MULTI_LINE=false password.recovery.identifier.input.placeholder=Username -# EDITABLE=true,SCREEN="password-recovery",MULTI_LINE=false -password.recovery.button=Send Reset Link +# EDITABLE=true,SCREEN="password-recovery",MULTI_LINE=false,VARIATIONS="email-link" +password.recovery.button.email.link=Send Reset Link +# EDITABLE=true,SCREEN="password-recovery",MULTI_LINE=false,VARIATIONS="sms-otp" +password.recovery.button.smsotp=Send SMS OTP +# EDITABLE=true,SCREEN="password-recovery",MULTI_LINE=false,VARIATIONS="multi" +password.recovery.button.multi=Proceed +# EDITABLE=true,SCREEN="password-recovery",MULTI_LINE=false,VARIATIONS="multi" +send.email.link=Send reset link via email +# EDITABLE=true,SCREEN="password-recovery",MULTI_LINE=false,VARIATIONS="multi" +send.code.via.sms=Send code via SMS # # @@ -163,7 +177,7 @@ Start.password.recovery=Start Password Recovery Enter.tenant.here=Enter Your Tenant Domain Proceed.username.recovery=Proceed to Username Recovery Proceed.password.recovery=Proceed to Password Recovery -If.you.do.not.specify.tenant.domain.consider.as.super.tenant=If you do not specify a tenant domain, you will be considered under super tenant. +If.you.do.not.specify.tenant.domain.consider.as.super.tenant=If you do not specify a tenant domain, you will be considered under super tenant. (Compulsory for email usernames.) SW52YWxpZCBhbnN3ZXI_=Invalid answer Q291bnRyeQ__=Country TW9iaWxl=Mobile @@ -309,6 +323,8 @@ username.pattern.violated=Username pattern policy violated fill.the.first.name=Please fill the first name. Password.Expired=Your password has expired. Please set a new password. error.22001=This password has been used in recent history. Please choose a different password. +error.retry.code.invalid=Authentication failed. The code you entered is invalid or expired. Please retry. +resend.time.exceed.or.max.resend.count.exceed=Resend failed. Resend time limit exceeded or maximum resend count reached. # SCIM Attributes VXNlcm5hbWU_=Username @@ -383,6 +399,8 @@ QmFja3VwIENvZGUgRW5hYmxlZA__=Backup Code Enabled RW5hYmxlZCBBdXRoZW50aWNhdG9ycw__=Enabled Authenticators QmFja3VwIENvZGVz=Backup Codes RmFpbGVkIEJhY2t1cCBDb2RlIEF0dGVtcHRz=Failed Backup Code Attempts +Q2hhbm5lbC51bmF2YWlsYWJsZS5mb3IudXNlcg__=Channel not set by user +VW5rbm93bi5jaGFubmVs=Unknown channel invitation.accepted=Invitation Accepted invitation.accepted.message=You now have access to your invited organization's applications. Reach out to your invited organization's administrator for information on available applications invitation.not.active=The invitation link is not active diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties index 911ca017152..20be1d11c5c 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties @@ -32,9 +32,12 @@ sign.up.button=Registrieren # password.recovery.heading=Passwort vergessen? -password.recovery.body=Machen Sie sich keine Sorgen, das kann passieren. Eine E-Mail zum Zurücksetzen Ihres Passwortes wird Ihnen gesendet +password.recovery.body=Wir geben dir Deckung. Geben Sie Ihren Benutzernamen ein, um mit dem Zurücksetzen Ihres Passworts zu beginnen. password.recovery.identifier.input.placeholder=Nutzername -password.recovery.button=Reset-Link senden +password.recovery.button.email.link=Reset-Link senden +password.recovery.button.smsotp=SMS-Code senden +send.email.link=Link zum Zurücksetzen per E-Mail senden +send.code.via.sms=Code per SMS versenden # # @@ -146,7 +149,7 @@ Start.password.recovery=Starten Sie die Passwortwiederherstellung Enter.tenant.here=Geben Sie Ihre Mieterdomain ein Proceed.username.recovery=Fahren Sie mit der Wiederherstellung des Benutzernamens fort Proceed.password.recovery=Fahren Sie mit der Wiederherstellung der Passwort fort -If.you.do.not.specify.tenant.domain.consider.as.super.tenant=Wenn Sie keine Mieterdomäne angeben, werden Sie unter Super-Mieter betrachtet +If.you.do.not.specify.tenant.domain.consider.as.super.tenant=Wenn Sie keine Mandantendomäne angeben, werden Sie als Supermandant betrachtet. (Pflichtig für E-Mail-Benutzernamen.) SW52YWxpZCBhbnN3ZXI_=Ungültige Antwort Q291bnRyeQ__=Land TW9iaWxl=Handy, Mobiltelefon @@ -292,6 +295,8 @@ username.pattern.violated=Verstoß gegen die Benutzernamenmusterrichtlinie fill.the.first.name=Bitte füllen Sie den Vornamen aus. Password.Expired=Dein Passwort ist abgelaufen. Bitte legen Sie ein neues Passwort fest. error.22001=Dieses Passwort wurde in der jüngeren Geschichte verwendet. Bitte wählen Sie ein anderes Passwort. +error.retry.code.invalid=Authentifizierung fehlgeschlagen. Der von Ihnen eingegebene Code ist ungültig oder abgelaufen. Bitte erneut versuchen. +resend.time.exceed.or.max.resend.count.exceed=Das erneute Senden ist fehlgeschlagen. Das Zeitlimit für erneute Sendungen wurde überschritten oder die maximale Anzahl an erneuten Sendungen wurde erreicht. # SCIM Attributes VXNlcm5hbWU_=Benutzername @@ -366,6 +371,8 @@ QmFja3VwIENvZGUgRW5hYmxlZA__=Backup-Code aktiviert RW5hYmxlZCBBdXRoZW50aWNhdG9ycw__=Aktivierte Authentikatoren QmFja3VwIENvZGVz=Backup-Codes RmFpbGVkIEJhY2t1cCBDb2RlIEF0dGVtcHRz=Fehlgeschlagene Backup-Codes Versuche +Q2hhbm5lbC51bmF2YWlsYWJsZS5mb3IudXNlcg__=Kanal für Benutzer nicht verfügbar +VW5rbm93bi5jaGFubmVs=Unbekannter Kanal invitation.accepted=Einladung angenommen invitation.accepted.message=Sie haben jetzt Zugriff auf die Bewerbungen Ihrer eingeladenen Organisation. Wenden Sie sich an den Administrator Ihrer eingeladenen Organisation, um Informationen zu verfügbaren Anwendungen zu erhalten invitation.not.active=Der Einladungslink ist nicht aktiv diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties index 0f5484e08ca..d5b0f8f1320 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties @@ -32,9 +32,12 @@ sign.up.button=Inscribirse # password.recovery.heading=¿Has olvidado tu contraseña? -password.recovery.body=No te preocupes, sucede. Le enviaremos un correo electrónico para restablecer su contraseña. +password.recovery.body=Te tenemos cubierto. Ingrese su nombre de usuario para comenzar a restablecer su contraseña. password.recovery.identifier.input.placeholder=Correo electrónico -password.recovery.button=Enviar enlace de reinicio +password.recovery.button.email.link=Enviar enlace de reinicio +password.recovery.button.smsotp=Enviar codigo sms +send.email.link=Enviar enlace de reinicio por correo electrónico +send.code.via.sms=Enviar código por SMS # # @@ -146,7 +149,7 @@ Start.password.recovery=Iniciar recuperación de contraseña Enter.tenant.here=Ingrese su dominio del inquilino Proceed.username.recovery=Proceder a la recuperación del nombre de usuario Proceed.password.recovery=Proceder a la recuperación de contraseña -If.you.do.not.specify.tenant.domain.consider.as.super.tenant=Si no especifica un dominio de inquilino, se lo considerará bajo super inquilino. +If.you.do.not.specify.tenant.domain.consider.as.super.tenant=Si no especifica un dominio de inquilino, se le considerará superinquilino. (Obligatorio para nombres de usuario de correo electrónico). SW52YWxpZCBhbnN3ZXI_=Respuesta invalida Q291bnRyeQ__=País TW9iaWxl=Móvil @@ -292,6 +295,8 @@ username.pattern.violated=Política de patrón de nombre de usuario infringida fill.the.first.name=Por favor complete el primer nombre. Password.Expired=Tu contraseña ha expirado. Establezca una nueva contraseña. error.22001=Esta contraseña se ha utilizado en la historia reciente. Elija una contraseña diferente. +error.retry.code.invalid=La autenticación falló. El código que ingresó no es válido o ha caducado. Por favor, intenta de nuevo. +resend.time.exceed.or.max.resend.count.exceed=El reenvío falló. Se superó el límite de tiempo de reenvío o se alcanzó el recuento máximo de reenvío. # SCIM Attributes VXNlcm5hbWU_=Nombre de usuario @@ -366,6 +371,8 @@ QmFja3VwIENvZGUgRW5hYmxlZA__=Código de respaldo habilitado RW5hYmxlZCBBdXRoZW50aWNhdG9ycw__=Autenticadores habilitados QmFja3VwIENvZGVz=Códigos de backup RmFpbGVkIEJhY2t1cCBDb2RlIEF0dGVtcHRz=Intentos de código de copia de seguridad fallidos +Q2hhbm5lbC51bmF2YWlsYWJsZS5mb3IudXNlcg__=Canal no disponible para el usuario +VW5rbm93bi5jaGFubmVs=Canal desconocido invitation.accepted=Invitación aceptada invitation.accepted.message=Ahora tiene acceso a las solicitudes de su organización invitada. Comuníquese con el administrador de su organización invitada para obtener información sobre las aplicaciones disponibles invitation.not.active=El enlace de invitación no está activo. diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties index 5a288e69e42..0df30d0fb5a 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties @@ -32,9 +32,12 @@ sign.up.button=S'inscrire # password.recovery.heading=Mot de passe oublié? -password.recovery.body=Ne vous inquiétez pas, ça arrive. Nous vous enverrons un e-mail pour réinitialiser votre mot de passe. +password.recovery.body=Nous avons ce qu'il vous faut. Entrez votre nom d'utilisateur pour commencer à réinitialiser votre mot de passe. password.recovery.identifier.input.placeholder=Nom d'utilisateur -password.recovery.button=Envoyer le lien de réinitialisation +password.recovery.button.email.link=Envoyer le lien de réinitialisation +password.recovery.button.smsotp=Envoyer le code SMS +send.email.link=Envoyer le lien de réinitialisation par e-mail +send.code.via.sms=Envoyer le code par SMS # # @@ -141,7 +144,7 @@ Enter.tenant.here=Entrer votre domaine For.required.fields.cannot.be.empty=Les champs obligatoires ne peuvent pas être vides Proceed.username.recovery=Procéder à la récupération du nom d'utilisateur Proceed.password.recovery=Procéder à la récupération du mot de passe -If.you.do.not.specify.tenant.domain.consider.as.super.tenant=Si vous ne spécifiez pas de domaine de locataire, vous serez considéré comme un hôte. +If.you.do.not.specify.tenant.domain.consider.as.super.tenant=Si vous ne spécifiez pas de domaine locataire, vous serez considéré comme un super locataire. (Obligatoire pour les noms d'utilisateur de messagerie.) SW52YWxpZCBhbnN3ZXI_=Réponse invalide Q291bnRyeQ__=Pays TW9iaWxl=Mobile @@ -293,6 +296,8 @@ username.pattern.violated=Violation de la règle relative au modèle de nom d ut fill.the.first.name=Veuillez remplir le prénom. Password.Expired=Votre mot de passe a expiré. Veuillez définir un nouveau mot de passe. error.22001=Ce mot de passe a été utilisé dans l'histoire récente. Veuillez choisir un autre mot de passe. +error.retry.code.invalid=Authentification échouée. Le code que vous avez entré est invalide ou a expiré. Veuillez réessayer. +resend.time.exceed.or.max.resend.count.exceed=Échec du renvoi. Délai de renvoi dépassé ou nombre maximal de renvois atteint. # SCIM Attributes VXNlcm5hbWU_=Nom d'utilisateur @@ -367,6 +372,8 @@ QmFja3VwIENvZGUgRW5hYmxlZA__=Code de sauvegarde activé RW5hYmxlZCBBdXRoZW50aWNhdG9ycw__=Authentificateurs activés QmFja3VwIENvZGVz=Codes de sauvegarde RmFpbGVkIEJhY2t1cCBDb2RlIEF0dGVtcHRz=Échec des tentatives de code de sauvegardee +Q2hhbm5lbC51bmF2YWlsYWJsZS5mb3IudXNlcg__=Chaîne indisponible pour l'utilisateur +VW5rbm93bi5jaGFubmVs=Chaîne inconnue invitation.accepted=Invitation acceptée invitation.accepted.message=Vous avez désormais accès aux candidatures de votre organisation invitée. Contactez l'administrateur de votre organisation invitée pour obtenir des informations sur les applications disponibles invitation.not.active=Le lien d'invitation n'est pas actif diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties index 2cc78a270a0..acb54b64b36 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties @@ -32,9 +32,12 @@ sign.up.button=サインアップ # password.recovery.heading=パスワード -password.recovery.body=心配する必要はありません。パスワードをリセットするためのメールをお送りします。 +password.recovery.body=ご対応させていただきます。ユーザー名を入力してパスワードのリセットを開始します。 password.recovery.identifier.input.placeholder=ユーザー名 -password.recovery.button=リセットリンクの送信 +password.recovery.button.email.link=リセットリンクの送信 +password.recovery.button.smsotp=SMSコードを送信する +send.email.link=電子メールでコードを送信する +send.code.via.sms=コードをSMSで送信する # # @@ -142,7 +145,7 @@ Start.password.recovery=パスワードの復旧開始 Enter.tenant.here=テナントドメインの入力 Proceed.username.recovery=ユーザー名の復旧に進む Proceed.password.recovery=パスワードの復旧に進む -If.you.do.not.specify.tenant.domain.consider.as.super.tenant=テナントドメインを指定しない場合、スーパーテナントに属していると見なされます。 +If.you.do.not.specify.tenant.domain.consider.as.super.tenant=テナント ドメインを指定しない場合は、スーパー テナントの下にあるとみなされます。 (電子メールのユーザー名には必須です。) SW52YWxpZCBhbnN3ZXI_=回答が無効です Q291bnRyeQ__=国 TW9iaWxl=携帯番号 @@ -288,6 +291,8 @@ username.pattern.violated=ユーザー名パターンポリシーが違反しま fill.the.first.name=名を記入してください。 Password.Expired=パスワードが期限切れになりました。新しいパスワードを設定してください。 error.22001=このパスワードは最近の歴史で使用されています。別のパスワードを選択してください。 +error.retry.code.invalid=認証に失敗しました。入力したコードは無効であるか、有効期限が切れています。再試行してください。 +resend.time.exceed.or.max.resend.count.exceed=再送信に失敗しました。再送信制限時間を超えたか、最大再送信回数に達しました。 ## SCIM Attributes VXNlcm5hbWU_=ユーザー名 @@ -362,6 +367,8 @@ QmFja3VwIENvZGUgRW5hYmxlZA__=バックアップコードが有効になりまし RW5hYmxlZCBBdXRoZW50aWNhdG9ycw__=有効な認証システム QmFja3VwIENvZGVz=バックアップコード RmFpbGVkIEJhY2t1cCBDb2RlIEF0dGVtcHRz=バックアップコードの失敗 +Q2hhbm5lbC51bmF2YWlsYWJsZS5mb3IudXNlcg__=ユーザーがチャンネルを使用できません +VW5rbm93bi5jaGFubmVs=不明なチャンネル invitation.accepted=招待状が受け入れられました invitation.accepted.message=招待された組織のアプリケーションにアクセスできるようになりました。利用可能なアプリケーションに関する情報については、招待された組織の管理者に連絡してください invitation.not.active=招待リンクはアクティブではありません diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties index 3793854bd7e..03c82c62476 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties @@ -32,9 +32,12 @@ sign.up.button=Cadastrar # password.recovery.heading=Esqueceu a senha? -password.recovery.body=Não se preocupe, isso acontece. Enviaremos um e-mail para redefinir sua senha. +password.recovery.body=Estamos protegendo você. Digite seu nome de usuário para começar a redefinir sua senha. password.recovery.identifier.input.placeholder=Nome de usuário -password.recovery.button=Enviar link de redefinição +password.recovery.button.email.link=Enviar link de redefinição +password.recovery.button.smsotp=enviar codigo sms +send.email.link=Enviar link de redefinição por e-mail +send.code.via.sms=Enviar código por SMS # # @@ -146,7 +149,7 @@ Start.password.recovery=Iniciar a recuperação de senha Enter.tenant.here=Digite seu domínio de tenant Proceed.username.recovery=Prossiga para a recuperação de nome de usuário Proceed.password.recovery=Prossiga para a recuperação de senha -If.you.do.not.specify.tenant.domain.consider.as.super.tenant=Se você não especificar um domínio de tenant, você será considerado sob o super tenant. +If.you.do.not.specify.tenant.domain.consider.as.super.tenant=Se você não especificar um domínio de locatário, será considerado superinquilino. (Obrigatório para nomes de usuário de e-mail.) SW52YWxpZCBhbnN3ZXI_=Resposta inválida Q291bnRyeQ__=País TW9iaWxl=Celular @@ -292,6 +295,8 @@ username.pattern.violated=Política de padrão de nome de usuário violada fill.the.first.name=Por favor, preencha o nome. Password.Expired=Sua senha expirou. Por favor, defina uma nova senha. error.22001=Esta senha já foi utilizada recentemente. Por favor, escolha uma senha diferente. +error.retry.code.invalid=Falha na autenticação. O código que você digitou é inválido ou expirou. Por favor tente novamente. +resend.time.exceed.or.max.resend.count.exceed=Falha ao reenviar. O limite de tempo de reenvio foi excedido ou a contagem máxima de reenvio foi atingida. # SCIM Attributes VXNlcm5hbWU_=Nome de Usuário @@ -366,6 +371,8 @@ QmFja3VwIENvZGUgRW5hYmxlZA__=Código de Backup Ativado RW5hYmxlZCBBdXRoZW50aWNhdG9ycw__=Autenticadores Habilitados QmFja3VwIENvZGVz=Códigos de Backup RmFpbGVkIEJhY2t1cCBDb2RlIEF0dGVtcHRz=Tentativas Falhas no Código de Backup +Q2hhbm5lbC51bmF2YWlsYWJsZS5mb3IudXNlcg__=Canal indisponível para o usuário +VW5rbm93bi5jaGFubmVs=Canal desconhecido invitation.accepted=Convite aceito invitation.accepted.message=Agora você tem acesso às inscrições da sua organização convidada. Entre em contato com o administrador da sua organização convidada para obter informações sobre os aplicativos disponíveis invitation.not.active=O link do convite não está ativo diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties index fda9e948029..bb22db0594d 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties @@ -32,9 +32,12 @@ sign.up.button=Inscrever-se # password.recovery.heading=Esqueceu a senha? -password.recovery.body=Não se preocupe, isso acontece. Enviaremos um e-mail para redefinir sua senha. +password.recovery.body=Estamos protegendo você. Digite seu nome de usuário para começar a redefinir sua senha. password.recovery.identifier.input.placeholder=Nome de usuário -password.recovery.button=Enviar link de redefinição +password.recovery.button.email.link=Enviar link de redefinição +password.recovery.button.smsotp=Enviar codigo sms +send.email.link=Enviar link de redefinição por e-mail +send.code.via.sms=Enviar código por SMS # # @@ -146,7 +149,7 @@ Start.password.recovery=Inicie a recuperação de senha Enter.tenant.here=Digite seu domínio tenant (locatário) Proceed.username.recovery=Prossiga para a recuperação de nome de usuário Proceed.password.recovery=Prossiga para a recuperação de senha -If.you.do.not.specify.tenant.domain.consider.as.super.tenant=Se você não especificar um domínio tenant (locatário), será considerado sob super tenant (locatário). +If.you.do.not.specify.tenant.domain.consider.as.super.tenant=Se você não especificar um domínio de locatário, será considerado superinquilino. (Obrigatório para nomes de usuário de e-mail.) SW52YWxpZCBhbnN3ZXI_=Resposta inválida Q291bnRyeQ__=País TW9iaWxl=Móvel @@ -292,6 +295,8 @@ username.pattern.violated=Política de padrão de nome de utilizador violada fill.the.first.name=Por favor, preencha o primeiro nome. Password.Expired=Sua senha expirou. Defina uma nova senha. error.22001=Esta senha foi usada na história recente. Escolha uma senha diferente. +error.retry.code.invalid=Falha na autenticação. O código que você digitou é inválido ou expirou. Por favor tente novamente. +resend.time.exceed.or.max.resend.count.exceed=Falha ao reenviar. O limite de tempo de reenvio foi excedido ou a contagem máxima de reenvio foi atingida. # SCIM Attributes VXNlcm5hbWU_=Nome do usuário @@ -366,6 +371,8 @@ QmFja3VwIENvZGUgRW5hYmxlZA__=Código de backup ativado RW5hYmxlZCBBdXRoZW50aWNhdG9ycw__=Autenticadores habilitados QmFja3VwIENvZGVz=Códigos de backup RmFpbGVkIEJhY2t1cCBDb2RlIEF0dGVtcHRz=Tentativas de código de backup com falha +Q2hhbm5lbC51bmF2YWlsYWJsZS5mb3IudXNlcg__=Canal indisponível para o usuário +VW5rbm93bi5jaGFubmVs=Canal desconhecido invitation.accepted=Convite aceito invitation.accepted.message=Agora você tem acesso às inscrições da sua organização convidada. Entre em contato com o administrador da sua organização convidada para obter informações sobre os aplicativos disponíveis invitation.not.active=O link do convite não está ativo diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties index da3027cd0ee..0859246733e 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties @@ -32,9 +32,12 @@ sign.up.button=报名 # password.recovery.heading=密码 -password.recovery.body=不用担心,它发生了。我们将向您发送电子邮件以重置您的密码。 +password.recovery.body=我们已经为您提供了保障。输入您的用户名以开始重置密码。 password.recovery.identifier.input.placeholder=用户名 -password.recovery.button=发送重置链接 +password.recovery.button.email.link=发送重置链接 +password.recovery.button.smsotp=傳簡訊代碼 +send.email.link=透過電子郵件發送重置鏈接 +send.code.via.sms=透過簡訊發送代碼 # # @@ -142,7 +145,7 @@ Start.password.recovery=开始密码恢复 Enter.tenant.here=输入您的租户域 Proceed.username.recovery=继续进行用户名恢复 Proceed.password.recovery=继续密码恢复 -If.you.do.not.specify.tenant.domain.consider.as.super.tenant=如果您不指定租户域,则将在超级租户下考虑。 +If.you.do.not.specify.tenant.domain.consider.as.super.tenant=如果您不指定租户域,您将被视为超级租户。 (电子邮件用户名是强制性的。) SW52YWxpZCBhbnN3ZXI_=无效的答案 Q291bnRyeQ__=国家 TW9iaWxl=移动的 @@ -288,6 +291,8 @@ username.pattern.violated=违反用户名模式政策 fill.the.first.name=请填写名字。 Password.Expired=您的密码已过期。请设置一个新密码。 error.22001=该密码已在最近的历史中使用。请选择其他密码。 +error.retry.code.invalid=认证失败。您输入的代码无效或已过期。请重试。 +resend.time.exceed.or.max.resend.count.exceed=重新发送失败。超过重发时间限制或达到最大重发次数。 ## SCIM Attributes VXNlcm5hbWU_=用户名 @@ -362,6 +367,8 @@ QmFja3VwIENvZGUgRW5hYmxlZA__=启用备份代码 RW5hYmxlZCBBdXRoZW50aWNhdG9ycw__=启用了身份验证者 QmFja3VwIENvZGVz=备份代码 RmFpbGVkIEJhY2t1cCBDb2RlIEF0dGVtcHRz=备份代码尝试失败 +Q2hhbm5lbC51bmF2YWlsYWJsZS5mb3IudXNlcg__=用户无法使用频道 +VW5rbm93bi5jaGFubmVs=未知频道 invitation.accepted=邀请接受 invitation.accepted.message=现在,您可以访问受邀组织的应用程序。与您受邀组织的管理员联系以获取有关可用应用程序的信息 invitation.not.active=邀请链接不活动 diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/includes/init-url.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/includes/init-url.jsp new file mode 100755 index 00000000000..32509dfcb62 --- /dev/null +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/includes/init-url.jsp @@ -0,0 +1,172 @@ +<%-- + ~ Copyright (c) 2024, WSO2 LLC. (https://www.wso2.com). + ~ + ~ WSO2 LLC. licenses this file to you under the Apache License, + ~ Version 2.0 (the "License"); you may not use this file except + ~ in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. +--%> + +<%@ page import="org.apache.commons.lang.StringUtils" %> +<%@ page import="org.wso2.carbon.identity.core.util.IdentityTenantUtil" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.IdentityManagementEndpointConstants" %> +<%@ page import="org.wso2.carbon.identity.core.ServiceURLBuilder" %> +<% + final String CONSOLE = "Console"; + final String MY_ACCOUNT = "My Account"; + + String TENANT_DOMAIN_KEY = "tenantDomain"; + String TENANT_DOMAIN_SHORT = "t"; + String USER_TENANT_DOMAIN_SHORT = "ut"; + String SERVICE_PROVIDER_NAME_SHORT = "sp"; + String SERVICE_PROVIDER_ID_SHORT = "spId"; + + String identityServerEndpointContextParam = application.getInitParameter("IdentityServerEndpointContextURL"); + String samlssoURL = "../samlsso"; + String commonauthURL = "../commonauth"; + String oauth2AuthorizeURL = "../oauth2/authorize"; + String oidcLogoutURL = "../oidc/logout"; + String openidServerURL = "../openidserver"; + String logincontextURL = "../logincontext"; + String longwaitstatusURL = "/longwaitstatus"; + + String tenantDomain; + String userTenantDomain; + String tenantForTheming; + String userTenant; + String spAppName; + String spAppId; + + if (IdentityTenantUtil.isTenantQualifiedUrlsEnabled()) { + tenantDomain = IdentityTenantUtil.resolveTenantDomain(); + tenantForTheming = tenantDomain; + userTenant = tenantDomain; + + spAppName = Encode.forHtmlAttribute(request.getParameter(SERVICE_PROVIDER_NAME_SHORT)); + if (StringUtils.isBlank(spAppName) && StringUtils.isNotBlank((String) request.getAttribute(SERVICE_PROVIDER_NAME_SHORT))) { + spAppName = (String) request.getAttribute(SERVICE_PROVIDER_NAME_SHORT); + } + + spAppId = Encode.forHtmlAttribute(request.getParameter(SERVICE_PROVIDER_ID_SHORT)); + if (StringUtils.isBlank(spAppId) && StringUtils.isNotBlank((String) request.getAttribute(SERVICE_PROVIDER_ID_SHORT))) { + spAppId = (String) request.getAttribute(SERVICE_PROVIDER_ID_SHORT); + } + + String tenantDomainFromURL = Encode.forHtmlAttribute(request.getParameter(TENANT_DOMAIN_SHORT)); + if (StringUtils.isBlank(tenantDomainFromURL) && StringUtils.isNotBlank((String) request.getAttribute(TENANT_DOMAIN_SHORT))) { + tenantDomainFromURL = (String) request.getAttribute(TENANT_DOMAIN_SHORT); + } + + String tenantDomainOfUser = Encode.forHtmlAttribute(request.getParameter(USER_TENANT_DOMAIN_SHORT)); + if (StringUtils.isBlank(tenantDomainOfUser) && StringUtils.isNotBlank((String) request.getAttribute(USER_TENANT_DOMAIN_SHORT))) { + tenantDomainOfUser = (String) request.getAttribute(USER_TENANT_DOMAIN_SHORT); + } + + userTenantDomain = tenantDomainOfUser; + + if (StringUtils.equals(tenantDomain, IdentityManagementEndpointConstants.SUPER_TENANT) + && StringUtils.equals(spAppName, CONSOLE)) { + tenantForTheming = IdentityManagementEndpointConstants.SUPER_TENANT; + } else { + if (StringUtils.isBlank(userTenantDomain)) { + userTenantDomain = tenantDomainFromURL; + } + if (StringUtils.isBlank(userTenantDomain)) { + userTenantDomain = tenantDomain; + } + if (StringUtils.isNotBlank(tenantDomainOfUser)) { + tenantForTheming = tenantDomainOfUser; + } + if (StringUtils.equals(spAppName, MY_ACCOUNT) + && StringUtils.equals(tenantDomain, IdentityManagementEndpointConstants.SUPER_TENANT)) { + tenantForTheming = userTenantDomain; + userTenant = userTenantDomain; + } + } + } else { + tenantDomain = Encode.forHtmlAttribute(request.getParameter(TENANT_DOMAIN_KEY)); + if (StringUtils.isBlank(tenantDomain) && StringUtils.isNotBlank((String) request.getAttribute(TENANT_DOMAIN_KEY))) { + tenantDomain = (String) request.getAttribute(TENANT_DOMAIN_KEY); + } + + String tenantDomainFromURL = Encode.forHtmlAttribute(request.getParameter(TENANT_DOMAIN_SHORT)); + if (StringUtils.isBlank(tenantDomainFromURL) && StringUtils.isNotBlank((String) request.getAttribute(TENANT_DOMAIN_SHORT))) { + tenantDomainFromURL = (String) request.getAttribute(TENANT_DOMAIN_SHORT); + } + + String tenantDomainOfUser = Encode.forHtmlAttribute(request.getParameter(USER_TENANT_DOMAIN_SHORT)); + if (StringUtils.isBlank(tenantDomainOfUser) && StringUtils.isNotBlank((String) request.getAttribute(USER_TENANT_DOMAIN_SHORT))) { + tenantDomainOfUser = (String) request.getAttribute(USER_TENANT_DOMAIN_SHORT); + } + + spAppName = Encode.forHtmlAttribute(request.getParameter(SERVICE_PROVIDER_NAME_SHORT)); + if (StringUtils.isBlank(spAppName) && StringUtils.isNotBlank((String) request.getAttribute(SERVICE_PROVIDER_NAME_SHORT))) { + spAppName = (String) request.getAttribute(SERVICE_PROVIDER_NAME_SHORT); + } + + spAppId = Encode.forHtmlAttribute(request.getParameter(SERVICE_PROVIDER_ID_SHORT)); + if (StringUtils.isBlank(spAppId) && StringUtils.isNotBlank((String) request.getAttribute(SERVICE_PROVIDER_ID_SHORT))) { + spAppId = (String) request.getAttribute(SERVICE_PROVIDER_ID_SHORT); + } + + if (StringUtils.isBlank(tenantDomain)) { + tenantDomain = Encode.forHtmlAttribute(request.getParameter(IdentityManagementEndpointConstants.TENANT_DOMAIN)); + if (StringUtils.isBlank(tenantDomain) && StringUtils.isNotBlank((String) request.getAttribute(IdentityManagementEndpointConstants.TENANT_DOMAIN))) { + tenantDomain = (String) request.getAttribute(IdentityManagementEndpointConstants.TENANT_DOMAIN); + } + } + + if (!StringUtils.isBlank(tenantDomainFromURL)) { + tenantDomain = tenantDomainFromURL; + } + + tenantForTheming = tenantDomain; + userTenant = tenantDomain; + userTenantDomain = tenantDomainOfUser; + + if (StringUtils.equals(tenantDomain, IdentityManagementEndpointConstants.SUPER_TENANT) + && StringUtils.equals(spAppName, CONSOLE)) { + tenantForTheming = IdentityManagementEndpointConstants.SUPER_TENANT; + } else { + if (StringUtils.isBlank(userTenantDomain)) { + userTenantDomain = tenantDomainFromURL; + } + if (StringUtils.isBlank(userTenantDomain)) { + userTenantDomain = tenantDomain; + } + if (StringUtils.isNotBlank(tenantDomainOfUser)) { + tenantForTheming = tenantDomainOfUser; + } + if (StringUtils.equals(spAppName, MY_ACCOUNT) + && StringUtils.equals(tenantDomain, IdentityManagementEndpointConstants.SUPER_TENANT)) { + tenantForTheming = userTenantDomain; + userTenant = userTenantDomain; + } + } + } + + if (Boolean.parseBoolean(application.getInitParameter("IsHostedExternally"))) { + identityServerEndpointContextParam = application.getInitParameter("IdentityServerEndpointContextURL"); + } else { + identityServerEndpointContextParam = ServiceURLBuilder.create().setTenant(tenantDomain).build().getAbsolutePublicURL(); + } + + if (StringUtils.isNotBlank(identityServerEndpointContextParam)) { + samlssoURL = identityServerEndpointContextParam + "/samlsso"; + commonauthURL = identityServerEndpointContextParam + "/commonauth"; + oauth2AuthorizeURL = identityServerEndpointContextParam + "/oauth2/authorize"; + oidcLogoutURL = identityServerEndpointContextParam + "/oidc/logout"; + openidServerURL = identityServerEndpointContextParam + "/oidc/logout"; + logincontextURL = identityServerEndpointContextParam + "/logincontext"; + longwaitstatusURL = identityServerEndpointContextParam + "/longwaitstatus"; + } +%> diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp new file mode 100644 index 00000000000..0f41ba1647f --- /dev/null +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp @@ -0,0 +1,308 @@ +<%-- + ~ Copyright (c) 2024, WSO2 LLC. (https://www.wso2.com). + ~ + ~ WSO2 LLC. licenses this file to you under the Apache License, + ~ Version 2.0 (the "License"); you may not use this file except + ~ in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. +--%> + +<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> + +<%@ page import="java.io.IOException" %> +<%@ page import="java.util.ArrayList" %> +<%@ page import="java.util.List" %> +<%@ page import="java.util.Map" %> +<%@ page import="java.util.Random" %> +<%@ page import="java.util.UUID" %> +<%@ page import="javax.servlet.http.HttpServletRequest" %> +<%@ page import="javax.servlet.http.HttpServletResponse" %> +<%@ page import="javax.servlet.ServletException" %> +<%@ page import="org.apache.commons.collections.map.HashedMap" %> +<%@ page import="org.owasp.encoder.Encode" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.ApiException" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.api.RecoveryApiV2" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.model.recovery.v2.AccountRecoveryType" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.model.recovery.v2.RecoveryInitRequest" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.model.UserClaim" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.IdentityManagementEndpointUtil" %> +<%@ page import="org.wso2.carbon.utils.multitenancy.MultitenantUtils" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.model.recovery.v2.ConfirmRequest" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.model.recovery.v2.ConfirmResponse" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.model.recovery.v2.RecoveryChannelInformation" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.model.recovery.v2.RecoveryChannel" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.model.recovery.v2.RecoveryRequest" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.model.recovery.v2.RecoveryResponse" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.model.recovery.v2.ResendRequest" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.model.recovery.v2.ResendResponse" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.IdentityManagementEndpointConstants" %> + +<%-- Include tenant context --%> +<%@ include file="tenant-resolve.jsp"%> + +<%! + /** + * RecoveryStage represents the four steps of recovery in the + * PasswordRecoveryAPI V2. + */ + public enum RecoveryStage { + + INITIATE("INITIATE"), + RESEND("RESEND"), + CONFIRM("CONFIRM"), + RESET("RESET"); + + private final String value; + + RecoveryStage(String value) { + + this.value = value; + } + + /** + * Returns tye string value of the enum. + */ + public String getValue() { + + return value; + } + + /** + * Override the toStirng method of the object class. + */ + @Override + public String toString() { + + return value; + } + + /** + * Compares enum with string based on it's value. + * @return boolean whether the passed string equals the value of the enum. + */ + public boolean equalsValue(String otherValue) { + + return this.value.equals(otherValue); + } + } +%> +<%! + /** + * This generates a random number to provide a sample number for a invalid username + * to avoid letting external entities learning of the existing usernames. The same + * random number string will be generated for the same username each time. + */ + public static String getRandomNumberString(int len, String seed) { + + StringBuilder sb = new StringBuilder(len); + Random random = new Random(seed.hashCode()); + + for (int i = 0; i < len; i++) { + Integer numAtIndex = random.nextInt(10); + sb.append(numAtIndex.toString()); + } + return sb.toString(); + } +%> +<%! + /** + * This redirects the flow to the error page with the provided error message. + */ + public void redirectToErrorPageWithMessage(HttpServletRequest request, + HttpServletResponse response, String errorMsg) throws ServletException, IOException { + + request.setAttribute("error", true); + request.setAttribute("errorMsg", errorMsg); + request.getRequestDispatcher("error.jsp").forward(request, response); + } +%> +<% + final String USERNAME_CLAIM_URI_FOR_TENANT = "http://wso2.org/claims/username"; + final RecoveryApiV2 recoveryApiV2 = new RecoveryApiV2(); + final String username = IdentityManagementEndpointUtil.getStringValue(request.getAttribute("username")); + + String recoveryStage = Encode.forHtmlAttribute(request.getParameter("recoveryStage")); + + if (RecoveryStage.INITIATE.equalsValue(recoveryStage)) { + // if otp is supported by a new channel (eg: email) update this value assignment. null means unsupported. + final String targetChannel = IdentityManagementEndpointConstants.PasswordRecoveryOptions.SMSOTP + .equals((String)request.getAttribute("channel")) + ? "SMS" + : null; + // Manage unsupported channel + if (StringUtils.isBlank(targetChannel)) { + redirectToErrorPageWithMessage(request, response, "Unknown.channel"); + return; + } + List userClaims = new ArrayList(); + + // Get the username claim string for the tenant + UserClaim userNameClaim = new UserClaim(); + userNameClaim.setUri(USERNAME_CLAIM_URI_FOR_TENANT); + userNameClaim.setValue(MultitenantUtils.getTenantAwareUsername(username)); + userClaims.add(userNameClaim); + + String flawConfirmationCode = ""; + String recoveryCode = ""; + String channelId = ""; + String screenValue = ""; + + try { + // Initiate password recovery. + RecoveryInitRequest recoveryInitRequest = new RecoveryInitRequest(); + recoveryInitRequest.setClaims(userClaims); + Map requestHeaders = new HashedMap(); + if (request.getParameter("g-recaptcha-response") != null) { + requestHeaders.put("g-recaptcha-response", request.getParameter("g-recaptcha-response")); + } + List resp = + recoveryApiV2.initiatePasswordRecovery(recoveryInitRequest, tenantDomain, requestHeaders); + if (resp == null) { + /** Handle invalid username scenario. proceeds to next level without warning to + avoid an attacker bruteforcing to learn the usernames. */ + request.setAttribute("screenValue", "******" + getRandomNumberString(4, username)); + request.setAttribute("resendCode", UUID.randomUUID().toString()); + request.setAttribute("flowConfirmationCode", UUID.randomUUID().toString()); + request.getRequestDispatcher("sms-otp.jsp").forward(request, response); + return; + } + for(AccountRecoveryType recoveryType: resp) { + if ("recoverWithNotifications".equals(recoveryType.getMode())) { + RecoveryChannelInformation channelInfo = recoveryType.getChannelInfo(); + recoveryCode = channelInfo.getRecoveryCode(); + List channels = channelInfo.getChannels(); + for(RecoveryChannel ch: channels) { + flawConfirmationCode = recoveryType.getFlowConfirmationCode(); + if (ch.getType().equals(targetChannel)) { + channelId = ch.getId(); + screenValue = ch.getValue(); + break; + } + } + } + if (StringUtils.isNotBlank(channelId)) { + break; + } + } + + /** + * Manage user don't have phone number set up in the account. + */ + if (StringUtils.isBlank(channelId)) { + String recoveryPageQueryString = Encode.forHtmlAttribute(request.getParameter("urlQuery")); + request.setAttribute("error", true); + request.setAttribute("errorMsg", "Channel.unavailable.for.user"); + String redirectString = "recoveraccountrouter.do?" + recoveryPageQueryString; + request.getRequestDispatcher(redirectString).forward(request, response); + return; + } + + // Get Recovery Information. + RecoveryRequest recoveryRequest = new RecoveryRequest(); + recoveryRequest.setChannelId(channelId); + recoveryRequest.setRecoveryCode(recoveryCode); + RecoveryResponse recoveryResponse = + recoveryApiV2.recoverPassword(recoveryRequest, tenantDomain, requestHeaders); + request.setAttribute("screenValue", screenValue); + request.setAttribute("resendCode", recoveryResponse.getResendCode()); + request.setAttribute("flowConfirmationCode", recoveryResponse.getFlowConfirmationCode()); + } catch (ApiException e) { + IdentityManagementEndpointUtil.addErrorInformation(request, e); + request.getRequestDispatcher("error.jsp").forward(request, response); + return; + } + // Redirect to enter the OTP. + request.getRequestDispatcher("sms-otp.jsp").forward(request, response); + } else if (RecoveryStage.RESEND.equalsValue(recoveryStage)) { + String resendCode = Encode.forHtmlAttribute(request.getParameter("resendCode")); + String screenValue = Encode.forHtmlAttribute(request.getParameter("screenValue")); + // Sending resend request + try { + Map requestHeaders = new HashedMap(); + if (request.getParameter("g-recaptcha-response") != null) { + requestHeaders.put("g-recaptcha-response", request.getParameter("g-recaptcha-response")); + } + ResendRequest resendRequest = new ResendRequest(); + resendRequest.setResendCode(resendCode); + ResendResponse resendResponse = + recoveryApiV2.resendPasswordNotification(resendRequest, tenantDomain, requestHeaders); + + /** Resend code re-attached to the reqeust to avoid value being missed after the page refresh that + * happens after the resend operation. */ + request.setAttribute("resendCode", resendResponse.getResendCode()); + request.setAttribute("screenValue", screenValue); + request.setAttribute("flowConfirmationCode", resendResponse.getFlowConfirmationCode()); + } catch (ApiException e) { + if (!StringUtils.isBlank(username)) { + request.setAttribute("username", username); + } + /** Status code 406 is used for invalid/expired channel id/recovery code. Other error are considered + unexpected and redirected to the error page. */ + if (e.getCode() != 406) { + IdentityManagementEndpointUtil.addErrorInformation(request, e); + request.getRequestDispatcher("error.jsp").forward(request, response); + return; + } + request.setAttribute("isResendFailure","true"); + request.setAttribute("resendFailureMsg", "resend.fail.message"); + request.setAttribute("resendCode", resendCode); + request.setAttribute("screenValue", screenValue); + request.setAttribute("flowConfirmationCode", Encode.forHtmlAttribute(request.getParameter("flowConfirmationCode"))); + } + request.getRequestDispatcher("sms-otp.jsp").forward(request, response); + } else if (RecoveryStage.CONFIRM.equalsValue(recoveryStage)) { + String flowConfirmationCode = Encode.forHtmlAttribute(request.getParameter("flowConfirmationCode")); + String OTPcode = Encode.forHtmlAttribute(request.getParameter("OTPcode")); + try { + Map requestHeaders = new HashedMap(); + if (request.getParameter("g-recaptcha-response") != null) { + requestHeaders.put("g-recaptcha-response", request.getParameter("g-recaptcha-response")); + } + ConfirmRequest confirmRequest = new ConfirmRequest(); + /** For local notification channels flowConfirmationCode is used as confirmation code. */ + confirmRequest.setConfirmationCode(flowConfirmationCode); + confirmRequest.setOtp(OTPcode); + ConfirmResponse confirmResponse = + recoveryApiV2.confirmPasswordRecovery(confirmRequest, tenantDomain, requestHeaders); + request.setAttribute("resetCode", confirmResponse.getResetCode()); + } catch (ApiException e) { + if (!StringUtils.isBlank(username)) { + request.setAttribute("username", username); + } + /** Status code 406 is used for invalid/expired channel id/recovery code. Other error are considered + unexpected and redirected to the error page. */ + if (e.getCode() != 406) { + IdentityManagementEndpointUtil.addErrorInformation(request, e); + request.getRequestDispatcher("error.jsp").forward(request, response); + return; + } + request.setAttribute("isAuthFailure","true"); + request.setAttribute("authFailureMsg", "authentication.fail.message"); + request.setAttribute("resendCode", Encode.forHtmlAttribute(request.getParameter("resendCode"))); + request.setAttribute("flowConfirmationCode", Encode.forHtmlAttribute(request.getParameter("flowConfirmationCode"))); + request.getRequestDispatcher("sms-otp.jsp").forward(request, response); + return; + } + request.setAttribute("spId", Encode.forHtmlAttribute(request.getParameter("spId"))); + request.getRequestDispatcher("password-reset.jsp").forward(request, response); + } else if (RecoveryStage.RESET.equalsValue(recoveryStage)) { + request.setAttribute("useRecoveryV2API", "true"); + request.setAttribute("spId", Encode.forHtmlAttribute(request.getParameter("spId"))); + request.getRequestDispatcher("password-reset-complete.jsp").forward(request, response); + } else { + request.setAttribute("errorMsg", "Invalid password recovery stage."); + if (!StringUtils.isBlank(username)) { + request.setAttribute("username", username); + } + request.getRequestDispatcher("error.jsp").forward(request, response); + } +%> diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-tenant-request.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-tenant-request.jsp index 7614def5887..b22cb91b5aa 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-tenant-request.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-tenant-request.jsp @@ -33,6 +33,13 @@ <%-- Branding Preferences --%> +<% +if (IdentityTenantUtil.isTenantQualifiedUrlsEnabled()) { + + request.getRequestDispatcher("password-recovery-with-claims.jsp").forward(request, response); +} +%> + <% boolean error = IdentityManagementEndpointUtil.getBooleanValue(request.getAttribute("error")); String errorMsg = IdentityManagementEndpointUtil.getStringValue(request.getAttribute("errorMsg")); @@ -88,38 +95,34 @@
+ "> <% - if (!IdentityTenantUtil.isTenantQualifiedUrlsEnabled()) { + String callback = Encode.forHtmlAttribute + (request.getParameter("callback")); + if (callback != null) { %> - +
+ +
<% } %> - <% - String callback = Encode.forHtmlAttribute - (request.getParameter("callback")); - if (callback != null) { - %> -
- -
- <% - } - %> - - -
diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-username-request.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-username-request.jsp index 2f9c4e5fcab..5dedb9cc0fd 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-username-request.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-username-request.jsp @@ -79,6 +79,7 @@ layoutData.put("containerSize", "medium"); %> + <%-- header --%> @@ -111,24 +112,25 @@
- <%-- page content --%> +

+ <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "Start.password.recovery")%> +

+ + <% if (error) { %> +
+ <%=IdentityManagementEndpointUtil.i18nBase64(recoveryResourceBundle, errorMsg)%> +
+ <% } %> +

+ <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "password.recovery.body")%> +

+ +
-

- <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "Start.password.recovery")%> -

- - <% if (error) { %> -
- <%=IdentityManagementEndpointUtil.i18nBase64(recoveryResourceBundle, errorMsg)%> -
- <% } %> -

- <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, enterUsernameHereText)%> -

<% if (isMultiAttributeLoginEnabledInTenant) { %> @@ -137,20 +139,21 @@ <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, usernameLabel)%> <% } %> - + <% if (!IdentityTenantUtil.isTenantQualifiedUrlsEnabled()) { %> + type="hidden"> <% } %>
-
- <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, - "If.you.do.not.specify.tenant.domain.consider.as.super.tenant")%> +
+ <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, + "If.you.do.not.specify.tenant.domain.consider.as.super.tenant")%>
<% String callback = Encode.forHtmlAttribute @@ -160,18 +163,25 @@
+
+ +
<% } %>
diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims-options.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims-options.jsp index 4627bba6062..bffed04e94b 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims-options.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims-options.jsp @@ -59,8 +59,11 @@ boolean isChallengeQuestionsEnabled = false; boolean isEmailEnabled = false; + boolean isSMSOTPEnabled = false; String recoveryCode = ""; String emailId = ""; + String smsOtpId = ""; + String screenValue = ""; List claims; UsernameRecoveryApi usernameRecoveryApi = new UsernameRecoveryApi(); @@ -119,7 +122,12 @@ if (channel.getType().equals("EMAIL")) { isEmailEnabled = true; emailId = channel.getId(); - } else if (channel.getType().equals("EXTERNAL")) { + } else if (channel.getType().equals("SMS")) { + isSMSOTPEnabled = true; + smsOtpId = channel.getId(); + screenValue = channel.getValue(); + } + else if (channel.getType().equals("EXTERNAL")) { isNotificationBasedRecoveryEnabled = false; } } @@ -214,22 +222,38 @@ +
+ <%=i18n(recoveryResourceBundle, customText, "password.recovery.body")%> +
-
+
<% if (isNotificationBasedRecoveryEnabled) { %> <% if (isEmailEnabled) { %>
+ (recoveryResourceBundle,"send.email.link")%>
<% - } } + if (isSMSOTPEnabled) { + %> +
+
+ + +
+
+ + <% + } + } if (isChallengeQuestionsEnabled) { %>
diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims.jsp index ff4b3ed5b60..9ebfcaed75a 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims.jsp @@ -193,7 +193,8 @@
- + ">
<% if (isFirstNameInClaims || isLastNameInClaims) { %>
@@ -202,14 +203,14 @@ <% if (isFirstNameInClaims) { %>
" class="form-control claims"/>
<% } %> <% if (isLastNameInClaims) { %>
" class="form-control claims"/>
<% } %> @@ -221,7 +222,7 @@ %>
+ value="<%=Encode.forHtmlAttribute(sessionDataKey) %>"/>
<% } @@ -242,8 +243,9 @@
- + ">
<% } %> @@ -274,7 +276,7 @@ claim.getDisplayName())%> + class="form-control claims"/>
<% } @@ -300,14 +302,16 @@
- - <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "Cancel")%> - +
diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery.jsp index 5077ab26c20..155321e2ab0 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery.jsp @@ -18,12 +18,13 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ page import="java.io.File" %> +<%@ page import="java.util.*" %> <%@ page import="org.apache.commons.lang.StringUtils" %> <%@ page import="org.owasp.encoder.Encode" %> -<%@ page import="org.wso2.carbon.identity.captcha.util.CaptchaUtil" %> -<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.IdentityManagementEndpointConstants" %> <%@ page import="org.wso2.carbon.identity.application.authentication.endpoint.util.AuthenticationEndpointUtil" %> -<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.IdentityManagementServiceUtil" %> +<%@ page import="org.wso2.carbon.identity.captcha.util.CaptchaUtil" %> +<%@ page import="org.wso2.carbon.identity.core.util.IdentityTenantUtil" %> <%@ page import="org.wso2.carbon.identity.core.util.IdentityUtil" %> <%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.ApplicationDataRetrievalClient" %> <%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.ApplicationDataRetrievalClientException" %> @@ -33,10 +34,12 @@ <%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.model.User" %> <%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.PreferenceRetrievalClient" %> <%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.client.PreferenceRetrievalClientException" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.IdentityManagementEndpointConstants" %> <%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.IdentityManagementEndpointUtil" %> -<%@ page import="org.wso2.carbon.identity.core.util.IdentityTenantUtil" %> -<%@ page import="java.io.File" %> -<%@ page import="java.util.*" %> +<%@ page import="org.wso2.carbon.identity.mgt.endpoint.util.IdentityManagementServiceUtil" %> +<%@ page import="org.wso2.carbon.utils.multitenancy.MultitenantUtils" %> +<%@ page import="static org.wso2.carbon.identity.core.util.IdentityUtil.isEmailUsernameEnabled" %> + <%@ taglib prefix="layout" uri="org.wso2.identity.apps.taglibs.layout.controller" %> <%-- Localization --%> @@ -54,11 +57,17 @@ <% boolean error = IdentityManagementEndpointUtil.getBooleanValue(request.getAttribute("error")); String errorMsg = IdentityManagementEndpointUtil.getStringValue(request.getAttribute("errorMsg")); + boolean isTenantQualifiedUsername = Boolean.parseBoolean(request.getParameter("isTenantQualifiedUsername")); String username = StringUtils.isNotEmpty(request.getParameter("username")) ? Encode.forHtmlAttribute(request.getParameter("username")) : ""; + if (isTenantQualifiedUsername) { + tenantDomain = MultitenantUtils.getTenantDomain(username); + username = MultitenantUtils.getTenantAwareUsername(username); + } boolean isSaaSApp = Boolean.parseBoolean(request.getParameter("isSaaSApp")); String sp = Encode.forJava(request.getParameter("sp")); + String spId = Encode.forJava(request.getParameter("spId")); if (StringUtils.isBlank(tenantDomain)) { tenantDomain = IdentityManagementEndpointConstants.SUPER_TENANT; @@ -114,6 +123,9 @@ isEmailNotificationEnabled = Boolean.parseBoolean(application.getInitParameter( IdentityManagementEndpointConstants.ConfigConstants.ENABLE_EMAIL_NOTIFICATION)); + boolean isSmsOTPEnabled = false; + isSmsOTPEnabled = Boolean.parseBoolean("true"); // todo:RNN: This needs to be read from the relevant place. Tenant preference is tracked by isSMSOTPBasedPasswordRecoveryEnabledByTenant variable + boolean reCaptchaEnabled = false; if (request.getAttribute("reCaptcha") != null && @@ -122,14 +134,16 @@ } Boolean isQuestionBasedPasswordRecoveryEnabledByTenant = false; - Boolean isNotificationBasedPasswordRecoveryEnabledByTenant = false; + Boolean isSMSOTPBasedPasswordRecoveryEnabledByTenant = false; + Boolean isEmailLinkBasedPasswordRecoveryEnabledByTenant = false; Boolean isMultiAttributeLoginEnabledInTenant = false; String allowedAttributes = null; try { PreferenceRetrievalClient preferenceRetrievalClient = new PreferenceRetrievalClient(); isQuestionBasedPasswordRecoveryEnabledByTenant = preferenceRetrievalClient.checkQuestionBasedPasswordRecovery(tenantDomain) && - Boolean.parseBoolean(IdentityUtil.getProperty("Connectors.ChallengeQuestions.Enabled")); - isNotificationBasedPasswordRecoveryEnabledByTenant = preferenceRetrievalClient.checkNotificationBasedPasswordRecovery(tenantDomain); + Boolean.parseBoolean(IdentityUtil.getProperty("Connectors.ChallengeQuestions.Enabled")); + isEmailLinkBasedPasswordRecoveryEnabledByTenant = preferenceRetrievalClient.checkEmailLinkBasedPasswordRecovery(tenantDomain); + isSMSOTPBasedPasswordRecoveryEnabledByTenant = preferenceRetrievalClient.checkSMSOTPBasedPasswordRecovery(tenantDomain); isMultiAttributeLoginEnabledInTenant = preferenceRetrievalClient.checkMultiAttributeLogin(tenantDomain); allowedAttributes = preferenceRetrievalClient.checkMultiAttributeLoginProperty(tenantDomain); } catch (PreferenceRetrievalClientException e) { @@ -143,11 +157,21 @@ request.getRequestDispatcher("error.jsp").forward(request, response); return; } + Boolean isEmailRecoveryAvailable = isEmailNotificationEnabled && isEmailLinkBasedPasswordRecoveryEnabledByTenant; + Boolean isSMSRecoveryAvailable = isSmsOTPEnabled && isSMSOTPBasedPasswordRecoveryEnabledByTenant; + String emailUsernameEnable = application.getInitParameter("EnableEmailUserName"); + Boolean isEmailUsernameEnabled = false; String usernameLabel = "Username"; - if (isMultiAttributeLoginEnabledInTenant) { + String usernamePlaceHolder = "Enter.your.username.here"; + + if (StringUtils.isNotBlank(emailUsernameEnable) && Boolean.parseBoolean(emailUsernameEnable)) { + usernameLabel = "email.username"; + usernamePlaceHolder = "enter.your.email"; + } else if (isMultiAttributeLoginEnabledInTenant) { if (allowedAttributes != null) { usernameLabel = getUsernameLabel(recoveryResourceBundle, allowedAttributes); + usernamePlaceHolder = "Enter.your.identifier"; } } %> @@ -220,21 +244,18 @@ } %> <% - if (StringUtils.isNotEmpty(username) && !error) { + if (StringUtils.isNotEmpty(username) && !error) { %> +
+ <%=i18n(recoveryResourceBundle, customText, "password.recovery.body")%> +
- <% - if (isEmailNotificationEnabled && isNotificationBasedPasswordRecoveryEnabledByTenant - && !isQuestionBasedPasswordRecoveryEnabledByTenant) { - - %> -
+ <% if (Boolean.parseBoolean(request.getParameter("isMultiRecoveryOptionsAvailable"))) { %> +
+ <% + String baseUrl = ServiceURLBuilder.create().addPath("/accountrecoveryendpoint/recoveraccountrouter.do").build().getRelativePublicURL(); + String multiOptionPathWithQuery = request.getParameter("urlQuery") + "&username=" + request.getParameter("username"); + org.apache.logging.log4j.LogManager.getLogger().error(request.getParameter("username")); + %> + > + <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "choose.other.option")%> + +
+ <% } %>
From f884dc59831374091ccfe785f32054fe9a0bcec7 Mon Sep 17 00:00:00 2001 From: rushannanayakkara Date: Mon, 27 May 2024 07:17:01 +0530 Subject: [PATCH 06/29] Add otp resend success message --- .../mgt/recovery/endpoint/i18n/Resources.properties | 1 + .../mgt/recovery/endpoint/i18n/Resources_de_DE.properties | 1 + .../mgt/recovery/endpoint/i18n/Resources_es_ES.properties | 1 + .../mgt/recovery/endpoint/i18n/Resources_fr_FR.properties | 1 + .../mgt/recovery/endpoint/i18n/Resources_ja_JP.properties | 1 + .../mgt/recovery/endpoint/i18n/Resources_pt_BR.properties | 1 + .../mgt/recovery/endpoint/i18n/Resources_pt_PT.properties | 1 + .../mgt/recovery/endpoint/i18n/Resources_zh_CN.properties | 1 + .../src/main/webapp/password-recovery-otp.jsp | 1 + .../apps/recovery-portal/src/main/webapp/sms-otp.jsp | 7 +++++++ 10 files changed, 16 insertions(+) diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties index 6e5bce6ba1d..2352983c099 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties @@ -298,6 +298,7 @@ enter.your.email=Enter your email enter.your.username=Enter your username error.enter.code=Please enter the code! choose.other.option=Choose a different option +resend.code.success=A new OTP is sent to your mobile. # Errors error.occurred=Error Occurred diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties index 33b7df54c26..9472adb15f0 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties @@ -270,6 +270,7 @@ enter.your.email=Geben sie ihre E-Mail Adresse ein enter.your.username=Geben Sie Ihren Benutzernamen ein error.enter.code=Bitte geben Sie den Code ein! choose.other.option=Wählen Sie eine andere Option +resend.code.success=Ein neues OTP wurde an Ihr Handy gesendet. # Errors error.occurred=Ein Fehler ist aufgetreten diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties index cfd90c15532..11145c0de36 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties @@ -270,6 +270,7 @@ enter.your.email=Introduce tu correo electrónico enter.your.username=Ingrese su nombre de usuario error.enter.code=¡Ingrese el código! choose.other.option=Elija una opción diferente +resend.code.success=Se ha enviado un nuevo OTP a tu móvil. # Errors error.occurred=Se produjo un error diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties index b6d7c8c4c9c..b8deb41a128 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties @@ -271,6 +271,7 @@ enter.your.email=Entrer votre Email enter.your.username=Entrez votre nom d'utilisateur error.enter.code=Veuillez entrer le code ! choose.other.option=Choisissez une autre option +resend.code.success=Un nouveau OTP a été envoyé sur votre mobile. # Errors error.occurred=Erreur est survenue diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties index f3091d7df15..f153071b3c0 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties @@ -266,6 +266,7 @@ enter.your.email=メールアドレスを入力 enter.your.username=ユーザー名を入力して下さい error.enter.code=コードを入力してください! choose.other.option=別のオプションを選択 +resend.code.success=新しいOTPがあなたの携帯電話に送信されました。 ## Errors error.occurred=エラーが発生しました diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties index 778dccbf680..c28c292aad8 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties @@ -270,6 +270,7 @@ enter.your.email=Digite seu e-mail enter.your.username=Digite seu nome de usuário error.enter.code=Por favor, digite o código! choose.other.option=Escolha uma opção diferente +resend.code.success=Um novo OTP foi enviado para o seu celular. # Errors error.occurred=Ocorreu um erro diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties index 0a6963771d1..d590d87c094 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties @@ -270,6 +270,7 @@ enter.your.email=Digite seu e-mail enter.your.username=Entre com seu nome de usuário error.enter.code=Por favor, digite o código! choose.other.option=Escolha uma opção diferente +resend.code.success=Um novo OTP foi enviado para o seu telemóvel. # Errors error.occurred=Ocorreu um erro diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties index 6e220b4beb7..dc4cedff461 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties @@ -266,6 +266,7 @@ enter.your.email=输入你的电子邮箱 enter.your.username=输入你的用户名 error.enter.code=请输入代码 choose.other.option=选择其他选项 +resend.code.success=新的OTP已发送到您的手机。 ## Errors error.occurred=错误发生 diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp index 0f41ba1647f..be226a52868 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp @@ -240,6 +240,7 @@ * happens after the resend operation. */ request.setAttribute("resendCode", resendResponse.getResendCode()); request.setAttribute("screenValue", screenValue); + request.setAttribute("resendSuccess", true); request.setAttribute("flowConfirmationCode", resendResponse.getFlowConfirmationCode()); } catch (ApiException e) { if (!StringUtils.isBlank(username)) { diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp index 34e0f588250..f92c49f0ec3 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp @@ -142,6 +142,13 @@
<% } %> + <% + if ("true".equals(String.valueOf((Object)request.getAttribute("resendSuccess")))) { + %> +
<%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "resend.code.success")%>
+ <% + } + %>
From 5d09f520c829194a29b59b63ad32672d0b6057ce Mon Sep 17 00:00:00 2001 From: rushannanayakkara Date: Thu, 30 May 2024 09:28:21 +0530 Subject: [PATCH 07/29] bug fixes --- .../account-recovery/options/sms-recovery/sms-recovery.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.tsx b/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.tsx index a1d1aa82145..f6ab7cda4bd 100644 --- a/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.tsx +++ b/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.tsx @@ -253,9 +253,7 @@ export const SMSRecovery: React.FunctionComponent = ( size="mini" twoTone={ true } transparent={ true } - square={ true } - rounded={ true } - relaxed={ true } + shape={ "rounded" } /> @@ -264,7 +262,7 @@ export const SMSRecovery: React.FunctionComponent = ( } { - mobile || mobile !== "" ? + mobile ? t("myAccount:components.accountRecovery.SMSRecovery.descriptions.update", { mobile: mobile ? maskMobile(mobile) : "" }) : ( From 533f221c551e770c5386ecadb20e36d8cac4de8d Mon Sep 17 00:00:00 2001 From: rushannanayakkara Date: Wed, 5 Jun 2024 07:14:44 +0530 Subject: [PATCH 08/29] rename beta tag config --- .../password-recovery-form/password-recovery-form.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/features/admin.server-configurations.v1/forms/password-recovery-form/password-recovery-form.tsx b/features/admin.server-configurations.v1/forms/password-recovery-form/password-recovery-form.tsx index 578ebc8d011..c916f3e33bb 100644 --- a/features/admin.server-configurations.v1/forms/password-recovery-form/password-recovery-form.tsx +++ b/features/admin.server-configurations.v1/forms/password-recovery-form/password-recovery-form.tsx @@ -182,8 +182,8 @@ export const PasswordRecoveryConfigurationForm: FunctionComponent(false); const [ isLowerCaseEnabled, setIsLowerCaseEnabled ] = useState(false); const [ isNumericEnabled, setIsNumericEnabled ] = useState(false); - const showSmsOtpPasswordRecoveryBetaChip: boolean = - useSelector((state: AppState) => state?.config?.ui?.showSmsOtpPasswordRecoveryBetaChip); + const showSmsOtpPwdRecoveryFeatureStatusChip: boolean = + useSelector((state: AppState) => state?.config?.ui?.showSmsOtpPwdRecoveryFeatureStatusChip); /** * Flattens and resolved form initial values and field metadata. @@ -516,7 +516,7 @@ export const PasswordRecoveryConfigurationForm: FunctionComponent) @@ -584,7 +584,7 @@ export const PasswordRecoveryConfigurationForm: FunctionComponent) @@ -689,7 +689,7 @@ export const PasswordRecoveryConfigurationForm: FunctionComponent) From 79dd32092d59a6f606696c89bf086a8725590290 Mon Sep 17 00:00:00 2001 From: rushannanayakkara Date: Fri, 7 Jun 2024 07:42:27 +0530 Subject: [PATCH 09/29] bug fixes --- .../recovery-portal/src/main/webapp/password-recovery-otp.jsp | 1 + .../apps/recovery-portal/src/main/webapp/sms-otp.jsp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp index be226a52868..d48712c6ac8 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp @@ -289,6 +289,7 @@ request.setAttribute("isAuthFailure","true"); request.setAttribute("authFailureMsg", "authentication.fail.message"); request.setAttribute("resendCode", Encode.forHtmlAttribute(request.getParameter("resendCode"))); + request.setAttribute("screenValue", Encode.forHtmlAttribute(request.getParameter("screenValue"))); request.setAttribute("flowConfirmationCode", Encode.forHtmlAttribute(request.getParameter("flowConfirmationCode"))); request.getRequestDispatcher("sms-otp.jsp").forward(request, response); return; diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp index f92c49f0ec3..067db316beb 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp @@ -296,7 +296,6 @@ <% String baseUrl = ServiceURLBuilder.create().addPath("/accountrecoveryendpoint/recoveraccountrouter.do").build().getRelativePublicURL(); String multiOptionPathWithQuery = request.getParameter("urlQuery") + "&username=" + request.getParameter("username"); - org.apache.logging.log4j.LogManager.getLogger().error(request.getParameter("username")); %> > From 92391d27c88da1fa44eb80d1119749f39fbb258d Mon Sep 17 00:00:00 2001 From: rushannanayakkara Date: Fri, 7 Jun 2024 10:49:15 +0530 Subject: [PATCH 10/29] Addressing review comments --- .../account-recovery/account-recovery.tsx | 5 +- .../account-recovery/options/index.ts | 2 +- .../options/sms-recovery/sms-recovery.scss | 22 ++++ .../options/sms-recovery/sms-recovery.tsx | 5 +- apps/myaccount/src/configs/ui.ts | 2 +- .../src/extensions/configs/common.ts | 2 +- .../src/extensions/configs/models/common.ts | 2 +- .../custom-text-preference-constants.ts | 2 +- features/admin.core.v1/configs/app.ts | 6 +- .../governance-connector-constants.ts | 2 +- .../forms/connector-form-factory.tsx | 2 +- .../forms/index.ts | 2 +- .../password-recovery-form.scss | 19 ++- .../pages/connector-edit-page.tsx | 7 +- .../settings/edit-connector.tsx | 2 +- .../endpoint/i18n/Resources.properties | 2 +- .../endpoint/i18n/Resources_de_DE.properties | 2 +- .../endpoint/i18n/Resources_es_ES.properties | 2 +- .../endpoint/i18n/Resources_fr_FR.properties | 2 +- .../endpoint/i18n/Resources_ja_JP.properties | 2 +- .../endpoint/i18n/Resources_pt_BR.properties | 2 +- .../endpoint/i18n/Resources_pt_PT.properties | 2 +- .../endpoint/i18n/Resources_zh_CN.properties | 2 +- .../src/main/webapp/password-recovery-otp.jsp | 35 ++---- .../password-recovery-tenant-request.jsp | 2 +- .../password-recovery-username-request.jsp | 2 +- .../password-recovery-with-claims-options.jsp | 2 +- .../webapp/password-recovery-with-claims.jsp | 2 +- .../src/main/webapp/password-recovery.jsp | 104 +++++++++------- .../main/webapp/password-reset-complete.jsp | 2 +- .../src/main/webapp/recovery.jsp | 13 +- .../src/main/webapp/sms-otp.jsp | 114 +++++++++++++----- .../resources/web.xml.j2 | 2 +- .../src/models/namespaces/myaccount-ns.ts | 2 +- .../translations/de-DE/portals/myaccount.ts | 2 +- .../translations/en-US/portals/myaccount.ts | 2 +- .../translations/es-ES/portals/myaccount.ts | 2 +- .../translations/fr-FR/portals/myaccount.ts | 2 +- .../translations/ja-JP/portals/myaccount.ts | 2 +- .../translations/pt-BR/portals/myaccount.ts | 2 +- .../translations/pt-PT/portals/myaccount.ts | 2 +- .../translations/si-LK/portals/myaccount.ts | 2 +- .../translations/ta-IN/portals/myaccount.ts | 2 +- .../translations/zh-CN/portals/myaccount.ts | 2 +- 44 files changed, 252 insertions(+), 146 deletions(-) diff --git a/apps/myaccount/src/components/account-recovery/account-recovery.tsx b/apps/myaccount/src/components/account-recovery/account-recovery.tsx index 21b905bef88..947d0376dac 100644 --- a/apps/myaccount/src/components/account-recovery/account-recovery.tsx +++ b/apps/myaccount/src/components/account-recovery/account-recovery.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2019-2023, WSO2 LLC. (https://www.wso2.com). + * Copyright (c) 2019-2024, WSO2 LLC. (https://www.wso2.com). * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except @@ -67,7 +67,8 @@ export const AccountRecoveryComponent: FunctionComponent = const RECOVERY_USERNAME_NOTIFICATION: string = "Recovery.Notification.Username.Enable"; const [ isQsRecoveryEnabled, setIsQsRecoveryEnabled ] = useState(false); const [ isNotificationRecoveryEnabled, setIsNotificationRecoveryEnabled ] = useState(false); - const [ isNotificationRecoveryEmailLinkEnabled, setIsNotificationRecoveryEmailLinkEnabled ] = useState(false); + const [ isNotificationRecoveryEmailLinkEnabled, setIsNotificationRecoveryEmailLinkEnabled ] = + useState(false); const [ isNotificationRecoverySMSOTPEnabled, setIsNotificationRecoverySMSOTPEnabled ] = useState(false); const [ isUsernameRecoveryEnabled, setIsUsernameRecoveryEnabled ] = useState(false); const [ isAccountRecoveryDetailsLoading, setIsAccountRecoveryDetailsLoading ] = useState(false); diff --git a/apps/myaccount/src/components/account-recovery/options/index.ts b/apps/myaccount/src/components/account-recovery/options/index.ts index f6ec6f783ba..2d5e8147700 100644 --- a/apps/myaccount/src/components/account-recovery/options/index.ts +++ b/apps/myaccount/src/components/account-recovery/options/index.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2019, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * Copyright (c) 2019-2024, WSO2 LLC. (https://www.wso2.com). * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except diff --git a/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.scss b/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.scss index 35ab29e5909..3542a91b4ff 100644 --- a/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.scss +++ b/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.scss @@ -1,3 +1,21 @@ +/** + * Copyright (c) 2024, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + form > div.oxygen-text-field > div { width: 200px !important; } @@ -14,3 +32,7 @@ div.description { form > div.inline.fields > button { margin-top: 8px; } + +form > div.inline.fields > button.ui.small.primary.button { + margin-right: 1em; +} diff --git a/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.tsx b/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.tsx index f6ab7cda4bd..0b3b1c071bf 100644 --- a/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.tsx +++ b/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.tsx @@ -254,6 +254,7 @@ export const SMSRecovery: React.FunctionComponent = ( twoTone={ true } transparent={ true } shape={ "rounded" } + relaxed={ true } /> @@ -277,7 +278,7 @@ export const SMSRecovery: React.FunctionComponent = ( - { (mobile || mobile !== "") && ( + { (mobile) && ( enableEditMobile ? ( = ( render={ ({ handleSubmit }: FormRenderProps) => {return ( { - (mobile || mobile !== "") && ( + (mobile) && ( = if ( serverConfigurationConfig.connectorToggleName[ connector?.name ] && - serverConfigurationConfig.autoEnableConnectorToggleProperty && - // Recovery connector does not use a connector property. If either email link or - // sms-otp recovery is enabled, the connector is considered to be enabled. - connectorId !== ServerConfigurationsConstants.ACCOUNT_RECOVERY_CONNECTOR_ID + serverConfigurationConfig.autoEnableConnectorToggleProperty ) { data.properties.push({ name: GovernanceConnectorUtils.decodeConnectorPropertyName( diff --git a/features/admin.server-configurations.v1/settings/edit-connector.tsx b/features/admin.server-configurations.v1/settings/edit-connector.tsx index 3996bc6312f..dd57df4fefd 100644 --- a/features/admin.server-configurations.v1/settings/edit-connector.tsx +++ b/features/admin.server-configurations.v1/settings/edit-connector.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2023, WSO2 LLC. (https://www.wso2.com). + * Copyright (c) 2021-2024, WSO2 LLC. (https://www.wso2.com). * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties index 2352983c099..d867f4addf3 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2018-2023, WSO2 LLC. (https://www.wso2.com). +# Copyright (c) 2018-2024, WSO2 LLC. (https://www.wso2.com). # # WSO2 LLC. licenses this file to you under the Apache License, # Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties index 9472adb15f0..d9867bb9b12 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2023, WSO2 LLC. (https://www.wso2.org) +# Copyright (c) 2024, WSO2 LLC. (https://www.wso2.org) # # WSO2 LLC. licenses this file to you under the Apache License, # Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties index 11145c0de36..6c84f1557e8 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2023, WSO2 LLC. (https://www.wso2.org) +# Copyright (c) 2024, WSO2 LLC. (https://www.wso2.org) # # WSO2 LLC. licenses this file to you under the Apache License, # Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties index b8deb41a128..828d713c25c 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2018, WSO2 LLC. (https://www.wso2.com) +# Copyright (c) 2018-2024, WSO2 LLC. (https://www.wso2.com) # # WSO2 LLC. licenses this file to you under the Apache License, # Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties index f153071b3c0..773487f6c4f 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2023, WSO2 LLC. (https://www.wso2.org). +# Copyright (c) 2024, WSO2 LLC. (https://www.wso2.org). # # WSO2 LLC. licenses this file to you under the Apache License, # Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties index c28c292aad8..0381de3d05c 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com) +# Copyright (c) 2024, WSO2 LLC. (https://www.wso2.com) # # WSO2 LLC. licenses this file to you under the Apache License, # Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties index d590d87c094..6faf01535c4 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com) +# Copyright (c) 2024, WSO2 LLC. (https://www.wso2.com) # # WSO2 LLC. licenses this file to you under the Apache License, # Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties index dc4cedff461..4d5af27cdbf 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2023, WSO2 LLC. (https://www.wso2.org). +# Copyright (c) 2024, WSO2 LLC. (https://www.wso2.org). # # WSO2 LLC. licenses this file to you under the Apache License, # Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp index d48712c6ac8..4ba76ce2ae5 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-otp.jsp @@ -128,9 +128,12 @@ <% final String USERNAME_CLAIM_URI_FOR_TENANT = "http://wso2.org/claims/username"; final RecoveryApiV2 recoveryApiV2 = new RecoveryApiV2(); - final String username = IdentityManagementEndpointUtil.getStringValue(request.getAttribute("username")); - - String recoveryStage = Encode.forHtmlAttribute(request.getParameter("recoveryStage")); + + String username = IdentityManagementEndpointUtil.getStringValue(request.getAttribute("username")); + if (StringUtils.isBlank(username)) { + username = request.getParameter("username"); + } + String recoveryStage = request.getParameter("recoveryStage"); if (RecoveryStage.INITIATE.equalsValue(recoveryStage)) { // if otp is supported by a new channel (eg: email) update this value assignment. null means unsupported. @@ -198,7 +201,7 @@ * Manage user don't have phone number set up in the account. */ if (StringUtils.isBlank(channelId)) { - String recoveryPageQueryString = Encode.forHtmlAttribute(request.getParameter("urlQuery")); + String recoveryPageQueryString = request.getParameter("urlQuery"); request.setAttribute("error", true); request.setAttribute("errorMsg", "Channel.unavailable.for.user"); String redirectString = "recoveraccountrouter.do?" + recoveryPageQueryString; @@ -223,8 +226,7 @@ // Redirect to enter the OTP. request.getRequestDispatcher("sms-otp.jsp").forward(request, response); } else if (RecoveryStage.RESEND.equalsValue(recoveryStage)) { - String resendCode = Encode.forHtmlAttribute(request.getParameter("resendCode")); - String screenValue = Encode.forHtmlAttribute(request.getParameter("screenValue")); + String resendCode = request.getParameter("resendCode"); // Sending resend request try { Map requestHeaders = new HashedMap(); @@ -239,13 +241,11 @@ /** Resend code re-attached to the reqeust to avoid value being missed after the page refresh that * happens after the resend operation. */ request.setAttribute("resendCode", resendResponse.getResendCode()); - request.setAttribute("screenValue", screenValue); request.setAttribute("resendSuccess", true); request.setAttribute("flowConfirmationCode", resendResponse.getFlowConfirmationCode()); + request.setAttribute("isMultiRecoveryOptionsAvailable", + request.getParameter("isMultiRecoveryOptionsAvailable")); } catch (ApiException e) { - if (!StringUtils.isBlank(username)) { - request.setAttribute("username", username); - } /** Status code 406 is used for invalid/expired channel id/recovery code. Other error are considered unexpected and redirected to the error page. */ if (e.getCode() != 406) { @@ -256,13 +256,11 @@ request.setAttribute("isResendFailure","true"); request.setAttribute("resendFailureMsg", "resend.fail.message"); request.setAttribute("resendCode", resendCode); - request.setAttribute("screenValue", screenValue); - request.setAttribute("flowConfirmationCode", Encode.forHtmlAttribute(request.getParameter("flowConfirmationCode"))); } request.getRequestDispatcher("sms-otp.jsp").forward(request, response); } else if (RecoveryStage.CONFIRM.equalsValue(recoveryStage)) { - String flowConfirmationCode = Encode.forHtmlAttribute(request.getParameter("flowConfirmationCode")); - String OTPcode = Encode.forHtmlAttribute(request.getParameter("OTPcode")); + String flowConfirmationCode = request.getParameter("flowConfirmationCode"); + String OTPcode = request.getParameter("OTPcode"); try { Map requestHeaders = new HashedMap(); if (request.getParameter("g-recaptcha-response") != null) { @@ -276,9 +274,6 @@ recoveryApiV2.confirmPasswordRecovery(confirmRequest, tenantDomain, requestHeaders); request.setAttribute("resetCode", confirmResponse.getResetCode()); } catch (ApiException e) { - if (!StringUtils.isBlank(username)) { - request.setAttribute("username", username); - } /** Status code 406 is used for invalid/expired channel id/recovery code. Other error are considered unexpected and redirected to the error page. */ if (e.getCode() != 406) { @@ -288,17 +283,13 @@ } request.setAttribute("isAuthFailure","true"); request.setAttribute("authFailureMsg", "authentication.fail.message"); - request.setAttribute("resendCode", Encode.forHtmlAttribute(request.getParameter("resendCode"))); - request.setAttribute("screenValue", Encode.forHtmlAttribute(request.getParameter("screenValue"))); - request.setAttribute("flowConfirmationCode", Encode.forHtmlAttribute(request.getParameter("flowConfirmationCode"))); request.getRequestDispatcher("sms-otp.jsp").forward(request, response); return; } - request.setAttribute("spId", Encode.forHtmlAttribute(request.getParameter("spId"))); + request.setAttribute("spId", request.getParameter("spId")); request.getRequestDispatcher("password-reset.jsp").forward(request, response); } else if (RecoveryStage.RESET.equalsValue(recoveryStage)) { request.setAttribute("useRecoveryV2API", "true"); - request.setAttribute("spId", Encode.forHtmlAttribute(request.getParameter("spId"))); request.getRequestDispatcher("password-reset-complete.jsp").forward(request, response); } else { request.setAttribute("errorMsg", "Invalid password recovery stage."); diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-tenant-request.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-tenant-request.jsp index b22cb91b5aa..89894f714ef 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-tenant-request.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-tenant-request.jsp @@ -1,5 +1,5 @@ <%-- - ~ Copyright (c) 2020-2023, WSO2 LLC. (https://www.wso2.com). + ~ Copyright (c) 2020-2024, WSO2 LLC. (https://www.wso2.com). ~ ~ WSO2 LLC. licenses this file to you under the Apache License, ~ Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-username-request.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-username-request.jsp index 5dedb9cc0fd..4ab70794f5d 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-username-request.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-username-request.jsp @@ -1,5 +1,5 @@ <%-- - ~ Copyright (c) 2018-2023, WSO2 LLC. (https://www.wso2.com). + ~ Copyright (c) 2018-2024, WSO2 LLC. (https://www.wso2.com). ~ ~ WSO2 LLC. licenses this file to you under the Apache License, ~ Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims-options.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims-options.jsp index bffed04e94b..4d25e04c60f 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims-options.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims-options.jsp @@ -1,5 +1,5 @@ <%-- - ~ Copyright (c) 2020-2023, WSO2 LLC. (https://www.wso2.com). + ~ Copyright (c) 2020-2024, WSO2 LLC. (https://www.wso2.com). ~ ~ WSO2 LLC. licenses this file to you under the Apache License, ~ Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims.jsp index 9ebfcaed75a..8d80b5322f0 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery-with-claims.jsp @@ -1,5 +1,5 @@ <%-- - ~ Copyright (c) 2020-2023, WSO2 LLC. (https://www.wso2.com). + ~ Copyright (c) 2020-2024, WSO2 LLC. (https://www.wso2.com). ~ ~ WSO2 LLC. licenses this file to you under the Apache License, ~ Version 2.0 (the "License"); you may not use this file except diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery.jsp index 79e1d6298ee..ae6525a1249 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-recovery.jsp @@ -55,6 +55,9 @@ <% + final String SMSOTP = "SMSOTP"; + final String EMAIL = "EMAIL"; + final String SECURITY_QUESTIONS = "SECURITY_QUESTIONS"; boolean error = IdentityManagementEndpointUtil.getBooleanValue(request.getAttribute("error")); String errorMsg = IdentityManagementEndpointUtil.getStringValue(request.getAttribute("errorMsg")); boolean isTenantQualifiedUsername = Boolean.parseBoolean(request.getParameter("isTenantQualifiedUsername")); @@ -66,6 +69,10 @@ username = MultitenantUtils.getTenantAwareUsername(username); } boolean isSaaSApp = Boolean.parseBoolean(request.getParameter("isSaaSApp")); + String selectedOption= EMAIL; + if (SMSOTP.equalsIgnoreCase(request.getParameter("selectedOption"))) { + selectedOption = SMSOTP; + } String sp = Encode.forJava(request.getParameter("sp")); String spId = Encode.forJava(request.getParameter("spId")); @@ -123,9 +130,6 @@ isEmailNotificationEnabled = Boolean.parseBoolean(application.getInitParameter( IdentityManagementEndpointConstants.ConfigConstants.ENABLE_EMAIL_NOTIFICATION)); - boolean isSmsOTPEnabled = false; - isSmsOTPEnabled = Boolean.parseBoolean("true"); // todo:RNN: This needs to be read from the relevant place. Tenant preference is tracked by isSMSOTPBasedPasswordRecoveryEnabledByTenant variable - boolean reCaptchaEnabled = false; if (request.getAttribute("reCaptcha") != null && @@ -134,16 +138,18 @@ } Boolean isQuestionBasedPasswordRecoveryEnabledByTenant = false; - Boolean isSMSOTPBasedPasswordRecoveryEnabledByTenant = false; + Boolean isSMSRecoveryAvailable = false; Boolean isEmailLinkBasedPasswordRecoveryEnabledByTenant = false; Boolean isMultiAttributeLoginEnabledInTenant = false; String allowedAttributes = null; try { PreferenceRetrievalClient preferenceRetrievalClient = new PreferenceRetrievalClient(); - isQuestionBasedPasswordRecoveryEnabledByTenant = preferenceRetrievalClient.checkQuestionBasedPasswordRecovery(tenantDomain) && - Boolean.parseBoolean(IdentityUtil.getProperty("Connectors.ChallengeQuestions.Enabled")); - isEmailLinkBasedPasswordRecoveryEnabledByTenant = preferenceRetrievalClient.checkEmailLinkBasedPasswordRecovery(tenantDomain); - isSMSOTPBasedPasswordRecoveryEnabledByTenant = preferenceRetrievalClient.checkSMSOTPBasedPasswordRecovery(tenantDomain); + isQuestionBasedPasswordRecoveryEnabledByTenant = + preferenceRetrievalClient.checkQuestionBasedPasswordRecovery(tenantDomain) && + Boolean.parseBoolean(IdentityUtil.getProperty("Connectors.ChallengeQuestions.Enabled")); + isEmailLinkBasedPasswordRecoveryEnabledByTenant = + preferenceRetrievalClient.checkEmailLinkBasedPasswordRecovery(tenantDomain); + isSMSRecoveryAvailable = preferenceRetrievalClient.checkSMSOTPBasedPasswordRecovery(tenantDomain); isMultiAttributeLoginEnabledInTenant = preferenceRetrievalClient.checkMultiAttributeLogin(tenantDomain); allowedAttributes = preferenceRetrievalClient.checkMultiAttributeLoginProperty(tenantDomain); } catch (PreferenceRetrievalClientException e) { @@ -158,7 +164,6 @@ return; } Boolean isEmailRecoveryAvailable = isEmailNotificationEnabled && isEmailLinkBasedPasswordRecoveryEnabledByTenant; - Boolean isSMSRecoveryAvailable = isSmsOTPEnabled && isSMSOTPBasedPasswordRecoveryEnabledByTenant; String emailUsernameEnable = application.getInitParameter("EnableEmailUserName"); Boolean isEmailUsernameEnabled = false; @@ -208,7 +213,8 @@ %> - + <%-- product-title --%> <% @@ -255,7 +261,8 @@
- + <% } %> @@ -286,13 +294,15 @@ <%=i18n(recoveryResourceBundle, customText, usernameLabel) %>
- <% String identifierPlaceholder=i18n(recoveryResourceBundle, customText, "password.recovery.identifier.input.placeholder" , "" , false); %> + <% String identifierPlaceholder=i18n(recoveryResourceBundle, customText, + "password.recovery.identifier.input.placeholder" , "" , false); %> <% if (StringUtils.isNotBlank(identifierPlaceholder)) { %> - + <% } else { %> - + <% } %> @@ -324,19 +335,23 @@
<% - Boolean multipleRecoveryOptionsAvailable = isEmailRecoveryAvailable && isSMSRecoveryAvailable - || isEmailRecoveryAvailable && isQuestionBasedPasswordRecoveryEnabledByTenant - || isSMSRecoveryAvailable && isQuestionBasedPasswordRecoveryEnabledByTenant; + Boolean multipleRecoveryOptionsAvailable = + (isEmailRecoveryAvailable && isSMSRecoveryAvailable) + || (isEmailRecoveryAvailable && isQuestionBasedPasswordRecoveryEnabledByTenant) + || (isSMSRecoveryAvailable && isQuestionBasedPasswordRecoveryEnabledByTenant); if (multipleRecoveryOptionsAvailable) { %> -
+
<% if (isEmailRecoveryAvailable) { %>
- -
@@ -346,8 +361,10 @@ %>
- -
<% @@ -356,8 +373,11 @@ %>
- -
@@ -366,11 +386,11 @@ %>
<% } else if (isEmailRecoveryAvailable){ %> - + <% } else if (isSMSRecoveryAvailable){ %> - + <% } else { %> - + <% } %> @@ -378,7 +398,8 @@ - + <% String callback = request.getParameter("callback"); @@ -419,15 +440,16 @@
<% String submitButtoni18nText = multipleRecoveryOptionsAvailable? "Submit" : - ( isEmailRecoveryAvailable? "password.recovery.button.email.link" : - ( isQuestionBasedPasswordRecoveryEnabledByTenant? "Recover.with.question" : - ( isSMSRecoveryAvailable ? "password.recovery.button.smsotp" : - "Submit"))); + ( isEmailRecoveryAvailable? "password.recovery.button.email.link" : + ( isQuestionBasedPasswordRecoveryEnabledByTenant? "Recover.with.question" : + ( isSMSRecoveryAvailable ? "password.recovery.button.smsotp" : + "Submit"))); %>
@@ -501,13 +523,13 @@ const submitButton = $("#recoverySubmit"); submitButton.addClass("loading").attr("disabled", true); - if (!validateForm()) { + if (!validateForm()) { submitButton.removeClass("loading").attr("disabled", false); return false; - } + } - return true; + return true; } function validateForm() { @@ -540,7 +562,7 @@ "Please.enter.valid.email")%>"; const emptyUsernameErrorMsg = "<%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "Please.enter.your.username")%>"; - let errorMsgContent = document.getElementById("error-message"); + let errorMsgContent = document.getElementById("error-message"); let userName = document.getElementById("username"); const usernameUserInput = document.getElementById("usernameUserInput"); @@ -560,7 +582,7 @@ <% if (StringUtils.equals(tenantDomain, IdentityManagementEndpointConstants.SUPER_TENANT)) { %> - emailRegex = /^(?=.{3,50}$)[\u00C0-\u00FFA-Za-z0-9_-]+(\.[\u00C0-\u00FFA-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,10})$/; + emailRegex = /^(?=.{3,50}$)[\u00C0-\u00FFA-Za-z0-9_-]+(\.[\u00C0-\u00FFA-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,10})$/; <% } %> diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-reset-complete.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-reset-complete.jsp index d01af299f48..508b5b7bd35 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/password-reset-complete.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/password-reset-complete.jsp @@ -354,7 +354,7 @@ <% } %> - <% } else { %> + <% } else { %> <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle,"Back.to.application")%> diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/recovery.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/recovery.jsp index eaf6d8f5a33..710c8b36db2 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/recovery.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/recovery.jsp @@ -1,5 +1,5 @@ <%-- - ~ Copyright (c) 2016-2023, WSO2 LLC. (https://www.wso2.com). + ~ Copyright (c) 2016-2024, WSO2 LLC. (https://www.wso2.com). ~ ~ WSO2 LLC. licenses this file to you under the Apache License, ~ Version 2.0 (the "License"); you may not use this file except @@ -48,7 +48,7 @@ <%-- Include tenant context --%> -<% +<% File usernameResolverFile = new File(getServletContext().getRealPath("extensions/username-resolver.jsp")); if (usernameResolverFile.exists()) { %> @@ -69,7 +69,7 @@ String sessionDataKey = request.getParameter("sessionDataKey"); String confirmationKey = request.getParameter("confirmationKey"); String callback = request.getParameter("callback"); - String spId = Encode.forHtmlAttribute(request.getParameter("spId")); + String spId = request.getParameter("spId"); String userTenantHint = request.getParameter("t"); String applicationAccessUrl = ""; @@ -267,7 +267,12 @@ } else if(IdentityManagementEndpointConstants.PasswordRecoveryOptions.SMSOTP.equals(recoveryOption)) { request.setAttribute("channel", IdentityManagementEndpointConstants.PasswordRecoveryOptions.SMSOTP); request.getRequestDispatcher("password-recovery-otp.jsp").forward(request, response); - } else { + } else if (IdentityManagementEndpointConstants.PasswordRecoveryOptions.SECURITY_QUESTIONS + .equals(recoveryOption)) { + request.setAttribute("callback", callback); + request.getRequestDispatcher("challenge-question-request.jsp?username=" + username).forward(request, + response); + }else { request.setAttribute("error", true); request.setAttribute("errorMsg", IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "Unknown.password.recovery.option")); diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp index 067db316beb..7d783cab803 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp @@ -1,5 +1,5 @@ <%-- -~ Copyright (c) 2022-2024, WSO2 LLC. (https://www.wso2.com). +~ Copyright (c) 2024, WSO2 LLC. (https://www.wso2.com). ~ ~ WSO2 LLC. licenses this file to you under the Apache License, ~ Version 2.0 (the "License"); you may not use this file except @@ -68,9 +68,24 @@ // Exception is caught and ignored. otpLength will be kept as 10 to trigger the full input field. } + String username = request.getParameter("username"); + if (username == null) { + username = (String) request.getAttribute("username"); + } + String urlQuery = request.getParameter("urlQuery"); + if (urlQuery == null) { + urlQuery = (String) request.getAttribute("urlQuery"); + } + String screenValue = request.getParameter("screenValue"); + if (screenValue == null) { + screenValue = (String) request.getAttribute("screenValue"); + } String errorMessage = IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "error"); boolean authenticationFailed = Boolean.parseBoolean((String)request.getAttribute("isAuthFailure")); boolean resendFailed = Boolean.parseBoolean((String)request.getAttribute("isResendFailure")); + boolean isMultiRecoveryOptionsAvailable = + Boolean.parseBoolean(request.getParameter("isMultiRecoveryOptionsAvailable")) || + Boolean.parseBoolean((String)request.getAttribute("isMultiRecoveryOptionsAvailable")); if (authenticationFailed) { if (request.getAttribute("authFailureMsg") != null) { @@ -116,7 +131,8 @@ <% } %> - + <%-- product-title --%> <% @@ -145,35 +161,41 @@ <% if ("true".equals(String.valueOf((Object)request.getAttribute("resendSuccess")))) { %> -
<%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "resend.code.success")%>
+
+ <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "resend.code.success")%> +
<% } %>
- + <% String loginFailed = request.getParameter("authFailure"); if (loginFailed != null && "true".equals(loginFailed)) { String authFailureMsg = request.getParameter("authFailureMsg"); if (authFailureMsg != null && "login.fail.message".equals(authFailureMsg)) { %> -
<%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "error.retry")%> +
+ <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "error.retry")%>
<% } } %>
- <% if (request.getAttribute("screenValue") != null) { %> - + <% if (screenValue != null) { %> + <% } else { %> <% } %> @@ -186,7 +208,8 @@ name="OTPcode" class="form-control" data-testid="recovery-otp-page-segmented-otp-input" - placeholder="<%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "verification.code")%>" + placeholder="<%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, + "verification.code")%>" > <% for (int index = 1; index <= otpLength;) { String previousStringIndex = null; @@ -205,7 +228,8 @@ class="text-center pl-0 pr-0 pt-3 pb-3" id=<%= currentStringIndex %> name=<%= currentStringIndex %> - onkeyup="movetoNext(this, '<%= nextStringIndex %>', '<%= previousStringIndex %>')" + onkeyup="movetoNext(this, '<%= nextStringIndex %>', + '<%= previousStringIndex %>')" tabindex="1" placeholder="·" autofocus @@ -216,18 +240,21 @@
<% } else { %>
- - +
<% } %>
+ + value='<%=Encode.forHtmlAttribute( + (String)request.getAttribute("flowConfirmationCode"))%>'/> + + @@ -252,16 +283,24 @@ request.getParameter("multiOptionURI").contains("backup-code-authenticator")) { %>
@@ -273,33 +312,40 @@ " + value="<%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, + "sms.otp.submit.button")%>" class="ui primary fluid large button" />
<% } else { %> " + value="<%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, + "sms.otp.submit.button")%>" class="ui primary fluid large button"/> <% } %>
- <% if (Boolean.parseBoolean(request.getParameter("isMultiRecoveryOptionsAvailable"))) { %> + <% if (isMultiRecoveryOptionsAvailable) { %>
<% - String baseUrl = ServiceURLBuilder.create().addPath("/accountrecoveryendpoint/recoveraccountrouter.do").build().getRelativePublicURL(); - String multiOptionPathWithQuery = request.getParameter("urlQuery") + "&username=" + request.getParameter("username"); + String baseUrl = ServiceURLBuilder.create() + .addPath("/accountrecoveryendpoint/recoveraccountrouter.do").build() + .getRelativePublicURL(); + String multiOptionPathWithQuery = urlQuery + "&username=" + username + + "&selectedOption=SMSOTP"; %> > - <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "choose.other.option")%> + <%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, + "choose.other.option")%>
<% } %> @@ -378,7 +424,7 @@ } // Handle paste events - function handlePaste(e) { + function handlePaste(e) { var clipboardData, value; // Stop data get being pasted into element @@ -397,7 +443,8 @@ } } - document.getElementById('pincode-1') ? document.getElementById('pincode-1').addEventListener('paste', handlePaste) : null; + document.getElementById('pincode-1') ? document.getElementById('pincode-1') + .addEventListener('paste', handlePaste) : null; $(document).ready(function () { $.fn.preventDoubleSubmission = function() { @@ -412,7 +459,8 @@ if (code == "" && isResend == "false") { e.preventDefault(); document.getElementById('alertDiv').innerHTML - = '
<%=IdentityManagementEndpointUtil.i18n(recoveryResourceBundle, "error.enter.code")%>
' + = '
<%=IdentityManagementEndpointUtil + .i18n(recoveryResourceBundle, "error.enter.code")%>
' +''; } else { $('#codeForm').data("submitted", true); @@ -454,7 +502,8 @@ resendButton.disabled = true; const resendButtonText = resendButton.innerHTML; // Update the button text initially to avoid waiting until the first tick to update. - resendButton.innerHTML = Math.floor(WAIT_TIME_SECONDS / 60).toString().padStart(2, '0') + " : " + (WAIT_TIME_SECONDS % 60).toString().padStart(2, '0'); + resendButton.innerHTML = Math.floor(WAIT_TIME_SECONDS / 60).toString().padStart(2, '0') + " : " + + (WAIT_TIME_SECONDS % 60).toString().padStart(2, '0'); const countdown = new Countdown( Countdown.seconds(WAIT_TIME_SECONDS), @@ -463,7 +512,8 @@ resendButton.disabled = false; }, (time) => { - resendButton.innerHTML = time.minutes.toString().padStart(2, '0') + " : " + time.seconds.toString().padStart(2, '0'); + resendButton.innerHTML = time.minutes.toString().padStart(2, '0') + " : " + + time.seconds.toString().padStart(2, '0'); }, "SMS_OTP_TIMER" ).start(); diff --git a/identity-apps-core/features/org.wso2.identity.apps.recovery.portal.server.feature/resources/web.xml.j2 b/identity-apps-core/features/org.wso2.identity.apps.recovery.portal.server.feature/resources/web.xml.j2 index fbdc945ad83..dcb4c4c6853 100644 --- a/identity-apps-core/features/org.wso2.identity.apps.recovery.portal.server.feature/resources/web.xml.j2 +++ b/identity-apps-core/features/org.wso2.identity.apps.recovery.portal.server.feature/resources/web.xml.j2 @@ -1,7 +1,7 @@ # +# EDITABLE=true,SCREEN="sms-otp",MULTI_LINE=false sms.otp.heading=OTP Verification enter.code.sent.smsotp=Enter the code sent to your mobile phone sms.otp.resend.code=Resend Code From cc994db1caa396a17d0802ab0cd363775935e6ab Mon Sep 17 00:00:00 2001 From: rushannanayakkara Date: Thu, 20 Jun 2024 09:36:16 +0530 Subject: [PATCH 24/29] Fix style issues --- .../src/components/account-recovery/account-recovery.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/apps/myaccount/src/components/account-recovery/account-recovery.tsx b/apps/myaccount/src/components/account-recovery/account-recovery.tsx index 87badb54817..3843c45de60 100644 --- a/apps/myaccount/src/components/account-recovery/account-recovery.tsx +++ b/apps/myaccount/src/components/account-recovery/account-recovery.tsx @@ -23,7 +23,6 @@ import { EmphasizedSegment } from "@wso2is/react-components"; import { AxiosError } from "axios"; import React, { FunctionComponent, ReactElement, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; -import { useSelector } from "react-redux"; import { List, Placeholder } from "semantic-ui-react"; import { EmailRecovery, SMSRecovery, SecurityQuestionsComponent } from "./options"; import { getPreference } from "../../api"; @@ -36,7 +35,6 @@ import { PreferenceProperty, PreferenceRequest } from "../../models"; -import { AppState } from "../../store"; import { SettingsSection } from "../shared"; /** @@ -59,7 +57,6 @@ export const AccountRecoveryComponent: FunctionComponent = const { onAlertFired, featureConfig, ["data-testid"]: testId } = props; const { t } = useTranslation(); - const allowedScopes: string = useSelector((state: AppState) => state?.authenticationInformation?.scope); const RECOVERY_CONNECTOR: string = "account-recovery"; const RECOVERY_PASSWORD_QUESTION: string = "Recovery.Question.Password.Enable"; const RECOVERY_PASSWORD_NOTIFICATION: string = "Recovery.Notification.Password.Enable"; From 65768c45bd96bb51b6062f53c3d6217630fdf0c8 Mon Sep 17 00:00:00 2001 From: rushannanayakkara Date: Mon, 24 Jun 2024 14:00:28 +0530 Subject: [PATCH 25/29] Add missing i18n Strings --- .../mgt/recovery/endpoint/i18n/Resources.properties | 9 +++++---- .../recovery/endpoint/i18n/Resources_de_DE.properties | 7 +++++++ .../recovery/endpoint/i18n/Resources_es_ES.properties | 7 +++++++ .../recovery/endpoint/i18n/Resources_fr_FR.properties | 7 +++++++ .../recovery/endpoint/i18n/Resources_ja_JP.properties | 7 +++++++ .../recovery/endpoint/i18n/Resources_pt_BR.properties | 7 +++++++ .../recovery/endpoint/i18n/Resources_pt_PT.properties | 7 +++++++ .../recovery/endpoint/i18n/Resources_zh_CN.properties | 7 +++++++ .../apps/recovery-portal/src/main/webapp/sms-otp.jsp | 4 +++- 9 files changed, 57 insertions(+), 5 deletions(-) diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties index cb9a506ccd4..c6e40201853 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources.properties @@ -37,12 +37,10 @@ sign.up.heading=Sign Up sign.up.button=Sign Up # -# +# # EDITABLE=true,SCREEN="sms-otp",MULTI_LINE=false sms.otp.heading=OTP Verification -enter.code.sent.smsotp=Enter the code sent to your mobile phone -sms.otp.resend.code=Resend Code -sms.otp.submit.button=Continue +# # # EDITABLE=true,SCREEN="password-recovery",MULTI_LINE=false @@ -300,6 +298,9 @@ enter.your.username=Enter your username error.enter.code=Please enter the code! choose.other.option=Choose a different option resend.code.success=A new OTP is sent to your mobile. +enter.code.sent.smsotp=Enter the code sent to your mobile phone +sms.otp.resend.code=Resend Code +sms.otp.submit.button=Continue # Errors error.occurred=Error Occurred diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties index d9867bb9b12..8b68e480a07 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_de_DE.properties @@ -30,6 +30,10 @@ sign.up.heading=Registrierung sign.up.button=Registrieren # +# +sms.otp.heading=OTP -Überprüfung +# + # password.recovery.heading=Passwort vergessen? password.recovery.body=Wir geben dir Deckung. Geben Sie Ihren Benutzernamen ein, um mit dem Zurücksetzen Ihres Passworts zu beginnen. @@ -271,6 +275,9 @@ enter.your.username=Geben Sie Ihren Benutzernamen ein error.enter.code=Bitte geben Sie den Code ein! choose.other.option=Wählen Sie eine andere Option resend.code.success=Ein neues OTP wurde an Ihr Handy gesendet. +enter.code.sent.smsotp=Geben Sie den Code ein, der an Ihr Mobiltelefon gesendet wurde +sms.otp.resend.code=Code erneut senden +sms.otp.submit.button=Weiter # Errors error.occurred=Ein Fehler ist aufgetreten diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties index 6c84f1557e8..30f519d4eb4 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_es_ES.properties @@ -30,6 +30,10 @@ sign.up.heading=Inscribirse sign.up.button=Inscribirse # +# +sms.otp.heading=Verificación OTP +# + # password.recovery.heading=¿Has olvidado tu contraseña? password.recovery.body=Te tenemos cubierto. Ingrese su nombre de usuario para comenzar a restablecer su contraseña. @@ -271,6 +275,9 @@ enter.your.username=Ingrese su nombre de usuario error.enter.code=¡Ingrese el código! choose.other.option=Elija una opción diferente resend.code.success=Se ha enviado un nuevo OTP a tu móvil. +enter.code.sent.smsotp=Introduce el código enviado a tu teléfono móvil +sms.otp.resend.code=Reenviar código +sms.otp.submit.button=Continuar # Errors error.occurred=Se produjo un error diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties index 828d713c25c..e4ba11ce558 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_fr_FR.properties @@ -30,6 +30,10 @@ sign.up.heading=S'inscrire sign.up.button=S'inscrire # +# +sms.otp.heading=Vérification de l'OTP +# + # password.recovery.heading=Mot de passe oublié? password.recovery.body=Nous avons ce qu'il vous faut. Entrez votre nom d'utilisateur pour commencer à réinitialiser votre mot de passe. @@ -272,6 +276,9 @@ enter.your.username=Entrez votre nom d'utilisateur error.enter.code=Veuillez entrer le code ! choose.other.option=Choisissez une autre option resend.code.success=Un nouveau OTP a été envoyé sur votre mobile. +enter.code.sent.smsotp=Veuillez entrer le code envoyé sur votre téléphone portable +sms.otp.resend.code=Renvoyer le code +sms.otp.submit.button=Continuer # Errors error.occurred=Erreur est survenue diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties index 773487f6c4f..e026cb0110c 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_ja_JP.properties @@ -30,6 +30,10 @@ sign.up.heading=サインアップ sign.up.button=サインアップ # +# +sms.otp.heading=OTP認証 +# + # password.recovery.heading=パスワード password.recovery.body=ご対応させていただきます。ユーザー名を入力してパスワードのリセットを開始します。 @@ -267,6 +271,9 @@ enter.your.username=ユーザー名を入力して下さい error.enter.code=コードを入力してください! choose.other.option=別のオプションを選択 resend.code.success=新しいOTPがあなたの携帯電話に送信されました。 +enter.code.sent.smsotp=携帯電話に送信されたコードを入力してください +sms.otp.resend.code=再送コード +sms.otp.submit.button=続行します ## Errors error.occurred=エラーが発生しました diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties index 0381de3d05c..8c83623904b 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_BR.properties @@ -30,6 +30,10 @@ sign.up.heading=Cadastrar sign.up.button=Cadastrar # +# +sms.otp.heading=Verificação de OTP +# + # password.recovery.heading=Esqueceu a senha? password.recovery.body=Estamos protegendo você. Digite seu nome de usuário para começar a redefinir sua senha. @@ -271,6 +275,9 @@ enter.your.username=Digite seu nome de usuário error.enter.code=Por favor, digite o código! choose.other.option=Escolha uma opção diferente resend.code.success=Um novo OTP foi enviado para o seu celular. +enter.code.sent.smsotp=Digite o código enviado para o seu celular +sms.otp.resend.code=Reenviar código +sms.otp.submit.button=Continuar # Errors error.occurred=Ocorreu um erro diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties index 6faf01535c4..d39ac2bcfd9 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties @@ -30,6 +30,10 @@ sign.up.heading=Inscrever-se sign.up.button=Inscrever-se # +# +sms.otp.heading=Verificação de OTP +# + # password.recovery.heading=Esqueceu a senha? password.recovery.body=Estamos protegendo você. Digite seu nome de usuário para começar a redefinir sua senha. @@ -271,6 +275,9 @@ enter.your.username=Entre com seu nome de usuário error.enter.code=Por favor, digite o código! choose.other.option=Escolha uma opção diferente resend.code.success=Um novo OTP foi enviado para o seu telemóvel. +enter.code.sent.smsotp=Insira o código enviado para o seu telemóvel. +sms.otp.resend.code=Reenviar código. +sms.otp.submit.button=Continuar. # Errors error.occurred=Ocorreu um erro diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties index 4d5af27cdbf..fb48f56b6ce 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_zh_CN.properties @@ -30,6 +30,10 @@ sign.up.heading=报名 sign.up.button=报名 # +# +sms.otp.heading=OTP验证 +# + # password.recovery.heading=密码 password.recovery.body=我们已经为您提供了保障。输入您的用户名以开始重置密码。 @@ -267,6 +271,9 @@ enter.your.username=输入你的用户名 error.enter.code=请输入代码 choose.other.option=选择其他选项 resend.code.success=新的OTP已发送到您的手机。 +enter.code.sent.smsotp=输入发送到您手机上的代码 +sms.otp.resend.code=重新发送验证码 +sms.otp.submit.button=继续 ## Errors error.occurred=错误发生 diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp index 6715bcbb774..7d783cab803 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/sms-otp.jsp @@ -38,7 +38,9 @@ <%@ include file="includes/localize.jsp" %> <%@ include file="includes/init-url.jsp" %> -<%@ include file="includes/branding-preferences.jsp" %> + +<%-- Branding Preferences --%> + <%! private static final String LOCAL_SMS_OTP_AUTHENTICATOR_ID = "sms-otp-authenticator"; From 0382f56d81461296aecac68fda61e33719fa79c3 Mon Sep 17 00:00:00 2001 From: rushannanayakkara Date: Mon, 24 Jun 2024 20:19:29 +0530 Subject: [PATCH 26/29] add sms-otp to branding preference screens --- .../src/main/webapp/includes/branding-preferences.jsp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/identity-apps-core/apps/recovery-portal/src/main/webapp/includes/branding-preferences.jsp b/identity-apps-core/apps/recovery-portal/src/main/webapp/includes/branding-preferences.jsp index 273650393cf..5124a6b617f 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/webapp/includes/branding-preferences.jsp +++ b/identity-apps-core/apps/recovery-portal/src/main/webapp/includes/branding-preferences.jsp @@ -233,7 +233,8 @@ String productWhiteLogoURL = "libs/themes/wso2is/assets/images/branding/logo-full-inverted.svg"; String productWhiteLogoAlt = "WSO2 Identity Server Logo White Variation"; String poweredByLogoURL = ""; - String[] screenNames = {"common", "sign-up", "password-recovery", "password-reset", "password-reset-success", "email-link-expiry"}; + String[] screenNames = {"common", "sign-up", "password-recovery", "password-reset", + "password-reset-success", "email-link-expiry", "sms-otp"}; // Constants used to create full custom layout name String PREFIX_FOR_CUSTOM_LAYOUT_NAME = "custom"; From eb41f6fd1b4f998bc5b9875179ae4c42358d7643 Mon Sep 17 00:00:00 2001 From: rushannanayakkara Date: Mon, 24 Jun 2024 20:55:43 +0530 Subject: [PATCH 27/29] revert pnpm-lock.yaml and package.json changes --- package.json | 2 - pnpm-lock.yaml | 1088 +++++++++++++++++++++++------------------------- 2 files changed, 530 insertions(+), 560 deletions(-) diff --git a/package.json b/package.json index 7dad8649ea9..57968b399ce 100755 --- a/package.json +++ b/package.json @@ -198,8 +198,6 @@ }, "pnpm": { "overrides": { - "react": "18.3.1", - "react-dom": "18.3.1", "@mui/material": "5.13.0", "@types/react": "18.0.18", "webpack": "5.84.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3414d619899..10e6b46356e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,8 +5,6 @@ settings: excludeLinksFromLockfile: false overrides: - react: 18.3.1 - react-dom: 18.3.1 '@mui/material': 5.13.0 '@types/react': 18.0.18 webpack: 5.84.1 @@ -80,7 +78,7 @@ importers: version: 6.5.9(final-form@4.20.10)(react@18.3.1) react-head: specifier: ^3.3.0 - version: 3.4.2(react-dom@18.3.1)(react@18.3.1) + version: 3.4.2 react-helmet: specifier: ^5.2.1 version: 5.2.1(react@18.3.1) @@ -89,10 +87,10 @@ importers: version: 4.3.1(react@18.3.1) react-notification-system: specifier: ^0.4.0 - version: 0.4.0(react-dom@18.3.1)(react@18.3.1) + version: 0.4.0(react-dom@16.14.0)(react@16.14.0) react-password-strength-bar: specifier: ^0.3.2 - version: 0.3.5(react-dom@18.3.1)(react@18.3.1) + version: 0.3.5 react-redux: specifier: ^7.2.9 version: 7.2.9(react-dom@18.3.1)(react@18.3.1) @@ -189,16 +187,16 @@ importers: version: 0.5.13(react-refresh@0.9.0)(webpack-dev-server@3.11.3)(webpack@5.84.1) '@storybook/builder-webpack5': specifier: ~6.4.12 - version: 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) + version: 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) '@storybook/core-server': specifier: ~6.4.12 - version: 6.4.22(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) + version: 6.4.22(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) '@storybook/manager-webpack5': specifier: ~6.4.12 - version: 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) + version: 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) '@storybook/react': specifier: ~6.4.12 - version: 6.4.22(@babel/core@7.24.6)(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0)(webpack-dev-server@3.11.3) + version: 6.4.22(@babel/core@7.24.6)(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0)(webpack-dev-server@3.11.3) '@swc-node/register': specifier: ^1.4.2 version: 1.9.1(@swc/core@1.5.7)(@swc/types@0.1.7)(typescript@4.9.5) @@ -405,7 +403,7 @@ importers: version: 4.0.2(webpack@5.84.1) react-hot-loader: specifier: ^4.13.0 - version: 4.13.1(react-dom@18.3.1)(react@18.3.1) + version: 4.13.1 react-refresh: specifier: ^0.9.0 version: 0.9.0 @@ -602,10 +600,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -909,10 +907,10 @@ importers: specifier: ^1.0.0 version: 1.0.1(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-helmet: specifier: ^5.2.1 @@ -1198,10 +1196,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -1511,10 +1509,10 @@ importers: specifier: ^21.9.1 version: 21.10.0 react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-helmet: specifier: ^5.2.1 @@ -1647,10 +1645,10 @@ importers: specifier: ^0.10.0 version: 0.10.0 react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-helmet: specifier: ^5.2.1 @@ -1768,10 +1766,10 @@ importers: specifier: ^0.10.0 version: 0.10.0 react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-helmet: specifier: ^5.2.1 @@ -1979,10 +1977,10 @@ importers: specifier: ^0.10.0 version: 0.10.0 react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-helmet: specifier: ^5.2.1 @@ -2154,10 +2152,10 @@ importers: specifier: ^0.10.0 version: 0.10.0 react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-helmet: specifier: ^5.2.1 @@ -2272,10 +2270,10 @@ importers: specifier: ^4.17.21 version: 4.17.21 react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-redux: specifier: ^7.2.9 @@ -2465,10 +2463,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -2724,10 +2722,10 @@ importers: features/admin.base.v1: dependencies: react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) devDependencies: '@rollup/plugin-commonjs': @@ -2917,10 +2915,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -3317,10 +3315,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -3702,10 +3700,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -4102,10 +4100,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -4511,10 +4509,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -4923,10 +4921,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -5377,10 +5375,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -5759,10 +5757,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -6147,10 +6145,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -6529,10 +6527,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -6914,10 +6912,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -7350,10 +7348,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -7735,10 +7733,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -8135,10 +8133,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -8544,10 +8542,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -8929,10 +8927,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -9311,10 +9309,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -9708,10 +9706,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -10096,10 +10094,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -10478,10 +10476,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -10863,10 +10861,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -11278,10 +11276,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -11663,10 +11661,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -12048,10 +12046,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -12439,10 +12437,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -12821,10 +12819,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -13218,10 +13216,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -13633,10 +13631,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -14015,10 +14013,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -14397,10 +14395,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -14794,10 +14792,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -15179,10 +15177,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -15561,10 +15559,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -15949,10 +15947,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -16337,10 +16335,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -16755,10 +16753,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -17140,10 +17138,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -17534,10 +17532,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -17922,10 +17920,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -18304,10 +18302,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -18686,10 +18684,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -19068,10 +19066,10 @@ importers: specifier: ^4.0.0-beta.2 version: 4.2.2(react-dom@18.3.1)(react@18.3.1) react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-draggable: specifier: ^4.2.0 @@ -19363,10 +19361,10 @@ importers: specifier: ^4.17.21 version: 4.17.21 react: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-helmet: specifier: ^5.2.1 @@ -19445,10 +19443,10 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@13.13.52)(ts-node@10.9.2) react: - specifier: 18.3.1 + specifier: '*' version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: '*' version: 18.3.1(react@18.3.1) ts-jest: specifier: ^29.1.2 @@ -19486,7 +19484,7 @@ importers: dependencies: '@asgardeo/auth-react': specifier: ^4.0.4 - version: 4.0.4(@babel/runtime-corejs3@7.24.6)(react-dom@18.3.1)(react-router-dom@6.23.1)(react@18.3.1) + version: 4.0.4(@babel/runtime-corejs3@7.24.6)(react-dom@16.14.0)(react-router-dom@6.23.1)(react@16.14.0) '@braintree/sanitize-url': specifier: ^5.0.0 version: 5.0.2 @@ -19525,7 +19523,7 @@ importers: version: 0.10.0 react-notification-system: specifier: ^0.4.0 - version: 0.4.0(react-dom@18.3.1)(react@18.3.1) + version: 0.4.0(react-dom@16.14.0)(react@16.14.0) ts-jest: specifier: ^29.1.2 version: 29.1.3(@babel/core@7.24.6)(babel-jest@26.6.3)(jest@29.7.0)(typescript@4.9.5) @@ -19612,7 +19610,7 @@ importers: specifier: ^4.17.21 version: 4.17.21 react: - specifier: 18.3.1 + specifier: '*' version: 18.3.1 react-final-form: specifier: ^6.5.9 @@ -19955,7 +19953,7 @@ importers: specifier: ^2.24.0 version: 2.30.1 react: - specifier: 18.3.1 + specifier: '*' version: 18.3.1 react-codemirror2: specifier: ^6.0.0 @@ -20106,7 +20104,7 @@ importers: specifier: ^3.6.0 version: 3.7.2(typescript@4.9.5)(webpack@5.84.1) react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) rimraf: specifier: ^3.0.2 @@ -20268,7 +20266,7 @@ packages: resolution: {integrity: sha512-UAyHZU64Vie3sLDdL3qD+7pODGzKNu9pSpxGKpDOCaiBvCDZnFXIfJEEfV9v9i+QiJJwzO+lqsFwvw6YiJeXFQ==} engines: {node: '>=12.20.2', yarn: 1.x.x} peerDependencies: - react: 18.3.1 + react: '>=16.3.0' dependencies: react: 18.3.1 dev: false @@ -20277,36 +20275,36 @@ packages: resolution: {integrity: sha512-XTb/+jPPBAnNGlZYeHVz2Ut5hI8DeJiMmX5YcAijiAvtW4Ove82lT4aLXm+FL8XmCYc+61hFNG1QLf8q2nMfSQ==} dev: false - /@asgardeo/auth-react@4.0.4(@babel/runtime-corejs3@7.24.6)(react-dom@18.3.1)(react-router-dom@4.3.1)(react@18.3.1): + /@asgardeo/auth-react@4.0.4(@babel/runtime-corejs3@7.24.6)(react-dom@16.14.0)(react-router-dom@6.23.1)(react@16.14.0): resolution: {integrity: sha512-PltiGPAUVyekEOun9BMte3H2AmFsihiLisobjax5NxdkpDurvrgUR9xCUh7qKkoQQHq4N1Y5crc8UpCg+hkLmQ==} peerDependencies: '@babel/runtime-corejs3': ^7.11.2 - react: 18.3.1 - react-dom: 18.3.1 + react: '>=16.8' + react-dom: '>=16.8' react-router-dom: ^6.3.0 dependencies: '@asgardeo/auth-spa': 3.0.3 '@babel/runtime-corejs3': 7.24.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-router-dom: 4.3.1(react@18.3.1) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + react-router-dom: 6.23.1(react-dom@16.14.0)(react@16.14.0) transitivePeerDependencies: - debug dev: false - /@asgardeo/auth-react@4.0.4(@babel/runtime-corejs3@7.24.6)(react-dom@18.3.1)(react-router-dom@6.23.1)(react@18.3.1): + /@asgardeo/auth-react@4.0.4(@babel/runtime-corejs3@7.24.6)(react-dom@18.3.1)(react-router-dom@4.3.1)(react@18.3.1): resolution: {integrity: sha512-PltiGPAUVyekEOun9BMte3H2AmFsihiLisobjax5NxdkpDurvrgUR9xCUh7qKkoQQHq4N1Y5crc8UpCg+hkLmQ==} peerDependencies: '@babel/runtime-corejs3': ^7.11.2 - react: 18.3.1 - react-dom: 18.3.1 + react: '>=16.8' + react-dom: '>=16.8' react-router-dom: ^6.3.0 dependencies: '@asgardeo/auth-spa': 3.0.3 '@babel/runtime-corejs3': 7.24.6 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router-dom: 6.23.1(react-dom@18.3.1)(react@18.3.1) + react-router-dom: 4.3.1(react@18.3.1) transitivePeerDependencies: - debug dev: false @@ -22156,10 +22154,10 @@ packages: stylis: 4.2.0 dev: false - /@emotion/core@10.3.1(react@18.3.1): + /@emotion/core@10.3.1: resolution: {integrity: sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==} peerDependencies: - react: 18.3.1 + react: '>=16.3.0' dependencies: '@babel/runtime': 7.24.6 '@emotion/cache': 10.0.29 @@ -22167,7 +22165,6 @@ packages: '@emotion/serialize': 0.11.16 '@emotion/sheet': 0.9.4 '@emotion/utils': 0.11.3 - react: 18.3.1 dev: true /@emotion/css@10.0.27: @@ -22208,7 +22205,7 @@ packages: resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} peerDependencies: '@types/react': '*' - react: 18.3.1 + react: '>=16.8.0' peerDependenciesMeta: '@types/react': optional: true @@ -22253,30 +22250,28 @@ packages: resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} dev: false - /@emotion/styled-base@10.3.0(@emotion/core@10.3.1)(react@18.3.1): + /@emotion/styled-base@10.3.0(@emotion/core@10.3.1): resolution: {integrity: sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==} peerDependencies: '@emotion/core': ^10.0.28 - react: 18.3.1 + react: '>=16.3.0' dependencies: '@babel/runtime': 7.24.6 - '@emotion/core': 10.3.1(react@18.3.1) + '@emotion/core': 10.3.1 '@emotion/is-prop-valid': 0.8.8 '@emotion/serialize': 0.11.16 '@emotion/utils': 0.11.3 - react: 18.3.1 dev: true - /@emotion/styled@10.3.0(@emotion/core@10.3.1)(react@18.3.1): + /@emotion/styled@10.3.0(@emotion/core@10.3.1): resolution: {integrity: sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==} peerDependencies: '@emotion/core': ^10.0.27 - react: 18.3.1 + react: '>=16.3.0' dependencies: - '@emotion/core': 10.3.1(react@18.3.1) - '@emotion/styled-base': 10.3.0(@emotion/core@10.3.1)(react@18.3.1) + '@emotion/core': 10.3.1 + '@emotion/styled-base': 10.3.0(@emotion/core@10.3.1) babel-plugin-emotion: 10.2.2 - react: 18.3.1 dev: true /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.0.18)(react@18.3.1): @@ -22284,7 +22279,7 @@ packages: peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' - react: 18.3.1 + react: '>=16.8.0' peerDependenciesMeta: '@types/react': optional: true @@ -22314,7 +22309,7 @@ packages: /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1): resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} peerDependencies: - react: 18.3.1 + react: '>=16.8.0' dependencies: react: 18.3.1 dev: false @@ -22364,8 +22359,8 @@ packages: /@fluentui/react-component-event-listener@0.63.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-gSMdOh6tI3IJKZFqxfQwbTpskpME0CvxdxGM2tdglmf6ZPVDi0L4+KKIm+2dN8nzb8Ya1A8ZT+Ddq0KmZtwVQg==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17 || ^18 + react-dom: ^16.8.0 || ^17 || ^18 dependencies: '@babel/runtime': 7.24.6 react: 18.3.1 @@ -22375,8 +22370,8 @@ packages: /@fluentui/react-component-ref@0.63.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-8MkXX4+R3i80msdbD4rFpEB4WWq2UDvGwG386g3ckIWbekdvN9z2kWAd9OXhRGqB7QeOsoAGWocp6gAMCivRlw==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17 || ^18 + react-dom: ^16.8.0 || ^17 || ^18 dependencies: '@babel/runtime': 7.24.6 react: 18.3.1 @@ -22426,7 +22421,7 @@ packages: /@icons/material@0.2.4(react@18.3.1): resolution: {integrity: sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==} peerDependencies: - react: 18.3.1 + react: '*' dependencies: react: 18.3.1 dev: false @@ -23937,7 +23932,7 @@ packages: /@mdx-js/react@1.6.22(react@18.3.1): resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==} peerDependencies: - react: 18.3.1 + react: ^16.13.1 || ^17.0.0 dependencies: react: 18.3.1 dev: true @@ -24062,7 +24057,7 @@ packages: resolution: {integrity: sha512-+IIPDYU7DKBwByN7lK/mkMGrnWMGdyIsEZfDzBh/fKDZgGGGgH9B3WHej+vIpdwBcVaPbYx++lonTshn56C9/A==} peerDependencies: history: '>= 4.10.1' - react: 18.3.1 + react: '>= 17.0.1' tslib: '*' dependencies: '@microsoft/applicationinsights-common': 2.8.18(tslib@2.6.2) @@ -24153,8 +24148,8 @@ packages: resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} peerDependencies: monaco-editor: '>= 0.25.0 < 1' - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@monaco-editor/loader': 1.4.0(monaco-editor@0.49.0) monaco-editor: 0.49.0 @@ -24194,8 +24189,8 @@ packages: engines: {node: '>=12.0.0'} peerDependencies: '@types/react': 18.0.18 - react: 18.3.1 - react-dom: 18.3.1 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -24218,8 +24213,8 @@ packages: engines: {node: '>=12.0.0'} peerDependencies: '@types/react': 18.0.18 - react: 18.3.1 - react-dom: 18.3.1 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -24242,8 +24237,8 @@ packages: engines: {node: '>=12.0.0'} peerDependencies: '@types/react': 18.0.18 - react: 18.3.1 - react-dom: 18.3.1 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -24271,7 +24266,7 @@ packages: peerDependencies: '@mui/material': 5.13.0 '@types/react': 18.0.18 - react: 18.3.1 + react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -24290,8 +24285,8 @@ packages: '@emotion/styled': ^11.3.0 '@mui/material': 5.13.0 '@types/react': 18.0.18 - react: 18.3.1 - react-dom: 18.3.1 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -24324,8 +24319,8 @@ packages: '@emotion/styled': ^11.3.0 '@mui/material': 5.13.0 '@types/react': 18.0.18 - react: 18.3.1 - react-dom: 18.3.1 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -24357,8 +24352,8 @@ packages: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 '@types/react': 18.0.18 - react: 18.3.1 - react-dom: 18.3.1 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -24391,7 +24386,7 @@ packages: engines: {node: '>=12.0.0'} peerDependencies: '@types/react': 18.0.18 - react: 18.3.1 + react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -24409,7 +24404,7 @@ packages: peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 - react: 18.3.1 + react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -24432,7 +24427,7 @@ packages: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 '@types/react': 18.0.18 - react: 18.3.1 + react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -24471,7 +24466,7 @@ packages: engines: {node: '>=12.0.0'} peerDependencies: '@types/react': 18.0.18 - react: 18.3.1 + react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -24490,8 +24485,8 @@ packages: peerDependencies: '@mui/material': 5.13.0 '@mui/system': ^5.4.1 - react: 18.3.1 - react-dom: 18.3.1 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 dependencies: '@babel/runtime': 7.24.6 '@mui/material': 5.13.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1) @@ -25501,8 +25496,8 @@ packages: /@oxygen-ui/react-icons@1.11.0(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5): resolution: {integrity: sha512-qb1bCzC6c0xecRHneQy6T0LlGNLMvqomw1kuExubstn1kcebF7Y+TH8hjlrr4F3tp+upTBRXNEsVAUeq24Xnpw==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=18.0.0' + react-dom: '>=18.0.0' typescript: '>=4.0.0' peerDependenciesMeta: typescript: @@ -25523,8 +25518,8 @@ packages: '@mui/material': 5.13.0 '@mui/system': ^5.10.16 '@mui/utils': ^5.10.16 - react: 18.3.1 - react-dom: 18.3.1 + react: '>=18.0.0' + react-dom: '>=18.0.0' typescript: '>=4.0.0' peerDependenciesMeta: typescript: @@ -25559,8 +25554,8 @@ packages: '@mui/material': 5.13.0 '@mui/system': ^5.10.16 '@mui/utils': ^5.10.16 - react: 18.3.1 - react-dom: 18.3.1 + react: '>=18.0.0' + react-dom: '>=18.0.0' typescript: '>=4.0.0' peerDependenciesMeta: typescript: @@ -25769,8 +25764,8 @@ packages: /@reactflow/background@11.2.2(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-gOtae79Zx1zOs9tD4tmKfuiQQOyG0O81BWBCHqlAQgemKlYExElFKOC67lgTDZ4GGFK+4sXrgrWQ5h14hzaFgg==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=17' + react-dom: '>=17' dependencies: '@reactflow/core': 11.7.2(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1) classcat: 5.0.5 @@ -25785,8 +25780,8 @@ packages: /@reactflow/controls@11.1.13(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-rA74+mbt2bnz9Fba6JL1JsKHNNEK6Nl70+ssfOLKMpRFIg512IroayBWufgPJB82X9dgMIzZfx/UcEFFUFJQ8Q==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=17' + react-dom: '>=17' dependencies: '@reactflow/core': 11.7.2(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1) classcat: 5.0.5 @@ -25801,8 +25796,8 @@ packages: /@reactflow/core@11.7.2(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-AhszxILp1RNk3SwrnC/eYh1XsOil5yzthYG5k+oTpvLH5H3BtIWIVkeLEJwmL611lPKL3JuScfjliUxBm9128w==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=17' + react-dom: '>=17' dependencies: '@types/d3': 7.4.3 '@types/d3-drag': 3.0.7 @@ -25823,8 +25818,8 @@ packages: /@reactflow/minimap@11.5.2(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-564gP/GMZKaJjVRGIrVLv2gIjgc89+qvNwuZzHnQLXjBw5+nS/QkW57Qx/M33MxVAaM+Z5rJ8gKknMSnxekwvQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=17' + react-dom: '>=17' dependencies: '@reactflow/core': 11.7.2(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1) '@types/d3-selection': 3.0.10 @@ -25843,8 +25838,8 @@ packages: /@reactflow/node-resizer@2.1.0(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-DVL8nnWsltP8/iANadAcTaDB4wsEkx2mOLlBEPNE3yc5loSm3u9l5m4enXRcBym61MiMuTtDPzZMyYYQUjuYIg==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=17' + react-dom: '>=17' dependencies: '@reactflow/core': 11.7.2(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1) classcat: 5.0.5 @@ -25861,8 +25856,8 @@ packages: /@reactflow/node-toolbar@1.2.1(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-EcMUMzJGAACYQTiUaBm3zxeiiKCPwU2MaoDeZdnEMbvq+2SfohKOur6JklANjv30kL+Pf3xj8QopEtyKTS4XrA==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=17' + react-dom: '>=17' dependencies: '@reactflow/core': 11.7.2(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1) classcat: 5.0.5 @@ -26239,8 +26234,8 @@ packages: /@semantic-ui-react/event-stack@3.1.3(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-FdTmJyWvJaYinHrKRsMLDrz4tTMGdFfds299Qory53hBugiDvGC0tEJf+cHsi5igDwWb/CLOgOiChInHwq8URQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: exenv: 1.2.2 prop-types: 15.8.1 @@ -26315,8 +26310,8 @@ packages: /@storybook/addon-actions@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-aADjilFmuD6TNGz2CRPSupnyiA/IGkPJHDBTqMpsDXTUr8xnuD122xkIhg6UxmCM2y1c+ncwYXy3WPK2xXK57g==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true @@ -26349,8 +26344,8 @@ packages: /@storybook/addon-backgrounds@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-t7qooZ892BruhilFmzYPbysFwpULt/q4zYXNSmKVbAYta8UVvitjcU4F18p8FpWd9WvhiTr0SDlyhNZuzvDfug==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true @@ -26377,8 +26372,8 @@ packages: /@storybook/addon-controls@6.5.16(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0): resolution: {integrity: sha512-kShSGjq1MjmmyL3l8i+uPz6yddtf82mzys0l82VKtcuyjrr5944wYFJ5NTXMfZxrO/U6FeFsfuFZE/k6ex3EMg==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true @@ -26414,8 +26409,8 @@ packages: resolution: {integrity: sha512-QM9WDZG9P02UvbzLu947a8ZngOrQeAKAT8jCibQFM/+RJ39xBlfm8rm+cQy3dm94wgtjmVkA3mKGOV/yrrsddg==} peerDependencies: '@storybook/mdx2-csf': ^0.0.3 - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@storybook/mdx2-csf': optional: true @@ -26470,8 +26465,8 @@ packages: /@storybook/addon-links@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-P/mmqK57NGXnR0i3d/T5B0rIt0Lg8Yq+qionRr3LK3AwG/4yGnYt4GNomLEknn/eEwABYq1Q/Z1aOpgIhNdq5A==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true @@ -26497,8 +26492,8 @@ packages: /@storybook/addon-measure@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-DMwnXkmM2L6POTh4KaOWvOAtQ2p9Tr1UUNxz6VXiN5cKFohpCs6x0txdLU5WN8eWIq0VFsO7u5ZX34CGCc6gCg==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true @@ -26520,8 +26515,8 @@ packages: /@storybook/addon-outline@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-0du96nha4qltexO0Xq1xB7LeRSbqjC9XqtZLflXG7/X3ABoPD2cXgOV97eeaXUodIyb2qYBbHUfftBeA75x0+w==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true @@ -26545,8 +26540,8 @@ packages: /@storybook/addon-toolbars@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-y3PuUKiwOWrAvqx1YdUvArg0UaAwmboXFeR2bkrowk1xcT+xnRO3rML4npFeUl26OQ1FzwxX/cw6nknREBBLEA==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true @@ -26567,8 +26562,8 @@ packages: /@storybook/addon-viewport@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-1Vyqf1U6Qng6TXlf4SdqUKyizlw1Wn6+qW8YeA2q1lbkJqn3UlnHXIp8Q0t/5q1dK5BFtREox3+jkGwbJrzkmA==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true @@ -26590,32 +26585,30 @@ packages: regenerator-runtime: 0.13.11 dev: true - /@storybook/addons@6.4.22(react-dom@18.3.1)(react@18.3.1): + /@storybook/addons@6.4.22: resolution: {integrity: sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@storybook/api': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/api': 6.4.22 '@storybook/channels': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/router': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/theming': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/router': 6.4.22 + '@storybook/theming': 6.4.22 '@types/webpack-env': 1.18.5 core-js: 3.37.1 global: 4.4.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) regenerator-runtime: 0.13.11 dev: true /@storybook/addons@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-p3DqQi+8QRL5k7jXhXmJZLsE/GqHqyY6PcoA1oNTJr0try48uhTGUOYkgzmqtDaa/qPFO5LP+xCPzZXckGtquQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@storybook/api': 6.5.16(react-dom@18.3.1)(react@18.3.1) '@storybook/channels': 6.5.16 @@ -26631,26 +26624,24 @@ packages: react-dom: 18.3.1(react@18.3.1) regenerator-runtime: 0.13.11 - /@storybook/api@6.4.22(react-dom@18.3.1)(react@18.3.1): + /@storybook/api@6.4.22: resolution: {integrity: sha512-lAVI3o2hKupYHXFTt+1nqFct942up5dHH6YD7SZZJGyW21dwKC3HK1IzCsTawq3fZAKkgWFgmOO649hKk60yKg==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 dependencies: '@storybook/channels': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/router': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/router': 6.4.22 '@storybook/semver': 7.3.2 - '@storybook/theming': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/theming': 6.4.22 core-js: 3.37.1 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 memoizerific: 1.11.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) regenerator-runtime: 0.13.11 store2: 2.14.3 telejson: 5.3.3 @@ -26661,8 +26652,8 @@ packages: /@storybook/api@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-HOsuT8iomqeTMQJrRx5U8nsC7lJTwRr1DhdD0SzlqL4c80S/7uuCy4IZvOt4sYQjOzW5fOo/kamcoBXyLproTA==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@storybook/channels': 6.5.16 '@storybook/client-logger': 6.5.16 @@ -26684,11 +26675,11 @@ packages: ts-dedent: 2.2.0 util-deprecate: 1.0.2 - /@storybook/builder-webpack4@6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0): + /@storybook/builder-webpack4@6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0): resolution: {integrity: sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -26715,22 +26706,22 @@ packages: '@babel/preset-env': 7.24.6(@babel/core@7.24.6) '@babel/preset-react': 7.24.6(@babel/core@7.24.6) '@babel/preset-typescript': 7.24.6(@babel/core@7.24.6) - '@storybook/addons': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/api': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/addons': 6.4.22 + '@storybook/api': 6.4.22 '@storybook/channel-postmessage': 6.4.22 '@storybook/channels': 6.4.22 - '@storybook/client-api': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/client-api': 6.4.22 '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/core-common': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) + '@storybook/components': 6.4.22 + '@storybook/core-common': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) '@storybook/core-events': 6.4.22 '@storybook/node-logger': 6.4.22 - '@storybook/preview-web': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/router': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/preview-web': 6.4.22 + '@storybook/router': 6.4.22 '@storybook/semver': 7.3.2 - '@storybook/store': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/theming': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/ui': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/store': 6.4.22 + '@storybook/theming': 6.4.22 + '@storybook/ui': 6.4.22 '@types/node': 14.18.63 '@types/webpack': 4.41.38 autoprefixer: 9.8.8 @@ -26752,8 +26743,6 @@ packages: postcss-flexbugs-fixes: 4.2.1 postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.84.1) raw-loader: 4.0.2(webpack@5.84.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) stable: 0.1.8 style-loader: 1.3.0(webpack@5.84.1) terser-webpack-plugin: 4.2.3(webpack@5.84.1) @@ -26781,8 +26770,8 @@ packages: /@storybook/builder-webpack4@6.5.16(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0): resolution: {integrity: sha512-YqDIrVNsUo8r9xc6AxsYDLxVYtMgl5Bxk+8/h1adsOko+jAFhdg6hOcAVxEmoSI0TMASOOVMFlT2hr23ppN2rQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -26849,11 +26838,11 @@ packages: - webpack-cli dev: false - /@storybook/builder-webpack5@6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0): + /@storybook/builder-webpack5@6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0): resolution: {integrity: sha512-vvQ0HgkIIVz+cmaCXIRor0UFZbGZqh4aV0ISSof60BjdW5ld+R+XCr/bdTU6Zg8b2fL9CXh7/LE6fImnIMpRIA==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -26879,21 +26868,21 @@ packages: '@babel/preset-env': 7.24.6(@babel/core@7.24.6) '@babel/preset-react': 7.24.6(@babel/core@7.24.6) '@babel/preset-typescript': 7.24.6(@babel/core@7.24.6) - '@storybook/addons': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/api': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/addons': 6.4.22 + '@storybook/api': 6.4.22 '@storybook/channel-postmessage': 6.4.22 '@storybook/channels': 6.4.22 - '@storybook/client-api': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/client-api': 6.4.22 '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/core-common': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) + '@storybook/components': 6.4.22 + '@storybook/core-common': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) '@storybook/core-events': 6.4.22 '@storybook/node-logger': 6.4.22 - '@storybook/preview-web': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/router': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/preview-web': 6.4.22 + '@storybook/router': 6.4.22 '@storybook/semver': 7.3.2 - '@storybook/store': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/theming': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/store': 6.4.22 + '@storybook/theming': 6.4.22 '@types/node': 14.18.63 babel-loader: 8.3.0(@babel/core@7.24.6)(webpack@5.84.1) babel-plugin-macros: 3.1.0 @@ -26907,8 +26896,6 @@ packages: html-webpack-plugin: 5.6.0(webpack@5.84.1) path-browserify: 1.0.1 process: 0.11.10 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) stable: 0.1.8 style-loader: 2.0.0(webpack@5.84.1) terser-webpack-plugin: 5.3.10(@swc/core@1.5.7)(webpack@5.84.1) @@ -26934,8 +26921,8 @@ packages: /@storybook/builder-webpack5@6.5.16(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0): resolution: {integrity: sha512-kh8Sofm1sbijaHDWtm0sXabqACHVFjikU/fIkkW786kpjoPIPIec1a+hrLgDsZxMU3I7XapSOaCFzWt6FjVXjg==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -27101,19 +27088,19 @@ packages: - webpack-cli dev: false - /@storybook/client-api@6.4.22(react-dom@18.3.1)(react@18.3.1): + /@storybook/client-api@6.4.22: resolution: {integrity: sha512-sO6HJNtrrdit7dNXQcZMdlmmZG1k6TswH3gAyP/DoYajycrTwSJ6ovkarzkO+0QcJ+etgra4TEdTIXiGHBMe/A==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@storybook/addons': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/addons': 6.4.22 '@storybook/channel-postmessage': 6.4.22 '@storybook/channels': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/store': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/store': 6.4.22 '@types/qs': 6.9.15 '@types/webpack-env': 1.18.5 core-js: 3.37.1 @@ -27122,8 +27109,6 @@ packages: lodash: 4.17.21 memoizerific: 1.11.3 qs: 6.12.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) regenerator-runtime: 0.13.11 store2: 2.14.3 synchronous-promise: 2.0.17 @@ -27134,8 +27119,8 @@ packages: /@storybook/client-api@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-i3UwkzzUFw8I+E6fOcgB5sc4oU2fhvaKnqC1mpd9IYGJ9JN9MnGIaVl3Ko28DtFItu/QabC9JsLIJVripFLktQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@storybook/addons': 6.5.16(react-dom@18.3.1)(react@18.3.1) '@storybook/channel-postmessage': 6.5.16 @@ -27196,16 +27181,16 @@ packages: - supports-color dev: false - /@storybook/components@6.4.22(react-dom@18.3.1)(react@18.3.1): + /@storybook/components@6.4.22: resolution: {integrity: sha512-dCbXIJF9orMvH72VtAfCQsYbe57OP7fAADtR6YTwfCw9Sm1jFuZr8JbblQ1HcrXEoJG21nOyad3Hm5EYVb/sBw==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 dependencies: '@popperjs/core': 2.11.8 '@storybook/client-logger': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/theming': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/theming': 6.4.22 '@types/color-convert': 2.0.3 '@types/overlayscrollbars': 1.12.5 '@types/react-syntax-highlighter': 11.0.5 @@ -27214,17 +27199,15 @@ packages: fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 - markdown-to-jsx: 7.4.7(react@18.3.1) + markdown-to-jsx: 7.4.7 memoizerific: 1.11.3 overlayscrollbars: 1.13.3 polished: 4.3.1 prop-types: 15.8.1 - react: 18.3.1 - react-colorful: 5.6.1(react-dom@18.3.1)(react@18.3.1) - react-dom: 18.3.1(react@18.3.1) - react-popper-tooltip: 3.1.1(react-dom@18.3.1)(react@18.3.1) - react-syntax-highlighter: 13.5.3(react@18.3.1) - react-textarea-autosize: 8.5.3(react@18.3.1) + react-colorful: 5.6.1 + react-popper-tooltip: 3.1.1 + react-syntax-highlighter: 13.5.3 + react-textarea-autosize: 8.5.3 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -27235,8 +27218,8 @@ packages: /@storybook/components@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-LzBOFJKITLtDcbW9jXl0/PaG+4xAz25PK8JxPZpIALbmOpYWOAPcO6V9C2heX6e6NgWFMUxjplkULEk9RCQMNA==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@storybook/client-logger': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -27249,35 +27232,33 @@ packages: regenerator-runtime: 0.13.11 util-deprecate: 1.0.2 - /@storybook/core-client@6.4.22(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack@5.84.1): + /@storybook/core-client@6.4.22(typescript@4.9.5)(webpack@5.84.1): resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 typescript: '*' webpack: 5.84.1 peerDependenciesMeta: typescript: optional: true dependencies: - '@storybook/addons': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/addons': 6.4.22 '@storybook/channel-postmessage': 6.4.22 '@storybook/channel-websocket': 6.4.22 - '@storybook/client-api': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/client-api': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/preview-web': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/store': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/ui': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/preview-web': 6.4.22 + '@storybook/store': 6.4.22 + '@storybook/ui': 6.4.22 airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 core-js: 3.37.1 global: 4.4.0 lodash: 4.17.21 qs: 6.12.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 typescript: 4.9.5 @@ -27291,8 +27272,8 @@ packages: /@storybook/core-client@6.5.16(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack@5.84.1): resolution: {integrity: sha512-14IRaDrVtKrQ+gNWC0wPwkCNfkZOKghYV/swCUnQX3rP99defsZK8Hc7xHIYoAiOP5+sc3sweRAxgmFiJeQ1Ig==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' webpack: 5.84.1 peerDependenciesMeta: @@ -27325,11 +27306,11 @@ packages: webpack: 5.84.1(@swc/core@1.5.7)(webpack-cli@4.10.0) dev: false - /@storybook/core-common@6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0): + /@storybook/core-common@6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0): resolution: {integrity: sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -27378,8 +27359,6 @@ packages: picomatch: 2.3.1 pkg-dir: 5.0.0 pretty-hrtime: 1.0.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) resolve-from: 5.0.0 slash: 3.0.0 telejson: 5.3.3 @@ -27400,8 +27379,8 @@ packages: /@storybook/core-common@6.5.16(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0): resolution: {integrity: sha512-2qtnKP3TTOzt2cp6LXKRTh7XrI9z5VanMnMTgeoFcA5ebnndD4V6BExQUdYPClE/QooLx6blUWNgS9dFEpjSqQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -27480,13 +27459,13 @@ packages: dependencies: core-js: 3.37.1 - /@storybook/core-server@6.4.22(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0): + /@storybook/core-server@6.4.22(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0): resolution: {integrity: sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 '@storybook/manager-webpack5': 6.4.22 - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 typescript: '*' peerDependenciesMeta: '@storybook/builder-webpack5': @@ -27497,18 +27476,18 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) - '@storybook/builder-webpack5': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) - '@storybook/core-client': 6.4.22(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack@5.84.1) - '@storybook/core-common': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) + '@storybook/builder-webpack4': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) + '@storybook/core-client': 6.4.22(typescript@4.9.5)(webpack@5.84.1) + '@storybook/core-common': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.22 - '@storybook/manager-webpack4': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) - '@storybook/manager-webpack5': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) + '@storybook/manager-webpack4': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) + '@storybook/manager-webpack5': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) '@storybook/node-logger': 6.4.22 '@storybook/semver': 7.3.2 - '@storybook/store': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/store': 6.4.22 '@types/node': 14.18.63 '@types/node-fetch': 2.6.11 '@types/pretty-hrtime': 1.0.3 @@ -27531,8 +27510,6 @@ packages: node-fetch: 2.7.0 pretty-hrtime: 1.0.3 prompts: 2.4.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) regenerator-runtime: 0.13.11 serve-favicon: 2.5.0 slash: 3.0.0 @@ -27563,8 +27540,8 @@ packages: peerDependencies: '@storybook/builder-webpack5': '*' '@storybook/manager-webpack5': '*' - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' peerDependenciesMeta: '@storybook/builder-webpack5': @@ -27639,12 +27616,12 @@ packages: - webpack-cli dev: false - /@storybook/core@6.4.22(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0)(webpack@5.84.1): + /@storybook/core@6.4.22(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0)(webpack@5.84.1): resolution: {integrity: sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 typescript: '*' webpack: 5.84.1 peerDependenciesMeta: @@ -27653,11 +27630,9 @@ packages: typescript: optional: true dependencies: - '@storybook/builder-webpack5': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) - '@storybook/core-client': 6.4.22(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack@5.84.1) - '@storybook/core-server': 6.4.22(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@storybook/builder-webpack5': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) + '@storybook/core-client': 6.4.22(typescript@4.9.5)(webpack@5.84.1) + '@storybook/core-server': 6.4.22(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) typescript: 4.9.5 webpack: 5.84.1(@swc/core@1.5.7)(webpack-cli@4.10.0) transitivePeerDependencies: @@ -27681,8 +27656,8 @@ packages: peerDependencies: '@storybook/builder-webpack5': '*' '@storybook/manager-webpack5': '*' - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' webpack: 5.84.1 peerDependenciesMeta: @@ -27792,11 +27767,11 @@ packages: - react-dom - supports-color - /@storybook/manager-webpack4@6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0): + /@storybook/manager-webpack4@6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0): resolution: {integrity: sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -27805,12 +27780,12 @@ packages: '@babel/core': 7.24.6 '@babel/plugin-transform-template-literals': 7.24.6(@babel/core@7.24.6) '@babel/preset-react': 7.24.6(@babel/core@7.24.6) - '@storybook/addons': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/core-client': 6.4.22(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack@5.84.1) - '@storybook/core-common': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) + '@storybook/addons': 6.4.22 + '@storybook/core-client': 6.4.22(typescript@4.9.5)(webpack@5.84.1) + '@storybook/core-common': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) '@storybook/node-logger': 6.4.22 - '@storybook/theming': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/ui': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/theming': 6.4.22 + '@storybook/ui': 6.4.22 '@types/node': 14.18.63 '@types/webpack': 4.41.38 babel-loader: 8.3.0(@babel/core@7.24.6)(webpack@5.84.1) @@ -27826,8 +27801,6 @@ packages: html-webpack-plugin: 4.5.2(webpack@5.84.1) node-fetch: 2.7.0 pnp-webpack-plugin: 1.6.4(typescript@4.9.5) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 @@ -27857,8 +27830,8 @@ packages: /@storybook/manager-webpack4@6.5.16(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0): resolution: {integrity: sha512-5VJZwmQU6AgdsBPsYdu886UKBHQ9SJEnFMaeUxKEclXk+iRsmbzlL4GHKyVd6oGX/ZaecZtcHPR6xrzmA4Ziew==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -27914,11 +27887,11 @@ packages: - webpack-cli dev: false - /@storybook/manager-webpack5@6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0): + /@storybook/manager-webpack5@6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0): resolution: {integrity: sha512-BMkOMselT4jOn7EQGt748FurM5ewtDfZtOQPCVK8MZX+HYE2AgjNOzm562TYODIxk12Fkhgj3EIz7GGMe1U3RA==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -27927,12 +27900,12 @@ packages: '@babel/core': 7.24.6 '@babel/plugin-transform-template-literals': 7.24.6(@babel/core@7.24.6) '@babel/preset-react': 7.24.6(@babel/core@7.24.6) - '@storybook/addons': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/core-client': 6.4.22(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack@5.84.1) - '@storybook/core-common': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) + '@storybook/addons': 6.4.22 + '@storybook/core-client': 6.4.22(typescript@4.9.5)(webpack@5.84.1) + '@storybook/core-common': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) '@storybook/node-logger': 6.4.22 - '@storybook/theming': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/ui': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/theming': 6.4.22 + '@storybook/ui': 6.4.22 '@types/node': 14.18.63 babel-loader: 8.3.0(@babel/core@7.24.6)(webpack@5.84.1) case-sensitive-paths-webpack-plugin: 2.4.0 @@ -27946,8 +27919,6 @@ packages: html-webpack-plugin: 5.6.0(webpack@5.84.1) node-fetch: 2.7.0 process: 0.11.10 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 @@ -27976,8 +27947,8 @@ packages: /@storybook/manager-webpack5@6.5.16(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0): resolution: {integrity: sha512-OtxXv8JCe0r/0rE5HxaFicsNsXA+fqZxzokxquFFgrYf/1Jg4d7QX6/pG5wINF+5qInJfVkRG6xhPzv1s5bk9Q==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -28073,25 +28044,23 @@ packages: core-js: 3.37.1 dev: true - /@storybook/preview-web@6.4.22(react-dom@18.3.1)(react@18.3.1): + /@storybook/preview-web@6.4.22: resolution: {integrity: sha512-sWS+sgvwSvcNY83hDtWUUL75O2l2LY/GTAS0Zp2dh3WkObhtuJ/UehftzPZlZmmv7PCwhb4Q3+tZDKzMlFxnKQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@storybook/addons': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/addons': 6.4.22 '@storybook/channel-postmessage': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/store': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/store': 6.4.22 ansi-to-html: 0.6.15 core-js: 3.37.1 global: 4.4.0 lodash: 4.17.21 qs: 6.12.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) regenerator-runtime: 0.13.11 synchronous-promise: 2.0.17 ts-dedent: 2.2.0 @@ -28102,8 +28071,8 @@ packages: /@storybook/preview-web@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-IJnvfe2sKCfk7apN9Fu9U8qibbarrPX5JB55ZzK1amSHVmSDuYk5MIMc/U3NnSQNnvd1DO5v/zMcGgj563hrtg==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@storybook/addons': 6.5.16(react-dom@18.3.1)(react@18.3.1) '@storybook/channel-postmessage': 6.5.16 @@ -28162,14 +28131,14 @@ packages: - supports-color dev: false - /@storybook/react@6.4.22(@babel/core@7.24.6)(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0)(webpack-dev-server@3.11.3): + /@storybook/react@6.4.22(@babel/core@7.24.6)(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0)(webpack-dev-server@3.11.3): resolution: {integrity: sha512-5BFxtiguOcePS5Ty/UoH7C6odmvBYIZutfiy4R3Ua6FYmtxac5vP9r5KjCz1IzZKT8mCf4X+PuK1YvDrPPROgQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: '@babel/core': ^7.11.5 - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 typescript: '*' peerDependenciesMeta: '@babel/core': @@ -28181,14 +28150,14 @@ packages: '@babel/preset-flow': 7.24.6(@babel/core@7.24.6) '@babel/preset-react': 7.24.6(@babel/core@7.24.6) '@pmmmwh/react-refresh-webpack-plugin': 0.5.13(react-refresh@0.11.0)(webpack-dev-server@3.11.3)(webpack@5.84.1) - '@storybook/addons': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/core': 6.4.22(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0)(webpack@5.84.1) - '@storybook/core-common': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(webpack-cli@4.10.0) + '@storybook/addons': 6.4.22 + '@storybook/core': 6.4.22(@storybook/builder-webpack5@6.4.22)(@storybook/manager-webpack5@6.4.22)(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0)(webpack@5.84.1) + '@storybook/core-common': 6.4.22(@swc/core@1.5.7)(eslint@7.32.0)(typescript@4.9.5)(webpack-cli@4.10.0) '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/node-logger': 6.4.22 '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.253f8c1.0(typescript@4.9.5)(webpack@5.84.1) '@storybook/semver': 7.3.2 - '@storybook/store': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/store': 6.4.22 '@types/webpack-env': 1.18.5 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-named-asset-import: 0.3.8(@babel/core@7.24.6) @@ -28197,8 +28166,6 @@ packages: global: 4.4.0 lodash: 4.17.21 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) react-refresh: 0.11.0 read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 @@ -28238,8 +28205,8 @@ packages: '@storybook/builder-webpack5': '*' '@storybook/manager-webpack4': '*' '@storybook/manager-webpack5': '*' - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 require-from-string: ^2.0.2 typescript: '*' peerDependenciesMeta: @@ -28319,11 +28286,11 @@ packages: - webpack-plugin-serve dev: false - /@storybook/router@6.4.22(react-dom@18.3.1)(react@18.3.1): + /@storybook/router@6.4.22: resolution: {integrity: sha512-zeuE8ZgFhNerQX8sICQYNYL65QEi3okyzw7ynF58Ud6nRw4fMxSOHcj2T+nZCIU5ufozRL4QWD/Rg9P2s/HtLw==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 dependencies: '@storybook/client-logger': 6.4.22 core-js: 3.37.1 @@ -28333,18 +28300,16 @@ packages: lodash: 4.17.21 memoizerific: 1.11.3 qs: 6.12.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-router: 6.23.1(react@18.3.1) - react-router-dom: 6.23.1(react-dom@18.3.1)(react@18.3.1) + react-router: 6.23.1(react@16.14.0) + react-router-dom: 6.23.1(react-dom@16.14.0)(react@16.14.0) ts-dedent: 2.2.0 dev: true /@storybook/router@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-ZgeP8a5YV/iuKbv31V8DjPxlV4AzorRiR8OuSt/KqaiYXNXlOoQDz/qMmiNcrshrfLpmkzoq7fSo4T8lWo2UwQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@storybook/client-logger': 6.5.16 core-js: 3.37.1 @@ -28365,8 +28330,8 @@ packages: /@storybook/source-loader@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-fyVl4jrM/5JLrb48aqXPu7sTsmySQaVGFp1zfeqvPPlJRFMastDrePm5XGPN7Qjv1wsKmpuBvuweFKOT1pru3g==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@storybook/addons': 6.5.16(react-dom@18.3.1)(react@18.3.1) '@storybook/client-logger': 6.5.16 @@ -28382,13 +28347,13 @@ packages: regenerator-runtime: 0.13.11 dev: true - /@storybook/store@6.4.22(react-dom@18.3.1)(react@18.3.1): + /@storybook/store@6.4.22: resolution: {integrity: sha512-lrmcZtYJLc2emO+1l6AG4Txm9445K6Pyv9cGAuhOJ9Kks0aYe0YtvMkZVVry0RNNAIv6Ypz72zyKc/QK+tZLAQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@storybook/addons': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/addons': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 @@ -28397,8 +28362,6 @@ packages: global: 4.4.0 lodash: 4.17.21 memoizerific: 1.11.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) regenerator-runtime: 0.13.11 slash: 3.0.0 stable: 0.1.8 @@ -28410,8 +28373,8 @@ packages: /@storybook/store@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-g+bVL5hmMq/9cM51K04e37OviUPHT0rHHrRm5wj/hrf18Kd9120b3sxdQ5Dc+HZ292yuME0n+cyrQPTYx9Epmw==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@storybook/addons': 6.5.16(react-dom@18.3.1)(react@18.3.1) '@storybook/client-logger': 6.5.16 @@ -28460,24 +28423,22 @@ packages: - webpack-cli dev: false - /@storybook/theming@6.4.22(react-dom@18.3.1)(react@18.3.1): + /@storybook/theming@6.4.22: resolution: {integrity: sha512-NVMKH/jxSPtnMTO4VCN1k47uztq+u9fWv4GSnzq/eezxdGg9ceGL4/lCrNGoNajht9xbrsZ4QvsJ/V2sVGM8wA==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@emotion/core': 10.3.1(react@18.3.1) + '@emotion/core': 10.3.1 '@emotion/is-prop-valid': 0.8.8 - '@emotion/styled': 10.3.0(@emotion/core@10.3.1)(react@18.3.1) + '@emotion/styled': 10.3.0(@emotion/core@10.3.1) '@storybook/client-logger': 6.4.22 core-js: 3.37.1 deep-object-diff: 1.1.9 - emotion-theming: 10.3.0(@emotion/core@10.3.1)(react@18.3.1) + emotion-theming: 10.3.0(@emotion/core@10.3.1) global: 4.4.0 memoizerific: 1.11.3 polished: 4.3.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) resolve-from: 5.0.0 ts-dedent: 2.2.0 dev: true @@ -28485,8 +28446,8 @@ packages: /@storybook/theming@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@storybook/client-logger': 6.5.16 core-js: 3.37.1 @@ -28495,38 +28456,36 @@ packages: react-dom: 18.3.1(react@18.3.1) regenerator-runtime: 0.13.11 - /@storybook/ui@6.4.22(react-dom@18.3.1)(react@18.3.1): + /@storybook/ui@6.4.22: resolution: {integrity: sha512-UVjMoyVsqPr+mkS1L7m30O/xrdIEgZ5SCWsvqhmyMUok3F3tRB+6M+OA5Yy+cIVfvObpA7MhxirUT1elCGXsWQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@emotion/core': 10.3.1(react@18.3.1) - '@storybook/addons': 6.4.22(react-dom@18.3.1)(react@18.3.1) - '@storybook/api': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@emotion/core': 10.3.1 + '@storybook/addons': 6.4.22 + '@storybook/api': 6.4.22 '@storybook/channels': 6.4.22 '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/components': 6.4.22 '@storybook/core-events': 6.4.22 - '@storybook/router': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/router': 6.4.22 '@storybook/semver': 7.3.2 - '@storybook/theming': 6.4.22(react-dom@18.3.1)(react@18.3.1) + '@storybook/theming': 6.4.22 copy-to-clipboard: 3.3.3 core-js: 3.37.1 core-js-pure: 3.37.1 - downshift: 6.1.12(react@18.3.1) - emotion-theming: 10.3.0(@emotion/core@10.3.1)(react@18.3.1) + downshift: 6.1.12 + emotion-theming: 10.3.0(@emotion/core@10.3.1) fuse.js: 3.6.1 global: 4.4.0 lodash: 4.17.21 - markdown-to-jsx: 7.4.7(react@18.3.1) + markdown-to-jsx: 7.4.7 memoizerific: 1.11.3 polished: 4.3.1 qs: 6.12.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) react-draggable: 4.4.6(react-dom@18.3.1)(react@18.3.1) - react-helmet-async: 1.3.0(react-dom@18.3.1)(react@18.3.1) + react-helmet-async: 1.3.0 react-sizeme: 3.0.2 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 @@ -28538,8 +28497,8 @@ packages: /@storybook/ui@6.5.16(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-rHn/n12WM8BaXtZ3IApNZCiS+C4Oc5+Lkl4MoctX8V7QSml0SxZBB5hsJ/AiWkgbRxjQpa/L/Nt7/Qw0FjTH/A==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@storybook/addons': 6.5.16(react-dom@18.3.1)(react@18.3.1) '@storybook/api': 6.5.16(react-dom@18.3.1)(react@18.3.1) @@ -29217,8 +29176,8 @@ packages: resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} engines: {node: '>=14'} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: '@babel/runtime': 7.24.6 '@testing-library/dom': 9.3.4 @@ -34223,15 +34182,14 @@ packages: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} - /downshift@6.1.12(react@18.3.1): + /downshift@6.1.12: resolution: {integrity: sha512-7XB/iaSJVS4T8wGFT3WRXmSF1UlBHAA40DshZtkrIscIN+VC+Lh363skLxFTvJwtNgHxAMDGEHT4xsyQFWL+UA==} peerDependencies: - react: 18.3.1 + react: '>=16.12.0' dependencies: '@babel/runtime': 7.24.6 compute-scroll-into-view: 1.0.20 prop-types: 15.8.1 - react: 18.3.1 react-is: 17.0.2 tslib: 2.6.2 dev: true @@ -34317,17 +34275,16 @@ packages: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - /emotion-theming@10.3.0(@emotion/core@10.3.1)(react@18.3.1): + /emotion-theming@10.3.0(@emotion/core@10.3.1): resolution: {integrity: sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA==} peerDependencies: '@emotion/core': ^10.0.27 - react: 18.3.1 + react: '>=16.3.0' dependencies: '@babel/runtime': 7.24.6 - '@emotion/core': 10.3.1(react@18.3.1) + '@emotion/core': 10.3.1 '@emotion/weak-memoize': 0.2.5 hoist-non-react-statics: 3.3.2 - react: 18.3.1 dev: true /encodeurl@1.0.2: @@ -35861,8 +35818,8 @@ packages: resolution: {integrity: sha512-XUrjjBt57e5YoHQtjwc3eNchFBuHvIgN/cS8SC4oIaAn2J/0+bLanUxXizidJKZVeHJam/JrmMnPRjYMglVn5g==} peerDependencies: '@emotion/is-prop-valid': '*' - react: 18.3.1 - react-dom: 18.3.1 + react: ^18.0.0 + react-dom: ^18.0.0 peerDependenciesMeta: '@emotion/is-prop-valid': optional: true @@ -36739,7 +36696,7 @@ packages: /html-react-parser@2.0.0(react@18.3.1): resolution: {integrity: sha512-AI1lhybWGi8w4QkGtEIS3iSGAjeFGaonxl/+CzqzCeNT3g3z/yx2NKsA93trnv2BLjhe+juGLmLeTSUkyYWk9Q==} peerDependencies: - react: 18.3.1 + react: 0.14 || 15 || 16 || 17 || 18 dependencies: domhandler: 4.3.1 html-dom-parser: 2.0.0 @@ -36756,7 +36713,7 @@ packages: /html-to-react@1.7.0(react@18.3.1): resolution: {integrity: sha512-b5HTNaTGyOj5GGIMiWVr1k57egAZ/vGy0GGefnCQ1VW5hu9+eku8AXHtf2/DeD95cj/FKBKYa1J7SWBOX41yUQ==} peerDependencies: - react: 18.3.1 + react: ^0.13.0 || ^0.14.0 || >=15 dependencies: domhandler: 5.0.3 htmlparser2: 9.1.0 @@ -40361,13 +40318,11 @@ packages: /markdown-escapes@1.0.4: resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} - /markdown-to-jsx@7.4.7(react@18.3.1): + /markdown-to-jsx@7.4.7: resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} engines: {node: '>= 10'} peerDependencies: - react: 18.3.1 - dependencies: - react: 18.3.1 + react: '>= 0.14.0' dev: true /material-colors@1.2.6: @@ -42947,7 +42902,7 @@ packages: /qrcode.react@1.0.1(react@18.3.1): resolution: {integrity: sha512-8d3Tackk8IRLXTo67Y+c1rpaiXjoz/Dd2HpcMdW//62/x8J1Nbho14Kh8x974t9prsLHN6XqVgcnRiBGFptQmg==} peerDependencies: - react: 18.3.1 + react: ^15.5.3 || ^16.0.0 || ^17.0.0 dependencies: loose-envify: 1.4.0 prop-types: 15.8.1 @@ -43046,8 +43001,8 @@ packages: /rc-motion@2.9.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-QD4bUqByjVQs7PhUT1d4bNxvtTcK9ETwtg7psbDfo6TmYalH/1hhjj4r2hbhW7g5OOEqYHhfwfj4noIvuOVRtQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: '@babel/runtime': 7.24.6 classnames: 2.5.1 @@ -43058,8 +43013,8 @@ packages: /rc-resize-observer@1.4.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: '@babel/runtime': 7.24.6 classnames: 2.5.1 @@ -43072,8 +43027,8 @@ packages: resolution: {integrity: sha512-V1hkJt092VrOVjNyfj5IYbZKRMHxWihZarvA5hPL/eqm7o2+0SNkeidFYm7LVVBrAKBpOpa0l8xt04uiqOd+6w==} engines: {node: '>=10.x'} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '*' + react-dom: '*' dependencies: '@babel/runtime': 7.24.6 classnames: 2.5.1 @@ -43086,8 +43041,8 @@ packages: /rc-util@5.41.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-xtlCim9RpmVv0Ar2Nnc3WfJCxjQkTf3xHPWoFdjp1fSs2NirQwqiQrfqdU9HUe0kdfb168M/T8Dq0IaX50xeKg==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: '@babel/runtime': 7.24.6 react: 18.3.1 @@ -43098,8 +43053,8 @@ packages: resolution: {integrity: sha512-rA+W5xryhklJAcmswNyuKB3ZGeB855io+yOFQK5u/RXhjdshGblfKpNkQr4/9fBhZns0+uiL/0/s6IP2krtSmg==} engines: {node: '>=8.x'} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: '@babel/runtime': 7.24.6 classnames: 2.5.1 @@ -43134,7 +43089,7 @@ packages: resolution: {integrity: sha512-rutEKVgvFhWcy/GeVA1hFbqrO89qLqgqdhUr7YhYgIzdyICdlRQv+ztuNvOFQMXrO0fLt0VkaYOdMdYdQgsSUA==} peerDependencies: codemirror: 5.x - react: 18.3.1 + react: '>=15.5 <=16.x' dependencies: codemirror: 5.65.16 react: 18.3.1 @@ -43143,7 +43098,7 @@ packages: /react-color@2.19.3(react@18.3.1): resolution: {integrity: sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==} peerDependencies: - react: 18.3.1 + react: '*' dependencies: '@icons/material': 0.2.4(react@18.3.1) lodash: 4.17.21 @@ -43155,14 +43110,11 @@ packages: tinycolor2: 1.6.0 dev: false - /react-colorful@5.6.1(react-dom@18.3.1)(react@18.3.1): + /react-colorful@5.6.1: resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: '>=16.8.0' + react-dom: '>=16.8.0' dev: true /react-docgen-typescript-loader@3.7.2(typescript@4.9.5)(webpack@5.84.1): @@ -43211,10 +43163,21 @@ packages: transitivePeerDependencies: - supports-color + /react-dom@16.14.0(react@16.14.0): + resolution: {integrity: sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==} + peerDependencies: + react: ^16.14.0 + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + prop-types: 15.8.1 + react: 16.14.0 + scheduler: 0.19.1 + /react-dom@18.3.1(react@18.3.1): resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: - react: 18.3.1 + react: ^18.3.1 dependencies: loose-envify: 1.4.0 react: 18.3.1 @@ -43223,8 +43186,8 @@ packages: /react-draggable@4.4.6(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>= 16.3.0' + react-dom: '>= 16.3.0' dependencies: clsx: 1.2.1 prop-types: 15.8.1 @@ -43234,8 +43197,8 @@ packages: /react-element-to-jsx-string@14.3.4(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 dependencies: '@base2/pretty-print-object': 1.0.1 is-plain-object: 5.0.0 @@ -43255,7 +43218,7 @@ packages: resolution: {integrity: sha512-x3XYvozolECp3nIjly+4QqxdjSSWfcnpGEL5K8OBT6xmGrq5kBqbA6+/tOqoom9NwqIPPbxPNsOViFlbKgowbA==} peerDependencies: final-form: ^4.20.4 - react: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@babel/runtime': 7.24.6 final-form: 4.20.10 @@ -43265,8 +43228,8 @@ packages: /react-floater@0.7.9(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-NXqyp9o8FAXOATOEo0ZpyaQ2KPb4cmPMXGWkx377QtJkIXHlHRAGer7ai0r0C1kG5gf+KJ6Gy+gdNIiosvSicg==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: 15 - 18 + react-dom: 15 - 18 dependencies: deepmerge: 4.3.1 is-lite: 0.8.2 @@ -43277,28 +43240,24 @@ packages: tree-changes: 0.9.3 dev: false - /react-head@3.4.2(react-dom@18.3.1)(react@18.3.1): + /react-head@3.4.2: resolution: {integrity: sha512-mnl6u7E0SSzY9w+mExKGVz8vW/oObUTnj+vpRaZF6jcdjFcCGs0vl8MRwlRws56dye3f1CpzU7C/hz3b3S2BBA==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=16.3' + react-dom: '>=16.3' dependencies: '@babel/runtime': 7.24.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) dev: false - /react-helmet-async@1.3.0(react-dom@18.3.1)(react@18.3.1): + /react-helmet-async@1.3.0: resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 dependencies: '@babel/runtime': 7.24.6 invariant: 2.2.4 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) react-fast-compare: 3.2.2 shallowequal: 1.1.0 dev: true @@ -43306,7 +43265,7 @@ packages: /react-helmet@5.2.1(react@18.3.1): resolution: {integrity: sha512-CnwD822LU8NDBnjCpZ4ySh8L6HYyngViTZLfBBb3NjtrpN8m49clH8hidHouq20I51Y6TpCTISCBbqiY5GamwA==} peerDependencies: - react: 18.3.1 + react: '>=15.0.0' dependencies: object-assign: 4.1.1 prop-types: 15.8.1 @@ -43315,13 +43274,13 @@ packages: react-side-effect: 1.2.0(react@18.3.1) dev: false - /react-hot-loader@4.13.1(react-dom@18.3.1)(react@18.3.1): + /react-hot-loader@4.13.1: resolution: {integrity: sha512-ZlqCfVRqDJmMXTulUGic4lN7Ic1SXgHAFw7y/Jb7t25GBgTR0fYAJ8uY4mrpxjRyWGWmqw77qJQGnYbzCvBU7g==} engines: {node: '>= 6'} peerDependencies: '@types/react': 18.0.18 - react: 18.3.1 - react-dom: 18.3.1 + react: ^15.0.0 || ^16.0.0 || ^17.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -43331,8 +43290,6 @@ packages: hoist-non-react-statics: 3.3.2 loader-utils: 2.0.4 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) react-lifecycles-compat: 3.0.4 shallowequal: 1.1.0 source-map: 0.7.4 @@ -43342,7 +43299,7 @@ packages: resolution: {integrity: sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==} peerDependencies: i18next: '>= 19.0.0' - react: 18.3.1 + react: '>= 16.8.0' react-dom: '*' react-native: '*' peerDependenciesMeta: @@ -43362,7 +43319,7 @@ packages: resolution: {integrity: sha512-PWAqdqhxhHIv80dT9znP2KvS+hfkbRovFp4zFYHFFlOoQLRiawIic81gKb3U1wEyJZgMwgs3JoLtwryASRWP3Q==} peerDependencies: '@types/react': 18.0.18 - react: 18.3.1 + react: '>=0.0.0 <=99' dependencies: '@types/react': 18.0.18 react: 18.3.1 @@ -43371,7 +43328,7 @@ packages: /react-inspector@5.1.1(react@18.3.1): resolution: {integrity: sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==} peerDependencies: - react: 18.3.1 + react: ^16.8.4 || ^17.0.0 dependencies: '@babel/runtime': 7.24.6 is-dom: 1.1.0 @@ -43391,8 +43348,8 @@ packages: /react-joyride@2.8.2(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-2QY8HB1G0I2OT0PKMUz7gg2HAjdkG2Bqi13r0Bb1V16PAwfb9khn4wWBTOJsGsjulbAWiQ3/0YrgNUHGFmuifw==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: 15 - 18 + react-dom: 15 - 18 dependencies: '@gilbarbara/deep-equal': 0.3.1 deep-diff: 1.0.2 @@ -43418,7 +43375,7 @@ packages: /react-markdown@4.3.1(react@18.3.1): resolution: {integrity: sha512-HQlWFTbDxTtNY6bjgp3C3uv1h2xcjCSi1zAEzfBW9OwJJvENSYiLXWNXN5hHLsoqai7RnZiiHzcnWdXk2Splzw==} peerDependencies: - react: 18.3.1 + react: ^15.0.0 || ^16.0.0 dependencies: html-to-react: 1.7.0(react@18.3.1) mdast-add-list-metadata: 1.0.1 @@ -43431,11 +43388,23 @@ packages: xtend: 4.0.2 dev: false + /react-notification-system@0.4.0(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-5WhXnjkYC07zqXruCiUXDU9iHjVxZlL1zgHpNgXk91A5ghV1AHrWVrJYo1XM4SnwlKy5NLdftkaTl+pTuVFAqw==} + peerDependencies: + react: "0.14.x || ^15.0.0 ||\_^16.0.0" + react-dom: 0.14.x || ^15.0.0 || ^16.0.0 + dependencies: + object-assign: 4.1.1 + prop-types: 15.8.1 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + dev: false + /react-notification-system@0.4.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-5WhXnjkYC07zqXruCiUXDU9iHjVxZlL1zgHpNgXk91A5ghV1AHrWVrJYo1XM4SnwlKy5NLdftkaTl+pTuVFAqw==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: "0.14.x || ^15.0.0 ||\_^16.0.0" + react-dom: 0.14.x || ^15.0.0 || ^16.0.0 dependencies: object-assign: 4.1.1 prop-types: 15.8.1 @@ -43443,27 +43412,23 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /react-password-strength-bar@0.3.5(react-dom@18.3.1)(react@18.3.1): + /react-password-strength-bar@0.3.5: resolution: {integrity: sha512-e48tYTKZ5gy1tUYYT3aJ+BWggg0RE/ZUN8ep6sHgGuI9SqJTgd4WL4TFgT37kX09NyQwSOcZKHpcKQEtCEECuA==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.6 || ^17 + react-dom: ^16.8.6 || ^17 dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) zxcvbn: 4.4.2 dev: false - /react-popper-tooltip@3.1.1(react-dom@18.3.1)(react@18.3.1): + /react-popper-tooltip@3.1.1: resolution: {integrity: sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.6.0 || ^17.0.0 + react-dom: ^16.6.0 || ^17.0.0 dependencies: '@babel/runtime': 7.24.6 '@popperjs/core': 2.11.8 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1)(react@18.3.1) dev: true @@ -43471,8 +43436,8 @@ packages: resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} peerDependencies: '@popperjs/core': ^2.0.0 - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17 || ^18 + react-dom: ^16.8.0 || ^17 || ^18 dependencies: '@popperjs/core': 2.11.8 react: 18.3.1 @@ -43487,7 +43452,7 @@ packages: /react-redux@7.2.9(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==} peerDependencies: - react: 18.3.1 + react: ^16.8.3 || ^17 || ^18 react-dom: '*' react-native: '*' peerDependenciesMeta: @@ -43523,7 +43488,7 @@ packages: /react-router-dom@4.3.1(react@18.3.1): resolution: {integrity: sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==} peerDependencies: - react: 18.3.1 + react: '>=15' dependencies: history: 4.10.1 invariant: 2.2.4 @@ -43534,22 +43499,22 @@ packages: warning: 4.0.3 dev: false - /react-router-dom@6.23.1(react-dom@18.3.1)(react@18.3.1): + /react-router-dom@6.23.1(react-dom@16.14.0)(react@16.14.0): resolution: {integrity: sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==} engines: {node: '>=14.0.0'} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=16.8' + react-dom: '>=16.8' dependencies: '@remix-run/router': 1.16.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-router: 6.23.1(react@18.3.1) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + react-router: 6.23.1(react@16.14.0) /react-router@4.3.1(react@18.3.1): resolution: {integrity: sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==} peerDependencies: - react: 18.3.1 + react: '>=15' dependencies: history: 4.10.1 hoist-non-react-statics: 2.5.5 @@ -43561,19 +43526,19 @@ packages: warning: 4.0.3 dev: false - /react-router@6.23.1(react@18.3.1): + /react-router@6.23.1(react@16.14.0): resolution: {integrity: sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==} engines: {node: '>=14.0.0'} peerDependencies: - react: 18.3.1 + react: '>=16.8' dependencies: '@remix-run/router': 1.16.1 - react: 18.3.1 + react: 16.14.0 /react-side-effect@1.2.0(react@18.3.1): resolution: {integrity: sha512-v1ht1aHg5k/thv56DRcjw+WtojuuDHFUgGfc+bFHOWsF4ZK6C2V57DO0Or0GPsg6+LSTE0M6Ry/gfzhzSwbc5w==} peerDependencies: - react: 18.3.1 + react: ^0.13.0 || ^0.14.0 || ^15.0.0 || ^16.0.0 dependencies: react: 18.3.1 shallowequal: 1.1.0 @@ -43591,8 +43556,8 @@ packages: /react-smooth@4.0.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 @@ -43601,29 +43566,27 @@ packages: react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) dev: false - /react-syntax-highlighter@13.5.3(react@18.3.1): + /react-syntax-highlighter@13.5.3: resolution: {integrity: sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==} peerDependencies: - react: 18.3.1 + react: '>= 0.14.0' dependencies: '@babel/runtime': 7.24.6 highlight.js: 10.7.3 lowlight: 1.20.0 prismjs: 1.29.0 - react: 18.3.1 refractor: 3.6.0 dev: true - /react-textarea-autosize@8.5.3(react@18.3.1): + /react-textarea-autosize@8.5.3: resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} engines: {node: '>=10'} peerDependencies: - react: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@babel/runtime': 7.24.6 - react: 18.3.1 - use-composed-ref: 1.3.0(react@18.3.1) - use-latest: 1.2.1(react@18.3.1) + use-composed-ref: 1.3.0 + use-latest: 1.2.1 transitivePeerDependencies: - '@types/react' dev: true @@ -43633,8 +43596,8 @@ packages: engines: {node: '>=8', npm: '>=5'} peerDependencies: prop-types: ^15.5.4 - react: 18.3.1 - react-dom: 18.3.1 + react: ^15.0.0 || ^16.0.0 + react-dom: ^15.0.0 || ^16.0.0 dependencies: prop-types: 15.8.1 react: 18.3.1 @@ -43644,8 +43607,8 @@ packages: /react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=16.6.0' + react-dom: '>=16.6.0' dependencies: '@babel/runtime': 7.24.6 dom-helpers: 5.2.1 @@ -43658,7 +43621,7 @@ packages: /react-world-flags@1.6.0(react@18.3.1): resolution: {integrity: sha512-eutSeAy5YKoVh14js/JUCSlA6EBk1n4k+bDaV+NkNB50VhnG+f4QDTpYycnTUTsZ5cqw/saPmk0Z4Fa0VVZ1Iw==} peerDependencies: - react: 18.3.1 + react: '>=0.14' dependencies: react: 18.3.1 svg-country-flags: 1.2.10 @@ -43666,6 +43629,14 @@ packages: world-countries: 5.0.0 dev: false + /react@16.14.0: + resolution: {integrity: sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + prop-types: 15.8.1 + /react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -43675,7 +43646,7 @@ packages: /reactcss@1.2.3(react@18.3.1): resolution: {integrity: sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==} peerDependencies: - react: 18.3.1 + react: '*' dependencies: lodash: 4.17.21 react: 18.3.1 @@ -43684,8 +43655,8 @@ packages: /reactflow@11.7.2(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-HBudD8BwZacOMqX8fbkiXbeBQs3nRezWVLCDurfc+tTeHsA7988uyaIOhrnKgYCcKtlpJaspsnxDZk+5JmmHxA==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>=17' + react-dom: '>=17' dependencies: '@reactflow/background': 11.2.2(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1) '@reactflow/controls': 11.1.13(@types/react@18.0.18)(react-dom@18.3.1)(react@18.3.1) @@ -43893,8 +43864,8 @@ packages: resolution: {integrity: sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==} engines: {node: '>=14'} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 @@ -43957,7 +43928,7 @@ packages: engines: {node: '>=8.10'} peerDependencies: immutable: ^3.8.2 || ^4.0.0 - react: 18.3.1 + react: ^16.4.2 || ^17.0.0 || ^18.0.0 react-redux: ^6.0.1 || ^7.0.0 || ^8.0.0 redux: ^3.7.2 || ^4.0.0 peerDependenciesMeta: @@ -44717,6 +44688,12 @@ packages: xmlchars: 2.2.0 dev: true + /scheduler@0.19.1: + resolution: {integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + /scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} dependencies: @@ -44815,8 +44792,8 @@ packages: /semantic-ui-react@2.1.5(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-nIqmmUNpFHfovEb+RI2w3E2/maZQutd8UIWyRjf1SLse+XF51hI559xbz/sLN3O6RpLjr/echLOOXwKCirPy3Q==} peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@babel/runtime': 7.24.6 '@fluentui/react-component-event-listener': 0.63.1(react-dom@18.3.1)(react@18.3.1) @@ -45824,8 +45801,8 @@ packages: resolution: {integrity: sha512-RNqj14kYzw++6Sr38n7197xG33ipEOktGElty4I70IKzQF1jzaD1U4xQ+Ny/i03UUhHlC5NWEO+d8olRCDji6g==} requiresBuild: true peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 + react: '>= 16.3.0' + react-dom: '>= 16.3.0' dependencies: '@babel/helper-module-imports': 7.24.6 '@babel/traverse': 7.24.6(supports-color@5.5.0) @@ -46002,7 +45979,7 @@ packages: /swr@2.2.5(react@18.3.1): resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==} peerDependencies: - react: 18.3.1 + react: ^16.11.0 || ^17.0.0 || ^18.0.0 dependencies: client-only: 0.0.1 react: 18.3.1 @@ -47166,43 +47143,38 @@ packages: punycode: 1.4.1 qs: 6.12.1 - /use-composed-ref@1.3.0(react@18.3.1): + /use-composed-ref@1.3.0: resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} peerDependencies: - react: 18.3.1 - dependencies: - react: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 dev: true - /use-isomorphic-layout-effect@1.1.2(react@18.3.1): + /use-isomorphic-layout-effect@1.1.2: resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} peerDependencies: '@types/react': '*' - react: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true - dependencies: - react: 18.3.1 dev: true - /use-latest@1.2.1(react@18.3.1): + /use-latest@1.2.1: resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} peerDependencies: '@types/react': '*' - react: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true dependencies: - react: 18.3.1 - use-isomorphic-layout-effect: 1.1.2(react@18.3.1) + use-isomorphic-layout-effect: 1.1.2 dev: true /use-sync-external-store@1.2.0(react@18.3.1): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: - react: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: react: 18.3.1 dev: false @@ -47210,7 +47182,7 @@ packages: /use-sync-external-store@1.2.2(react@18.3.1): resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: - react: 18.3.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: react: 18.3.1 dev: false @@ -48266,7 +48238,7 @@ packages: peerDependencies: '@types/react': 18.0.18 immer: '>=9.0.6' - react: 18.3.1 + react: '>=16.8' peerDependenciesMeta: '@types/react': optional: true From 34b1b04cadee820b1b64ff882b6c969a25b8d4df Mon Sep 17 00:00:00 2001 From: rushannanayakkara Date: Mon, 24 Jun 2024 22:06:01 +0530 Subject: [PATCH 28/29] addressing comments --- .../models/password-recovery.ts | 2 +- .../mgt/recovery/endpoint/i18n/Resources_pt_PT.properties | 6 +++--- .../form/src/components/adapters/__DEPRECATED__adapters.tsx | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/features/admin.server-configurations.v1/models/password-recovery.ts b/features/admin.server-configurations.v1/models/password-recovery.ts index ba615dda0cb..dad0090f317 100644 --- a/features/admin.server-configurations.v1/models/password-recovery.ts +++ b/features/admin.server-configurations.v1/models/password-recovery.ts @@ -126,7 +126,7 @@ export interface PasswordRecoveryFormUpdatableConfigsInterface { /** * Expiry time for the recovery link. */ - "Recovery.ExpiryTime": any; + "Recovery.ExpiryTime": number; /** * Enable email based recovery. */ diff --git a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties index d39ac2bcfd9..1a4843c62d2 100644 --- a/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties +++ b/identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_pt_PT.properties @@ -275,9 +275,9 @@ enter.your.username=Entre com seu nome de usuário error.enter.code=Por favor, digite o código! choose.other.option=Escolha uma opção diferente resend.code.success=Um novo OTP foi enviado para o seu telemóvel. -enter.code.sent.smsotp=Insira o código enviado para o seu telemóvel. -sms.otp.resend.code=Reenviar código. -sms.otp.submit.button=Continuar. +enter.code.sent.smsotp=Insira o código enviado para o seu telemóvel +sms.otp.resend.code=Reenviar código +sms.otp.submit.button=Continuar # Errors error.occurred=Ocorreu um erro diff --git a/modules/form/src/components/adapters/__DEPRECATED__adapters.tsx b/modules/form/src/components/adapters/__DEPRECATED__adapters.tsx index 45be8b52352..ae43b63cf6b 100644 --- a/modules/form/src/components/adapters/__DEPRECATED__adapters.tsx +++ b/modules/form/src/components/adapters/__DEPRECATED__adapters.tsx @@ -45,9 +45,9 @@ import { import { QueryParameters, Scopes } from "../../addons"; import { ColorPickerAdapterPropsInterface, - __DEPRECATED__CheckboxAdapterPropsInterface, FieldButtonTypes, - RadioAdapterPropsInterface + RadioAdapterPropsInterface, + __DEPRECATED__CheckboxAdapterPropsInterface } from "../../models"; /** @@ -65,7 +65,7 @@ const ENTER_KEY: string = "Enter"; export const __DEPRECATED__TextFieldAdapter = (props:FieldRenderProps ): ReactElement => { const { childFieldProps, input, meta, parentFormProps } = props; -debugger + return ( Date: Tue, 25 Jun 2024 09:35:34 +0530 Subject: [PATCH 29/29] Addressing comments --- ...pans-carry.md => wicked-fireants-punch.md} | 4 ++- .../account-recovery/account-recovery.tsx | 2 +- .../options/sms-recovery/sms-recovery.tsx | 27 ++++++++++++------- .../__tests__/password-recovery-form.test.tsx | 1 - 4 files changed, 21 insertions(+), 13 deletions(-) rename .changeset/{sharp-pans-carry.md => wicked-fireants-punch.md} (58%) diff --git a/.changeset/sharp-pans-carry.md b/.changeset/wicked-fireants-punch.md similarity index 58% rename from .changeset/sharp-pans-carry.md rename to .changeset/wicked-fireants-punch.md index 4bb47f6146d..86abdb651b7 100644 --- a/.changeset/sharp-pans-carry.md +++ b/.changeset/wicked-fireants-punch.md @@ -1,9 +1,11 @@ --- "@wso2is/identity-apps-core": minor "@wso2is/console": minor +"@wso2is/admin.server-configurations.v1": patch +"@wso2is/admin.branding.v1": patch +"@wso2is/admin.core.v1": patch "@wso2is/myaccount": patch "@wso2is/i18n": patch -"@wso2is/features": patch --- Introduce sms otp for password recovery diff --git a/apps/myaccount/src/components/account-recovery/account-recovery.tsx b/apps/myaccount/src/components/account-recovery/account-recovery.tsx index 3843c45de60..658f3e803de 100644 --- a/apps/myaccount/src/components/account-recovery/account-recovery.tsx +++ b/apps/myaccount/src/components/account-recovery/account-recovery.tsx @@ -213,7 +213,7 @@ export const AccountRecoveryComponent: FunctionComponent = isNotificationRecoverySMSOTPEnabled ? ( ) : null } diff --git a/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.tsx b/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.tsx index 2ece54b3eda..51dfc3bf47d 100644 --- a/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.tsx +++ b/apps/myaccount/src/components/account-recovery/options/sms-recovery/sms-recovery.tsx @@ -39,16 +39,23 @@ import { EditSection } from "../../../shared"; import "./sms-recovery.scss"; /** - * SMS key. + * SMS form type to be used as active form key. */ -const SMS: string = "sms"; +const FORM_TYPE_SMS: string = "sms"; /** * Prop types for the SMSRecoveryComponent component. * Also see {@link SMSRecovery.defaultProps} */ interface SMSRecoveryProps extends IdentifiableComponentInterface { + /** + * The function to be called when an alert is fired. + * @param alert - The fired event. + */ onAlertFired: (alert: AlertInterface) => void; + /** + * Enable editing mobile number. + */ enableEditMobile?: boolean; } @@ -147,7 +154,7 @@ export const SMSRecovery: React.FunctionComponent = ( dispatch(setActiveForm(null)); }) .catch((error: AxiosError) => { - if (error.response && error.response.data && error.response.data.detail) { + if (error?.response?.data?.detail) { onAlertFired({ description: t( "myAccount:components.accountRecovery.SMSRecovery." + @@ -217,7 +224,7 @@ export const SMSRecovery: React.FunctionComponent = ( * This is called when the edit icon is clicked. */ const handleEdit = () : void => { - dispatch(setActiveForm(CommonConstants.SECURITY + SMS)); + dispatch(setActiveForm(CommonConstants.SECURITY + FORM_TYPE_SMS)); }; /** @@ -241,7 +248,7 @@ export const SMSRecovery: React.FunctionComponent = ( * elements based on if the edit icon has been clicked */ const showEditView = () : ReactElement => { - if (activeForm !== CommonConstants.SECURITY+SMS) { + if (activeForm !== CommonConstants.SECURITY+FORM_TYPE_SMS) { return ( @@ -330,18 +337,18 @@ export const SMSRecovery: React.FunctionComponent = ( { `${componentId}-edit-section-form-mobile-field` } autoFocus={ true } readOnly={ !enableEditMobile } - label={ t( "myAccount:components.accountRecovery." + + label={ t("myAccount:components.accountRecovery." + "SMSRecovery.forms.mobileResetForm.inputs." + "mobile.label" ) } onSubmit={ handleSubmit } name="mobile" - placeholder={ t( "myAccount:components." + + placeholder={ t("myAccount:components." + "accountRecovery.SMSRecovery.forms" + ".mobileResetForm.inputs.mobile.placeholder" ) } required={ true } - requiredErrorMessage={ t( "myAccount:" + + requiredErrorMessage={ t("myAccount:" + "components.accountRecovery.SMSRecovery.forms" + ".mobileResetForm.inputs.mobile.validations.empty" ) } @@ -355,7 +362,7 @@ export const SMSRecovery: React.FunctionComponent = ( ".forms.mobileResetForm.inputs.mobile." + "validations.empty" ).toString(); - } else if ( !FormValidation + } else if (!FormValidation .mobileNumber(value.toString())) { return t("myAccount:components." + "accountRecovery.SMSRecovery" + @@ -369,7 +376,7 @@ export const SMSRecovery: React.FunctionComponent = ( <>

- { t( "myAccount:components.profile.forms." + + { t("myAccount:components.profile.forms." + "mobileChangeForm.inputs.mobile.note" ) }

diff --git a/features/admin.server-configurations.v1/components/__tests__/password-recovery-form.test.tsx b/features/admin.server-configurations.v1/components/__tests__/password-recovery-form.test.tsx index 9d1eb3f82d9..53db5347d43 100644 --- a/features/admin.server-configurations.v1/components/__tests__/password-recovery-form.test.tsx +++ b/features/admin.server-configurations.v1/components/__tests__/password-recovery-form.test.tsx @@ -19,7 +19,6 @@ import React from "react"; import "@testing-library/jest-dom"; import { fireEvent, render, screen } from "../../../test-configs/utils"; - import { PasswordRecoveryConfigurationForm } from "../../forms"; import { PasswordRecoveryConfigurationFormPropsInterface } from "../../models";