Skip to content

Commit 423475f

Browse files
committed
fix: limit autodetected fact to direct dependencies
1 parent 28b0ac7 commit 423475f

2 files changed

Lines changed: 338 additions & 130 deletions

File tree

lib/response-builder.ts

Lines changed: 7 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@ async function buildResponse(
2626
options?: Partial<types.PluginOptions>,
2727
): Promise<types.PluginResponse> {
2828
const deps = depsAnalysis.depTree.dependencies;
29-
const dockerfilePkgs = dockerfileAnalysis?.dockerfilePackages ?? {};
29+
const dockerfilePkgs =
30+
dockerfileAnalysis?.dockerfilePackages ||
31+
depsAnalysis.autoDetectedUserInstructions?.dockerfilePackages ||
32+
{};
3033

3134
/** WARNING! Mutates the depTree.dependencies! */
32-
annotateLayerIds(deps, dockerfilePkgs);
35+
annotateWithLayerIds(deps, dockerfilePkgs);
3336

3437
const finalDeps = excludeBaseImageDeps(
3538
deps,
@@ -195,17 +198,12 @@ async function buildResponse(
195198
autoDetectedLayers &&
196199
Object.keys(autoDetectedLayers).length > 0
197200
) {
198-
const autoDetectedPackagesWithChildren = mapDepTreeToDockerfilePackages(
199-
autoDetectedPackages,
200-
deps,
201-
);
202-
203201
const autoDetectedUserInstructionsFact: facts.AutoDetectedUserInstructionsFact =
204202
{
205203
type: "autoDetectedUserInstructions",
206204
data: {
207205
dockerfileLayers: autoDetectedLayers,
208-
dockerfilePackages: autoDetectedPackagesWithChildren!,
206+
dockerfilePackages: autoDetectedPackages!,
209207
},
210208
};
211209
additionalFacts.push(autoDetectedUserInstructionsFact);
@@ -343,51 +341,6 @@ function packageSource(depKey: string): string {
343341
return depKey.split("/")[0];
344342
}
345343

346-
function collectTransitiveDepKeys(pkg: types.DepTreeDep): string[] {
347-
if (!pkg.dependencies || Object.keys(pkg.dependencies).length === 0) {
348-
return [];
349-
}
350-
const keys = Object.keys(pkg.dependencies);
351-
const nested: string[] = [];
352-
for (const key of keys) {
353-
const childKeys = collectTransitiveDepKeys(pkg.dependencies![key]);
354-
for (const childKey of childKeys) {
355-
nested.push(childKey);
356-
}
357-
}
358-
return keys.concat(nested);
359-
}
360-
361-
// Maps each dependency key (and its transitives) that matches a dockerfile-
362-
// installed package to that package's instruction.
363-
export function mapDepTreeToDockerfilePackages(
364-
dockerfilePkgs: DockerFilePackages,
365-
deps: { [depName: string]: types.DepTreeDep },
366-
): DockerFilePackages {
367-
if (!dockerfilePkgs) {
368-
return {};
369-
}
370-
371-
for (const rootKey of Object.keys(deps)) {
372-
const source = packageSource(rootKey);
373-
const instruction = dockerfilePkgs[rootKey] || dockerfilePkgs[source];
374-
if (!instruction) {
375-
continue;
376-
}
377-
378-
// Ensure the instruction data is stored under the key that matches the
379-
// dependency tree.
380-
dockerfilePkgs[rootKey] = instruction;
381-
382-
const transitiveKeys = collectTransitiveDepKeys(deps[rootKey]);
383-
for (const key of transitiveKeys) {
384-
dockerfilePkgs[key] = instruction;
385-
}
386-
}
387-
388-
return dockerfilePkgs;
389-
}
390-
391344
// If excludeBaseImageVulns is true, only retain dependencies that are
392345
// dockerfile-introduced, as defined by dockerfilePkgs.
393346
function excludeBaseImageDeps(
@@ -412,10 +365,7 @@ function excludeBaseImageDeps(
412365
}, {});
413366
}
414367

415-
// Annotates dockerfile-introduced dependencies and sub-dependencies with the
416-
// instruction ID. A dependency is identified as dockerfile-introduced if the
417-
// dependency key or source was found in a dockerfile installation instruction.
418-
function annotateLayerIds(
368+
function annotateWithLayerIds(
419369
deps: { [depName: string]: types.DepTreeDep },
420370
dockerfilePkgs: DockerFilePackages | undefined,
421371
): void {

0 commit comments

Comments
 (0)