mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-07 23:27:35 +00:00
Add audit logs for each resource on batch commits
This commit is contained in:
@@ -557,7 +557,6 @@ export const registerPITRouter = async (server: FastifyZodProvider) => {
|
|||||||
type: EventType.PIT_PROCESS_NEW_COMMIT_RAW,
|
type: EventType.PIT_PROCESS_NEW_COMMIT_RAW,
|
||||||
metadata: {
|
metadata: {
|
||||||
commitId: result.commitId,
|
commitId: result.commitId,
|
||||||
folderChanges: result.folderChanges,
|
|
||||||
approvalId: result.approvalId,
|
approvalId: result.approvalId,
|
||||||
projectId: req.body.projectId,
|
projectId: req.body.projectId,
|
||||||
environment: req.body.environment,
|
environment: req.body.environment,
|
||||||
@@ -567,6 +566,15 @@ export const registerPITRouter = async (server: FastifyZodProvider) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
for await (const event of result.secretMutationEvents) {
|
||||||
|
await server.services.auditLog.createAuditLog({
|
||||||
|
...req.auditLogInfo,
|
||||||
|
orgId: req.permission.orgId,
|
||||||
|
projectId: req.body.projectId,
|
||||||
|
event
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return { message: "success" };
|
return { message: "success" };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1547,8 +1547,9 @@ interface UpdateFolderEvent {
|
|||||||
metadata: {
|
metadata: {
|
||||||
environment: string;
|
environment: string;
|
||||||
folderId: string;
|
folderId: string;
|
||||||
oldFolderName: string;
|
oldFolderName?: string;
|
||||||
newFolderName: string;
|
newFolderName: string;
|
||||||
|
newFolderDescription?: string;
|
||||||
folderPath: string;
|
folderPath: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -3230,11 +3231,6 @@ interface PitProcessNewCommitRawEvent {
|
|||||||
environment: string;
|
environment: string;
|
||||||
secretPath: string;
|
secretPath: string;
|
||||||
message: string;
|
message: string;
|
||||||
folderChanges: {
|
|
||||||
create: string[];
|
|
||||||
update: string[];
|
|
||||||
delete: string[];
|
|
||||||
};
|
|
||||||
approvalId?: string;
|
approvalId?: string;
|
||||||
commitId?: string;
|
commitId?: string;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/* eslint-disable no-await-in-loop */
|
/* eslint-disable no-await-in-loop */
|
||||||
import { ForbiddenError } from "@casl/ability";
|
import { ForbiddenError } from "@casl/ability";
|
||||||
|
|
||||||
|
import { Event, EventType } from "@app/ee/services/audit-log/audit-log-types";
|
||||||
import { ProjectPermissionCommitsActions, ProjectPermissionSub } from "@app/ee/services/permission/project-permission";
|
import { ProjectPermissionCommitsActions, ProjectPermissionSub } from "@app/ee/services/permission/project-permission";
|
||||||
import { BadRequestError, NotFoundError } from "@app/lib/errors";
|
import { BadRequestError, NotFoundError } from "@app/lib/errors";
|
||||||
import { logger } from "@app/lib/logger";
|
import { logger } from "@app/lib/logger";
|
||||||
@@ -534,6 +535,7 @@ export const pitServiceFactory = ({
|
|||||||
actor === ActorType.USER
|
actor === ActorType.USER
|
||||||
? await secretApprovalPolicyService.getSecretApprovalPolicy(projectId, environment, secretPath)
|
? await secretApprovalPolicyService.getSecretApprovalPolicy(projectId, environment, secretPath)
|
||||||
: undefined;
|
: undefined;
|
||||||
|
const secretMutationEvents: Event[] = [];
|
||||||
|
|
||||||
const project = await projectDAL.findById(projectId);
|
const project = await projectDAL.findById(projectId);
|
||||||
if (project.enforceCapitalization) {
|
if (project.enforceCapitalization) {
|
||||||
@@ -589,6 +591,20 @@ export const pitServiceFactory = ({
|
|||||||
tx: trx,
|
tx: trx,
|
||||||
commitChanges
|
commitChanges
|
||||||
});
|
});
|
||||||
|
const newFolderEvents = createdFolders.folders.map(
|
||||||
|
(folder) =>
|
||||||
|
({
|
||||||
|
type: EventType.CREATE_FOLDER,
|
||||||
|
metadata: {
|
||||||
|
environment,
|
||||||
|
folderId: folder.id,
|
||||||
|
folderName: folder.name,
|
||||||
|
folderPath: secretPath,
|
||||||
|
...(folder.description ? { description: folder.description } : {})
|
||||||
|
}
|
||||||
|
}) as Event
|
||||||
|
);
|
||||||
|
secretMutationEvents.push(...newFolderEvents);
|
||||||
folderChanges.create.push(...createdFolders.folders.map((folder) => folder.id));
|
folderChanges.create.push(...createdFolders.folders.map((folder) => folder.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -610,6 +626,21 @@ export const pitServiceFactory = ({
|
|||||||
tx: trx,
|
tx: trx,
|
||||||
commitChanges
|
commitChanges
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const updatedFolderEvents = updatedFolders.newFolders.map(
|
||||||
|
(folder) =>
|
||||||
|
({
|
||||||
|
type: EventType.UPDATE_FOLDER,
|
||||||
|
metadata: {
|
||||||
|
environment,
|
||||||
|
folderId: folder.id,
|
||||||
|
folderPath: secretPath,
|
||||||
|
newFolderName: folder.name,
|
||||||
|
newFolderDescription: folder.description
|
||||||
|
}
|
||||||
|
}) as Event
|
||||||
|
);
|
||||||
|
secretMutationEvents.push(...updatedFolderEvents);
|
||||||
folderChanges.update.push(...updatedFolders.newFolders.map((folder) => folder.id));
|
folderChanges.update.push(...updatedFolders.newFolders.map((folder) => folder.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -629,6 +660,19 @@ export const pitServiceFactory = ({
|
|||||||
tx: trx,
|
tx: trx,
|
||||||
commitChanges
|
commitChanges
|
||||||
});
|
});
|
||||||
|
const deletedFolderEvents = deletedFolders.folders.map(
|
||||||
|
(folder) =>
|
||||||
|
({
|
||||||
|
type: EventType.DELETE_FOLDER,
|
||||||
|
metadata: {
|
||||||
|
environment,
|
||||||
|
folderId: folder.id,
|
||||||
|
folderPath: secretPath,
|
||||||
|
folderName: folder.name
|
||||||
|
}
|
||||||
|
}) as Event
|
||||||
|
);
|
||||||
|
secretMutationEvents.push(...deletedFolderEvents);
|
||||||
folderChanges.delete.push(...deletedFolders.folders.map((folder) => folder.id));
|
folderChanges.delete.push(...deletedFolders.folders.map((folder) => folder.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -677,16 +721,18 @@ export const pitServiceFactory = ({
|
|||||||
});
|
});
|
||||||
return {
|
return {
|
||||||
approvalId: approval.id,
|
approvalId: approval.id,
|
||||||
folderChanges
|
folderChanges,
|
||||||
|
secretMutationEvents
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
folderChanges
|
folderChanges,
|
||||||
|
secretMutationEvents
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((changes.secrets?.create?.length ?? 0) > 0) {
|
if ((changes.secrets?.create?.length ?? 0) > 0) {
|
||||||
await secretV2BridgeService.createManySecret({
|
const newSecrets = await secretV2BridgeService.createManySecret({
|
||||||
secretPath,
|
secretPath,
|
||||||
environment,
|
environment,
|
||||||
projectId,
|
projectId,
|
||||||
@@ -698,9 +744,21 @@ export const pitServiceFactory = ({
|
|||||||
tx: trx,
|
tx: trx,
|
||||||
commitChanges
|
commitChanges
|
||||||
});
|
});
|
||||||
|
secretMutationEvents.push({
|
||||||
|
type: EventType.CREATE_SECRETS,
|
||||||
|
metadata: {
|
||||||
|
environment,
|
||||||
|
secretPath,
|
||||||
|
secrets: newSecrets.map((secret) => ({
|
||||||
|
secretId: secret.id,
|
||||||
|
secretKey: secret.secretKey,
|
||||||
|
secretVersion: secret.version
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if ((changes.secrets?.update?.length ?? 0) > 0) {
|
if ((changes.secrets?.update?.length ?? 0) > 0) {
|
||||||
await secretV2BridgeService.updateManySecret({
|
const updatedSecrets = await secretV2BridgeService.updateManySecret({
|
||||||
secretPath,
|
secretPath,
|
||||||
environment,
|
environment,
|
||||||
projectId,
|
projectId,
|
||||||
@@ -713,9 +771,21 @@ export const pitServiceFactory = ({
|
|||||||
tx: trx,
|
tx: trx,
|
||||||
commitChanges
|
commitChanges
|
||||||
});
|
});
|
||||||
|
secretMutationEvents.push({
|
||||||
|
type: EventType.UPDATE_SECRETS,
|
||||||
|
metadata: {
|
||||||
|
environment,
|
||||||
|
secretPath,
|
||||||
|
secrets: updatedSecrets.map((secret) => ({
|
||||||
|
secretId: secret.id,
|
||||||
|
secretKey: secret.secretKey,
|
||||||
|
secretVersion: secret.version
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if ((changes.secrets?.delete?.length ?? 0) > 0) {
|
if ((changes.secrets?.delete?.length ?? 0) > 0) {
|
||||||
await secretV2BridgeService.deleteManySecret({
|
const deletedSecrets = await secretV2BridgeService.deleteManySecret({
|
||||||
secretPath,
|
secretPath,
|
||||||
environment,
|
environment,
|
||||||
projectId,
|
projectId,
|
||||||
@@ -727,6 +797,18 @@ export const pitServiceFactory = ({
|
|||||||
tx: trx,
|
tx: trx,
|
||||||
commitChanges
|
commitChanges
|
||||||
});
|
});
|
||||||
|
secretMutationEvents.push({
|
||||||
|
type: EventType.DELETE_SECRETS,
|
||||||
|
metadata: {
|
||||||
|
environment,
|
||||||
|
secretPath,
|
||||||
|
secrets: deletedSecrets.map((secret) => ({
|
||||||
|
secretId: secret.id,
|
||||||
|
secretKey: secret.secretKey,
|
||||||
|
secretVersion: secret.version
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (commitChanges?.length > 0) {
|
if (commitChanges?.length > 0) {
|
||||||
const commit = await folderCommitService.createCommit(
|
const commit = await folderCommitService.createCommit(
|
||||||
@@ -745,11 +827,13 @@ export const pitServiceFactory = ({
|
|||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
folderChanges,
|
folderChanges,
|
||||||
commitId: commit?.id
|
commitId: commit?.id,
|
||||||
|
secretMutationEvents
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
folderChanges
|
folderChanges,
|
||||||
|
secretMutationEvents
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user