diff --git a/flutter/lib/common/widgets/peer_tab_page.dart b/flutter/lib/common/widgets/peer_tab_page.dart index 56b5bc72c..f2de21dc7 100644 --- a/flutter/lib/common/widgets/peer_tab_page.dart +++ b/flutter/lib/common/widgets/peer_tab_page.dart @@ -309,6 +309,7 @@ class _PeerTabPageState extends State break; } gFFI.peerTabModel.closeSelection(); + showToast(translate('Successful')); } deletePeerConfirmDialog(onSubmit); @@ -334,6 +335,7 @@ class _PeerTabPageState extends State } await bind.mainStoreFav(favs: favs); gFFI.peerTabModel.closeSelection(); + showToast(translate('Successful')); }, child: Tooltip( message: translate('Add to Favorites'), @@ -354,6 +356,7 @@ class _PeerTabPageState extends State gFFI.abModel.addPeers(peers); gFFI.abModel.pushAb(); gFFI.peerTabModel.closeSelection(); + showToast(translate('Successful')); }, child: Tooltip( message: translate('Add to Address Book'), @@ -377,6 +380,7 @@ class _PeerTabPageState extends State peers.map((p) => p.id).toList(), selectedTags); gFFI.abModel.pushAb(); gFFI.peerTabModel.closeSelection(); + showToast(translate('Successful')); }); }, child: Tooltip( diff --git a/flutter/lib/models/ab_model.dart b/flutter/lib/models/ab_model.dart index 9d24de94c..5bbbc0f9f 100644 --- a/flutter/lib/models/ab_model.dart +++ b/flutter/lib/models/ab_model.dart @@ -61,7 +61,7 @@ class AbModel { authHeaders['Accept-Encoding'] = "gzip"; final resp = await http.get(Uri.parse(api), headers: authHeaders); if (resp.body.isNotEmpty && resp.body.toLowerCase() != "null") { - Map json = jsonDecode(resp.body); + Map json = jsonDecode(utf8.decode(resp.bodyBytes)); if (json.containsKey('error')) { abError.value = json['error']; } else if (json.containsKey('data')) { diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index 8a801b42a..56ffa9a01 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -23,7 +23,7 @@ use crate::{ log, password_security::{ decrypt_str_or_original, decrypt_vec_or_original, encrypt_str_or_original, - encrypt_vec_or_original, + encrypt_vec_or_original, symmetric_crypt, }, }; @@ -1504,13 +1504,14 @@ impl Ab { pub fn store(json: String) { if let Ok(mut file) = std::fs::File::create(Self::path()) { let data = compress(json.as_bytes()); - let max_len = 32 * 1024 * 1024; + let max_len = 64 * 1024 * 1024; if data.len() > max_len { - // not store original + // maxlen of function decompress return; } - let data = encrypt_vec_or_original(&data, PASSWORD_ENC_VERSION, max_len); - file.write_all(&data).ok(); + if let Ok(data) = symmetric_crypt(&data, true) { + file.write_all(&data).ok(); + } }; } @@ -1518,8 +1519,7 @@ impl Ab { if let Ok(mut file) = std::fs::File::open(Self::path()) { let mut data = vec![]; if file.read_to_end(&mut data).is_ok() { - let (data, succ, _) = decrypt_vec_or_original(&data, PASSWORD_ENC_VERSION); - if succ { + if let Ok(data) = symmetric_crypt(&data, false) { let data = decompress(&data); if let Ok(ab) = serde_json::from_str::(&String::from_utf8_lossy(&data)) { return ab; @@ -1527,6 +1527,7 @@ impl Ab { } } }; + Self::remove(); Ab::default() } diff --git a/libs/hbb_common/src/password_security.rs b/libs/hbb_common/src/password_security.rs index a127ccd2b..28b32e68e 100644 --- a/libs/hbb_common/src/password_security.rs +++ b/libs/hbb_common/src/password_security.rs @@ -164,7 +164,7 @@ fn decrypt(v: &[u8]) -> Result, ()> { } } -fn symmetric_crypt(data: &[u8], encrypt: bool) -> Result, ()> { +pub fn symmetric_crypt(data: &[u8], encrypt: bool) -> Result, ()> { use sodiumoxide::crypto::secretbox; use std::convert::TryInto;