aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/file_op.rs26
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(|| {