@@ -44,9 +44,8 @@ impl ExecutorFileSystem for LocalFileSystem {
4444 & self ,
4545 path : & AbsolutePathBuf ,
4646 sandbox_policy : Option < & SandboxPolicy > ,
47- sandbox_cwd : Option < & AbsolutePathBuf > ,
4847 ) -> FileSystemResult < Vec < u8 > > {
49- enforce_read_access ( path, sandbox_policy, sandbox_cwd ) ?;
48+ enforce_read_access ( path, sandbox_policy) ?;
5049 self . read_file ( path) . await
5150 }
5251
@@ -59,9 +58,8 @@ impl ExecutorFileSystem for LocalFileSystem {
5958 path : & AbsolutePathBuf ,
6059 contents : Vec < u8 > ,
6160 sandbox_policy : Option < & SandboxPolicy > ,
62- sandbox_cwd : Option < & AbsolutePathBuf > ,
6361 ) -> FileSystemResult < ( ) > {
64- enforce_write_access ( path, sandbox_policy, sandbox_cwd ) ?;
62+ enforce_write_access ( path, sandbox_policy) ?;
6563 self . write_file ( path, contents) . await
6664 }
6765
@@ -83,9 +81,8 @@ impl ExecutorFileSystem for LocalFileSystem {
8381 path : & AbsolutePathBuf ,
8482 create_directory_options : CreateDirectoryOptions ,
8583 sandbox_policy : Option < & SandboxPolicy > ,
86- sandbox_cwd : Option < & AbsolutePathBuf > ,
8784 ) -> FileSystemResult < ( ) > {
88- enforce_write_access ( path, sandbox_policy, sandbox_cwd ) ?;
85+ enforce_write_access ( path, sandbox_policy) ?;
8986 self . create_directory ( path, create_directory_options) . await
9087 }
9188
@@ -103,9 +100,8 @@ impl ExecutorFileSystem for LocalFileSystem {
103100 & self ,
104101 path : & AbsolutePathBuf ,
105102 sandbox_policy : Option < & SandboxPolicy > ,
106- sandbox_cwd : Option < & AbsolutePathBuf > ,
107103 ) -> FileSystemResult < FileMetadata > {
108- enforce_read_access ( path, sandbox_policy, sandbox_cwd ) ?;
104+ enforce_read_access ( path, sandbox_policy) ?;
109105 self . get_metadata ( path) . await
110106 }
111107
@@ -130,9 +126,8 @@ impl ExecutorFileSystem for LocalFileSystem {
130126 & self ,
131127 path : & AbsolutePathBuf ,
132128 sandbox_policy : Option < & SandboxPolicy > ,
133- sandbox_cwd : Option < & AbsolutePathBuf > ,
134129 ) -> FileSystemResult < Vec < ReadDirectoryEntry > > {
135- enforce_read_access ( path, sandbox_policy, sandbox_cwd ) ?;
130+ enforce_read_access ( path, sandbox_policy) ?;
136131 self . read_directory ( path) . await
137132 }
138133
@@ -161,9 +156,8 @@ impl ExecutorFileSystem for LocalFileSystem {
161156 path : & AbsolutePathBuf ,
162157 remove_options : RemoveOptions ,
163158 sandbox_policy : Option < & SandboxPolicy > ,
164- sandbox_cwd : Option < & AbsolutePathBuf > ,
165159 ) -> FileSystemResult < ( ) > {
166- enforce_write_access_preserving_leaf ( path, sandbox_policy, sandbox_cwd ) ?;
160+ enforce_write_access_preserving_leaf ( path, sandbox_policy) ?;
167161 self . remove ( path, remove_options) . await
168162 }
169163
@@ -224,23 +218,20 @@ impl ExecutorFileSystem for LocalFileSystem {
224218 destination_path : & AbsolutePathBuf ,
225219 copy_options : CopyOptions ,
226220 sandbox_policy : Option < & SandboxPolicy > ,
227- sandbox_cwd : Option < & AbsolutePathBuf > ,
228221 ) -> FileSystemResult < ( ) > {
229- enforce_copy_source_read_access ( source_path, sandbox_policy, sandbox_cwd ) ?;
230- enforce_write_access ( destination_path, sandbox_policy, sandbox_cwd ) ?;
222+ enforce_copy_source_read_access ( source_path, sandbox_policy) ?;
223+ enforce_write_access ( destination_path, sandbox_policy) ?;
231224 self . copy ( source_path, destination_path, copy_options) . await
232225 }
233226}
234227
235228fn enforce_read_access (
236229 path : & AbsolutePathBuf ,
237230 sandbox_policy : Option < & SandboxPolicy > ,
238- sandbox_cwd : Option < & AbsolutePathBuf > ,
239231) -> FileSystemResult < ( ) > {
240- enforce_access (
232+ enforce_access_for_current_dir (
241233 path,
242234 sandbox_policy,
243- sandbox_cwd,
244235 FileSystemSandboxPolicy :: can_read_path_with_cwd,
245236 "read" ,
246237 AccessPathMode :: ResolveAll ,
@@ -250,12 +241,10 @@ fn enforce_read_access(
250241fn enforce_write_access (
251242 path : & AbsolutePathBuf ,
252243 sandbox_policy : Option < & SandboxPolicy > ,
253- sandbox_cwd : Option < & AbsolutePathBuf > ,
254244) -> FileSystemResult < ( ) > {
255- enforce_access (
245+ enforce_access_for_current_dir (
256246 path,
257247 sandbox_policy,
258- sandbox_cwd,
259248 FileSystemSandboxPolicy :: can_write_path_with_cwd,
260249 "write" ,
261250 AccessPathMode :: ResolveAll ,
@@ -265,12 +254,10 @@ fn enforce_write_access(
265254fn enforce_write_access_preserving_leaf (
266255 path : & AbsolutePathBuf ,
267256 sandbox_policy : Option < & SandboxPolicy > ,
268- sandbox_cwd : Option < & AbsolutePathBuf > ,
269257) -> FileSystemResult < ( ) > {
270- enforce_access (
258+ enforce_access_for_current_dir (
271259 path,
272260 sandbox_policy,
273- sandbox_cwd,
274261 FileSystemSandboxPolicy :: can_write_path_with_cwd,
275262 "write" ,
276263 AccessPathMode :: PreserveLeaf ,
@@ -280,38 +267,92 @@ fn enforce_write_access_preserving_leaf(
280267fn enforce_copy_source_read_access (
281268 path : & AbsolutePathBuf ,
282269 sandbox_policy : Option < & SandboxPolicy > ,
283- sandbox_cwd : Option < & AbsolutePathBuf > ,
284270) -> FileSystemResult < ( ) > {
285271 let path_mode = match std:: fs:: symlink_metadata ( path. as_path ( ) ) {
286272 Ok ( metadata) if metadata. file_type ( ) . is_symlink ( ) => AccessPathMode :: PreserveLeaf ,
287273 _ => AccessPathMode :: ResolveAll ,
288274 } ;
289- enforce_access (
275+ enforce_access_for_current_dir (
276+ path,
277+ sandbox_policy,
278+ FileSystemSandboxPolicy :: can_read_path_with_cwd,
279+ "read" ,
280+ path_mode,
281+ )
282+ }
283+
284+ #[ cfg( test) ]
285+ fn enforce_read_access_for_cwd (
286+ path : & AbsolutePathBuf ,
287+ sandbox_policy : Option < & SandboxPolicy > ,
288+ sandbox_cwd : & AbsolutePathBuf ,
289+ ) -> FileSystemResult < ( ) > {
290+ enforce_access_for_cwd (
290291 path,
291292 sandbox_policy,
292293 sandbox_cwd,
293294 FileSystemSandboxPolicy :: can_read_path_with_cwd,
294295 "read" ,
296+ AccessPathMode :: ResolveAll ,
297+ )
298+ }
299+
300+ fn enforce_access_for_current_dir (
301+ path : & AbsolutePathBuf ,
302+ sandbox_policy : Option < & SandboxPolicy > ,
303+ is_allowed : fn ( & FileSystemSandboxPolicy , & Path , & Path ) -> bool ,
304+ access_kind : & str ,
305+ path_mode : AccessPathMode ,
306+ ) -> FileSystemResult < ( ) > {
307+ let Some ( sandbox_policy) = sandbox_policy else {
308+ return Ok ( ( ) ) ;
309+ } ;
310+ let cwd = current_sandbox_cwd ( ) ?;
311+ enforce_access (
312+ path,
313+ sandbox_policy,
314+ cwd. as_path ( ) ,
315+ is_allowed,
316+ access_kind,
295317 path_mode,
296318 )
297319}
298320
299- fn enforce_access (
321+ #[ cfg( test) ]
322+ fn enforce_access_for_cwd (
300323 path : & AbsolutePathBuf ,
301324 sandbox_policy : Option < & SandboxPolicy > ,
302- sandbox_cwd : Option < & AbsolutePathBuf > ,
325+ sandbox_cwd : & AbsolutePathBuf ,
303326 is_allowed : fn ( & FileSystemSandboxPolicy , & Path , & Path ) -> bool ,
304327 access_kind : & str ,
305328 path_mode : AccessPathMode ,
306329) -> FileSystemResult < ( ) > {
307330 let Some ( sandbox_policy) = sandbox_policy else {
308331 return Ok ( ( ) ) ;
309332 } ;
310- let cwd = resolve_sandbox_cwd ( sandbox_cwd) ?;
333+ let cwd = resolve_existing_path ( sandbox_cwd. as_path ( ) ) ?;
334+ enforce_access (
335+ path,
336+ sandbox_policy,
337+ cwd. as_path ( ) ,
338+ is_allowed,
339+ access_kind,
340+ path_mode,
341+ )
342+ }
343+
344+ fn enforce_access (
345+ path : & AbsolutePathBuf ,
346+ sandbox_policy : & SandboxPolicy ,
347+ sandbox_cwd : & Path ,
348+ is_allowed : fn ( & FileSystemSandboxPolicy , & Path , & Path ) -> bool ,
349+ access_kind : & str ,
350+ path_mode : AccessPathMode ,
351+ ) -> FileSystemResult < ( ) > {
311352 let resolved_path = resolve_path_for_access_check ( path. as_path ( ) , path_mode) ?;
312353 let file_system_policy =
313354 canonicalize_file_system_policy_paths ( FileSystemSandboxPolicy :: from ( sandbox_policy) ) ?;
314- if is_allowed ( & file_system_policy, resolved_path. as_path ( ) , cwd . as_path ( ) ) {
355+ if is_allowed ( & file_system_policy, resolved_path. as_path ( ) , sandbox_cwd ) {
315356 Ok ( ( ) )
316357 } else {
317358 Err ( io:: Error :: new (
@@ -396,12 +437,9 @@ fn resolve_existing_path(path: &Path) -> io::Result<PathBuf> {
396437 Ok ( resolved)
397438}
398439
399- fn resolve_sandbox_cwd ( sandbox_cwd : Option < & AbsolutePathBuf > ) -> io:: Result < PathBuf > {
400- let cwd = match sandbox_cwd {
401- Some ( cwd) => cwd. to_path_buf ( ) ,
402- None => std:: env:: current_dir ( )
403- . map_err ( |err| io:: Error :: other ( format ! ( "failed to read current dir: {err}" ) ) ) ?,
404- } ;
440+ fn current_sandbox_cwd ( ) -> io:: Result < PathBuf > {
441+ let cwd = std:: env:: current_dir ( )
442+ . map_err ( |err| io:: Error :: other ( format ! ( "failed to read current dir: {err}" ) ) ) ?;
405443 resolve_existing_path ( cwd. as_path ( ) )
406444}
407445
@@ -531,9 +569,9 @@ mod tests {
531569 let other_cwd = absolute_path ( other_dir) ;
532570 let note_path = absolute_path ( note_path) ;
533571
534- enforce_read_access ( & note_path, Some ( & sandbox_policy) , Some ( & sandbox_cwd) ) ?;
572+ enforce_read_access_for_cwd ( & note_path, Some ( & sandbox_policy) , & sandbox_cwd) ?;
535573
536- let error = enforce_read_access ( & note_path, Some ( & sandbox_policy) , Some ( & other_cwd) )
574+ let error = enforce_read_access_for_cwd ( & note_path, Some ( & sandbox_policy) , & other_cwd)
537575 . expect_err ( "read should be rejected outside provided cwd" ) ;
538576 assert_eq ! ( error. kind( ) , io:: ErrorKind :: InvalidInput ) ;
539577 Ok ( ( ) )
0 commit comments