From a64816422ed75bd260179689b01394b1f213f4b3 Mon Sep 17 00:00:00 2001 From: wangsijie Date: Tue, 6 Dec 2022 18:03:29 +0800 Subject: [PATCH] feat(core,console): prevent target change after created (#2589) --- .../components/ConnectorForm/index.tsx | 4 +++- .../Connectors/components/Guide/index.tsx | 2 +- packages/core/src/routes/connector.ts | 2 ++ .../core/src/routes/connector.update.test.ts | 20 ++++++++++++++++--- packages/phrases/src/locales/de/errors.ts | 1 + packages/phrases/src/locales/en/errors.ts | 1 + packages/phrases/src/locales/fr/errors.ts | 1 + packages/phrases/src/locales/ko/errors.ts | 1 + packages/phrases/src/locales/pt-pt/errors.ts | 1 + packages/phrases/src/locales/tr-tr/errors.ts | 1 + packages/phrases/src/locales/zh-cn/errors.ts | 1 + 11 files changed, 30 insertions(+), 5 deletions(-) diff --git a/packages/console/src/pages/Connectors/components/ConnectorForm/index.tsx b/packages/console/src/pages/Connectors/components/ConnectorForm/index.tsx index 3f4774a5a..16f8d9790 100644 --- a/packages/console/src/pages/Connectors/components/ConnectorForm/index.tsx +++ b/packages/console/src/pages/Connectors/components/ConnectorForm/index.tsx @@ -17,9 +17,10 @@ import * as styles from './index.module.scss'; type Props = { connector: ConnectorFactoryResponse; + isAllowEditTarget?: boolean; }; -const ConnectorForm = ({ connector }: Props) => { +const ConnectorForm = ({ connector, isAllowEditTarget }: Props) => { const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' }); const { configTemplate, isStandard } = connector; const { @@ -86,6 +87,7 @@ const ConnectorForm = ({ connector }: Props) => {
{t('connectors.guide.target_tip')}
diff --git a/packages/console/src/pages/Connectors/components/Guide/index.tsx b/packages/console/src/pages/Connectors/components/Guide/index.tsx index bb652a9b3..ef7f791a0 100644 --- a/packages/console/src/pages/Connectors/components/Guide/index.tsx +++ b/packages/console/src/pages/Connectors/components/Guide/index.tsx @@ -109,7 +109,7 @@ const Guide = ({ connector, onClose }: Props) => {
{t('connectors.guide.connector_setting')}
- + {!isSocialConnector && ( (router: T) { if (config) { validateConfig(config); } + // Once created, target can not be modified. + assertThat(body.metadata?.target === undefined, 'connector.can_not_modify_target'); const { metadata: databaseMetadata, ...rest } = body; await updateConnector({ diff --git a/packages/core/src/routes/connector.update.test.ts b/packages/core/src/routes/connector.update.test.ts index e20d8a4fb..06eb2599e 100644 --- a/packages/core/src/routes/connector.update.test.ts +++ b/packages/core/src/routes/connector.update.test.ts @@ -90,6 +90,23 @@ describe('connector PATCH routes', () => { expect(response).toHaveProperty('statusCode', 500); }); + it('throws when trying to update target', async () => { + getLogtoConnectorsPlaceholder.mockResolvedValue([ + { + dbEntry: mockConnector, + metadata: { ...mockMetadata, isStandard: true }, + type: ConnectorType.Social, + ...mockLogtoConnector, + }, + ]); + const response = await connectorRequest.patch('/connectors/id').send({ + metadata: { + target: 'target', + }, + }); + expect(response).toHaveProperty('statusCode', 400); + }); + it('successfully updates connector configs', async () => { getLogtoConnectorsPlaceholder.mockResolvedValue([ { @@ -110,7 +127,6 @@ describe('connector PATCH routes', () => { const response = await connectorRequest.patch('/connectors/id').send({ config: { cliend_id: 'client_id', client_secret: 'client_secret' }, metadata: { - target: 'target', name: { en: 'connector_name', fr: 'connector_name' }, logo: 'new_logo.png', logoDark: null, @@ -122,7 +138,6 @@ describe('connector PATCH routes', () => { set: { config: { cliend_id: 'client_id', client_secret: 'client_secret' }, metadata: { - target: 'target', name: { en: 'connector_name', fr: 'connector_name' }, logo: 'new_logo.png', }, @@ -153,7 +168,6 @@ describe('connector PATCH routes', () => { }); const response = await connectorRequest.patch('/connectors/id').send({ metadata: { - target: '', name: { en: '' }, logo: '', logoDark: '', diff --git a/packages/phrases/src/locales/de/errors.ts b/packages/phrases/src/locales/de/errors.ts index bcd6bd116..256d739fa 100644 --- a/packages/phrases/src/locales/de/errors.ts +++ b/packages/phrases/src/locales/de/errors.ts @@ -105,6 +105,7 @@ const errors = { multiple_instances_not_supported: 'Can not create multiple instance with picked standard connector.', invalid_type_for_syncing_profile: 'You can only sync user profile with social connectors.', + can_not_modify_target: 'The connector target can not be modified.', }, passcode: { phone_email_empty: 'Telefonnummer oder E-Mail darf nicht leer sein.', diff --git a/packages/phrases/src/locales/en/errors.ts b/packages/phrases/src/locales/en/errors.ts index 0dd04b266..8b46f65a6 100644 --- a/packages/phrases/src/locales/en/errors.ts +++ b/packages/phrases/src/locales/en/errors.ts @@ -104,6 +104,7 @@ const errors = { multiple_instances_not_supported: 'Can not create multiple instance with picked standard connector.', invalid_type_for_syncing_profile: 'You can only sync user profile with social connectors.', + can_not_modify_target: 'The connector target can not be modified.', }, passcode: { phone_email_empty: 'Both phone and email are empty.', diff --git a/packages/phrases/src/locales/fr/errors.ts b/packages/phrases/src/locales/fr/errors.ts index ab6bd6eeb..2849fddfa 100644 --- a/packages/phrases/src/locales/fr/errors.ts +++ b/packages/phrases/src/locales/fr/errors.ts @@ -111,6 +111,7 @@ const errors = { multiple_instances_not_supported: 'Can not create multiple instance with picked standard connector.', // UNTRANSLATED invalid_type_for_syncing_profile: 'You can only sync user profile with social connectors.', // UNTRANSLATED + can_not_modify_target: 'The connector target can not be modified.', // UNTRANSLATED }, passcode: { phone_email_empty: "Le téléphone et l'email sont vides.", diff --git a/packages/phrases/src/locales/ko/errors.ts b/packages/phrases/src/locales/ko/errors.ts index 67b4c21f8..e85eb243e 100644 --- a/packages/phrases/src/locales/ko/errors.ts +++ b/packages/phrases/src/locales/ko/errors.ts @@ -103,6 +103,7 @@ const errors = { multiple_instances_not_supported: 'Can not create multiple instance with picked standard connector.', // UNTRANSLATED invalid_type_for_syncing_profile: 'You can only sync user profile with social connectors.', // UNTRANSLATED + can_not_modify_target: 'The connector target can not be modified.', // UNTRANSLATED }, passcode: { phone_email_empty: '휴대전화번호 그리고 이메일이 비어있어요.', diff --git a/packages/phrases/src/locales/pt-pt/errors.ts b/packages/phrases/src/locales/pt-pt/errors.ts index b1ea0d7bd..26feaaa5d 100644 --- a/packages/phrases/src/locales/pt-pt/errors.ts +++ b/packages/phrases/src/locales/pt-pt/errors.ts @@ -106,6 +106,7 @@ const errors = { multiple_instances_not_supported: 'Can not create multiple instance with picked standard connector.', // UNTRANSLATED invalid_type_for_syncing_profile: 'You can only sync user profile with social connectors.', // UNTRANSLATED + can_not_modify_target: 'The connector target can not be modified.', // UNTRANSLATED }, passcode: { phone_email_empty: 'O campos telefone e email estão vazios.', diff --git a/packages/phrases/src/locales/tr-tr/errors.ts b/packages/phrases/src/locales/tr-tr/errors.ts index 0912454b3..b2aa56886 100644 --- a/packages/phrases/src/locales/tr-tr/errors.ts +++ b/packages/phrases/src/locales/tr-tr/errors.ts @@ -105,6 +105,7 @@ const errors = { multiple_instances_not_supported: 'Can not create multiple instance with picked standard connector.', // UNTRANSLATED invalid_type_for_syncing_profile: 'You can only sync user profile with social connectors.', // UNTRANSLATED + can_not_modify_target: 'The connector target can not be modified.', // UNTRANSLATED }, passcode: { phone_email_empty: 'Hem telefon hem de e-posta adresi yok.', diff --git a/packages/phrases/src/locales/zh-cn/errors.ts b/packages/phrases/src/locales/zh-cn/errors.ts index 5d0ad7a7c..dc2518549 100644 --- a/packages/phrases/src/locales/zh-cn/errors.ts +++ b/packages/phrases/src/locales/zh-cn/errors.ts @@ -100,6 +100,7 @@ const errors = { not_found_with_connector_id: '找不到所给 connector id 对应的连接器', multiple_instances_not_supported: '你选择的连接器不支持创建多实例。', invalid_type_for_syncing_profile: '只有社交连接器可以开启用户档案同步。', + can_not_modify_target: '不可修改连接器 target。', }, passcode: { phone_email_empty: '手机号与邮箱地址均为空',