Remove the legacy sandbox policy constructor (#59772)

## What changed

Remove `FileSystemSandboxContext::from_legacy_sandbox_policy` and migrate its test callers to `from_permission_profile`. Construct read-only, disabled, and externally enforced sandbox contexts directly with `PermissionProfile`.

GitOrigin-RevId: e330b89d060061eda106232eab554be5ccd06149
This commit is contained in:
ioanbudea-OAI
2026-11-06 00:37:27 +00:00
committed by copyberry
parent 94ca55a93c
commit c2bd770ca7
10 changed files with 40 additions and 71 deletions
@@ -885,10 +885,10 @@ async fn v2_discovery_cache_reuses_matching_requests_and_isolates_execution_cont
assert_eq!(calls().await, 1);
let restricted = codex_exec_server::DiscoverV2CapabilitiesRequest {
sandbox: Some(
codex_exec_server::FileSystemSandboxContext::from_legacy_sandbox_policy(
codex_protocol::protocol::SandboxPolicy::new_read_only_policy(),
codex_exec_server::FileSystemSandboxContext::from_permission_profile(
codex_protocol::models::PermissionProfile::read_only(),
request.cwd.clone(),
)?,
),
),
..request.clone()
};
@@ -3,7 +3,7 @@
use super::*;
use crate::discover_v2::capability_locations::tests::request;
use crate::discover_v2::capability_locations::tests::write;
use codex_protocol::protocol::SandboxPolicy;
use codex_protocol::models::PermissionProfile;
use codex_utils_path_uri::PathUri;
use pretty_assertions::assert_eq;
@@ -69,10 +69,10 @@ async fn discovery_responses_are_cached_by_sandbox_context() -> anyhow::Result<(
for index in 0..MAX_CACHED_SANDBOX_CONTEXTS {
let sandbox_cwd = cwd.join(&format!("context-{index}"))?;
let sandbox = DiscoverV2CapabilitiesRequest {
sandbox: Some(FileSystemSandboxContext::from_legacy_sandbox_policy(
SandboxPolicy::DangerFullAccess,
sandbox: Some(FileSystemSandboxContext::from_permission_profile(
PermissionProfile::Disabled,
sandbox_cwd,
)?),
)),
..params.clone()
};
let response = manager.get_or_refresh_discovery(sandbox.clone()).await?;
@@ -136,10 +136,10 @@ async fn watch_events_invalidate_discovery_and_no_subscription_disables_caching(
.any(|skill| skill.path == demo_skill && skill.description == "ready")
);
let sandbox_params = DiscoverV2CapabilitiesRequest {
sandbox: Some(crate::FileSystemSandboxContext::from_legacy_sandbox_policy(
codex_protocol::protocol::SandboxPolicy::DangerFullAccess,
sandbox: Some(crate::FileSystemSandboxContext::from_permission_profile(
codex_protocol::models::PermissionProfile::Disabled,
params.cwd.clone(),
)?),
)),
..params.clone()
};
manager.get_or_refresh_discovery(sandbox_params).await?;
@@ -369,8 +369,8 @@ fn map_fs_error(err: io::Error) -> JSONRPCErrorError {
#[cfg(test)]
mod tests {
use codex_protocol::protocol::NetworkAccess;
use codex_protocol::protocol::SandboxPolicy;
use codex_protocol::models::PermissionProfile;
use codex_protocol::permissions::NetworkSandboxPolicy;
use codex_utils_path_uri::PathUri;
use pretty_assertions::assert_eq;
@@ -389,20 +389,16 @@ mod tests {
.expect("runtime paths");
let handler = FileSystemHandler::new(runtime_paths);
let sandbox_cwd = PathUri::from_host_native_path(temp_dir.path()).expect("tempdir URI");
let sandbox_context = |sandbox_policy| {
FileSystemSandboxContext::from_legacy_sandbox_policy(
sandbox_policy,
sandbox_cwd.clone(),
)
.expect("sandbox context")
let sandbox_context = |permissions| {
FileSystemSandboxContext::from_permission_profile(permissions, sandbox_cwd.clone())
};
for (file_name, sandbox_policy) in [
("danger.txt", SandboxPolicy::DangerFullAccess),
for (file_name, permission_profile) in [
("danger.txt", PermissionProfile::Disabled),
(
"external.txt",
SandboxPolicy::ExternalSandbox {
network_access: NetworkAccess::Restricted,
PermissionProfile::External {
network: NetworkSandboxPolicy::Restricted,
},
),
] {
@@ -414,7 +410,7 @@ mod tests {
path: path.clone(),
follow_symlinks: None,
data_base64: STANDARD.encode("ok"),
sandbox: Some(sandbox_context(sandbox_policy.clone())),
sandbox: Some(sandbox_context(permission_profile.clone())),
})
.await
.expect("write file");
@@ -422,7 +418,7 @@ mod tests {
let canonicalized = handler
.canonicalize(FsCanonicalizeParams {
path: path.clone(),
sandbox: Some(sandbox_context(sandbox_policy.clone())),
sandbox: Some(sandbox_context(permission_profile.clone())),
})
.await
.expect("canonicalize file");
@@ -438,7 +434,7 @@ mod tests {
.read_file(FsReadFileParams {
path,
follow_symlinks: None,
sandbox: Some(sandbox_context(sandbox_policy)),
sandbox: Some(sandbox_context(permission_profile)),
})
.await
.expect("read file");
@@ -407,9 +407,10 @@ fn exported_sandbox_denial_keeps_launch_identity_and_separate_exit_outcome() {
let private_file = directory.path().join(PRIVATE_PAYLOAD);
std::fs::write(&private_file, PRIVATE_PAYLOAD).expect("write test file");
let cwd = PathUri::from_host_native_path(directory.path()).expect("cwd URI");
let sandbox = crate::FileSystemSandboxContext::from_legacy_sandbox_policy(
codex_protocol::protocol::SandboxPolicy::new_read_only_policy(), cwd.clone(),
).expect("read-only sandbox");
let sandbox = crate::FileSystemSandboxContext::from_permission_profile(
codex_protocol::models::PermissionProfile::read_only(),
cwd.clone(),
);
for (index, span) in LAUNCH_SPANS.into_iter().enumerate() {
let process_id = format!("{PRIVATE_PAYLOAD}-{index}");
let launch = format!("00-{TRACE_ID}-{span}-00");
@@ -169,10 +169,10 @@ async fn v2_rpc_refreshes_metadata_and_enforces_sandbox() -> anyhow::Result<()>
.contains("cannot enforce split filesystem read restrictions")),
"{error:#}"
);
let mut sandbox = FileSystemSandboxContext::from_legacy_sandbox_policy(
codex_protocol::protocol::SandboxPolicy::new_read_only_policy(),
let mut sandbox = FileSystemSandboxContext::from_permission_profile(
PermissionProfile::read_only(),
cwd.clone(),
)?;
);
sandbox.windows_sandbox_selection =
codex_exec_server::WindowsSandboxSelection::RestrictedToken;
let permitted = DiscoverV2CapabilitiesRequest {
+3 -4
View File
@@ -59,7 +59,6 @@ use codex_protocol::permissions::FileSystemSandboxPolicy;
use codex_protocol::permissions::FileSystemSpecialPath;
#[cfg(unix)]
use codex_protocol::permissions::NetworkSandboxPolicy;
use codex_protocol::protocol::SandboxPolicy;
use codex_utils_path_uri::PathUri;
use pretty_assertions::assert_eq;
use tempfile::TempDir;
@@ -1904,10 +1903,10 @@ async fn assert_remote_windows_sandbox_process_write(
let workspace = TempDir::new()?;
let blocked_file = workspace.path().join("blocked.txt");
let cwd = PathUri::from_host_native_path(workspace.path())?;
let mut sandbox = FileSystemSandboxContext::from_legacy_sandbox_policy(
SandboxPolicy::new_read_only_policy(),
let mut sandbox = FileSystemSandboxContext::from_permission_profile(
codex_protocol::models::PermissionProfile::read_only(),
cwd.clone(),
)?;
);
match expected_sandbox_type {
codex_sandboxing::SandboxType::WindowsRestrictedToken => {
sandbox.windows_sandbox_selection = WindowsSandboxSelection::RestrictedToken;
@@ -30,7 +30,6 @@ use codex_protocol::permissions::FileSystemSandboxEntry;
use codex_protocol::permissions::FileSystemSandboxPolicy;
use codex_protocol::permissions::FileSystemSpecialPath;
use codex_protocol::permissions::NetworkSandboxPolicy;
use codex_protocol::protocol::SandboxPolicy;
use codex_sandboxing::SandboxType;
use codex_utils_path_uri::PathUri;
use codex_windows_sandbox_test_support::WindowsSandboxAccountTestGuard;
@@ -746,8 +745,8 @@ fn process_private_desktops() -> Result<BTreeSet<String>> {
}
fn read_only_sandbox_for_cwd(cwd: std::path::PathBuf) -> Result<FileSystemSandboxContext> {
Ok(FileSystemSandboxContext::from_legacy_sandbox_policy(
SandboxPolicy::new_read_only_policy(),
Ok(FileSystemSandboxContext::from_permission_profile(
PermissionProfile::read_only(),
PathUri::from_host_native_path(cwd)?,
)?)
))
}
+6 -9
View File
@@ -27,7 +27,6 @@ use codex_exec_server::WriteFileOptions;
use codex_protocol::models::PermissionProfile;
use codex_protocol::permissions::FileSystemSandboxPolicy;
use codex_protocol::permissions::NetworkSandboxPolicy;
use codex_protocol::protocol::SandboxPolicy;
use codex_protocol::protocol::SkillScope;
use codex_skills::SkillMetadata;
use codex_utils_absolute_path::AbsolutePathBuf;
@@ -593,11 +592,10 @@ async fn empty_remote_repo_skills_are_reused_until_watch_invalidation() {
// The same executor with different captured permissions must scan again.
let read_only = FileSystemEnvironmentAccessor::new(
&remote,
FileSystemSandboxContext::from_legacy_sandbox_policy(
SandboxPolicy::new_read_only_policy(),
FileSystemSandboxContext::from_permission_profile(
PermissionProfile::read_only(),
PathUri::from_abs_path(&cwd),
)
.unwrap(),
),
);
assert!(
service
@@ -699,11 +697,10 @@ async fn incomplete_project_marker_probe_is_retried_before_loading_parent_skills
calls.denied_marker.lock().unwrap().take();
let read_only = FileSystemEnvironmentAccessor::new(
&remote,
FileSystemSandboxContext::from_legacy_sandbox_policy(
SandboxPolicy::new_read_only_policy(),
FileSystemSandboxContext::from_permission_profile(
PermissionProfile::read_only(),
PathUri::from_abs_path(&cwd),
)
.unwrap(),
),
);
assert!(
service
-23
View File
@@ -9,16 +9,13 @@ use codex_protocol::config_types::WindowsSandboxLevel;
use codex_protocol::config_types::WindowsSandboxProxySettingsMode;
use codex_protocol::models::ManagedFileSystemPermissions;
use codex_protocol::models::PermissionProfile;
use codex_protocol::models::SandboxEnforcement;
use codex_protocol::permissions::FileSystemAccessMode;
use codex_protocol::permissions::FileSystemPath;
use codex_protocol::permissions::FileSystemSandboxEntry;
use codex_protocol::permissions::FileSystemSandboxEntryMissingPathBehavior;
use codex_protocol::permissions::FileSystemSandboxPolicy;
use codex_protocol::permissions::FileSystemSandboxPolicyContext;
use codex_protocol::permissions::FileSystemSpecialPath;
use codex_protocol::permissions::NetworkSandboxPolicy;
use codex_protocol::protocol::SandboxPolicy;
use codex_protocol::sandbox::SandboxOverride;
use codex_utils_path_uri::LegacyAppPathString;
use codex_utils_path_uri::PathUri;
@@ -380,26 +377,6 @@ pub struct FileSystemSandboxContext {
}
impl FileSystemSandboxContext {
pub fn from_legacy_sandbox_policy(
sandbox_policy: SandboxPolicy,
cwd: PathUri,
) -> io::Result<Self> {
// Legacy policy projection materializes native roots, so convert at the receiving-host
// boundary while retaining the URI in the resulting sandbox context.
let native_cwd = cwd.to_abs_path()?;
let file_system_sandbox_policy =
FileSystemSandboxPolicy::from_legacy_sandbox_policy_for_cwd(
&sandbox_policy,
&native_cwd,
);
let permissions = PermissionProfile::from_runtime_permissions_with_enforcement(
SandboxEnforcement::from_legacy_sandbox_policy(&sandbox_policy),
&file_system_sandbox_policy,
NetworkSandboxPolicy::from(&sandbox_policy),
);
Ok(Self::from_permission_profile(permissions, cwd))
}
pub fn from_permission_profile(permissions: PermissionProfile, cwd: PathUri) -> Self {
Self {
permissions,