diff --git a/core/indexing/ignore.ts b/core/indexing/ignore.ts index e431e24eed9..1609b0830b3 100644 --- a/core/indexing/ignore.ts +++ b/core/indexing/ignore.ts @@ -243,6 +243,21 @@ export function isSecurityConcern(filePathOrUri: string) { try { filepath = fileURLToPath(filePathOrUri); } catch {} + + const normalized = filepath.replace(/\\/g, "/"); + const isSourceInPrivate = + /(?:^|\/)Source\/[^/]+\/Private\//i.test(normalized) || + /(?:^|\/)Private\/.*?\.(?:cpp|cc|cxx|c|h|hpp|hxx|inl|cs)$/i.test( + normalized, + ); + + if (isSourceInPrivate) { + const basename = path.basename(filepath); + if (!defaultSecurityIgnoreFile.ignores(basename)) { + return false; + } + } + if (path.isAbsolute(filepath)) { const dir = path.dirname(filepath).split(/\/|\\/).at(-1) ?? ""; const basename = path.basename(filepath); diff --git a/core/indexing/ignore.vitest.ts b/core/indexing/ignore.vitest.ts index 565db5efd15..1ac9a712256 100644 --- a/core/indexing/ignore.vitest.ts +++ b/core/indexing/ignore.vitest.ts @@ -151,6 +151,31 @@ describe("isSecurityConcern", () => { expect(isSecurityConcern("styles/main.css")).toBe(false); }); + it("should not flag C++ source files in Unreal Engine and Private directories", () => { + expect( + isSecurityConcern("Source/ExampleModule/Private/ExampleActor.cpp"), + ).toBe(false); + expect( + isSecurityConcern("Source/ExampleModule/Private/ExampleActor.h"), + ).toBe(false); + expect( + isSecurityConcern( + "Source/ExampleModule/Private/Subdir/ExampleActor.cpp", + ), + ).toBe(false); + expect( + isSecurityConcern( + "c:/Users/name/Documents/ExampleProject/Source/ExampleModule/Private/ExampleActor.cpp", + ), + ).toBe(false); + expect(isSecurityConcern("Private/MyActor.cpp")).toBe(false); + expect(isSecurityConcern("Private/MyActor.h")).toBe(false); + expect(isSecurityConcern("Source/ExampleModule/Private/secret.key")).toBe( + true, + ); + expect(isSecurityConcern("Private/.env")).toBe(true); + }); + it("should not flag regular configuration files", () => { expect(isSecurityConcern("package.json")).toBe(false); expect(isSecurityConcern("tsconfig.json")).toBe(false);