From c4c4afb74a3ea9d22443266bdc80340d41e86721 Mon Sep 17 00:00:00 2001 From: Matthew Fosse <matt@fosse.co> Date: Wed, 3 Jan 2024 16:00:00 -0500 Subject: [PATCH] tor updates --- assets/images/tor_icon.png | Bin 0 -> 1154 bytes lib/core/backup_service.dart | 6 + lib/di.dart | 5 +- lib/entities/preferences_key.dart | 2 +- lib/reactions/fiat_rate_update.dart | 4 +- .../on_current_fiat_api_mode_change.dart | 2 +- lib/reactions/on_current_fiat_change.dart | 2 +- lib/reactions/on_current_wallet_change.dart | 4 +- lib/src/screens/dashboard/dashboard_page.dart | 18 +++ .../dashboard/widgets/sync_indicator.dart | 133 ++++++++++-------- .../settings/connection_sync_page.dart | 25 ++-- .../settings/widgets/settings_tor_status.dart | 18 +-- lib/store/settings_store.dart | 48 +++---- .../dashboard/dashboard_view_model.dart | 20 ++- .../dashboard/home_settings_view_model.dart | 2 +- lib/view_model/settings/tor_connection.dart | 45 ++++-- res/values/strings_ar.arb | 3 +- res/values/strings_bg.arb | 3 +- res/values/strings_cs.arb | 3 +- res/values/strings_de.arb | 3 +- res/values/strings_en.arb | 3 +- res/values/strings_es.arb | 3 +- res/values/strings_fr.arb | 3 +- res/values/strings_ha.arb | 3 +- res/values/strings_hi.arb | 3 +- res/values/strings_hr.arb | 3 +- res/values/strings_id.arb | 3 +- res/values/strings_it.arb | 3 +- res/values/strings_ja.arb | 3 +- res/values/strings_ko.arb | 3 +- res/values/strings_my.arb | 3 +- res/values/strings_nl.arb | 3 +- res/values/strings_pl.arb | 3 +- res/values/strings_pt.arb | 3 +- res/values/strings_ru.arb | 3 +- res/values/strings_th.arb | 3 +- res/values/strings_tl.arb | 3 +- res/values/strings_tr.arb | 3 +- res/values/strings_uk.arb | 3 +- res/values/strings_ur.arb | 3 +- res/values/strings_yo.arb | 3 +- res/values/strings_zh.arb | 3 +- 42 files changed, 251 insertions(+), 161 deletions(-) create mode 100644 assets/images/tor_icon.png diff --git a/assets/images/tor_icon.png b/assets/images/tor_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..44eecfc19de03861767b13edeb04e1ee32a305ec GIT binary patch literal 1154 zcmV-|1bzF7P)<h;3K|Lk000e1NJLTq000#L000;W1^@s66^XV;00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP<VFdsH1Q$s}K~#7FrBq9c z990zl?!8sjRXsDAo|qX38fkSSs4%`j145#pI~DQ+oP~?{LU)3oM#QBkZX#k3-MG+| zy3p0Q2t*<>inwzz2{>e)J>6YhRk!ZTb82Q<aU^L-cVF(QzUO@RJKs5VfC)am4^DNi zzWeaTFVEli(j@+J5~o^L-v%G%0Wm*`|3sjXl+!+VD1_D|{u6=vfGa8%aKN3D_)i2X zM3`kzA@JnN(qiYPL3^K_>WCn_LQ14ZWCw|R`$jS1|AC(E7(IN7xIF@EmjXh^8Vgs~ z(8GYb#7a5PA89}R&B+UwcCHJ`V8s1ZZ|!TkEZZUk>75h7)~bE<7^?m*g7>Tkypb4g z>1(<-x={9K-aGl#rScGH@5`kwT)FIY)wL#vlWFd%GFAfg6HzvI49?Ur#jvT|UZkLl z0(z?(t3s*M_kaBB>R3|-6v8h%>$}z#h^J;?2RqYoJCjjsDq=SgwGd@9a4sO}%){9L zl}#f%+QQr&$GgF~<;ySLdtwY~s_J|_DsQVtJ;d!P4F0-??3RVf^oux3+Te_Xam`Ay zBPcdE(4JdBvAqo;V?^zMbatv6)#8hW|N19q&cspl^<Zlaom=OzyS9neR0?mUS1OU5 zrZWcF%<MnfuU$pw_z4(Yz?3Cj>Jgm6&Y$b#9!^W;!dX2UAkGq0gAu&*Xc618Ka{bG zQ5U2?Gp)^dN&Y|25lf0G3S@1P%M@tMWaKK|lvL@*^PPc9vlRKx5G~q6?YyN_J-3mr ziK=hxgC*(9m$99Y*5zP83?;=ToY(^r#>&9lLx8SoVxcIdS|U&)4BCLZ#vU&!R!x_& ztwaP}YDC1|dc*2;B1Z?t`X+5tQ>zd-+cZDGXO_+)<*3E%SW~V%bxL#2zT6Q!7{Y#s zMz(gSD+;2WQyBHNPqQQtnBp_8JOe9^+W#14OE^ueWm}MsYqW1#s(A<mmTL-Bq>q+H zJG}?y8pa&V_Q9&OX>?_~pwwd-Aup;%mIl;W_hTBx*xJmYq_Rb2U<*S%1*<8T9nHSB z2TOBS%#QVLqzij;RhA|AUg|1P3y=<8qMw&hA{F{WEn7lGe1W21{V%|hE>grY5ZI8| zCB$+tst}W(q2kF%z98>;|Kder@_H&1X(C9Y&}dlJwh1%@#D!#5y!fI-NaWNhoCQC( zs2X)%aprIF`#&BizrFm>ITHVk%K4b55ZAIrGqe$xq)L_K4VtPQlWl1iQV>I~nA`Qi zzVqOxe|&go^sSs->;^B+QF)#-lnx)#h=QTGY_?5rS+PIWxp@RJ=GF_}QOd6zOsGSk zWALTLZY}*2bog|fCb!@9%%gY5orSd8UeB-maCyUxs-Ma2ry>rYKX(52-hbo&1{N>2 UXcAeY5&!@I07*qoM6N<$g4B5-g8%>k literal 0 HcmV?d00001 diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart index 10aed11c2..310310ada 100644 --- a/lib/core/backup_service.dart +++ b/lib/core/backup_service.dart @@ -220,6 +220,7 @@ class BackupService { final currentLanguageCode = data[PreferencesKey.currentLanguageCode] as String?; final displayActionListMode = data[PreferencesKey.displayActionListModeKey] as int?; final fiatApiMode = data[PreferencesKey.currentFiatApiModeKey] as int?; + final torConnectionMode = data[PreferencesKey.currentTorConnectionModeKey] as int?; final shouldStartTorOnLaunch = data[PreferencesKey.shouldStartTorOnLaunch] as bool?; final currentPinLength = data[PreferencesKey.currentPinLength] as int?; final currentTheme = data[PreferencesKey.currentTheme] as int?; @@ -317,6 +318,9 @@ class BackupService { if (fiatApiMode != null) await _sharedPreferences.setInt(PreferencesKey.currentFiatApiModeKey, fiatApiMode); + if (torConnectionMode != null) + await _sharedPreferences.setInt(PreferencesKey.currentTorConnectionModeKey, torConnectionMode); + if (shouldStartTorOnLaunch != null) await _sharedPreferences.setBool( PreferencesKey.shouldStartTorOnLaunch, shouldStartTorOnLaunch); @@ -556,6 +560,8 @@ class BackupService { _sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority), PreferencesKey.currentFiatApiModeKey: _sharedPreferences.getInt(PreferencesKey.currentFiatApiModeKey), + PreferencesKey.currentTorConnectionModeKey: + _sharedPreferences.getInt(PreferencesKey.currentTorConnectionModeKey), PreferencesKey.shouldStartTorOnLaunch: _sharedPreferences.getBool(PreferencesKey.shouldStartTorOnLaunch), PreferencesKey.selectedCake2FAPreset: diff --git a/lib/di.dart b/lib/di.dart index 25e8dd31c..d43b43f88 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -298,8 +298,9 @@ Future<void> setup({ ); if (DeviceInfo.instance.isMobile && settingsStore.shouldStartTorOnLaunch) { - Tor.instance.enable(); - Tor.instance.start(); + await Tor.init(); + await Tor.instance.enable(); + await Tor.instance.start(); } if (_isSetupFinished) { diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart index 90787490c..85910a55d 100644 --- a/lib/entities/preferences_key.dart +++ b/lib/entities/preferences_key.dart @@ -48,7 +48,7 @@ class PreferencesKey { static const moneroWalletPasswordUpdateV1Base = 'monero_wallet_update_v1'; static const syncModeKey = 'sync_mode'; static const syncAllKey = 'sync_all'; - static const torConnectionKey = 'tor_connection'; + static const currentTorConnectionModeKey = 'current_tor_connection_mode'; static const pinTimeOutDuration = 'pin_timeout_duration'; static const lastAuthTimeMilliseconds = 'last_auth_time_milliseconds'; static const lastPopupDate = 'last_popup_date'; diff --git a/lib/reactions/fiat_rate_update.dart b/lib/reactions/fiat_rate_update.dart index 42988ba1c..5ea60d5ea 100644 --- a/lib/reactions/fiat_rate_update.dart +++ b/lib/reactions/fiat_rate_update.dart @@ -34,7 +34,7 @@ Future<void> startFiatRateUpdate( crypto: appStore.wallet!.currency, fiat: settingsStore.fiatCurrency, torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly, - onionOnly: settingsStore.currentTorConnection == TorConnectionType.onionOnly, + onionOnly: settingsStore.torConnectionMode == TorConnectionMode.onionOnly, ); } @@ -56,7 +56,7 @@ Future<void> startFiatRateUpdate( crypto: currency, fiat: settingsStore.fiatCurrency, torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly, - onionOnly: settingsStore.currentTorConnection == TorConnectionType.onionOnly, + onionOnly: settingsStore.torConnectionMode == TorConnectionMode.onionOnly, ); }.call(); } diff --git a/lib/reactions/on_current_fiat_api_mode_change.dart b/lib/reactions/on_current_fiat_api_mode_change.dart index cf5688ff5..c56651661 100644 --- a/lib/reactions/on_current_fiat_api_mode_change.dart +++ b/lib/reactions/on_current_fiat_api_mode_change.dart @@ -21,7 +21,7 @@ void startCurrentFiatApiModeChangeReaction( crypto: appStore.wallet!.currency, fiat: settingsStore.fiatCurrency, torOnly: fiatApiMode == FiatApiMode.torOnly, - onionOnly: settingsStore.currentTorConnection == TorConnectionType.onionOnly, + onionOnly: settingsStore.torConnectionMode == TorConnectionMode.onionOnly, ); }); } diff --git a/lib/reactions/on_current_fiat_change.dart b/lib/reactions/on_current_fiat_change.dart index c1b66f099..7656ffce9 100644 --- a/lib/reactions/on_current_fiat_change.dart +++ b/lib/reactions/on_current_fiat_change.dart @@ -23,7 +23,7 @@ void startCurrentFiatChangeReaction( crypto: cryptoCurrency, fiat: fiatCurrency, torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly, - onionOnly: settingsStore.currentTorConnection == TorConnectionType.onionOnly, + onionOnly: settingsStore.torConnectionMode == TorConnectionMode.onionOnly, ); }); } diff --git a/lib/reactions/on_current_wallet_change.dart b/lib/reactions/on_current_wallet_change.dart index 243f4ab85..0eb20bdc3 100644 --- a/lib/reactions/on_current_wallet_change.dart +++ b/lib/reactions/on_current_wallet_change.dart @@ -96,7 +96,7 @@ void startCurrentWalletChangeReaction( crypto: wallet.currency, fiat: settingsStore.fiatCurrency, torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly, - onionOnly: settingsStore.currentTorConnection == TorConnectionType.onionOnly, + onionOnly: settingsStore.torConnectionMode == TorConnectionMode.onionOnly, ); Iterable<Erc20Token>? currencies; @@ -115,7 +115,7 @@ void startCurrentWalletChangeReaction( crypto: currency, fiat: settingsStore.fiatCurrency, torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly, - onionOnly: settingsStore.currentTorConnection == TorConnectionType.onionOnly, + onionOnly: settingsStore.torConnectionMode == TorConnectionMode.onionOnly, ); }.call(); } diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart index 356c69c00..0dedef736 100644 --- a/lib/src/screens/dashboard/dashboard_page.dart +++ b/lib/src/screens/dashboard/dashboard_page.dart @@ -101,6 +101,24 @@ class _DashboardPageView extends BasePage { @override Widget get endDrawer => MenuWidget(dashboardViewModel); + // @override + // Widget leading(BuildContext context) { + // final torButton = Image.asset( + // 'assets/images/tor_icon.png', + // // color: Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor, + // ); + + // return Container( + // alignment: Alignment.centerRight, + // width: 40, + // child: TextButton( + + // onPressed: () => Navigator.of(context, rootNavigator: true).pushNamed(Routes.connectionSync), + // child: Semantics(label: S.of(context).tor_connection, child: torButton), + // ), + // ); + // } + @override Widget middle(BuildContext context) { return SyncIndicator( diff --git a/lib/src/screens/dashboard/widgets/sync_indicator.dart b/lib/src/screens/dashboard/widgets/sync_indicator.dart index 52e596a83..9ff626658 100644 --- a/lib/src/screens/dashboard/widgets/sync_indicator.dart +++ b/lib/src/screens/dashboard/widgets/sync_indicator.dart @@ -1,10 +1,14 @@ +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart'; +import 'package:cake_wallet/view_model/settings/tor_connection.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cake_wallet/core/sync_status_title.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:cw_core/sync_status.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator_icon.dart'; +import 'package:tor/tor.dart'; class SyncIndicator extends StatelessWidget { SyncIndicator({required this.dashboardViewModel, required this.onTap}); @@ -14,71 +18,80 @@ class SyncIndicator extends StatelessWidget { @override Widget build(BuildContext context) { - return Observer( - builder: (_) { - final syncIndicatorWidth = 237.0; - final status = dashboardViewModel.status; - final statusText = status != null ? syncStatusTitle(status) : ''; - final progress = status != null ? status.progress() : 0.0; - final indicatorOffset = progress * syncIndicatorWidth; - final indicatorWidth = progress < 1 - ? indicatorOffset > 0 ? indicatorOffset : 0.0 - : syncIndicatorWidth; + return Observer(builder: (_) { + final syncIndicatorWidth = 237.0; + final status = dashboardViewModel.status; + final statusText = status != null ? syncStatusTitle(status) : ''; + final progress = status != null ? status.progress() : 0.0; + final indicatorOffset = progress * syncIndicatorWidth; + final indicatorWidth = progress < 1 + ? indicatorOffset > 0 + ? indicatorOffset + : 0.0 + : syncIndicatorWidth; - - return ClipRRect( + return ClipRRect( borderRadius: BorderRadius.all(Radius.circular(15)), - child: GestureDetector( + child: GestureDetector( onTap: onTap, - child: Container( - height: 30, - width: syncIndicatorWidth, - color: Theme.of(context).extension<SyncIndicatorTheme>()!.notSyncedBackgroundColor, - child: Stack( - alignment: Alignment.center, - children: <Widget>[ - progress <= 1 - ? Positioned( - left: 0, - top: 0, - bottom: 0, - child: Container( - width: indicatorWidth, - height: 30, - color: Theme.of(context).extension<SyncIndicatorTheme>()!.syncedBackgroundColor, - ) - ) - : Offstage(), - Padding( - padding: EdgeInsets.only( - left: 24, - right: 24 - ), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: <Widget>[ - SyncIndicatorIcon(isSynced:status is SyncedSyncStatus), - Padding( - padding: EdgeInsets.only(left: 6), - child: Text( - statusText, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.w500, - color: Theme.of(context).extension<SyncIndicatorTheme>()!.textColor - ), + child: Container( + height: 30, + width: syncIndicatorWidth, + color: Theme.of(context).extension<SyncIndicatorTheme>()!.notSyncedBackgroundColor, + child: Stack( + alignment: Alignment.center, + children: <Widget>[ + progress <= 1 + ? Positioned( + left: 0, + top: 0, + bottom: 0, + child: Container( + width: indicatorWidth, + height: 30, + color: Theme.of(context) + .extension<SyncIndicatorTheme>()! + .syncedBackgroundColor, + )) + : Offstage(), + Row( + children: [ + Container( + width: 15, + margin: EdgeInsets.only(left: 12, bottom: 2), + child: Image.asset( + 'assets/images/tor_icon.png', + color: dashboardViewModel.isTorConnected ? null : Colors.white, ), - ) + ), ], ), - ) - ], + Padding( + padding: EdgeInsets.only(left: 24, right: 24), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: <Widget>[ + SyncIndicatorIcon(isSynced: status is SyncedSyncStatus), + Padding( + padding: EdgeInsets.only(left: 6), + child: Text( + statusText, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + color: + Theme.of(context).extension<SyncIndicatorTheme>()!.textColor), + ), + ) + ], + ), + ) + ], + ), ), - ), - )); - } - ); + )); + }); } -} \ No newline at end of file +} diff --git a/lib/src/screens/settings/connection_sync_page.dart b/lib/src/screens/settings/connection_sync_page.dart index 650d4761f..05d8e4f4b 100644 --- a/lib/src/screens/settings/connection_sync_page.dart +++ b/lib/src/screens/settings/connection_sync_page.dart @@ -103,20 +103,25 @@ class ConnectionSyncPage extends BasePage { selectedItem: dashboardViewModel.torConnection, onItemSelected: dashboardViewModel.setTorConnection, decoration: BoxDecoration( - borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(25), topRight: Radius.circular(25)), color: const Color.fromARGB(255, 236, 244, 255), ), ); }), - TorStatus( - decoration: BoxDecoration( - borderRadius: BorderRadius.only(bottomLeft: Radius.circular(25), bottomRight: Radius.circular(25)), - color: const Color.fromARGB(255, 236, 244, 255), - ), - title: S.current.tor_status, - isSelected: false, - onTap: (context) {}, - ), + Observer(builder: (context) { + return TorStatus( + connected: dashboardViewModel.isTorConnected, + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(25), bottomRight: Radius.circular(25)), + color: const Color.fromARGB(255, 236, 244, 255), + ), + title: S.current.tor_status, + isSelected: false, + onTap: (context) {}, + ); + }), ]), ), ], diff --git a/lib/src/screens/settings/widgets/settings_tor_status.dart b/lib/src/screens/settings/widgets/settings_tor_status.dart index 394b18997..75c82764f 100644 --- a/lib/src/screens/settings/widgets/settings_tor_status.dart +++ b/lib/src/screens/settings/widgets/settings_tor_status.dart @@ -9,29 +9,19 @@ class TorStatus extends StandardListRow { {required String title, required void Function(BuildContext context) onTap, required bool isSelected, + required this.connected, BoxDecoration? decoration}) : super(title: title, onTap: onTap, isSelected: isSelected, decoration: decoration); + final bool connected; + @override Widget buildTrailing(BuildContext context) { return NodeIndicator( - isLive: Tor.instance.started && Tor.instance.enabled, + isLive: connected, showText: true, ); } - - // @override - // Widget buildTrailing(BuildContext context) { - // return GestureDetector( - // onTap: () {}, - // child: Container( - // padding: EdgeInsets.all(10), - // decoration: BoxDecoration( - // shape: BoxShape.circle, - // color: Theme.of(context).extension<ReceivePageTheme>()!.iconsBackgroundColor), - // child: Icon(Icons.edit, - // size: 14, color: Theme.of(context).extension<ReceivePageTheme>()!.iconsColor))); - // } } class NodeHeaderListRow extends StandardListRow { diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index 1bba0eba2..285bad992 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -60,6 +60,7 @@ abstract class SettingsStoreBase with Store { required WalletListOrderType initialWalletListOrder, required bool initialWalletListAscending, required FiatApiMode initialFiatMode, + required TorConnectionMode initialTorConnectionMode, required bool initialShouldStartTorOnLaunch, required bool initialAllowBiometricalAuthentication, required String initialTotpSecretKey, @@ -71,7 +72,6 @@ abstract class SettingsStoreBase with Store { required String initialLanguageCode, required SyncMode initialSyncMode, required bool initialSyncAll, - required TorConnection initialTorConnection, // required String initialCurrentLocale, required this.appVersion, required this.deviceName, @@ -121,6 +121,7 @@ abstract class SettingsStoreBase with Store { autoGenerateSubaddressStatus = initialAutoGenerateSubaddressStatus, moneroSeedType = initialMoneroSeedType, fiatApiMode = initialFiatMode, + torConnectionMode = initialTorConnectionMode, shouldStartTorOnLaunch = initialShouldStartTorOnLaunch, allowBiometricalAuthentication = initialAllowBiometricalAuthentication, selectedCake2FAPreset = initialCake2FAPresetOptions, @@ -153,7 +154,6 @@ abstract class SettingsStoreBase with Store { initialShouldRequireTOTP2FAForAllSecurityAndBackupSettings, currentSyncMode = initialSyncMode, currentSyncAll = initialSyncAll, - currentTorConnection = initialTorConnection, priority = ObservableMap<WalletType, TransactionPriority>(), defaultBuyProviders = ObservableMap<WalletType, ProviderType>(), defaultSellProviders = ObservableMap<WalletType, ProviderType>() { @@ -317,6 +317,21 @@ abstract class SettingsStoreBase with Store { (FiatApiMode mode) => sharedPreferences.setInt(PreferencesKey.currentFiatApiModeKey, mode.serialize())); + reaction((_) => torConnectionMode, (TorConnectionMode mode) async { + await sharedPreferences.setInt(PreferencesKey.currentTorConnectionModeKey, mode.serialize()); + + if (mode == TorConnectionMode.enabled || mode == TorConnectionMode.onionOnly) { + // init and start the proxy + await Tor.init(); + await Tor.instance.enable(); + + shouldStartTorOnLaunch = true; + } else { + Tor.instance.disable(); + shouldStartTorOnLaunch = false; + } + }); + reaction((_) => shouldStartTorOnLaunch, (bool value) => sharedPreferences.setBool(PreferencesKey.shouldStartTorOnLaunch, value)); @@ -436,21 +451,6 @@ abstract class SettingsStoreBase with Store { _backgroundTasks.registerSyncTask(changeExisting: true); }); - reaction((_) => currentTorConnection, (TorConnection torConnection) async { - sharedPreferences.setInt(PreferencesKey.torConnectionKey, torConnection.type.index); - - if (torConnection.type == TorConnectionType.enabled) { - // Start the proxy - await Tor.init(); - await Tor.instance.start(); - - shouldStartTorOnLaunch = true; - } else { - Tor.instance.disable(); - shouldStartTorOnLaunch = false; - } - }); - reaction( (_) => exchangeStatus, (ExchangeApiMode mode) => @@ -549,6 +549,9 @@ abstract class SettingsStoreBase with Store { @observable FiatApiMode fiatApiMode; + @observable + TorConnectionMode torConnectionMode; + @observable bool shouldStartTorOnLaunch; @@ -690,9 +693,6 @@ abstract class SettingsStoreBase with Store { @observable SyncMode currentSyncMode; - @observable - TorConnection currentTorConnection; - @observable bool currentSyncAll; @@ -802,6 +802,9 @@ abstract class SettingsStoreBase with Store { final currentFiatApiMode = FiatApiMode.deserialize( raw: sharedPreferences.getInt(PreferencesKey.currentFiatApiModeKey) ?? FiatApiMode.enabled.raw); + final currentTorConnectionMode = TorConnectionMode.deserialize( + raw: sharedPreferences.getInt(PreferencesKey.currentTorConnectionModeKey) ?? + FiatApiMode.enabled.raw); final shouldStartTorOnLaunch = sharedPreferences.getBool(PreferencesKey.shouldStartTorOnLaunch) ?? false; final allowBiometricalAuthentication = @@ -963,10 +966,6 @@ abstract class SettingsStoreBase with Store { }); final savedSyncAll = sharedPreferences.getBool(PreferencesKey.syncAllKey) ?? true; - final savedTorConnection = TorConnection.all.firstWhere((element) { - return element.type.index == (sharedPreferences.getInt(PreferencesKey.torConnectionKey) ?? 0); - }); - return SettingsStore( sharedPreferences: sharedPreferences, initialShouldShowMarketPlaceInDashboard: shouldShowMarketPlaceInDashboard, @@ -986,6 +985,7 @@ abstract class SettingsStoreBase with Store { initialWalletListOrder: walletListOrder, initialWalletListAscending: walletListAscending, initialFiatMode: currentFiatApiMode, + initialTorConnectionMode: currentTorConnectionMode, initialShouldStartTorOnLaunch: shouldStartTorOnLaunch, initialAllowBiometricalAuthentication: allowBiometricalAuthentication, initialCake2FAPresetOptions: selectedCake2FAPreset, diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index 55db250c2..5a8e3545f 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -44,6 +44,7 @@ import 'package:eth_sig_util/util/utils.dart'; import 'package:flutter/services.dart'; import 'package:mobx/mobx.dart'; import 'package:cake_wallet/entities/provider_types.dart'; +import 'package:tor/tor.dart'; part 'dashboard_view_model.g.dart'; @@ -336,15 +337,13 @@ abstract class DashboardViewModelBase with Store { bool hasExchangeAction; @computed - bool get isEnabledBuyAction => - !settingsStore.disableBuy && availableBuyProviders.isNotEmpty; + bool get isEnabledBuyAction => !settingsStore.disableBuy && availableBuyProviders.isNotEmpty; @observable bool hasBuyAction; @computed - bool get isEnabledSellAction => - !settingsStore.disableSell && availableSellProviders.isNotEmpty; + bool get isEnabledSellAction => !settingsStore.disableSell && availableSellProviders.isNotEmpty; @observable bool hasSellAction; @@ -462,10 +461,16 @@ abstract class DashboardViewModelBase with Store { void setSyncMode(SyncMode syncMode) => settingsStore.currentSyncMode = syncMode; @computed - TorConnection get torConnection => settingsStore.currentTorConnection; + TorConnectionMode get torConnectionMode => settingsStore.torConnectionMode; @action - void setTorConnection(TorConnection torConnection) => settingsStore.currentTorConnection = torConnection; + void setTorConnectionMode(TorConnectionMode mode) => settingsStore.torConnectionMode = mode; + + @computed + bool get isTorConnected => + (settingsStore.torConnectionMode == TorConnectionMode.enabled || + settingsStore.torConnectionMode == TorConnectionMode.onionOnly) && + (Tor.instance.port != -1); @computed bool get syncAll => settingsStore.currentSyncAll; @@ -475,7 +480,8 @@ abstract class DashboardViewModelBase with Store { Future<List<String>> checkAffectedWallets() async { // await load file - final vulnerableSeedsString = await rootBundle.loadString('assets/text/cakewallet_weak_bitcoin_seeds_hashed_sorted_version1.txt'); + final vulnerableSeedsString = await rootBundle + .loadString('assets/text/cakewallet_weak_bitcoin_seeds_hashed_sorted_version1.txt'); final vulnerableSeeds = vulnerableSeedsString.split("\n"); final walletInfoSource = await CakeHive.openBox<WalletInfo>(WalletInfo.boxName); diff --git a/lib/view_model/dashboard/home_settings_view_model.dart b/lib/view_model/dashboard/home_settings_view_model.dart index e78da747d..8dff30fa6 100644 --- a/lib/view_model/dashboard/home_settings_view_model.dart +++ b/lib/view_model/dashboard/home_settings_view_model.dart @@ -90,7 +90,7 @@ abstract class HomeSettingsViewModelBase with Store { crypto: token, fiat: _settingsStore.fiatCurrency, torOnly: _settingsStore.fiatApiMode == FiatApiMode.torOnly, - onionOnly: _settingsStore.currentTorConnection == TorConnectionType.onionOnly, + onionOnly: _settingsStore.torConnectionMode == TorConnectionMode.onionOnly, ); } catch (_) {} } diff --git a/lib/view_model/settings/tor_connection.dart b/lib/view_model/settings/tor_connection.dart index c0dc628bb..5b3b3b3ae 100644 --- a/lib/view_model/settings/tor_connection.dart +++ b/lib/view_model/settings/tor_connection.dart @@ -1,14 +1,39 @@ -enum TorConnectionType { enabled, disabled, onionOnly } +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cw_core/enumerable_item.dart'; -class TorConnection { - TorConnection(this.name, this.type); +class TorConnectionMode extends EnumerableItem<int> with Serializable<int> { + const TorConnectionMode({required String title, required int raw}) : super(title: title, raw: raw); - final String name; - final TorConnectionType type; + static const all = [TorConnectionMode.enabled, TorConnectionMode.disabled, TorConnectionMode.onionOnly]; - static final all = [ - TorConnection("Enabled", TorConnectionType.enabled), - TorConnection("Disabled", TorConnectionType.disabled), - TorConnection("Onion Only", TorConnectionType.onionOnly), - ]; + static const enabled = TorConnectionMode(raw: 0, title: 'Enabled'); + static const disabled = TorConnectionMode(raw: 1, title: 'Disabled'); + static const onionOnly = TorConnectionMode(raw: 2, title: 'Onion only'); + + static TorConnectionMode deserialize({required int raw}) { + switch (raw) { + case 0: + return enabled; + case 1: + return disabled; + case 2: + return onionOnly; + default: + throw Exception('Unexpected token: $raw for TorConnectionMode deserialize'); + } + } + + @override + String toString() { + switch (this) { + case TorConnectionMode.enabled: + return S.current.enabled; + case TorConnectionMode.disabled: + return S.current.disabled; + case TorConnectionMode.onionOnly: + return S.current.onion_only; + default: + return ''; + } + } } diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 4558fbb8c..3a100f72b 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -763,5 +763,6 @@ "start_tor_on_launch": "ابدأ في الإطلاق", "tor_status": "وضع تور", "connected": "متصل", - "disconnected": "انقطع الاتصال" + "disconnected": "انقطع الاتصال", + "onion_only": "البصل فقط" } \ No newline at end of file diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 7f62a47c1..8e204ff35 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -759,5 +759,6 @@ "start_tor_on_launch": "Стартирайте Tor при стартиране", "tor_status": "TOR статус", "connected": "Свързани", - "disconnected": "Изключен" + "disconnected": "Изключен", + "onion_only": "Само лук" } \ No newline at end of file diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index 6c0bcbc87..0312f3931 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -759,5 +759,6 @@ "start_tor_on_launch": "Začněte tor při spuštění", "tor_status": "TOR status", "connected": "Připojeno", - "disconnected": "Odpojené" + "disconnected": "Odpojené", + "onion_only": "Pouze cibule" } \ No newline at end of file diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 4369fb492..f7ded37f5 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -767,5 +767,6 @@ "start_tor_on_launch": "Starten Sie den Start", "tor_status": "Torstatus", "connected": "In Verbindung gebracht", - "disconnected": "Getrennt" + "disconnected": "Getrennt", + "onion_only": "Nur Zwiebel" } \ No newline at end of file diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 7644d187e..459e66f74 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -768,5 +768,6 @@ "start_tor_on_launch": "Start Tor on launch", "tor_status": "Tor status", "connected": "Connected", - "disconnected": "Disconnected" + "disconnected": "Disconnected", + "onion_only": "Onion only" } \ No newline at end of file diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index c015f59e5..d592b01b2 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -767,5 +767,6 @@ "start_tor_on_launch": "Iniciar tor en el lanzamiento", "tor_status": "Estado de Tor", "connected": "Conectado", - "disconnected": "Desconectado" + "disconnected": "Desconectado", + "onion_only": "Solo cebolla" } \ No newline at end of file diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 01243e78d..ec7014239 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -767,5 +767,6 @@ "start_tor_on_launch": "Démarrez Tor sur le lancement", "tor_status": "Statut", "connected": "Connecté", - "disconnected": "Débranché" + "disconnected": "Débranché", + "onion_only": "Oignon seulement" } \ No newline at end of file diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 61d06ad9a..b18721676 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -749,5 +749,6 @@ "start_tor_on_launch": "Fara tor a kan shimfiɗa", "tor_status": "State State", "connected": "Wanda aka haɗa", - "disconnected": "Katse" + "disconnected": "Katse", + "onion_only": "Albasa kawai" } \ No newline at end of file diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 6c34a93ba..6c0b4a017 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -767,5 +767,6 @@ "start_tor_on_launch": "लॉन्च पर टोर शुरू करें", "tor_status": "टोर की स्थिति", "connected": "जुड़े हुए", - "disconnected": "डिस्कनेक्ट किया गया" + "disconnected": "डिस्कनेक्ट किया गया", + "onion_only": "केवल प्याज" } \ No newline at end of file diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 8d1532cc8..397eac5ac 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -765,5 +765,6 @@ "start_tor_on_launch": "Započnite s lansiranjem", "tor_status": "Status tor", "connected": "Povezan", - "disconnected": "Isključen" + "disconnected": "Isključen", + "onion_only": "Samo luk" } \ No newline at end of file diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 091780360..9588922c7 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -755,5 +755,6 @@ "start_tor_on_launch": "Mulailah untuk peluncuran", "tor_status": "Status Tor", "connected": "Terhubung", - "disconnected": "Terputus" + "disconnected": "Terputus", + "onion_only": "Bawang saja" } \ No newline at end of file diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index fc610c835..cc58cd2c9 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -767,5 +767,6 @@ "start_tor_on_launch": "Inizia Tor al lancio", "tor_status": "Stato di tor", "connected": "Collegato", - "disconnected": "Disconnesso" + "disconnected": "Disconnesso", + "onion_only": "Solo cipolla" } \ No newline at end of file diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 9a510f0a0..7bdcb9557 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -767,5 +767,6 @@ "start_tor_on_launch": "起動時にTORを開始します", "tor_status": "TORステータス", "connected": "接続", - "disconnected": "切断された" + "disconnected": "切断された", + "onion_only": "オニオンのみ" } \ No newline at end of file diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 955ec1229..1cc1187c6 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -765,5 +765,6 @@ "start_tor_on_launch": "출시시 TOR를 시작하십시오", "tor_status": "Tor 상태", "connected": "연결", - "disconnected": "연결이 끊어졌습니다" + "disconnected": "연결이 끊어졌습니다", + "onion_only": "양파 만" } \ No newline at end of file diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 0084a2140..7d302e1d4 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -765,5 +765,6 @@ "start_tor_on_launch": "Tor ကိုဖွင့်ပါ", "tor_status": "Tor Status", "connected": "ချိတ်ဆက်ထားသော", - "disconnected": "ချို့ယွင်းချက်" + "disconnected": "ချို့ယွင်းချက်", + "onion_only": "သာကြက်သွန်" } \ No newline at end of file diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index e5267d2dc..069c0bdc5 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -767,5 +767,6 @@ "start_tor_on_launch": "Begin met de lancering", "tor_status": "Tor Status", "connected": "Verbonden", - "disconnected": "Losgekoppeld" + "disconnected": "Losgekoppeld", + "onion_only": "Alleen ui" } \ No newline at end of file diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 927f973f9..f672d08ea 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -767,5 +767,6 @@ "start_tor_on_launch": "Rozpocznij TOR OD LATH", "tor_status": "Status TOR", "connected": "Połączony", - "disconnected": "Bezładny" + "disconnected": "Bezładny", + "onion_only": "Tylko cebula" } \ No newline at end of file diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index f099c4fb6..48870811e 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -766,5 +766,6 @@ "start_tor_on_launch": "Inicie o TOR no lançamento", "tor_status": "Status de tor", "connected": "Conectado", - "disconnected": "Desconectado" + "disconnected": "Desconectado", + "onion_only": "Apenas cebola" } \ No newline at end of file diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 91c10bf13..252ddefab 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -767,5 +767,6 @@ "start_tor_on_launch": "Запустить", "tor_status": "ТОР Статус", "connected": "Связанный", - "disconnected": "Отключен" + "disconnected": "Отключен", + "onion_only": "Только лук" } \ No newline at end of file diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 2389a5bc6..ddf7dd956 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -765,5 +765,6 @@ "start_tor_on_launch": "เริ่มต้นเมื่อเปิดตัว", "tor_status": "สถานะ tor", "connected": "ซึ่งเชื่อมต่อกัน", - "disconnected": "ตัดการเชื่อมต่อ" + "disconnected": "ตัดการเชื่อมต่อ", + "onion_only": "หัวหอมเท่านั้น" } \ No newline at end of file diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 42f4b5118..63dffb759 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -761,5 +761,6 @@ "start_tor_on_launch": "Simulan ang tor sa paglulunsad", "tor_status": "Katayuan ng tor", "connected": "Konektado", - "disconnected": "Naka -disconnect" + "disconnected": "Naka -disconnect", + "onion_only": "Onion lamang" } \ No newline at end of file diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index df7d2cff7..2d0989fdd 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -765,5 +765,6 @@ "start_tor_on_launch": "Lansmanda Tor'a Başla", "tor_status": "Tor Durumu", "connected": "Bağlı", - "disconnected": "Bağlantı kesildi" + "disconnected": "Bağlantı kesildi", + "onion_only": "Sadece soğan" } \ No newline at end of file diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index c06edaea5..73ba160f8 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -767,5 +767,6 @@ "start_tor_on_launch": "Почніть Тор на запуску", "tor_status": "Статус Tor", "connected": "З'єднаний", - "disconnected": "Роз'єднаний" + "disconnected": "Роз'єднаний", + "onion_only": "Тільки цибуля" } \ No newline at end of file diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index d0118d391..d1d78f58b 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -759,5 +759,6 @@ "start_tor_on_launch": "لانچ پر ٹور شروع کریں", "tor_status": "ٹور کی حیثیت", "connected": "منسلک", - "disconnected": "منقطع" + "disconnected": "منقطع", + "onion_only": "صرف پیاز" } \ No newline at end of file diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index afd4519b9..79ea502c2 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -761,5 +761,6 @@ "start_tor_on_launch": "Bẹrẹ tor lori ifilole", "tor_status": "Ipo Tor", "connected": "Sopọ", - "disconnected": "Ge asopọ" + "disconnected": "Ge asopọ", + "onion_only": "Alubosa nikan" } \ No newline at end of file diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 864e78b09..0c47be069 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -766,5 +766,6 @@ "start_tor_on_launch": "启动TOR发射", "tor_status": "TOR状态", "connected": "连接的", - "disconnected": "断开连接" + "disconnected": "断开连接", + "onion_only": "仅洋葱" } \ No newline at end of file