mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-07 14:27:30 +00:00
feat: updated files on review changes
This commit is contained in:
Vendored
+1
-1
@@ -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 };
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
+4
-4
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user