| |
|
|
| use crate::capabilities::SelectedCapabilityRoot; |
| use crate::config_types::ShellEnvironmentPolicy; |
| use crate::config_types::WindowsSandboxLevel; |
| use crate::mcp_policy::EnvironmentMcpPolicy; |
| use crate::models::PermissionProfile; |
| use crate::models::PermissionProfileSnapshot; |
| use crate::protocol::AskForApproval; |
| use codex_execpolicy::RequirementsExecPolicy; |
| use codex_network_proxy::EnvironmentNetworkPolicy; |
| use codex_utils_path_uri::PathUri; |
|
|
| |
| #[allow(clippy::large_enum_variant)] |
| #[derive(Clone, Debug, PartialEq)] |
| pub enum EnvironmentConfigState { |
| |
| FromThread, |
| |
| Pending, |
| |
| Ready(EnvironmentConfig), |
| |
| Failed(String), |
| } |
|
|
| |
| |
| |
| pub fn has_full_access<'a>( |
| approval_policy: AskForApproval, |
| thread_profile: &PermissionProfile, |
| environments: impl IntoIterator<Item = &'a EnvironmentConfigState>, |
| ) -> bool { |
| let mut environments = environments.into_iter().peekable(); |
| approval_policy == AskForApproval::Never |
| && if environments.peek().is_none() { |
| matches!(thread_profile, PermissionProfile::Disabled) |
| } else { |
| environments.all(|environment| match environment { |
| EnvironmentConfigState::FromThread => { |
| matches!(thread_profile, PermissionProfile::Disabled) |
| } |
| EnvironmentConfigState::Ready(config) => { |
| matches!( |
| config.permission_profile.permission_profile(), |
| PermissionProfile::Disabled |
| ) |
| } |
| EnvironmentConfigState::Pending | EnvironmentConfigState::Failed(_) => false, |
| }) |
| } |
| } |
|
|
| |
| #[derive(Clone, PartialEq)] |
| pub struct EnvironmentConfig { |
| |
| pub allow_login_shell: bool, |
| |
| pub workspace_roots: Vec<PathUri>, |
| |
| pub permission_profile: PermissionProfileSnapshot, |
| |
| pub shell_environment_policy: ShellEnvironmentPolicy, |
| |
| pub windows_sandbox_level: WindowsSandboxLevel, |
| |
| pub windows_sandbox_private_desktop: bool, |
| |
| pub use_legacy_landlock: bool, |
| |
| pub exec_policy: Option<RequirementsExecPolicy>, |
| |
| pub mcp_policy: Option<EnvironmentMcpPolicy>, |
| |
| pub network_policy: Option<EnvironmentNetworkPolicy>, |
| |
| pub selected_capability_roots: Vec<SelectedCapabilityRoot>, |
| } |
|
|
| impl std::fmt::Debug for EnvironmentConfig { |
| fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
| formatter |
| .debug_struct("EnvironmentConfig") |
| .field("allow_login_shell", &self.allow_login_shell) |
| .field("workspace_roots", &self.workspace_roots) |
| .field("permission_profile", &self.permission_profile) |
| .field("shell_environment_policy", &"<redacted>") |
| .field("windows_sandbox_level", &self.windows_sandbox_level) |
| .field( |
| "windows_sandbox_private_desktop", |
| &self.windows_sandbox_private_desktop, |
| ) |
| .field("use_legacy_landlock", &self.use_legacy_landlock) |
| .field("exec_policy", &self.exec_policy) |
| .field("mcp_policy", &self.mcp_policy) |
| .field("network_policy", &self.network_policy) |
| .field("selected_capability_roots", &self.selected_capability_roots) |
| .finish() |
| } |
| } |
|
|