api3/admin/datastore/upload_catar.rs: verify content type ("application/x-proxmox-backup-catar")
This commit is contained in:
		| @ -7,12 +7,13 @@ use std::sync::Arc; | |||||||
|  |  | ||||||
| use hyper::{Body, Response}; | use hyper::{Body, Response}; | ||||||
| use hyper::rt::Future; | use hyper::rt::Future; | ||||||
|  | use hyper::http::request::Parts; | ||||||
|  |  | ||||||
| pub type BoxFut = Box<Future<Item = Response<Body>, Error = failure::Error> + Send>; | pub type BoxFut = Box<Future<Item = Response<Body>, Error = failure::Error> + Send>; | ||||||
|  |  | ||||||
| type ApiHandlerFn = fn(Value, &ApiMethod) -> Result<Value, Error>; | type ApiHandlerFn = fn(Value, &ApiMethod) -> Result<Value, Error>; | ||||||
|  |  | ||||||
| type ApiUploadHandlerFn = fn(hyper::Body, Value, &ApiUploadMethod) -> Result<BoxFut, Error>; | type ApiUploadHandlerFn = fn(Parts, Body, Value, &ApiUploadMethod) -> Result<BoxFut, Error>; | ||||||
|  |  | ||||||
| pub struct ApiMethod { | pub struct ApiMethod { | ||||||
|     pub parameters: ObjectSchema, |     pub parameters: ObjectSchema, | ||||||
|  | |||||||
| @ -12,8 +12,11 @@ use std::io::Write; | |||||||
| use futures::*; | use futures::*; | ||||||
| use std::path::PathBuf; | use std::path::PathBuf; | ||||||
|  |  | ||||||
|  | use hyper::Body; | ||||||
|  | use hyper::http::request::Parts; | ||||||
|  |  | ||||||
| pub struct UploadCaTar { | pub struct UploadCaTar { | ||||||
|     stream: hyper::Body, |     stream: Body, | ||||||
|     index: ArchiveIndexWriter, |     index: ArchiveIndexWriter, | ||||||
|     count: usize, |     count: usize, | ||||||
| } | } | ||||||
| @ -40,13 +43,20 @@ impl Future for UploadCaTar { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| fn upload_catar(req_body: hyper::Body, param: Value, _info: &ApiUploadMethod) -> Result<BoxFut, Error> { | fn upload_catar(parts: Parts, req_body: Body, param: Value, _info: &ApiUploadMethod) -> Result<BoxFut, Error> { | ||||||
|  |  | ||||||
|     let store = tools::required_string_param(¶m, "name")?; |     let store = tools::required_string_param(¶m, "name")?; | ||||||
|     let archive_name = tools::required_string_param(¶m, "archive_name")?; |     let archive_name = tools::required_string_param(¶m, "archive_name")?; | ||||||
|  |  | ||||||
|     println!("Upload {}.catar to {} ({}.aidx)", archive_name, store, archive_name); |     println!("Upload {}.catar to {} ({}.aidx)", archive_name, store, archive_name); | ||||||
|  |  | ||||||
|  |     let content_type = parts.headers.get(http::header::CONTENT_TYPE) | ||||||
|  |         .ok_or(format_err!("missing content-type header"))?; | ||||||
|  |  | ||||||
|  |     if content_type != "application/x-proxmox-backup-catar" { | ||||||
|  |         bail!("got wrong content-type for catar archive upload"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     let chunk_size = 4*1024*1024; |     let chunk_size = 4*1024*1024; | ||||||
|  |  | ||||||
|     let datastore = DataStore::lookup_datastore(store)?; |     let datastore = DataStore::lookup_datastore(store)?; | ||||||
|  | |||||||
| @ -25,7 +25,7 @@ fn backup_directory(body: Body, store: &str, archive_name: &str) -> Result<(), E | |||||||
|  |  | ||||||
|     let path = format!("api3/json/admin/datastore/{}/upload_catar?archive_name={}", store, archive_name); |     let path = format!("api3/json/admin/datastore/{}/upload_catar?archive_name={}", store, archive_name); | ||||||
|  |  | ||||||
|     client.upload(body, &path)?; |     client.upload("application/x-proxmox-backup-catar", body, &path)?; | ||||||
|  |  | ||||||
|     Ok(()) |     Ok(()) | ||||||
| } | } | ||||||
|  | |||||||
| @ -17,7 +17,7 @@ impl HttpClient { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn upload(&self, body: Body, path: &str) -> Result<(), Error> { |     pub fn upload(&self, content_type: &str, body: Body, path: &str) -> Result<(), Error> { | ||||||
|  |  | ||||||
|         let client = Client::new(); |         let client = Client::new(); | ||||||
|  |  | ||||||
| @ -30,6 +30,7 @@ impl HttpClient { | |||||||
|             .method("POST") |             .method("POST") | ||||||
|             .uri(url) |             .uri(url) | ||||||
|             .header("User-Agent", "proxmox-backup-client/1.0") |             .header("User-Agent", "proxmox-backup-client/1.0") | ||||||
|  |             .header("Content-Type", content_type) | ||||||
|             .body(body)?; |             .body(body)?; | ||||||
|  |  | ||||||
|         let future = client |         let future = client | ||||||
|  | |||||||
| @ -208,7 +208,7 @@ fn handle_upload_api_request( | |||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     match (info.handler)(req_body, params, info) { |     match (info.handler)(parts, req_body, params, info) { | ||||||
|         Ok(future) => future, |         Ok(future) => future, | ||||||
|         Err(err) => { |         Err(err) => { | ||||||
|             let resp = (formatter.format_result)(Err(Error::from(err))); |             let resp = (formatter.format_result)(Err(Error::from(err))); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user