1pub mod execpolicy;
42pub mod linux_sandbox;
43pub mod process_hardening;
44pub mod sandboxing;
45pub mod windows_sandbox;
46
47pub use sandboxing::SandboxPolicyExt;
49
50pub use sandboxing::{
56 get_platform_sandbox, FileSystemSandboxPolicy, NetworkSandboxPolicy, SandboxCommand,
57 SandboxExecRequest, SandboxManager, SandboxPolicy, SandboxTransformError, SandboxType,
58 SandboxablePreference,
59};
60pub use process_hardening::pre_main_hardening;
62
63pub use execpolicy::{
65 parse_policy, Decision, NetworkRule, Policy, PrefixRule, RuleMatch, RuleType,
66};
67
68#[allow(unused_imports)]
74pub use linux_sandbox::{
75 create_linux_sandbox_command_args_for_policies, create_pledge_promises_from_policy,
76 execute_with_capsicum, execute_with_pledge, find_system_bwrap_in_path, get_landlock_version,
77 is_landlock_available, system_bwrap_warning, CapsicumLevel, PledgePromises,
78};
79
80#[allow(unused_imports)]
82pub use windows_sandbox::{
83 create_windows_sandbox_args, is_windows_sandbox_available, WindowsSandboxLevel,
84};
85
86#[cfg(test)]
87mod tests {
88 use crate::{get_platform_sandbox, SandboxType};
89
90 #[test]
91 fn test_platform_detection() {
92 #[cfg(target_os = "windows")]
95 let sandbox = get_platform_sandbox(true);
96 #[cfg(not(target_os = "windows"))]
97 let sandbox = get_platform_sandbox(false);
98
99 #[cfg(any(
100 target_os = "linux",
101 target_os = "macos",
102 target_os = "windows",
103 target_os = "freebsd",
104 target_os = "openbsd"
105 ))]
106 {
107 assert!(sandbox.is_some());
108 }
109 #[cfg(not(any(
110 target_os = "linux",
111 target_os = "macos",
112 target_os = "windows",
113 target_os = "freebsd",
114 target_os = "openbsd"
115 )))]
116 {
117 assert!(sandbox.is_none());
118 }
119 }
120
121 #[test]
122 #[cfg(target_os = "macos")]
123 fn test_sandbox_manager_create_request() {
124 use crate::{SandboxCommand, SandboxManager, SandboxPolicy};
125 use std::collections::HashMap;
126 use std::ffi::OsString;
127 use std::path::PathBuf;
128
129 let manager = SandboxManager::new();
130 let command = SandboxCommand {
131 program: OsString::from("ls"),
132 args: vec!["-la".to_string()],
133 cwd: PathBuf::from("/tmp"),
134 env: HashMap::new(),
135 };
136
137 let result = manager.create_exec_request(command, SandboxPolicy::default());
138 assert!(result.is_ok());
139
140 let request = result.unwrap();
141 assert!(!request.command.is_empty());
142 }
143
144 #[test]
145 #[cfg(not(target_os = "macos"))]
146 fn test_sandbox_manager_create_request() {
147 }
149
150 #[test]
151 #[cfg(target_os = "macos")]
152 fn test_readonly_policy() {
153 use crate::{SandboxCommand, SandboxManager, SandboxPolicy};
154 use std::collections::HashMap;
155 use std::ffi::OsString;
156 use std::path::PathBuf;
157
158 let policy = SandboxPolicy::ReadOnly {
159 file_system: crate::FileSystemSandboxPolicy::ReadOnly,
160 network_access: crate::NetworkSandboxPolicy::NoAccess,
161 };
162
163 let manager = SandboxManager::new();
164 let command = SandboxCommand {
165 program: OsString::from("cat"),
166 args: vec!["/etc/passwd".to_string()],
167 cwd: PathBuf::from("/tmp"),
168 env: HashMap::new(),
169 };
170
171 let result = manager.create_exec_request(command, policy);
172 assert!(result.is_ok());
173 }
174
175 #[test]
176 #[cfg(not(target_os = "macos"))]
177 fn test_readonly_policy() {
178 }
180
181 #[test]
182 #[cfg(target_os = "macos")]
183 fn test_workspace_policy() {
184 use crate::{SandboxCommand, SandboxManager, SandboxPolicy};
185 use std::collections::HashMap;
186 use std::ffi::OsString;
187 use std::path::PathBuf;
188
189 let policy = SandboxPolicy::WorkspaceWrite {
190 writable_roots: vec![PathBuf::from("/tmp")],
191 network_access: crate::NetworkSandboxPolicy::Localhost,
192 };
193
194 let manager = SandboxManager::new();
195 let command = SandboxCommand {
196 program: OsString::from("touch"),
197 args: vec!["test.txt".to_string()],
198 cwd: PathBuf::from("/tmp"),
199 env: HashMap::new(),
200 };
201
202 let result = manager.create_exec_request(command, policy);
203 assert!(result.is_ok());
204 }
205
206 #[test]
207 #[cfg(not(target_os = "macos"))]
208 fn test_workspace_policy() {
209 }
211
212 #[test]
213 fn test_sandbox_type_names() {
214 assert_eq!(SandboxType::None.as_metric_tag(), "none");
215 assert_eq!(SandboxType::MacosSeatbelt.as_metric_tag(), "seatbelt");
216 assert_eq!(SandboxType::LinuxSeccomp.as_metric_tag(), "seccomp");
217 assert_eq!(
218 SandboxType::WindowsRestrictedToken.as_metric_tag(),
219 "windows_sandbox"
220 );
221 assert_eq!(SandboxType::FreeBSDCapsicum.as_metric_tag(), "capsicum");
222 assert_eq!(SandboxType::OpenBSDPledge.as_metric_tag(), "pledge");
223 }
224}