From 163d33509b74db3f31c5f7279f12f4d9b53727a2 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Mon, 10 Jun 2024 23:42:07 -0400 Subject: [PATCH 1/3] =?UTF-8?q?Patch=20multi=20line=20encoding=20when=20ex?= =?UTF-8?q?pandSecretRef=20is=20enabled=20By=20default=20when=20you=20crea?= =?UTF-8?q?te=20a=20secret,=20it=20will=20have=20multi=20line=20encoding?= =?UTF-8?q?=20off=20but=20we=20actually=20treat=20this=20as=20true=20in=20?= =?UTF-8?q?the=20backend=20and=20UI.=20User=E2=80=99s=20aren=E2=80=99t=20e?= =?UTF-8?q?xpecting=20their=20multi=20line=20secrets=20to=20be=20double=20?= =?UTF-8?q?quoted=20by=20and=20made=20into=20a=20single=20line=20with/n,?= =?UTF-8?q?=20however=20we=20are=20doing=20it=20by=20default=20at=20the=20?= =?UTF-8?q?moment.=20This=20PR=20makes=20multi=20line=20encoding=20opt=20i?= =?UTF-8?q?n=20and=20not=20opt=20out?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/db/schemas/secrets.ts | 2 +- backend/src/services/secret/secret-fns.ts | 9 +++++---- backend/src/services/secret/secret-service.ts | 16 +++++++++++++--- .../SecretListView/SecretDetaiSidebar.tsx | 8 ++++---- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/backend/src/db/schemas/secrets.ts b/backend/src/db/schemas/secrets.ts index f261c40bb..5d7b1caf0 100644 --- a/backend/src/db/schemas/secrets.ts +++ b/backend/src/db/schemas/secrets.ts @@ -23,7 +23,7 @@ export const SecretsSchema = z.object({ secretCommentTag: z.string().nullable().optional(), secretReminderNote: z.string().nullable().optional(), secretReminderRepeatDays: z.number().nullable().optional(), - skipMultilineEncoding: z.boolean().default(false).nullable().optional(), + skipMultilineEncoding: z.boolean().default(false).optional(), algorithm: z.string().default("aes-256-gcm"), keyEncoding: z.string().default("utf8"), metadata: z.unknown().nullable().optional(), diff --git a/backend/src/services/secret/secret-fns.ts b/backend/src/services/secret/secret-fns.ts index 3cd6c4e6e..eac99d71f 100644 --- a/backend/src/services/secret/secret-fns.ts +++ b/backend/src/services/secret/secret-fns.ts @@ -329,8 +329,8 @@ export const interpolateSecrets = ({ projectId, secretEncKey, secretDAL, folderD // should not do multi line encoding if user has set it to skip // eslint-disable-next-line secrets[key].value = secrets[key].skipMultilineEncoding - ? expandedSec[key] - : formatMultiValueEnv(expandedSec[key]); + ? formatMultiValueEnv(expandedSec[key]) + : expandedSec[key]; // eslint-disable-next-line continue; } @@ -347,7 +347,7 @@ export const interpolateSecrets = ({ projectId, secretEncKey, secretDAL, folderD ); // eslint-disable-next-line - secrets[key].value = secrets[key].skipMultilineEncoding ? expandedVal : formatMultiValueEnv(expandedVal); + secrets[key].value = secrets[key].skipMultilineEncoding ? formatMultiValueEnv(expandedVal) : expandedVal; } return secrets; @@ -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 5688f7f15..7be4a6506 100644 --- a/backend/src/services/secret/secret-service.ts +++ b/backend/src/services/secret/secret-service.ts @@ -971,10 +971,19 @@ export const secretServiceFactory = ({ }); const batchSecretsExpand = async ( - secretBatch: { secretKey: string; secretValue: string; secretComment?: string; secretPath: string }[] + secretBatch: { + secretKey: string; + secretValue: string; + secretComment?: string; + secretPath: string; + skipMultilineEncoding?: boolean; + }[] ) => { // Group secrets by secretPath - const secretsByPath: Record = {}; + const secretsByPath: Record< + string, + { secretKey: string; secretValue: string; secretComment?: string; skipMultilineEncoding?: boolean }[] + > = {}; secretBatch.forEach((secret) => { if (!secretsByPath[secret.secretPath]) { @@ -994,7 +1003,8 @@ export const secretServiceFactory = ({ secretsByPath[secPath].forEach((decryptedSecret) => { secretRecord[decryptedSecret.secretKey] = { value: decryptedSecret.secretValue, - comment: decryptedSecret.secretComment + comment: decryptedSecret.secretComment, + skipMultilineEncoding: decryptedSecret.skipMultilineEncoding }; }); diff --git a/frontend/src/views/SecretMainPage/components/SecretListView/SecretDetaiSidebar.tsx b/frontend/src/views/SecretMainPage/components/SecretListView/SecretDetaiSidebar.tsx index 28e2fed15..f1b9a4c35 100644 --- a/frontend/src/views/SecretMainPage/components/SecretListView/SecretDetaiSidebar.tsx +++ b/frontend/src/views/SecretMainPage/components/SecretListView/SecretDetaiSidebar.tsx @@ -393,15 +393,15 @@ export const SecretDetailSidebar = ({ {(isAllowed) => ( onChange(!isChecked)} - isChecked={!value} + onCheckedChange={(isChecked) => onChange(isChecked)} + isChecked={value} onBlur={onBlur} isDisabled={!isAllowed} className="items-center" > - Enable multi line encoding + Multi line encoding From e2550d70b50ac396473100215af4250d95605922 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Tue, 11 Jun 2024 00:28:55 -0400 Subject: [PATCH 2/3] make skipMultilineEncoding null|undefined|bool --- backend/src/db/schemas/secrets.ts | 2 +- backend/src/services/secret/secret-fns.ts | 2 +- backend/src/services/secret/secret-service.ts | 14 +++++++++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/backend/src/db/schemas/secrets.ts b/backend/src/db/schemas/secrets.ts index 5d7b1caf0..f261c40bb 100644 --- a/backend/src/db/schemas/secrets.ts +++ b/backend/src/db/schemas/secrets.ts @@ -23,7 +23,7 @@ export const SecretsSchema = z.object({ secretCommentTag: z.string().nullable().optional(), secretReminderNote: z.string().nullable().optional(), secretReminderRepeatDays: z.number().nullable().optional(), - skipMultilineEncoding: z.boolean().default(false).optional(), + skipMultilineEncoding: z.boolean().default(false).nullable().optional(), algorithm: z.string().default("aes-256-gcm"), keyEncoding: z.string().default("utf8"), metadata: z.unknown().nullable().optional(), diff --git a/backend/src/services/secret/secret-fns.ts b/backend/src/services/secret/secret-fns.ts index eac99d71f..bf3227c3f 100644 --- a/backend/src/services/secret/secret-fns.ts +++ b/backend/src/services/secret/secret-fns.ts @@ -309,7 +309,7 @@ export const interpolateSecrets = ({ projectId, secretEncKey, secretDAL, folderD }; const expandSecrets = async ( - secrets: Record + secrets: Record ) => { const expandedSec: Record = {}; const interpolatedSec: Record = {}; diff --git a/backend/src/services/secret/secret-service.ts b/backend/src/services/secret/secret-service.ts index 7be4a6506..532a2a890 100644 --- a/backend/src/services/secret/secret-service.ts +++ b/backend/src/services/secret/secret-service.ts @@ -976,13 +976,18 @@ export const secretServiceFactory = ({ secretValue: string; secretComment?: string; secretPath: string; - skipMultilineEncoding?: boolean; + skipMultilineEncoding: boolean | null | undefined; }[] ) => { // Group secrets by secretPath const secretsByPath: Record< string, - { secretKey: string; secretValue: string; secretComment?: string; skipMultilineEncoding?: boolean }[] + { + secretKey: string; + secretValue: string; + secretComment?: string; + skipMultilineEncoding: boolean | null | undefined; + }[] > = {}; secretBatch.forEach((secret) => { @@ -999,7 +1004,10 @@ export const secretServiceFactory = ({ continue; } - const secretRecord: Record = {}; + const secretRecord: Record< + string, + { value: string; comment?: string; skipMultilineEncoding: boolean | null | undefined } + > = {}; secretsByPath[secPath].forEach((decryptedSecret) => { secretRecord[decryptedSecret.secretKey] = { value: decryptedSecret.secretValue, From 00fd44b33a4eca97fa63a233a47eaa91d07de285 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Tue, 11 Jun 2024 00:34:54 -0400 Subject: [PATCH 3/3] fix type issues --- backend/src/services/secret/secret-fns.ts | 2 +- backend/src/services/secret/secret-queue.ts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/src/services/secret/secret-fns.ts b/backend/src/services/secret/secret-fns.ts index bf3227c3f..6758f4815 100644 --- a/backend/src/services/secret/secret-fns.ts +++ b/backend/src/services/secret/secret-fns.ts @@ -309,7 +309,7 @@ export const interpolateSecrets = ({ projectId, secretEncKey, secretDAL, folderD }; const expandSecrets = async ( - secrets: Record + secrets: Record ) => { const expandedSec: Record = {}; const interpolatedSec: Record = {}; diff --git a/backend/src/services/secret/secret-queue.ts b/backend/src/services/secret/secret-queue.ts index d40a18e5e..fafd7a1ad 100644 --- a/backend/src/services/secret/secret-queue.ts +++ b/backend/src/services/secret/secret-queue.ts @@ -67,7 +67,10 @@ const MAX_SYNC_SECRET_DEPTH = 5; export const uniqueSecretQueueKey = (environment: string, secretPath: string) => `secret-queue-dedupe-${environment}-${secretPath}`; -type TIntegrationSecret = Record; +type TIntegrationSecret = Record< + string, + { value: string; comment?: string; skipMultilineEncoding?: boolean | null | undefined } +>; export const secretQueueFactory = ({ queueService, integrationDAL,