aboutsummaryrefslogtreecommitdiffstats
path: root/src/file_op.rs
diff options
context:
space:
mode:
authorSven-Hendrik Haase <svenstaro@gmail.com>2024-01-13 00:18:05 +0000
committerGitHub <noreply@github.com>2024-01-13 00:18:05 +0000
commit0b52969aabd0a5810b41265e5a0d39d9f2bf17ab (patch)
treeabd0fab684aa5de73660756a4b61eb19a1043210 /src/file_op.rs
parentMerge pull request #1306 from svenstaro/dependabot/cargo/clap-4.4.14 (diff)
parentIgnore readonly metadata and handle errors instead (diff)
downloadminiserve-0b52969aabd0a5810b41265e5a0d39d9f2bf17ab.tar.gz
miniserve-0b52969aabd0a5810b41265e5a0d39d9f2bf17ab.zip
Merge pull request #1310 from ViRb3/master
Ignore readonly metadata and handle errors instead
Diffstat (limited to 'src/file_op.rs')
-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(|| {