From eac1f9ed745cdf060ea9c6b12a830b4cdbb613f0 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Tue, 26 Jun 2018 15:48:49 -0300
Subject: [PATCH] MVP for bridge support

---
 .../plugin/tor/TorNetworkMetadata.java        | 20 ++++++++++++++++++-
 .../bramble/plugin/tor/TorPlugin.java         | 11 ++++++++--
 bramble-android/src/main/res/raw/torrc        |  5 +++++
 3 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorNetworkMetadata.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorNetworkMetadata.java
index e6151d5740..a6b28c19aa 100644
--- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorNetworkMetadata.java
+++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorNetworkMetadata.java
@@ -6,13 +6,31 @@ import java.util.Set;
 
 class TorNetworkMetadata {
 
+	/**
+	 * Countries where Tor is blocked, i.e. vanilla Tor connection won't work.
+	 */
+	private static final String[] BLOCKED = { "CN", "IR", "EG", "SY", "VE" };
+
+	/**
+	 * Countries where vanilla bridge connection are likely to work.
+	 * Should be a subset of {@link #BLOCKED}.
+	 */
+	private static final String[] BRIDGES = { "SY", "VE" };
+
 	// See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
 	// and https://trac.torproject.org/projects/tor/wiki/doc/OONI/censorshipwiki
 	// TODO: get a more complete list
 	private static final Set<String> BLOCKED_IN_COUNTRIES =
-			new HashSet<>(Arrays.asList("CN", "IR", "SY", "ZZ"));
+			new HashSet<>(Arrays.asList(BLOCKED));
+	private static final Set<String> BRIDGES_WORK_IN_COUNTRIES =
+			new HashSet<>(Arrays.asList(BRIDGES));
 
 	static boolean isTorProbablyBlocked(String countryCode) {
 		return BLOCKED_IN_COUNTRIES.contains(countryCode);
 	}
+
+	static boolean doBridgesWork(String countryCode) {
+		return BRIDGES_WORK_IN_COUNTRIES.contains(countryCode);
+	}
+
 }
diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
index 015056b49b..5851c385ac 100644
--- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
+++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
@@ -91,6 +91,7 @@ import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK_
 import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK_WIFI;
 import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_PORT;
 import static org.briarproject.bramble.api.plugin.TorConstants.PROP_ONION;
+import static org.briarproject.bramble.plugin.tor.TorNetworkMetadata.doBridgesWork;
 import static org.briarproject.bramble.util.LogUtils.logException;
 import static org.briarproject.bramble.util.PrivacyUtils.scrubOnion;
 
@@ -678,8 +679,14 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
 					LOG.info("Disabling network, device is offline");
 					enableNetwork(false);
 				} else if (blocked) {
-					LOG.info("Disabling network, country is blocked");
-					enableNetwork(false);
+					if (doBridgesWork(country)) {
+						LOG.info("Enabling network, using bridges");
+						controlConnection.setConf("UseBridges", "1");
+						enableNetwork(true);
+					} else {
+						LOG.info("Disabling network, country is blocked");
+						enableNetwork(false);
+					}
 				} else if (network == PREF_TOR_NETWORK_NEVER
 						|| (network == PREF_TOR_NETWORK_WIFI && !wifi)) {
 					LOG.info("Disabling network due to data setting");
diff --git a/bramble-android/src/main/res/raw/torrc b/bramble-android/src/main/res/raw/torrc
index 3d27a7f205..d1f881dce7 100644
--- a/bramble-android/src/main/res/raw/torrc
+++ b/bramble-android/src/main/res/raw/torrc
@@ -4,3 +4,8 @@ DisableNetwork 1
 RunAsDaemon 1
 SafeSocks 1
 SocksPort 59050
+UseBridges 0
+Bridge 131.252.210.150:8081 0E858AC201BF0F3FA3C462F64844CBFFC7297A42
+Bridge 128.105.214.161:8081 1E326AAFB3FCB515015250D8FCCC8E37F91A153B
+Bridge 67.205.189.122:8443 12D64D5D44E20169585E7378580C0D33A872AD98
+Bridge 45.32.148.146:8443 0CE016FB2462D8BF179AE71F7D702D09DEAC3F1D
-- 
GitLab