mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-02-03 03:36:39 +00:00
[skipci] tor updates
This commit is contained in:
parent
2633f1e06f
commit
c67a6f0b6e
1 changed files with 97 additions and 6 deletions
|
@ -1,18 +1,20 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:cake_wallet/store/settings_store.dart';
|
||||
import 'package:cake_wallet/view_model/settings/tor_connection.dart';
|
||||
import 'package:socks5_proxy/socks.dart';
|
||||
import 'package:tor/tor.dart';
|
||||
|
||||
class ProxyWrapper {
|
||||
// Private constructor
|
||||
ProxyWrapper._privateConstructor();
|
||||
ProxyWrapper._privateConstructor(this.settingsStore);
|
||||
|
||||
// Static private instance of Tor
|
||||
static final ProxyWrapper _instance = ProxyWrapper._privateConstructor();
|
||||
|
||||
HttpClient? _client;
|
||||
final SettingsStore settingsStore;
|
||||
|
||||
bool started = false;
|
||||
HttpClient? _torClient;
|
||||
|
||||
// Factory method to get the singleton instance of TorSingleton
|
||||
static ProxyWrapper get instance => _instance;
|
||||
|
@ -21,15 +23,18 @@ class ProxyWrapper {
|
|||
|
||||
static bool get enabled => Tor.instance.enabled;
|
||||
|
||||
bool started = false;
|
||||
bool torEnabled = false;
|
||||
bool torOnly = false;
|
||||
|
||||
// Method to get or create the Tor instance
|
||||
Future<HttpClient> getProxyInstance({int? portOverride}) async {
|
||||
if (!started) {
|
||||
started = true;
|
||||
_client = HttpClient();
|
||||
_torClient = HttpClient();
|
||||
|
||||
// Assign connection factory.
|
||||
SocksTCPClient.assignToHttpClient(_client!, [
|
||||
SocksTCPClient.assignToHttpClient(_torClient!, [
|
||||
ProxySettings(
|
||||
InternetAddress.loopbackIPv4,
|
||||
portOverride ?? Tor.instance.port,
|
||||
|
@ -37,6 +42,92 @@ class ProxyWrapper {
|
|||
),
|
||||
]);
|
||||
}
|
||||
return _client!;
|
||||
|
||||
return _torClient!;
|
||||
}
|
||||
|
||||
Future<HttpClientResponse> get(Uri uri, {Map<String, String>? headers, int? portOverride}) async {
|
||||
HttpClient? client;
|
||||
if (settingsStore.torConnectionMode == TorConnectionMode.onionOnly ||
|
||||
settingsStore.torConnectionMode == TorConnectionMode.enabled) {
|
||||
client = await getProxyInstance(portOverride: portOverride);
|
||||
} else {
|
||||
client = HttpClient();
|
||||
}
|
||||
|
||||
if (settingsStore.torConnectionMode == TorConnectionMode.onionOnly) {
|
||||
if (!uri.path.contains(".onion")) {
|
||||
throw Exception("Cannot connect to clearnet");
|
||||
}
|
||||
}
|
||||
|
||||
HttpClientResponse? response;
|
||||
|
||||
try {
|
||||
final request = await client.getUrl(uri);
|
||||
if (headers != null) {
|
||||
headers.forEach((key, value) {
|
||||
request.headers.add(key, value);
|
||||
});
|
||||
}
|
||||
response = await request.close();
|
||||
} catch (e) {
|
||||
if (!torOnly && torEnabled) {
|
||||
// try again without tor:
|
||||
client = HttpClient();
|
||||
final request = await client.getUrl(uri);
|
||||
if (headers != null) {
|
||||
headers.forEach((key, value) {
|
||||
request.headers.add(key, value);
|
||||
});
|
||||
}
|
||||
response = await request.close();
|
||||
}
|
||||
}
|
||||
|
||||
return response!;
|
||||
}
|
||||
|
||||
Future<HttpClientResponse> post(Uri uri,
|
||||
{Map<String, String>? headers, int? portOverride}) async {
|
||||
HttpClient? client;
|
||||
if (settingsStore.torConnectionMode == TorConnectionMode.onionOnly ||
|
||||
settingsStore.torConnectionMode == TorConnectionMode.enabled) {
|
||||
client = await getProxyInstance(portOverride: portOverride);
|
||||
} else {
|
||||
client = HttpClient();
|
||||
}
|
||||
|
||||
if (settingsStore.torConnectionMode == TorConnectionMode.onionOnly) {
|
||||
if (!uri.path.contains(".onion")) {
|
||||
throw Exception("Cannot connect to clearnet");
|
||||
}
|
||||
}
|
||||
|
||||
HttpClientResponse? response;
|
||||
|
||||
try {
|
||||
final request = await client.postUrl(uri);
|
||||
if (headers != null) {
|
||||
headers.forEach((key, value) {
|
||||
request.headers.add(key, value);
|
||||
});
|
||||
}
|
||||
response = await request.close();
|
||||
} catch (e) {
|
||||
if (!torOnly && torEnabled) {
|
||||
// try again without tor:
|
||||
client = HttpClient();
|
||||
final request = await client.postUrl(uri);
|
||||
if (headers != null) {
|
||||
headers.forEach((key, value) {
|
||||
request.headers.add(key, value);
|
||||
});
|
||||
}
|
||||
response = await request.close();
|
||||
}
|
||||
}
|
||||
|
||||
return response!;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue