mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-05-06 16:45:07 -04:00
direct bind tor node uses configured socks5 proxy
This commit is contained in:
parent
998b893cc3
commit
48501a6572
2 changed files with 11 additions and 7 deletions
|
@ -22,6 +22,7 @@ import com.google.inject.Provider;
|
||||||
import com.google.inject.name.Named;
|
import com.google.inject.name.Named;
|
||||||
import haveno.common.config.Config;
|
import haveno.common.config.Config;
|
||||||
import haveno.common.proto.network.NetworkProtoResolver;
|
import haveno.common.proto.network.NetworkProtoResolver;
|
||||||
|
import haveno.network.Socks5ProxyProvider;
|
||||||
import haveno.network.p2p.network.BanFilter;
|
import haveno.network.p2p.network.BanFilter;
|
||||||
import haveno.network.p2p.network.BridgeAddressProvider;
|
import haveno.network.p2p.network.BridgeAddressProvider;
|
||||||
import haveno.network.p2p.network.LocalhostNetworkNode;
|
import haveno.network.p2p.network.LocalhostNetworkNode;
|
||||||
|
@ -55,7 +56,8 @@ public class NetworkNodeProvider implements Provider<NetworkNode> {
|
||||||
@Named(Config.TOR_CONTROL_PASSWORD) String password,
|
@Named(Config.TOR_CONTROL_PASSWORD) String password,
|
||||||
@Nullable @Named(Config.TOR_CONTROL_COOKIE_FILE) File cookieFile,
|
@Nullable @Named(Config.TOR_CONTROL_COOKIE_FILE) File cookieFile,
|
||||||
@Named(Config.TOR_STREAM_ISOLATION) boolean streamIsolation,
|
@Named(Config.TOR_STREAM_ISOLATION) boolean streamIsolation,
|
||||||
@Named(Config.TOR_CONTROL_USE_SAFE_COOKIE_AUTH) boolean useSafeCookieAuthentication) {
|
@Named(Config.TOR_CONTROL_USE_SAFE_COOKIE_AUTH) boolean useSafeCookieAuthentication,
|
||||||
|
Socks5ProxyProvider socks5ProxyProvider) {
|
||||||
if (useLocalhostForP2P) {
|
if (useLocalhostForP2P) {
|
||||||
networkNode = new LocalhostNetworkNode(port, networkProtoResolver, banFilter, maxConnections);
|
networkNode = new LocalhostNetworkNode(port, networkProtoResolver, banFilter, maxConnections);
|
||||||
} else {
|
} else {
|
||||||
|
@ -72,7 +74,7 @@ public class NetworkNodeProvider implements Provider<NetworkNode> {
|
||||||
if (torMode instanceof NewTor || torMode instanceof RunningTor) {
|
if (torMode instanceof NewTor || torMode instanceof RunningTor) {
|
||||||
networkNode = new TorNetworkNodeNetlayer(port, networkProtoResolver, torMode, banFilter, maxConnections, streamIsolation, controlHost);
|
networkNode = new TorNetworkNodeNetlayer(port, networkProtoResolver, torMode, banFilter, maxConnections, streamIsolation, controlHost);
|
||||||
} else {
|
} else {
|
||||||
networkNode = new TorNetworkNodeDirectBind(port, networkProtoResolver, banFilter, maxConnections, hiddenServiceAddress);
|
networkNode = new TorNetworkNodeDirectBind(port, networkProtoResolver, banFilter, maxConnections, hiddenServiceAddress, socks5ProxyProvider);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package haveno.network.p2p.network;
|
package haveno.network.p2p.network;
|
||||||
|
|
||||||
import haveno.common.util.Hex;
|
import haveno.common.util.Hex;
|
||||||
|
import haveno.network.Socks5ProxyProvider;
|
||||||
import haveno.network.p2p.NodeAddress;
|
import haveno.network.p2p.NodeAddress;
|
||||||
|
|
||||||
import haveno.common.UserThread;
|
import haveno.common.UserThread;
|
||||||
|
@ -9,7 +10,6 @@ import haveno.common.proto.network.NetworkProtoResolver;
|
||||||
import com.runjva.sourceforge.jsocks.protocol.Socks5Proxy;
|
import com.runjva.sourceforge.jsocks.protocol.Socks5Proxy;
|
||||||
|
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.net.InetAddress;
|
|
||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -25,16 +25,18 @@ import static com.google.common.base.Preconditions.checkArgument;
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class TorNetworkNodeDirectBind extends TorNetworkNode {
|
public class TorNetworkNodeDirectBind extends TorNetworkNode {
|
||||||
|
|
||||||
private static final int TOR_DATA_PORT = 9050; // TODO: config option?
|
|
||||||
private final String serviceAddress;
|
private final String serviceAddress;
|
||||||
|
private final Socks5ProxyProvider socks5ProxyProvider;
|
||||||
|
|
||||||
public TorNetworkNodeDirectBind(int servicePort,
|
public TorNetworkNodeDirectBind(int servicePort,
|
||||||
NetworkProtoResolver networkProtoResolver,
|
NetworkProtoResolver networkProtoResolver,
|
||||||
@Nullable BanFilter banFilter,
|
@Nullable BanFilter banFilter,
|
||||||
int maxConnections,
|
int maxConnections,
|
||||||
String hiddenServiceAddress) {
|
String hiddenServiceAddress,
|
||||||
|
Socks5ProxyProvider socks5ProxyProvider) {
|
||||||
super(servicePort, networkProtoResolver, banFilter, maxConnections);
|
super(servicePort, networkProtoResolver, banFilter, maxConnections);
|
||||||
this.serviceAddress = hiddenServiceAddress;
|
this.serviceAddress = hiddenServiceAddress;
|
||||||
|
this.socks5ProxyProvider = socks5ProxyProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -47,7 +49,7 @@ public class TorNetworkNodeDirectBind extends TorNetworkNode {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Socks5Proxy getSocksProxy() {
|
public Socks5Proxy getSocksProxy() {
|
||||||
Socks5Proxy proxy = new Socks5Proxy(InetAddress.getLoopbackAddress(), TOR_DATA_PORT);
|
Socks5Proxy proxy = new Socks5Proxy(socks5ProxyProvider.getSocks5Proxy().getInetAddress(), socks5ProxyProvider.getSocks5Proxy().getPort()); // TODO: can/should we return the same socks5 proxy directly?
|
||||||
proxy.resolveAddrLocally(false);
|
proxy.resolveAddrLocally(false);
|
||||||
return proxy;
|
return proxy;
|
||||||
}
|
}
|
||||||
|
@ -57,7 +59,7 @@ public class TorNetworkNodeDirectBind extends TorNetworkNode {
|
||||||
// https://datatracker.ietf.org/doc/html/rfc1928 SOCKS5 Protocol
|
// https://datatracker.ietf.org/doc/html/rfc1928 SOCKS5 Protocol
|
||||||
try {
|
try {
|
||||||
checkArgument(peerNodeAddress.getHostName().endsWith(".onion"), "PeerAddress is not an onion address");
|
checkArgument(peerNodeAddress.getHostName().endsWith(".onion"), "PeerAddress is not an onion address");
|
||||||
Socket sock = new Socket(InetAddress.getLoopbackAddress(), TOR_DATA_PORT);
|
Socket sock = new Socket(getSocksProxy().getInetAddress(), getSocksProxy().getPort());
|
||||||
sock.getOutputStream().write(Hex.decode("050100"));
|
sock.getOutputStream().write(Hex.decode("050100"));
|
||||||
String response = Hex.encode(sock.getInputStream().readNBytes(2));
|
String response = Hex.encode(sock.getInputStream().readNBytes(2));
|
||||||
if (!response.equalsIgnoreCase("0500")) {
|
if (!response.equalsIgnoreCase("0500")) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue