@@ -388,6 +388,26 @@ fn merge_file_system_policy_with_additional_permissions(
388388 }
389389}
390390
391+ pub ( crate ) fn effective_file_system_sandbox_policy (
392+ file_system_policy : & FileSystemSandboxPolicy ,
393+ additional_permissions : Option < & PermissionProfile > ,
394+ ) -> FileSystemSandboxPolicy {
395+ let Some ( additional_permissions) = additional_permissions else {
396+ return file_system_policy. clone ( ) ;
397+ } ;
398+
399+ let ( extra_reads, extra_writes) = additional_permission_roots ( additional_permissions) ;
400+ if extra_reads. is_empty ( ) && extra_writes. is_empty ( ) {
401+ file_system_policy. clone ( )
402+ } else {
403+ merge_file_system_policy_with_additional_permissions (
404+ file_system_policy,
405+ extra_reads,
406+ extra_writes,
407+ )
408+ }
409+ }
410+
391411fn merge_read_only_access_with_additional_reads (
392412 read_only_access : & ReadOnlyAccess ,
393413 extra_reads : Vec < AbsolutePathBuf > ,
@@ -587,18 +607,10 @@ impl SandboxManager {
587607 ) ;
588608 let ( effective_file_system_policy, effective_network_policy) =
589609 if let Some ( additional_permissions) = additional_permissions {
590- let ( extra_reads, extra_writes) =
591- additional_permission_roots ( & additional_permissions) ;
592- let file_system_sandbox_policy =
593- if extra_reads. is_empty ( ) && extra_writes. is_empty ( ) {
594- file_system_policy. clone ( )
595- } else {
596- merge_file_system_policy_with_additional_permissions (
597- file_system_policy,
598- extra_reads,
599- extra_writes,
600- )
601- } ;
610+ let file_system_sandbox_policy = effective_file_system_sandbox_policy (
611+ file_system_policy,
612+ Some ( & additional_permissions) ,
613+ ) ;
602614 let network_sandbox_policy =
603615 if merge_network_access ( network_policy. is_enabled ( ) , & additional_permissions) {
604616 NetworkSandboxPolicy :: Enabled
@@ -721,6 +733,7 @@ mod tests {
721733 #[ cfg( target_os = "macos" ) ]
722734 use super :: EffectiveSandboxPermissions ;
723735 use super :: SandboxManager ;
736+ use super :: effective_file_system_sandbox_policy;
724737 #[ cfg( target_os = "macos" ) ]
725738 use super :: intersect_permission_profiles;
726739 use super :: merge_file_system_policy_with_additional_permissions;
@@ -1364,4 +1377,80 @@ mod tests {
13641377 true
13651378 ) ;
13661379 }
1380+
1381+ #[ test]
1382+ fn effective_file_system_sandbox_policy_returns_base_policy_without_additional_permissions ( ) {
1383+ let temp_dir = TempDir :: new ( ) . expect ( "create temp dir" ) ;
1384+ let cwd = AbsolutePathBuf :: from_absolute_path (
1385+ canonicalize ( temp_dir. path ( ) ) . expect ( "canonicalize temp dir" ) ,
1386+ )
1387+ . expect ( "absolute temp dir" ) ;
1388+ let denied_path = cwd. join ( "denied" ) . expect ( "denied path" ) ;
1389+ let base_policy = FileSystemSandboxPolicy :: restricted ( vec ! [
1390+ FileSystemSandboxEntry {
1391+ path: FileSystemPath :: Special {
1392+ value: FileSystemSpecialPath :: Root ,
1393+ } ,
1394+ access: FileSystemAccessMode :: Read ,
1395+ } ,
1396+ FileSystemSandboxEntry {
1397+ path: FileSystemPath :: Path { path: denied_path } ,
1398+ access: FileSystemAccessMode :: None ,
1399+ } ,
1400+ ] ) ;
1401+
1402+ let effective_policy = effective_file_system_sandbox_policy ( & base_policy, None ) ;
1403+
1404+ assert_eq ! ( effective_policy, base_policy) ;
1405+ }
1406+
1407+ #[ test]
1408+ fn effective_file_system_sandbox_policy_merges_additional_write_roots ( ) {
1409+ let temp_dir = TempDir :: new ( ) . expect ( "create temp dir" ) ;
1410+ let cwd = AbsolutePathBuf :: from_absolute_path (
1411+ canonicalize ( temp_dir. path ( ) ) . expect ( "canonicalize temp dir" ) ,
1412+ )
1413+ . expect ( "absolute temp dir" ) ;
1414+ let allowed_path = cwd. join ( "allowed" ) . expect ( "allowed path" ) ;
1415+ let denied_path = cwd. join ( "denied" ) . expect ( "denied path" ) ;
1416+ let base_policy = FileSystemSandboxPolicy :: restricted ( vec ! [
1417+ FileSystemSandboxEntry {
1418+ path: FileSystemPath :: Special {
1419+ value: FileSystemSpecialPath :: Root ,
1420+ } ,
1421+ access: FileSystemAccessMode :: Read ,
1422+ } ,
1423+ FileSystemSandboxEntry {
1424+ path: FileSystemPath :: Path {
1425+ path: denied_path. clone( ) ,
1426+ } ,
1427+ access: FileSystemAccessMode :: None ,
1428+ } ,
1429+ ] ) ;
1430+ let additional_permissions = PermissionProfile {
1431+ file_system : Some ( FileSystemPermissions {
1432+ read : Some ( vec ! [ ] ) ,
1433+ write : Some ( vec ! [ allowed_path. clone( ) ] ) ,
1434+ } ) ,
1435+ ..Default :: default ( )
1436+ } ;
1437+
1438+ let effective_policy =
1439+ effective_file_system_sandbox_policy ( & base_policy, Some ( & additional_permissions) ) ;
1440+
1441+ assert_eq ! (
1442+ effective_policy. entries. contains( & FileSystemSandboxEntry {
1443+ path: FileSystemPath :: Path { path: denied_path } ,
1444+ access: FileSystemAccessMode :: None ,
1445+ } ) ,
1446+ true
1447+ ) ;
1448+ assert_eq ! (
1449+ effective_policy. entries. contains( & FileSystemSandboxEntry {
1450+ path: FileSystemPath :: Path { path: allowed_path } ,
1451+ access: FileSystemAccessMode :: Write ,
1452+ } ) ,
1453+ true
1454+ ) ;
1455+ }
13671456}
0 commit comments