Use non-default obfs4 bridges in countries that use DPI.

This commit is contained in:
akwizgran
2022-06-07 12:18:24 +01:00
parent bb71de1a78
commit 2fd948b81d
3 changed files with 15 additions and 17 deletions

View File

@@ -27,7 +27,7 @@ public interface CircumventionProvider {
* Countries where bridge connections are likely to work. * Countries where bridge connections are likely to work.
* Should be a subset of {@link #BLOCKED} and the union of * Should be a subset of {@link #BLOCKED} and the union of
* {@link #DEFAULT_BRIDGES}, {@link #NON_DEFAULT_BRIDGES} and * {@link #DEFAULT_BRIDGES}, {@link #NON_DEFAULT_BRIDGES} and
* {@link #MEEK_BRIDGES}. * {@link #DPI_BRIDGES}.
*/ */
String[] BRIDGES = {"BY", "CN", "EG", "IR", "RU", "TM", "VE"}; String[] BRIDGES = {"BY", "CN", "EG", "IR", "RU", "TM", "VE"};
@@ -44,10 +44,10 @@ public interface CircumventionProvider {
String[] NON_DEFAULT_BRIDGES = {"BY", "RU", "TM"}; String[] NON_DEFAULT_BRIDGES = {"BY", "RU", "TM"};
/** /**
* Countries where obfs4 and vanilla bridges won't work and meek is needed. * Countries where vanilla bridges are blocked via DPI but non-default
* Should be a subset of {@link #BRIDGES}. * obfs4 bridges and meek may work. Should be a subset of {@link #BRIDGES}.
*/ */
String[] MEEK_BRIDGES = {"CN", "IR"}; String[] DPI_BRIDGES = {"CN", "IR"};
/** /**
* Returns true if vanilla Tor connections are blocked in the given country. * Returns true if vanilla Tor connections are blocked in the given country.

View File

@@ -14,7 +14,6 @@ import javax.annotation.concurrent.Immutable;
import javax.inject.Inject; import javax.inject.Inject;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull; import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BridgeType.DEFAULT_OBFS4; import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BridgeType.DEFAULT_OBFS4;
import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BridgeType.MEEK; import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BridgeType.MEEK;
@@ -35,8 +34,8 @@ class CircumventionProviderImpl implements CircumventionProvider {
new HashSet<>(asList(DEFAULT_BRIDGES)); new HashSet<>(asList(DEFAULT_BRIDGES));
private static final Set<String> NON_DEFAULT_BRIDGE_COUNTRIES = private static final Set<String> NON_DEFAULT_BRIDGE_COUNTRIES =
new HashSet<>(asList(NON_DEFAULT_BRIDGES)); new HashSet<>(asList(NON_DEFAULT_BRIDGES));
private static final Set<String> MEEK_COUNTRIES = private static final Set<String> DPI_COUNTRIES =
new HashSet<>(asList(MEEK_BRIDGES)); new HashSet<>(asList(DPI_BRIDGES));
@Inject @Inject
CircumventionProviderImpl() { CircumventionProviderImpl() {
@@ -58,8 +57,8 @@ class CircumventionProviderImpl implements CircumventionProvider {
return asList(DEFAULT_OBFS4, VANILLA); return asList(DEFAULT_OBFS4, VANILLA);
} else if (NON_DEFAULT_BRIDGE_COUNTRIES.contains(countryCode)) { } else if (NON_DEFAULT_BRIDGE_COUNTRIES.contains(countryCode)) {
return asList(NON_DEFAULT_OBFS4, VANILLA); return asList(NON_DEFAULT_OBFS4, VANILLA);
} else if (MEEK_COUNTRIES.contains(countryCode)) { } else if (DPI_COUNTRIES.contains(countryCode)) {
return singletonList(MEEK); return asList(NON_DEFAULT_OBFS4, MEEK);
} else { } else {
return asList(DEFAULT_OBFS4, VANILLA); return asList(DEFAULT_OBFS4, VANILLA);
} }

View File

@@ -7,7 +7,6 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BLOCKED; import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BLOCKED;
import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BRIDGES; import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BRIDGES;
import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BridgeType.DEFAULT_OBFS4; import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BridgeType.DEFAULT_OBFS4;
@@ -15,7 +14,7 @@ import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BridgeTy
import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BridgeType.NON_DEFAULT_OBFS4; import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BridgeType.NON_DEFAULT_OBFS4;
import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BridgeType.VANILLA; import static org.briarproject.bramble.plugin.tor.CircumventionProvider.BridgeType.VANILLA;
import static org.briarproject.bramble.plugin.tor.CircumventionProvider.DEFAULT_BRIDGES; import static org.briarproject.bramble.plugin.tor.CircumventionProvider.DEFAULT_BRIDGES;
import static org.briarproject.bramble.plugin.tor.CircumventionProvider.MEEK_BRIDGES; import static org.briarproject.bramble.plugin.tor.CircumventionProvider.DPI_BRIDGES;
import static org.briarproject.bramble.plugin.tor.CircumventionProvider.NON_DEFAULT_BRIDGES; import static org.briarproject.bramble.plugin.tor.CircumventionProvider.NON_DEFAULT_BRIDGES;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@@ -32,18 +31,18 @@ public class CircumventionProviderTest extends BrambleTestCase {
Set<String> defaultBridges = new HashSet<>(asList(DEFAULT_BRIDGES)); Set<String> defaultBridges = new HashSet<>(asList(DEFAULT_BRIDGES));
Set<String> nonDefaultBridges = Set<String> nonDefaultBridges =
new HashSet<>(asList(NON_DEFAULT_BRIDGES)); new HashSet<>(asList(NON_DEFAULT_BRIDGES));
Set<String> meekBridges = new HashSet<>(asList(MEEK_BRIDGES)); Set<String> dpiBridges = new HashSet<>(asList(DPI_BRIDGES));
// BRIDGES should be a subset of BLOCKED // BRIDGES should be a subset of BLOCKED
assertTrue(blocked.containsAll(bridges)); assertTrue(blocked.containsAll(bridges));
// BRIDGES should be the union of the bridge type sets // BRIDGES should be the union of the bridge type sets
Set<String> union = new HashSet<>(defaultBridges); Set<String> union = new HashSet<>(defaultBridges);
union.addAll(nonDefaultBridges); union.addAll(nonDefaultBridges);
union.addAll(meekBridges); union.addAll(dpiBridges);
assertEquals(bridges, union); assertEquals(bridges, union);
// The bridge type sets should not overlap // The bridge type sets should not overlap
assertEmptyIntersection(defaultBridges, nonDefaultBridges); assertEmptyIntersection(defaultBridges, nonDefaultBridges);
assertEmptyIntersection(defaultBridges, meekBridges); assertEmptyIntersection(defaultBridges, dpiBridges);
assertEmptyIntersection(nonDefaultBridges, meekBridges); assertEmptyIntersection(nonDefaultBridges, dpiBridges);
} }
@Test @Test
@@ -56,8 +55,8 @@ public class CircumventionProviderTest extends BrambleTestCase {
assertEquals(asList(NON_DEFAULT_OBFS4, VANILLA), assertEquals(asList(NON_DEFAULT_OBFS4, VANILLA),
provider.getSuitableBridgeTypes(country)); provider.getSuitableBridgeTypes(country));
} }
for (String country : MEEK_BRIDGES) { for (String country : DPI_BRIDGES) {
assertEquals(singletonList(MEEK), assertEquals(asList(NON_DEFAULT_OBFS4, MEEK),
provider.getSuitableBridgeTypes(country)); provider.getSuitableBridgeTypes(country));
} }
assertEquals(asList(DEFAULT_OBFS4, VANILLA), assertEquals(asList(DEFAULT_OBFS4, VANILLA),