Skip to content

Commit 58d89c5

Browse files
committed
fix: limit autodetected fact to direct dependencies
1 parent 5f4179c commit 58d89c5

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,
@@ -202,17 +205,12 @@ async function buildResponse(
202205
autoDetectedLayers &&
203206
Object.keys(autoDetectedLayers).length > 0
204207
) {
205-
const autoDetectedPackagesWithChildren = mapDepTreeToDockerfilePackages(
206-
autoDetectedPackages,
207-
deps,
208-
);
209-
210208
const autoDetectedUserInstructionsFact: facts.AutoDetectedUserInstructionsFact =
211209
{
212210
type: "autoDetectedUserInstructions",
213211
data: {
214212
dockerfileLayers: autoDetectedLayers,
215-
dockerfilePackages: autoDetectedPackagesWithChildren!,
213+
dockerfilePackages: autoDetectedPackages!,
216214
},
217215
};
218216
additionalFacts.push(autoDetectedUserInstructionsFact);
@@ -350,51 +348,6 @@ function packageSource(depKey: string): string {
350348
return depKey.split("/")[0];
351349
}
352350

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

422-
// Annotates dockerfile-introduced dependencies and sub-dependencies with the
423-
// instruction ID. A dependency is identified as dockerfile-introduced if the
424-
// dependency key or source was found in a dockerfile installation instruction.
425-
function annotateLayerIds(
375+
function annotateWithLayerIds(
426376
deps: { [depName: string]: types.DepTreeDep },
427377
dockerfilePkgs: DockerFilePackages | undefined,
428378
): void {

0 commit comments

Comments
 (0)