CakeWallet/lib/utils/proxy_wrapper.dart

181 lines
4 KiB
Dart
Raw Normal View History

2025-01-16 08:22:52 +01:00
import 'dart:io';
import 'package:cake_wallet/store/settings_store.dart';
import 'package:socks5_proxy/socks.dart';
import 'package:tor/tor.dart';
2025-01-16 08:22:52 +01:00
class ProxyWrapper {
ProxyWrapper({
this.settingsStore,
});
SettingsStore? settingsStore;
int getPort() => Tor.instance.port;
2025-01-16 08:22:52 +01:00
HttpClient getProxyHttpClient({int? portOverride}) {
final torClient = HttpClient();
2025-01-16 08:22:52 +01:00
if (Tor.instance.started) {
2025-01-16 08:22:52 +01:00
// Assign connection factory.
SocksTCPClient.assignToHttpClient(torClient, [
2025-01-16 08:22:52 +01:00
ProxySettings(
InternetAddress.loopbackIPv4,
portOverride ?? getPort(),
2025-01-16 08:22:52 +01:00
password: null,
),
]);
}
return torClient;
2025-01-16 08:22:52 +01:00
}
Future<HttpClientResponse> makeGet({
required HttpClient client,
required Uri uri,
required Map<String, String>? headers,
}) async {
final request = await client.getUrl(uri);
if (headers != null) {
headers.forEach((key, value) {
request.headers.add(key, value);
});
}
return await request.close();
}
Future<HttpClientResponse> makePost({
required HttpClient client,
required Uri uri,
required Map<String, String>? headers,
}) async {
final request = await client.postUrl(uri);
if (headers != null) {
headers.forEach((key, value) {
request.headers.add(key, value);
});
}
return await request.close();
}
Future<HttpClientResponse> get({
Map<String, String>? headers,
int? portOverride,
Uri? clearnetUri,
Uri? onionUri,
}) async {
HttpClient? torClient;
bool torEnabled = Tor.instance.started;
2025-01-16 08:22:52 +01:00
if (Tor.instance.started) {
2025-01-16 08:22:52 +01:00
torEnabled = true;
} else {
torEnabled = false;
}
// if tor is enabled, try to connect to the onion url first:
if (torEnabled) {
try {
torClient = await getProxyHttpClient(portOverride: portOverride);
} catch (_) {}
if (onionUri != null) {
try {
return await makeGet(
client: torClient!,
uri: onionUri,
headers: headers,
);
} catch (_) {}
}
if (clearnetUri != null) {
try {
return await makeGet(
client: torClient!,
uri: clearnetUri,
headers: headers,
);
} catch (_) {}
}
}
if (clearnetUri != null) {
2025-01-16 08:22:52 +01:00
try {
return HttpOverrides.runZoned(
() async {
return await makeGet(
client: HttpClient(),
uri: clearnetUri,
headers: headers,
);
},
createHttpClient: NullOverrides().createHttpClient,
);
} catch (_) {
// we weren't able to get a response:
rethrow;
}
}
throw Exception("Unable to connect to server");
}
Future<HttpClientResponse> post({
Map<String, String>? headers,
int? portOverride,
Uri? clearnetUri,
Uri? onionUri,
}) async {
HttpClient? torClient;
bool torEnabled = Tor.instance.started;
2025-01-16 08:22:52 +01:00
if (torEnabled) {
try {
torClient = await getProxyHttpClient(portOverride: portOverride);
} catch (_) {}
if (onionUri != null) {
try {
return await makePost(
client: torClient!,
uri: onionUri,
headers: headers,
);
} catch (_) {}
}
if (clearnetUri != null) {
try {
return await makePost(
client: torClient!,
uri: clearnetUri,
headers: headers,
);
} catch (_) {}
}
}
if (clearnetUri != null) {
2025-01-16 08:22:52 +01:00
try {
return HttpOverrides.runZoned(
() async {
return await makePost(
client: HttpClient(),
uri: clearnetUri,
headers: headers,
);
},
createHttpClient: NullOverrides().createHttpClient,
);
} catch (_) {
// we weren't able to get a response:
rethrow;
}
}
throw Exception("Unable to connect to server");
}
}