mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-16 22:31:38 +00:00
45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
// Detects safe executable names or paths without shell evaluation.
|
|
import fs from "node:fs/promises";
|
|
import path from "node:path";
|
|
import { runCommandWithTimeout } from "../process/exec.js";
|
|
import { resolveUserPath } from "../utils.js";
|
|
import { isSafeExecutableValue } from "./exec-safety.js";
|
|
import { getWindowsSystem32ExePath } from "./windows-install-roots.js";
|
|
|
|
// Binary detection accepts safe executable names or explicit paths and avoids
|
|
// shell evaluation when probing PATH.
|
|
/** Return true when a safe executable name/path can be found on this host. */
|
|
export async function detectBinary(name: string): Promise<boolean> {
|
|
if (!name?.trim()) {
|
|
return false;
|
|
}
|
|
if (!isSafeExecutableValue(name)) {
|
|
return false;
|
|
}
|
|
const resolved = name.startsWith("~") ? resolveUserPath(name) : name;
|
|
if (
|
|
path.isAbsolute(resolved) ||
|
|
resolved.startsWith(".") ||
|
|
resolved.includes("/") ||
|
|
resolved.includes("\\")
|
|
) {
|
|
try {
|
|
await fs.access(resolved);
|
|
return true;
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
const command =
|
|
process.platform === "win32"
|
|
? [getWindowsSystem32ExePath("where.exe"), name]
|
|
: ["/usr/bin/env", "which", name];
|
|
try {
|
|
const result = await runCommandWithTimeout(command, { timeoutMs: 2000 });
|
|
return result.code === 0 && result.stdout.trim().length > 0;
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|