From e1516d809f9494db123487a02556ffbf8a27b7ef Mon Sep 17 00:00:00 2001 From: Robin Fackler Date: Fri, 11 Nov 2022 00:00:49 +0100 Subject: [PATCH 1/3] Use "_" instead of ":" in PeerConfig filenames --- libs/hbb_common/src/config.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index 9eb9cd369..492680061 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -1,5 +1,6 @@ use std::{ collections::HashMap, + ffi::{OsStr, OsString}, fs, net::{IpAddr, Ipv4Addr, SocketAddr}, path::{Path, PathBuf}, @@ -848,7 +849,7 @@ impl PeerConfig { } fn path(id: &str) -> PathBuf { - let path: PathBuf = [PEERS, id].iter().collect(); + let path: PathBuf = [PEERS, id.replace(":", "_").as_str()].iter().collect(); Config::with_extension(Config::path(path)) } @@ -870,7 +871,22 @@ impl PeerConfig { .file_stem() .map(|p| p.to_str().unwrap_or("")) .unwrap_or("") + .replace("_", ":") .to_owned(); + + //rename PeerConfig files if they contain ":" + //to stay backward compatible with *nix + let current_filename = p + .file_name() + .unwrap_or(OsStr::new("")) + .to_str() + .unwrap_or(""); + if current_filename.contains(":") { + if let Some(path) = p.parent() { + fs::rename(p, path.join(current_filename.replace(":", "_"))).ok(); + } + } + let c = PeerConfig::load(&id); if c.info.platform.is_empty() { fs::remove_file(&p).ok(); From 29978f1a3eab967d3be9a491b54965167402c104 Mon Sep 17 00:00:00 2001 From: Robin Fackler Date: Wed, 23 Nov 2022 15:07:56 +0100 Subject: [PATCH 2/3] If an ID contains invalid filename characters, encode it using base64 --- libs/hbb_common/src/config.rs | 38 +++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index 492680061..525234e41 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -11,7 +11,9 @@ use std::{ use anyhow::Result; use directories_next::ProjectDirs; use rand::Rng; +use regex::Regex; use serde_derive::{Deserialize, Serialize}; +use sodiumoxide::base64; use sodiumoxide::crypto::sign; use crate::{ @@ -849,7 +851,17 @@ impl PeerConfig { } fn path(id: &str) -> PathBuf { - let path: PathBuf = [PEERS, id.replace(":", "_").as_str()].iter().collect(); + let mut id_encoded: String; + + //If the id contains invalid chars, encode it + let forbidden_paths = Regex::new(r".*[<>:/\\|\?\*].*").unwrap(); + if forbidden_paths.is_match(id) { + id_encoded = + ("base64_".to_string() + base64::encode(id, base64::Variant::Original).as_str()) + } else { + id_encoded = id.to_string(); + } + let path: PathBuf = [PEERS, id_encoded.as_str()].iter().collect(); Config::with_extension(Config::path(path)) } @@ -871,27 +883,23 @@ impl PeerConfig { .file_stem() .map(|p| p.to_str().unwrap_or("")) .unwrap_or("") - .replace("_", ":") .to_owned(); - //rename PeerConfig files if they contain ":" - //to stay backward compatible with *nix - let current_filename = p - .file_name() - .unwrap_or(OsStr::new("")) - .to_str() - .unwrap_or(""); - if current_filename.contains(":") { - if let Some(path) = p.parent() { - fs::rename(p, path.join(current_filename.replace(":", "_"))).ok(); - } + let id_decoded_string: String; + if id.starts_with("base64_") { + let id_decoded = base64::decode(&id[7..], base64::Variant::Original) + .unwrap_or(Vec::new()); + id_decoded_string = + String::from_utf8_lossy(&id_decoded).as_ref().to_owned(); + } else { + id_decoded_string = id; } - let c = PeerConfig::load(&id); + let c = PeerConfig::load(&id_decoded_string); if c.info.platform.is_empty() { fs::remove_file(&p).ok(); } - (id, t, c) + (id_decoded_string, t, c) }) .filter(|p| !p.2.info.platform.is_empty()) .collect(); From f20679f24aa1c04215aaea4e93e77819190bc9ab Mon Sep 17 00:00:00 2001 From: Robin Fackler Date: Wed, 23 Nov 2022 15:29:28 +0100 Subject: [PATCH 3/3] Fix crash if id == "base64_" --- libs/hbb_common/src/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index 8adeae6fe..2f989fd87 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -931,7 +931,7 @@ impl PeerConfig { .to_owned(); let id_decoded_string: String; - if id.starts_with("base64_") { + if id.starts_with("base64_") && id != "base64_" { let id_decoded = base64::decode(&id[7..], base64::Variant::Original) .unwrap_or(Vec::new()); id_decoded_string =