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 e6151d57402152c170e4df476bd66080c2f62d3d..a6b28c19aa73b007a9a1f84f026774bdac2b3248 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 015056b49b8861fd86192becb8f73823e41b0442..5851c385acd4659f4f27f67dfdfe59d29d37629c 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 3d27a7f20593c2902a0620cdc0fe5f3906781ab9..d1f881dce723b65ea813650f596301922f996a0c 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