mirror of
https://github.com/openai/codex.git
synced 2026-03-05 21:45:28 +03:00
## Why `execpolicy` currently keys `prefix_rule()` matching off the literal first token. That works for rules like `["/usr/bin/git"]`, but it means shared basename rules such as `["git"]` do not help when a caller passes an absolute executable path like `/usr/bin/git`. This PR lays the groundwork for basename-aware matching without changing existing callers yet. It adds typed host-executable metadata and an opt-in resolution path in `codex-execpolicy`, so a follow-up PR can adopt the new behavior in `unix_escalation.rs` and other call sites without having to redesign the policy layer first. ## What Changed - added `host_executable(name = ..., paths = [...])` to the execpolicy parser and validated it with `AbsolutePathBuf` - stored host executable mappings separately from prefix rules inside `Policy` - added `MatchOptions` and opt-in `*_with_options()` APIs that preserve existing behavior by default - implemented exact-first matching with optional basename fallback, gated by `host_executable()` allowlists when present - normalized executable names for cross-platform matching so Windows paths like `git.exe` can satisfy `host_executable(name = "git", ...)` - updated `match` / `not_match` example validation to exercise the host-executable resolution path instead of only raw prefix-rule matching - preserved source locations for deferred example-validation errors so policy load failures still point at the right file and line - surfaced `resolvedProgram` on `RuleMatch` so callers can tell when a basename rule matched an absolute executable path - preserved host executable metadata when requirements policies overlay file-based policies in `core/src/exec_policy.rs` - documented the new rule shape and CLI behavior in `execpolicy/README.md` ## Verification - `cargo test -p codex-execpolicy` - added coverage in `execpolicy/tests/basic.rs` for parsing, precedence, empty allowlists, basename fallback, exact-match precedence, and host-executable-backed `match` / `not_match` examples - added a regression test in `core/src/exec_policy.rs` to verify requirements overlays preserve `host_executable()` metadata - verified `cargo test -p codex-core --lib`, including source-rendering coverage for deferred validation errors
30 lines
737 B
Rust
30 lines
737 B
Rust
use std::path::Path;
|
|
|
|
#[cfg(windows)]
|
|
const WINDOWS_EXECUTABLE_SUFFIXES: [&str; 4] = [".exe", ".cmd", ".bat", ".com"];
|
|
|
|
pub(crate) fn executable_lookup_key(raw: &str) -> String {
|
|
#[cfg(windows)]
|
|
{
|
|
let raw = raw.to_ascii_lowercase();
|
|
for suffix in WINDOWS_EXECUTABLE_SUFFIXES {
|
|
if raw.ends_with(suffix) {
|
|
let stripped_len = raw.len() - suffix.len();
|
|
return raw[..stripped_len].to_string();
|
|
}
|
|
}
|
|
raw
|
|
}
|
|
|
|
#[cfg(not(windows))]
|
|
{
|
|
raw.to_string()
|
|
}
|
|
}
|
|
|
|
pub(crate) fn executable_path_lookup_key(path: &Path) -> Option<String> {
|
|
path.file_name()
|
|
.and_then(|name| name.to_str())
|
|
.map(executable_lookup_key)
|
|
}
|