Skip to content

Commit 6902c28

Browse files
authored
fix(console): add connector checks in mfa page (#7777)
1 parent edd5c4e commit 6902c28

File tree

19 files changed

+227
-19
lines changed
  • packages
    • console/src/pages/Mfa/MfaForm
    • phrases/src/locales
      • ar/translation/admin-console
      • de/translation/admin-console
      • en/translation/admin-console
      • es/translation/admin-console
      • fr/translation/admin-console
      • it/translation/admin-console
      • ja/translation/admin-console
      • ko/translation/admin-console
      • pl-pl/translation/admin-console
      • pt-br/translation/admin-console
      • pt-pt/translation/admin-console
      • ru/translation/admin-console
      • th/translation/admin-console
      • tr-tr/translation/admin-console
      • zh-cn/translation/admin-console
      • zh-hk/translation/admin-console
      • zh-tw/translation/admin-console

19 files changed

+227
-19
lines changed

packages/console/src/pages/Mfa/MfaForm/index.module.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,7 @@
2525
.unlockMfaNotice {
2626
margin-top: _.unit(4);
2727
}
28+
29+
.connectorWarning {
30+
margin-top: _.unit(2);
31+
}

packages/console/src/pages/Mfa/MfaForm/index.tsx

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
/* eslint-disable max-lines */
12
import {
23
adminTenantId,
4+
ConnectorType,
35
MfaFactor,
46
MfaPolicy,
57
OrganizationRequiredMfaPolicy,
@@ -10,7 +12,7 @@ import {
1012
import { useContext, useEffect, useMemo } from 'react';
1113
import { Controller, useForm } from 'react-hook-form';
1214
import { toast } from 'react-hot-toast';
13-
import { useTranslation } from 'react-i18next';
15+
import { Trans, useTranslation } from 'react-i18next';
1416

1517
import DetailsForm from '@/components/DetailsForm';
1618
import FormCard from '@/components/FormCard';
@@ -25,7 +27,9 @@ import FormField from '@/ds-components/FormField';
2527
import InlineNotification from '@/ds-components/InlineNotification';
2628
import Select from '@/ds-components/Select';
2729
import Switch from '@/ds-components/Switch';
30+
import TextLink from '@/ds-components/TextLink';
2831
import useApi from '@/hooks/use-api';
32+
import useEnabledConnectorTypes from '@/hooks/use-enabled-connector-types';
2933
import { trySubmitSafe } from '@/utils/form';
3034
import { isPaidPlan } from '@/utils/subscription';
3135

@@ -49,6 +53,7 @@ function MfaForm({ data, signInMethods, onMfaUpdated }: Props) {
4953
mutateSubscriptionQuotaAndUsages,
5054
} = useContext(SubscriptionDataContext);
5155
const { currentTenantId } = useContext(TenantsContext);
56+
const { isConnectorTypeEnabled } = useEnabledConnectorTypes();
5257

5358
const isMfaDisabled =
5459
isCloud && !currentSubscriptionQuota.mfaEnabled && !isPaidPlan(planId, isEnterprisePlan);
@@ -84,6 +89,9 @@ function MfaForm({ data, signInMethods, onMfaUpdated }: Props) {
8489
);
8590
}, [signInMethods]);
8691

92+
const hasEmailConnector = isConnectorTypeEnabled(ConnectorType.Email);
93+
const hasSmsConnector = isConnectorTypeEnabled(ConnectorType.Sms);
94+
8795
const isPolicySettingsDisabled = useMemo(() => {
8896
if (isMfaDisabled) {
8997
return true;
@@ -160,6 +168,17 @@ function MfaForm({ data, signInMethods, onMfaUpdated }: Props) {
160168
return;
161169
}
162170

171+
// Check connector availability for email and SMS verification codes
172+
if (formData.emailVerificationCodeEnabled && !hasEmailConnector) {
173+
toast.error(t('mfa.no_email_connector_error'));
174+
return;
175+
}
176+
177+
if (formData.phoneVerificationCodeEnabled && !hasSmsConnector) {
178+
toast.error(t('mfa.no_sms_connector_error'));
179+
return;
180+
}
181+
163182
const { mfa: updatedMfaConfig } = await api
164183
.patch('api/sign-in-exp', {
165184
json: { mfa: mfaConfig },
@@ -200,22 +219,56 @@ function MfaForm({ data, signInMethods, onMfaUpdated }: Props) {
200219
/>
201220
{isDevFeaturesEnabled && (
202221
<>
203-
<Switch
204-
disabled={isMfaDisabled || isPhoneCodePrimarySignInMethod}
205-
label={<FactorLabel type={MfaFactor.PhoneVerificationCode} />}
206-
tooltip={
207-
isPhoneCodePrimarySignInMethod ? t('mfa.phone_primary_method_tip') : undefined
208-
}
209-
{...register('phoneVerificationCodeEnabled')}
210-
/>
211-
<Switch
212-
disabled={isMfaDisabled || isEmailCodePrimarySignInMethod}
213-
label={<FactorLabel type={MfaFactor.EmailVerificationCode} />}
214-
tooltip={
215-
isEmailCodePrimarySignInMethod ? t('mfa.email_primary_method_tip') : undefined
216-
}
217-
{...register('emailVerificationCodeEnabled')}
218-
/>
222+
<div>
223+
<Switch
224+
disabled={isMfaDisabled || isPhoneCodePrimarySignInMethod}
225+
label={<FactorLabel type={MfaFactor.PhoneVerificationCode} />}
226+
tooltip={
227+
isPhoneCodePrimarySignInMethod
228+
? t('mfa.phone_primary_method_tip')
229+
: undefined
230+
}
231+
{...register('phoneVerificationCodeEnabled')}
232+
/>
233+
{formValues.phoneVerificationCodeEnabled && !hasSmsConnector && (
234+
<InlineNotification className={styles.connectorWarning}>
235+
<Trans
236+
components={{
237+
a: <TextLink to="/connectors" />,
238+
}}
239+
>
240+
{t('mfa.no_sms_connector_warning', {
241+
link: t('mfa.setup_link'),
242+
})}
243+
</Trans>
244+
</InlineNotification>
245+
)}
246+
</div>
247+
<div>
248+
<Switch
249+
disabled={isMfaDisabled || isEmailCodePrimarySignInMethod}
250+
label={<FactorLabel type={MfaFactor.EmailVerificationCode} />}
251+
tooltip={
252+
isEmailCodePrimarySignInMethod
253+
? t('mfa.email_primary_method_tip')
254+
: undefined
255+
}
256+
{...register('emailVerificationCodeEnabled')}
257+
/>
258+
{formValues.emailVerificationCodeEnabled && !hasEmailConnector && (
259+
<InlineNotification className={styles.connectorWarning}>
260+
<Trans
261+
components={{
262+
a: <TextLink to="/connectors" />,
263+
}}
264+
>
265+
{t('mfa.no_email_connector_warning', {
266+
link: t('mfa.setup_link'),
267+
})}
268+
</Trans>
269+
</InlineNotification>
270+
)}
271+
</div>
219272
</>
220273
)}
221274
<div className={styles.backupCodeField}>
@@ -297,3 +350,4 @@ function MfaForm({ data, signInMethods, onMfaUpdated }: Props) {
297350
}
298351

299352
export default MfaForm;
353+
/* eslint-enable max-lines */

packages/phrases/src/locales/ar/translation/admin-console/mfa.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ const mfa = {
4949
'رمز التحقق عبر البريد الإلكتروني هو بالفعل طريقتك الرئيسية لتسجيل الدخول. للحفاظ على الأمان، لا يمكن إعادة استخدامه لـ MFA.',
5050
phone_primary_method_tip:
5151
'رمز التحقق عبر الرسائل القصيرة هو بالفعل طريقتك الرئيسية لتسجيل الدخول. للحفاظ على الأمان، لا يمكن إعادة استخدامه لـ MFA.',
52+
no_email_connector_warning:
53+
'لم يتم إعداد موصل البريد الإلكتروني بعد. قبل إكمال التكوين، لن يتمكن المستخدمون من استخدام رموز التحقق عبر البريد الإلكتروني لـ MFA. <a>{{link}}</a> في "الموصلات".',
54+
no_sms_connector_warning:
55+
'لم يتم إعداد موصل الرسائل القصيرة بعد. قبل إكمال التكوين، لن يتمكن المستخدمون من استخدام رموز التحقق عبر الرسائل القصيرة لـ MFA. <a>{{link}}</a> في "الموصلات".',
56+
no_email_connector_error:
57+
'لا يمكن تمكين MFA برموز التحقق عبر البريد الإلكتروني بدون موصل بريد إلكتروني. يرجى تكوين موصل بريد إلكتروني أولاً.',
58+
no_sms_connector_error:
59+
'لا يمكن تمكين MFA برموز التحقق عبر الرسائل القصيرة بدون موصل رسائل قصيرة. يرجى تكوين موصل رسائل قصيرة أولاً.',
60+
setup_link: 'إعداد',
5261
};
5362

5463
export default Object.freeze(mfa);

packages/phrases/src/locales/de/translation/admin-console/mfa.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@ const mfa = {
5353
'E-Mail-Verifizierungscode ist bereits Ihre primäre Anmeldemethode. Um die Sicherheit zu gewährleisten, kann er nicht erneut für MFA verwendet werden.',
5454
phone_primary_method_tip:
5555
'SMS-Verifizierungscode ist bereits Ihre primäre Anmeldemethode. Um die Sicherheit zu gewährleisten, kann er nicht erneut für MFA verwendet werden.',
56+
no_email_connector_warning:
57+
'Es wurde noch kein E-Mail-Connector eingerichtet. Bevor die Konfiguration abgeschlossen ist, können Benutzer keine E-Mail-Verifizierungscodes für MFA verwenden. <a>{{link}}</a> in "Connectors".',
58+
no_sms_connector_warning:
59+
'Es wurde noch kein SMS-Connector eingerichtet. Bevor die Konfiguration abgeschlossen ist, können Benutzer keine SMS-Verifizierungscodes für MFA verwenden. <a>{{link}}</a> in "Connectors".',
60+
no_email_connector_error:
61+
'E-Mail-Verifizierungscode MFA kann nicht ohne einen E-Mail-Connector aktiviert werden. Bitte konfigurieren Sie zuerst einen E-Mail-Connector.',
62+
no_sms_connector_error:
63+
'SMS-Verifizierungscode MFA kann nicht ohne einen SMS-Connector aktiviert werden. Bitte konfigurieren Sie zuerst einen SMS-Connector.',
64+
setup_link: 'Einrichten',
5665
};
5766

5867
export default Object.freeze(mfa);

packages/phrases/src/locales/en/translation/admin-console/mfa.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,15 @@ const mfa = {
5050
"Email verification code is already your primary sign-in method. To maintain security, it can't be reused for MFA.",
5151
phone_primary_method_tip:
5252
"SMS verification code is already your primary sign-in method. To maintain security, it can't be reused for MFA.",
53+
no_email_connector_warning:
54+
'No email connector set-up yet. Before completing the configuration, users will not be able to use email verification codes for MFA. <a>{{link}}</a> in "Connectors".',
55+
no_sms_connector_warning:
56+
'No SMS connector set-up yet. Before completing the configuration, users will not be able to use SMS verification codes for MFA. <a>{{link}}</a> in "Connectors".',
57+
no_email_connector_error:
58+
'Cannot enable email verification code MFA without an email connector. Please configure an email connector first.',
59+
no_sms_connector_error:
60+
'Cannot enable SMS verification code MFA without an SMS connector. Please configure an SMS connector first.',
61+
setup_link: 'Set up',
5362
};
5463

5564
export default Object.freeze(mfa);

packages/phrases/src/locales/es/translation/admin-console/mfa.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ const mfa = {
5454
'El código de verificación de email ya es tu método principal de inicio de sesión. Para mantener la seguridad, no se puede reutilizar para MFA.',
5555
phone_primary_method_tip:
5656
'El código de verificación SMS ya es tu método principal de inicio de sesión. Para mantener la seguridad, no se puede reutilizar para MFA.',
57+
no_email_connector_warning:
58+
'Aún no se ha configurado ningún conector de correo electrónico. Antes de completar la configuración, los usuarios no podrán usar códigos de verificación por correo electrónico para MFA. <a>{{link}}</a> en "Conectores".',
59+
no_sms_connector_warning:
60+
'Aún no se ha configurado ningún conector SMS. Antes de completar la configuración, los usuarios no podrán usar códigos de verificación por SMS para MFA. <a>{{link}}</a> en "Conectores".',
61+
no_email_connector_error:
62+
'No se puede habilitar MFA con código de verificación por correo electrónico sin un conector de correo electrónico. Por favor, configure primero un conector de correo electrónico.',
63+
no_sms_connector_error:
64+
'No se puede habilitar MFA con código de verificación SMS sin un conector SMS. Por favor, configure primero un conector SMS.',
65+
setup_link: 'Configurar',
5766
};
5867

5968
export default Object.freeze(mfa);

packages/phrases/src/locales/fr/translation/admin-console/mfa.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ const mfa = {
5454
'Le code de vérification par e-mail est déjà votre méthode de connexion principale. Pour maintenir la sécurité, il ne peut pas être réutilisé pour MFA.',
5555
phone_primary_method_tip:
5656
'Le code de vérification par SMS est déjà votre méthode de connexion principale. Pour maintenir la sécurité, il ne peut pas être réutilisé pour MFA.',
57+
no_email_connector_warning:
58+
'Aucun connecteur d\'e-mail n\'a encore été configuré. Avant de terminer la configuration, les utilisateurs ne pourront pas utiliser les codes de vérification par e-mail pour MFA. <a>{{link}}</a> dans "Connecteurs".',
59+
no_sms_connector_warning:
60+
'Aucun connecteur SMS n\'a encore été configuré. Avant de terminer la configuration, les utilisateurs ne pourront pas utiliser les codes de vérification SMS pour MFA. <a>{{link}}</a> dans "Connecteurs".',
61+
no_email_connector_error:
62+
"Impossible d'activer MFA avec code de vérification par e-mail sans connecteur e-mail. Veuillez d'abord configurer un connecteur e-mail.",
63+
no_sms_connector_error:
64+
"Impossible d'activer MFA avec code de vérification SMS sans connecteur SMS. Veuillez d'abord configurer un connecteur SMS.",
65+
setup_link: 'Configurer',
5766
};
5867

5968
export default Object.freeze(mfa);

packages/phrases/src/locales/it/translation/admin-console/mfa.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@ const mfa = {
5353
'Il codice di verifica email è già il tuo metodo principale di accesso. Per mantenere la sicurezza, non può essere riutilizzato per la MFA.',
5454
phone_primary_method_tip:
5555
'Il codice di verifica SMS è già il tuo metodo principale di accesso. Per mantenere la sicurezza, non può essere riutilizzato per la MFA.',
56+
no_email_connector_warning:
57+
'Nessun connettore email è ancora stato configurato. Prima di completare la configurazione, gli utenti non potranno utilizzare i codici di verifica email per MFA. <a>{{link}}</a> in "Connettori".',
58+
no_sms_connector_warning:
59+
'Nessun connettore SMS è ancora stato configurato. Prima di completare la configurazione, gli utenti non potranno utilizzare i codici di verifica SMS per MFA. <a>{{link}}</a> in "Connettori".',
60+
no_email_connector_error:
61+
'Impossibile abilitare MFA con codice di verifica email senza un connettore email. Si prega di configurare prima un connettore email.',
62+
no_sms_connector_error:
63+
'Impossibile abilitare MFA con codice di verifica SMS senza un connettore SMS. Si prega di configurare prima un connettore SMS.',
64+
setup_link: 'Configura',
5665
};
5766

5867
export default Object.freeze(mfa);

packages/phrases/src/locales/ja/translation/admin-console/mfa.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ const mfa = {
5151
'メール認証コードは既にあなたの主要なサインイン方法です。セキュリティを維持するため、それを MFA に再利用することはできません。',
5252
phone_primary_method_tip:
5353
'SMS認証コードは既にあなたの主要なサインイン方法です。セキュリティを維持するため、それを MFA に再利用することはできません。',
54+
no_email_connector_warning:
55+
'メールコネクターがまだ設定されていません。設定を完了する前に、ユーザーはMFAにメール認証コードを使用できません。「コネクター」で<a>{{link}}</a>してください。',
56+
no_sms_connector_warning:
57+
'SMSコネクターがまだ設定されていません。設定を完了する前に、ユーザーはMFAにSMS認証コードを使用できません。「コネクター」で<a>{{link}}</a>してください。',
58+
no_email_connector_error:
59+
'メールコネクターがないとメール認証コードMFAを有効にできません。まずメールコネクターを設定してください。',
60+
no_sms_connector_error:
61+
'SMSコネクターがないとSMS認証コードMFAを有効にできません。まずSMSコネクターを設定してください。',
62+
setup_link: '設定',
5463
};
5564

5665
export default Object.freeze(mfa);

packages/phrases/src/locales/ko/translation/admin-console/mfa.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ const mfa = {
4747
'이메일 인증 코드는 이미 주 로그인 방법입니다. 보안을 유지하기 위해 MFA로 재사용할 수 없습니다.',
4848
phone_primary_method_tip:
4949
'SMS 인증 코드는 이미 주 로그인 방법입니다. 보안을 유지하기 위해 MFA로 재사용할 수 없습니다.',
50+
no_email_connector_warning:
51+
'이메일 커넥터가 아직 설정되지 않았습니다. 구성을 완료하기 전에는 사용자가 MFA에 이메일 인증 코드를 사용할 수 없습니다. "커넥터"에서 <a>{{link}}</a>하세요.',
52+
no_sms_connector_warning:
53+
'SMS 커넥터가 아직 설정되지 않았습니다. 구성을 완료하기 전에는 사용자가 MFA에 SMS 인증 코드를 사용할 수 없습니다. "커넥터"에서 <a>{{link}}</a>하세요.',
54+
no_email_connector_error:
55+
'이메일 커넥터 없이는 이메일 인증 코드 MFA를 활성화할 수 없습니다. 먼저 이메일 커넥터를 구성해주세요.',
56+
no_sms_connector_error:
57+
'SMS 커넥터 없이는 SMS 인증 코드 MFA를 활성화할 수 없습니다. 먼저 SMS 커넥터를 구성해주세요.',
58+
setup_link: '설정',
5059
};
5160

5261
export default Object.freeze(mfa);

0 commit comments

Comments
 (0)