diff --git a/frontend/src/context/ProjectPermissionContext/types.ts b/frontend/src/context/ProjectPermissionContext/types.ts index 6a4f84d02..b768f5f72 100644 --- a/frontend/src/context/ProjectPermissionContext/types.ts +++ b/frontend/src/context/ProjectPermissionContext/types.ts @@ -44,6 +44,13 @@ export type ProjectPermissionSet = ProjectPermissionActions, ProjectPermissionSub.Secrets | (ForcedSubject & SubjectFields) ] + | [ + ProjectPermissionActions, + ( + | ProjectPermissionSub.SecretFolders + | (ForcedSubject & SubjectFields) + ) + ] | [ProjectPermissionActions, ProjectPermissionSub.Role] | [ProjectPermissionActions, ProjectPermissionSub.Tags] | [ProjectPermissionActions, ProjectPermissionSub.Member] diff --git a/frontend/src/views/Project/RolePage/components/RolePermissionsSection/RolePermissionSecretsRow.tsx b/frontend/src/views/Project/RolePage/components/RolePermissionsSection/RolePermissionSecretsRow.tsx index 881dfa172..75285db85 100644 --- a/frontend/src/views/Project/RolePage/components/RolePermissionsSection/RolePermissionSecretsRow.tsx +++ b/frontend/src/views/Project/RolePage/components/RolePermissionsSection/RolePermissionSecretsRow.tsx @@ -151,6 +151,7 @@ export const RowPermissionSecretsRow = ({ ( /* eslint-disable-next-line no-template-curly-in-string */ diff --git a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx index 27e14e907..c678343c9 100644 --- a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx +++ b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx @@ -405,8 +405,21 @@ export const SecretOverviewPage = () => { const pathSegment = secretPath.split("/").filter(Boolean); const parentPath = `/${pathSegment.slice(0, -1).join("/")}`; const folderName = pathSegment.at(-1); - console.log(folderName, parentPath); - if (folderName && parentPath) { + const canCreateFolder = permission.rules.some((rule) => + (rule.subject as ProjectPermissionSub[]).includes(ProjectPermissionSub.SecretFolders) + ) + ? permission.can( + ProjectPermissionActions.Create, + subject(ProjectPermissionSub.SecretFolders, { + environment: slug, + secretPath: parentPath + }) + ) + : permission.can( + ProjectPermissionActions.Create, + subject(ProjectPermissionSub.Secrets, { environment: slug, secretPath: parentPath }) + ); + if (folderName && parentPath && canCreateFolder) { await createFolder({ projectId: workspaceId, environment: slug, @@ -584,22 +597,14 @@ export const SecretOverviewPage = () => { {userAvailableEnvs.length > 0 && (
- } + onClick={() => handlePopUpOpen("addSecretsInAllEnvs")} + className="h-10 rounded-r-none" > - {(isAllowed) => ( - - )} - + Add Secret + handlePopUpToggle("misc", isOpen)} diff --git a/frontend/src/views/SecretOverviewPage/components/CreateSecretForm/CreateSecretForm.tsx b/frontend/src/views/SecretOverviewPage/components/CreateSecretForm/CreateSecretForm.tsx index 3ac33490d..b5f5598e3 100644 --- a/frontend/src/views/SecretOverviewPage/components/CreateSecretForm/CreateSecretForm.tsx +++ b/frontend/src/views/SecretOverviewPage/components/CreateSecretForm/CreateSecretForm.tsx @@ -1,5 +1,6 @@ import { ClipboardEvent } from "react"; import { Controller, useForm } from "react-hook-form"; +import { subject } from "@casl/ability"; import { faWarning } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -17,7 +18,12 @@ import { Tooltip } from "@app/components/v2"; import { InfisicalSecretInput } from "@app/components/v2/InfisicalSecretInput"; -import { useWorkspace } from "@app/context"; +import { + ProjectPermissionActions, + ProjectPermissionSub, + useProjectPermission, + useWorkspace +} from "@app/context"; import { getKeyValue } from "@app/helpers/parseEnvVar"; import { useCreateFolder, useCreateSecretV3, useUpdateSecretV3 } from "@app/hooks/api"; import { SecretType, SecretV3RawSanitized } from "@app/hooks/api/types"; @@ -62,6 +68,7 @@ export const CreateSecretForm = ({ const newSecretKey = watch("key"); const { currentWorkspace } = useWorkspace(); + const { permission } = useProjectPermission(); const workspaceId = currentWorkspace?.id || ""; const environments = currentWorkspace?.environments || []; @@ -186,39 +193,52 @@ export const CreateSecretForm = ({ />
- {environments.map((env) => { - return ( - ( - - - - {env.name} + {environments + .filter((environmentSlug) => + permission.can( + ProjectPermissionActions.Create, + subject(ProjectPermissionSub.Secrets, { + environment: environmentSlug.slug, + secretPath + }) + ) + ) + .map((env) => { + return ( + ( + + + + {env.name} + + + {getSecretByKey(env.slug, newSecretKey) && ( + + + + )} + - - {getSecretByKey(env.slug, newSecretKey) && ( - - - - )} - - - - )} - /> - ); - })} + + )} + /> + ); + })}