Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7907,11 +7907,12 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`,
requireError: 'SAML-Anforderungseinstellung konnte nicht aktualisiert werden',
disableSamlRequired: 'SAML-Anforderung deaktivieren',
oktaWarningPrompt: 'Bist du sicher? Dadurch wird auch Okta SCIM deaktiviert.',
requireWithEmptyMetadataError: 'Bitte fügen Sie unten die Identity-Provider-Metadaten hinzu, um zu aktivieren',
},
samlConfigurationDetails: {
title: 'SAML-Konfigurationsdetails',
subtitle: 'Verwenden Sie diese Details, um SAML einzurichten.',
identityProviderMetaData: 'Identitätsanbieter-Metadaten',
identityProviderMetadata: 'Identitätsanbieter-Metadaten',
entityID: 'Entitäts-ID',
nameIDFormat: 'Namens-ID-Format',
loginUrl: 'Login-URL',
Expand Down
3 changes: 2 additions & 1 deletion src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7752,11 +7752,12 @@ const translations = {
requireError: "Couldn't update SAML requirement setting",
disableSamlRequired: 'Disable SAML required',
oktaWarningPrompt: 'Are you sure? This will also disable Okta SCIM.',
requireWithEmptyMetadataError: 'Please add Identity Provider metadata below to enable',
},
samlConfigurationDetails: {
title: 'SAML configuration details',
subtitle: 'Use these details to get SAML set up.',
identityProviderMetaData: 'Identity Provider MetaData',
identityProviderMetadata: 'Identity Provider Metadata',
entityID: 'Entity ID',
nameIDFormat: 'Name ID Format',
loginUrl: 'Login URL',
Expand Down
3 changes: 2 additions & 1 deletion src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7848,11 +7848,12 @@ ${amount} para ${merchant} - ${date}`,
requireError: 'No se pudo actualizar la configuración de requerimiento de SAML',
disableSamlRequired: 'Deshabilitar requisito de SAML',
oktaWarningPrompt: '¿Estás seguro? Esto también deshabilitará Okta SCIM.',
requireWithEmptyMetadataError: 'Por favor, añade los metadatos del Proveedor de Identidad a continuación para habilitar',
},
samlConfigurationDetails: {
title: 'Detalles de configuración de SAML',
subtitle: 'Utiliza estos detalles para configurar SAML.',
identityProviderMetaData: 'Metadatos del proveedor de identidad',
identityProviderMetadata: 'Metadatos del proveedor de identidad',
entityID: 'ID de entidad',
nameIDFormat: 'Formato de ID de nombre',
loginUrl: 'URL de inicio de sesión',
Expand Down
3 changes: 2 additions & 1 deletion src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7915,11 +7915,12 @@ Voici un *reçu test* pour vous montrer comment cela fonctionne :`,
requireError: 'Impossible de mettre à jour le paramètre d’exigence SAML',
disableSamlRequired: 'Désactiver l’exigence SAML',
oktaWarningPrompt: 'Êtes-vous sûr ? Cela désactivera également Okta SCIM.',
requireWithEmptyMetadataError: 'Veuillez ajouter les métadonnées du fournisseur d’identité ci-dessous pour activer',
},
samlConfigurationDetails: {
title: 'Détails de configuration SAML',
subtitle: 'Utilisez ces informations pour configurer SAML.',
identityProviderMetaData: 'Métadonnées du fournisseur d’identité',
identityProviderMetadata: 'Métadonnées du fournisseur d’identité',
entityID: 'ID d’entité',
nameIDFormat: 'Format d’identifiant de nom',
loginUrl: 'URL de connexion',
Expand Down
3 changes: 2 additions & 1 deletion src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7887,11 +7887,12 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`,
requireError: "Impossibile aggiornare l'impostazione dei requisiti SAML",
disableSamlRequired: 'Disabilita SAML obbligatorio',
oktaWarningPrompt: 'Sei sicuro? Questo disabiliterà anche Okta SCIM.',
requireWithEmptyMetadataError: 'Aggiungi di seguito i metadati del provider di identità per abilitare',
},
samlConfigurationDetails: {
title: 'Dettagli di configurazione SAML',
subtitle: 'Usa questi dettagli per configurare SAML.',
identityProviderMetaData: 'Metadati del provider di identità',
identityProviderMetadata: 'Metadati del provider di identità',
entityID: 'ID entità',
nameIDFormat: 'Formato ID nome',
loginUrl: 'URL di accesso',
Expand Down
3 changes: 2 additions & 1 deletion src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7833,11 +7833,12 @@ Expensify の使い方をお見せするための*テストレシート*がこ
requireError: 'SAML 必須設定を更新できませんでした',
disableSamlRequired: 'SAML 必須を無効にする',
oktaWarningPrompt: 'よろしいですか?これにより Okta SCIM も無効になります。',
requireWithEmptyMetadataError: 'Id プロバイダーのメタデータを以下に追加して有効化してください',
},
samlConfigurationDetails: {
title: 'SAML 設定の詳細',
subtitle: 'これらの詳細を使用して、SAML を設定してください。',
identityProviderMetaData: 'ID プロバイダー メタデータ',
identityProviderMetadata: 'ID プロバイダー メタデータ',
entityID: 'エンティティ ID',
nameIDFormat: '名前 ID 形式',
loginUrl: 'ログインURL',
Expand Down
3 changes: 2 additions & 1 deletion src/languages/nl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7869,11 +7869,12 @@ Hier is een *testbon* om je te laten zien hoe het werkt:`,
requireError: 'Kon de SAML-vereiste-instelling niet bijwerken',
disableSamlRequired: '‘SAML vereist’ uitschakelen',
oktaWarningPrompt: 'Weet je het zeker? Dit schakelt ook Okta SCIM uit.',
requireWithEmptyMetadataError: 'Voeg hieronder de Identity Provider-metadata toe om in te schakelen',
},
samlConfigurationDetails: {
title: 'SAML-configuratiegegevens',
subtitle: 'Gebruik deze gegevens om SAML in te stellen.',
identityProviderMetaData: 'Identity Provider-meta-gegevens',
identityProviderMetadata: 'Identity Provider-meta-gegevens',
entityID: 'Entiteit-ID',
nameIDFormat: 'Naam-ID-indeling',
loginUrl: 'Login-URL',
Expand Down
3 changes: 2 additions & 1 deletion src/languages/pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7861,11 +7861,12 @@ Oto *paragon testowy*, który pokazuje, jak to działa:`,
requireError: 'Nie można było zaktualizować ustawienia wymogu SAML',
disableSamlRequired: 'Wyłącz wymóg SAML',
oktaWarningPrompt: 'Czy na pewno? Spowoduje to również wyłączenie Okta SCIM.',
requireWithEmptyMetadataError: 'Dodaj poniżej metadane dostawcy tożsamości, aby włączyć',
},
samlConfigurationDetails: {
title: 'Szczegóły konfiguracji SAML',
subtitle: 'Użyj tych danych, aby skonfigurować SAML.',
identityProviderMetaData: 'Metadane dostawcy tożsamości',
identityProviderMetadata: 'Metadane dostawcy tożsamości',
entityID: 'ID jednostki',
nameIDFormat: 'Format identyfikatora nazwy',
loginUrl: 'URL logowania',
Expand Down
3 changes: 2 additions & 1 deletion src/languages/pt-BR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7862,11 +7862,12 @@ Aqui está um *recibo de teste* para mostrar como funciona:`,
requireError: 'Não foi possível atualizar a configuração de requisito SAML',
disableSamlRequired: 'Desativar SAML obrigatório',
oktaWarningPrompt: 'Você tem certeza? Isso também desativará o Okta SCIM.',
requireWithEmptyMetadataError: 'Adicione os metadados do Provedor de Identidade abaixo para ativar',
},
samlConfigurationDetails: {
title: 'Detalhes da configuração SAML',
subtitle: 'Use estes detalhes para configurar o SAML.',
identityProviderMetaData: 'Metadados do Provedor de Identidade',
identityProviderMetadata: 'Metadados do Provedor de Identidade',
entityID: 'ID da entidade',
nameIDFormat: 'Formato de ID de Nome',
loginUrl: 'URL de login',
Expand Down
3 changes: 2 additions & 1 deletion src/languages/zh-hans.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7707,11 +7707,12 @@ ${reportName}
requireError: '无法更新 SAML 要求设置',
disableSamlRequired: '禁用 SAML 要求',
oktaWarningPrompt: '您确定吗?这也会禁用 Okta SCIM。',
requireWithEmptyMetadataError: '请在下方添加身份提供商元数据以启用',
},
samlConfigurationDetails: {
title: 'SAML 配置详情',
subtitle: '使用以下详细信息来完成 SAML 设置。',
identityProviderMetaData: '身份提供商元数据',
identityProviderMetadata: '身份提供商元数据',
entityID: '实体 ID',
nameIDFormat: '名称 ID 格式',
loginUrl: '登录 URL',
Expand Down
16 changes: 14 additions & 2 deletions src/libs/actions/Domain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,13 @@ function setSamlIdentity(accountID: number, domainName: string, metaIdentity: st
metaIdentity,
},
},
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.DOMAIN}${accountID}`,
value: {
samlRequiredError: null,
},
},
];
const failureData: OnyxUpdate[] = [
{
Expand Down Expand Up @@ -159,7 +166,7 @@ function getSamlSettings(accountID: number, domainName: string) {
/**
* Sets whether logging in via SAML is enabled for the domain
*/
function setSamlEnabled(enabled: boolean, accountID: number, domainName: string) {
function setSamlEnabled({enabled, accountID, domainName}: {enabled: boolean; accountID: number; domainName: string}) {
const optimisticData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
Expand Down Expand Up @@ -220,7 +227,12 @@ function resetSamlEnabledError(accountID: number) {
/**
* Sets whether logging in via SAML is required for the domain
*/
function setSamlRequired(required: boolean, accountID: number, domainName: string) {
function setSamlRequired({required, accountID, domainName, metaIdentity}: {required: boolean; accountID: number; domainName: string; metaIdentity: string | undefined}) {
if (required && !metaIdentity) {
Onyx.merge(`${ONYXKEYS.COLLECTION.DOMAIN}${accountID}`, {samlRequiredError: getMicroSecondOnyxErrorWithTranslationKey('domain.samlLogin.requireWithEmptyMetadataError')});
return;
}

const optimisticData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ function SamlConfigurationDetailsSectionContent({accountID, domainName, shouldSh
<TextPicker
value={samlMetadata.metaIdentity}
inputID="identityProviderMetadata"
description={translate('domain.samlConfigurationDetails.identityProviderMetaData')}
label={translate('domain.samlConfigurationDetails.identityProviderMetaData')}
description={translate('domain.samlConfigurationDetails.identityProviderMetadata')}
label={translate('domain.samlConfigurationDetails.identityProviderMetadata')}
wrapperStyle={styles.sectionMenuItemTopDescription}
numberOfLinesTitle={2}
titleStyle={[styles.fontSizeLabel, styles.textMono, styles.wordBreakAll]}
Expand Down
17 changes: 12 additions & 5 deletions src/pages/domain/Saml/SamlLoginSectionContent.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, {useState} from 'react';
import React, {useEffect, useState} from 'react';
import {View} from 'react-native';
import ConfirmModal from '@components/ConfirmModal';
import OfflineWithFeedback from '@components/OfflineWithFeedback';
Expand All @@ -11,7 +11,7 @@ import {resetSamlEnabledError, resetSamlRequiredError, setSamlEnabled, setSamlRe
import {getLatestErrorMessageField} from '@libs/ErrorUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import {domainSamlSettingsStateSelector} from '@src/selectors/Domain';
import {domainSamlSettingsStateSelector, metaIdentitySelector} from '@src/selectors/Domain';

type SamlLoginSectionContentProps = {
/** The unique identifier for the domain. */
Expand All @@ -38,8 +38,15 @@ function SamlLoginSectionContent({accountID, domainName, isSamlEnabled, isSamlRe
canBeMissing: false,
selector: domainSamlSettingsStateSelector,
});
const [metaIdentity] = useOnyx(`${ONYXKEYS.COLLECTION.SAML_METADATA}${accountID}`, {canBeMissing: true, selector: metaIdentitySelector});
const [isOktaScimConfirmModalVisible, setIsScimConfirmModalVisible] = useState(false);

useEffect(() => {
// Auto dismiss the saml enabled/required errors when first opening the page
resetSamlEnabledError(accountID);
resetSamlRequiredError(accountID);
}, [accountID]);

return (
<>
<OfflineWithFeedback
Expand All @@ -55,7 +62,7 @@ function SamlLoginSectionContent({accountID, domainName, isSamlEnabled, isSamlRe
<Switch
accessibilityLabel={translate('domain.samlLogin.enableSamlLogin')}
isOn={isSamlEnabled}
onToggle={() => setSamlEnabled(!isSamlEnabled, accountID, domainName)}
onToggle={() => setSamlEnabled({enabled: !isSamlEnabled, accountID, domainName})}
/>
</View>

Expand All @@ -81,7 +88,7 @@ function SamlLoginSectionContent({accountID, domainName, isSamlEnabled, isSamlRe
setIsScimConfirmModalVisible(true);
return;
}
setSamlRequired(!isSamlRequired, accountID, domainName);
setSamlRequired({required: !isSamlRequired, accountID, domainName, metaIdentity});
}}
/>
</View>
Expand All @@ -94,7 +101,7 @@ function SamlLoginSectionContent({accountID, domainName, isSamlEnabled, isSamlRe
<ConfirmModal
isVisible={isOktaScimConfirmModalVisible}
onConfirm={() => {
setSamlRequired(false, accountID, domainName);
setSamlRequired({required: false, accountID, domainName, metaIdentity});
setIsScimConfirmModalVisible(false);
}}
title={translate('domain.samlLogin.disableSamlRequired')}
Expand Down
6 changes: 4 additions & 2 deletions src/selectors/Domain.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {Str} from 'expensify-common';
import type {OnyxEntry} from 'react-native-onyx';
import type {CardFeeds, Domain} from '@src/types/onyx';
import type {CardFeeds, Domain, SamlMetadata} from '@src/types/onyx';

const domainMemberSamlSettingsSelector = (domainSettings: OnyxEntry<CardFeeds>) => domainSettings?.settings;

Expand All @@ -16,4 +16,6 @@ const domainSamlSettingsStateSelector = (domain: OnyxEntry<Domain>) =>

const domainNameSelector = (domain: OnyxEntry<Domain>) => (domain?.email ? Str.extractEmailDomain(domain.email) : undefined);

export {domainMemberSamlSettingsSelector, domainSamlSettingsStateSelector, domainNameSelector};
const metaIdentitySelector = (samlMetadata: OnyxEntry<SamlMetadata>) => samlMetadata?.metaIdentity;

export {domainMemberSamlSettingsSelector, domainSamlSettingsStateSelector, domainNameSelector, metaIdentitySelector};
Loading