From 7874009854a53fdbd8db3f099e826b27d6f725db Mon Sep 17 00:00:00 2001 From: Godwin Asuquo Date: Thu, 24 Nov 2022 16:34:29 +0200 Subject: [PATCH 1/5] Fix restore from backup using 6 digit-pin --- lib/core/backup_service.dart | 6 +++++- lib/di.dart | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart index 999b67120..780185a66 100644 --- a/lib/core/backup_service.dart +++ b/lib/core/backup_service.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; +import 'package:cake_wallet/store/settings_store.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/foundation.dart'; import 'package:hive/hive.dart'; @@ -20,7 +21,7 @@ import 'package:cake_backup/backup.dart' as cake_backup; class BackupService { BackupService(this._flutterSecureStorage, this._walletInfoSource, - this._keyService, this._sharedPreferences) + this._keyService, this._sharedPreferences, this._settingsStore) : _cipher = Cryptography.instance.chacha20Poly1305Aead(), _correctWallets = []; @@ -33,6 +34,7 @@ class BackupService { final FlutterSecureStorage _flutterSecureStorage; final SharedPreferences _sharedPreferences; final Box _walletInfoSource; + final SettingsStore _settingsStore; final KeyService _keyService; List _correctWallets; @@ -301,6 +303,7 @@ class BackupService { as Map; final keychainWalletsInfo = keychainJSON['wallets'] as List; final decodedPin = keychainJSON['pin'] as String; + _settingsStore.pinCodeLength = decodedPin.length; final pinCodeKey = generateStoreKeyFor(key: SecretStoreKey.pinCodePassword); final backupPasswordKey = generateStoreKeyFor(key: SecretStoreKey.backupPassword); @@ -331,6 +334,7 @@ class BackupService { final keychainWalletsInfo = keychainJSON['wallets'] as List; final decodedPin = keychainJSON['pin'] as String; final pinCodeKey = generateStoreKeyFor(key: SecretStoreKey.pinCodePassword); + _settingsStore.pinCodeLength = decodedPin.length; final backupPasswordKey = generateStoreKeyFor(key: SecretStoreKey.backupPassword); final backupPassword = keychainJSON[backupPasswordKey] as String; diff --git a/lib/di.dart b/lib/di.dart index 90549cf6f..b06931cd6 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -586,7 +586,9 @@ Future setup( getIt.get(), _walletInfoSource, getIt.get(), - getIt.get())); + getIt.get(), + getIt.get(), + )); getIt.registerFactory(() => BackupViewModel(getIt.get(), getIt.get(), getIt.get())); From c235df89353ba0cdc8f1222ebb64f8c73bee6b85 Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Wed, 7 Dec 2022 16:41:04 +0200 Subject: [PATCH 2/5] - Fix reloading settings store - Revert changes to backup_service.dart --- lib/core/backup_service.dart | 6 +- lib/di.dart | 4 +- lib/store/settings_store.dart | 69 ++++++++----------- .../restore_from_backup_view_model.dart | 5 +- 4 files changed, 31 insertions(+), 53 deletions(-) diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart index 780185a66..999b67120 100644 --- a/lib/core/backup_service.dart +++ b/lib/core/backup_service.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; -import 'package:cake_wallet/store/settings_store.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/foundation.dart'; import 'package:hive/hive.dart'; @@ -21,7 +20,7 @@ import 'package:cake_backup/backup.dart' as cake_backup; class BackupService { BackupService(this._flutterSecureStorage, this._walletInfoSource, - this._keyService, this._sharedPreferences, this._settingsStore) + this._keyService, this._sharedPreferences) : _cipher = Cryptography.instance.chacha20Poly1305Aead(), _correctWallets = []; @@ -34,7 +33,6 @@ class BackupService { final FlutterSecureStorage _flutterSecureStorage; final SharedPreferences _sharedPreferences; final Box _walletInfoSource; - final SettingsStore _settingsStore; final KeyService _keyService; List _correctWallets; @@ -303,7 +301,6 @@ class BackupService { as Map; final keychainWalletsInfo = keychainJSON['wallets'] as List; final decodedPin = keychainJSON['pin'] as String; - _settingsStore.pinCodeLength = decodedPin.length; final pinCodeKey = generateStoreKeyFor(key: SecretStoreKey.pinCodePassword); final backupPasswordKey = generateStoreKeyFor(key: SecretStoreKey.backupPassword); @@ -334,7 +331,6 @@ class BackupService { final keychainWalletsInfo = keychainJSON['wallets'] as List; final decodedPin = keychainJSON['pin'] as String; final pinCodeKey = generateStoreKeyFor(key: SecretStoreKey.pinCodePassword); - _settingsStore.pinCodeLength = decodedPin.length; final backupPasswordKey = generateStoreKeyFor(key: SecretStoreKey.backupPassword); final backupPassword = keychainJSON[backupPasswordKey] as String; diff --git a/lib/di.dart b/lib/di.dart index 2a07919d5..c62dc9790 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -606,9 +606,7 @@ Future setup( getIt.get(), _walletInfoSource, getIt.get(), - getIt.get(), - getIt.get(), - )); + getIt.get())); getIt.registerFactory(() => BackupViewModel(getIt.get(), getIt.get(), getIt.get())); diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index 534ea67e9..9fc082ec4 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -3,7 +3,6 @@ import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cw_core/transaction_priority.dart'; import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/themes/theme_list.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; @@ -234,8 +233,7 @@ abstract class SettingsStoreBase with Store { : ThemeType.bright.index; final savedTheme = ThemeList.deserialize( raw: sharedPreferences.getInt(PreferencesKey.currentTheme) ?? - legacyTheme ?? - 0); + legacyTheme); final actionListDisplayMode = ObservableList(); actionListDisplayMode.addAll(deserializeActionlistDisplayModes( sharedPreferences.getInt(PreferencesKey.displayActionListModeKey) ?? @@ -281,7 +279,7 @@ abstract class SettingsStoreBase with Store { if (havenNode != null) { nodes[WalletType.haven] = havenNode; } - + return SettingsStore( sharedPreferences: sharedPreferences, nodes: nodes, @@ -301,48 +299,35 @@ abstract class SettingsStoreBase with Store { shouldShowYatPopup: shouldShowYatPopup); } - // FIX-ME: Dead code + Future reload( + {required Box nodeSource, + FiatCurrency initialFiatCurrency = FiatCurrency.usd, + TransactionPriority? initialMoneroTransactionPriority, + TransactionPriority? initialBitcoinTransactionPriority, + BalanceDisplayMode initialBalanceDisplayMode = BalanceDisplayMode.availableBalance}) async { + if (initialBitcoinTransactionPriority == null) { + initialBitcoinTransactionPriority = bitcoin?.getMediumTransactionPriority(); + } - //Future reload( - // {required Box nodeSource, - // FiatCurrency initialFiatCurrency = FiatCurrency.usd, - // TransactionPriority? initialMoneroTransactionPriority, - // TransactionPriority? initialBitcoinTransactionPriority, - // BalanceDisplayMode initialBalanceDisplayMode = - // BalanceDisplayMode.availableBalance}) async { - - // if (initialBitcoinTransactionPriority == null) { - // initialBitcoinTransactionPriority = bitcoin?.getMediumTransactionPriority(); - // } + if (initialMoneroTransactionPriority == null) { + initialMoneroTransactionPriority = monero?.getDefaultTransactionPriority(); + } - // if (initialMoneroTransactionPriority == null) { - // initialMoneroTransactionPriority = monero?.getDefaultTransactionPriority(); - // } + final isBitcoinBuyEnabled = (secrets.wyreSecretKey.isNotEmpty) && + (secrets.wyreApiKey.isNotEmpty) && + (secrets.wyreAccountId.isNotEmpty); - // final isBitcoinBuyEnabled = (secrets.wyreSecretKey?.isNotEmpty ?? false) && - // (secrets.wyreApiKey?.isNotEmpty ?? false) && - // (secrets.wyreAccountId?.isNotEmpty ?? false); + final settings = await SettingsStoreBase.load( + nodeSource: nodeSource, + isBitcoinBuyEnabled: isBitcoinBuyEnabled, + initialBalanceDisplayMode: initialBalanceDisplayMode, + initialFiatCurrency: initialFiatCurrency, + initialMoneroTransactionPriority: initialMoneroTransactionPriority, + initialBitcoinTransactionPriority: initialBitcoinTransactionPriority); - // final settings = await SettingsStoreBase.load( - // nodeSource: nodeSource, - // isBitcoinBuyEnabled: isBitcoinBuyEnabled, - // initialBalanceDisplayMode: initialBalanceDisplayMode, - // initialFiatCurrency: initialFiatCurrency, - // initialMoneroTransactionPriority: initialMoneroTransactionPriority, - // initialBitcoinTransactionPriority: initialBitcoinTransactionPriority); - // fiatCurrency = settings.fiatCurrency; - // actionlistDisplayMode = settings.actionlistDisplayMode; - // priority[WalletType.monero] = initialMoneroTransactionPriority; - // priority[WalletType.bitcoin] = initialBitcoinTransactionPriority; - // balanceDisplayMode = settings.balanceDisplayMode; - // shouldSaveRecipientAddress = settings.shouldSaveRecipientAddress; - // allowBiometricalAuthentication = settings.allowBiometricalAuthentication; - // currentTheme = settings.currentTheme; - // pinCodeLength = settings.pinCodeLength; - // languageCode = settings.languageCode; - // appVersion = settings.appVersion; - // shouldShowYatPopup = settings.shouldShowYatPopup; - //} + getIt.unregister(); + getIt.registerSingleton(settings); + } Future _saveCurrentNode(Node node, WalletType walletType) async { switch (walletType) { diff --git a/lib/view_model/restore_from_backup_view_model.dart b/lib/view_model/restore_from_backup_view_model.dart index d3542a668..403ae3ff1 100644 --- a/lib/view_model/restore_from_backup_view_model.dart +++ b/lib/view_model/restore_from_backup_view_model.dart @@ -35,7 +35,7 @@ abstract class RestoreFromBackupViewModelBase with Store { try { state = IsExecutingState(); - if (filePath?.isEmpty ?? true) { + if (filePath.isEmpty) { state = FailureState('Backup file is not selected.'); return; } @@ -48,8 +48,7 @@ abstract class RestoreFromBackupViewModelBase with Store { final store = getIt.get(); ReactionDisposer? reaction; - // FIX-ME: SettingsStore reload - // await store.settingsStore.reload(nodeSource: getIt.get>()); + await store.settingsStore.reload(nodeSource: getIt.get>()); reaction = autorun((_) { final wallet = store.wallet; From 8b333f2925ebb6105cc299deb93ad50ccba9af7e Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Wed, 7 Dec 2022 17:14:27 +0200 Subject: [PATCH 3/5] - Add disable exchange to the export/import flow - Save changes to Disable Exchange --- lib/core/backup_service.dart | 7 +++++++ lib/store/settings_store.dart | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart index 999b67120..2c680db1b 100644 --- a/lib/core/backup_service.dart +++ b/lib/core/backup_service.dart @@ -216,6 +216,7 @@ class BackupService { final displayActionListMode = data[PreferencesKey.displayActionListModeKey] as int?; final currentPinLength = data[PreferencesKey.currentPinLength] as int?; final currentTheme = data[PreferencesKey.currentTheme] as int?; + final disableExchange = data[PreferencesKey.disableExchangeKey] as bool?; final currentDefaultSettingsMigrationVersion = data[PreferencesKey.currentDefaultSettingsMigrationVersion] as int?; final moneroTransactionPriority = data[PreferencesKey.moneroTransactionPriority] as int?; final bitcoinTransactionPriority = data[PreferencesKey.bitcoinTransactionPriority] as int?; @@ -274,6 +275,10 @@ class BackupService { await _sharedPreferences.setInt( PreferencesKey.currentTheme, currentTheme); + if (disableExchange != null) + await _sharedPreferences.setBool( + PreferencesKey.disableExchangeKey, disableExchange); + if (currentDefaultSettingsMigrationVersion != null) await _sharedPreferences.setInt( PreferencesKey.currentDefaultSettingsMigrationVersion, @@ -421,6 +426,8 @@ class BackupService { _sharedPreferences.getInt(PreferencesKey.displayActionListModeKey), PreferencesKey.currentTheme: _sharedPreferences.getInt(PreferencesKey.currentTheme), + PreferencesKey.disableExchangeKey: + _sharedPreferences.getBool(PreferencesKey.disableExchangeKey), PreferencesKey.currentDefaultSettingsMigrationVersion: _sharedPreferences .getInt(PreferencesKey.currentDefaultSettingsMigrationVersion), PreferencesKey.bitcoinTransactionPriority: diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index 9fc082ec4..ecc5baf8a 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -114,6 +114,11 @@ abstract class SettingsStoreBase with Store { (BalanceDisplayMode mode) => sharedPreferences.setInt( PreferencesKey.currentBalanceDisplayModeKey, mode.serialize())); + reaction( + (_) => disableExchange, + (bool disableExchange) => sharedPreferences.setBool( + PreferencesKey.disableExchangeKey, disableExchange)); + this .nodes .observe((change) { From 3c1f6193951afdf5b1ad72585017210ec5ce3639 Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Fri, 9 Dec 2022 15:57:45 +0200 Subject: [PATCH 4/5] Update Settings Store attributes within reload function to get latest shared prefs data --- lib/store/settings_store.dart | 92 ++++++++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 24 deletions(-) diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index ecc5baf8a..75032975f 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -121,7 +121,7 @@ abstract class SettingsStoreBase with Store { this .nodes - .observe((change) { + .observe((change) { if (change.newValue != null && change.key != null) { _saveCurrentNode(change.newValue!, change.key!); } @@ -304,34 +304,78 @@ abstract class SettingsStoreBase with Store { shouldShowYatPopup: shouldShowYatPopup); } - Future reload( - {required Box nodeSource, - FiatCurrency initialFiatCurrency = FiatCurrency.usd, - TransactionPriority? initialMoneroTransactionPriority, - TransactionPriority? initialBitcoinTransactionPriority, - BalanceDisplayMode initialBalanceDisplayMode = BalanceDisplayMode.availableBalance}) async { - if (initialBitcoinTransactionPriority == null) { - initialBitcoinTransactionPriority = bitcoin?.getMediumTransactionPriority(); + Future reload({required Box nodeSource}) async { + + final sharedPreferences = await getIt.getAsync(); + + fiatCurrency = FiatCurrency.deserialize( + raw: sharedPreferences.getString(PreferencesKey.currentFiatCurrencyKey)!); + + priority[WalletType.monero] = monero?.deserializeMoneroTransactionPriority( + raw: sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority)!) ?? + priority[WalletType.monero]!; + priority[WalletType.bitcoin] = bitcoin?.deserializeBitcoinTransactionPriority( + sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority)!) ?? + priority[WalletType.bitcoin]!; + // TODO: Add litecoin and haven after CW-118 is merged + + balanceDisplayMode = BalanceDisplayMode.deserialize( + raw: sharedPreferences + .getInt(PreferencesKey.currentBalanceDisplayModeKey)!); + shouldSaveRecipientAddress = + sharedPreferences.getBool(PreferencesKey.shouldSaveRecipientAddressKey) ?? shouldSaveRecipientAddress; + allowBiometricalAuthentication = sharedPreferences + .getBool(PreferencesKey.allowBiometricalAuthenticationKey) ?? + allowBiometricalAuthentication; + disableExchange = sharedPreferences.getBool(PreferencesKey.disableExchangeKey) ?? disableExchange; + final legacyTheme = + (sharedPreferences.getBool(PreferencesKey.isDarkThemeLegacy) ?? false) + ? ThemeType.dark.index + : ThemeType.bright.index; + currentTheme = ThemeList.deserialize( + raw: sharedPreferences.getInt(PreferencesKey.currentTheme) ?? + legacyTheme); + actionlistDisplayMode = ObservableList(); + actionlistDisplayMode.addAll(deserializeActionlistDisplayModes( + sharedPreferences.getInt(PreferencesKey.displayActionListModeKey) ?? + defaultActionsMode)); + var pinLength = sharedPreferences.getInt(PreferencesKey.currentPinLength); + // If no value + if (pinLength == null || pinLength == 0) { + pinLength = pinCodeLength; + } + pinCodeLength = pinLength; + + languageCode = sharedPreferences.getString(PreferencesKey.currentLanguageCode) ?? languageCode; + shouldShowYatPopup = sharedPreferences.getBool(PreferencesKey.shouldShowYatPopup) ?? shouldShowYatPopup; + + final nodeId = sharedPreferences.getInt(PreferencesKey.currentNodeIdKey); + final bitcoinElectrumServerId = sharedPreferences + .getInt(PreferencesKey.currentBitcoinElectrumSererIdKey); + final litecoinElectrumServerId = sharedPreferences + .getInt(PreferencesKey.currentLitecoinElectrumSererIdKey); + final havenNodeId = sharedPreferences + .getInt(PreferencesKey.currentHavenNodeIdKey); + final moneroNode = nodeSource.get(nodeId); + final bitcoinElectrumServer = nodeSource.get(bitcoinElectrumServerId); + final litecoinElectrumServer = nodeSource.get(litecoinElectrumServerId); + final havenNode = nodeSource.get(havenNodeId); + + if (moneroNode != null) { + nodes[WalletType.monero] = moneroNode; } - if (initialMoneroTransactionPriority == null) { - initialMoneroTransactionPriority = monero?.getDefaultTransactionPriority(); + if (bitcoinElectrumServer != null) { + nodes[WalletType.bitcoin] = bitcoinElectrumServer; } - final isBitcoinBuyEnabled = (secrets.wyreSecretKey.isNotEmpty) && - (secrets.wyreApiKey.isNotEmpty) && - (secrets.wyreAccountId.isNotEmpty); + if (litecoinElectrumServer != null) { + nodes[WalletType.litecoin] = litecoinElectrumServer; + } - final settings = await SettingsStoreBase.load( - nodeSource: nodeSource, - isBitcoinBuyEnabled: isBitcoinBuyEnabled, - initialBalanceDisplayMode: initialBalanceDisplayMode, - initialFiatCurrency: initialFiatCurrency, - initialMoneroTransactionPriority: initialMoneroTransactionPriority, - initialBitcoinTransactionPriority: initialBitcoinTransactionPriority); - - getIt.unregister(); - getIt.registerSingleton(settings); + if (havenNode != null) { + nodes[WalletType.haven] = havenNode; + } } Future _saveCurrentNode(Node node, WalletType walletType) async { From 87e72eabdf15196e7605ed1c15ce2b8975fe85bf Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Fri, 9 Dec 2022 20:36:51 +0200 Subject: [PATCH 5/5] Fix conflicts with main [skip ci] --- lib/store/settings_store.dart | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index dd574e7c9..96d74a23a 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -364,7 +364,17 @@ abstract class SettingsStoreBase with Store { priority[WalletType.bitcoin] = bitcoin?.deserializeBitcoinTransactionPriority( sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority)!) ?? priority[WalletType.bitcoin]!; - // TODO: Add litecoin and haven after CW-118 is merged + + if (sharedPreferences.getInt(PreferencesKey.havenTransactionPriority) != null) { + priority[WalletType.haven] = monero?.deserializeMoneroTransactionPriority( + raw: sharedPreferences.getInt(PreferencesKey.havenTransactionPriority)!) ?? + priority[WalletType.haven]!; + } + if (sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority) != null) { + priority[WalletType.litecoin] = bitcoin?.deserializeLitecoinTransactionPriority( + sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority)!) ?? + priority[WalletType.litecoin]!; + } balanceDisplayMode = BalanceDisplayMode.deserialize( raw: sharedPreferences