From d2f25f2ebeb12bd598fd4a2be770fd9afcc4e416 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 6 May 2022 14:46:50 +0100 Subject: [PATCH] Refactor Tor plugin factories. --- .../plugin/tor/AndroidTorPluginFactory.java | 114 ++++----------- .../bramble/plugin/tor/TorPluginFactory.java | 134 ++++++++++++++++++ .../plugin/tor/UnixTorPluginFactory.java | 110 +++----------- .../bramble/plugin/tor/BridgeTest.java | 4 +- 4 files changed, 184 insertions(+), 178 deletions(-) create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPluginFactory.java diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java index 4479d491d..ce0e2675b 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java @@ -11,62 +11,35 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.Backoff; import org.briarproject.bramble.api.plugin.BackoffFactory; import org.briarproject.bramble.api.plugin.PluginCallback; -import org.briarproject.bramble.api.plugin.TorConstants; import org.briarproject.bramble.api.plugin.TorControlPort; import org.briarproject.bramble.api.plugin.TorDirectory; import org.briarproject.bramble.api.plugin.TorSocksPort; -import org.briarproject.bramble.api.plugin.TransportId; -import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; -import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; import org.briarproject.bramble.api.system.AndroidWakeLockManager; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.LocationUtils; import org.briarproject.bramble.api.system.ResourceProvider; import org.briarproject.bramble.api.system.WakefulIoExecutor; -import org.briarproject.bramble.util.AndroidUtils; import java.io.File; import java.util.concurrent.Executor; -import java.util.logging.Logger; +import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; import javax.net.SocketFactory; +import static org.briarproject.bramble.util.AndroidUtils.getSupportedArchitectures; + @Immutable @NotNullByDefault -public class AndroidTorPluginFactory implements DuplexPluginFactory { +public class AndroidTorPluginFactory extends TorPluginFactory { - private static final Logger LOG = - Logger.getLogger(AndroidTorPluginFactory.class.getName()); - - private static final int MAX_LATENCY = 30 * 1000; // 30 seconds - private static final int MAX_IDLE_TIME = 30 * 1000; // 30 seconds - private static final int MIN_POLLING_INTERVAL = 60 * 1000; // 1 minute - private static final int MAX_POLLING_INTERVAL = 10 * 60 * 1000; // 10 mins - private static final double BACKOFF_BASE = 1.2; - - private final Executor ioExecutor, wakefulIoExecutor; private final Application app; - private final NetworkManager networkManager; - private final LocationUtils locationUtils; - private final EventBus eventBus; - private final SocketFactory torSocketFactory; - private final BackoffFactory backoffFactory; - private final ResourceProvider resourceProvider; - private final CircumventionProvider circumventionProvider; - private final BatteryManager batteryManager; private final AndroidWakeLockManager wakeLockManager; - private final Clock clock; - private final File torDirectory; - private int torSocksPort; - private int torControlPort; - private final CryptoComponent crypto; @Inject AndroidTorPluginFactory(@IoExecutor Executor ioExecutor, @WakefulIoExecutor Executor wakefulIoExecutor, - Application app, NetworkManager networkManager, LocationUtils locationUtils, EventBus eventBus, @@ -75,80 +48,43 @@ public class AndroidTorPluginFactory implements DuplexPluginFactory { ResourceProvider resourceProvider, CircumventionProvider circumventionProvider, BatteryManager batteryManager, - AndroidWakeLockManager wakeLockManager, Clock clock, + CryptoComponent crypto, @TorDirectory File torDirectory, @TorSocksPort int torSocksPort, @TorControlPort int torControlPort, - CryptoComponent crypto) { - this.ioExecutor = ioExecutor; - this.wakefulIoExecutor = wakefulIoExecutor; + Application app, + AndroidWakeLockManager wakeLockManager) { + super(ioExecutor, wakefulIoExecutor, networkManager, locationUtils, + eventBus, torSocketFactory, backoffFactory, resourceProvider, + circumventionProvider, batteryManager, clock, crypto, + torDirectory, torSocksPort, torControlPort); this.app = app; - this.networkManager = networkManager; - this.locationUtils = locationUtils; - this.eventBus = eventBus; - this.torSocketFactory = torSocketFactory; - this.backoffFactory = backoffFactory; - this.resourceProvider = resourceProvider; - this.circumventionProvider = circumventionProvider; - this.batteryManager = batteryManager; this.wakeLockManager = wakeLockManager; - this.clock = clock; - this.torDirectory = torDirectory; - this.torSocksPort = torSocksPort; - this.torControlPort = torControlPort; - this.crypto = crypto; } + @Nullable @Override - public TransportId getId() { - return TorConstants.ID; - } - - @Override - public long getMaxLatency() { - return MAX_LATENCY; - } - - @Override - public DuplexPlugin createPlugin(PluginCallback callback) { - - // Check that we have a Tor binary for this architecture - String architecture = null; - for (String abi : AndroidUtils.getSupportedArchitectures()) { - if (abi.startsWith("x86_64")) { - architecture = "x86_64"; - break; - } else if (abi.startsWith("x86")) { - architecture = "x86"; - break; - } else if (abi.startsWith("arm64")) { - architecture = "arm64"; - break; - } else if (abi.startsWith("armeabi")) { - architecture = "arm"; - break; - } + String getArchitectureForTorBinary() { + for (String abi : getSupportedArchitectures()) { + if (abi.startsWith("x86_64")) return "x86_64_pie"; + else if (abi.startsWith("x86")) return "x86_pie"; + else if (abi.startsWith("arm64")) return "arm64_pie"; + else if (abi.startsWith("armeabi")) return "arm_pie"; } - if (architecture == null) { - LOG.info("Tor is not supported on this architecture"); - return null; - } - // Use position-independent executable - architecture += "_pie"; + return null; + } - Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, - MAX_POLLING_INTERVAL, BACKOFF_BASE); - TorRendezvousCrypto torRendezvousCrypto = - new TorRendezvousCryptoImpl(crypto); - AndroidTorPlugin plugin = new AndroidTorPlugin(ioExecutor, + @Override + TorPlugin createPluginInstance(Backoff backoff, + TorRendezvousCrypto torRendezvousCrypto, PluginCallback callback, + String architecture) { + return new AndroidTorPlugin(ioExecutor, wakefulIoExecutor, app, networkManager, locationUtils, torSocketFactory, clock, resourceProvider, circumventionProvider, batteryManager, wakeLockManager, backoff, torRendezvousCrypto, callback, architecture, MAX_LATENCY, MAX_IDLE_TIME, torDirectory, torSocksPort, torControlPort); - eventBus.addListener(plugin); - return plugin; } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPluginFactory.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPluginFactory.java new file mode 100644 index 000000000..a22165151 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPluginFactory.java @@ -0,0 +1,134 @@ +package org.briarproject.bramble.plugin.tor; + +import org.briarproject.bramble.api.battery.BatteryManager; +import org.briarproject.bramble.api.crypto.CryptoComponent; +import org.briarproject.bramble.api.event.EventBus; +import org.briarproject.bramble.api.lifecycle.IoExecutor; +import org.briarproject.bramble.api.network.NetworkManager; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.Backoff; +import org.briarproject.bramble.api.plugin.BackoffFactory; +import org.briarproject.bramble.api.plugin.PluginCallback; +import org.briarproject.bramble.api.plugin.TorConstants; +import org.briarproject.bramble.api.plugin.TorControlPort; +import org.briarproject.bramble.api.plugin.TorDirectory; +import org.briarproject.bramble.api.plugin.TorSocksPort; +import org.briarproject.bramble.api.plugin.TransportId; +import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; +import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; +import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.system.LocationUtils; +import org.briarproject.bramble.api.system.ResourceProvider; +import org.briarproject.bramble.api.system.WakefulIoExecutor; + +import java.io.File; +import java.util.concurrent.Executor; +import java.util.logging.Logger; + +import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; +import javax.net.SocketFactory; + +import static java.util.logging.Level.INFO; +import static java.util.logging.Logger.getLogger; + +@Immutable +@NotNullByDefault +abstract class TorPluginFactory implements DuplexPluginFactory { + + protected static final Logger LOG = + getLogger(TorPluginFactory.class.getName()); + + protected static final int MAX_LATENCY = 30 * 1000; // 30 seconds + protected static final int MAX_IDLE_TIME = 30 * 1000; // 30 seconds + private static final int MIN_POLLING_INTERVAL = 60 * 1000; // 1 minute + private static final int MAX_POLLING_INTERVAL = 10 * 60 * 1000; // 10 mins + private static final double BACKOFF_BASE = 1.2; + + protected final Executor ioExecutor, wakefulIoExecutor; + protected final NetworkManager networkManager; + protected final LocationUtils locationUtils; + protected final EventBus eventBus; + protected final SocketFactory torSocketFactory; + protected final BackoffFactory backoffFactory; + protected final ResourceProvider resourceProvider; + protected final CircumventionProvider circumventionProvider; + protected final BatteryManager batteryManager; + protected final Clock clock; + protected final CryptoComponent crypto; + protected final File torDirectory; + protected final int torSocksPort; + protected final int torControlPort; + + TorPluginFactory(@IoExecutor Executor ioExecutor, + @WakefulIoExecutor Executor wakefulIoExecutor, + NetworkManager networkManager, + LocationUtils locationUtils, + EventBus eventBus, + SocketFactory torSocketFactory, + BackoffFactory backoffFactory, + ResourceProvider resourceProvider, + CircumventionProvider circumventionProvider, + BatteryManager batteryManager, + Clock clock, + CryptoComponent crypto, + @TorDirectory File torDirectory, + @TorSocksPort int torSocksPort, + @TorControlPort int torControlPort) { + this.ioExecutor = ioExecutor; + this.wakefulIoExecutor = wakefulIoExecutor; + this.networkManager = networkManager; + this.locationUtils = locationUtils; + this.eventBus = eventBus; + this.torSocketFactory = torSocketFactory; + this.backoffFactory = backoffFactory; + this.resourceProvider = resourceProvider; + this.circumventionProvider = circumventionProvider; + this.batteryManager = batteryManager; + this.clock = clock; + this.crypto = crypto; + this.torDirectory = torDirectory; + this.torSocksPort = torSocksPort; + this.torControlPort = torControlPort; + } + + @Nullable + abstract String getArchitectureForTorBinary(); + + abstract TorPlugin createPluginInstance(Backoff backoff, + TorRendezvousCrypto torRendezvousCrypto, PluginCallback callback, + String architecture); + + @Override + public TransportId getId() { + return TorConstants.ID; + } + + @Override + public long getMaxLatency() { + return MAX_LATENCY; + } + + @Override + public DuplexPlugin createPlugin(PluginCallback callback) { + // Check that we have a Tor binary for this architecture + String architecture = getArchitectureForTorBinary(); + if (architecture == null) { + LOG.warning("Tor is not supported on this architecture"); + return null; + } + + if (LOG.isLoggable(INFO)) { + LOG.info("The selected architecture for Tor is " + architecture); + } + + Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, + MAX_POLLING_INTERVAL, BACKOFF_BASE); + TorRendezvousCrypto torRendezvousCrypto = + new TorRendezvousCryptoImpl(crypto); + TorPlugin plugin = createPluginInstance(backoff, torRendezvousCrypto, + callback, architecture); + eventBus.addListener(plugin); + return plugin; + } +} diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java index 8e3d05a71..c31bd8e57 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java @@ -9,13 +9,9 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.Backoff; import org.briarproject.bramble.api.plugin.BackoffFactory; import org.briarproject.bramble.api.plugin.PluginCallback; -import org.briarproject.bramble.api.plugin.TorConstants; import org.briarproject.bramble.api.plugin.TorControlPort; import org.briarproject.bramble.api.plugin.TorDirectory; import org.briarproject.bramble.api.plugin.TorSocksPort; -import org.briarproject.bramble.api.plugin.TransportId; -import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; -import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.LocationUtils; import org.briarproject.bramble.api.system.ResourceProvider; @@ -23,43 +19,18 @@ import org.briarproject.bramble.api.system.WakefulIoExecutor; import java.io.File; import java.util.concurrent.Executor; -import java.util.logging.Logger; +import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; import javax.net.SocketFactory; import static java.util.logging.Level.INFO; -import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.OsUtils.isLinux; @Immutable @NotNullByDefault -public class UnixTorPluginFactory implements DuplexPluginFactory { - - private static final Logger LOG = - getLogger(UnixTorPluginFactory.class.getName()); - - private static final int MAX_LATENCY = 30 * 1000; // 30 seconds - private static final int MAX_IDLE_TIME = 30 * 1000; // 30 seconds - private static final int MIN_POLLING_INTERVAL = 60 * 1000; // 1 minute - private static final int MAX_POLLING_INTERVAL = 10 * 60 * 1000; // 10 mins - private static final double BACKOFF_BASE = 1.2; - - private final Executor ioExecutor, wakefulIoExecutor; - private final NetworkManager networkManager; - private final LocationUtils locationUtils; - private final EventBus eventBus; - private final SocketFactory torSocketFactory; - private final BackoffFactory backoffFactory; - private final ResourceProvider resourceProvider; - private final CircumventionProvider circumventionProvider; - private final BatteryManager batteryManager; - private final Clock clock; - private final File torDirectory; - private int torSocksPort; - private int torControlPort; - private final CryptoComponent crypto; +public class UnixTorPluginFactory extends TorPluginFactory { @Inject UnixTorPluginFactory(@IoExecutor Executor ioExecutor, @@ -73,74 +44,39 @@ public class UnixTorPluginFactory implements DuplexPluginFactory { CircumventionProvider circumventionProvider, BatteryManager batteryManager, Clock clock, + CryptoComponent crypto, @TorDirectory File torDirectory, @TorSocksPort int torSocksPort, - @TorControlPort int torControlPort, - CryptoComponent crypto) { - this.ioExecutor = ioExecutor; - this.wakefulIoExecutor = wakefulIoExecutor; - this.networkManager = networkManager; - this.locationUtils = locationUtils; - this.eventBus = eventBus; - this.torSocketFactory = torSocketFactory; - this.backoffFactory = backoffFactory; - this.resourceProvider = resourceProvider; - this.circumventionProvider = circumventionProvider; - this.batteryManager = batteryManager; - this.clock = clock; - this.torDirectory = torDirectory; - this.torSocksPort = torSocksPort; - this.torControlPort = torControlPort; - this.crypto = crypto; + @TorControlPort int torControlPort) { + super(ioExecutor, wakefulIoExecutor, networkManager, locationUtils, + eventBus, torSocketFactory, backoffFactory, resourceProvider, + circumventionProvider, batteryManager, clock, crypto, + torDirectory, torSocksPort, torControlPort); } + @Nullable @Override - public TransportId getId() { - return TorConstants.ID; - } - - @Override - public long getMaxLatency() { - return MAX_LATENCY; - } - - @Override - public DuplexPlugin createPlugin(PluginCallback callback) { - // Check that we have a Tor binary for this architecture - String architecture = null; - if (isLinux()) { - String arch = System.getProperty("os.arch"); - if (LOG.isLoggable(INFO)) { - LOG.info("System's os.arch is " + arch); - } - if (arch.equals("amd64")) { - architecture = "linux-x86_64"; - } else if (arch.equals("aarch64")) { - architecture = "linux-aarch64"; - } else if (arch.equals("arm")) { - architecture = "linux-armhf"; - } - } - if (architecture == null) { - LOG.info("Tor is not supported on this architecture"); - return null; - } - + String getArchitectureForTorBinary() { + if (!isLinux()) return null; + String arch = System.getProperty("os.arch"); if (LOG.isLoggable(INFO)) { - LOG.info("The selected architecture for Tor is " + architecture); + LOG.info("System's os.arch is " + arch); } + if (arch.equals("amd64")) return "linux-x86_64"; + else if (arch.equals("aarch64")) return "linux-aarch64"; + else if (arch.equals("arm")) return "linux-armhf"; + return null; + } - Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, - MAX_POLLING_INTERVAL, BACKOFF_BASE); - TorRendezvousCrypto torRendezvousCrypto = - new TorRendezvousCryptoImpl(crypto); - UnixTorPlugin plugin = new UnixTorPlugin(ioExecutor, wakefulIoExecutor, + @Override + TorPlugin createPluginInstance(Backoff backoff, + TorRendezvousCrypto torRendezvousCrypto, PluginCallback callback, + String architecture) { + return new UnixTorPlugin(ioExecutor, wakefulIoExecutor, networkManager, locationUtils, torSocketFactory, clock, resourceProvider, circumventionProvider, batteryManager, backoff, torRendezvousCrypto, callback, architecture, MAX_LATENCY, MAX_IDLE_TIME, torDirectory, torSocksPort, torControlPort); - eventBus.addListener(plugin); - return plugin; } } diff --git a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java index bcbe3ce14..d5a3a7e0d 100644 --- a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java +++ b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java @@ -164,8 +164,8 @@ public class BridgeTest extends BrambleTestCase { factory = new UnixTorPluginFactory(ioExecutor, wakefulIoExecutor, networkManager, locationUtils, eventBus, torSocketFactory, backoffFactory, resourceProvider, bridgeProvider, - batteryManager, clock, torDir, DEFAULT_SOCKS_PORT, - DEFAULT_CONTROL_PORT, crypto); + batteryManager, clock, crypto, torDir, + DEFAULT_SOCKS_PORT, DEFAULT_CONTROL_PORT); } @After