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