diff options
author | cyqsimon <28627918+cyqsimon@users.noreply.github.com> | 2023-09-05 05:37:18 +0000 |
---|---|---|
committer | cyqsimon <28627918+cyqsimon@users.noreply.github.com> | 2023-09-05 09:06:17 +0000 |
commit | cea3eabae7c369ec658745ba3f8e4328a4de975f (patch) | |
tree | 49911aa57a98b905d8f38f08955fd6627e9955c1 /src/file_upload.rs | |
parent | Make file util functions generic (diff) | |
download | miniserve-cea3eabae7c369ec658745ba3f8e4328a4de975f.tar.gz miniserve-cea3eabae7c369ec658745ba3f8e4328a4de975f.zip |
Rewrite `contains_symlink`
Diffstat (limited to '')
-rw-r--r-- | src/file_upload.rs | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/src/file_upload.rs b/src/file_upload.rs index b9974aa..919ac2c 100644 --- a/src/file_upload.rs +++ b/src/file_upload.rs @@ -110,10 +110,16 @@ async fn handle_multipart( })?; // Ensure there are no illegal symlinks - if !allow_symlinks && contains_symlink(&absolute_path) { - return Err(ContextualError::InsufficientPermissionsError( - user_given_path.display().to_string(), - )); + if !allow_symlinks { + match contains_symlink(&absolute_path) { + Err(err) => Err(ContextualError::InsufficientPermissionsError( + err.to_string(), + ))?, + Ok(true) => Err(ContextualError::InsufficientPermissionsError(format!( + "{user_given_path:?} traverses through a symlink" + )))?, + Ok(false) => (), + } } std::fs::create_dir_all(&absolute_path).map_err(|e| { @@ -135,10 +141,16 @@ async fn handle_multipart( })?; // Ensure there are no illegal symlinks in the file upload path - if !allow_symlinks && contains_symlink(&path) { - return Err(ContextualError::InsufficientPermissionsError( - filename.to_string(), - )); + if !allow_symlinks { + match contains_symlink(&path) { + Err(err) => Err(ContextualError::InsufficientPermissionsError( + err.to_string(), + ))?, + Ok(true) => Err(ContextualError::InsufficientPermissionsError(format!( + "{path:?} traverses through a symlink" + )))?, + Ok(false) => (), + } } save_file(field, path.join(filename_path), overwrite_files).await |