// @effect-diagnostics nodeBuiltinImport:offimport * as NodeFS from "node:fs";import * as NodeOS from "node:os";import * as NodePath from "node:path";import { it as effectIt } from "@effect/vitest";import * as Effect from "effect/Effect";import { afterAll, assert, describe } from "vite-plus/test";import { symlinksSupported } from "@t3tools/shared/testing/symlinks";import { readWorkflowScript } from "./workflowScriptQuery.ts"; const root = NodePath.join(NodeOS.homedir(), ".claude", "projects", "__wf_script_test__");NodeFS.mkdirSync(root, { recursive: true });const scriptPath = NodePath.join(root, "run.js");NodeFS.writeFileSync(scriptPath, "export const meta = {};\n");const outside = NodePath.join(NodeOS.tmpdir(), "wf-outside.js");NodeFS.writeFileSync(outside, "evil\n");const link = NodePath.join(root, "sneaky.js");// Planted only where the host allows it; the escape test is skipped// otherwise rather than passing vacuously on "not-found".if (symlinksSupported) { NodeFS.rmSync(link, { force: true }); NodeFS.symlinkSync(outside, link); if (!NodeFS.lstatSync(link).isSymbolicLink()) { throw new Error("test setup: sneaky.js must be a symlink"); }} afterAll(() => { NodeFS.rmSync(root, { recursive: true, force: true }); NodeFS.rmSync(outside, { force: true });}); describe("readWorkflowScript containment", () => { effectIt.effect("serves a real script under the projects root", () => Effect.gen(function* () { const result = yield* readWorkflowScript({ scriptPath }); assert.include(result.contents, "export const meta"); assert.equal(result.truncated, false); }), ); effectIt.effect("rejects relative and non-js paths", () => Effect.gen(function* () { const relative = yield* Effect.exit(readWorkflowScript({ scriptPath: "run.js" })); assert.equal(relative._tag, "Failure"); const nonJs = yield* Effect.exit( readWorkflowScript({ scriptPath: scriptPath.replace(".js", ".ts") }), ); assert.equal(nonJs._tag, "Failure"); }), ); effectIt.effect.skipIf(!symlinksSupported)( "rejects paths outside the root and symlink escapes", () => Effect.gen(function* () { const escaped = yield* Effect.exit(readWorkflowScript({ scriptPath: outside })); assert.equal(escaped._tag, "Failure"); // A symlink INSIDE the root pointing outside must fail specifically on // realpath re-containment — a "not-found" would mean the link was // never exercised and the assertion proves nothing. const sneaky = yield* Effect.exit( readWorkflowScript({ scriptPath: link }).pipe( Effect.flip, Effect.map((error) => error.reason), ), ); assert.equal(sneaky._tag, "Success"); if (sneaky._tag === "Success") { assert.equal(sneaky.value, "outside-root"); } }), );});
// @effect-diagnostics nodeBuiltinImport:off
import * as NodeFS from "node:fs";
import * as NodeOS from "node:os";
import * as NodePath from "node:path";
import { it as effectIt } from "@effect/vitest";
import * as Effect from "effect/Effect";
import { afterAll, assert, describe } from "vite-plus/test";
import { symlinksSupported } from "@t3tools/shared/testing/symlinks";
import { readWorkflowScript } from "./workflowScriptQuery.ts";
const root = NodePath.join(NodeOS.homedir(), ".claude", "projects", "__wf_script_test__");
NodeFS.mkdirSync(root, { recursive: true });
const scriptPath = NodePath.join(root, "run.js");
NodeFS.writeFileSync(scriptPath, "export const meta = {};\n");
const outside = NodePath.join(NodeOS.tmpdir(), "wf-outside.js");
NodeFS.writeFileSync(outside, "evil\n");
const link = NodePath.join(root, "sneaky.js");
// Planted only where the host allows it; the escape test is skipped
// otherwise rather than passing vacuously on "not-found".
if (symlinksSupported) {
NodeFS.rmSync(link, { force: true });
NodeFS.symlinkSync(outside, link);
if (!NodeFS.lstatSync(link).isSymbolicLink()) {
throw new Error("test setup: sneaky.js must be a symlink");
}
}
afterAll(() => {
NodeFS.rmSync(root, { recursive: true, force: true });
NodeFS.rmSync(outside, { force: true });
});
describe("readWorkflowScript containment", () => {
effectIt.effect("serves a real script under the projects root", () =>
Effect.gen(function* () {
const result = yield* readWorkflowScript({ scriptPath });
assert.include(result.contents, "export const meta");
assert.equal(result.truncated, false);
}),
);
effectIt.effect("rejects relative and non-js paths", () =>
Effect.gen(function* () {
const relative = yield* Effect.exit(readWorkflowScript({ scriptPath: "run.js" }));
assert.equal(relative._tag, "Failure");
const nonJs = yield* Effect.exit(
readWorkflowScript({ scriptPath: scriptPath.replace(".js", ".ts") }),
);
assert.equal(nonJs._tag, "Failure");
}),
);
effectIt.effect.skipIf(!symlinksSupported)(
"rejects paths outside the root and symlink escapes",
() =>
Effect.gen(function* () {
const escaped = yield* Effect.exit(readWorkflowScript({ scriptPath: outside }));
assert.equal(escaped._tag, "Failure");
// A symlink INSIDE the root pointing outside must fail specifically on
// realpath re-containment — a "not-found" would mean the link was
// never exercised and the assertion proves nothing.
const sneaky = yield* Effect.exit(
readWorkflowScript({ scriptPath: link }).pipe(
Effect.flip,
Effect.map((error) => error.reason),
),
);
assert.equal(sneaky._tag, "Success");
if (sneaky._tag === "Success") {
assert.equal(sneaky.value, "outside-root");
}
}),
);
});