[pbs-devel] [PATCH proxmox-backup] fix systemd-encoded upid strings in http client

Dominik Csapak d.csapak at proxmox.com
Thu Nov 19 10:02:52 CET 2020


since we systemd-encode parts of the upid string, and those can contain
characters that are invalid in urls (e.g. '\'), we have to percent encode
those

add a 'percent_encode_component' helper, so that we can maybe change
the AsciiSet for all uses at the same time

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
we can also change the http client interface to take a &[&str] instead
a &str for the path, and always percent encode all components,
but for now this should be enough

 src/bin/proxmox-backup-manager.rs     | 2 +-
 src/bin/proxmox_backup_client/task.rs | 2 +-
 src/client/task_log.rs                | 3 ++-
 src/tools.rs                          | 7 ++++++-
 4 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/bin/proxmox-backup-manager.rs b/src/bin/proxmox-backup-manager.rs
index 219476fc..a763d6d6 100644
--- a/src/bin/proxmox-backup-manager.rs
+++ b/src/bin/proxmox-backup-manager.rs
@@ -245,7 +245,7 @@ async fn task_stop(param: Value) -> Result<Value, Error> {
 
     let mut client = connect()?;
 
-    let path = format!("api2/json/nodes/localhost/tasks/{}", upid_str);
+    let path = format!("api2/json/nodes/localhost/tasks/{}", tools::percent_encode_component(upid_str));
     let _ = client.delete(&path, None).await?;
 
     Ok(Value::Null)
diff --git a/src/bin/proxmox_backup_client/task.rs b/src/bin/proxmox_backup_client/task.rs
index 29b2cc00..6f567f22 100644
--- a/src/bin/proxmox_backup_client/task.rs
+++ b/src/bin/proxmox_backup_client/task.rs
@@ -124,7 +124,7 @@ async fn task_stop(param: Value) -> Result<Value, Error> {
 
     let mut client = connect(&repo)?;
 
-    let path = format!("api2/json/nodes/localhost/tasks/{}", upid_str);
+    let path = format!("api2/json/nodes/localhost/tasks/{}", tools::percent_encode_component(upid_str));
     let _ = client.delete(&path, None).await?;
 
     Ok(Value::Null)
diff --git a/src/client/task_log.rs b/src/client/task_log.rs
index 7f16d84d..2e2e4d74 100644
--- a/src/client/task_log.rs
+++ b/src/client/task_log.rs
@@ -2,6 +2,7 @@ use anyhow::{bail, Error};
 use serde_json::json;
 
 use super::HttpClient;
+use crate::tools;
 
 pub async fn display_task_log(
     client: HttpClient,
@@ -9,7 +10,7 @@ pub async fn display_task_log(
     strip_date: bool,
 ) -> Result<(), Error> {
 
-    let path = format!("api2/json/nodes/localhost/tasks/{}/log", upid_str);
+    let path = format!("api2/json/nodes/localhost/tasks/{}/log", tools::percent_encode_component(upid_str));
 
     let mut start = 1;
     let limit = 500;
diff --git a/src/tools.rs b/src/tools.rs
index a9b3378d..08f9d22f 100644
--- a/src/tools.rs
+++ b/src/tools.rs
@@ -12,7 +12,7 @@ use std::path::Path;
 use anyhow::{bail, format_err, Error};
 use serde_json::Value;
 use openssl::hash::{hash, DigestBytes, MessageDigest};
-use percent_encoding::AsciiSet;
+use percent_encoding::{utf8_percent_encode, AsciiSet};
 
 pub use proxmox::tools::fd::Fd;
 
@@ -289,6 +289,11 @@ pub fn extract_cookie(cookie: &str, cookie_name: &str) -> Option<String> {
     None
 }
 
+/// percent encode a url component
+pub fn percent_encode_component(comp: &str) -> String {
+    utf8_percent_encode(comp, percent_encoding::NON_ALPHANUMERIC).to_string()
+}
+
 pub fn join(data: &Vec<String>, sep: char) -> String {
     let mut list = String::new();
 
-- 
2.20.1






More information about the pbs-devel mailing list