Can extract only a part of TAR file
This commit is contained in:
parent
2f50690fef
commit
c100d87145
25
src/main.rs
25
src/main.rs
@ -128,6 +128,13 @@ async fn replace_files(args: web::Data<Args>, req: HttpRequest, mut payload: Mul
|
||||
return Err(ErrorUnauthorized("Invalid update token!"));
|
||||
}
|
||||
|
||||
// Get base folder to keep from tar-file
|
||||
let base_uri = match req.headers().get("BaseURI") {
|
||||
None => "/",
|
||||
Some(t) => t.to_str()
|
||||
.map_err(|_| ErrorInternalServerError("Failed to parse base URI to keep!"))?
|
||||
};
|
||||
|
||||
let mut new_files = Vec::new();
|
||||
|
||||
// iterate over multipart stream
|
||||
@ -144,12 +151,19 @@ async fn replace_files(args: web::Data<Args>, req: HttpRequest, mut payload: Mul
|
||||
.map_err(|_| ErrorInternalServerError("Failed to parse TAR archive!"))? {
|
||||
let mut file = entry?;
|
||||
let inner_path = file.header().path()?;
|
||||
let inner_path_str = inner_path.to_string_lossy();
|
||||
|
||||
if inner_path.is_absolute() {
|
||||
return Err(ErrorInternalServerError("Cowardly refusing to unpack absolute file!"));
|
||||
if !inner_path_str.starts_with(base_uri) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if inner_path.is_dir() || inner_path.to_string_lossy().ends_with("/") {
|
||||
let mut inner_path_str = &inner_path_str[base_uri.len()..];
|
||||
if inner_path_str.starts_with("/") {
|
||||
inner_path_str = &inner_path_str[1..];
|
||||
}
|
||||
let inner_path = Path::new(inner_path_str);
|
||||
|
||||
if inner_path.is_dir() || inner_path_str.ends_with("/") || inner_path_str.is_empty() {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -177,7 +191,10 @@ async fn replace_files(args: web::Data<Args>, req: HttpRequest, mut payload: Mul
|
||||
// Apply new files
|
||||
for file in new_files {
|
||||
std::fs::create_dir_all(file.path.parent().unwrap())?;
|
||||
std::fs::write(file.path, file.bytes)?;
|
||||
if let Err(e) = std::fs::write(&file.path, file.bytes) {
|
||||
log::error!("Failed to write new file {:?} : {:?}", file.path, e);
|
||||
return Err(ErrorInternalServerError("Failed to write a file!"));
|
||||
}
|
||||
}
|
||||
|
||||
Ok(HttpResponse::Ok().into())
|
||||
|
Loading…
Reference in New Issue
Block a user