summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLia Lenckowski <lialenck@protonmail.com>2023-10-04 12:59:07 +0200
committermetamuffin <metamuffin@disroot.org>2023-10-04 14:26:52 +0200
commitbcea5ff43869296ade7b8eece91da371f9675771 (patch)
treeddaba8184e2b596653985110e95d50d157d2e4a8
parent03ede96a06262aa1fa647f4d26a1a517c33c2103 (diff)
downloadgnix-bcea5ff43869296ade7b8eece91da371f9675771.tar
gnix-bcea5ff43869296ade7b8eece91da371f9675771.tar.bz2
gnix-bcea5ff43869296ade7b8eece91da371f9675771.tar.zst
path resolution (hopefully without path traversal!)
Signed-off-by: metamuffin <metamuffin@disroot.org>
-rw-r--r--src/error.rs2
-rw-r--r--src/files.rs18
2 files changed, 17 insertions, 3 deletions
diff --git a/src/error.rs b/src/error.rs
index 59f4443..83a1ffa 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -18,6 +18,8 @@ pub enum ServiceError {
BadRange,
#[error("bad utf8")]
BadUtf8(#[from] std::str::Utf8Error),
+ #[error("bad path")]
+ BadPath,
#[error("ohh. i didn't expect that this error can be generated.")]
Other,
}
diff --git a/src/files.rs b/src/files.rs
index 2ba9a9f..68a3807 100644
--- a/src/files.rs
+++ b/src/files.rs
@@ -27,12 +27,24 @@ pub async fn serve_files(
let rpath = req.uri().path();
let mut path = config.root.clone();
+ let mut user_path_depth = 0;
for seg in rpath.split("/") {
let seg = percent_decode_str(seg).decode_utf8()?;
- if seg == "" || seg == ".." {
- continue; // not ideal
+
+ if seg == "" || seg == "." {
+ continue;
+ }
+
+ if seg == ".." {
+ if user_path_depth <= 0 {
+ return Err(ServiceError::BadPath);
+ }
+ path.pop();
+ user_path_depth -= 1;
+ } else {
+ path.push(seg.as_ref());
+ user_path_depth += 1;
}
- path.push(seg.as_ref())
}
if !path.exists() {
return Err(ServiceError::NotFound);