From b8a9863a216286b9fbcb14b5d2d79a71c45a1592 Mon Sep 17 00:00:00 2001 From: cyan Date: Tue, 12 Aug 2025 18:00:39 -0400 Subject: [PATCH] feat: CakeTorSocks respect SOCKS_SERVER (#2444) --- cw_core/lib/utils/proxy_wrapper.dart | 2 +- cw_core/lib/utils/tor/abstract.dart | 28 +++++++++++++++++-- cw_core/lib/utils/tor/android.dart | 13 +++++++++ cw_core/lib/utils/tor/disabled.dart | 12 ++++++++ .../lib/utils/tor/{tails.dart => socks.dart} | 17 +++++++++-- lib/src/screens/dev/network_requests.dart | 11 ++++++++ lib/utils/feature_flag.dart | 5 ++-- lib/utils/tor.dart | 1 + 8 files changed, 82 insertions(+), 7 deletions(-) rename cw_core/lib/utils/tor/{tails.dart => socks.dart} (52%) diff --git a/cw_core/lib/utils/proxy_wrapper.dart b/cw_core/lib/utils/proxy_wrapper.dart index e43f34ff1..5a838818b 100644 --- a/cw_core/lib/utils/proxy_wrapper.dart +++ b/cw_core/lib/utils/proxy_wrapper.dart @@ -100,7 +100,7 @@ class ProxyWrapper { try { switch (method) { case RequestMethod.get: - resp = await client. get( + resp = await client.get( uri, headers: headers, ); diff --git a/cw_core/lib/utils/tor/abstract.dart b/cw_core/lib/utils/tor/abstract.dart index aaecabc56..aeaf37cae 100644 --- a/cw_core/lib/utils/tor/abstract.dart +++ b/cw_core/lib/utils/tor/abstract.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/utils/tor/android.dart'; import 'package:cw_core/utils/tor/disabled.dart'; -import 'package:cw_core/utils/tor/tails.dart'; +import 'package:cw_core/utils/tor/socks.dart'; abstract class CakeTorInstance { bool get started; @@ -23,11 +23,24 @@ abstract class CakeTorInstance { } if (Platform.isLinux) { try { + String? socksServer; + if (Platform.environment["SOCKS_SERVER"] != null) { + socksServer = Platform.environment["SOCKS_SERVER"]!; + } + if (Platform.environment["SOCKS_PROXY"] != null) { + socksServer = Platform.environment["SOCKS_PROXY"]!; + } + if (socksServer != null) { + final uri = Uri.tryParse(socksServer); + if (uri != null) { + return CakeTorSocks(uri.port); + } + } final os = File("/etc/os-release").readAsLinesSync(); for (var line in os) { if (!line.startsWith("ID=")) continue; if (!line.contains("tails")) continue; - return CakeTorTails(); + return CakeTorSocks(9150); } } catch (e) { printV("Failed to identify linux version - /etc/os-release missing"); @@ -35,4 +48,15 @@ abstract class CakeTorInstance { } return CakeTorDisabled(); } + + String toString() { + return """ +CakeTorInstance( + port: $port, + started: $started, + bootstrapped: $bootstrapped, + enabled: $enabled, +) +"""; + } } \ No newline at end of file diff --git a/cw_core/lib/utils/tor/android.dart b/cw_core/lib/utils/tor/android.dart index dfc1bfbe4..ead0a015e 100644 --- a/cw_core/lib/utils/tor/android.dart +++ b/cw_core/lib/utils/tor/android.dart @@ -70,4 +70,17 @@ DataDirectory ${p.join(dir.path, "tor-data")} _proc?.stdout.transform(utf8.decoder).forEach(printV); _proc?.stderr.transform(utf8.decoder).forEach(printV); } + + @override + String toString() { + return """ +CakeTorAndroid( + port: $port, + started: $started, + bootstrapped: $bootstrapped, + enabled: $enabled, + proc: $_proc, +) +"""; + } } \ No newline at end of file diff --git a/cw_core/lib/utils/tor/disabled.dart b/cw_core/lib/utils/tor/disabled.dart index 8bd3d837e..88a23ce20 100644 --- a/cw_core/lib/utils/tor/disabled.dart +++ b/cw_core/lib/utils/tor/disabled.dart @@ -18,4 +18,16 @@ class CakeTorDisabled implements CakeTorInstance { @override Future stop() => throw UnimplementedError(); + + @override + String toString() { + return """ +CakeTorDisabled( + port: $port, + started: $started, + bootstrapped: $bootstrapped, + enabled: $enabled, +) +"""; + } } \ No newline at end of file diff --git a/cw_core/lib/utils/tor/tails.dart b/cw_core/lib/utils/tor/socks.dart similarity index 52% rename from cw_core/lib/utils/tor/tails.dart rename to cw_core/lib/utils/tor/socks.dart index c37ee72aa..3e01a6018 100644 --- a/cw_core/lib/utils/tor/tails.dart +++ b/cw_core/lib/utils/tor/socks.dart @@ -1,6 +1,7 @@ import 'package:cw_core/utils/tor/abstract.dart'; -class CakeTorTails implements CakeTorInstance { +class CakeTorSocks implements CakeTorInstance { + CakeTorSocks(this.port); @override bool get bootstrapped => true; @@ -8,7 +9,7 @@ class CakeTorTails implements CakeTorInstance { bool get enabled => true; @override - int get port => 9150; + int port; @override Future start() async {} @@ -18,4 +19,16 @@ class CakeTorTails implements CakeTorInstance { @override Future stop() async {} + + @override + String toString() { + return """ +CakeTorSocks( + port: $port, + started: $started, + bootstrapped: $bootstrapped, + enabled: $enabled, +) +"""; + } } \ No newline at end of file diff --git a/lib/src/screens/dev/network_requests.dart b/lib/src/screens/dev/network_requests.dart index 912c79da7..1aec76bd4 100644 --- a/lib/src/screens/dev/network_requests.dart +++ b/lib/src/screens/dev/network_requests.dart @@ -5,8 +5,11 @@ import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/view_model/dev/network_requests_view_model.dart'; import 'package:cw_core/utils/proxy_logger/abstract.dart'; import 'package:cw_core/utils/proxy_logger/memory_proxy_logger.dart'; +import 'package:cw_core/utils/proxy_wrapper.dart'; +import 'package:cw_core/utils/tor/abstract.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:on_chain/solana/solana.dart'; class DevNetworkRequests extends BasePage { final NetworkRequestsViewModel viewModel = NetworkRequestsViewModel(); @@ -120,6 +123,14 @@ class DevRequestDetails extends BasePage { _sectionTitle("Network"), SelectableText(req.network.toString()), + if (req.network == RequestNetwork.tor) + ...[ + _sectionTitle("Tor socks server"), + SelectableText(CakeTor.instance.runtimeType.toString()), + _sectionTitle("Tor socks details"), + SelectableText(CakeTor.instance.toString()), + ], + _sectionTitle("Body (as UTF-8)"), SelectableText(_tryDecodeBody(req.body)), diff --git a/lib/utils/feature_flag.dart b/lib/utils/feature_flag.dart index 8b2dc94dd..3dacd5fe1 100644 --- a/lib/utils/feature_flag.dart +++ b/lib/utils/feature_flag.dart @@ -1,12 +1,13 @@ +import 'package:cw_core/utils/proxy_wrapper.dart'; +import 'package:cw_core/utils/tor/disabled.dart'; import 'package:flutter/foundation.dart'; -import 'dart:io'; class FeatureFlag { static const bool isCakePayEnabled = false; static const bool isCakePayRedemptionFlowEnabled = false; static const bool isExolixEnabled = true; static const bool isBackgroundSyncEnabled = true; - static final bool isInAppTorEnabled = (Platform.isAndroid); + static final bool isInAppTorEnabled = CakeTor.instance is! CakeTorDisabled; static const int verificationWordsCount = kDebugMode ? 0 : 2; static const bool hasDevOptions = bool.fromEnvironment('hasDevOptions', defaultValue: kDebugMode); static const bool hasBitcoinViewOnly = true; diff --git a/lib/utils/tor.dart b/lib/utils/tor.dart index 233e998eb..72b72334a 100644 --- a/lib/utils/tor.dart +++ b/lib/utils/tor.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io'; import 'package:cw_core/utils/proxy_wrapper.dart'; import 'package:cw_core/utils/print_verbose.dart';