Craig Raw
4 years ago
17 changed files with 190 additions and 19 deletions
@ -0,0 +1,13 @@ |
|||||
|
package com.sparrowwallet.sparrow.event; |
||||
|
|
||||
|
public class TorStatusEvent { |
||||
|
private final String status; |
||||
|
|
||||
|
public TorStatusEvent(String status) { |
||||
|
this.status = status; |
||||
|
} |
||||
|
|
||||
|
public String getStatus() { |
||||
|
return status; |
||||
|
} |
||||
|
} |
@ -0,0 +1,49 @@ |
|||||
|
package com.sparrowwallet.sparrow.net; |
||||
|
|
||||
|
import com.google.common.net.HostAndPort; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
|
||||
|
import javax.net.ssl.SSLSocket; |
||||
|
import java.io.File; |
||||
|
import java.io.IOException; |
||||
|
import java.lang.reflect.Field; |
||||
|
import java.net.Socket; |
||||
|
import java.security.KeyManagementException; |
||||
|
import java.security.KeyStoreException; |
||||
|
import java.security.NoSuchAlgorithmException; |
||||
|
import java.security.cert.CertificateException; |
||||
|
|
||||
|
public class TorTcpOverTlsTransport extends TcpOverTlsTransport { |
||||
|
private static final Logger log = LoggerFactory.getLogger(TorTcpOverTlsTransport.class); |
||||
|
|
||||
|
public TorTcpOverTlsTransport(HostAndPort server) throws NoSuchAlgorithmException, KeyManagementException { |
||||
|
super(server); |
||||
|
} |
||||
|
|
||||
|
public TorTcpOverTlsTransport(HostAndPort server, File crtFile) throws IOException, CertificateException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException { |
||||
|
super(server, crtFile); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected Socket createSocket() throws IOException { |
||||
|
TorTcpTransport torTcpTransport = new TorTcpTransport(server); |
||||
|
Socket socket = torTcpTransport.createSocket(); |
||||
|
|
||||
|
try { |
||||
|
Field socketField = socket.getClass().getDeclaredField("socket"); |
||||
|
socketField.setAccessible(true); |
||||
|
Socket innerSocket = (Socket)socketField.get(socket); |
||||
|
Field connectedField = innerSocket.getClass().getSuperclass().getDeclaredField("connected"); |
||||
|
connectedField.setAccessible(true); |
||||
|
connectedField.set(innerSocket, true); |
||||
|
} catch(Exception e) { |
||||
|
log.error("Could not set socket connected status", e); |
||||
|
} |
||||
|
|
||||
|
SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket(socket, server.getHost(), server.getPortOrDefault(DEFAULT_PORT), true); |
||||
|
sslSocket.startHandshake(); |
||||
|
|
||||
|
return sslSocket; |
||||
|
} |
||||
|
} |
@ -0,0 +1,55 @@ |
|||||
|
package com.sparrowwallet.sparrow.net; |
||||
|
|
||||
|
import com.google.common.net.HostAndPort; |
||||
|
import com.sparrowwallet.sparrow.EventManager; |
||||
|
import com.sparrowwallet.sparrow.event.StatusEvent; |
||||
|
import com.sparrowwallet.sparrow.event.TorStatusEvent; |
||||
|
import javafx.application.Platform; |
||||
|
import org.berndpruenster.netlayer.tor.*; |
||||
|
|
||||
|
import java.io.*; |
||||
|
import java.net.Socket; |
||||
|
import java.nio.file.Files; |
||||
|
import java.nio.file.Path; |
||||
|
import java.util.Collections; |
||||
|
import java.util.LinkedHashMap; |
||||
|
|
||||
|
public class TorTcpTransport extends TcpTransport { |
||||
|
public static final String TOR_DIR_PREFIX = "tor"; |
||||
|
|
||||
|
public TorTcpTransport(HostAndPort server) { |
||||
|
super(server); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected Socket createSocket() throws IOException { |
||||
|
if(Tor.getDefault() == null) { |
||||
|
Platform.runLater(() -> { |
||||
|
String status = "Starting Tor..."; |
||||
|
EventManager.get().post(new TorStatusEvent(status)); |
||||
|
}); |
||||
|
|
||||
|
Path path = Files.createTempDirectory(TOR_DIR_PREFIX); |
||||
|
File torInstallDir = path.toFile(); |
||||
|
torInstallDir.deleteOnExit(); |
||||
|
try { |
||||
|
LinkedHashMap<String, String> torrcOptionsMap = new LinkedHashMap<>(); |
||||
|
torrcOptionsMap.put("DisableNetwork", "0"); |
||||
|
Torrc override = new Torrc(torrcOptionsMap); |
||||
|
|
||||
|
NativeTor nativeTor = new NativeTor(torInstallDir, Collections.emptyList(), override); |
||||
|
Tor.setDefault(nativeTor); |
||||
|
} catch(TorCtlException e) { |
||||
|
e.printStackTrace(); |
||||
|
throw new IOException(e); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Platform.runLater(() -> { |
||||
|
String status = "Tor running, connecting to " + server.toString() + "..."; |
||||
|
EventManager.get().post(new TorStatusEvent(status)); |
||||
|
}); |
||||
|
|
||||
|
return new TorSocket(server.getHost(), server.getPort(), "sparrow"); |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue