Skip to content

Commit de59fd9

Browse files
authored
Merge branch 'main' into fix/zip-decompression-bomb-guard
2 parents 55c0d54 + dd33e5c commit de59fd9

56 files changed

Lines changed: 2370 additions & 1202 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎crates/ov_cli/src/client.rs‎

Lines changed: 41 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use serde::de::DeserializeOwned;
2-
use serde_json::{Map, Value};
2+
use serde_json::{Map, Value, json};
33
use std::env;
44
use std::path::Path;
55

@@ -1004,85 +1004,48 @@ impl HttpClient {
10041004
verbose: bool,
10051005
source_metadata: Option<Value>,
10061006
target_uri: Option<&str>,
1007+
skills: &[String],
1008+
list_only: bool,
10071009
) -> Result<serde_json::Value> {
1008-
let path_obj = Path::new(data);
1009-
1010-
if path_obj.exists() {
1011-
if path_obj.is_dir() {
1012-
let zip_file = if show_progress {
1013-
self.zip_directory_with_progress(path_obj, verbose, None)?
1014-
} else {
1015-
self.zip_directory(path_obj, None)?
1016-
};
1017-
let temp_file_id = if show_progress {
1018-
self.upload_temp_file_with_progress(zip_file.path(), verbose)
1019-
.await?
1020-
} else {
1021-
self.upload_temp_file(zip_file.path()).await?
1022-
};
1023-
1024-
let mut body = serde_json::json!({
1025-
"temp_file_id": temp_file_id,
1026-
"wait": wait,
1027-
});
1028-
if let Some(source_metadata) = source_metadata.clone() {
1029-
body["source_metadata"] = source_metadata;
1030-
}
1031-
if let Some(target_uri) = target_uri {
1032-
body["target_uri"] = serde_json::Value::String(target_uri.to_string());
1033-
}
1034-
let dynamic_timeout =
1035-
TimeoutConfig::for_resource_processing().calculate(zip_file.path())?;
1036-
self.base
1037-
.post_with_timeout("/api/v1/skills", &body, dynamic_timeout)
1038-
.await
1039-
} else if path_obj.is_file() {
1040-
let temp_file_id = if show_progress {
1041-
self.upload_temp_file_with_progress(path_obj, verbose)
1042-
.await?
1010+
let path = Path::new(data);
1011+
let mut body = json!({"wait": wait});
1012+
if !skills.is_empty() {
1013+
body["skills"] = json!(skills);
1014+
}
1015+
if list_only {
1016+
body["list_only"] = json!(true);
1017+
}
1018+
if let Some(target_uri) = target_uri {
1019+
body["target_uri"] = json!(target_uri);
1020+
}
1021+
if let Some(metadata) = source_metadata {
1022+
body["source_metadata"] = metadata;
1023+
} else if path.exists() {
1024+
body["source_metadata"] = json!({"type": "local", "source": data, "path": data});
1025+
}
1026+
if path.is_dir() || path.is_file() {
1027+
let archive = if path.is_dir() {
1028+
Some(if show_progress {
1029+
self.zip_directory_with_progress(path, verbose, None)?
10431030
} else {
1044-
self.upload_temp_file(path_obj).await?
1045-
};
1046-
1047-
let mut body = serde_json::json!({
1048-
"temp_file_id": temp_file_id,
1049-
"wait": wait,
1050-
});
1051-
if let Some(source_metadata) = source_metadata.clone() {
1052-
body["source_metadata"] = source_metadata;
1053-
}
1054-
if let Some(target_uri) = target_uri {
1055-
body["target_uri"] = serde_json::Value::String(target_uri.to_string());
1056-
}
1057-
let dynamic_timeout =
1058-
TimeoutConfig::for_resource_processing().calculate(path_obj)?;
1059-
self.base
1060-
.post_with_timeout("/api/v1/skills", &body, dynamic_timeout)
1061-
.await
1031+
self.zip_directory(path, None)?
1032+
})
10621033
} else {
1063-
let mut body = serde_json::json!({
1064-
"data": data,
1065-
"wait": wait,
1066-
});
1067-
if let Some(source_metadata) = source_metadata.clone() {
1068-
body["source_metadata"] = source_metadata;
1069-
}
1070-
if let Some(target_uri) = target_uri {
1071-
body["target_uri"] = serde_json::Value::String(target_uri.to_string());
1072-
}
1073-
self.post("/api/v1/skills", &body).await
1074-
}
1034+
None
1035+
};
1036+
let upload = archive.as_ref().map(|file| file.path()).unwrap_or(path);
1037+
let id = if show_progress {
1038+
self.upload_temp_file_with_progress(upload, verbose).await?
1039+
} else {
1040+
self.upload_temp_file(upload).await?
1041+
};
1042+
body["temp_file_id"] = json!(id);
1043+
let dynamic_timeout = TimeoutConfig::for_resource_processing().calculate(upload)?;
1044+
self.base
1045+
.post_with_timeout("/api/v1/skills", &body, dynamic_timeout)
1046+
.await
10751047
} else {
1076-
let mut body = serde_json::json!({
1077-
"data": data,
1078-
"wait": wait,
1079-
});
1080-
if let Some(source_metadata) = source_metadata {
1081-
body["source_metadata"] = source_metadata;
1082-
}
1083-
if let Some(target_uri) = target_uri {
1084-
body["target_uri"] = serde_json::Value::String(target_uri.to_string());
1085-
}
1048+
body["data"] = json!(data);
10861049
self.post("/api/v1/skills", &body).await
10871050
}
10881051
}
@@ -2315,8 +2278,7 @@ mod tests {
23152278
assert!(!request.contains("include_mod_time_iso="));
23162279

23172280
let (default_url, default_request_rx) = spawn_request_capture_server().await;
2318-
let default_client =
2319-
HttpClient::new(default_url, None, None, None, None, 5.0, false, None);
2281+
let default_client = HttpClient::new(default_url, None, None, None, None, 5.0, false, None);
23202282
default_client
23212283
.ls(
23222284
"viking://resources",
@@ -2507,8 +2469,7 @@ mod tests {
25072469
assert!(!request.contains("include_mod_time_iso="));
25082470

25092471
let (default_url, default_request_rx) = spawn_request_capture_server().await;
2510-
let default_client =
2511-
HttpClient::new(default_url, None, None, None, None, 5.0, false, None);
2472+
let default_client = HttpClient::new(default_url, None, None, None, None, 5.0, false, None);
25122473
default_client
25132474
.tree(
25142475
"viking://resources",

0 commit comments

Comments
 (0)