mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-08 13:28:27 +00:00
feat: changed dynamic secret mapping to new one, made optional secretname and tag in permission
This commit is contained in:
@@ -80,7 +80,7 @@ export const dynamicSecretServiceFactory = ({
|
|||||||
actorOrgId
|
actorOrgId
|
||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionDynamicSecretActions.Create,
|
ProjectPermissionDynamicSecretActions.CreateRootCredential,
|
||||||
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ export const dynamicSecretServiceFactory = ({
|
|||||||
actorOrgId
|
actorOrgId
|
||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionDynamicSecretActions.Edit,
|
ProjectPermissionDynamicSecretActions.EditRootCredential,
|
||||||
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -228,7 +228,7 @@ export const dynamicSecretServiceFactory = ({
|
|||||||
actorOrgId
|
actorOrgId
|
||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionDynamicSecretActions.Delete,
|
ProjectPermissionDynamicSecretActions.DeleteRootCredential,
|
||||||
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -285,11 +285,11 @@ export const dynamicSecretServiceFactory = ({
|
|||||||
actorOrgId
|
actorOrgId
|
||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionDynamicSecretActions.Read,
|
ProjectPermissionDynamicSecretActions.ReadRootCredential,
|
||||||
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionDynamicSecretActions.Edit,
|
ProjectPermissionDynamicSecretActions.EditRootCredential,
|
||||||
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -335,7 +335,7 @@ export const dynamicSecretServiceFactory = ({
|
|||||||
// verify user has access to each env in request
|
// verify user has access to each env in request
|
||||||
environmentSlugs.forEach((environmentSlug) =>
|
environmentSlugs.forEach((environmentSlug) =>
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionDynamicSecretActions.Read,
|
ProjectPermissionDynamicSecretActions.ReadRootCredential,
|
||||||
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -371,7 +371,7 @@ export const dynamicSecretServiceFactory = ({
|
|||||||
actorOrgId
|
actorOrgId
|
||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionDynamicSecretActions.Read,
|
ProjectPermissionDynamicSecretActions.ReadRootCredential,
|
||||||
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -417,7 +417,7 @@ export const dynamicSecretServiceFactory = ({
|
|||||||
actorOrgId
|
actorOrgId
|
||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionDynamicSecretActions.Read,
|
ProjectPermissionDynamicSecretActions.ReadRootCredential,
|
||||||
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -459,7 +459,7 @@ export const dynamicSecretServiceFactory = ({
|
|||||||
// verify user has access to each env in request
|
// verify user has access to each env in request
|
||||||
environmentSlugs.forEach((environmentSlug) =>
|
environmentSlugs.forEach((environmentSlug) =>
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionDynamicSecretActions.Read,
|
ProjectPermissionDynamicSecretActions.ReadRootCredential,
|
||||||
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
subject(ProjectPermissionSub.DynamicSecrets, { environment: environmentSlug, secretPath: path })
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -23,10 +23,10 @@ export enum ProjectPermissionCmekActions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export enum ProjectPermissionDynamicSecretActions {
|
export enum ProjectPermissionDynamicSecretActions {
|
||||||
Read = "read",
|
ReadRootCredential = "read-root-credential",
|
||||||
Create = "create",
|
CreateRootCredential = "create-root-credential",
|
||||||
Edit = "edit",
|
EditRootCredential = "edit-root-credential",
|
||||||
Delete = "delete",
|
DeleteRootCredential = "delete-root-credential",
|
||||||
Lease = "lease"
|
Lease = "lease"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,8 +63,8 @@ export enum ProjectPermissionSub {
|
|||||||
export type SecretSubjectFields = {
|
export type SecretSubjectFields = {
|
||||||
environment: string;
|
environment: string;
|
||||||
secretPath: string;
|
secretPath: string;
|
||||||
secretName: string;
|
secretName?: string;
|
||||||
secretTags: string[];
|
secretTags?: string[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export type SecretFolderSubjectFields = {
|
export type SecretFolderSubjectFields = {
|
||||||
@@ -461,10 +461,10 @@ const buildAdminPermissionRules = () => {
|
|||||||
|
|
||||||
can(
|
can(
|
||||||
[
|
[
|
||||||
ProjectPermissionDynamicSecretActions.Read,
|
ProjectPermissionDynamicSecretActions.ReadRootCredential,
|
||||||
ProjectPermissionDynamicSecretActions.Edit,
|
ProjectPermissionDynamicSecretActions.EditRootCredential,
|
||||||
ProjectPermissionDynamicSecretActions.Create,
|
ProjectPermissionDynamicSecretActions.CreateRootCredential,
|
||||||
ProjectPermissionDynamicSecretActions.Delete,
|
ProjectPermissionDynamicSecretActions.DeleteRootCredential,
|
||||||
ProjectPermissionDynamicSecretActions.Lease
|
ProjectPermissionDynamicSecretActions.Lease
|
||||||
],
|
],
|
||||||
ProjectPermissionSub.DynamicSecrets
|
ProjectPermissionSub.DynamicSecrets
|
||||||
@@ -512,10 +512,10 @@ const buildMemberPermissionRules = () => {
|
|||||||
);
|
);
|
||||||
can(
|
can(
|
||||||
[
|
[
|
||||||
ProjectPermissionDynamicSecretActions.Read,
|
ProjectPermissionDynamicSecretActions.ReadRootCredential,
|
||||||
ProjectPermissionDynamicSecretActions.Edit,
|
ProjectPermissionDynamicSecretActions.EditRootCredential,
|
||||||
ProjectPermissionDynamicSecretActions.Create,
|
ProjectPermissionDynamicSecretActions.CreateRootCredential,
|
||||||
ProjectPermissionDynamicSecretActions.Delete,
|
ProjectPermissionDynamicSecretActions.DeleteRootCredential,
|
||||||
ProjectPermissionDynamicSecretActions.Lease
|
ProjectPermissionDynamicSecretActions.Lease
|
||||||
],
|
],
|
||||||
ProjectPermissionSub.DynamicSecrets
|
ProjectPermissionSub.DynamicSecrets
|
||||||
@@ -653,7 +653,7 @@ const buildViewerPermissionRules = () => {
|
|||||||
|
|
||||||
can(ProjectPermissionActions.Read, ProjectPermissionSub.Secrets);
|
can(ProjectPermissionActions.Read, ProjectPermissionSub.Secrets);
|
||||||
can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretFolders);
|
can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretFolders);
|
||||||
can(ProjectPermissionDynamicSecretActions.Read, ProjectPermissionSub.DynamicSecrets);
|
can(ProjectPermissionDynamicSecretActions.ReadRootCredential, ProjectPermissionSub.DynamicSecrets);
|
||||||
can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretImports);
|
can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretImports);
|
||||||
can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretApproval);
|
can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretApproval);
|
||||||
can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretRollback);
|
can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretRollback);
|
||||||
@@ -773,13 +773,30 @@ export const backfillPermissionV1SchemaToV2Schema = (data: z.infer<typeof Projec
|
|||||||
subject: ProjectPermissionSub.SecretFolders
|
subject: ProjectPermissionSub.SecretFolders
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const dynamicSecretPolicies = secretSubjects.map(({ subject, ...el }) => ({
|
const dynamicSecretPolicies = secretSubjects.map(({ subject, ...el }) => {
|
||||||
...el,
|
const action = el.action.map((e) => {
|
||||||
action: el.action.includes(ProjectPermissionActions.Edit)
|
switch (e) {
|
||||||
? [...el.action, ProjectPermissionDynamicSecretActions.Lease]
|
case ProjectPermissionActions.Edit:
|
||||||
: el.action,
|
return ProjectPermissionDynamicSecretActions.EditRootCredential;
|
||||||
subject: ProjectPermissionSub.DynamicSecrets
|
case ProjectPermissionActions.Create:
|
||||||
}));
|
return ProjectPermissionDynamicSecretActions.CreateRootCredential;
|
||||||
|
case ProjectPermissionActions.Delete:
|
||||||
|
return ProjectPermissionDynamicSecretActions.DeleteRootCredential;
|
||||||
|
case ProjectPermissionActions.Read:
|
||||||
|
return ProjectPermissionDynamicSecretActions.ReadRootCredential;
|
||||||
|
default:
|
||||||
|
return ProjectPermissionDynamicSecretActions.ReadRootCredential;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
...el,
|
||||||
|
action: el.action.includes(ProjectPermissionActions.Edit)
|
||||||
|
? [...action, ProjectPermissionDynamicSecretActions.Lease]
|
||||||
|
: action,
|
||||||
|
subject: ProjectPermissionSub.DynamicSecrets
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
return formattedData.concat(
|
return formattedData.concat(
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ForbiddenError, subject } from "@casl/ability";
|
import { ForbiddenError } from "@casl/ability";
|
||||||
import picomatch from "picomatch";
|
import picomatch from "picomatch";
|
||||||
|
|
||||||
import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service";
|
import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service";
|
||||||
@@ -344,17 +344,8 @@ export const secretApprovalPolicyServiceFactory = ({
|
|||||||
environment,
|
environment,
|
||||||
secretPath
|
secretPath
|
||||||
}: TGetBoardSapDTO) => {
|
}: TGetBoardSapDTO) => {
|
||||||
const { permission } = await permissionService.getProjectPermission(
|
await permissionService.getProjectPermission(actor, actorId, projectId, actorAuthMethod, actorOrgId);
|
||||||
actor,
|
|
||||||
actorId,
|
|
||||||
projectId,
|
|
||||||
actorAuthMethod,
|
|
||||||
actorOrgId
|
|
||||||
);
|
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
|
||||||
ProjectPermissionActions.Read,
|
|
||||||
subject(ProjectPermissionSub.Secrets, { secretPath, environment, secretName: "", secretTags: [] })
|
|
||||||
);
|
|
||||||
return getSecretApprovalPolicy(projectId, environment, secretPath);
|
return getSecretApprovalPolicy(projectId, environment, secretPath);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -853,7 +853,7 @@ export const secretApprovalRequestServiceFactory = ({
|
|||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath })
|
||||||
);
|
);
|
||||||
|
|
||||||
await projectDAL.checkProjectUpgradeStatus(projectId);
|
await projectDAL.checkProjectUpgradeStatus(projectId);
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ export const secretRotationServiceFactory = ({
|
|||||||
if (!folder) throw new NotFoundError({ message: "Secret path not found" });
|
if (!folder) throw new NotFoundError({ message: "Secret path not found" });
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Edit,
|
ProjectPermissionActions.Edit,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath })
|
||||||
);
|
);
|
||||||
|
|
||||||
const project = await projectDAL.findById(projectId);
|
const project = await projectDAL.findById(projectId);
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ export const secretSnapshotServiceFactory = ({
|
|||||||
// We need to check if the user has access to the secrets in the folder. If we don't do this, a user could theoretically access snapshot secret values even if they don't have read access to the secrets in the folder.
|
// We need to check if the user has access to the secrets in the folder. If we don't do this, a user could theoretically access snapshot secret values even if they don't have read access to the secrets in the folder.
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
const folder = await folderDAL.findBySecretPath(projectId, environment, path);
|
const folder = await folderDAL.findBySecretPath(projectId, environment, path);
|
||||||
@@ -127,7 +127,7 @@ export const secretSnapshotServiceFactory = ({
|
|||||||
// We need to check if the user has access to the secrets in the folder. If we don't do this, a user could theoretically access snapshot secret values even if they don't have read access to the secrets in the folder.
|
// We need to check if the user has access to the secrets in the folder. If we don't do this, a user could theoretically access snapshot secret values even if they don't have read access to the secrets in the folder.
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
const folder = await folderDAL.findBySecretPath(projectId, environment, path);
|
const folder = await folderDAL.findBySecretPath(projectId, environment, path);
|
||||||
@@ -214,9 +214,7 @@ export const secretSnapshotServiceFactory = ({
|
|||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment: snapshotDetails.environment.slug,
|
environment: snapshotDetails.environment.slug,
|
||||||
secretPath: fullFolderPath,
|
secretPath: fullFolderPath
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -91,9 +91,7 @@ export const integrationServiceFactory = ({
|
|||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment: sourceEnvironment,
|
environment: sourceEnvironment,
|
||||||
secretPath,
|
secretPath
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -169,9 +167,7 @@ export const integrationServiceFactory = ({
|
|||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment: newEnvironment,
|
environment: newEnvironment,
|
||||||
secretPath: newSecretPath,
|
secretPath: newSecretPath
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,9 +92,7 @@ export const secretImportServiceFactory = ({
|
|||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment: data.environment,
|
environment: data.environment,
|
||||||
secretPath: data.path,
|
secretPath: data.path
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
if (isReplication) {
|
if (isReplication) {
|
||||||
@@ -371,9 +369,7 @@ export const secretImportServiceFactory = ({
|
|||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment: secretImportDoc.importEnv.slug,
|
environment: secretImportDoc.importEnv.slug,
|
||||||
secretPath: secretImportDoc.importPath,
|
secretPath: secretImportDoc.importPath
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -548,9 +544,7 @@ export const secretImportServiceFactory = ({
|
|||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment: el.importEnv.slug,
|
environment: el.importEnv.slug,
|
||||||
secretPath: el.importPath,
|
secretPath: el.importPath
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -620,9 +614,7 @@ export const secretImportServiceFactory = ({
|
|||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment: el.importEnv.slug,
|
environment: el.importEnv.slug,
|
||||||
secretPath: el.importPath,
|
secretPath: el.importPath
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -185,9 +185,7 @@ export const recursivelyGetSecretPaths = ({
|
|||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment,
|
environment,
|
||||||
secretPath: folder.path,
|
secretPath: folder.path
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
) && folder.path.startsWith(currentPath === "/" ? "" : currentPath)
|
) && folder.path.startsWith(currentPath === "/" ? "" : currentPath)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ export const secretServiceFactory = ({
|
|||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Create,
|
ProjectPermissionActions.Create,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
await projectDAL.checkProjectUpgradeStatus(projectId);
|
await projectDAL.checkProjectUpgradeStatus(projectId);
|
||||||
@@ -296,7 +296,7 @@ export const secretServiceFactory = ({
|
|||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Edit,
|
ProjectPermissionActions.Edit,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
await projectDAL.checkProjectUpgradeStatus(projectId);
|
await projectDAL.checkProjectUpgradeStatus(projectId);
|
||||||
@@ -433,7 +433,7 @@ export const secretServiceFactory = ({
|
|||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Delete,
|
ProjectPermissionActions.Delete,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
await projectDAL.checkProjectUpgradeStatus(projectId);
|
await projectDAL.checkProjectUpgradeStatus(projectId);
|
||||||
@@ -538,7 +538,7 @@ export const secretServiceFactory = ({
|
|||||||
} else {
|
} else {
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
const folder = await folderDAL.findBySecretPath(projectId, environment, path);
|
const folder = await folderDAL.findBySecretPath(projectId, environment, path);
|
||||||
@@ -565,9 +565,7 @@ export const secretServiceFactory = ({
|
|||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment: importEnv.slug,
|
environment: importEnv.slug,
|
||||||
secretPath: importPath,
|
secretPath: importPath
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -621,7 +619,7 @@ export const secretServiceFactory = ({
|
|||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path })
|
||||||
);
|
);
|
||||||
const folder = await folderDAL.findBySecretPath(projectId, environment, path);
|
const folder = await folderDAL.findBySecretPath(projectId, environment, path);
|
||||||
if (!folder)
|
if (!folder)
|
||||||
@@ -673,9 +671,7 @@ export const secretServiceFactory = ({
|
|||||||
ProjectPermissionActions.Read,
|
ProjectPermissionActions.Read,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment: importEnv.slug,
|
environment: importEnv.slug,
|
||||||
secretPath: importPath,
|
secretPath: importPath
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -722,7 +718,7 @@ export const secretServiceFactory = ({
|
|||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Create,
|
ProjectPermissionActions.Create,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
await projectDAL.checkProjectUpgradeStatus(projectId);
|
await projectDAL.checkProjectUpgradeStatus(projectId);
|
||||||
@@ -807,7 +803,7 @@ export const secretServiceFactory = ({
|
|||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Edit,
|
ProjectPermissionActions.Edit,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
await projectDAL.checkProjectUpgradeStatus(projectId);
|
await projectDAL.checkProjectUpgradeStatus(projectId);
|
||||||
@@ -913,7 +909,7 @@ export const secretServiceFactory = ({
|
|||||||
);
|
);
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Delete,
|
ProjectPermissionActions.Delete,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath: path })
|
||||||
);
|
);
|
||||||
|
|
||||||
await projectDAL.checkProjectUpgradeStatus(projectId);
|
await projectDAL.checkProjectUpgradeStatus(projectId);
|
||||||
@@ -2122,7 +2118,7 @@ export const secretServiceFactory = ({
|
|||||||
|
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Edit,
|
ProjectPermissionActions.Edit,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath })
|
||||||
);
|
);
|
||||||
|
|
||||||
await projectDAL.checkProjectUpgradeStatus(project.id);
|
await projectDAL.checkProjectUpgradeStatus(project.id);
|
||||||
@@ -2224,7 +2220,7 @@ export const secretServiceFactory = ({
|
|||||||
|
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Edit,
|
ProjectPermissionActions.Edit,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath })
|
||||||
);
|
);
|
||||||
|
|
||||||
await projectDAL.checkProjectUpgradeStatus(project.id);
|
await projectDAL.checkProjectUpgradeStatus(project.id);
|
||||||
@@ -2413,9 +2409,7 @@ export const secretServiceFactory = ({
|
|||||||
ProjectPermissionActions.Delete,
|
ProjectPermissionActions.Delete,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment: sourceEnvironment,
|
environment: sourceEnvironment,
|
||||||
secretPath: sourceSecretPath,
|
secretPath: sourceSecretPath
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -2423,9 +2417,7 @@ export const secretServiceFactory = ({
|
|||||||
ProjectPermissionActions.Create,
|
ProjectPermissionActions.Create,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment: destinationEnvironment,
|
environment: destinationEnvironment,
|
||||||
secretPath: destinationSecretPath,
|
secretPath: destinationSecretPath
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -2433,9 +2425,7 @@ export const secretServiceFactory = ({
|
|||||||
ProjectPermissionActions.Edit,
|
ProjectPermissionActions.Edit,
|
||||||
subject(ProjectPermissionSub.Secrets, {
|
subject(ProjectPermissionSub.Secrets, {
|
||||||
environment: destinationEnvironment,
|
environment: destinationEnvironment,
|
||||||
secretPath: destinationSecretPath,
|
secretPath: destinationSecretPath
|
||||||
secretName: "",
|
|
||||||
secretTags: []
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ export const serviceTokenServiceFactory = ({
|
|||||||
scopes.forEach(({ environment, secretPath }) => {
|
scopes.forEach(({ environment, secretPath }) => {
|
||||||
ForbiddenError.from(permission).throwUnlessCan(
|
ForbiddenError.from(permission).throwUnlessCan(
|
||||||
ProjectPermissionActions.Create,
|
ProjectPermissionActions.Create,
|
||||||
subject(ProjectPermissionSub.Secrets, { environment, secretPath, secretName: "", secretTags: [] })
|
subject(ProjectPermissionSub.Secrets, { environment, secretPath })
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ export enum ProjectPermissionActions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export enum ProjectPermissionDynamicSecretActions {
|
export enum ProjectPermissionDynamicSecretActions {
|
||||||
Read = "read",
|
ReadRootCredential = "read-root-credential",
|
||||||
Create = "create",
|
CreateRootCredential = "create-root-credential",
|
||||||
Edit = "edit",
|
EditRootCredential = "edit-root-credential",
|
||||||
Delete = "delete",
|
DeleteRootCredential = "delete-root-credential",
|
||||||
Lease = "lease"
|
Lease = "lease"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+35
-19
@@ -30,11 +30,11 @@ const CmekPolicyActionSchema = z.object({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const DynamicSecretPolicyActionSchema = z.object({
|
const DynamicSecretPolicyActionSchema = z.object({
|
||||||
read: z.boolean().optional(),
|
[ProjectPermissionDynamicSecretActions.ReadRootCredential]: z.boolean().optional(),
|
||||||
edit: z.boolean().optional(),
|
[ProjectPermissionDynamicSecretActions.EditRootCredential]: z.boolean().optional(),
|
||||||
delete: z.boolean().optional(),
|
[ProjectPermissionDynamicSecretActions.DeleteRootCredential]: z.boolean().optional(),
|
||||||
create: z.boolean().optional(),
|
[ProjectPermissionDynamicSecretActions.CreateRootCredential]: z.boolean().optional(),
|
||||||
lease: z.boolean().optional()
|
[ProjectPermissionDynamicSecretActions.Lease]: z.boolean().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
const SecretRollbackPolicyActionSchema = z.object({
|
const SecretRollbackPolicyActionSchema = z.object({
|
||||||
@@ -213,21 +213,25 @@ export const rolePermission2Form = (permissions: TProjectPermission[] = []) => {
|
|||||||
if (!formVal[subject]) formVal[subject] = [];
|
if (!formVal[subject]) formVal[subject] = [];
|
||||||
|
|
||||||
if (subject === ProjectPermissionSub.DynamicSecrets) {
|
if (subject === ProjectPermissionSub.DynamicSecrets) {
|
||||||
const canRead = action.includes(ProjectPermissionDynamicSecretActions.Read);
|
const canRead = action.includes(ProjectPermissionDynamicSecretActions.ReadRootCredential);
|
||||||
const canEdit = action.includes(ProjectPermissionDynamicSecretActions.Edit);
|
const canEdit = action.includes(ProjectPermissionDynamicSecretActions.EditRootCredential);
|
||||||
const canDelete = action.includes(ProjectPermissionDynamicSecretActions.Delete);
|
const canDelete = action.includes(
|
||||||
const canCreate = action.includes(ProjectPermissionDynamicSecretActions.Create);
|
ProjectPermissionDynamicSecretActions.DeleteRootCredential
|
||||||
|
);
|
||||||
|
const canCreate = action.includes(
|
||||||
|
ProjectPermissionDynamicSecretActions.CreateRootCredential
|
||||||
|
);
|
||||||
const canLease = action.includes(ProjectPermissionDynamicSecretActions.Lease);
|
const canLease = action.includes(ProjectPermissionDynamicSecretActions.Lease);
|
||||||
|
|
||||||
// from above statement we are sure it won't be undefined
|
// from above statement we are sure it won't be undefined
|
||||||
formVal[subject]!.push({
|
formVal[subject]!.push({
|
||||||
read: canRead,
|
[ProjectPermissionDynamicSecretActions.ReadRootCredential]: canRead,
|
||||||
create: canCreate,
|
[ProjectPermissionDynamicSecretActions.CreateRootCredential]: canCreate,
|
||||||
edit: canEdit,
|
[ProjectPermissionDynamicSecretActions.EditRootCredential]: canEdit,
|
||||||
delete: canDelete,
|
[ProjectPermissionDynamicSecretActions.EditRootCredential]: canDelete,
|
||||||
conditions: conditions ? convertCaslConditionToFormOperator(conditions) : [],
|
conditions: conditions ? convertCaslConditionToFormOperator(conditions) : [],
|
||||||
inverted,
|
inverted,
|
||||||
lease: canLease
|
[ProjectPermissionDynamicSecretActions.Lease]: canLease
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// for other subjects
|
// for other subjects
|
||||||
@@ -387,11 +391,23 @@ export const PROJECT_PERMISSION_OBJECT: TProjectPermissionObject = {
|
|||||||
[ProjectPermissionSub.DynamicSecrets]: {
|
[ProjectPermissionSub.DynamicSecrets]: {
|
||||||
title: "Dynamic Secrets",
|
title: "Dynamic Secrets",
|
||||||
actions: [
|
actions: [
|
||||||
{ label: "Read", value: "read" },
|
{
|
||||||
{ label: "Create", value: "create" },
|
label: "Read root credentials",
|
||||||
{ label: "Modify", value: "edit" },
|
value: ProjectPermissionDynamicSecretActions.ReadRootCredential
|
||||||
{ label: "Remove", value: "delete" },
|
},
|
||||||
{ label: "Manage Leases", value: "lease" }
|
{
|
||||||
|
label: "Create root credentials",
|
||||||
|
value: ProjectPermissionDynamicSecretActions.CreateRootCredential
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Modify root credentials",
|
||||||
|
value: ProjectPermissionDynamicSecretActions.EditRootCredential
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Remove root credentials",
|
||||||
|
value: ProjectPermissionDynamicSecretActions.DeleteRootCredential
|
||||||
|
},
|
||||||
|
{ label: "Manage Leases", value: ProjectPermissionDynamicSecretActions.Lease }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
[ProjectPermissionSub.Cmek]: {
|
[ProjectPermissionSub.Cmek]: {
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ export const SecretMainPage = () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const canReadDynamicSecret = permission.can(
|
const canReadDynamicSecret = permission.can(
|
||||||
ProjectPermissionDynamicSecretActions.Read,
|
ProjectPermissionDynamicSecretActions.ReadRootCredential,
|
||||||
subject(ProjectPermissionSub.DynamicSecrets, { environment, secretPath })
|
subject(ProjectPermissionSub.DynamicSecrets, { environment, secretPath })
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -487,7 +487,7 @@ export const ActionBar = ({
|
|||||||
)}
|
)}
|
||||||
</ProjectPermissionCan>
|
</ProjectPermissionCan>
|
||||||
<ProjectPermissionCan
|
<ProjectPermissionCan
|
||||||
I={ProjectPermissionDynamicSecretActions.Create}
|
I={ProjectPermissionDynamicSecretActions.CreateRootCredential}
|
||||||
a={subject(ProjectPermissionSub.DynamicSecrets, {
|
a={subject(ProjectPermissionSub.DynamicSecrets, {
|
||||||
environment,
|
environment,
|
||||||
secretPath,
|
secretPath,
|
||||||
|
|||||||
+2
-2
@@ -175,7 +175,7 @@ export const DynamicSecretListView = ({
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex items-center space-x-4 border-l border-mineshaft-600 px-3 py-3">
|
<div className="flex items-center space-x-4 border-l border-mineshaft-600 px-3 py-3">
|
||||||
<ProjectPermissionCan
|
<ProjectPermissionCan
|
||||||
I={ProjectPermissionDynamicSecretActions.Edit}
|
I={ProjectPermissionDynamicSecretActions.EditRootCredential}
|
||||||
a={subject(ProjectPermissionSub.DynamicSecrets, { environment, secretPath })}
|
a={subject(ProjectPermissionSub.DynamicSecrets, { environment, secretPath })}
|
||||||
renderTooltip
|
renderTooltip
|
||||||
allowedLabel="Edit"
|
allowedLabel="Edit"
|
||||||
@@ -197,7 +197,7 @@ export const DynamicSecretListView = ({
|
|||||||
)}
|
)}
|
||||||
</ProjectPermissionCan>
|
</ProjectPermissionCan>
|
||||||
<ProjectPermissionCan
|
<ProjectPermissionCan
|
||||||
I={ProjectPermissionDynamicSecretActions.Delete}
|
I={ProjectPermissionDynamicSecretActions.DeleteRootCredential}
|
||||||
a={subject(ProjectPermissionSub.DynamicSecrets, { environment, secretPath })}
|
a={subject(ProjectPermissionSub.DynamicSecrets, { environment, secretPath })}
|
||||||
renderTooltip
|
renderTooltip
|
||||||
allowedLabel="Delete"
|
allowedLabel="Delete"
|
||||||
|
|||||||
Reference in New Issue
Block a user