Modif parse_bucket_key to fail when bucket is ""
This commit is contained in:
parent
e1415f5976
commit
6a8b972f3a
1 changed files with 19 additions and 10 deletions
|
@ -72,11 +72,6 @@ async fn handler_inner(garage: Arc<Garage>, req: Request<Body>) -> Result<Respon
|
||||||
let path = percent_encoding::percent_decode_str(&path).decode_utf8()?;
|
let path = percent_encoding::percent_decode_str(&path).decode_utf8()?;
|
||||||
|
|
||||||
let (bucket, key) = parse_bucket_key(&path)?;
|
let (bucket, key) = parse_bucket_key(&path)?;
|
||||||
if bucket.len() == 0 {
|
|
||||||
return Err(Error::Forbidden(format!(
|
|
||||||
"Operations on buckets not allowed"
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
|
|
||||||
let (api_key, content_sha256) = check_signature(&garage, &req).await?;
|
let (api_key, content_sha256) = check_signature(&garage, &req).await?;
|
||||||
let allowed = match req.method() {
|
let allowed = match req.method() {
|
||||||
|
@ -257,17 +252,21 @@ async fn handler_inner(garage: Arc<Garage>, req: Request<Body>) -> Result<Respon
|
||||||
fn parse_bucket_key(path: &str) -> Result<(&str, Option<&str>), Error> {
|
fn parse_bucket_key(path: &str) -> Result<(&str, Option<&str>), Error> {
|
||||||
let path = path.trim_start_matches('/');
|
let path = path.trim_start_matches('/');
|
||||||
|
|
||||||
match path.find('/') {
|
let (bucket, key) = match path.find('/') {
|
||||||
Some(i) => {
|
Some(i) => {
|
||||||
let key = &path[i + 1..];
|
let key = &path[i + 1..];
|
||||||
if key.len() > 0 {
|
if key.len() > 0 {
|
||||||
Ok((&path[..i], Some(key)))
|
(&path[..i], Some(key))
|
||||||
} else {
|
} else {
|
||||||
Ok((&path[..i], None))
|
(&path[..i], None)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None => Ok((path, None)),
|
None => (path, None),
|
||||||
|
};
|
||||||
|
if bucket.len() == 0 {
|
||||||
|
return Err(Error::BadRequest(format!("No bucket specified")));
|
||||||
}
|
}
|
||||||
|
Ok((bucket, key))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -292,4 +291,14 @@ mod tests {
|
||||||
assert!(key.is_none());
|
assert!(key.is_none());
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_bucket_containing_no_bucket() {
|
||||||
|
let parsed = parse_bucket_key("");
|
||||||
|
assert!(parsed.is_err());
|
||||||
|
let parsed = parse_bucket_key("/");
|
||||||
|
assert!(parsed.is_err());
|
||||||
|
let parsed = parse_bucket_key("////");
|
||||||
|
assert!(parsed.is_err());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue