diff --git a/briar-android/src/net/sf/briar/android/AndroidModule.java b/briar-android/src/net/sf/briar/android/AndroidModule.java index e6beef53013f187b680ca2441dbc5fabe3c7abec..b13d5756f5b8bcef2781f25b774dc4078c4019b0 100644 --- a/briar-android/src/net/sf/briar/android/AndroidModule.java +++ b/briar-android/src/net/sf/briar/android/AndroidModule.java @@ -62,7 +62,7 @@ public class AndroidModule extends AbstractModule { pluginExecutor, androidExecutor, appContext, crypto.getSecureRandom()); DuplexPluginFactory tor = new TorPluginFactory(pluginExecutor, - appContext); + appContext, shutdownManager); DuplexPluginFactory lan = new LanTcpPluginFactory(pluginExecutor); DuplexPluginFactory wan = new WanTcpPluginFactory(pluginExecutor, shutdownManager); diff --git a/briar-core/src/net/sf/briar/plugins/tor/TorPlugin.java b/briar-core/src/net/sf/briar/plugins/tor/TorPlugin.java index 109f52df4e7de8fea23eadccb4d13be22c10f4b3..49ad18e6ad2047706b42e9c171251df56517f6a1 100644 --- a/briar-core/src/net/sf/briar/plugins/tor/TorPlugin.java +++ b/briar-core/src/net/sf/briar/plugins/tor/TorPlugin.java @@ -33,6 +33,7 @@ import net.sf.briar.api.TransportConfig; import net.sf.briar.api.TransportId; import net.sf.briar.api.TransportProperties; import net.sf.briar.api.crypto.PseudoRandom; +import net.sf.briar.api.lifecycle.ShutdownManager; import net.sf.briar.api.plugins.duplex.DuplexPlugin; import net.sf.briar.api.plugins.duplex.DuplexPluginCallback; import net.sf.briar.api.plugins.duplex.DuplexTransportConnection; @@ -61,6 +62,7 @@ class TorPlugin implements DuplexPlugin, EventHandler { private final Executor pluginExecutor; private final Context appContext; + private final ShutdownManager shutdownManager; private final DuplexPluginCallback callback; private final long maxLatency, pollingInterval; private final File torDirectory, torFile, geoIpFile, configFile, doneFile; @@ -71,10 +73,11 @@ class TorPlugin implements DuplexPlugin, EventHandler { private volatile ServerSocket socket = null; TorPlugin(Executor pluginExecutor, Context appContext, - DuplexPluginCallback callback, long maxLatency, - long pollingInterval) { + ShutdownManager shutdownManager, DuplexPluginCallback callback, + long maxLatency, long pollingInterval) { this.pluginExecutor = pluginExecutor; this.appContext = appContext; + this.shutdownManager = shutdownManager; this.callback = callback; this.maxLatency = maxLatency; this.pollingInterval = pollingInterval; @@ -135,6 +138,13 @@ class TorPlugin implements DuplexPlugin, EventHandler { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e1.toString(), e1); return false; } + // Create a shutdown hook to ensure the Tor process is destroyed + shutdownManager.addShutdownHook(new Runnable() { + public void run() { + if(LOG.isLoggable(INFO)) LOG.info("Killing Tor"); + tor.destroy(); + } + }); // Log the process's standard output until it detaches if(LOG.isLoggable(INFO)) { Scanner stdout = new Scanner(tor.getInputStream()); diff --git a/briar-core/src/net/sf/briar/plugins/tor/TorPluginFactory.java b/briar-core/src/net/sf/briar/plugins/tor/TorPluginFactory.java index 616b0e65c81a11d5ef789cc6093ec9945372cf69..59ca7c45254d29174a8638ae5bce21ed65b94763 100644 --- a/briar-core/src/net/sf/briar/plugins/tor/TorPluginFactory.java +++ b/briar-core/src/net/sf/briar/plugins/tor/TorPluginFactory.java @@ -3,6 +3,7 @@ package net.sf.briar.plugins.tor; import java.util.concurrent.Executor; import net.sf.briar.api.TransportId; +import net.sf.briar.api.lifecycle.ShutdownManager; import net.sf.briar.api.plugins.duplex.DuplexPlugin; import net.sf.briar.api.plugins.duplex.DuplexPluginCallback; import net.sf.briar.api.plugins.duplex.DuplexPluginFactory; @@ -15,10 +16,13 @@ public class TorPluginFactory implements DuplexPluginFactory { private final Executor pluginExecutor; private final Context appContext; + private final ShutdownManager shutdownManager; - public TorPluginFactory(Executor pluginExecutor, Context appContext) { + public TorPluginFactory(Executor pluginExecutor, Context appContext, + ShutdownManager shutdownManager) { this.pluginExecutor = pluginExecutor; this.appContext = appContext; + this.shutdownManager = shutdownManager; } public TransportId getId() { @@ -26,7 +30,7 @@ public class TorPluginFactory implements DuplexPluginFactory { } public DuplexPlugin createPlugin(DuplexPluginCallback callback) { - return new TorPlugin(pluginExecutor,appContext, callback, MAX_LATENCY, - POLLING_INTERVAL); + return new TorPlugin(pluginExecutor,appContext, shutdownManager, + callback, MAX_LATENCY, POLLING_INTERVAL); } }