From 15f5e75c2ad06d5dca20a4bd84d628f2458265df Mon Sep 17 00:00:00 2001
From: cyBerta <cyberta@riseup.net>
Date: Mon, 13 Jan 2025 23:16:37 +0100
Subject: [PATCH] fix crash when entering invalid invite token

---
 .../bitmaskclient/base/utils/ConfigHelper.java    | 15 +++++++++++++--
 .../providersetup/ProviderApiManagerBase.java     |  5 +++--
 .../base/utils/ConfigHelperTest.java              |  9 +++++++++
 3 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java b/app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java
index 0e192882c..c7087b672 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java
@@ -230,8 +230,19 @@ public class ConfigHelper {
     public static boolean isDomainName(String url) {
         return url != null && Patterns.DOMAIN_NAME.matcher(url).matches();
     }
-    public static String getDomainFromMainURL(@NonNull String mainUrl) throws NullPointerException {
-        return PublicSuffixDatabase.Companion.get().getEffectiveTldPlusOne(mainUrl).replaceFirst("http[s]?://", "").replaceFirst("/.*", "");
+
+    /**
+     * Extracts a domain from a given URL
+     * @param mainUrl URL as String
+     * @return Domain as String, null if mainUrl is an invalid URL
+     */
+    public static String getDomainFromMainURL(String mainUrl) {
+        try {
+            String topLevelDomain = PublicSuffixDatabase.Companion.get().getEffectiveTldPlusOne(mainUrl);
+            return topLevelDomain.replaceFirst("http[s]?://", "").replaceFirst("/.*", "");
+        } catch (NullPointerException | IllegalArgumentException e) {
+            return null;
+        }
     }
     
     public static boolean isCalyxOSWithTetheringSupport(Context context) {
diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerBase.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerBase.java
index 60a41325e..25a9fcce8 100644
--- a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerBase.java
+++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerBase.java
@@ -136,6 +136,9 @@ public abstract class ProviderApiManagerBase {
 
     protected void getPersistedProviderUpdates(Provider provider) {
         String providerDomain = getDomainFromMainURL(provider.getMainUrl());
+        if (providerDomain == null) {
+            return;
+        }
         if (hasUpdatedProviderDetails(providerDomain)) {
             provider.setCaCert(getPersistedProviderCA(providerDomain));
             provider.define(getPersistedProviderDefinition(providerDomain));
@@ -155,8 +158,6 @@ public abstract class ProviderApiManagerBase {
         }
     }
 
-
-
     protected String getPersistedPrivateKey(String providerDomain) {
         return getFromPersistedProvider(PROVIDER_PRIVATE_KEY, providerDomain);
     }
diff --git a/app/src/test/java/se/leap/bitmaskclient/base/utils/ConfigHelperTest.java b/app/src/test/java/se/leap/bitmaskclient/base/utils/ConfigHelperTest.java
index c63871651..fd862f2b3 100644
--- a/app/src/test/java/se/leap/bitmaskclient/base/utils/ConfigHelperTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/base/utils/ConfigHelperTest.java
@@ -1,6 +1,7 @@
 package se.leap.bitmaskclient.base.utils;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import com.tngtech.java.junit.dataprovider.DataProvider;
@@ -65,6 +66,14 @@ public class ConfigHelperTest {
         assertEquals("domain.co.uk", ConfigHelper.getDomainFromMainURL("https://domain.co.uk"));
     }
 
+    @Test
+    public void testGetDomainFromMainURL_returnNullIfInvalid() {
+        assertNull(ConfigHelper.getDomainFromMainURL("https://localhost"));
+        assertNull(ConfigHelper.getDomainFromMainURL("http://localhost"));
+        assertNull(ConfigHelper.getDomainFromMainURL("invalidrandomstring"));
+        assertNull(ConfigHelper.getDomainFromMainURL(null));
+    }
+
     @Test
     public void testParseX509CertificatesFromString() throws IOException {
         ArrayList<X509Certificate> certs = ConfigHelper.parseX509CertificatesFromString(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("updated_cert.pem")));
-- 
GitLab