bridges) {
- if (this.bridges.equals(bridges)) return false; // Unchanged
- this.bridges = bridges;
- return true; // Changed
- }
-
- private synchronized TorState getState() {
- if (!started || stopped) return STARTING_STOPPING;
- if (!networkInitialised) return CONNECTING;
- if (!networkEnabled) return DISABLED;
- return bootstrapPercentage == 100 && circuitBuilt
- && orConnectionsConnected > 0 ? CONNECTED : CONNECTING;
- }
-
- private synchronized void onOrConnectionConnected() {
- int oldConnected = orConnectionsConnected;
- orConnectionsConnected++;
- logOrConnections();
- if (oldConnected == 0) updateState();
- }
-
- private synchronized void onOrConnectionClosed() {
- int oldConnected = orConnectionsConnected;
- orConnectionsConnected--;
- if (orConnectionsConnected < 0) {
- LOG.warning("Count was zero before connection closed");
- orConnectionsConnected = 0;
- }
- logOrConnections();
- if (orConnectionsConnected == 0 && oldConnected != 0) {
- updateState();
- }
- }
-
- @GuardedBy("this")
- private void logOrConnections() {
- if (LOG.isLoggable(INFO)) {
- LOG.info(orConnectionsConnected + " OR connections connected");
- }
- }
-
- private synchronized void onHsDescriptorUploaded(String onion) {
- if (observer != null) {
- // Notify the observer on the event executor
- eventExecutor.execute(() ->
- observer.onHsDescriptorUpload(onion));
- }
- }
- }
-}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/CircumventionProvider.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/CircumventionProvider.java
deleted file mode 100644
index ac0ee85d0..000000000
--- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/CircumventionProvider.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.briarproject.bramble.plugin.tor.wrapper;
-
-import org.briarproject.bramble.api.lifecycle.IoExecutor;
-import org.briarproject.nullsafety.NotNullByDefault;
-
-import java.util.List;
-
-import javax.annotation.concurrent.ThreadSafe;
-
-@ThreadSafe
-@NotNullByDefault
-public interface CircumventionProvider {
-
- enum BridgeType {
- DEFAULT_OBFS4,
- NON_DEFAULT_OBFS4,
- VANILLA,
- MEEK,
- SNOWFLAKE
- }
-
- /**
- * Countries where Tor is blocked, i.e. vanilla Tor connection won't work.
- *
- * See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
- * and https://trac.torproject.org/projects/tor/wiki/doc/OONI/censorshipwiki
- */
- String[] BLOCKED = {"BY", "CN", "EG", "IR", "RU", "TM", "VE"};
-
- /**
- * Countries where bridge connections are likely to work.
- * Should be a subset of {@link #BLOCKED} and the union of
- * {@link #DEFAULT_BRIDGES}, {@link #NON_DEFAULT_BRIDGES} and
- * {@link #DPI_BRIDGES}.
- */
- String[] BRIDGES = {"BY", "CN", "EG", "IR", "RU", "TM", "VE"};
-
- /**
- * Countries where default obfs4 or vanilla bridges are likely to work.
- * Should be a subset of {@link #BRIDGES}.
- */
- String[] DEFAULT_BRIDGES = {"EG", "VE"};
-
- /**
- * Countries where non-default obfs4 or vanilla bridges are likely to work.
- * Should be a subset of {@link #BRIDGES}.
- */
- String[] NON_DEFAULT_BRIDGES = {"BY", "RU"};
-
- /**
- * Countries where vanilla bridges are blocked via DPI but non-default
- * obfs4 bridges, meek and snowflake may work. Should be a subset of
- * {@link #BRIDGES}.
- */
- String[] DPI_BRIDGES = {"CN", "IR", "TM"};
-
- /**
- * Returns true if vanilla Tor connections are blocked in the given country.
- */
- boolean isTorProbablyBlocked(String countryCode);
-
- /**
- * Returns true if bridge connections of some type work in the given
- * country.
- */
- boolean doBridgesWork(String countryCode);
-
- /**
- * Returns the types of bridge connection that are suitable for the given
- * country, or {@link #DEFAULT_BRIDGES} if no bridge type is known
- * to work.
- */
- List getSuitableBridgeTypes(String countryCode);
-
- @IoExecutor
- List getBridges(BridgeType type, String countryCode,
- boolean letsEncrypt);
-}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/CircumventionProviderImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/CircumventionProviderImpl.java
deleted file mode 100644
index a5a56df8a..000000000
--- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/CircumventionProviderImpl.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package org.briarproject.bramble.plugin.tor.wrapper;
-
-import org.briarproject.bramble.api.lifecycle.IoExecutor;
-import org.briarproject.nullsafety.NotNullByDefault;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
-import java.util.Set;
-import java.util.TreeMap;
-
-import javax.annotation.concurrent.Immutable;
-import javax.inject.Inject;
-
-import static java.util.Arrays.asList;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.DEFAULT_OBFS4;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.MEEK;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.NON_DEFAULT_OBFS4;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.SNOWFLAKE;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.VANILLA;
-import static org.briarproject.nullsafety.NullSafety.requireNonNull;
-
-@Immutable
-@NotNullByDefault
-class CircumventionProviderImpl implements CircumventionProvider {
-
- private final static String BRIDGE_FILE_NAME = "bridges";
- private final static String SNOWFLAKE_PARAMS_FILE_NAME = "snowflake-params";
- private final static String DEFAULT_COUNTRY_CODE = "ZZ";
-
- private static final Set BLOCKED_IN_COUNTRIES =
- new HashSet<>(asList(BLOCKED));
- private static final Set BRIDGE_COUNTRIES =
- new HashSet<>(asList(BRIDGES));
- private static final Set DEFAULT_OBFS4_BRIDGE_COUNTRIES =
- new HashSet<>(asList(DEFAULT_BRIDGES));
- private static final Set NON_DEFAULT_BRIDGE_COUNTRIES =
- new HashSet<>(asList(NON_DEFAULT_BRIDGES));
- private static final Set DPI_COUNTRIES =
- new HashSet<>(asList(DPI_BRIDGES));
-
- @Inject
- CircumventionProviderImpl() {
- }
-
- @Override
- public boolean isTorProbablyBlocked(String countryCode) {
- return BLOCKED_IN_COUNTRIES.contains(countryCode);
- }
-
- @Override
- public boolean doBridgesWork(String countryCode) {
- return BRIDGE_COUNTRIES.contains(countryCode);
- }
-
- @Override
- public List getSuitableBridgeTypes(String countryCode) {
- if (DEFAULT_OBFS4_BRIDGE_COUNTRIES.contains(countryCode)) {
- return asList(DEFAULT_OBFS4, VANILLA);
- } else if (NON_DEFAULT_BRIDGE_COUNTRIES.contains(countryCode)) {
- return asList(NON_DEFAULT_OBFS4, VANILLA);
- } else if (DPI_COUNTRIES.contains(countryCode)) {
- return asList(NON_DEFAULT_OBFS4, MEEK, SNOWFLAKE);
- } else {
- return asList(DEFAULT_OBFS4, VANILLA);
- }
- }
-
- @Override
- @IoExecutor
- public List getBridges(BridgeType type, String countryCode,
- boolean letsEncrypt) {
- InputStream is = requireNonNull(getClass().getClassLoader()
- .getResourceAsStream(BRIDGE_FILE_NAME));
- Scanner scanner = new Scanner(is);
-
- List bridges = new ArrayList<>();
- while (scanner.hasNextLine()) {
- String line = scanner.nextLine();
- if ((type == DEFAULT_OBFS4 && line.startsWith("d ")) ||
- (type == NON_DEFAULT_OBFS4 && line.startsWith("n ")) ||
- (type == VANILLA && line.startsWith("v ")) ||
- (type == MEEK && line.startsWith("m "))) {
- bridges.add(line.substring(2));
- } else if (type == SNOWFLAKE && line.startsWith("s ")) {
- String params = getSnowflakeParams(countryCode, letsEncrypt);
- bridges.add(line.substring(2) + " " + params);
- }
- }
- scanner.close();
- return bridges;
- }
-
- // Package access for testing
- @SuppressWarnings("WeakerAccess")
- String getSnowflakeParams(String countryCode, boolean letsEncrypt) {
- Map params = loadSnowflakeParams();
- if (countryCode.isEmpty()) countryCode = DEFAULT_COUNTRY_CODE;
- // If we have parameters for this country code, return them
- String value = params.get(makeKey(countryCode, letsEncrypt));
- if (value != null) return value;
- // Return the default parameters
- value = params.get(makeKey(DEFAULT_COUNTRY_CODE, letsEncrypt));
- return requireNonNull(value);
- }
-
- private Map loadSnowflakeParams() {
- InputStream is = requireNonNull(getClass().getClassLoader()
- .getResourceAsStream(SNOWFLAKE_PARAMS_FILE_NAME));
- Scanner scanner = new Scanner(is);
- Map params = new TreeMap<>();
- while (scanner.hasNextLine()) {
- String line = scanner.nextLine();
- if (line.length() < 5) continue;
- String key = line.substring(0, 4); // Country code, space, digit
- String value = line.substring(5);
- params.put(key, value);
- }
- scanner.close();
- return params;
- }
-
- private String makeKey(String countryCode, boolean letsEncrypt) {
- return countryCode + " " + (letsEncrypt ? "1" : "0");
- }
-}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/TorUtils.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/TorUtils.java
deleted file mode 100644
index d83d3feb9..000000000
--- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/TorUtils.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.briarproject.bramble.plugin.tor.wrapper;
-
-import org.briarproject.nullsafety.NotNullByDefault;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-import java.nio.charset.Charset;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.annotation.Nullable;
-
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.bramble.plugin.tor.wrapper.TorWrapper.LOG;
-
-@NotNullByDefault
-class TorUtils {
-
- @SuppressWarnings("CharsetObjectCanBeUsed")
- static final Charset UTF_8 = Charset.forName("UTF-8");
-
- static String scrubOnion(String onion) {
- // Keep first three characters of onion address
- return onion.substring(0, 3) + "[scrubbed]";
- }
-
- static void copyAndClose(InputStream in, OutputStream out) {
- byte[] buf = new byte[4096];
- try {
- while (true) {
- int read = in.read(buf);
- if (read == -1) break;
- out.write(buf, 0, read);
- }
- in.close();
- out.flush();
- out.close();
- } catch (IOException e) {
- tryToClose(in, LOG, WARNING);
- tryToClose(out, LOG, WARNING);
- }
- }
-
- static void tryToClose(@Nullable Closeable c, Logger logger, Level level) {
- try {
- if (c != null) c.close();
- } catch (IOException e) {
- logException(logger, level, e);
- }
- }
-
- static void tryToClose(@Nullable Socket s, Logger logger, Level level) {
- try {
- if (s != null) s.close();
- } catch (IOException e) {
- logException(logger, level, e);
- }
- }
-
- private static void logException(Logger logger, Level level, Throwable t) {
- if (logger.isLoggable(level)) logger.log(level, t.toString(), t);
- }
-}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/TorWrapper.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/TorWrapper.java
deleted file mode 100644
index 01a94fe23..000000000
--- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/TorWrapper.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package org.briarproject.bramble.plugin.tor.wrapper;
-
-import org.briarproject.nullsafety.NotNullByDefault;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.logging.Logger;
-
-import javax.annotation.Nullable;
-
-import static java.util.logging.Logger.getLogger;
-
-@NotNullByDefault
-public interface TorWrapper {
-
- Logger LOG = getLogger(TorWrapper.class.getName());
-
- /**
- * Starts the Tor process.
- *
- * This method must only be called once. To restart the Tor process, stop
- * this wrapper instance and then create a new instance.
- */
- void start() throws IOException, InterruptedException;
-
- /**
- * Tell the Tor process to stop and returns without waiting for the
- * process to exit.
- */
- void stop() throws IOException;
-
- /**
- * Sets an observer for observing the state of the wrapper, replacing any
- * existing observer, or removes any existing observer if the argument is
- * null.
- */
- void setObserver(@Nullable Observer observer);
-
- /**
- * Returns the current state of the wrapper.
- */
- TorState getTorState();
-
- /**
- * Returns true if the wrapper has been {@link #start() started} and not
- * yet {@link #stop()} stopped.
- */
- @SuppressWarnings("BooleanMethodIsAlwaysInverted")
- boolean isTorRunning();
-
- /**
- * Publishes an ephemeral hidden service.
- *
- * @param localPort The local port on which the service is listening.
- * @param remotePort The port number that clients of the service will see.
- * @param privateKey The private key of the hidden service, in the form
- * returned by a previous call to this method, or null if a new service
- * should be created.
- */
- HiddenServiceProperties publishHiddenService(int localPort,
- int remotePort, @Nullable String privateKey) throws IOException;
-
- /**
- * Removes (unpublishes) an ephemeral hidden service that was created by
- * calling {@link #publishHiddenService(int, int, String)}.
- */
- void removeHiddenService(String onion) throws IOException;
-
- /**
- * Enables or disables the Tor process's network connection. The network
- * connection is disabled by default.
- */
- void enableNetwork(boolean enable) throws IOException;
-
- /**
- * Configures Tor to use the given list of bridges for connecting to the
- * Tor network. Bridges are not used by default.
- *
- * Each item in the list should be a bridge line in the same
- * format that would be used in a torrc file (including the Bridge keyword).
- */
- void enableBridges(List bridges) throws IOException;
-
- /**
- * Configures Tor not to use bridges for connecting to the Tor network.
- * Bridges are not used by default.
- */
- void disableBridges() throws IOException;
-
- /**
- * Enables or disables connection padding. Padding is disabled by default.
- */
- void enableConnectionPadding(boolean enable) throws IOException;
-
- /**
- * Configures Tor to use IPv6 or IPv4 for connecting to the Tor network.
- * IPv4 is used by default.
- */
- void enableIpv6(boolean ipv6Only) throws IOException;
-
- /**
- * The state of the Tor wrapper.
- */
- enum TorState {
-
- /**
- * The Tor process is either starting or stopping.
- */
- STARTING_STOPPING,
-
- /**
- * The Tor process has started, its network connection is enabled, and
- * it is connecting (or reconnecting) to the Tor network.
- */
- CONNECTING,
-
- /**
- * The Tor process has started, its network connection is enabled, and
- * it has connected to the Tor network. In this state it should be
- * possible to make connections via the SOCKS port.
- */
- CONNECTED,
-
- /**
- * The Tor process has started but its network connection is disabled.
- */
- DISABLED
- }
-
- /**
- * An interface for observing changes to the {@link TorState state} of the
- * Tor process. All calls happen on the event executor supplied to the
- * wrapper's constructor.
- */
- interface Observer {
-
- /**
- * Called whenever the state of the Tor process changes.
- */
- void onState(TorState s);
-
- /**
- * Called whenever the bootstrap percentage changes.
- */
- void onBootstrapPercentage(int percentage);
-
- /**
- * Called whenever a hidden service descriptor is uploaded.
- */
- void onHsDescriptorUpload(String onion);
- }
-
- class HiddenServiceProperties {
-
- public final String onion, privKey;
-
- HiddenServiceProperties(String onion, String privKey) {
- this.onion = onion;
- this.privKey = privKey;
- }
- }
-}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/CircumventionModule.java b/bramble-core/src/main/java/org/briarproject/onionwrapper/CircumventionModule.java
similarity index 83%
rename from bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/CircumventionModule.java
rename to bramble-core/src/main/java/org/briarproject/onionwrapper/CircumventionModule.java
index be4249f48..0c60cf01a 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/CircumventionModule.java
+++ b/bramble-core/src/main/java/org/briarproject/onionwrapper/CircumventionModule.java
@@ -1,4 +1,4 @@
-package org.briarproject.bramble.plugin.tor.wrapper;
+package org.briarproject.onionwrapper;
import javax.inject.Singleton;
diff --git a/bramble-core/src/main/resources/bridges b/bramble-core/src/main/resources/bridges
deleted file mode 100644
index e365f5242..000000000
--- a/bramble-core/src/main/resources/bridges
+++ /dev/null
@@ -1,35 +0,0 @@
-d Bridge obfs4 192.95.36.142:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=1
-d Bridge obfs4 37.218.245.14:38224 D9A82D2F9C2F65A18407B1D2B764F130847F8B5D cert=bjRaMrr1BRiAW8IE9U5z27fQaYgOhX1UCmOpg2pFpoMvo6ZgQMzLsaTzzQNTlm7hNcb+Sg iat-mode=0
-d Bridge obfs4 85.31.186.98:443 011F2599C0E9B27EE74B353155E244813763C3E5 cert=ayq0XzCwhpdysn5o0EyDUbmSOx3X/oTEbzDMvczHOdBJKlvIdHHLJGkZARtT4dcBFArPPg iat-mode=0
-d Bridge obfs4 85.31.186.26:443 91A6354697E6B02A386312F68D82CF86824D3606 cert=PBwr+S8JTVZo6MPdHnkTwXJPILWADLqfMGoVvhZClMq/Urndyd42BwX9YFJHZnBB3H0XCw iat-mode=0
-d Bridge obfs4 193.11.166.194:27015 2D82C2E354D531A68469ADF7F878FA6060C6BACA cert=4TLQPJrTSaDffMK7Nbao6LC7G9OW/NHkUwIdjLSS3KYf0Nv4/nQiiI8dY2TcsQx01NniOg iat-mode=0
-d Bridge obfs4 193.11.166.194:27020 86AC7B8D430DAC4117E9F42C9EAED18133863AAF cert=0LDeJH4JzMDtkJJrFphJCiPqKx7loozKN7VNfuukMGfHO0Z8OGdzHVkhVAOfo1mUdv9cMg iat-mode=0
-d Bridge obfs4 193.11.166.194:27025 1AE2C08904527FEA90C4C4F8C1083EA59FBC6FAF cert=ItvYZzW5tn6v3G4UnQa6Qz04Npro6e81AP70YujmK/KXwDFPTs3aHXcHp4n8Vt6w/bv8cA iat-mode=0
-d Bridge obfs4 209.148.46.65:443 74FAD13168806246602538555B5521A0383A1875 cert=ssH+9rP8dG2NLDN2XuFw63hIO/9MNNinLmxQDpVa+7kTOa9/m+tGWT1SmSYpQ9uTBGa6Hw iat-mode=0
-d Bridge obfs4 146.57.248.225:22 10A6CD36A537FCE513A322361547444B393989F0 cert=K1gDtDAIcUfeLqbstggjIw2rtgIKqdIhUlHp82XRqNSq/mtAjp1BIC9vHKJ2FAEpGssTPw iat-mode=0
-d Bridge obfs4 45.145.95.6:27015 C5B7CD6946FF10C5B3E89691A7D3F2C122D2117C cert=TD7PbUO0/0k6xYHMPW3vJxICfkMZNdkRrb63Zhl5j9dW3iRGiCx0A7mPhe5T2EDzQ35+Zw iat-mode=0
-d Bridge obfs4 51.222.13.177:80 5EDAC3B810E12B01F6FD8050D2FD3E277B289A08 cert=2uplIpLQ0q9+0qMFrK5pkaYRDOe460LL9WHBvatgkuRr/SL31wBOEupaMMJ6koRE6Ld0ew iat-mode=0
-n Bridge obfs4 185.181.11.86:443 A961609729E7FDF520B4E81F1F1B8FA1045285C3 cert=e5faG9Zk4Ni+e7z2YgGfevyKPQlMvkVGi4ublSsHYjaBovKeNXpOhbeFxzbZZoAzxAoGUQ iat-mode=0
-n Bridge obfs4 120.29.217.52:5223 40FE3DB9800272F9CDC76422F8ED7883280EE96D cert=/71PS4l8c/XJ4DIItlH9xMqNvPFg2RUTrHvPlQWh48u5et8h/yyyjCcYphUadDsfBWpaGQ iat-mode=0
-n Bridge obfs4 185.177.207.138:8443 53716FE26F23C8C6A71A2BC5D9D8DC64747278C7 cert=6jcYVilMEzxdsWghSrQFpYYJlkkir/GPIXw/EnddUK3S8ToVpMG8u1SwMOEdEs735RrMHw iat-mode=0
-n Bridge obfs4 45.142.181.131:42069 6EBCF6B02DA2B982F4080A7119D737366AFB74FA cert=9HyWH/BCwWzNirZdTQtluCgJk+gFhpOqydIuyQ1iDvpnqsAynKF+zcPE/INZFefm86UlBg iat-mode=0
-n Bridge obfs4 152.67.77.101:4096 B82DB9CDDF887AB8A859420E07DF298E30AF8A6E cert=21OWn3yFo+hulmQNAOtF5uwwOqWtdT5PrLhk8BG9DpOd0/k5DEkQEYPyDdXbS9nZ0E5BJA iat-mode=0
-n Bridge obfs4 94.142.246.132:8088 135C158527AA9FE9A2F26EC515EB6999D813D347 cert=wTUz0/5FhAZRkitil5MprGbSF3JzjxjxI1kAmxAdSeDy98NgcLr11f/qUXWDC76Y97RiSg iat-mode=0
-n Bridge obfs4 152.70.180.20:1993 3327C43587E66AD5F874C4234A1D72C938AD7318 cert=s7xLRUO2psaX7TMUP2YhXdxItR4U6K7D+E3gQaS/+yWUppevtazIibq4dN1g5Reu6dD2QQ iat-mode=0
-n Bridge obfs4 144.202.12.254:10002 4E220F45CD404C8A3082A36326A5ED19BB8D4404 cert=iLz5YYWO4pUw7U7MRNOSvE0qO+IVeE4kVfFVWPO3coH3FmZtrkvlaTklfXxHZaCcXWBgaA iat-mode=0
-n Bridge obfs4 109.14.168.159:5082 BFE1416DEFFE969581F016A4A319A87FFB26BA91 cert=n3X1CDdKBPXPIzfKh83p3ydfMzb0AD9gKC+/gIpHb7+xjjAnYO9x3LT+T/MvOIfAXxYySg iat-mode=0
-n Bridge obfs4 185.177.207.132:8443 4FB781F7A9DD39DA53A7996907817FC479874D19 cert=UL2gCAXWW5kEWY4TQ0lNeu6OAmzh40bXYVhMnTWVG8USnyy/zEKGSIPgmwTDMumWr9c1Pg iat-mode=0
-n Bridge obfs4 213.108.110.149:7499 519344140473CF91030B08F91521F9A6C144ED6C cert=k9fSL/d491qAkGmi2VeSwVlfuyO02jBeN54qxzzQISxpfm3b+a6kJpo8/Bfy1ACbHZIJUg iat-mode=0
-n Bridge obfs4 158.174.114.97:3456 32665CD4CBE19092CA47A53D317B8BFF5810441C cert=ne5Zt0TcMedSGmFwAs/AV6J6E9Hn7mG5mR6vQNpEfyuCZK1VRpQvU1LvvtesSu4CXqZtYQ iat-mode=0
-n Bridge obfs4 64.4.175.62:8000 8B72740D150795ACB5101AA5F95D1ACDA4FE6B3E cert=vduuNhJ5U/8hjZmllP6AFfXSlSZsnrimdR8Tm8DY9dxWS4n2j92fNc0qHihUwRqwcOfIcg iat-mode=0
-n Bridge obfs4 82.64.115.17:990 B08238781C2CD80DBD95AEABEB6F6C75F2E2CEB6 cert=1udeMlFNs3sJ20zwpPE6nShZqqwDb3F1ET4KzfSfD+fktkue9zNx9H3t+yLCPAsg+6UTUA iat-mode=1
-n Bridge obfs4 87.161.120.147:9292 9418EEBE8AEAE32CC381AF51610366E8B24651E0 cert=DFRm74qsD1i2/ypaGochpX6CS1j9JTFAKEYaHXrgrx6M2LG5Cvppdt3Ob7lULfhqgtAUdg iat-mode=0
-n Bridge obfs4 157.90.245.231:8599 C23CD468EC04555E2B37BE81A771E681049DEA6A cert=UsmDelrbwg4jc6BMvZJ0TS8klUIa2qkbRu3xwQc3ZXPEgpMqyTYUxcVwyPbIU5KmAHsmAA iat-mode=0
-v Bridge 92.243.15.235:9001 477EAD3C04036B48235F1F27FC91420A286A4B7F
-v Bridge 213.108.108.145:17674 A39C0FE47963B6E8CFE9815549864DE544935A31
-v Bridge 213.196.191.96:9060 05E222E2A8C234234FE0CEB58B08A93B8FC360DB
-v Bridge 75.100.92.154:22815 465E990FA8A752DDE861EDF31E42454ACC037AB4
-v Bridge 87.100.193.2:9010 13FB63452AADFA082BD2BC3E1E320AD301F07877
-v Bridge 65.21.240.163:33245 20BD59649212CFE7412BFC9B94C3CCCFD8F807A8
-m Bridge meek_lite 192.0.2.18:80 BE776A53492E1E044A26F17306E1BC46A55A1625 url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com utls=hellochrome_auto
-s Bridge snowflake 192.0.2.3:80 2B280B23E1107BB62ABFC40DDCC8824814F80A72
diff --git a/bramble-core/src/main/resources/snowflake-params b/bramble-core/src/main/resources/snowflake-params
deleted file mode 100644
index a6cbd8563..000000000
--- a/bramble-core/src/main/resources/snowflake-params
+++ /dev/null
@@ -1,4 +0,0 @@
-ZZ 1 url=https://snowflake-broker.torproject.net.global.prod.fastly.net/ front=cdn.sstatic.net ice=stun:stun.l.google.com:19302,stun:stun.voip.blackberry.com:3478,stun:stun.altar.com.pl:3478,stun:stun.antisip.com:3478,stun:stun.bluesip.net:3478,stun:stun.dus.net:3478,stun:stun.epygi.com:3478,stun:stun.sonetel.com:3478,stun:stun.sonetel.net:3478,stun:stun.stunprotocol.org:3478,stun:stun.uls.co.za:3478,stun:stun.voipgate.com:3478,stun:stun.voys.nl:3478 utls-imitate=hellochrome_auto
-ZZ 0 url=https://snowflake-broker.azureedge.net/ front=ajax.aspnetcdn.com ice=stun:stun.l.google.com:19302,stun:stun.voip.blackberry.com:3478,stun:stun.altar.com.pl:3478,stun:stun.antisip.com:3478,stun:stun.bluesip.net:3478,stun:stun.dus.net:3478,stun:stun.epygi.com:3478,stun:stun.sonetel.com:3478,stun:stun.sonetel.net:3478,stun:stun.stunprotocol.org:3478,stun:stun.uls.co.za:3478,stun:stun.voipgate.com:3478,stun:stun.voys.nl:3478 utls-imitate=hellochrome_auto
-TM 1 url=https://snowflake-broker.azureedge.net/ front=ajax.aspnetcdn.com ice=stun:206.53.159.130:3479,stun:176.119.42.11:3479,stun:94.23.17.185:3479,stun:217.74.179.29:3479,stun:83.125.8.47:3479,stun:23.253.102.137:3479,stun:52.26.251.34:3479,stun:52.26.251.34:3479,stun:18.191.223.12:3479,stun:154.73.34.8:3479,stun:185.125.180.70:3479,stun:195.35.115.37:3479 utls-imitate=hellochrome_auto
-TM 0 url=https://snowflake-broker.azureedge.net/ front=ajax.aspnetcdn.com ice=stun:206.53.159.130:3479,stun:176.119.42.11:3479,stun:94.23.17.185:3479,stun:217.74.179.29:3479,stun:83.125.8.47:3479,stun:23.253.102.137:3479,stun:52.26.251.34:3479,stun:52.26.251.34:3479,stun:18.191.223.12:3479,stun:154.73.34.8:3479,stun:185.125.180.70:3479,stun:195.35.115.37:3479 utls-imitate=hellochrome_auto
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/plugin/tor/wrapper/CircumventionProviderImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/tor/wrapper/CircumventionProviderImplTest.java
deleted file mode 100644
index 374116e45..000000000
--- a/bramble-core/src/test/java/org/briarproject/bramble/plugin/tor/wrapper/CircumventionProviderImplTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package org.briarproject.bramble.plugin.tor.wrapper;
-
-import org.briarproject.bramble.test.BrambleTestCase;
-import org.junit.Test;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import static java.util.Arrays.asList;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BLOCKED;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BRIDGES;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.DEFAULT_OBFS4;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.MEEK;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.NON_DEFAULT_OBFS4;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.SNOWFLAKE;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.VANILLA;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.DEFAULT_BRIDGES;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.DPI_BRIDGES;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.NON_DEFAULT_BRIDGES;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-
-public class CircumventionProviderImplTest extends BrambleTestCase {
-
- private final CircumventionProviderImpl provider =
- new CircumventionProviderImpl();
-
- @Test
- public void testInvariants() {
- Set blocked = new HashSet<>(asList(BLOCKED));
- Set bridges = new HashSet<>(asList(BRIDGES));
- Set defaultBridges = new HashSet<>(asList(DEFAULT_BRIDGES));
- Set nonDefaultBridges =
- new HashSet<>(asList(NON_DEFAULT_BRIDGES));
- Set dpiBridges = new HashSet<>(asList(DPI_BRIDGES));
- // BRIDGES should be a subset of BLOCKED
- assertTrue(blocked.containsAll(bridges));
- // BRIDGES should be the union of the bridge type sets
- Set union = new HashSet<>(defaultBridges);
- union.addAll(nonDefaultBridges);
- union.addAll(dpiBridges);
- assertEquals(bridges, union);
- // The bridge type sets should not overlap
- assertEmptyIntersection(defaultBridges, nonDefaultBridges);
- assertEmptyIntersection(defaultBridges, dpiBridges);
- assertEmptyIntersection(nonDefaultBridges, dpiBridges);
- }
-
- @Test
- public void testGetBestBridgeType() {
- for (String country : DEFAULT_BRIDGES) {
- assertEquals(asList(DEFAULT_OBFS4, VANILLA),
- provider.getSuitableBridgeTypes(country));
- }
- for (String country : NON_DEFAULT_BRIDGES) {
- assertEquals(asList(NON_DEFAULT_OBFS4, VANILLA),
- provider.getSuitableBridgeTypes(country));
- }
- for (String country : DPI_BRIDGES) {
- assertEquals(asList(NON_DEFAULT_OBFS4, MEEK, SNOWFLAKE),
- provider.getSuitableBridgeTypes(country));
- }
- assertEquals(asList(DEFAULT_OBFS4, VANILLA),
- provider.getSuitableBridgeTypes("ZZ"));
- }
-
- @Test
- public void testHasSnowflakeParamsWithLetsEncrypt() {
- testHasSnowflakeParams(true);
- }
-
- @Test
- public void testHasSnowflakeParamsWithoutLetsEncrypt() {
- testHasSnowflakeParams(false);
- }
-
- private void testHasSnowflakeParams(boolean letsEncrypt) {
- String tmParams = provider.getSnowflakeParams("TM", letsEncrypt);
- String defaultParams = provider.getSnowflakeParams("ZZ", letsEncrypt);
- assertFalse(tmParams.isEmpty());
- assertFalse(defaultParams.isEmpty());
- assertNotEquals(defaultParams, tmParams);
- }
-
- private void assertEmptyIntersection(Set a, Set b) {
- Set intersection = new HashSet<>(a);
- intersection.retainAll(b);
- assertTrue(intersection.isEmpty());
- }
-}
diff --git a/bramble-core/witness.gradle b/bramble-core/witness.gradle
index 74cde5a79..619d0118f 100644
--- a/bramble-core/witness.gradle
+++ b/bramble-core/witness.gradle
@@ -37,6 +37,7 @@ dependencyVerification {
'org.bouncycastle:bcprov-jdk15to18:1.71:bcprov-jdk15to18-1.71.jar:143aaa4a40edd5fc2a18db7900059f6c16f4d931b94b94b20f7e2238e6662886',
'org.briarproject:jtorctl:0.5:jtorctl-0.5.jar:43f8c7d390169772b9a2c82ab806c8414c136a2a8636c555e22754bb7260793b',
'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011',
+ 'org.briarproject:onionwrapper-core:0.0.1:onionwrapper-core-0.0.1.jar:a1937506b00ee6620e909a500e5d004be81f94a6f7d7c898e1a9e841a8ae8a2a',
'org.briarproject:socks-socket:0.1:socks-socket-0.1.jar:e5898822d10f5390363c5dddb945891648c92cf93ba50709e07f0d173ec0eb4b',
'org.checkerframework:checker-compat-qual:2.5.5:checker-compat-qual-2.5.5.jar:11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a',
'org.checkerframework:checker-qual:3.12.0:checker-qual-3.12.0.jar:ff10785ac2a357ec5de9c293cb982a2cbb605c0309ea4cc1cb9b9bc6dbe7f3cb',
diff --git a/bramble-java/build.gradle b/bramble-java/build.gradle
index 29586169a..8e3e6d92b 100644
--- a/bramble-java/build.gradle
+++ b/bramble-java/build.gradle
@@ -14,10 +14,7 @@ dependencies {
def jna_version = '4.5.2'
implementation "net.java.dev.jna:jna:$jna_version"
implementation "net.java.dev.jna:jna-platform:$jna_version"
-
- testImplementation "org.briarproject:tor-linux:$tor_version"
- testImplementation "org.briarproject:obfs4proxy-linux:$obfs4proxy_version"
- testImplementation "org.briarproject:snowflake-linux:$snowflake_version"
+ implementation "org.briarproject:onionwrapper-java:$onionwrapper_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
@@ -27,9 +24,6 @@ dependencies {
testImplementation "junit:junit:$junit_version"
testImplementation "org.jmock:jmock:$jmock_version"
testImplementation "org.jmock:jmock-junit4:$jmock_version"
- testImplementation "com.squareup.okhttp3:okhttp:$okhttp_version"
-
- testAnnotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
}
tasks.withType(Test) {
diff --git a/bramble-java/src/main/java/org/briarproject/bramble/BrambleJavaModule.java b/bramble-java/src/main/java/org/briarproject/bramble/BrambleJavaModule.java
index 2d4fd9376..b6f4a5627 100644
--- a/bramble-java/src/main/java/org/briarproject/bramble/BrambleJavaModule.java
+++ b/bramble-java/src/main/java/org/briarproject/bramble/BrambleJavaModule.java
@@ -3,9 +3,9 @@ package org.briarproject.bramble;
import org.briarproject.bramble.io.DnsModule;
import org.briarproject.bramble.mailbox.ModularMailboxModule;
import org.briarproject.bramble.network.JavaNetworkModule;
-import org.briarproject.bramble.plugin.tor.wrapper.CircumventionModule;
import org.briarproject.bramble.socks.SocksModule;
import org.briarproject.bramble.system.JavaSystemModule;
+import org.briarproject.onionwrapper.CircumventionModule;
import dagger.Module;
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 a9b48f1a2..6f3b58501 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
@@ -15,10 +15,10 @@ import org.briarproject.bramble.api.plugin.TorSocksPort;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.system.LocationUtils;
import org.briarproject.bramble.api.system.WakefulIoExecutor;
-import org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider;
-import org.briarproject.bramble.plugin.tor.wrapper.TorWrapper;
-import org.briarproject.bramble.plugin.tor.wrapper.UnixTorWrapper;
import org.briarproject.nullsafety.NotNullByDefault;
+import org.briarproject.onionwrapper.CircumventionProvider;
+import org.briarproject.onionwrapper.TorWrapper;
+import org.briarproject.onionwrapper.UnixTorWrapper;
import java.io.File;
import java.util.concurrent.Executor;
diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/WindowsTorPluginFactory.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/WindowsTorPluginFactory.java
index 23ba5ba56..456dcc4bd 100644
--- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/WindowsTorPluginFactory.java
+++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/WindowsTorPluginFactory.java
@@ -15,10 +15,10 @@ import org.briarproject.bramble.api.plugin.TorSocksPort;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.system.LocationUtils;
import org.briarproject.bramble.api.system.WakefulIoExecutor;
-import org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider;
-import org.briarproject.bramble.plugin.tor.wrapper.TorWrapper;
-import org.briarproject.bramble.plugin.tor.wrapper.WindowsTorWrapper;
import org.briarproject.nullsafety.NotNullByDefault;
+import org.briarproject.onionwrapper.CircumventionProvider;
+import org.briarproject.onionwrapper.TorWrapper;
+import org.briarproject.onionwrapper.WindowsTorWrapper;
import java.io.File;
import java.util.concurrent.Executor;
diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/JavaTorWrapper.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/JavaTorWrapper.java
deleted file mode 100644
index 9d8ff3e9b..000000000
--- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/JavaTorWrapper.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.briarproject.bramble.plugin.tor.wrapper;
-
-import org.briarproject.nullsafety.NotNullByDefault;
-
-import java.io.File;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.security.CodeSource;
-import java.util.concurrent.Executor;
-
-import static org.briarproject.nullsafety.NullSafety.requireNonNull;
-
-@NotNullByDefault
-abstract class JavaTorWrapper extends AbstractTorWrapper {
-
- JavaTorWrapper(Executor ioExecutor,
- Executor eventExecutor,
- String architecture,
- File torDirectory,
- int torSocksPort,
- int torControlPort) {
- super(ioExecutor, eventExecutor, architecture, torDirectory,
- torSocksPort, torControlPort);
- }
-
- @Override
- protected long getLastUpdateTime() {
- CodeSource codeSource =
- getClass().getProtectionDomain().getCodeSource();
- if (codeSource == null) throw new AssertionError("CodeSource null");
- try {
- URI path = codeSource.getLocation().toURI();
- File file = new File(path);
- return file.lastModified();
- } catch (URISyntaxException e) {
- throw new AssertionError(e);
- }
- }
-
- @Override
- protected InputStream getResourceInputStream(String name,
- String extension) {
- ClassLoader cl = getClass().getClassLoader();
- return requireNonNull(cl.getResourceAsStream(name + extension));
- }
-}
diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/UnixTorWrapper.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/UnixTorWrapper.java
deleted file mode 100644
index d6f599c78..000000000
--- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/UnixTorWrapper.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.briarproject.bramble.plugin.tor.wrapper;
-
-import com.sun.jna.Library;
-import com.sun.jna.Native;
-
-import org.briarproject.nullsafety.NotNullByDefault;
-
-import java.io.File;
-import java.util.concurrent.Executor;
-
-/**
- * A Tor wrapper for Unix-like operating systems.
- */
-@NotNullByDefault
-public class UnixTorWrapper extends JavaTorWrapper {
-
- /**
- * @param ioExecutor The wrapper will use this executor to run IO tasks,
- * some of which may run for the lifetime of the wrapper, so the executor
- * should have an unlimited thread pool.
- * @param eventExecutor The wrapper will use this executor to call the
- * {@link Observer observer} (if any). To ensure that events are observed
- * in the order they occur, this executor should have a single thread (eg
- * the app's main thread).
- * @param architecture The processor architecture of the Tor and pluggable
- * transport binaries.
- * @param torDirectory The directory where the Tor process should keep its
- * state.
- * @param torSocksPort The port number to use for Tor's SOCKS port.
- * @param torControlPort The port number to use for Tor's control port.
- */
- public UnixTorWrapper(Executor ioExecutor,
- Executor eventExecutor,
- String architecture,
- File torDirectory,
- int torSocksPort,
- int torControlPort) {
- super(ioExecutor, eventExecutor, architecture, torDirectory,
- torSocksPort, torControlPort);
- }
-
- @Override
- protected int getProcessId() {
- return CLibrary.INSTANCE.getpid();
- }
-
- private interface CLibrary extends Library {
-
- CLibrary INSTANCE = Native.loadLibrary("c", CLibrary.class);
-
- int getpid();
- }
-}
diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/WindowsTorWrapper.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/WindowsTorWrapper.java
deleted file mode 100644
index 3807786b5..000000000
--- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/wrapper/WindowsTorWrapper.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package org.briarproject.bramble.plugin.tor.wrapper;
-
-import com.sun.jna.platform.win32.Kernel32;
-
-import org.briarproject.nullsafety.NotNullByDefault;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Scanner;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.Executor;
-
-import static java.util.logging.Level.INFO;
-
-/**
- * A Tor wrapper for the Windows operating system.
- */
-@NotNullByDefault
-public class WindowsTorWrapper extends JavaTorWrapper {
-
- /**
- * @param ioExecutor The wrapper will use this executor to run IO tasks,
- * some of which may run for the lifetime of the wrapper, so the executor
- * should have an unlimited thread pool.
- * @param eventExecutor The wrapper will use this executor to call
- * @param eventExecutor The wrapper will use this executor to call the
- * {@link Observer observer} (if any). To ensure that events are observed
- * in the order they occur, this executor should have a single thread (eg
- * the app's main thread).
- * @param architecture The processor architecture of the Tor and pluggable
- * transport binaries.
- * @param torDirectory The directory where the Tor process should keep its
- * state.
- * @param torSocksPort The port number to use for Tor's SOCKS port.
- * @param torControlPort The port number to use for Tor's control port.
- */
- public WindowsTorWrapper(Executor ioExecutor,
- Executor eventExecutor,
- String architecture,
- File torDirectory,
- int torSocksPort,
- int torControlPort) {
- super(ioExecutor, eventExecutor, architecture, torDirectory,
- torSocksPort, torControlPort);
- }
-
- @Override
- protected int getProcessId() {
- return Kernel32.INSTANCE.GetCurrentProcessId();
- }
-
- @Override
- protected void waitForTorToStart(Process torProcess)
- throws InterruptedException, IOException {
- // On Windows the RunAsDaemon option has no effect, so Tor won't detach.
- // Wait for the control port to be opened, then continue to read its
- // stdout and stderr in a background thread until it exits.
- BlockingQueue success = new ArrayBlockingQueue<>(1);
- ioExecutor.execute(() -> {
- boolean started = false;
- // Read the process's stdout (and redirected stderr)
- Scanner stdout = new Scanner(torProcess.getInputStream());
- // Log the first line of stdout (contains Tor and library versions)
- if (stdout.hasNextLine()) LOG.info(stdout.nextLine());
- // Startup has succeeded when the control port is open
- while (stdout.hasNextLine()) {
- String line = stdout.nextLine();
- if (!started && line.contains("Opened Control listener")) {
- success.add(true);
- started = true;
- }
- }
- stdout.close();
- // If the control port wasn't opened, startup has failed
- if (!started) success.add(false);
- // Wait for the process to exit
- try {
- int exit = torProcess.waitFor();
- if (LOG.isLoggable(INFO))
- LOG.info("Tor exited with value " + exit);
- } catch (InterruptedException e1) {
- LOG.warning("Interrupted while waiting for Tor to exit");
- Thread.currentThread().interrupt();
- }
- });
- // Wait for the startup result
- if (!success.take()) throw new IOException();
- }
-
- @Override
- protected String getExecutableExtension() {
- return ".exe";
- }
-}
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
deleted file mode 100644
index f5bb53141..000000000
--- a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java
+++ /dev/null
@@ -1,288 +0,0 @@
-package org.briarproject.bramble.plugin.tor;
-
-import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons;
-import org.briarproject.bramble.api.Multiset;
-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.event.EventExecutor;
-import org.briarproject.bramble.api.lifecycle.IoExecutor;
-import org.briarproject.bramble.api.network.NetworkManager;
-import org.briarproject.bramble.api.plugin.BackoffFactory;
-import org.briarproject.bramble.api.plugin.TorControlPort;
-import org.briarproject.bramble.api.plugin.TorSocksPort;
-import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
-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.plugin.tor.wrapper.CircumventionProvider;
-import org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType;
-import org.briarproject.bramble.test.BrambleJavaIntegrationTestComponent;
-import org.briarproject.bramble.test.BrambleTestCase;
-import org.briarproject.bramble.test.DaggerBrambleJavaIntegrationTestComponent;
-import org.briarproject.bramble.util.OsUtils;
-import org.briarproject.nullsafety.NotNullByDefault;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.concurrent.Executor;
-import java.util.logging.Logger;
-
-import javax.annotation.concurrent.GuardedBy;
-import javax.inject.Inject;
-import javax.net.SocketFactory;
-
-import static java.util.Collections.singletonList;
-import static java.util.concurrent.TimeUnit.MINUTES;
-import static java.util.logging.Logger.getLogger;
-import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.DEFAULT_OBFS4;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.MEEK;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.NON_DEFAULT_OBFS4;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.SNOWFLAKE;
-import static org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider.BridgeType.VANILLA;
-import static org.briarproject.bramble.test.TestUtils.deleteTestDirectory;
-import static org.briarproject.bramble.test.TestUtils.getTestDirectory;
-import static org.briarproject.bramble.test.TestUtils.isOptionalTestEnabled;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-@RunWith(Parameterized.class)
-public class BridgeTest extends BrambleTestCase {
-
- private static final String[] SNOWFLAKE_COUNTRY_CODES = {"TM", "ZZ"};
-
- @Parameters
- public static Iterable data() {
- BrambleJavaIntegrationTestComponent component =
- DaggerBrambleJavaIntegrationTestComponent.builder().build();
- BrambleCoreIntegrationTestEagerSingletons.Helper
- .injectEagerSingletons(component);
- // Share stats among all the test instances
- Stats stats = new Stats();
- CircumventionProvider provider = component.getCircumventionProvider();
- List states = new ArrayList<>();
- for (int i = 0; i < ATTEMPTS_PER_BRIDGE; i++) {
- for (String bridge :
- provider.getBridges(DEFAULT_OBFS4, "", true)) {
- states.add(new Params(bridge, DEFAULT_OBFS4, stats, false));
- }
- for (String bridge :
- provider.getBridges(NON_DEFAULT_OBFS4, "", true)) {
- states.add(new Params(bridge, NON_DEFAULT_OBFS4, stats,
- false));
- }
- for (String bridge : provider.getBridges(VANILLA, "", true)) {
- states.add(new Params(bridge, VANILLA, stats, false));
- }
- for (String bridge : provider.getBridges(MEEK, "", true)) {
- states.add(new Params(bridge, MEEK, stats, true));
- }
- for (String countryCode : SNOWFLAKE_COUNTRY_CODES) {
- for (String bridge :
- provider.getBridges(SNOWFLAKE, countryCode, true)) {
- states.add(new Params(bridge, SNOWFLAKE, stats, true));
- }
- for (String bridge :
- provider.getBridges(SNOWFLAKE, countryCode, false)) {
- states.add(new Params(bridge, SNOWFLAKE, stats, true));
- }
- }
- }
- return states;
- }
-
- private final static long TIMEOUT = MINUTES.toMillis(2);
- private final static long MEEK_TIMEOUT = MINUTES.toMillis(6);
- private final static int UNREACHABLE_BRIDGES_ALLOWED = 6;
- private final static int ATTEMPTS_PER_BRIDGE = 5;
-
- private final static Logger LOG = getLogger(BridgeTest.class.getName());
-
- @Inject
- @IoExecutor
- Executor ioExecutor;
- @Inject
- @EventExecutor
- Executor eventExecutor;
- @Inject
- @WakefulIoExecutor
- Executor wakefulIoExecutor;
- @Inject
- NetworkManager networkManager;
- @Inject
- ResourceProvider resourceProvider;
- @Inject
- BatteryManager batteryManager;
- @Inject
- EventBus eventBus;
- @Inject
- BackoffFactory backoffFactory;
- @Inject
- Clock clock;
- @Inject
- CryptoComponent crypto;
- @Inject
- @TorSocksPort
- int torSocksPort;
- @Inject
- @TorControlPort
- int torControlPort;
-
- private final File torDir = getTestDirectory();
- private final Params params;
-
- private UnixTorPluginFactory factory;
-
- public BridgeTest(Params params) {
- this.params = params;
- }
-
- @Before
- public void setUp() {
- // Skip this test unless it's explicitly enabled in the environment
- assumeTrue(isOptionalTestEnabled(BridgeTest.class));
-
- // TODO: Remove this assumption when the plugin supports other platforms
- assumeTrue(OsUtils.isLinux());
-
- BrambleJavaIntegrationTestComponent component =
- DaggerBrambleJavaIntegrationTestComponent.builder().build();
- BrambleCoreIntegrationTestEagerSingletons.Helper
- .injectEagerSingletons(component);
- component.inject(this);
-
- LocationUtils locationUtils = () -> "US";
- SocketFactory torSocketFactory = SocketFactory.getDefault();
-
- @NotNullByDefault
- CircumventionProvider bridgeProvider = new CircumventionProvider() {
- @Override
- public boolean isTorProbablyBlocked(String countryCode) {
- return true;
- }
-
- @Override
- public boolean doBridgesWork(String countryCode) {
- return true;
- }
-
- @Override
- public List getSuitableBridgeTypes(String countryCode) {
- return singletonList(params.bridgeType);
- }
-
- @Override
- public List getBridges(BridgeType bridgeType,
- String countryCode, boolean letsEncrypt) {
- return singletonList(params.bridge);
- }
- };
- factory = new UnixTorPluginFactory(ioExecutor, eventExecutor,
- wakefulIoExecutor, networkManager, locationUtils, eventBus,
- torSocketFactory, backoffFactory, bridgeProvider,
- batteryManager, clock, crypto, torDir, torSocksPort,
- torControlPort);
- }
-
- @After
- public void tearDown() {
- deleteTestDirectory(torDir);
- }
-
- @Test
- public void testBridges() throws Exception {
- if (params.stats.hasSucceeded(params.bridge)) {
- LOG.info("Skipping previously successful bridge: " + params.bridge);
- return;
- }
-
- DuplexPlugin duplexPlugin =
- factory.createPlugin(new TestPluginCallback());
- assertNotNull(duplexPlugin);
- TorPlugin plugin = (TorPlugin) duplexPlugin;
-
- LOG.warning("Testing " + params.bridge);
- try {
- plugin.start();
- long start = clock.currentTimeMillis();
- long timeout = params.bridgeType == MEEK ? MEEK_TIMEOUT : TIMEOUT;
- while (clock.currentTimeMillis() - start < timeout) {
- if (plugin.getState() == ACTIVE) break;
- clock.sleep(500);
- }
- if (plugin.getState() == ACTIVE) {
- LOG.info("Connected to Tor: " + params.bridge);
- params.stats.countSuccess(params.bridge);
- } else {
- LOG.warning("Could not connect to Tor within timeout: "
- + params.bridge);
- params.stats.countFailure(params.bridge, params.essential);
- }
- } finally {
- plugin.stop();
- }
- }
-
- private static class Params {
-
- private final String bridge;
- private final BridgeType bridgeType;
- private final Stats stats;
- private final boolean essential;
-
- private Params(String bridge, BridgeType bridgeType,
- Stats stats, boolean essential) {
- this.bridge = bridge;
- this.bridgeType = bridgeType;
- this.stats = stats;
- this.essential = essential;
- }
- }
-
- private static class Stats {
-
- @GuardedBy("this")
- private final Set successes = new HashSet<>();
- @GuardedBy("this")
- private final Multiset failures = new Multiset<>();
- @GuardedBy("this")
- private final Set unreachable = new TreeSet<>();
-
- private synchronized boolean hasSucceeded(String bridge) {
- return successes.contains(bridge);
- }
-
- private synchronized void countSuccess(String bridge) {
- successes.add(bridge);
- }
-
- private synchronized void countFailure(String bridge,
- boolean essential) {
- if (failures.add(bridge) == ATTEMPTS_PER_BRIDGE) {
- LOG.warning("Bridge is unreachable after "
- + ATTEMPTS_PER_BRIDGE + " attempts: " + bridge);
- unreachable.add(bridge);
- if (unreachable.size() > UNREACHABLE_BRIDGES_ALLOWED) {
- fail(unreachable.size() + " bridges are unreachable: "
- + unreachable);
- }
- if (essential) {
- fail("essential bridge is unreachable");
- }
- }
- }
- }
-}
diff --git a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/TestPluginCallback.java b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/TestPluginCallback.java
deleted file mode 100644
index cb4cf7494..000000000
--- a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/TestPluginCallback.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.briarproject.bramble.plugin.tor;
-
-import org.briarproject.bramble.api.plugin.Plugin.State;
-import org.briarproject.bramble.api.plugin.PluginCallback;
-import org.briarproject.bramble.api.plugin.TransportConnectionReader;
-import org.briarproject.bramble.api.plugin.TransportConnectionWriter;
-import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
-import org.briarproject.bramble.api.properties.TransportProperties;
-import org.briarproject.bramble.api.settings.Settings;
-import org.briarproject.nullsafety.NotNullByDefault;
-
-import java.util.Collection;
-
-import static java.util.Collections.emptyList;
-
-@NotNullByDefault
-public class TestPluginCallback implements PluginCallback {
-
- @Override
- public Settings getSettings() {
- return new Settings();
- }
-
- @Override
- public TransportProperties getLocalProperties() {
- return new TransportProperties();
- }
-
- @Override
- public Collection getRemoteProperties() {
- return emptyList();
- }
-
- @Override
- public void mergeSettings(Settings s) {
- }
-
- @Override
- public void mergeLocalProperties(TransportProperties p) {
- }
-
- @Override
- public void pluginStateChanged(State state) {
- }
-
- @Override
- public void handleConnection(DuplexTransportConnection c) {
- }
-
- @Override
- public void handleReader(TransportConnectionReader r) {
- }
-
- @Override
- public void handleWriter(TransportConnectionWriter w) {
- }
-}
diff --git a/bramble-java/src/test/java/org/briarproject/bramble/test/BrambleJavaIntegrationTestComponent.java b/bramble-java/src/test/java/org/briarproject/bramble/test/BrambleJavaIntegrationTestComponent.java
deleted file mode 100644
index 8443e578c..000000000
--- a/bramble-java/src/test/java/org/briarproject/bramble/test/BrambleJavaIntegrationTestComponent.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.briarproject.bramble.test;
-
-import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons;
-import org.briarproject.bramble.BrambleCoreModule;
-import org.briarproject.bramble.BrambleJavaModule;
-import org.briarproject.bramble.mailbox.ModularMailboxModule;
-import org.briarproject.bramble.plugin.tor.BridgeTest;
-import org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider;
-
-import javax.inject.Singleton;
-
-import dagger.Component;
-
-@Singleton
-@Component(modules = {
- BrambleCoreIntegrationTestModule.class,
- BrambleCoreModule.class,
- BrambleJavaModule.class,
- ModularMailboxModule.class,
- TestTorPortsModule.class,
- TestPluginConfigModule.class,
-})
-public interface BrambleJavaIntegrationTestComponent
- extends BrambleCoreIntegrationTestEagerSingletons {
-
- void inject(BridgeTest init);
-
- CircumventionProvider getCircumventionProvider();
-}
diff --git a/bramble-java/src/test/java/org/briarproject/bramble/test/TestResources.java b/bramble-java/src/test/java/org/briarproject/bramble/test/TestResources.java
deleted file mode 100644
index 10b52a475..000000000
--- a/bramble-java/src/test/java/org/briarproject/bramble/test/TestResources.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.briarproject.bramble.test;
-
-import org.briarproject.bramble.util.OsUtils;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.io.InputStream;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assume.assumeTrue;
-
-public class TestResources {
-
- @Before
- public void isRunningOnLinux() {
- assumeTrue(OsUtils.isLinux());
- }
-
- @Test
- public void canReadTorLinux() {
- InputStream input = Thread.currentThread().getContextClassLoader()
- .getResourceAsStream("x86_64/tor");
- assertNotNull(input);
- }
-
- @Test
- public void canReadObfs4ProxyLinux() {
- InputStream input = Thread.currentThread().getContextClassLoader()
- .getResourceAsStream("x86_64/obfs4proxy");
- assertNotNull(input);
- }
-
- @Test
- public void canReadSnowflakeLinux() {
- InputStream input = Thread.currentThread().getContextClassLoader()
- .getResourceAsStream("x86_64/snowflake");
- assertNotNull(input);
- }
-
-}
diff --git a/bramble-java/src/test/java/org/briarproject/bramble/test/TestTorPortsModule.java b/bramble-java/src/test/java/org/briarproject/bramble/test/TestTorPortsModule.java
deleted file mode 100644
index a8f03045d..000000000
--- a/bramble-java/src/test/java/org/briarproject/bramble/test/TestTorPortsModule.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.briarproject.bramble.test;
-
-import org.briarproject.bramble.api.plugin.TorControlPort;
-import org.briarproject.bramble.api.plugin.TorSocksPort;
-
-import dagger.Module;
-import dagger.Provides;
-
-import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_CONTROL_PORT;
-import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_SOCKS_PORT;
-
-@Module
-class TestTorPortsModule {
-
- @Provides
- @TorSocksPort
- int provideTorSocksPort() {
- return DEFAULT_SOCKS_PORT + 10;
- }
-
- @Provides
- @TorControlPort
- int provideTorControlPort() {
- return DEFAULT_CONTROL_PORT + 10;
- }
-}
diff --git a/bramble-java/witness.gradle b/bramble-java/witness.gradle
index 0154e0375..bc578b991 100644
--- a/bramble-java/witness.gradle
+++ b/bramble-java/witness.gradle
@@ -15,8 +15,6 @@ dependencyVerification {
'com.google.guava:guava:31.0.1-jre:guava-31.0.1-jre.jar:d5be94d65e87bd219fb3193ad1517baa55a3b88fc91d21cf735826ab5af087b9',
'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava:listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99',
'com.google.j2objc:j2objc-annotations:1.3:j2objc-annotations-1.3.jar:21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b',
- 'com.squareup.okhttp3:okhttp:3.12.13:okhttp-3.12.13.jar:508234e024ef7e270ab1a6d5b356f5b98e786511239ca986d684fd1e2cf7bc82',
- 'com.squareup.okio:okio:1.15.0:okio-1.15.0.jar:693fa319a7e8843300602b204023b7674f106ebcb577f2dd5807212b66118bd2',
'com.squareup:javapoet:1.13.0:javapoet-1.13.0.jar:4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291',
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3',
@@ -26,9 +24,10 @@ dependencyVerification {
'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0',
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
- 'org.briarproject:obfs4proxy-linux:0.0.14-tor2:obfs4proxy-linux-0.0.14-tor2.jar:bb2431092b5ad998ad620b0223e725c0f7e43f1b02af2f097a2544edc1fd9738',
- 'org.briarproject:snowflake-linux:2.5.1:snowflake-linux-2.5.1.jar:edc807dcb7758365970d95525e4749349a27f462d0e2df6505ad1ca65fb296d2',
- 'org.briarproject:tor-linux:0.4.7.13-2:tor-linux-0.4.7.13-2.jar:1e4ca9e0f724e1f17fcce570832704942cc3be26c4c2eccbe5aae29f35afa307',
+ 'org.briarproject:jtorctl:0.5:jtorctl-0.5.jar:43f8c7d390169772b9a2c82ab806c8414c136a2a8636c555e22754bb7260793b',
+ 'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011',
+ 'org.briarproject:onionwrapper-core:0.0.1:onionwrapper-core-0.0.1.jar:a1937506b00ee6620e909a500e5d004be81f94a6f7d7c898e1a9e841a8ae8a2a',
+ 'org.briarproject:onionwrapper-java:0.0.1:onionwrapper-java-0.0.1.jar:102ccea934d02b13702fd28e890e27e342db8b669a4c84bb54a3783cb8926552',
'org.checkerframework:checker-compat-qual:2.5.5:checker-compat-qual-2.5.5.jar:11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a',
'org.checkerframework:checker-qual:3.12.0:checker-qual-3.12.0.jar:ff10785ac2a357ec5de9c293cb982a2cbb605c0309ea4cc1cb9b9bc6dbe7f3cb',
'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java
index e58baf4ad..6e8196efc 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java
@@ -30,7 +30,6 @@ import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.system.LocationUtils;
import org.briarproject.bramble.mailbox.ModularMailboxModule;
import org.briarproject.bramble.plugin.file.RemovableDriveModule;
-import org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider;
import org.briarproject.bramble.system.ClockModule;
import org.briarproject.briar.BriarCoreEagerSingletons;
import org.briarproject.briar.BriarCoreModule;
@@ -84,6 +83,7 @@ import org.briarproject.briar.api.privategroup.PrivateGroupManager;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationFactory;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager;
import org.briarproject.briar.api.test.TestDataCreator;
+import org.briarproject.onionwrapper.CircumventionProvider;
import java.util.concurrent.Executor;
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsViewModel.java
index 9ccafba31..e8292f81e 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsViewModel.java
@@ -24,7 +24,6 @@ import org.briarproject.bramble.api.settings.SettingsManager;
import org.briarproject.bramble.api.settings.event.SettingsUpdatedEvent;
import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.bramble.api.system.LocationUtils;
-import org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider;
import org.briarproject.briar.R;
import org.briarproject.briar.android.attachment.UnsupportedMimeTypeException;
import org.briarproject.briar.android.attachment.media.ImageCompressor;
@@ -34,6 +33,7 @@ import org.briarproject.briar.api.identity.AuthorInfo;
import org.briarproject.briar.api.identity.AuthorManager;
import org.briarproject.nullsafety.MethodsNotNullByDefault;
import org.briarproject.nullsafety.ParametersNotNullByDefault;
+import org.briarproject.onionwrapper.CircumventionProvider;
import java.io.IOException;
import java.io.InputStream;
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/TorSummaryProvider.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/TorSummaryProvider.java
index d52ab51b0..086739306 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/settings/TorSummaryProvider.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/TorSummaryProvider.java
@@ -3,9 +3,9 @@ package org.briarproject.briar.android.settings;
import android.content.Context;
import org.briarproject.bramble.api.system.LocationUtils;
-import org.briarproject.bramble.plugin.tor.wrapper.CircumventionProvider;
import org.briarproject.briar.R;
import org.briarproject.nullsafety.NotNullByDefault;
+import org.briarproject.onionwrapper.CircumventionProvider;
import androidx.preference.ListPreference;
import androidx.preference.Preference.SummaryProvider;
diff --git a/briar-headless/build.gradle b/briar-headless/build.gradle
index 5545d832c..3c5d795e9 100644
--- a/briar-headless/build.gradle
+++ b/briar-headless/build.gradle
@@ -45,6 +45,7 @@ dependencies {
implementation "org.bouncycastle:bcprov-jdk15to18:$bouncy_castle_version"
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
implementation "com.fasterxml.jackson.core:jackson-databind:$jackson_version"
+ implementation "org.briarproject:onionwrapper-java:$onionwrapper_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
diff --git a/briar-headless/witness.gradle b/briar-headless/witness.gradle
index 83d8bd339..606c199e1 100644
--- a/briar-headless/witness.gradle
+++ b/briar-headless/witness.gradle
@@ -36,12 +36,18 @@ dependencyVerification {
'javax.servlet:javax.servlet-api:3.1.0:javax.servlet-api-3.1.0.jar:af456b2dd41c4e82cf54f3e743bc678973d9fe35bd4d3071fa05c7e5333b8482',
'net.bytebuddy:byte-buddy-agent:1.12.6:byte-buddy-agent-1.12.6.jar:9b29421fe4650b75fc3ed53590f914c54f932e334b3506cc00296dff73024183',
'net.bytebuddy:byte-buddy:1.12.6:byte-buddy-1.12.6.jar:211918dc24f0fdef4335ce8af40ef5616e15e818b962a21146397c7701eb75a7',
+ 'net.java.dev.jna:jna-platform:4.5.2:jna-platform-4.5.2.jar:f1d00c167d8921c6e23c626ef9f1c3ae0be473c95c68ffa012bc7ae55a87e2d6',
+ 'net.java.dev.jna:jna:4.5.2:jna-4.5.2.jar:0c8eb7acf67261656d79005191debaba3b6bf5dd60a43735a245429381dbecff',
'net.java.dev.jna:jna:5.6.0:jna-5.6.0.jar:5557e235a8aa2f9766d5dc609d67948f2a8832c2d796cea9ef1d6cbe0b3b7eaf',
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
'org.apiguardian:apiguardian-api:1.1.0:apiguardian-api-1.1.0.jar:a9aae9ff8ae3e17a2a18f79175e82b16267c246fbbd3ca9dfbbb290b08dcfdd4',
'org.bouncycastle:bcprov-jdk15to18:1.71:bcprov-jdk15to18-1.71.jar:143aaa4a40edd5fc2a18db7900059f6c16f4d931b94b94b20f7e2238e6662886',
+ 'org.briarproject:jtorctl:0.5:jtorctl-0.5.jar:43f8c7d390169772b9a2c82ab806c8414c136a2a8636c555e22754bb7260793b',
+ 'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011',
'org.briarproject:obfs4proxy-linux:0.0.14-tor2:obfs4proxy-linux-0.0.14-tor2.jar:bb2431092b5ad998ad620b0223e725c0f7e43f1b02af2f097a2544edc1fd9738',
'org.briarproject:obfs4proxy-windows:0.0.14-tor2:obfs4proxy-windows-0.0.14-tor2.jar:b5fbd00a8c35ccf095b265370752390e4cd46055331049c4dfcc236dc9c650ac',
+ 'org.briarproject:onionwrapper-core:0.0.1:onionwrapper-core-0.0.1.jar:a1937506b00ee6620e909a500e5d004be81f94a6f7d7c898e1a9e841a8ae8a2a',
+ 'org.briarproject:onionwrapper-java:0.0.1:onionwrapper-java-0.0.1.jar:102ccea934d02b13702fd28e890e27e342db8b669a4c84bb54a3783cb8926552',
'org.briarproject:snowflake-linux:2.5.1:snowflake-linux-2.5.1.jar:edc807dcb7758365970d95525e4749349a27f462d0e2df6505ad1ca65fb296d2',
'org.briarproject:snowflake-windows:2.5.1:snowflake-windows-2.5.1.jar:700ec9c68dc033f544daa4ca3547c89e523aed66500cf4b3ac51fe017c51e7be',
'org.briarproject:tor-linux:0.4.7.13-2:tor-linux-0.4.7.13-2.jar:1e4ca9e0f724e1f17fcce570832704942cc3be26c4c2eccbe5aae29f35afa307',
diff --git a/build.gradle b/build.gradle
index d9bd69eda..c6c2d6d21 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,7 +3,6 @@
allprojects {
repositories {
mavenCentral()
- mavenLocal()
google()
maven { url "https://jitpack.io" }
}
@@ -19,7 +18,6 @@ allprojects {
buildscript {
repositories {
- mavenLocal()
google()
maven {
url 'https://plugins.gradle.org/m2/'
@@ -40,6 +38,7 @@ buildscript {
junit_version = "4.13.2"
jmock_version = '2.12.0'
mockwebserver_version = '4.9.3'
+ onionwrapper_version = '0.0.1'
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.2'