import path from "node:path" ;
import { describe, expect, it } from "vitest" ;
import { isWithinDir, resolveSafeBaseDir } from "./path-safety.js" ;
describe("path-safety" , () => {
it.each([
{ rootDir: "/tmp/demo" , expected: `${path.resolve("/tmp/demo" )}${path.sep}` },
{ rootDir: `/tmp/demo${path.sep}`, expected: `${path.resolve("/tmp/demo" )}${path.sep}` },
{ rootDir: "/tmp/demo/.." , expected: `${path.resolve("/tmp" )}${path.sep}` },
])("resolves safe base dir for %j" , ({ rootDir, expected }) => {
expect(resolveSafeBaseDir(rootDir)).toBe(expected);
});
it.each([
{ rootDir: "/tmp/demo" , targetPath: "/tmp/demo" , expected: true },
{ rootDir: "/tmp/demo" , targetPath: "/tmp/demo/sub/file.txt" , expected: true },
{ rootDir: "/tmp/demo" , targetPath: "/tmp/demo/./nested/../file.txt" , expected: true },
{ rootDir: "/tmp/demo" , targetPath: "/tmp/demo-two/../demo/file.txt" , expected: true },
{ rootDir: "/tmp/demo" , targetPath: "/tmp/demo/../escape.txt" , expected: false },
{ rootDir: "/tmp/demo" , targetPath: "/tmp/demo-sibling/file.txt" , expected: false },
{ rootDir: "/tmp/demo" , targetPath: "/tmp/demo/../../escape.txt" , expected: false },
{ rootDir: "/tmp/demo" , targetPath: "sub/file.txt" , expected: false },
])("checks containment for %j" , ({ rootDir, targetPath, expected }) => {
expect(isWithinDir(rootDir, targetPath)).toBe(expected);
});
});
Messung V0.5 in Prozent C=100 H=100 G=100
¤ Dauer der Verarbeitung: 0.8 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland