mirror of
https://github.com/Infisical/infisical.git
synced 2025-07-20 01:48:03 +00:00
Compare commits
1 Commits
docs-updat
...
fix-approv
Author | SHA1 | Date | |
---|---|---|---|
f17e1f6699 |
@ -0,0 +1,35 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "@app/db/schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasCommitterCol = await knex.schema.hasColumn(TableName.SecretApprovalRequest, "committerUserId");
|
||||||
|
|
||||||
|
if (hasCommitterCol) {
|
||||||
|
await knex.schema.alterTable(TableName.SecretApprovalRequest, (tb) => {
|
||||||
|
tb.uuid("committerUserId").nullable().alter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasRequesterCol = await knex.schema.hasColumn(TableName.AccessApprovalRequest, "requestedByUserId");
|
||||||
|
|
||||||
|
if (hasRequesterCol) {
|
||||||
|
await knex.schema.alterTable(TableName.AccessApprovalRequest, (tb) => {
|
||||||
|
tb.dropForeign("requestedByUserId");
|
||||||
|
tb.foreign("requestedByUserId").references("id").inTable(TableName.Users).onDelete("CASCADE");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
// can't undo committer nullable
|
||||||
|
|
||||||
|
const hasRequesterCol = await knex.schema.hasColumn(TableName.AccessApprovalRequest, "requestedByUserId");
|
||||||
|
|
||||||
|
if (hasRequesterCol) {
|
||||||
|
await knex.schema.alterTable(TableName.AccessApprovalRequest, (tb) => {
|
||||||
|
tb.dropForeign("requestedByUserId");
|
||||||
|
tb.foreign("requestedByUserId").references("id").inTable(TableName.Users).onDelete("SET NULL");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -14,8 +14,8 @@ export const AccessApprovalPoliciesApproversSchema = z.object({
|
|||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
approverUserId: z.string().uuid().nullable().optional(),
|
approverUserId: z.string().uuid().nullable().optional(),
|
||||||
approverGroupId: z.string().uuid().nullable().optional(),
|
approverGroupId: z.string().uuid().nullable().optional(),
|
||||||
sequence: z.number().default(0).nullable().optional(),
|
sequence: z.number().default(1).nullable().optional(),
|
||||||
approvalsRequired: z.number().default(1).nullable().optional()
|
approvalsRequired: z.number().nullable().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TAccessApprovalPoliciesApprovers = z.infer<typeof AccessApprovalPoliciesApproversSchema>;
|
export type TAccessApprovalPoliciesApprovers = z.infer<typeof AccessApprovalPoliciesApproversSchema>;
|
||||||
|
@ -12,8 +12,8 @@ export const CertificateAuthoritiesSchema = z.object({
|
|||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
projectId: z.string(),
|
projectId: z.string(),
|
||||||
enableDirectIssuance: z.boolean().default(true),
|
|
||||||
status: z.string(),
|
status: z.string(),
|
||||||
|
enableDirectIssuance: z.boolean().default(true),
|
||||||
name: z.string()
|
name: z.string()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -25,8 +25,8 @@ export const CertificatesSchema = z.object({
|
|||||||
certificateTemplateId: z.string().uuid().nullable().optional(),
|
certificateTemplateId: z.string().uuid().nullable().optional(),
|
||||||
keyUsages: z.string().array().nullable().optional(),
|
keyUsages: z.string().array().nullable().optional(),
|
||||||
extendedKeyUsages: z.string().array().nullable().optional(),
|
extendedKeyUsages: z.string().array().nullable().optional(),
|
||||||
pkiSubscriberId: z.string().uuid().nullable().optional(),
|
projectId: z.string(),
|
||||||
projectId: z.string()
|
pkiSubscriberId: z.string().uuid().nullable().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TCertificates = z.infer<typeof CertificatesSchema>;
|
export type TCertificates = z.infer<typeof CertificatesSchema>;
|
||||||
|
@ -18,7 +18,7 @@ export const SecretApprovalRequestsSchema = z.object({
|
|||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
isReplicated: z.boolean().nullable().optional(),
|
isReplicated: z.boolean().nullable().optional(),
|
||||||
committerUserId: z.string().uuid(),
|
committerUserId: z.string().uuid().nullable().optional(),
|
||||||
statusChangedByUserId: z.string().uuid().nullable().optional(),
|
statusChangedByUserId: z.string().uuid().nullable().optional(),
|
||||||
bypassReason: z.string().nullable().optional()
|
bypassReason: z.string().nullable().optional()
|
||||||
});
|
});
|
||||||
|
@ -58,7 +58,7 @@ export const registerSecretApprovalRequestRouter = async (server: FastifyZodProv
|
|||||||
deletedAt: z.date().nullish(),
|
deletedAt: z.date().nullish(),
|
||||||
allowedSelfApprovals: z.boolean()
|
allowedSelfApprovals: z.boolean()
|
||||||
}),
|
}),
|
||||||
committerUser: approvalRequestUser,
|
committerUser: approvalRequestUser.nullish(),
|
||||||
commits: z.object({ op: z.string(), secretId: z.string().nullable().optional() }).array(),
|
commits: z.object({ op: z.string(), secretId: z.string().nullable().optional() }).array(),
|
||||||
environment: z.string(),
|
environment: z.string(),
|
||||||
reviewers: z.object({ userId: z.string(), status: z.string() }).array(),
|
reviewers: z.object({ userId: z.string(), status: z.string() }).array(),
|
||||||
@ -308,7 +308,7 @@ export const registerSecretApprovalRequestRouter = async (server: FastifyZodProv
|
|||||||
}),
|
}),
|
||||||
environment: z.string(),
|
environment: z.string(),
|
||||||
statusChangedByUser: approvalRequestUser.optional(),
|
statusChangedByUser: approvalRequestUser.optional(),
|
||||||
committerUser: approvalRequestUser,
|
committerUser: approvalRequestUser.nullish(),
|
||||||
reviewers: approvalRequestUser.extend({ status: z.string(), comment: z.string().optional() }).array(),
|
reviewers: approvalRequestUser.extend({ status: z.string(), comment: z.string().optional() }).array(),
|
||||||
secretPath: z.string(),
|
secretPath: z.string(),
|
||||||
commits: secretRawSchema
|
commits: secretRawSchema
|
||||||
|
@ -1711,7 +1711,7 @@ interface SecretApprovalReopened {
|
|||||||
interface SecretApprovalRequest {
|
interface SecretApprovalRequest {
|
||||||
type: EventType.SECRET_APPROVAL_REQUEST;
|
type: EventType.SECRET_APPROVAL_REQUEST;
|
||||||
metadata: {
|
metadata: {
|
||||||
committedBy: string;
|
committedBy?: string | null;
|
||||||
secretApprovalRequestSlug: string;
|
secretApprovalRequestSlug: string;
|
||||||
secretApprovalRequestId: string;
|
secretApprovalRequestId: string;
|
||||||
eventType: SecretApprovalEvent;
|
eventType: SecretApprovalEvent;
|
||||||
|
@ -45,7 +45,7 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => {
|
|||||||
`${TableName.SecretApprovalRequest}.statusChangedByUserId`,
|
`${TableName.SecretApprovalRequest}.statusChangedByUserId`,
|
||||||
`statusChangedByUser.id`
|
`statusChangedByUser.id`
|
||||||
)
|
)
|
||||||
.join<TUsers>(
|
.leftJoin<TUsers>(
|
||||||
db(TableName.Users).as("committerUser"),
|
db(TableName.Users).as("committerUser"),
|
||||||
`${TableName.SecretApprovalRequest}.committerUserId`,
|
`${TableName.SecretApprovalRequest}.committerUserId`,
|
||||||
`committerUser.id`
|
`committerUser.id`
|
||||||
@ -173,13 +173,15 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => {
|
|||||||
username: el.statusChangedByUserUsername
|
username: el.statusChangedByUserUsername
|
||||||
}
|
}
|
||||||
: undefined,
|
: undefined,
|
||||||
committerUser: {
|
committerUser: el.committerUserId
|
||||||
userId: el.committerUserId,
|
? {
|
||||||
email: el.committerUserEmail,
|
userId: el.committerUserId,
|
||||||
firstName: el.committerUserFirstName,
|
email: el.committerUserEmail,
|
||||||
lastName: el.committerUserLastName,
|
firstName: el.committerUserFirstName,
|
||||||
username: el.committerUserUsername
|
lastName: el.committerUserLastName,
|
||||||
},
|
username: el.committerUserUsername
|
||||||
|
}
|
||||||
|
: null,
|
||||||
policy: {
|
policy: {
|
||||||
id: el.policyId,
|
id: el.policyId,
|
||||||
name: el.policyName,
|
name: el.policyName,
|
||||||
@ -377,7 +379,7 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => {
|
|||||||
`${TableName.SecretApprovalPolicyBypasser}.bypasserGroupId`,
|
`${TableName.SecretApprovalPolicyBypasser}.bypasserGroupId`,
|
||||||
`bypasserUserGroupMembership.groupId`
|
`bypasserUserGroupMembership.groupId`
|
||||||
)
|
)
|
||||||
.join<TUsers>(
|
.leftJoin<TUsers>(
|
||||||
db(TableName.Users).as("committerUser"),
|
db(TableName.Users).as("committerUser"),
|
||||||
`${TableName.SecretApprovalRequest}.committerUserId`,
|
`${TableName.SecretApprovalRequest}.committerUserId`,
|
||||||
`committerUser.id`
|
`committerUser.id`
|
||||||
@ -488,13 +490,15 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => {
|
|||||||
enforcementLevel: el.policyEnforcementLevel,
|
enforcementLevel: el.policyEnforcementLevel,
|
||||||
allowedSelfApprovals: el.policyAllowedSelfApprovals
|
allowedSelfApprovals: el.policyAllowedSelfApprovals
|
||||||
},
|
},
|
||||||
committerUser: {
|
committerUser: el.committerUserId
|
||||||
userId: el.committerUserId,
|
? {
|
||||||
email: el.committerUserEmail,
|
userId: el.committerUserId,
|
||||||
firstName: el.committerUserFirstName,
|
email: el.committerUserEmail,
|
||||||
lastName: el.committerUserLastName,
|
firstName: el.committerUserFirstName,
|
||||||
username: el.committerUserUsername
|
lastName: el.committerUserLastName,
|
||||||
}
|
username: el.committerUserUsername
|
||||||
|
}
|
||||||
|
: null
|
||||||
}),
|
}),
|
||||||
childrenMapper: [
|
childrenMapper: [
|
||||||
{
|
{
|
||||||
@ -581,7 +585,7 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => {
|
|||||||
`${TableName.SecretApprovalPolicyBypasser}.bypasserGroupId`,
|
`${TableName.SecretApprovalPolicyBypasser}.bypasserGroupId`,
|
||||||
`bypasserUserGroupMembership.groupId`
|
`bypasserUserGroupMembership.groupId`
|
||||||
)
|
)
|
||||||
.join<TUsers>(
|
.leftJoin<TUsers>(
|
||||||
db(TableName.Users).as("committerUser"),
|
db(TableName.Users).as("committerUser"),
|
||||||
`${TableName.SecretApprovalRequest}.committerUserId`,
|
`${TableName.SecretApprovalRequest}.committerUserId`,
|
||||||
`committerUser.id`
|
`committerUser.id`
|
||||||
@ -693,13 +697,15 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => {
|
|||||||
enforcementLevel: el.policyEnforcementLevel,
|
enforcementLevel: el.policyEnforcementLevel,
|
||||||
allowedSelfApprovals: el.policyAllowedSelfApprovals
|
allowedSelfApprovals: el.policyAllowedSelfApprovals
|
||||||
},
|
},
|
||||||
committerUser: {
|
committerUser: el.committerUserId
|
||||||
userId: el.committerUserId,
|
? {
|
||||||
email: el.committerUserEmail,
|
userId: el.committerUserId,
|
||||||
firstName: el.committerUserFirstName,
|
email: el.committerUserEmail,
|
||||||
lastName: el.committerUserLastName,
|
firstName: el.committerUserFirstName,
|
||||||
username: el.committerUserUsername
|
lastName: el.committerUserLastName,
|
||||||
}
|
username: el.committerUserUsername
|
||||||
|
}
|
||||||
|
: null
|
||||||
}),
|
}),
|
||||||
childrenMapper: [
|
childrenMapper: [
|
||||||
{
|
{
|
||||||
|
@ -1320,7 +1320,7 @@ export const secretApprovalRequestServiceFactory = ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const env = await projectEnvDAL.findOne({ id: policy.envId });
|
const env = await projectEnvDAL.findOne({ id: policy.envId });
|
||||||
const user = await userDAL.findById(secretApprovalRequest.committerUserId);
|
const user = await userDAL.findById(actorId);
|
||||||
|
|
||||||
await triggerWorkflowIntegrationNotification({
|
await triggerWorkflowIntegrationNotification({
|
||||||
input: {
|
input: {
|
||||||
@ -1657,7 +1657,7 @@ export const secretApprovalRequestServiceFactory = ({
|
|||||||
return { ...doc, commits: approvalCommits };
|
return { ...doc, commits: approvalCommits };
|
||||||
});
|
});
|
||||||
|
|
||||||
const user = await userDAL.findById(secretApprovalRequest.committerUserId);
|
const user = await userDAL.findById(actorId);
|
||||||
const env = await projectEnvDAL.findOne({ id: policy.envId });
|
const env = await projectEnvDAL.findOne({ id: policy.envId });
|
||||||
|
|
||||||
await triggerWorkflowIntegrationNotification({
|
await triggerWorkflowIntegrationNotification({
|
||||||
|
@ -338,8 +338,14 @@ export const SecretApprovalRequest = () => {
|
|||||||
</div>
|
</div>
|
||||||
<span className="text-xs leading-3 text-gray-500">
|
<span className="text-xs leading-3 text-gray-500">
|
||||||
Opened {formatDistance(new Date(createdAt), new Date())} ago by{" "}
|
Opened {formatDistance(new Date(createdAt), new Date())} ago by{" "}
|
||||||
{committerUser?.firstName || ""} {committerUser?.lastName || ""} (
|
{committerUser ? (
|
||||||
{committerUser?.email})
|
<>
|
||||||
|
{committerUser?.firstName || ""} {committerUser?.lastName || ""} (
|
||||||
|
{committerUser?.email})
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<span className="text-gray-600">Deleted User</span>
|
||||||
|
)}
|
||||||
{!isReviewed && status === "open" && " - Review required"}
|
{!isReviewed && status === "open" && " - Review required"}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -250,10 +250,17 @@ export const SecretApprovalRequestChanges = ({
|
|||||||
secretApprovalRequestDetails.isReplicated
|
secretApprovalRequestDetails.isReplicated
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<span className="-mt-1 flex items-center space-x-2 text-xs text-gray-400">
|
<p className="-mt-1 text-xs text-gray-400">
|
||||||
By {secretApprovalRequestDetails?.committerUser?.firstName} (
|
By{" "}
|
||||||
{secretApprovalRequestDetails?.committerUser?.email})
|
{secretApprovalRequestDetails?.committerUser ? (
|
||||||
</span>
|
<>
|
||||||
|
{secretApprovalRequestDetails?.committerUser?.firstName} (
|
||||||
|
{secretApprovalRequestDetails?.committerUser?.email})
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<span className="text-gray-500">Deleted User</span>
|
||||||
|
)}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
{!hasMerged &&
|
{!hasMerged &&
|
||||||
secretApprovalRequestDetails.status === "open" &&
|
secretApprovalRequestDetails.status === "open" &&
|
||||||
|
Reference in New Issue
Block a user