From ee8510cec7fdedf9ae2b7370fc4db070d87c5a88 Mon Sep 17 00:00:00 2001 From: 21pages Date: Sun, 20 Aug 2023 11:24:34 +0800 Subject: [PATCH 1/2] peer_to_map function serde password Signed-off-by: 21pages --- src/flutter_ffi.rs | 2 +- src/ui_interface.rs | 16 +++++----------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index f076b4b23..50f1e33dc 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -895,7 +895,7 @@ pub fn main_load_recent_peers_for_ab(filter: String) -> String { if !config::APP_DIR.read().unwrap().is_empty() { let peers: Vec> = PeerConfig::peers(id_filters) .drain(..) - .map(|(id, _, p)| peer_to_map_ab(id, p)) + .map(|(id, _, p)| peer_to_map(id, p)) .collect(); return serde_json::ser::to_string(&peers).unwrap_or("".to_owned()); } diff --git a/src/ui_interface.rs b/src/ui_interface.rs index 1589a4e2b..7e1b3a9bb 100644 --- a/src/ui_interface.rs +++ b/src/ui_interface.rs @@ -625,6 +625,7 @@ pub fn discover() { #[cfg(feature = "flutter")] pub fn peer_to_map(id: String, p: PeerConfig) -> HashMap<&'static str, String> { + use hbb_common::sodiumoxide::base64; HashMap::<&str, String>::from_iter([ ("id", id), ("username", p.info.username.clone()), @@ -634,20 +635,13 @@ pub fn peer_to_map(id: String, p: PeerConfig) -> HashMap<&'static str, String> { "alias", p.options.get("alias").unwrap_or(&"".to_owned()).to_owned(), ), + ( + "hash", + base64::encode(p.password, base64::Variant::Original), + ), ]) } -#[cfg(feature = "flutter")] -pub fn peer_to_map_ab(id: String, p: PeerConfig) -> HashMap<&'static str, String> { - use hbb_common::sodiumoxide::base64; - let mut m = peer_to_map(id, p.clone()); - m.insert( - "hash", - base64::encode(p.password, base64::Variant::Original), - ); - m -} - #[cfg(feature = "flutter")] pub fn peer_exists(id: &str) -> bool { PeerConfig::exists(id) From 7ec462737b178a0671842be4d23a712682f43333 Mon Sep 17 00:00:00 2001 From: 21pages Date: Sun, 20 Aug 2023 15:49:00 +0800 Subject: [PATCH 2/2] save ab password to recent PeerConfig when connected with it Signed-off-by: 21pages --- src/client.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/client.rs b/src/client.rs index 84f338c63..7b4d052aa 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1074,6 +1074,7 @@ pub struct LoginConfigHandler { pub direct: Option, pub received: bool, switch_uuid: Option, + pub save_ab_password_to_recent: bool, } impl Deref for LoginConfigHandler { @@ -1647,7 +1648,10 @@ impl LoginConfigHandler { log::debug!("remember password of {}", self.id); } } else { - if !password0.is_empty() { + if self.save_ab_password_to_recent { + config.password = password; + log::debug!("save ab password of {} to recent", self.id); + } else if !password0.is_empty() { config.password = Default::default(); log::debug!("remove password of {}", self.id); } @@ -2173,6 +2177,7 @@ pub fn handle_login_error( err: &str, interface: &impl Interface, ) -> bool { + lc.write().unwrap().save_ab_password_to_recent = false; if err == LOGIN_MSG_PASSWORD_EMPTY { lc.write().unwrap().password = Default::default(); interface.msgbox("input-password", "Password Required", "", ""); @@ -2252,7 +2257,11 @@ pub async fn handle_hash( .find_map(|p| if p.id == id { Some(p) } else { None }) { if let Ok(hash) = base64::decode(p.hash.clone(), base64::Variant::Original) { - password = hash; + if !hash.is_empty() { + password = hash; + lc.write().unwrap().save_ab_password_to_recent = true; + lc.write().unwrap().password = password.clone(); + } } } }