src/server/rest.rs: factor our normalize_path()
This commit is contained in:
		| @ -464,31 +464,40 @@ fn check_auth(method: &hyper::Method, ticket: Option<String>, token: Option<Stri | ||||
|     Ok(username) | ||||
| } | ||||
|  | ||||
| pub fn handle_request(api: Arc<ApiConfig>, req: Request<Body>) -> BoxFut { | ||||
|  | ||||
|     let (parts, body) = req.into_parts(); | ||||
|  | ||||
|     let method = parts.method.clone(); | ||||
|     let path = parts.uri.path(); | ||||
|  | ||||
|     // normalize path | ||||
|     // do not allow ".", "..", or hidden files ".XXXX" | ||||
|     // also remove empty path components | ||||
| // normalize path | ||||
| // do not allow ".", "..", or hidden files ".XXXX" | ||||
| // also remove empty path components | ||||
| fn normalize_path(path: &str) -> Result<(String, Vec<&str>), Error> { | ||||
|  | ||||
|     let items = path.split('/'); | ||||
|  | ||||
|     let mut path = String::new(); | ||||
|     let mut components = vec![]; | ||||
|  | ||||
|     for name in items { | ||||
|         if name.is_empty() { continue; } | ||||
|         if name.starts_with(".") { | ||||
|             return Box::new(future::err(http_err!(BAD_REQUEST, "Path contains illegal components.".to_string()))); | ||||
|             bail!("Path contains illegal components."); | ||||
|         } | ||||
|         path.push('/'); | ||||
|         path.push_str(name); | ||||
|         components.push(name); | ||||
|     } | ||||
|  | ||||
|     Ok((path, components)) | ||||
| } | ||||
|  | ||||
| pub fn handle_request(api: Arc<ApiConfig>, req: Request<Body>) -> BoxFut { | ||||
|  | ||||
|     let (parts, body) = req.into_parts(); | ||||
|  | ||||
|     let method = parts.method.clone(); | ||||
|  | ||||
|     let (path, components) = match normalize_path(parts.uri.path()) { | ||||
|         Ok((p,c)) => (p, c), | ||||
|         Err(err) => return Box::new(future::err(http_err!(BAD_REQUEST, err.to_string()))), | ||||
|     }; | ||||
|  | ||||
|     let comp_len = components.len(); | ||||
|  | ||||
|     println!("REQUEST {} {}", method, path); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user