Add skipMinimumPackageAge.

This commit is contained in:
Sander Declerck 2025-11-13 15:14:44 +01:00
parent a9a4d76705
commit f64ee3bccf
No known key found for this signature in database
3 changed files with 51 additions and 3 deletions

View file

@ -41,3 +41,7 @@ const defaultMinimumPackageAge = 24;
export function getMinimumPackageAgeHours() { export function getMinimumPackageAgeHours() {
return defaultMinimumPackageAge; return defaultMinimumPackageAge;
} }
export function skipMinimumPackageAge() {
return false;
}

View file

@ -1,3 +1,4 @@
import { skipMinimumPackageAge } from "../../../config/settings.js";
import { isMalwarePackage } from "../../../scanning/audit/index.js"; import { isMalwarePackage } from "../../../scanning/audit/index.js";
import { interceptRequests } from "../interceptorBuilder.js"; import { interceptRequests } from "../interceptorBuilder.js";
import { import {
@ -38,7 +39,7 @@ function buildNpmInterceptor(registry) {
reqContext.blockMalware(packageName, version); reqContext.blockMalware(packageName, version);
} }
if (isPackageInfoUrl(reqContext.targetUrl)) { if (!skipMinimumPackageAge() && isPackageInfoUrl(reqContext.targetUrl)) {
reqContext.modifyRequestHeaders(modifyNpmInfoRequestHeaders); reqContext.modifyRequestHeaders(modifyNpmInfoRequestHeaders);
reqContext.modifyBody(modifyNpmInfoResponse); reqContext.modifyBody(modifyNpmInfoResponse);
} }

View file

@ -1,13 +1,14 @@
import { describe, it, mock } from "node:test"; import { describe, it, mock } from "node:test";
import assert from "node:assert"; import assert from "node:assert";
import { buffer } from "node:stream/consumers";
describe("npmInterceptor minimum package age", async () => { describe("npmInterceptor minimum package age", async () => {
let minimumPackageAgeSettings = 48; let minimumPackageAgeSettings = 48;
let skipMinimumPackageAgeSetting = false;
mock.module("../../../config/settings.js", { mock.module("../../../config/settings.js", {
namedExports: { namedExports: {
getMinimumPackageAgeHours: () => minimumPackageAgeSettings, getMinimumPackageAgeHours: () => minimumPackageAgeSettings,
skipMinimumPackageAge: () => skipMinimumPackageAgeSetting,
}, },
}); });
@ -244,9 +245,51 @@ describe("npmInterceptor minimum package age", async () => {
return modifiedBuffer.toString("utf8"); return modifiedBuffer.toString("utf8");
} }
return buffer; return body;
} }
it("Should not filter packages when skipMinimumPackageAge is enabled", async () => {
minimumPackageAgeSettings = 5;
skipMinimumPackageAgeSetting = true;
const packageUrl = "https://registry.npmjs.org/lodash";
const originalBody = JSON.stringify({
name: "lodash",
["dist-tags"]: {
latest: "3.0.0",
},
versions: {
["1.0.0"]: {},
["2.0.0"]: {},
["3.0.0"]: {},
},
time: {
created: getDate(-365 * 24),
modified: getDate(-3),
["1.0.0"]: getDate(-7),
// cutoff-date here
["2.0.0"]: getDate(-4),
["3.0.0"]: getDate(-3),
},
});
const modifiedBody = await runModifyNpmInfoRequest(
packageUrl,
originalBody
);
const modifiedJson = JSON.parse(modifiedBody);
// All versions should remain unchanged
assert.equal(Object.keys(modifiedJson.versions).length, 3);
assert.ok(Object.keys(modifiedJson.versions).includes("1.0.0"));
assert.ok(Object.keys(modifiedJson.versions).includes("2.0.0"));
assert.ok(Object.keys(modifiedJson.versions).includes("3.0.0"));
// Latest should remain unchanged
assert.equal(modifiedJson["dist-tags"]["latest"], "3.0.0");
});
function getDate(plusHours) { function getDate(plusHours) {
const date = new Date(); const date = new Date();
date.setHours(date.getHours() + plusHours); date.setHours(date.getHours() + plusHours);