feat: updated files on review changes

This commit is contained in:
=
2025-04-28 18:56:17 +05:30
parent a80520e425
commit 7b42f666f9
10 changed files with 42 additions and 40 deletions
+1 -1
View File
@@ -110,7 +110,7 @@ declare module "@fastify/request-context" {
}; };
}; };
identityPermissionMetadata?: Record<string, unknown>; // filled by permission service identityPermissionMetadata?: Record<string, unknown>; // filled by permission service
assumedProjectRole?: { requesterId: string; actorId: string; actorType: ActorType; projectId: string }; assumedPrivilegeDetails?: { requesterId: string; actorId: string; actorType: ActorType; projectId: string };
} }
} }
@@ -90,8 +90,8 @@ export const registerAssumePrivilegeRouter = async (server: FastifyZodProvider)
}, },
onRequest: verifyAuth([AuthMode.JWT]), onRequest: verifyAuth([AuthMode.JWT]),
handler: async (req, res) => { handler: async (req, res) => {
const assumePrivilege = requestContext.get("assumedProjectRole"); const assumedPrivilegeDetails = requestContext.get("assumedPrivilegeDetails");
if (req.auth.authMode === AuthMode.JWT && assumePrivilege) { if (req.auth.authMode === AuthMode.JWT && assumedPrivilegeDetails) {
const appCfg = getConfig(); const appCfg = getConfig();
void res.setCookie("infisical-project-assume-privileges", "", { void res.setCookie("infisical-project-assume-privileges", "", {
httpOnly: true, httpOnly: true,
@@ -110,8 +110,8 @@ export const registerAssumePrivilegeRouter = async (server: FastifyZodProvider)
projectId: req.params.projectId, projectId: req.params.projectId,
requesterEmail: req.auth.user.username, requesterEmail: req.auth.user.username,
requesterId: req.auth.user.id, requesterId: req.auth.user.id,
targetActorId: assumePrivilege.actorId, targetActorId: assumedPrivilegeDetails.actorId,
targetActorType: assumePrivilege.actorType targetActorType: assumedPrivilegeDetails.actorType
} }
} }
}); });
@@ -253,7 +253,7 @@ export const registerProjectRoleRouter = async (server: FastifyZodProvider) => {
}) })
.array() .array()
}), }),
impersonation: z assumedPrivilegeDetails: z
.object({ .object({
actorId: z.string(), actorId: z.string(),
actorType: z.string(), actorType: z.string(),
@@ -268,7 +268,7 @@ export const registerProjectRoleRouter = async (server: FastifyZodProvider) => {
}, },
onRequest: verifyAuth([AuthMode.JWT]), onRequest: verifyAuth([AuthMode.JWT]),
handler: async (req) => { handler: async (req) => {
const { permissions, membership, impersonation } = await server.services.projectRole.getUserPermission( const { permissions, membership, assumedPrivilegeDetails } = await server.services.projectRole.getUserPermission(
req.permission.id, req.permission.id,
req.params.projectId, req.params.projectId,
req.permission.authMethod, req.permission.authMethod,
@@ -279,7 +279,7 @@ export const registerProjectRoleRouter = async (server: FastifyZodProvider) => {
data: { data: {
permissions, permissions,
membership, membership,
impersonation assumedPrivilegeDetails
} }
}; };
} }
@@ -560,15 +560,15 @@ export const permissionServiceFactory = ({
}: TGetProjectPermissionArg): Promise<TProjectPermissionRT<T>> => { }: TGetProjectPermissionArg): Promise<TProjectPermissionRT<T>> => {
let actor = inputActor; let actor = inputActor;
let actorId = inputActorId; let actorId = inputActorId;
const assumedProjectRole = requestContext.get("assumedProjectRole"); const assumedPrivilegeDetailsCtx = requestContext.get("assumedPrivilegeDetails");
if ( if (
assumedProjectRole && assumedPrivilegeDetailsCtx &&
actor === ActorType.USER && actor === ActorType.USER &&
actorId === assumedProjectRole.requesterId && actorId === assumedPrivilegeDetailsCtx.requesterId &&
projectId === assumedProjectRole.projectId projectId === assumedPrivilegeDetailsCtx.projectId
) { ) {
actor = assumedProjectRole.actorType; actor = assumedPrivilegeDetailsCtx.actorType;
actorId = assumedProjectRole.actorId; actorId = assumedPrivilegeDetailsCtx.actorId;
} }
switch (actor) { switch (actor) {
@@ -13,7 +13,7 @@ export const injectAssumePrivilege = fp(async (server: FastifyZodProvider) => {
req.auth.tokenVersionId req.auth.tokenVersionId
); );
if (decodedToken) { if (decodedToken) {
requestContext.set("assumedProjectRole", decodedToken); requestContext.set("assumedPrivilegeDetails", decodedToken);
} }
} }
} catch (error) { } catch (error) {
@@ -238,29 +238,31 @@ export const projectRoleServiceFactory = ({
// just to satisfy ts // just to satisfy ts
if (!("roles" in membership)) throw new BadRequestError({ message: "Service token not allowed" }); if (!("roles" in membership)) throw new BadRequestError({ message: "Service token not allowed" });
const assumedProjectRole = requestContext.get("assumedProjectRole"); const assumedPrivilegeDetailsCtx = requestContext.get("assumedPrivilegeDetails");
const isImpersonating = assumedProjectRole?.projectId === projectId; const isAssumingPrivilege = assumedPrivilegeDetailsCtx?.projectId === projectId;
const impersonation = isImpersonating const assumedPrivilegeDetails = isAssumingPrivilege
? { ? {
actorId: assumedProjectRole?.actorId, actorId: assumedPrivilegeDetailsCtx?.actorId,
actorType: assumedProjectRole?.actorType, actorType: assumedPrivilegeDetailsCtx?.actorType,
actorName: "", actorName: "",
actorEmail: "" actorEmail: ""
} }
: undefined; : undefined;
if (impersonation?.actorType === ActorType.IDENTITY) { if (assumedPrivilegeDetails?.actorType === ActorType.IDENTITY) {
const identityDetails = await identityDAL.findById(impersonation.actorId); const identityDetails = await identityDAL.findById(assumedPrivilegeDetails.actorId);
if (!identityDetails) throw new NotFoundError({ message: `Identity with ID ${impersonation.actorId} not found` }); if (!identityDetails)
impersonation.actorName = identityDetails.name; throw new NotFoundError({ message: `Identity with ID ${assumedPrivilegeDetails.actorId} not found` });
} else if (impersonation?.actorType === ActorType.USER) { assumedPrivilegeDetails.actorName = identityDetails.name;
const userDetails = await userDAL.findById(impersonation?.actorId); } else if (assumedPrivilegeDetails?.actorType === ActorType.USER) {
if (!userDetails) throw new NotFoundError({ message: `User with ID ${impersonation.actorId} not found` }); const userDetails = await userDAL.findById(assumedPrivilegeDetails?.actorId);
impersonation.actorName = `${userDetails?.firstName} ${userDetails?.lastName || ""}`; if (!userDetails)
impersonation.actorEmail = userDetails?.email || ""; throw new NotFoundError({ message: `User with ID ${assumedPrivilegeDetails.actorId} not found` });
assumedPrivilegeDetails.actorName = `${userDetails?.firstName} ${userDetails?.lastName || ""}`;
assumedPrivilegeDetails.actorEmail = userDetails?.email || "";
} }
return { permissions: packRules(permission.rules), membership, impersonation }; return { permissions: packRules(permission.rules), membership, assumedPrivilegeDetails };
}; };
return { createRole, updateRole, deleteRole, listRoles, getUserPermission, getRoleBySlug }; return { createRole, updateRole, deleteRole, listRoles, getUserPermission, getRoleBySlug };
@@ -20,7 +20,7 @@ export const useProjectPermission = () => {
} }
const { const {
data: { permission, membership, impersonation } data: { permission, membership, assumedPrivilegeDetails }
} = useSuspenseQuery({ } = useSuspenseQuery({
queryKey: roleQueryKeys.getUserProjectPermissions({ workspaceId: projectId }), queryKey: roleQueryKeys.getUserProjectPermissions({ workspaceId: projectId }),
queryFn: () => fetchUserProjectPermissions({ workspaceId: projectId }), queryFn: () => fetchUserProjectPermissions({ workspaceId: projectId }),
@@ -30,7 +30,7 @@ export const useProjectPermission = () => {
const ability = evaluatePermissionsAbility(rule); const ability = evaluatePermissionsAbility(rule);
return { return {
permission: ability, permission: ability,
impersonation: data.impersonation, assumedPrivilegeDetails: data.assumedPrivilegeDetails,
membership: { membership: {
...data.membership, ...data.membership,
roles: data.membership.roles.map(({ role }) => role) roles: data.membership.roles.map(({ role }) => role)
@@ -44,5 +44,5 @@ export const useProjectPermission = () => {
[] []
); );
return { permission, membership, hasProjectRole, impersonation }; return { permission, membership, hasProjectRole, assumedPrivilegeDetails };
}; };
+1 -1
View File
@@ -138,7 +138,7 @@ export const fetchUserProjectPermissions = async ({
data: { data: {
permissions: PackRule<RawRuleOf<MongoAbility<OrgPermissionSet>>>[]; permissions: PackRule<RawRuleOf<MongoAbility<OrgPermissionSet>>>[];
membership: Omit<TProjectMembership, "roles"> & { roles: { role: string }[] }; membership: Omit<TProjectMembership, "roles"> & { roles: { role: string }[] };
impersonation?: { assumedPrivilegeDetails?: {
actorId: string; actorId: string;
actorType: ActorType; actorType: ActorType;
actorEmail: string; actorEmail: string;
@@ -30,7 +30,7 @@ export const ProjectLayout = () => {
const breadcrumbs = matches && "breadcrumbs" in matches ? matches.breadcrumbs : undefined; const breadcrumbs = matches && "breadcrumbs" in matches ? matches.breadcrumbs : undefined;
const { t } = useTranslation(); const { t } = useTranslation();
const { impersonation } = useProjectPermission(); const { assumedPrivilegeDetails } = useProjectPermission();
const workspaceId = currentWorkspace?.id || ""; const workspaceId = currentWorkspace?.id || "";
const projectSlug = currentWorkspace?.slug || ""; const projectSlug = currentWorkspace?.slug || "";
@@ -64,7 +64,7 @@ export const ProjectLayout = () => {
return ( return (
<> <>
<div className="dark hidden h-screen w-full flex-col overflow-x-hidden md:flex"> <div className="dark hidden h-screen w-full flex-col overflow-x-hidden md:flex">
{impersonation && <AssumePrivilegeModeBanner />} {assumedPrivilegeDetails && <AssumePrivilegeModeBanner />}
<div className="flex flex-grow flex-col overflow-y-hidden md:flex-row"> <div className="flex flex-grow flex-col overflow-y-hidden md:flex-row">
<motion.div <motion.div
key="menu-project-items" key="menu-project-items"
@@ -9,9 +9,9 @@ import { ActorType } from "@app/hooks/api/auditLogs/enums";
export const AssumePrivilegeModeBanner = () => { export const AssumePrivilegeModeBanner = () => {
const { currentWorkspace } = useWorkspace(); const { currentWorkspace } = useWorkspace();
const exitAssumePrivilegeMode = useRemoveAssumeProjectPrivilege(); const exitAssumePrivilegeMode = useRemoveAssumeProjectPrivilege();
const { impersonation } = useProjectPermission(); const { assumedPrivilegeDetails } = useProjectPermission();
if (!impersonation) return null; if (!assumedPrivilegeDetails) return null;
return ( return (
<div className="z-10 -mx-4 flex items-center justify-center gap-2 rounded border border-mineshaft-600 bg-primary-400 p-2 text-mineshaft-800 shadow"> <div className="z-10 -mx-4 flex items-center justify-center gap-2 rounded border border-mineshaft-600 bg-primary-400 p-2 text-mineshaft-800 shadow">
@@ -19,8 +19,8 @@ export const AssumePrivilegeModeBanner = () => {
<FontAwesomeIcon icon={faInfoCircle} className="mr-2" /> <FontAwesomeIcon icon={faInfoCircle} className="mr-2" />
You are currently viewing the project with privileges of{" "} You are currently viewing the project with privileges of{" "}
<b> <b>
{impersonation?.actorType === ActorType.IDENTITY ? "identity" : "user"}{" "} {assumedPrivilegeDetails?.actorType === ActorType.IDENTITY ? "identity" : "user"}{" "}
{impersonation?.actorName} {assumedPrivilegeDetails?.actorName}
</b> </b>
</div> </div>
<div> <div>