diff options
Diffstat (limited to 'packages/tool-write-file/src/write-file.test.ts')
| -rw-r--r-- | packages/tool-write-file/src/write-file.test.ts | 60 |
1 files changed, 2 insertions, 58 deletions
diff --git a/packages/tool-write-file/src/write-file.test.ts b/packages/tool-write-file/src/write-file.test.ts index cf4fa64..6b316bc 100644 --- a/packages/tool-write-file/src/write-file.test.ts +++ b/packages/tool-write-file/src/write-file.test.ts @@ -3,12 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { createLogger, type ToolExecuteContext } from "@dispatch/kernel"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { - createWriteFileTool, - decideOverwrite, - isPathWithinWorkdir, - validateArgs, -} from "./write-file.js"; +import { createWriteFileTool, decideOverwrite, validateArgs } from "./write-file.js"; function stubCtx(overrides?: Partial<ToolExecuteContext>): ToolExecuteContext { return { @@ -75,24 +70,6 @@ describe("decideOverwrite", () => { }); }); -describe("isPathWithinWorkdir", () => { - it("accepts a path within workdir", () => { - expect(isPathWithinWorkdir("/tmp/workdir/file.txt", "/tmp/workdir")).toBe(true); - }); - - it("accepts the workdir itself", () => { - expect(isPathWithinWorkdir("/tmp/workdir", "/tmp/workdir")).toBe(true); - }); - - it("rejects a path outside workdir", () => { - expect(isPathWithinWorkdir("/tmp/other/file.txt", "/tmp/workdir")).toBe(false); - }); - - it("rejects a prefix attack (workdir prefix but different dir)", () => { - expect(isPathWithinWorkdir("/tmp/workdir-evil/file.txt", "/tmp/workdir")).toBe(false); - }); -}); - describe("validateArgs", () => { it("returns validated args for valid input", () => { const result = validateArgs({ path: "foo.txt", content: "hello" }); @@ -192,23 +169,7 @@ describe("createWriteFileTool", () => { const result = await tool.execute({ path: "no/such/dir/file.txt", content: "data" }, stubCtx()); expect(result.isError).toBe(true); - expect(result.content).toContain("Parent directory"); - }); - - it("rejects a path outside the working directory", async () => { - const tool = createWriteFileTool(workdir); - const result = await tool.execute({ path: "../escape.txt", content: "data" }, stubCtx()); - - expect(result.isError).toBe(true); - expect(result.content).toContain("outside the working directory"); - }); - - it("rejects an absolute path outside workdir", async () => { - const tool = createWriteFileTool(workdir); - const result = await tool.execute({ path: "/tmp/escape.txt", content: "data" }, stubCtx()); - - expect(result.isError).toBe(true); - expect(result.content).toContain("outside the working directory"); + expect(result.content).toContain("Error"); }); it("concurrencySafe is false", () => { @@ -253,23 +214,6 @@ describe("createWriteFileTool", () => { } }); - it("handles symlink escape attempt", async () => { - const outsideDir = await mkdtemp(join(tmpdir(), "outside-")); - try { - const symlinkPath = join(workdir, "link.txt"); - const { symlink } = await import("node:fs/promises"); - await symlink(join(outsideDir, "target.txt"), symlinkPath); - - const tool = createWriteFileTool(workdir); - const result = await tool.execute({ path: "link.txt", content: "escape" }, stubCtx()); - - expect(result.isError).toBe(true); - expect(result.content).toContain("outside the working directory"); - } finally { - await rm(outsideDir, { recursive: true, force: true }); - } - }); - it("writes empty content", async () => { const tool = createWriteFileTool(workdir); const result = await tool.execute({ path: "empty.txt", content: "" }, stubCtx()); |
