mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-26 17:32:16 +00:00
111 lines
3.0 KiB
TypeScript
111 lines
3.0 KiB
TypeScript
import fs from "node:fs";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
import type { CommandResolution, ExecutableResolution } from "./exec-command-resolution.js";
|
|
|
|
export function makePathEnv(binDir: string): NodeJS.ProcessEnv {
|
|
if (process.platform !== "win32") {
|
|
return { PATH: binDir };
|
|
}
|
|
return { PATH: binDir, PATHEXT: ".EXE;.CMD;.BAT;.COM" };
|
|
}
|
|
|
|
export function makeTempDir(): string {
|
|
return fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-exec-approvals-"));
|
|
}
|
|
|
|
export function makeMockExecutableResolution(params: {
|
|
rawExecutable: string;
|
|
executableName: string;
|
|
resolvedPath?: string;
|
|
resolvedRealPath?: string;
|
|
}): ExecutableResolution {
|
|
return {
|
|
rawExecutable: params.rawExecutable,
|
|
resolvedPath: params.resolvedPath,
|
|
resolvedRealPath: params.resolvedRealPath,
|
|
executableName: params.executableName,
|
|
};
|
|
}
|
|
|
|
export function makeMockCommandResolution(params: {
|
|
execution: ExecutableResolution;
|
|
policy?: ExecutableResolution;
|
|
effectiveArgv?: string[];
|
|
wrapperChain?: string[];
|
|
policyBlocked?: boolean;
|
|
blockedWrapper?: string;
|
|
}): CommandResolution {
|
|
const policy = params.policy ?? params.execution;
|
|
const resolution: CommandResolution = {
|
|
execution: params.execution,
|
|
policy,
|
|
effectiveArgv: params.effectiveArgv,
|
|
wrapperChain: params.wrapperChain,
|
|
policyBlocked: params.policyBlocked,
|
|
blockedWrapper: params.blockedWrapper,
|
|
};
|
|
return Object.defineProperties(resolution, {
|
|
rawExecutable: {
|
|
get: () => params.execution.rawExecutable,
|
|
},
|
|
resolvedPath: {
|
|
get: () => params.execution.resolvedPath,
|
|
},
|
|
resolvedRealPath: {
|
|
get: () => params.execution.resolvedRealPath,
|
|
},
|
|
executableName: {
|
|
get: () => params.execution.executableName,
|
|
},
|
|
policyResolution: {
|
|
get: () => (policy === params.execution ? undefined : policy),
|
|
},
|
|
});
|
|
}
|
|
|
|
export type ShellParserParityFixtureCase = {
|
|
id: string;
|
|
command: string;
|
|
ok: boolean;
|
|
executables: string[];
|
|
};
|
|
|
|
type ShellParserParityFixture = {
|
|
cases: ShellParserParityFixtureCase[];
|
|
};
|
|
|
|
export type WrapperResolutionParityFixtureCase = {
|
|
id: string;
|
|
argv: string[];
|
|
expectedRawExecutable: string | null;
|
|
};
|
|
|
|
type WrapperResolutionParityFixture = {
|
|
cases: WrapperResolutionParityFixtureCase[];
|
|
};
|
|
|
|
export function loadShellParserParityFixtureCases(): ShellParserParityFixtureCase[] {
|
|
const fixturePath = path.join(
|
|
process.cwd(),
|
|
"test",
|
|
"fixtures",
|
|
"exec-allowlist-shell-parser-parity.json",
|
|
);
|
|
const fixture = JSON.parse(fs.readFileSync(fixturePath, "utf8")) as ShellParserParityFixture;
|
|
return fixture.cases;
|
|
}
|
|
|
|
export function loadWrapperResolutionParityFixtureCases(): WrapperResolutionParityFixtureCase[] {
|
|
const fixturePath = path.join(
|
|
process.cwd(),
|
|
"test",
|
|
"fixtures",
|
|
"exec-wrapper-resolution-parity.json",
|
|
);
|
|
const fixture = JSON.parse(
|
|
fs.readFileSync(fixturePath, "utf8"),
|
|
) as WrapperResolutionParityFixture;
|
|
return fixture.cases;
|
|
}
|