openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
90 lines (89 loc) • 3.31 kB
JavaScript
import { d as resolveSafeBinProfiles, i as normalizeTrustedSafeBinDirs, r as listWritableExplicitTrustedSafeBinDirs, s as normalizeSafeBinName, t as getTrustedSafeBinDirs, u as normalizeSafeBinProfileFixtures } from "./exec-safe-bin-trust-tdUplWO7.mjs";
import { i as resolveSafeBins } from "./exec-approvals-allowlist-C7KHpE0m.mjs";
//#region src/infra/exec-safe-bin-runtime-policy.ts
const INTERPRETER_LIKE_SAFE_BINS = /* @__PURE__ */ new Set([
"ash",
"awk",
"bash",
"busybox",
"bun",
"cmd",
"cmd.exe",
"cscript",
"dash",
"deno",
"fish",
"gawk",
"gsed",
"ksh",
"lua",
"mawk",
"nawk",
"node",
"nodejs",
"perl",
"php",
"powershell",
"powershell.exe",
"pypy",
"pwsh",
"pwsh.exe",
"python",
"python2",
"python3",
"ruby",
"sed",
"sh",
"toybox",
"wscript",
"zsh"
]);
const VERSIONED_INTERPRETER_PATTERN = /^(?:python|ruby|perl|php|node)\d+(?:\.\d+)?$/;
/** Returns true for safeBins that can interpret scripts or execute broad embedded programs. */
function isInterpreterLikeSafeBin(raw) {
const normalized = normalizeSafeBinName(raw);
if (!normalized) return false;
if (INTERPRETER_LIKE_SAFE_BINS.has(normalized)) return true;
return VERSIONED_INTERPRETER_PATTERN.test(normalized);
}
function listInterpreterLikeSafeBins(entries) {
return Array.from(entries).map((entry) => normalizeSafeBinName(entry)).filter((entry) => entry.length > 0 && isInterpreterLikeSafeBin(entry)).toSorted();
}
/** Merges global and local safe-bin profile fixtures, with local definitions winning. */
function resolveMergedSafeBinProfileFixtures(params) {
const global = normalizeSafeBinProfileFixtures(params.global?.safeBinProfiles);
const local = normalizeSafeBinProfileFixtures(params.local?.safeBinProfiles);
if (Object.keys(global).length === 0 && Object.keys(local).length === 0) return;
return {
...global,
...local
};
}
function resolveExecSafeBinRuntimePolicy(params) {
const safeBins = resolveSafeBins(params.local?.safeBins ?? params.global?.safeBins);
const safeBinProfiles = resolveSafeBinProfiles(resolveMergedSafeBinProfileFixtures({
global: params.global,
local: params.local
}));
const unprofiledSafeBins = Array.from(safeBins).filter((entry) => !safeBinProfiles[entry]).toSorted();
const explicitTrustedSafeBinDirs = [...normalizeTrustedSafeBinDirs(params.global?.safeBinTrustedDirs), ...normalizeTrustedSafeBinDirs(params.local?.safeBinTrustedDirs)];
const trustedSafeBinDirs = getTrustedSafeBinDirs({
extraDirs: explicitTrustedSafeBinDirs,
safeBins: Array.from(safeBins)
});
const writableTrustedSafeBinDirs = listWritableExplicitTrustedSafeBinDirs(explicitTrustedSafeBinDirs);
if (params.onWarning) for (const hit of writableTrustedSafeBinDirs) {
const scope = hit.worldWritable ? "world-writable" : "group-writable";
params.onWarning(`exec: safeBinTrustedDirs includes ${scope} directory '${hit.dir}'; remove trust or tighten permissions (for example chmod 755).`);
}
return {
safeBins,
safeBinProfiles,
trustedSafeBinDirs,
unprofiledSafeBins,
unprofiledInterpreterSafeBins: listInterpreterLikeSafeBins(unprofiledSafeBins),
writableTrustedSafeBinDirs
};
}
//#endregion
export { resolveMergedSafeBinProfileFixtures as i, listInterpreterLikeSafeBins as n, resolveExecSafeBinRuntimePolicy as r, isInterpreterLikeSafeBin as t };