WIP monero test onion node

works sometimes but fails most of the time, ffs
This commit is contained in:
sneurlax 2024-06-22 19:30:24 -05:00
parent c2d0812025
commit fd3bac27eb

View file

@ -13,6 +13,7 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:socks5_proxy/socks.dart'; import 'package:socks5_proxy/socks.dart';
import 'package:tor_ffi_plugin/socks_socket.dart';
import '../widgets/desktop/primary_button.dart'; import '../widgets/desktop/primary_button.dart';
import '../widgets/desktop/secondary_button.dart'; import '../widgets/desktop/secondary_button.dart';
@ -64,34 +65,79 @@ Future<MoneroNodeConnectionResponse> testMoneroNodeConnection(
return false; return false;
}; };
final request = await httpClient.postUrl(uri); if (!uri.host.endsWith('.onion')) {
final request = await httpClient.postUrl(uri);
final body = utf8.encode( final body = utf8.encode(
jsonEncode({ jsonEncode({
"jsonrpc": "2.0", "jsonrpc": "2.0",
"id": "0", "id": "0",
"method": "get_info", "method": "get_info",
}), }),
); );
request.headers.add( request.headers.add(
'Content-Length', 'Content-Length',
body.length.toString(), body.length.toString(),
preserveHeaderCase: true, preserveHeaderCase: true,
); );
request.headers.set( request.headers.set(
'Content-Type', 'Content-Type',
'application/json', 'application/json',
preserveHeaderCase: true, preserveHeaderCase: true,
); );
request.add(body); request.add(body);
final response = await request.close(); final response = await request.close();
final result = await response.transform(utf8.decoder).join(); final result = await response.transform(utf8.decoder).join();
// TODO: json decoded without error so assume connection exists? // TODO: json decoded without error so assume connection exists?
// or we can check for certain values in the response to decide // or we can check for certain values in the response to decide
return MoneroNodeConnectionResponse(null, null, null, true); return MoneroNodeConnectionResponse(null, null, null, true);
} else {
// If the URL ends in .onion, we can't use an httpClient to connect to it.
//
// The SOCKSSocket class from the tor_ffi_plugin package can be used to
// connect to .onion addresses. We'll do the same things as above but
// with SOCKSSocket instead of httpClient.
final socket = await SOCKSSocket.create(
proxyHost: proxyInfo!.host.address,
proxyPort: proxyInfo.port,
sslEnabled: false,
);
await socket.connect();
await socket.connectTo(uri.host, uri.port);
final body = utf8.encode(
jsonEncode({
"jsonrpc": "2.0",
"id": "0",
"method": "get_info",
}),
);
// Write the request body to the socket.
socket.write(body);
// Read the response.
final response = await socket.inputStream.first;
final result = utf8.decode(response);
// Close the socket.
await socket.close();
return MoneroNodeConnectionResponse(null, null, null, true);
// Parse the response.
//
// This is commented because any issues should throw.
// final Map<String, dynamic> jsonResponse = jsonDecode(result);
// print(jsonResponse);
// if (jsonResponse.containsKey('result')) {
// return MoneroNodeConnectionResponse(null, null, null, true);
// } else {
// return MoneroNodeConnectionResponse(null, null, null, false);
// }
}
} catch (e, s) { } catch (e, s) {
if (badCertResponse != null) { if (badCertResponse != null) {
return badCertResponse!; return badCertResponse!;