UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

74 lines (73 loc) • 3.41 kB
import { g as resolveExecWrapperTrustPlan } from "./exec-command-resolution-DxYxel2J.mjs"; import { p as hasMutableSymlinkPathComponentSync } from "./system-run-approval-binding-D_QCHpDn.mjs"; import { n as EXEC_AUTO_REVIEW_DISPATCH_IDENTITY_WARNING } from "./exec-auto-review-BrKPsT7Y.mjs"; import fs from "node:fs"; import path from "node:path"; import { sameFileIdentity } from "@openclaw/fs-safe/advanced"; //#region src/infra/system-run-cwd-binding.ts /** Captures and revalidates the directory identity used by exec authorization. */ const APPROVAL_CWD_DRIFT_DENIED_MESSAGE = "SYSTEM_RUN_DENIED: approval cwd changed before execution"; function captureApprovedCwdSnapshotSync(cwd) { const requestedCwd = path.resolve(cwd); let cwdLstat; let cwdStat; let cwdReal; let cwdRealStat; try { cwdLstat = fs.lstatSync(requestedCwd); cwdStat = fs.statSync(requestedCwd); cwdReal = fs.realpathSync(requestedCwd); cwdRealStat = fs.statSync(cwdReal); } catch { return { ok: false, message: "SYSTEM_RUN_DENIED: approval requires an existing canonical cwd" }; } if (!cwdStat.isDirectory()) return { ok: false, message: "SYSTEM_RUN_DENIED: approval requires cwd to be a directory" }; if (hasMutableSymlinkPathComponentSync(requestedCwd) || cwdLstat.isSymbolicLink()) return { ok: false, message: "SYSTEM_RUN_DENIED: approval requires canonical cwd (no symlink path components)" }; if (!sameFileIdentity(cwdStat, cwdLstat) || !sameFileIdentity(cwdStat, cwdRealStat) || !sameFileIdentity(cwdLstat, cwdRealStat)) return { ok: false, message: "SYSTEM_RUN_DENIED: approval cwd identity mismatch" }; return { ok: true, snapshot: { cwd: cwdReal, stat: cwdStat } }; } /** Rechecks the exact directory object immediately before process launch. */ function revalidateApprovedCwdSnapshot(snapshot) { const current = captureApprovedCwdSnapshotSync(snapshot.cwd); return current.ok && sameFileIdentity(snapshot.stat, current.snapshot.stat); } //#endregion //#region src/infra/exec-auto-approval-eligibility.ts /** Original-text review requires proof of every dispatch, not just its policy projection. */ function resolveUnpinnedAutoApprovalEligibility(params) { const ineligible = { eligible: false, reason: EXEC_AUTO_REVIEW_DISPATCH_IDENTITY_WARNING }; if (!params.authorizationPlan?.ok || !params.binding) return ineligible; const candidates = params.authorizationPlan.groups.flatMap((group) => group.candidates); if (candidates.length === 0) return ineligible; for (const candidate of candidates) { if (candidate.transport.kind !== "direct") return ineligible; const segment = candidate.sourceSegment; const trustPlan = resolveExecWrapperTrustPlan(segment.sourceArgv ?? segment.argv, void 0, params.platform); if (segment.resolution?.policyBlocked || !trustPlan.dispatchChain) return ineligible; if (![...trustPlan.dispatchChain.slice(0, -1).map((argv) => argv.slice(0, 1)), segment.argv].every((argv) => params.binding?.operands.some((operand) => operand.executable === true && operand.snapshot.argvIndex === 0 && operand.argv.length === argv.length && operand.argv.every((token, index) => token === argv[index])))) return ineligible; } return { eligible: true }; } //#endregion export { revalidateApprovedCwdSnapshot as i, APPROVAL_CWD_DRIFT_DENIED_MESSAGE as n, captureApprovedCwdSnapshotSync as r, resolveUnpinnedAutoApprovalEligibility as t };