Skip to content

Commit

Permalink
fix(core): Reduce memory usage in credentials risk auditing (n8n-io#7663
Browse files Browse the repository at this point in the history
)
  • Loading branch information
netroy authored Nov 9, 2023
1 parent 5edf722 commit 9fd6319
Showing 1 changed file with 27 additions and 17 deletions.
44 changes: 27 additions & 17 deletions packages/cli/src/audit/risks/credentials.risk.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import type { FindOperator } from 'typeorm';
import { MoreThanOrEqual } from 'typeorm';
import { In, MoreThanOrEqual } from 'typeorm';
import { DateUtils } from 'typeorm/util/DateUtils';
import { Container } from 'typedi';
import * as Db from '@/Db';
import type { IWorkflowBase } from 'n8n-workflow';
import config from '@/config';
import { CREDENTIALS_REPORT } from '@/audit/constants';
import type { WorkflowEntity } from '@db/entities/WorkflowEntity';
import type { Risk } from '@/audit/types';
import { ExecutionRepository } from '@db/repositories';
import type { WorkflowEntity } from '@db/entities/WorkflowEntity';
import {
CredentialsRepository,
ExecutionDataRepository,
ExecutionRepository,
} from '@db/repositories';

async function getAllCredsInUse(workflows: WorkflowEntity[]) {
const credsInAnyUse = new Set<string>();
Expand All @@ -34,36 +37,43 @@ async function getAllCredsInUse(workflows: WorkflowEntity[]) {
}

async function getAllExistingCreds() {
const credentials = await Db.collections.Credentials.find({ select: ['id', 'name'] });
const credentials = await Container.get(CredentialsRepository).find({ select: ['id', 'name'] });

return credentials.map(({ id, name }) => ({ kind: 'credential' as const, id, name }));
}

async function getExecutionsInPastDays(days: number) {
async function getExecutedWorkflowsInPastDays(days: number): Promise<IWorkflowBase[]> {
const date = new Date();

date.setDate(date.getDate() - days);

const utcDate = DateUtils.mixedDateToUtcDatetimeString(date) as string;
const executionIds = await Container.get(ExecutionRepository)
.find({
select: ['id'],
where: {
startedAt: MoreThanOrEqual(DateUtils.mixedDateToUtcDatetimeString(date) as Date),
},
})
.then((executions) => executions.map(({ id }) => id));

return Container.get(ExecutionRepository).findMultipleExecutions(
{
return Container.get(ExecutionDataRepository)
.find({
select: ['workflowData'],
where: {
startedAt: MoreThanOrEqual(utcDate) as unknown as FindOperator<Date>,
executionId: In(executionIds),
},
},
{ includeData: true },
);
})
.then((executionData) => executionData.map(({ workflowData }) => workflowData));
}

/**
* Return IDs of credentials in workflows executed in the past n days.
*/
async function getCredsInRecentlyExecutedWorkflows(days: number) {
const recentExecutions = await getExecutionsInPastDays(days);
const executedWorkflows = await getExecutedWorkflowsInPastDays(days);

return recentExecutions.reduce<Set<string>>((acc, execution) => {
execution.workflowData?.nodes.forEach((node) => {
return executedWorkflows.reduce<Set<string>>((acc, { nodes }) => {
nodes.forEach((node) => {
if (node.credentials) {
Object.values(node.credentials).forEach((c) => {
if (c.id) acc.add(c.id);
Expand Down

0 comments on commit 9fd6319

Please sign in to comment.