generate pam access grant as part of post approval flow

This commit is contained in:
x032205
2025-12-06 19:44:57 -05:00
parent 89c1c5ffc4
commit 6c7d708c98
5 changed files with 26 additions and 11 deletions
@@ -554,7 +554,7 @@ export const pamAccountServiceFactory = ({
accountPath: `${folderPath}/${account.name}` accountPath: `${folderPath}/${account.name}`
}; };
const canAccess = await fac.canAccess(approvalRequestGrantsDAL, actor.id, resource.projectId, inputs); const canAccess = await fac.canAccess(approvalRequestGrantsDAL, resource.projectId, actor.id, inputs);
if (canAccess) { if (canAccess) {
// Grant exists, allow access without checking permission // Grant exists, allow access without checking permission
+2 -1
View File
@@ -2485,7 +2485,8 @@ export const registerRoutes = async (
approvalRequestStepEligibleApproversDAL, approvalRequestStepEligibleApproversDAL,
approvalRequestApprovalsDAL, approvalRequestApprovalsDAL,
userGroupMembershipDAL, userGroupMembershipDAL,
notificationService notificationService,
approvalRequestGrantsDAL
}); });
// setup the communication with license key server // setup the communication with license key server
@@ -14,6 +14,7 @@ import {
TApprovalPolicyStepsDALFactory, TApprovalPolicyStepsDALFactory,
TApprovalRequestApprovalsDALFactory, TApprovalRequestApprovalsDALFactory,
TApprovalRequestDALFactory, TApprovalRequestDALFactory,
TApprovalRequestGrantsDALFactory,
TApprovalRequestStepEligibleApproversDALFactory, TApprovalRequestStepEligibleApproversDALFactory,
TApprovalRequestStepsDALFactory TApprovalRequestStepsDALFactory
} from "./approval-policy-dal"; } from "./approval-policy-dal";
@@ -41,6 +42,7 @@ type TApprovalPolicyServiceFactoryDep = {
approvalRequestDAL: TApprovalRequestDALFactory; approvalRequestDAL: TApprovalRequestDALFactory;
approvalRequestStepsDAL: TApprovalRequestStepsDALFactory; approvalRequestStepsDAL: TApprovalRequestStepsDALFactory;
approvalRequestStepEligibleApproversDAL: TApprovalRequestStepEligibleApproversDALFactory; approvalRequestStepEligibleApproversDAL: TApprovalRequestStepEligibleApproversDALFactory;
approvalRequestGrantsDAL: TApprovalRequestGrantsDALFactory;
userGroupMembershipDAL: TUserGroupMembershipDALFactory; userGroupMembershipDAL: TUserGroupMembershipDALFactory;
notificationService: TNotificationServiceFactory; notificationService: TNotificationServiceFactory;
permissionService: Pick<TPermissionServiceFactory, "getProjectPermission" | "getOrgPermission">; permissionService: Pick<TPermissionServiceFactory, "getProjectPermission" | "getOrgPermission">;
@@ -56,6 +58,7 @@ export const approvalPolicyServiceFactory = ({
approvalRequestDAL, approvalRequestDAL,
approvalRequestStepsDAL, approvalRequestStepsDAL,
approvalRequestStepEligibleApproversDAL, approvalRequestStepEligibleApproversDAL,
approvalRequestGrantsDAL,
userGroupMembershipDAL, userGroupMembershipDAL,
notificationService, notificationService,
permissionService, permissionService,
@@ -598,7 +601,7 @@ export const approvalPolicyServiceFactory = ({
const fac = APPROVAL_POLICY_FACTORY_MAP[updatedRequest.type as ApprovalPolicyType]( const fac = APPROVAL_POLICY_FACTORY_MAP[updatedRequest.type as ApprovalPolicyType](
updatedRequest.type as ApprovalPolicyType updatedRequest.type as ApprovalPolicyType
); );
await fac.postApprovalRoutine(newRequest as TApprovalRequest); await fac.postApprovalRoutine(approvalRequestGrantsDAL, newRequest as TApprovalRequest);
} }
return { request: newRequest }; return { request: newRequest };
@@ -73,7 +73,10 @@ export type TApprovalRequestFactoryValidateConstraints<P extends TApprovalPolicy
policy: P, policy: P,
inputs: R inputs: R
) => boolean; ) => boolean;
export type TApprovalRequestFactoryPostApprovalRoutine = (request: TApprovalRequest) => Promise<void>; export type TApprovalRequestFactoryPostApprovalRoutine = (
approvalRequestGrantsDAL: TApprovalRequestGrantsDALFactory,
request: TApprovalRequest
) => Promise<void>;
export type TApprovalResourceFactory< export type TApprovalResourceFactory<
I extends TApprovalPolicyInputs, I extends TApprovalPolicyInputs,
@@ -74,11 +74,7 @@ export const pamAccessPolicyFactory: TApprovalResourceFactory<
return grants.some((grant) => { return grants.some((grant) => {
const grantAttributes = grant.attributes as TPamAccessPolicyInputs; const grantAttributes = grant.attributes as TPamAccessPolicyInputs;
const isMatch = picomatch(grantAttributes.accountPath); const isMatch = picomatch(grantAttributes.accountPath);
return ( return isMatch(inputs.accountPath) && (!grant.expiresAt || grant.expiresAt > new Date());
grantAttributes.resourceId === inputs.resourceId &&
isMatch(inputs.accountPath) &&
(!grant.expiresAt || grant.expiresAt > new Date())
);
}); });
}; };
@@ -92,8 +88,20 @@ export const pamAccessPolicyFactory: TApprovalResourceFactory<
return reqDuration >= ms(durationConstraint.min) && reqDuration <= ms(durationConstraint.max); return reqDuration >= ms(durationConstraint.min) && reqDuration <= ms(durationConstraint.max);
}; };
const postApprovalRoutine: TApprovalRequestFactoryPostApprovalRoutine = async (_request) => { const postApprovalRoutine: TApprovalRequestFactoryPostApprovalRoutine = async (approvalRequestGrantsDAL, request) => {
// Placeholder const inputs = request.requestData.requestData;
const durationMs = ms(inputs.accessDuration);
const expiresAt = new Date(Date.now() + durationMs);
await approvalRequestGrantsDAL.create({
projectId: request.projectId,
requestId: request.id,
granteeUserId: request.requesterId,
status: ApprovalRequestGrantStatus.Active,
type: request.type,
attributes: inputs,
expiresAt
});
}; };
return { return {