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:
Maidul Islam
2024-11-22 16:23:22 -05:00
committed by GitHub
4 changed files with 66 additions and 7 deletions
@@ -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) {
@@ -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");
@@ -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>