From 2d2d9a5987377ffe2a1750564af51553d3075e83 Mon Sep 17 00:00:00 2001 From: Akhil Mohan Date: Fri, 26 Apr 2024 01:00:42 +0530 Subject: [PATCH] feat(server): added cyclic detector --- .../services/secret-import/secret-import-fns.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/backend/src/services/secret-import/secret-import-fns.ts b/backend/src/services/secret-import/secret-import-fns.ts index df127ef56..28372c280 100644 --- a/backend/src/services/secret-import/secret-import-fns.ts +++ b/backend/src/services/secret-import/secret-import-fns.ts @@ -19,12 +19,14 @@ type TSecretImportSecrets = { }; const LEVEL_BREAK = 10; +const getImportUniqKey = (envSlug: string, path: string) => `${envSlug}=${path}`; export const fnSecretsFromImports = async ({ - allowedImports, + allowedImports: nonCyclicImports, folderDAL, secretDAL, secretImportDAL, - depth = 0 + depth = 0, + cyclicDetector = new Set() }: { allowedImports: (Omit & { importEnv: { id: string; slug: string; name: string }; @@ -33,10 +35,15 @@ export const fnSecretsFromImports = async ({ secretDAL: Pick; secretImportDAL: Pick; depth?: number; + cyclicDetector?: Set; }) => { // avoid going more than a depth if (depth >= LEVEL_BREAK) return []; + const allowedImports = nonCyclicImports.filter( + ({ importPath, importEnv }) => !cyclicDetector.has(getImportUniqKey(importEnv.slug, importPath)) + ); + const importedFolders = ( await folderDAL.findByManySecretPath( allowedImports.map(({ importEnv, importPath }) => ({ @@ -63,6 +70,9 @@ export const fnSecretsFromImports = async ({ const importedSecretsGroupByFolderId = groupBy(importedSecrets, (i) => i.folderId); + allowedImports.forEach(({ importPath, importEnv }) => { + cyclicDetector.add(getImportUniqKey(importEnv.slug, importPath)); + }); // now we need to check recursively deeper imports made inside other imports // we go level wise meaning we take all imports of a tree level and then go deeper ones level by level const deeperImports = await secretImportDAL.findByFolderIds(importedFolderIds); @@ -73,7 +83,8 @@ export const fnSecretsFromImports = async ({ secretImportDAL, folderDAL, secretDAL, - depth: depth + 1 + depth: depth + 1, + cyclicDetector }); } const secretsFromdeeperImportGroupedByFolderId = groupBy(secretsFromDeeperImports, (i) => i.importFolderId);