From b5411b686dbf801adbd68542a47d7562b374ccc6 Mon Sep 17 00:00:00 2001 From: 21pages Date: Mon, 21 Aug 2023 08:39:47 +0800 Subject: [PATCH] recent/ab password keep same: sync connected password to addressbook anyway, delete recent password also delete ab password Signed-off-by: 21pages --- flutter/lib/common/widgets/peer_card.dart | 13 ++++++------- flutter/lib/models/ab_model.dart | 12 ++++++++---- flutter/lib/models/model.dart | 11 +++++++++++ src/client.rs | 18 +++++++++++++++--- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/flutter/lib/common/widgets/peer_card.dart b/flutter/lib/common/widgets/peer_card.dart index b5f876d2e..889ba3fbe 100644 --- a/flutter/lib/common/widgets/peer_card.dart +++ b/flutter/lib/common/widgets/peer_card.dart @@ -752,14 +752,13 @@ abstract class BasePeerCard extends StatelessWidget { style: style, ), proc: () async { - if (tab == PeerTabIndex.ab) { - gFFI.abModel.unrememberPassword(id); - await bind.mainForgetPassword(id: id); - gFFI.abModel.pushAb(); - } else { - bind.mainForgetPassword(id: id); - showToast(translate('Successful')); + bool result = gFFI.abModel.changePassword(id, ''); + await bind.mainForgetPassword(id: id); + if (result) { + bool toast = tab == PeerTabIndex.ab; + gFFI.abModel.pushAb(toastIfFail: toast, toastIfSucc: toast); } + showToast(translate('Successful')); }, padding: menuPadding, dismissOnClicked: true, diff --git a/flutter/lib/models/ab_model.dart b/flutter/lib/models/ab_model.dart index 03e08434f..f5e217472 100644 --- a/flutter/lib/models/ab_model.dart +++ b/flutter/lib/models/ab_model.dart @@ -211,12 +211,15 @@ class AbModel { it.first.alias = alias; } - void unrememberPassword(String id) { + bool changePassword(String id, String hash) { final it = peers.where((element) => element.id == id); - if (it.isEmpty) { - return; + if (it.isNotEmpty) { + if (it.first.hash != hash) { + it.first.hash = hash; + return true; + } } - it.first.hash = ''; + return false; } Future pushAb( @@ -225,6 +228,7 @@ class AbModel { bool isRetry = false}) async { debugPrint( "pushAb: toastIfFail:$toastIfFail, toastIfSucc:$toastIfSucc, isRetry:$isRetry"); + if (!gFFI.userModel.isLogin) return false; pushError.value = ''; if (isRetry) retrying.value = true; DateTime startTime = DateTime.now(); diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 4dc17f9c2..6f68524f4 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -241,6 +241,17 @@ class FfiModel with ChangeNotifier { handleReloading(evt); } else if (name == 'plugin_option') { handleOption(evt); + } else if (name == "sync_peer_password_to_ab") { + if (desktopType == DesktopType.main) { + final id = evt['id']; + final password = evt['password']; + if (id != null && password != null) { + if (gFFI.abModel + .changePassword(id.toString(), password.toString())) { + gFFI.abModel.pushAb(toastIfFail: false, toastIfSucc: false); + } + } + } } else { debugPrint('Unknown event name: $name'); } diff --git a/src/client.rs b/src/client.rs index 7b4d052aa..3ac6e8bb6 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1074,7 +1074,7 @@ pub struct LoginConfigHandler { pub direct: Option, pub received: bool, switch_uuid: Option, - pub save_ab_password_to_recent: bool, + pub save_ab_password_to_recent: bool, // true: connected with ab password } impl Deref for LoginConfigHandler { @@ -1656,6 +1656,18 @@ impl LoginConfigHandler { log::debug!("remove password of {}", self.id); } } + #[cfg(feature = "flutter")] + { + // sync ab password with PeerConfig password + let password = base64::encode(config.password.clone(), base64::Variant::Original); + let evt: HashMap<&str, String> = HashMap::from([ + ("name", "sync_peer_password_to_ab".to_string()), + ("id", self.id.clone()), + ("password", password), + ]); + let evt = serde_json::ser::to_string(&evt).unwrap_or("".to_owned()); + crate::flutter::push_global_event(crate::flutter::APP_TYPE_MAIN, evt); + } if config.keyboard_mode.is_empty() { if is_keyboard_mode_supported(&KeyboardMode::Map, get_version_number(&pi.version)) { config.keyboard_mode = KeyboardMode::Map.to_string(); @@ -2260,12 +2272,12 @@ pub async fn handle_hash( if !hash.is_empty() { password = hash; lc.write().unwrap().save_ab_password_to_recent = true; - lc.write().unwrap().password = password.clone(); } } } } } + lc.write().unwrap().password = password.clone(); let password = if password.is_empty() { // login without password, the remote side can click accept interface.msgbox("input-password", "Password Required", "", ""); @@ -2337,9 +2349,9 @@ pub async fn handle_login_from_ui( hasher.update(&lc.read().unwrap().hash.salt); let res = hasher.finalize(); lc.write().unwrap().remember = remember; - lc.write().unwrap().password = res[..].into(); res[..].into() }; + lc.write().unwrap().password = hash_password.clone(); let mut hasher2 = Sha256::new(); hasher2.update(&hash_password[..]); hasher2.update(&lc.read().unwrap().hash.challenge);