UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

90 lines (89 loc) • 3.31 kB
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 };