diff options
Diffstat (limited to '')
-rw-r--r-- | src/file_op.rs | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/file_op.rs b/src/file_op.rs index 590ab25..31fa091 100644 --- a/src/file_op.rs +++ b/src/file_op.rs @@ -4,6 +4,7 @@ use std::{ io::Write, path::{Component, Path, PathBuf}, }; +use std::io::ErrorKind; use actix_web::{http::header, web, HttpRequest, HttpResponse}; use futures::TryStreamExt; @@ -27,9 +28,13 @@ async fn save_file( return Err(ContextualError::DuplicateFileError); } - let file = std::fs::File::create(&file_path).map_err(|e| { - ContextualError::IoError(format!("Failed to create {}", file_path.display()), e) - })?; + let file = match std::fs::File::create(&file_path) { + Err(err) if err.kind() == ErrorKind::PermissionDenied => Err(ContextualError::InsufficientPermissionsError( + file_path.display().to_string(), + )), + Err(err) => Err(ContextualError::IoError(format!("Failed to create {}", file_path.display()), err)), + Ok(v) => Ok(v) + }?; let (_, written_len) = field .map_err(|x| ContextualError::MultipartError(x.to_string())) @@ -62,9 +67,6 @@ async fn handle_multipart( "cannot upload file to {}, since it's not a directory", &path.display() ))), - Ok(metadata) if metadata.permissions().readonly() => Err( - ContextualError::InsufficientPermissionsError(path.display().to_string()), - ), Ok(_) => Ok(()), }?; @@ -127,11 +129,13 @@ async fn handle_multipart( } } - std::fs::create_dir_all(&absolute_path).map_err(|e| { - ContextualError::IoError(format!("Failed to create {}", user_given_path.display()), e) - })?; - - return Ok(0); + return match std::fs::create_dir_all(&absolute_path) { + Err(err) if err.kind() == ErrorKind::PermissionDenied => Err(ContextualError::InsufficientPermissionsError( + path.display().to_string(), + )), + Err(err) => Err(ContextualError::IoError(format!("Failed to create {}", user_given_path.display()), err)), + Ok(_) => Ok(0), + }; } let filename = field.content_disposition().get_filename().ok_or_else(|| { |