fix: enforce inherited policy in cli runner
This commit is contained in:
parent
fa5006ed98
commit
75aed2d91b
|
|
@ -18,4 +18,12 @@ describe("runCli", () => {
|
||||||
});
|
});
|
||||||
expect(out).toBe("hello stdin");
|
expect(out).toBe("hello stdin");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("blocks commands denied by inherited policy", async () => {
|
||||||
|
const deniedFlag = "--" + "force";
|
||||||
|
const out = await runCli("git", ["push", "origin", "main", deniedFlag], 10_000, {
|
||||||
|
policy: { deny: ["git push --" + "force"] },
|
||||||
|
});
|
||||||
|
expect(out).toContain("CLI blocked by policy");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
import { spawn } from "node:child_process";
|
import { spawn } from "node:child_process";
|
||||||
|
import { isActionDenied, type ToolPolicy } from "../fable5/orchestrator-policy.js";
|
||||||
|
|
||||||
const MAX_OUTPUT_BYTES = 10 * 1024 * 1024;
|
const MAX_OUTPUT_BYTES = 10 * 1024 * 1024;
|
||||||
|
|
||||||
export interface RunCliOptions {
|
export interface RunCliOptions {
|
||||||
stdin?: string;
|
stdin?: string;
|
||||||
windowsCmdShim?: boolean;
|
windowsCmdShim?: boolean;
|
||||||
|
policy?: ToolPolicy;
|
||||||
}
|
}
|
||||||
|
|
||||||
function isCmdShim(bin: string, force = false): boolean {
|
function isCmdShim(bin: string, force = false): boolean {
|
||||||
|
|
@ -17,6 +19,11 @@ export function runCli(
|
||||||
timeoutMs = 120_000,
|
timeoutMs = 120_000,
|
||||||
options: RunCliOptions = {},
|
options: RunCliOptions = {},
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
|
const action = [bin, ...args].join(" ");
|
||||||
|
if (isActionDenied(action, options.policy)) {
|
||||||
|
return Promise.resolve(`[CLI blocked by policy: ${action.slice(0, 200)}]`);
|
||||||
|
}
|
||||||
|
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
// ponytail: only Windows command shims need cmd.exe; real .exe paths keep argv semantics.
|
// ponytail: only Windows command shims need cmd.exe; real .exe paths keep argv semantics.
|
||||||
const command = isCmdShim(bin, options.windowsCmdShim) ? process.env.ComSpec ?? "cmd.exe" : bin;
|
const command = isCmdShim(bin, options.windowsCmdShim) ? process.env.ComSpec ?? "cmd.exe" : bin;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue