From 7c42768cd8a1017a1f1f0394e7acf4c39a08f2e2 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Tue, 11 Jun 2024 16:27:12 +0800 Subject: [PATCH 1/5] feat: handled import overwrite in the API layer --- backend/src/services/secret/secret-service.ts | 47 ++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/backend/src/services/secret/secret-service.ts b/backend/src/services/secret/secret-service.ts index 5688f7f15..2264dcfd8 100644 --- a/backend/src/services/secret/secret-service.ts +++ b/backend/src/services/secret/secret-service.ts @@ -952,15 +952,48 @@ export const secretServiceFactory = ({ }); const decryptedSecrets = secrets.map((el) => decryptSecretRaw(el, botKey)); - const decryptedImports = (imports || [])?.map(({ secrets: importedSecrets, ...el }) => ({ - ...el, - secrets: importedSecrets.map((sec) => + const processedImports = (imports || [])?.map(({ secrets: importedSecrets, ...el }) => { + const decryptedImportSecrets = importedSecrets.map((sec) => decryptSecretRaw( { ...sec, environment: el.environment, workspace: projectId, secretPath: el.secretPath }, botKey ) - ) - })); + ); + + // secret-override to handle duplicate keys from different import levels + // this prioritizes secret values from direct imports + const importedKeys: Record = {}; + const importedEntries = decryptedImportSecrets.reduce( + ( + accum: { + secretKey: string; + secretPath: string; + workspace: string; + environment: string; + secretValue: string; + secretComment: string; + version: number; + type: string; + _id: string; + id: string; + user: string | null | undefined; + }[], + sec + ) => { + if (!importedKeys[sec.secretKey]) { + importedKeys[sec.secretKey] = true; + return [...accum, sec]; + } + return accum; + }, + [] + ); + + return { + ...el, + secrets: importedEntries + }; + }); if (expandSecretReferences) { const expandSecrets = interpolateSecrets({ @@ -1011,12 +1044,12 @@ export const secretServiceFactory = ({ await batchSecretsExpand(decryptedSecrets); // expand imports by batch - await Promise.all(decryptedImports.map((decryptedImport) => batchSecretsExpand(decryptedImport.secrets))); + await Promise.all(processedImports.map((processedImport) => batchSecretsExpand(processedImport.secrets))); } return { secrets: decryptedSecrets, - imports: decryptedImports + imports: processedImports }; }; From ae34e015dba3abc9fe55141ebe92d46bd9395246 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Tue, 11 Jun 2024 16:43:51 +0800 Subject: [PATCH 2/5] fix: added missing required property --- backend/src/services/secret/secret-service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/services/secret/secret-service.ts b/backend/src/services/secret/secret-service.ts index 2264dcfd8..f1d1b39e4 100644 --- a/backend/src/services/secret/secret-service.ts +++ b/backend/src/services/secret/secret-service.ts @@ -977,6 +977,7 @@ export const secretServiceFactory = ({ _id: string; id: string; user: string | null | undefined; + skipMultilineEncoding?: boolean; }[], sec ) => { From 56b9506b39dfd0c9444b5700324bd26b0784cba9 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Tue, 11 Jun 2024 16:48:16 +0800 Subject: [PATCH 3/5] fix: type fix --- backend/src/services/secret/secret-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/services/secret/secret-service.ts b/backend/src/services/secret/secret-service.ts index f1d1b39e4..955789469 100644 --- a/backend/src/services/secret/secret-service.ts +++ b/backend/src/services/secret/secret-service.ts @@ -977,7 +977,7 @@ export const secretServiceFactory = ({ _id: string; id: string; user: string | null | undefined; - skipMultilineEncoding?: boolean; + skipMultilineEncoding?: boolean | null; }[], sec ) => { From 38b0edf510005cf7a8a8db7b7b7fda57c12291db Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Tue, 11 Jun 2024 17:07:24 +0800 Subject: [PATCH 4/5] fix: addressed lint issue --- backend/src/services/secret/secret-fns.ts | 3 ++- backend/src/services/secret/secret-service.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/src/services/secret/secret-fns.ts b/backend/src/services/secret/secret-fns.ts index 3cd6c4e6e..3ac1c33c4 100644 --- a/backend/src/services/secret/secret-fns.ts +++ b/backend/src/services/secret/secret-fns.ts @@ -395,7 +395,8 @@ export const decryptSecretRaw = ( type: secret.type, _id: secret.id, id: secret.id, - user: secret.userId + user: secret.userId, + skipMultilineEncoding: secret.skipMultilineEncoding }; }; diff --git a/backend/src/services/secret/secret-service.ts b/backend/src/services/secret/secret-service.ts index 955789469..771079895 100644 --- a/backend/src/services/secret/secret-service.ts +++ b/backend/src/services/secret/secret-service.ts @@ -977,7 +977,7 @@ export const secretServiceFactory = ({ _id: string; id: string; user: string | null | undefined; - skipMultilineEncoding?: boolean | null; + skipMultilineEncoding: boolean | null | undefined; }[], sec ) => { From 05ed00834af81740b8b95a913b3aea01e93469f7 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Tue, 11 Jun 2024 17:14:24 +0800 Subject: [PATCH 5/5] misc: used set --- backend/src/services/secret/secret-service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/services/secret/secret-service.ts b/backend/src/services/secret/secret-service.ts index 771079895..ec17f7664 100644 --- a/backend/src/services/secret/secret-service.ts +++ b/backend/src/services/secret/secret-service.ts @@ -962,7 +962,7 @@ export const secretServiceFactory = ({ // secret-override to handle duplicate keys from different import levels // this prioritizes secret values from direct imports - const importedKeys: Record = {}; + const importedKeys = new Set(); const importedEntries = decryptedImportSecrets.reduce( ( accum: { @@ -981,8 +981,8 @@ export const secretServiceFactory = ({ }[], sec ) => { - if (!importedKeys[sec.secretKey]) { - importedKeys[sec.secretKey] = true; + if (!importedKeys.has(sec.secretKey)) { + importedKeys.add(sec.secretKey); return [...accum, sec]; } return accum;