From d0f8394f5007bf6be83eefd55c21e3194980be67 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Fri, 21 Jun 2024 15:23:50 +0200 Subject: [PATCH] Fix: Added explicit SecretType type --- .../src/hooks/api/secretSnapshots/queries.tsx | 4 ++-- .../components/ActionBar/ActionBar.tsx | 4 ++-- .../CreateSecretForm/CreateSecretForm.tsx | 4 ++-- .../components/SecretDropzone/SecretDropzone.tsx | 6 +++--- .../components/SecretListView/SecretListView.tsx | 16 +++++++++------- .../SecretOverviewPage/SecretOverviewPage.tsx | 16 +++++++++++----- .../CreateSecretForm/CreateSecretForm.tsx | 6 +++--- .../SecretOverviewTableRow/SecretRenameRow.tsx | 5 ++--- .../components/SelectionPanel/SelectionPanel.tsx | 9 +++++++-- 9 files changed, 41 insertions(+), 29 deletions(-) diff --git a/frontend/src/hooks/api/secretSnapshots/queries.tsx b/frontend/src/hooks/api/secretSnapshots/queries.tsx index ca1ec76fd..cd81152a1 100644 --- a/frontend/src/hooks/api/secretSnapshots/queries.tsx +++ b/frontend/src/hooks/api/secretSnapshots/queries.tsx @@ -7,7 +7,7 @@ import { } from "@app/components/utilities/cryptography/crypto"; import { apiRequest } from "@app/config/request"; -import { DecryptedSecret } from "../secrets/types"; +import { DecryptedSecret, SecretType } from "../secrets/types"; import { TGetSecretSnapshotsDTO, TSecretRollbackDTO, @@ -112,7 +112,7 @@ export const useGetSnapshotSecrets = ({ decryptFileKey, snapshotId }: TSnapshotD version: encSecret.version }; - if (encSecret.type === "personal") { + if (encSecret.type === SecretType.Personal) { personalSecrets[decryptedSecret.key] = { id: encSecret.secretId, value: secretValue }; } else { sharedSecrets.push(decryptedSecret); diff --git a/frontend/src/views/SecretMainPage/components/ActionBar/ActionBar.tsx b/frontend/src/views/SecretMainPage/components/ActionBar/ActionBar.tsx index bed5d6a84..0056c4a3b 100644 --- a/frontend/src/views/SecretMainPage/components/ActionBar/ActionBar.tsx +++ b/frontend/src/views/SecretMainPage/components/ActionBar/ActionBar.tsx @@ -47,7 +47,7 @@ import { ProjectPermissionActions, ProjectPermissionSub, useSubscription } from import { interpolateSecrets } from "@app/helpers/secret"; import { usePopUp } from "@app/hooks"; import { useCreateFolder, useDeleteSecretBatch, useGetUserWsKey } from "@app/hooks/api"; -import { DecryptedSecret, TImportedSecrets, WsTag } from "@app/hooks/api/types"; +import { DecryptedSecret, SecretType, TImportedSecrets, WsTag } from "@app/hooks/api/types"; import { debounce } from "@app/lib/fn/debounce"; import { @@ -211,7 +211,7 @@ export const ActionBar = ({ secretPath, workspaceId, environment, - secrets: bulkDeletedSecrets.map(({ key }) => ({ secretName: key, type: "shared" })) + secrets: bulkDeletedSecrets.map(({ key }) => ({ secretName: key, type: SecretType.Shared })) }); resetSelectedSecret(); handlePopUpClose("bulkDeleteSecrets"); diff --git a/frontend/src/views/SecretMainPage/components/CreateSecretForm/CreateSecretForm.tsx b/frontend/src/views/SecretMainPage/components/CreateSecretForm/CreateSecretForm.tsx index 4efd6bdc3..7d7126c56 100644 --- a/frontend/src/views/SecretMainPage/components/CreateSecretForm/CreateSecretForm.tsx +++ b/frontend/src/views/SecretMainPage/components/CreateSecretForm/CreateSecretForm.tsx @@ -6,7 +6,7 @@ import { createNotification } from "@app/components/notifications"; import { Button, FormControl, Input, Modal, ModalContent } from "@app/components/v2"; import { InfisicalSecretInput } from "@app/components/v2/InfisicalSecretInput"; import { useCreateSecretV3 } from "@app/hooks/api"; -import { UserWsKeyPair } from "@app/hooks/api/types"; +import { SecretType, UserWsKeyPair } from "@app/hooks/api/types"; import { PopUpNames, usePopUpAction, usePopUpState } from "../../SecretMainPage.store"; @@ -56,7 +56,7 @@ export const CreateSecretForm = ({ secretName: key, secretValue: value || "", secretComment: "", - type: "shared", + type: SecretType.Shared, latestFileKey: decryptFileKey }); closePopUp(PopUpNames.CreateSecretForm); diff --git a/frontend/src/views/SecretMainPage/components/SecretDropzone/SecretDropzone.tsx b/frontend/src/views/SecretMainPage/components/SecretDropzone/SecretDropzone.tsx index 98ffb0862..ca0923894 100644 --- a/frontend/src/views/SecretMainPage/components/SecretDropzone/SecretDropzone.tsx +++ b/frontend/src/views/SecretMainPage/components/SecretDropzone/SecretDropzone.tsx @@ -16,7 +16,7 @@ import { usePopUp, useToggle } from "@app/hooks"; import { useCreateSecretBatch, useUpdateSecretBatch } from "@app/hooks/api"; import { secretApprovalRequestKeys } from "@app/hooks/api/secretApprovalRequest/queries"; import { secretKeys } from "@app/hooks/api/secrets/queries"; -import { DecryptedSecret, UserWsKeyPair } from "@app/hooks/api/types"; +import { DecryptedSecret, SecretType, UserWsKeyPair } from "@app/hooks/api/types"; import { PopUpNames, usePopUpAction } from "../../SecretMainPage.store"; import { CopySecretsFromBoard } from "./CopySecretsFromBoard"; @@ -170,7 +170,7 @@ export const SecretDropzone = ({ workspaceId, environment, secrets: Object.entries(create).map(([secretName, secData]) => ({ - type: "shared", + type: SecretType.Shared, secretComment: secData.comments.join("\n"), secretValue: secData.value, secretName @@ -184,7 +184,7 @@ export const SecretDropzone = ({ workspaceId, environment, secrets: Object.entries(update).map(([secretName, secData]) => ({ - type: "shared", + type: SecretType.Shared, secretComment: secData.comments.join("\n"), secretValue: secData.value, secretName diff --git a/frontend/src/views/SecretMainPage/components/SecretListView/SecretListView.tsx b/frontend/src/views/SecretMainPage/components/SecretListView/SecretListView.tsx index d17de4bb4..d6d6fc487 100644 --- a/frontend/src/views/SecretMainPage/components/SecretListView/SecretListView.tsx +++ b/frontend/src/views/SecretMainPage/components/SecretListView/SecretListView.tsx @@ -10,7 +10,7 @@ import { usePopUp } from "@app/hooks"; import { useCreateSecretV3, useDeleteSecretV3, useUpdateSecretV3 } from "@app/hooks/api"; import { secretApprovalRequestKeys } from "@app/hooks/api/secretApprovalRequest/queries"; import { secretKeys } from "@app/hooks/api/secrets/queries"; -import { DecryptedSecret } from "@app/hooks/api/secrets/types"; +import { DecryptedSecret, SecretType } from "@app/hooks/api/secrets/types"; import { secretSnapshotKeys } from "@app/hooks/api/secretSnapshots/queries"; import { UserWsKeyPair, WsTag } from "@app/hooks/api/types"; @@ -119,7 +119,7 @@ export const SecretListView = ({ const handleSecretOperation = async ( operation: "create" | "update" | "delete", - type: "shared" | "personal", + type: SecretType, key: string, { value, @@ -227,23 +227,25 @@ export const SecretListView = ({ try { // personal secret change if (overrideAction === "deleted") { - await handleSecretOperation("delete", "personal", oldKey, { + await handleSecretOperation("delete", SecretType.Personal, oldKey, { secretId: orgSecret.idOverride }); } else if (overrideAction && idOverride) { - await handleSecretOperation("update", "personal", oldKey, { + await handleSecretOperation("update", SecretType.Personal, oldKey, { value: valueOverride, newKey: hasKeyChanged ? key : undefined, secretId: orgSecret.idOverride, skipMultilineEncoding: modSecret.skipMultilineEncoding }); } else if (overrideAction) { - await handleSecretOperation("create", "personal", oldKey, { value: valueOverride }); + await handleSecretOperation("create", SecretType.Personal, oldKey, { + value: valueOverride + }); } // shared secret change if (!isSharedSecUnchanged) { - await handleSecretOperation("update", "shared", oldKey, { + await handleSecretOperation("update", SecretType.Shared, oldKey, { value, tags: tagIds, comment, @@ -286,7 +288,7 @@ export const SecretListView = ({ const handleSecretDelete = useCallback(async () => { const { key, id: secretId } = popUp.deleteSecret?.data as DecryptedSecret; try { - await handleSecretOperation("delete", "shared", key, { secretId }); + await handleSecretOperation("delete", SecretType.Shared, key, { secretId }); // wrap this in another function and then reuse queryClient.invalidateQueries( secretKeys.getProjectSecret({ workspaceId, environment, secretPath }) diff --git a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx index 6ab1344ff..09a16e407 100644 --- a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx +++ b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx @@ -64,7 +64,7 @@ import { } from "@app/hooks/api"; import { useUpdateFolderBatch } from "@app/hooks/api/secretFolders/queries"; import { TUpdateFolderBatchDTO } from "@app/hooks/api/secretFolders/types"; -import { TSecretFolder } from "@app/hooks/api/types"; +import { SecretType, TSecretFolder } from "@app/hooks/api/types"; import { ProjectVersion } from "@app/hooks/api/workspace/types"; import { FolderForm } from "../SecretMainPage/components/ActionBar/FolderForm"; @@ -320,7 +320,7 @@ export const SecretOverviewPage = () => { secretName: key, secretValue: value, secretComment: "", - type: "shared", + type: SecretType.Shared, latestFileKey: latestFileKey! }); createNotification({ @@ -344,7 +344,13 @@ export const SecretOverviewPage = () => { } }; - const handleSecretUpdate = async (env: string, key: string, value: string, secretId?: string) => { + const handleSecretUpdate = async ( + env: string, + key: string, + value: string, + type = SecretType.Shared, + secretId?: string + ) => { try { await updateSecretV3({ environment: env, @@ -353,7 +359,7 @@ export const SecretOverviewPage = () => { secretId, secretName: key, secretValue: value, - type: "shared", + type, latestFileKey: latestFileKey! }); createNotification({ @@ -377,7 +383,7 @@ export const SecretOverviewPage = () => { secretPath, secretName: key, secretId, - type: "shared" + type: SecretType.Shared }); createNotification({ type: "success", diff --git a/frontend/src/views/SecretOverviewPage/components/CreateSecretForm/CreateSecretForm.tsx b/frontend/src/views/SecretOverviewPage/components/CreateSecretForm/CreateSecretForm.tsx index 85d3125d5..0ef342a2e 100644 --- a/frontend/src/views/SecretOverviewPage/components/CreateSecretForm/CreateSecretForm.tsx +++ b/frontend/src/views/SecretOverviewPage/components/CreateSecretForm/CreateSecretForm.tsx @@ -18,7 +18,7 @@ import { import { InfisicalSecretInput } from "@app/components/v2/InfisicalSecretInput"; import { useWorkspace } from "@app/context"; import { useCreateFolder, useCreateSecretV3, useUpdateSecretV3 } from "@app/hooks/api"; -import { DecryptedSecret, UserWsKeyPair } from "@app/hooks/api/types"; +import { DecryptedSecret, SecretType, UserWsKeyPair } from "@app/hooks/api/types"; const typeSchema = z .object({ @@ -103,7 +103,7 @@ export const CreateSecretForm = ({ secretPath, secretName: key, secretValue: value || "", - type: "shared", + type: SecretType.Shared, latestFileKey: decryptFileKey }); } @@ -115,7 +115,7 @@ export const CreateSecretForm = ({ secretName: key, secretValue: value || "", secretComment: "", - type: "shared", + type: SecretType.Shared, latestFileKey: decryptFileKey }); }); diff --git a/frontend/src/views/SecretOverviewPage/components/SecretOverviewTableRow/SecretRenameRow.tsx b/frontend/src/views/SecretOverviewPage/components/SecretOverviewTableRow/SecretRenameRow.tsx index 8059f5e7b..e5488ab9f 100644 --- a/frontend/src/views/SecretOverviewPage/components/SecretOverviewTableRow/SecretRenameRow.tsx +++ b/frontend/src/views/SecretOverviewPage/components/SecretOverviewTableRow/SecretRenameRow.tsx @@ -18,7 +18,7 @@ import { } from "@app/context"; import { useToggle } from "@app/hooks"; import { useGetUserWsKey, useUpdateSecretV3 } from "@app/hooks/api"; -import { DecryptedSecret } from "@app/hooks/api/types"; +import { DecryptedSecret, SecretType } from "@app/hooks/api/types"; import { SecretActionType } from "@app/views/SecretMainPage/components/SecretListView/SecretListView.utils"; type Props = { @@ -37,7 +37,6 @@ type TFormSchema = z.infer; function SecretRenameRow({ environments, getSecretByKey, secretKey, secretPath }: Props) { const { currentWorkspace } = useWorkspace(); const { permission } = useProjectPermission(); - const secrets = environments.map((env) => getSecretByKey(env.slug, secretKey)); @@ -113,7 +112,7 @@ function SecretRenameRow({ environments, getSecretByKey, secretKey, secretPath } secretName: secret.key, secretId: secret.id, secretValue: secret.value || "", - type: "shared", + type: SecretType.Shared, latestFileKey: decryptFileKey!, tags: secret.tags.map((tag) => tag.id), secretComment: secret.comment, diff --git a/frontend/src/views/SecretOverviewPage/components/SelectionPanel/SelectionPanel.tsx b/frontend/src/views/SecretOverviewPage/components/SelectionPanel/SelectionPanel.tsx index 6a2fe9bf6..3d97228c3 100644 --- a/frontend/src/views/SecretOverviewPage/components/SelectionPanel/SelectionPanel.tsx +++ b/frontend/src/views/SecretOverviewPage/components/SelectionPanel/SelectionPanel.tsx @@ -13,7 +13,12 @@ import { } from "@app/context"; import { usePopUp } from "@app/hooks"; import { useDeleteFolder, useDeleteSecretBatch } from "@app/hooks/api"; -import { DecryptedSecret, TDeleteSecretBatchDTO, TSecretFolder } from "@app/hooks/api/types"; +import { + DecryptedSecret, + SecretType, + TDeleteSecretBatchDTO, + TSecretFolder +} from "@app/hooks/api/types"; export enum EntryType { FOLDER = "folder", @@ -100,7 +105,7 @@ export const SelectionPanel = ({ ...accum, { secretName: entry.key, - type: "shared" as "shared" + type: SecretType.Shared } ]; }