From bce7d19ed788db52b5ec4cd89075796c05a09599 Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
Date: Fri, 8 Mar 2024 15:25:00 +0000
Subject: [PATCH] Add method for checking whether bridges should be used.

---
 .../onionwrapper/CircumventionProvider.java   | 16 +++++---------
 .../CircumventionProviderImpl.java            | 15 +++++++------
 .../CircumventionProviderImplTest.java        | 21 +++++++++++++++++++
 3 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/onionwrapper-core/src/main/java/org/briarproject/onionwrapper/CircumventionProvider.java b/onionwrapper-core/src/main/java/org/briarproject/onionwrapper/CircumventionProvider.java
index c437a42..78f14f3 100644
--- a/onionwrapper-core/src/main/java/org/briarproject/onionwrapper/CircumventionProvider.java
+++ b/onionwrapper-core/src/main/java/org/briarproject/onionwrapper/CircumventionProvider.java
@@ -50,6 +50,11 @@ public interface CircumventionProvider {
 	 */
 	String[] COUNTRIES_SNOWFLAKE = {"BY", "CN", "EG", "HK", "IR", "RU", "TM"};
 
+	/**
+	 * Returns true if bridges should be used by default in the given country.
+	 */
+	boolean shouldUseBridges(String countryCode);
+
 	/**
 	 * Returns the types of bridge connection that are suitable for the given country, or
 	 * {@link BridgeType#DEFAULT_OBFS4} and {@link BridgeType#VANILLA} if we don't have any
@@ -57,17 +62,6 @@ public interface CircumventionProvider {
 	 */
 	List<BridgeType> getSuitableBridgeTypes(String countryCode);
 
-	/**
-	 * Returns bridges of the given type that are usable in the given country.
-	 *
-	 * @param letsEncrypt Specifies whether the client is able to verify Let's Encrypt TLS
-	 * 		certificates signed with the IdentTrust DST Root X3 certificate. Versions of Android
-	 * 		older than 7.1 consider the certificate to have expired at the end of September 2021.
-	 * 		This parameter is currently ignored, as no domain-fronted bridges use Let's Encrypt
-	 * 		certificates.
-	 */
-	List<String> getBridges(BridgeType type, String countryCode, boolean letsEncrypt);
-
 	/**
 	 * Returns bridges of the given type that are usable in the given country.
 	 */
diff --git a/onionwrapper-core/src/main/java/org/briarproject/onionwrapper/CircumventionProviderImpl.java b/onionwrapper-core/src/main/java/org/briarproject/onionwrapper/CircumventionProviderImpl.java
index 4b53217..1c33da7 100644
--- a/onionwrapper-core/src/main/java/org/briarproject/onionwrapper/CircumventionProviderImpl.java
+++ b/onionwrapper-core/src/main/java/org/briarproject/onionwrapper/CircumventionProviderImpl.java
@@ -39,6 +39,15 @@ class CircumventionProviderImpl implements CircumventionProvider {
 	CircumventionProviderImpl() {
 	}
 
+	@Override
+	public boolean shouldUseBridges(String countryCode) {
+		return USE_DEFAULT_OBFS4.contains(countryCode) ||
+				USE_NON_DEFAULT_OBFS4.contains(countryCode) ||
+				USE_VANILLA.contains(countryCode) ||
+				USE_MEEK.contains(countryCode) ||
+				USE_SNOWFLAKE.contains(countryCode);
+	}
+
 	@Override
 	public List<BridgeType> getSuitableBridgeTypes(String countryCode) {
 		List<BridgeType> types = new ArrayList<>();
@@ -55,12 +64,6 @@ class CircumventionProviderImpl implements CircumventionProvider {
 		return types;
 	}
 
-	@Override
-	public List<String> getBridges(BridgeType type, String countryCode, boolean letsEncrypt) {
-		// The `letsEncrypt` parameter is ignored, as no domain-fronted bridges use Let's Encrypt
-		return getBridges(type, countryCode);
-	}
-
 	@Override
 	public List<String> getBridges(BridgeType type, String countryCode) {
 		ClassLoader cl = getClass().getClassLoader();
diff --git a/onionwrapper-core/src/test/java/org/briarproject/onionwrapper/CircumventionProviderImplTest.java b/onionwrapper-core/src/test/java/org/briarproject/onionwrapper/CircumventionProviderImplTest.java
index 83b8991..0f5c6fe 100644
--- a/onionwrapper-core/src/test/java/org/briarproject/onionwrapper/CircumventionProviderImplTest.java
+++ b/onionwrapper-core/src/test/java/org/briarproject/onionwrapper/CircumventionProviderImplTest.java
@@ -21,6 +21,27 @@ public class CircumventionProviderImplTest extends BaseTest {
 	private final CircumventionProviderImpl provider =
 			new CircumventionProviderImpl();
 
+	@Test
+	public void testShouldUseBridges() {
+		for (String countryCode : COUNTRIES_DEFAULT_OBFS4) {
+			assertTrue(provider.shouldUseBridges(countryCode));
+		}
+		for (String countryCode : COUNTRIES_NON_DEFAULT_OBFS4) {
+			assertTrue(provider.shouldUseBridges(countryCode));
+		}
+		for (String countryCode : COUNTRIES_VANILLA) {
+			assertTrue(provider.shouldUseBridges(countryCode));
+		}
+		for (String countryCode : COUNTRIES_MEEK) {
+			assertTrue(provider.shouldUseBridges(countryCode));
+		}
+		for (String countryCode : COUNTRIES_SNOWFLAKE) {
+			assertTrue(provider.shouldUseBridges(countryCode));
+		}
+		assertFalse(provider.shouldUseBridges("US"));
+		assertFalse(provider.shouldUseBridges("ZZ"));
+	}
+
 	@Test
 	public void testGetSuitableBridgeTypes() {
 		for (String countryCode : COUNTRIES_DEFAULT_OBFS4) {
-- 
GitLab