windows-sandbox: pass workspace roots to runner

This commit is contained in:
Michael Bolin
2026-05-27 17:01:49 -07:00
parent 0db49a7e6a
commit bc6a9d2910
34 changed files with 460 additions and 213 deletions
+2
View File
@@ -1045,11 +1045,13 @@ See the Codex keymap documentation for supported actions and examples."
.unwrap_or(false);
if should_check {
let cwd = app.config.cwd.clone();
let workspace_roots = app.config.effective_workspace_roots();
let env_map: std::collections::HashMap<String, String> = std::env::vars().collect();
let tx = app.app_event_tx.clone();
let logs_base_dir = app.config.codex_home.clone();
Self::spawn_world_writable_scan(
cwd,
workspace_roots,
env_map,
logs_base_dir,
startup_permission_profile,
+21 -9
View File
@@ -8,6 +8,12 @@ use super::*;
#[cfg(target_os = "windows")]
use codex_utils_approval_presets::ApprovalPreset;
#[cfg(target_os = "windows")]
pub(super) struct WindowsSetupPermissions {
pub(super) permission_profile: PermissionProfile,
pub(super) workspace_roots: Vec<AbsolutePathBuf>,
}
impl App {
pub(super) async fn rebuild_config_for_cwd(&self, cwd: PathBuf) -> Result<Config> {
let mut overrides = self.harness_overrides.clone();
@@ -45,19 +51,25 @@ impl App {
}
#[cfg(target_os = "windows")]
pub(super) async fn permission_profile_for_windows_setup(
pub(super) async fn windows_setup_permissions(
&self,
preset: &ApprovalPreset,
profile_selection: Option<&PermissionProfileSelection>,
) -> Result<PermissionProfile> {
) -> Result<WindowsSetupPermissions> {
match profile_selection {
Some(selection) => Ok(self
.rebuild_config_for_permission_profile(selection.profile_id.as_str())
.await?
.permissions
.permission_profile()
.clone()),
None => Ok(preset.permission_profile.clone()),
Some(selection) => {
let selected_config = self
.rebuild_config_for_permission_profile(selection.profile_id.as_str())
.await?;
Ok(WindowsSetupPermissions {
permission_profile: selected_config.permissions.permission_profile().clone(),
workspace_roots: selected_config.effective_workspace_roots(),
})
}
None => Ok(WindowsSetupPermissions {
permission_profile: preset.permission_profile.clone(),
workspace_roots: self.config.effective_workspace_roots(),
}),
}
}
+18 -14
View File
@@ -866,11 +866,11 @@ impl App {
} => {
#[cfg(target_os = "windows")]
{
let permission_profile = match self
.permission_profile_for_windows_setup(&preset, profile_selection.as_ref())
let setup_permissions = match self
.windows_setup_permissions(&preset, profile_selection.as_ref())
.await
{
Ok(permission_profile) => permission_profile,
Ok(setup_permissions) => setup_permissions,
Err(err) => {
tracing::warn!(
error = %err,
@@ -882,8 +882,9 @@ impl App {
return Ok(AppRunControl::Continue);
}
};
let permission_profile_cwd = self.config.cwd.clone();
let command_cwd = permission_profile_cwd.clone();
let permission_profile = setup_permissions.permission_profile;
let workspace_roots = setup_permissions.workspace_roots;
let command_cwd = self.config.cwd.clone();
let env_map: std::collections::HashMap<String, String> =
std::env::vars().collect();
let codex_home = self.config.codex_home.clone();
@@ -908,7 +909,7 @@ impl App {
tokio::task::spawn_blocking(move || {
let result = crate::legacy_core::windows_sandbox::run_elevated_setup(
&permission_profile,
permission_profile_cwd.as_path(),
workspace_roots.as_slice(),
command_cwd.as_path(),
&env_map,
codex_home.as_path(),
@@ -975,11 +976,11 @@ impl App {
} => {
#[cfg(target_os = "windows")]
{
let permission_profile = match self
.permission_profile_for_windows_setup(&preset, profile_selection.as_ref())
let setup_permissions = match self
.windows_setup_permissions(&preset, profile_selection.as_ref())
.await
{
Ok(permission_profile) => permission_profile,
Ok(setup_permissions) => setup_permissions,
Err(err) => {
tracing::warn!(
error = %err,
@@ -991,8 +992,9 @@ impl App {
return Ok(AppRunControl::Continue);
}
};
let permission_profile_cwd = self.config.cwd.clone();
let command_cwd = permission_profile_cwd.clone();
let permission_profile = setup_permissions.permission_profile;
let workspace_roots = setup_permissions.workspace_roots;
let command_cwd = self.config.cwd.clone();
let env_map: std::collections::HashMap<String, String> =
std::env::vars().collect();
let codex_home = self.config.codex_home.clone();
@@ -1004,7 +1006,7 @@ impl App {
if let Err(err) =
crate::legacy_core::windows_sandbox::run_legacy_setup_preflight(
&permission_profile,
permission_profile_cwd.as_path(),
workspace_roots.as_slice(),
command_cwd.as_path(),
&env_map,
codex_home.as_path(),
@@ -1042,7 +1044,7 @@ impl App {
));
let permission_profile = self.config.permissions.effective_permission_profile();
let permission_profile_cwd = self.config.cwd.clone();
let workspace_roots = self.config.effective_workspace_roots();
let command_cwd = self.config.cwd.clone();
let env_map: std::collections::HashMap<String, String> =
std::env::vars().collect();
@@ -1053,7 +1055,7 @@ impl App {
let requested_path = PathBuf::from(path);
let event = match crate::legacy_core::grant_read_root_non_elevated(
&permission_profile,
permission_profile_cwd.as_path(),
workspace_roots.as_slice(),
command_cwd.as_path(),
&env_map,
codex_home.as_path(),
@@ -1474,6 +1476,7 @@ impl App {
&& !self.chat_widget.world_writable_warning_hidden();
if should_check {
let cwd = self.config.cwd.clone();
let workspace_roots = self.config.effective_workspace_roots();
let env_map: std::collections::HashMap<String, String> =
std::env::vars().collect();
let tx = self.app_event_tx.clone();
@@ -1482,6 +1485,7 @@ impl App {
self.config.permissions.effective_permission_profile();
Self::spawn_world_writable_scan(
cwd,
workspace_roots,
env_map,
logs_base_dir,
permission_profile,
+3 -2
View File
@@ -16,15 +16,16 @@ impl App {
#[cfg(target_os = "windows")]
pub(super) fn spawn_world_writable_scan(
cwd: AbsolutePathBuf,
workspace_roots: Vec<AbsolutePathBuf>,
env_map: std::collections::HashMap<String, String>,
logs_base_dir: AbsolutePathBuf,
permission_profile: PermissionProfile,
tx: AppEventSender,
) {
let Ok(permissions) =
codex_windows_sandbox::ResolvedWindowsSandboxPermissions::try_from_permission_profile_for_cwd(
codex_windows_sandbox::ResolvedWindowsSandboxPermissions::try_from_permission_profile_for_workspace_roots(
&permission_profile,
cwd.as_path(),
workspace_roots.as_slice(),
)
else {
return;
@@ -14,12 +14,13 @@ impl ChatWidget {
return None;
}
let cwd = self.config.cwd.clone();
let workspace_roots = self.config.effective_workspace_roots();
let env_map: std::collections::HashMap<String, String> = std::env::vars().collect();
let permission_profile = self.config.permissions.effective_permission_profile();
let Ok(permissions) =
codex_windows_sandbox::ResolvedWindowsSandboxPermissions::try_from_permission_profile_for_cwd(
codex_windows_sandbox::ResolvedWindowsSandboxPermissions::try_from_permission_profile_for_workspace_roots(
&permission_profile,
cwd.as_path(),
workspace_roots.as_slice(),
)
else {
return None;