diff --git a/backend/src/ee/routes/v1/secret-approval-request-router.ts b/backend/src/ee/routes/v1/secret-approval-request-router.ts index eed5cd34a..ce745245f 100644 --- a/backend/src/ee/routes/v1/secret-approval-request-router.ts +++ b/backend/src/ee/routes/v1/secret-approval-request-router.ts @@ -285,6 +285,7 @@ export const registerSecretApprovalRequestRouter = async (server: FastifyZodProv commits: secretRawSchema .omit({ _id: true, environment: true, workspace: true, type: true, version: true, secretValue: true }) .extend({ + secretValueHidden: z.boolean(), secretValue: z.string().optional(), isRotatedSecret: z.boolean().optional(), op: z.string(), @@ -296,6 +297,7 @@ export const registerSecretApprovalRequestRouter = async (server: FastifyZodProv version: z.number(), secretKey: z.string(), secretValue: z.string().optional(), + secretValueHidden: z.boolean(), secretComment: z.string().optional() }) .optional() @@ -306,6 +308,7 @@ export const registerSecretApprovalRequestRouter = async (server: FastifyZodProv version: z.number(), secretKey: z.string(), secretValue: z.string().optional(), + secretValueHidden: z.boolean(), secretComment: z.string().optional(), tags: SanitizedTagSchema.array().optional(), secretMetadata: ResourceMetadataSchema.nullish() diff --git a/backend/src/ee/services/secret-approval-request/secret-approval-request-service.ts b/backend/src/ee/services/secret-approval-request/secret-approval-request-service.ts index 9f1ee5307..0c276214a 100644 --- a/backend/src/ee/services/secret-approval-request/secret-approval-request-service.ts +++ b/backend/src/ee/services/secret-approval-request/secret-approval-request-service.ts @@ -39,7 +39,8 @@ import { fnSecretBulkDelete, fnSecretBulkInsert, fnSecretBulkUpdate, - getAllNestedSecretReferences + getAllNestedSecretReferences, + INFISICAL_SECRET_VALUE_HIDDEN_MASK } from "@app/services/secret/secret-fns"; import { TSecretQueueFactory } from "@app/services/secret/secret-queue"; import { SecretOperations } from "@app/services/secret/secret-types"; @@ -267,7 +268,6 @@ export const secretApprovalRequestServiceFactory = ({ ProjectPermissionSecretActions.DescribeAndReadValue, ProjectPermissionSub.Secrets ); - const hiddenSecretValue = "******"; let secrets; if (shouldUseSecretV2Bridge) { @@ -285,8 +285,9 @@ export const secretApprovalRequestServiceFactory = ({ version: el.version, secretMetadata: el.secretMetadata as ResourceMetadataDTO, isRotatedSecret: el.secret?.isRotatedSecret ?? false, + secretValueHidden: !hasSecretReadAccess, secretValue: !hasSecretReadAccess - ? hiddenSecretValue + ? INFISICAL_SECRET_VALUE_HIDDEN_MASK : el.secret && el.secret.isRotatedSecret ? undefined : el.encryptedValue @@ -300,8 +301,9 @@ export const secretApprovalRequestServiceFactory = ({ secretKey: el.secret.key, id: el.secret.id, version: el.secret.version, + secretValueHidden: !hasSecretReadAccess, secretValue: !hasSecretReadAccess - ? hiddenSecretValue + ? INFISICAL_SECRET_VALUE_HIDDEN_MASK : el.secret.encryptedValue ? secretManagerDecryptor({ cipherTextBlob: el.secret.encryptedValue }).toString() : "", @@ -315,8 +317,9 @@ export const secretApprovalRequestServiceFactory = ({ secretKey: el.secretVersion.key, id: el.secretVersion.id, version: el.secretVersion.version, + secretValueHidden: !hasSecretReadAccess, secretValue: !hasSecretReadAccess - ? hiddenSecretValue + ? INFISICAL_SECRET_VALUE_HIDDEN_MASK : el.secretVersion.encryptedValue ? secretManagerDecryptor({ cipherTextBlob: el.secretVersion.encryptedValue }).toString() : "", @@ -333,11 +336,13 @@ export const secretApprovalRequestServiceFactory = ({ const encryptedSecrets = await secretApprovalRequestSecretDAL.findByRequestId(secretApprovalRequest.id); secrets = encryptedSecrets.map((el) => ({ ...el, + secretValueHidden: !hasSecretReadAccess, ...decryptSecretWithBot(el, botKey), secret: el.secret ? { id: el.secret.id, version: el.secret.version, + secretValueHidden: false, ...decryptSecretWithBot(el.secret, botKey) } : undefined, @@ -345,6 +350,7 @@ export const secretApprovalRequestServiceFactory = ({ ? { id: el.secretVersion.id, version: el.secretVersion.version, + secretValueHidden: false, ...decryptSecretWithBot(el.secretVersion, botKey) } : undefined @@ -353,6 +359,7 @@ export const secretApprovalRequestServiceFactory = ({ const secretPath = await folderDAL.findSecretPathByFolderIds(secretApprovalRequest.projectId, [ secretApprovalRequest.folderId ]); + return { ...secretApprovalRequest, secretPath: secretPath?.[0]?.path || "/", commits: secrets }; }; diff --git a/frontend/src/components/v2/SecretInput/SecretInput.tsx b/frontend/src/components/v2/SecretInput/SecretInput.tsx index 11a5da466..6f3f4283a 100644 --- a/frontend/src/components/v2/SecretInput/SecretInput.tsx +++ b/frontend/src/components/v2/SecretInput/SecretInput.tsx @@ -48,6 +48,7 @@ const syntaxHighlight = (content?: string | null, isVisible?: boolean, isImport? type Props = TextareaHTMLAttributes & { value?: string | null; isVisible?: boolean; + valueAlwaysHidden?: boolean; isImport?: boolean; isReadOnly?: boolean; isDisabled?: boolean; @@ -63,6 +64,7 @@ export const SecretInput = forwardRef( value, isVisible, isImport, + valueAlwaysHidden, containerClassName, onBlur, isDisabled, @@ -84,7 +86,11 @@ export const SecretInput = forwardRef(
             
               
-                {syntaxHighlight(value, isVisible || isSecretFocused, isImport)}
+                {syntaxHighlight(
+                  value,
+                  isVisible || (isSecretFocused && !valueAlwaysHidden),
+                  isImport
+                )}
               
             
           
diff --git a/frontend/src/hooks/api/secretApprovalRequest/types.ts b/frontend/src/hooks/api/secretApprovalRequest/types.ts index 241d3c1e2..18360377f 100644 --- a/frontend/src/hooks/api/secretApprovalRequest/types.ts +++ b/frontend/src/hooks/api/secretApprovalRequest/types.ts @@ -32,6 +32,7 @@ export type TSecretApprovalSecChange = { version: number; secretKey: string; secretValue?: string; + secretValueHidden?: boolean; secretComment?: string; isRotatedSecret?: boolean; tags?: string[]; diff --git a/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/components/SecretApprovalRequestChangeItem.tsx b/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/components/SecretApprovalRequestChangeItem.tsx index 60e916fdb..3720b63dc 100644 --- a/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/components/SecretApprovalRequestChangeItem.tsx +++ b/frontend/src/pages/secret-manager/SecretApprovalsPage/components/SecretApprovalRequest/components/SecretApprovalRequestChangeItem.tsx @@ -11,6 +11,7 @@ import { faKey } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { twMerge } from "tailwind-merge"; import { SecretInput, Tag, Tooltip } from "@app/components/v2"; import { CommitType, SecretV3Raw, TSecretApprovalSecChange, WsTag } from "@app/hooks/api/types"; @@ -105,21 +106,41 @@ export const SecretApprovalRequestChangeItem = ({ ) : (
+ {secretVersion?.secretValueHidden && ( +
+ + + +
+ )} -
setIsOldSecretValueVisible(!isOldSecretValueVisible)} - > - -
+ {!secretVersion?.secretValueHidden && ( +
setIsOldSecretValueVisible(!isOldSecretValueVisible)} + > + +
+ )}
)} @@ -211,21 +232,41 @@ export const SecretApprovalRequestChangeItem = ({ ) : (
+ {newVersion?.secretValueHidden && ( +
+ + + +
+ )} -
setIsNewSecretValueVisible(!isNewSecretValueVisible)} - > - -
+ {!newVersion?.secretValueHidden && ( +
setIsNewSecretValueVisible(!isNewSecretValueVisible)} + > + +
+ )}
)}