mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-04 12:26:13 +00:00
Merge pull request #2779 from Infisical/fix-delete-project-role
Fix: Prevent Updating Identity/User Project Role to reserved "Custom" Slug
This commit is contained in:
@@ -182,7 +182,12 @@ export const identityProjectServiceFactory = ({
|
|||||||
|
|
||||||
// validate custom roles input
|
// validate custom roles input
|
||||||
const customInputRoles = roles.filter(
|
const customInputRoles = roles.filter(
|
||||||
({ role }) => !Object.values(ProjectMembershipRole).includes(role as ProjectMembershipRole)
|
({ role }) =>
|
||||||
|
!Object.values(ProjectMembershipRole)
|
||||||
|
// we don't want to include custom in this check;
|
||||||
|
// this unintentionally enables setting slug to custom which is reserved
|
||||||
|
.filter((r) => r !== ProjectMembershipRole.Custom)
|
||||||
|
.includes(role as ProjectMembershipRole)
|
||||||
);
|
);
|
||||||
const hasCustomRole = Boolean(customInputRoles.length);
|
const hasCustomRole = Boolean(customInputRoles.length);
|
||||||
const customRoles = hasCustomRole
|
const customRoles = hasCustomRole
|
||||||
|
|||||||
@@ -280,7 +280,12 @@ export const projectMembershipServiceFactory = ({
|
|||||||
|
|
||||||
// validate custom roles input
|
// validate custom roles input
|
||||||
const customInputRoles = roles.filter(
|
const customInputRoles = roles.filter(
|
||||||
({ role }) => !Object.values(ProjectMembershipRole).includes(role as ProjectMembershipRole)
|
({ role }) =>
|
||||||
|
!Object.values(ProjectMembershipRole)
|
||||||
|
// we don't want to include custom in this check;
|
||||||
|
// this unintentionally enables setting slug to custom which is reserved
|
||||||
|
.filter((r) => r !== ProjectMembershipRole.Custom)
|
||||||
|
.includes(role as ProjectMembershipRole)
|
||||||
);
|
);
|
||||||
const hasCustomRole = Boolean(customInputRoles.length);
|
const hasCustomRole = Boolean(customInputRoles.length);
|
||||||
if (hasCustomRole) {
|
if (hasCustomRole) {
|
||||||
|
|||||||
+25
-2
@@ -50,11 +50,34 @@ export const IdentityRoleDetailsSection = ({
|
|||||||
const handleRoleDelete = async () => {
|
const handleRoleDelete = async () => {
|
||||||
const { id } = popUp?.deleteRole?.data as TProjectRole;
|
const { id } = popUp?.deleteRole?.data as TProjectRole;
|
||||||
try {
|
try {
|
||||||
const updatedRole = identityMembershipDetails?.roles?.filter((el) => el.id !== id);
|
const updatedRoles = identityMembershipDetails?.roles?.filter((el) => el.id !== id);
|
||||||
await updateIdentityWorkspaceRole({
|
await updateIdentityWorkspaceRole({
|
||||||
workspaceId: currentWorkspace?.id || "",
|
workspaceId: currentWorkspace?.id || "",
|
||||||
identityId: identityMembershipDetails.identity.id,
|
identityId: identityMembershipDetails.identity.id,
|
||||||
roles: updatedRole
|
roles: updatedRoles.map(
|
||||||
|
({
|
||||||
|
role,
|
||||||
|
customRoleSlug,
|
||||||
|
isTemporary,
|
||||||
|
temporaryMode,
|
||||||
|
temporaryRange,
|
||||||
|
temporaryAccessStartTime,
|
||||||
|
temporaryAccessEndTime
|
||||||
|
}) => ({
|
||||||
|
role: role === "custom" ? customRoleSlug : role,
|
||||||
|
...(isTemporary
|
||||||
|
? {
|
||||||
|
isTemporary,
|
||||||
|
temporaryMode,
|
||||||
|
temporaryRange,
|
||||||
|
temporaryAccessStartTime,
|
||||||
|
temporaryAccessEndTime
|
||||||
|
}
|
||||||
|
: {
|
||||||
|
isTemporary
|
||||||
|
})
|
||||||
|
})
|
||||||
|
)
|
||||||
});
|
});
|
||||||
createNotification({ type: "success", text: "Successfully removed role" });
|
createNotification({ type: "success", text: "Successfully removed role" });
|
||||||
handlePopUpClose("deleteRole");
|
handlePopUpClose("deleteRole");
|
||||||
|
|||||||
+29
-3
@@ -61,10 +61,33 @@ export const MemberRoleDetailsSection = ({
|
|||||||
const handleRoleDelete = async () => {
|
const handleRoleDelete = async () => {
|
||||||
const { id } = popUp?.deleteRole?.data as TProjectRole;
|
const { id } = popUp?.deleteRole?.data as TProjectRole;
|
||||||
try {
|
try {
|
||||||
const updatedRole = membershipDetails?.roles?.filter((el) => el.id !== id);
|
const updatedRoles = membershipDetails?.roles?.filter((el) => el.id !== id);
|
||||||
await updateUserWorkspaceRole({
|
await updateUserWorkspaceRole({
|
||||||
workspaceId: currentWorkspace?.id || "",
|
workspaceId: currentWorkspace?.id || "",
|
||||||
roles: updatedRole,
|
roles: updatedRoles.map(
|
||||||
|
({
|
||||||
|
role,
|
||||||
|
customRoleSlug,
|
||||||
|
isTemporary,
|
||||||
|
temporaryMode,
|
||||||
|
temporaryRange,
|
||||||
|
temporaryAccessStartTime,
|
||||||
|
temporaryAccessEndTime
|
||||||
|
}) => ({
|
||||||
|
role: role === "custom" ? customRoleSlug : role,
|
||||||
|
...(isTemporary
|
||||||
|
? {
|
||||||
|
isTemporary,
|
||||||
|
temporaryMode,
|
||||||
|
temporaryRange,
|
||||||
|
temporaryAccessStartTime,
|
||||||
|
temporaryAccessEndTime
|
||||||
|
}
|
||||||
|
: {
|
||||||
|
isTemporary
|
||||||
|
})
|
||||||
|
})
|
||||||
|
),
|
||||||
membershipId: membershipDetails.id
|
membershipId: membershipDetails.id
|
||||||
});
|
});
|
||||||
createNotification({ type: "success", text: "Successfully removed role" });
|
createNotification({ type: "success", text: "Successfully removed role" });
|
||||||
@@ -215,7 +238,10 @@ export const MemberRoleDetailsSection = ({
|
|||||||
title="Roles"
|
title="Roles"
|
||||||
subTitle="Select one or more of the pre-defined or custom roles to configure project permissions."
|
subTitle="Select one or more of the pre-defined or custom roles to configure project permissions."
|
||||||
>
|
>
|
||||||
<MemberRoleModify projectMember={membershipDetails} onOpenUpgradeModal={onOpenUpgradeModal} />
|
<MemberRoleModify
|
||||||
|
projectMember={membershipDetails}
|
||||||
|
onOpenUpgradeModal={onOpenUpgradeModal}
|
||||||
|
/>
|
||||||
</ModalContent>
|
</ModalContent>
|
||||||
</Modal>
|
</Modal>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user