mirror of
https://github.com/openai/codex.git
synced 2026-10-20 17:38:45 +00:00
## Why Local `apply_patch` permission checks can treat a macOS system alias and its canonical spelling as different locations, sending writes covered by temporary-directory grants for unnecessary approval. ## What changed - Normalize trusted top-level aliases in local policy roots and patch targets, reusing a prepared matcher for permission requests and patch safety checks. - Share alias normalization with Seatbelt and the macOS executor sandbox while preserving mutable symlinks and missing descendants. - Preserve read-only and deny precedence, protected metadata restrictions, and remote URI matching. Propagate normalization failures from fallible permission checks. ## Testing Add macOS regressions for multi-file patches with missing parent directories through both direct `apply_patch` calls and shell interception, asserting automatic approval and file contents. Add unit coverage for alias restriction precedence, mutable symlink preservation, missing descendants, and remote permission isolation. GitOrigin-RevId: 0822ff951eaab728cb1ad91281745fa1b8809f15
30 lines
1.0 KiB
Rust
30 lines
1.0 KiB
Rust
use crate::AbsolutePathBuf;
|
|
use pretty_assertions::assert_eq;
|
|
|
|
#[cfg(target_os = "macos")]
|
|
#[test]
|
|
fn system_aliases_preserve_mutable_symlinks_and_missing_descendants() -> std::io::Result<()> {
|
|
let directory = tempfile::tempdir_in("/tmp")?;
|
|
let outside = tempfile::tempdir()?;
|
|
let logical = AbsolutePathBuf::from_absolute_path(directory.path())?;
|
|
let physical = logical.canonicalize()?;
|
|
std::os::unix::fs::symlink(outside.path(), logical.join("mutable"))?;
|
|
|
|
for suffix in ["", "missing/child", "mutable", "mutable/missing/child"] {
|
|
assert_eq!(
|
|
logical.join(suffix).normalize_system_aliases()?,
|
|
physical.join(suffix),
|
|
);
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn ordinary_paths_keep_missing_descendants() -> std::io::Result<()> {
|
|
let directory = tempfile::tempdir()?;
|
|
let physical = AbsolutePathBuf::from_absolute_path(directory.path())?.canonicalize()?;
|
|
let missing = physical.join("missing/child");
|
|
assert_eq!(missing.normalize_system_aliases()?, missing);
|
|
Ok(())
|
|
}
|