diff --git a/assets/images/tor_icon_disabled.png b/assets/images/tor_icon_disabled.png new file mode 100644 index 000000000..116fa52e7 Binary files /dev/null and b/assets/images/tor_icon_disabled.png differ diff --git a/lib/core/wallet_loading_service.dart b/lib/core/wallet_loading_service.dart index 3323e7831..24585f6c0 100644 --- a/lib/core/wallet_loading_service.dart +++ b/lib/core/wallet_loading_service.dart @@ -1,27 +1,36 @@ +import 'dart:io'; + import 'package:cake_wallet/core/generate_wallet_password.dart'; import 'package:cake_wallet/core/key_service.dart'; import 'package:cake_wallet/entities/preferences_key.dart'; +import 'package:cake_wallet/store/app_store.dart'; +import 'package:cake_wallet/store/settings_store.dart'; +import 'package:cake_wallet/view_model/settings/tor_connection.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_service.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tor/tor.dart'; class WalletLoadingService { WalletLoadingService( - this.sharedPreferences, this.keyService, this.walletServiceFactory); + this.sharedPreferences, + this.keyService, + this.walletServiceFactory, + this.settingsStore, + ); final SharedPreferences sharedPreferences; final KeyService keyService; final WalletService Function(WalletType type) walletServiceFactory; + final SettingsStore settingsStore; - Future<void> renameWallet( - WalletType type, String name, String newName) async { + Future<void> renameWallet(WalletType type, String name, String newName) async { final walletService = walletServiceFactory.call(type); final password = await keyService.getWalletPassword(walletName: name); // Save the current wallet's password to the new wallet name's key - await keyService.saveWalletPassword( - walletName: newName, password: password); + await keyService.saveWalletPassword(walletName: newName, password: password); // Delete previous wallet name from keyService to keep only new wallet's name // otherwise keeps duplicate (old and new names) await keyService.deleteWalletPassword(walletName: name); @@ -46,6 +55,15 @@ class WalletLoadingService { await updateMoneroWalletPassword(wallet); } + final mode = settingsStore.torConnectionMode; + if (mode == TorConnectionMode.enabled || mode == TorConnectionMode.onionOnly && (Tor.instance.port != -1)) { + final node = settingsStore.getCurrentNode(wallet.type); + if (node.socksProxyAddress?.isEmpty ?? true) { + node.socksProxyAddress = "${InternetAddress.loopbackIPv4.address}:${Tor.instance.port}"; + } + wallet.connectToNode(node: node); + } + return wallet; } @@ -61,11 +79,9 @@ class WalletLoadingService { // Save new generated password with backup key for case where // wallet will change password, but it will fail to update in secure storage final bakWalletName = '#__${wallet.name}_bak__#'; - await keyService.saveWalletPassword( - walletName: bakWalletName, password: password); + await keyService.saveWalletPassword(walletName: bakWalletName, password: password); await wallet.changePassword(password); - await keyService.saveWalletPassword( - walletName: wallet.name, password: password); + await keyService.saveWalletPassword(walletName: wallet.name, password: password); isPasswordUpdated = true; await sharedPreferences.setBool(key, isPasswordUpdated); } diff --git a/lib/di.dart b/lib/di.dart index d43b43f88..bc3ce952f 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -352,17 +352,21 @@ Future<void> setup({ walletInfoSource: _walletInfoSource)); getIt.registerFactoryParam<AdvancedPrivacySettingsViewModel, WalletType, void>( - (type, _) => AdvancedPrivacySettingsViewModel(type, getIt.get<SettingsStore>())); + (type, _) => AdvancedPrivacySettingsViewModel(type, getIt.get<SettingsStore>())); getIt.registerFactory<WalletLoadingService>(() => WalletLoadingService( - getIt.get<SharedPreferences>(), - getIt.get<KeyService>(), - (WalletType type) => getIt.get<WalletService>(param1: type))); - - getIt.registerFactoryParam<WalletNewVM, WalletType, void>((type, _) => - WalletNewVM(getIt.get<AppStore>(), - getIt.get<WalletCreationService>(param1: type), _walletInfoSource, - getIt.get<AdvancedPrivacySettingsViewModel>(param1: type),type: type)); + getIt.get<SharedPreferences>(), + getIt.get<KeyService>(), + (WalletType type) => getIt.get<WalletService>(param1: type), + getIt.get<SettingsStore>(), + )); + + getIt.registerFactoryParam<WalletNewVM, WalletType, void>((type, _) => WalletNewVM( + getIt.get<AppStore>(), + getIt.get<WalletCreationService>(param1: type), + _walletInfoSource, + getIt.get<AdvancedPrivacySettingsViewModel>(param1: type), + type: type)); getIt.registerFactoryParam<WalletRestorationFromQRVM, WalletType, void>((WalletType type, _) { return WalletRestorationFromQRVM(getIt.get<AppStore>(), @@ -815,8 +819,7 @@ Future<void> setup({ .registerFactory<DFXBuyProvider>(() => DFXBuyProvider(wallet: getIt.get<AppStore>().wallet!)); getIt.registerFactory<MoonPaySellProvider>(() => MoonPaySellProvider( - settingsStore: getIt.get<AppStore>().settingsStore, - wallet: getIt.get<AppStore>().wallet!)); + settingsStore: getIt.get<AppStore>().settingsStore, wallet: getIt.get<AppStore>().wallet!)); getIt.registerFactory<OnRamperBuyProvider>(() => OnRamperBuyProvider( getIt.get<AppStore>().settingsStore, @@ -929,8 +932,7 @@ Future<void> setup({ (param1, isCreate) => NewWalletTypePage(onTypeSelected: param1, isCreate: isCreate ?? true)); getIt.registerFactoryParam<PreSeedPage, int, void>( - (seedPhraseLength, _) - => PreSeedPage(seedPhraseLength)); + (seedPhraseLength, _) => PreSeedPage(seedPhraseLength)); getIt.registerFactoryParam<TradeDetailsViewModel, Trade, void>((trade, _) => TradeDetailsViewModel( @@ -964,7 +966,7 @@ Future<void> setup({ getIt.registerFactory(() => BuyAmountViewModel()); getIt.registerFactoryParam<BuySellOptionsPage, bool, void>( - (isBuyOption, _) => BuySellOptionsPage(getIt.get<DashboardViewModel>(), isBuyOption)); + (isBuyOption, _) => BuySellOptionsPage(getIt.get<DashboardViewModel>(), isBuyOption)); getIt.registerFactory(() { final wallet = getIt.get<AppStore>().wallet; diff --git a/lib/src/screens/dashboard/widgets/sync_indicator.dart b/lib/src/screens/dashboard/widgets/sync_indicator.dart index 5509495d1..b65cfb8b3 100644 --- a/lib/src/screens/dashboard/widgets/sync_indicator.dart +++ b/lib/src/screens/dashboard/widgets/sync_indicator.dart @@ -60,10 +60,9 @@ class SyncIndicator extends StatelessWidget { return Container( width: 15, margin: EdgeInsets.only(left: 12, bottom: 2), - child: Image.asset( - 'assets/images/tor_icon.png', - color: dashboardViewModel.isTorConnected ? null : Colors.white, - ), + child: dashboardViewModel.isTorConnected + ? Image.asset('assets/images/tor_icon.png') + : Image.asset('assets/images/tor_icon_disabled.png'), ); }), ], diff --git a/lib/src/screens/settings/connection_sync_page.dart b/lib/src/screens/settings/connection_sync_page.dart index da7b0450c..226e3313f 100644 --- a/lib/src/screens/settings/connection_sync_page.dart +++ b/lib/src/screens/settings/connection_sync_page.dart @@ -4,6 +4,9 @@ import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.da import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_tor_status.dart'; import 'package:cake_wallet/src/screens/settings/widgets/wallet_connect_button.dart'; +import 'package:cake_wallet/themes/extensions/balance_page_theme.dart'; +import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; +import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart'; import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/utils/feature_flag.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; @@ -105,7 +108,7 @@ class ConnectionSyncPage extends BasePage { decoration: BoxDecoration( borderRadius: BorderRadius.only( topLeft: Radius.circular(25), topRight: Radius.circular(25)), - color: const Color.fromARGB(255, 236, 244, 255), + color: Theme.of(context).extension<CakeTextTheme>()!.textfieldUnderlineColor, ), ); }), @@ -115,7 +118,7 @@ class ConnectionSyncPage extends BasePage { decoration: BoxDecoration( borderRadius: BorderRadius.only( bottomLeft: Radius.circular(25), bottomRight: Radius.circular(25)), - color: const Color.fromARGB(255, 236, 244, 255), + color: Theme.of(context).extension<CakeTextTheme>()!.textfieldUnderlineColor, ), title: S.current.tor_status, isSelected: false, diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index be82444b8..f9adaafb0 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -16,6 +16,7 @@ import 'package:cake_wallet/entities/sort_balance_types.dart'; import 'package:cake_wallet/entities/wallet_list_order_types.dart'; import 'package:cake_wallet/polygon/polygon.dart'; import 'package:cake_wallet/exchange/provider/trocador_exchange_provider.dart'; +import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/view_model/settings/sync_mode.dart'; import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/ethereum/ethereum.dart'; @@ -325,6 +326,14 @@ abstract class SettingsStoreBase with Store { await Tor.init(); await Tor.instance.enable(); + // connect to node through the proxy: + final appStore = getIt.get<AppStore>(); + final node = getCurrentNode(appStore.wallet!.type); + if (node.socksProxyAddress?.isEmpty ?? true) { + node.socksProxyAddress = "${InternetAddress.loopbackIPv4.address}:${Tor.instance.port}"; + } + appStore.wallet!.connectToNode(node: node); + shouldStartTorOnLaunch = true; } else { Tor.instance.disable();