From 68adcac9c284f9cea6b7d55e77908f1c3c7751de Mon Sep 17 00:00:00 2001 From: sneurlax Date: Wed, 30 Apr 2025 16:14:03 -0500 Subject: [PATCH] feat(monero): enable local monero nodes via a "Bypass TOR" node option chore: whitespace fix --- .../add_edit_node_view.dart | 48 ++++++++++++++++++- .../manage_nodes_views/node_details_view.dart | 4 +- .../intermediate/lib_monero_wallet.dart | 4 +- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart index 4fdeec183..5703db754 100644 --- a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart +++ b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart @@ -241,6 +241,8 @@ class _AddEditNodeViewState extends ConsumerState { final plainEnabled = formData.netOption == TorPlainNetworkOption.clear || formData.netOption == TorPlainNetworkOption.both; + + final forceNoTor = formData.forceNoTor ?? false; switch (viewType) { case AddEditNodeViewType.add: @@ -258,6 +260,7 @@ class _AddEditNodeViewState extends ConsumerState { isDown: false, torEnabled: torEnabled, clearnetEnabled: plainEnabled, + forceNoTor: forceNoTor, ); await ref @@ -285,6 +288,7 @@ class _AddEditNodeViewState extends ConsumerState { isDown: false, torEnabled: torEnabled, clearnetEnabled: plainEnabled, + forceNoTor: forceNoTor, ); await ref @@ -744,7 +748,7 @@ class _AddEditNodeViewState extends ConsumerState { class NodeFormData { String? name, host, login, password; int? port; - bool? useSSL, isFailover, trusted; + bool? useSSL, isFailover, trusted, forceNoTor; TorPlainNetworkOption? netOption; @override @@ -793,6 +797,7 @@ class _NodeFormState extends ConsumerState { bool _useSSL = false; bool _isFailover = false; bool _trusted = false; + bool _forceNoTor = false; int? port; late bool enableSSLCheckbox; late TorPlainNetworkOption netOption; @@ -851,6 +856,7 @@ class _NodeFormState extends ConsumerState { ref.read(nodeFormDataProvider).isFailover = _isFailover; ref.read(nodeFormDataProvider).trusted = _trusted; ref.read(nodeFormDataProvider).netOption = netOption; + ref.read(nodeFormDataProvider).forceNoTor = _forceNoTor; } @override @@ -885,6 +891,7 @@ class _NodeFormState extends ConsumerState { _useSSL = node.useSSL; _isFailover = node.isFailover; _trusted = node.trusted ?? false; + _forceNoTor = node.forceNoTor ?? false; if (node.torEnabled && !node.clearnetEnabled) { netOption = TorPlainNetworkOption.tor; @@ -1445,9 +1452,48 @@ class _NodeFormState extends ConsumerState { ), ], ), + if (widget.coin is CryptonoteCurrency && _isLocalNode()) + const SizedBox(height: 8), + if (widget.coin is CryptonoteCurrency && _isLocalNode()) + Row( + children: [ + SizedBox( + width: 20, + height: 20, + child: Checkbox( + fillColor: + !widget.readOnly + ? null + : MaterialStateProperty.all( + Theme.of( + context, + ).extension()!.checkboxBGDisabled, + ), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + value: _forceNoTor, + onChanged: + !widget.readOnly + ? (newValue) { + setState(() { + _forceNoTor = newValue!; + }); + _updateState(); + } + : null, + ), + ), + const SizedBox(width: 12), + Text("Bypass TOR", style: STextStyles.itemSubtitle12(context)), + ], + ), ], ); } + + bool _isLocalNode() { + final host = _hostController.text.toLowerCase(); + return host.contains("127.0.0.1") || host.contains("localhost"); + } } class RadioTextButton extends StatelessWidget { diff --git a/lib/pages/settings_views/global_settings_view/manage_nodes_views/node_details_view.dart b/lib/pages/settings_views/global_settings_view/manage_nodes_views/node_details_view.dart index 56c87e5c4..572c7d7a2 100644 --- a/lib/pages/settings_views/global_settings_view/manage_nodes_views/node_details_view.dart +++ b/lib/pages/settings_views/global_settings_view/manage_nodes_views/node_details_view.dart @@ -320,7 +320,8 @@ class _NodeDetailsViewState extends ConsumerState { ..login = node.loginName ..port = node.port ..isFailover = node.isFailover - ..netOption = netOption; + ..netOption = netOption + ..forceNoTor = node.forceNoTor; nodeFormData.password = await node.getPassword( ref.read(secureStoreProvider), ); @@ -396,6 +397,7 @@ class _NodeDetailsViewState extends ConsumerState { TorPlainNetworkOption.clear || ref.read(nodeFormDataProvider).netOption == TorPlainNetworkOption.both, + forceNoTor: ref.read(nodeFormDataProvider).forceNoTor, ); await ref diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 55812fe19..b21f5884f 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -520,7 +520,7 @@ abstract class LibMoneroWallet trusted: node.trusted ?? false, useSSL: node.useSSL, socksProxyAddress: - proxy == null ? null : "${proxy.host.address}:${proxy.port}", + node.forceNoTor ? null : proxy == null ? null : "${proxy.host.address}:${proxy.port}", ); }); } else { @@ -531,7 +531,7 @@ abstract class LibMoneroWallet trusted: node.trusted ?? false, useSSL: node.useSSL, socksProxyAddress: - proxy == null ? null : "${proxy.host.address}:${proxy.port}", + node.forceNoTor ? null : proxy == null ? null : "${proxy.host.address}:${proxy.port}", ); } libMoneroWallet?.startSyncing();