fix(security): harden diagnostics storage boundary

This commit is contained in:
2026-09-07 19:52:11 +05:00
parent af9f476658
commit a3445f79c5
12 changed files with 562 additions and 37 deletions
+15 -1
View File
@@ -3,7 +3,7 @@ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { InvalidUtf8Error } from "../src/lib/fs";
import { readPackageValue } from "../src/lib/packageMeta";
import { isMissingPackageMetadataError, readPackageValue } from "../src/lib/packageMeta";
const directories: string[] = [];
@@ -19,6 +19,14 @@ async function packageDir(): Promise<string> {
}
describe("metadata пакета", () => {
test("fallback классифицирует только ENOENT", () => {
expect(isMissingPackageMetadataError(Object.assign(new Error("missing"), { code: "ENOENT" }))).toBe(true);
for (const code of ["EACCES", "EIO", "EISDIR"]) {
expect(isMissingPackageMetadataError(Object.assign(new Error(code), { code }))).toBe(false);
}
expect(isMissingPackageMetadataError(new InvalidUtf8Error("metadata/value", new Error("decode")))).toBe(false);
});
test("отсутствующее необязательное значение использует fallback", async () => {
const directory = await packageDir();
expect(await readPackageValue(directory, "missing", "unknown")).toBe("unknown");
@@ -31,4 +39,10 @@ describe("metadata пакета", () => {
InvalidUtf8Error
);
});
test("каталог вместо metadata-файла не маскируется fallback-значением", async () => {
const directory = await packageDir();
await mkdir(join(directory, "metadata", "package.version"));
await expect(readPackageValue(directory, "package.version", "unknown")).rejects.toBeDefined();
});
});