From fd0b174ac99d38b029949b95a296bedb92198a3f Mon Sep 17 00:00:00 2001
From: cyBerta <cyberta@riseup.net>
Date: Thu, 27 Mar 2025 02:45:23 +0100
Subject: [PATCH 1/4] set bitmask-core's debug mode before fetching
 ServiceInfos in case app is a debug build

---
 .../leap/bitmaskclient/providersetup/ProviderApiManagerV5.java   | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
index 2e2497d51..f8492f0a0 100644
--- a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
+++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
@@ -103,6 +103,7 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
         BitmaskMobile bm;
         try {
             bm = new BitmaskMobile(provider.getMainUrl(), new PreferenceHelper.SharedPreferenceStore());
+            bm.setDebug(BuildConfig.DEBUG);
         } catch (IllegalStateException e) {
             return eventSender.setErrorResult(currentDownload, R.string.config_error_found, null);
         }
-- 
GitLab


From 2640a2e5b7da2c308033a433ed5c8df0b3f7229c Mon Sep 17 00:00:00 2001
From: cyBerta <cyberta@riseup.net>
Date: Thu, 27 Mar 2025 02:49:56 +0100
Subject: [PATCH 2/4] implement updating VPN certificate in v5, also fixes a
 NPE

---
 .../providersetup/ProviderApiManagerV5.java   | 33 +++++++++++++++++--
 1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
index f8492f0a0..d5640126d 100644
--- a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
+++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
@@ -9,9 +9,11 @@ import static se.leap.bitmaskclient.base.models.Constants.BROADCAST_RESULT_KEY;
 import static se.leap.bitmaskclient.base.models.Constants.COUNTRYCODE;
 import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_KEY;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.CORRECTLY_DOWNLOADED_EIP_SERVICE;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.CORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.DOWNLOAD_SERVICE_JSON;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.ERRORS;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.INCORRECTLY_DOWNLOADED_EIP_SERVICE;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.INCORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.PROVIDER_NOK;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.PROVIDER_OK;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.QUIETLY_UPDATE_VPN_CERTIFICATE;
@@ -19,8 +21,8 @@ import static se.leap.bitmaskclient.providersetup.ProviderAPI.SET_UP_PROVIDER;
 import static se.leap.bitmaskclient.providersetup.ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE;
 import static se.leap.bitmaskclient.providersetup.ProviderSetupFailedDialog.DOWNLOAD_ERRORS.ERROR_INVALID_CERTIFICATE;
 import static se.leap.bitmaskclient.providersetup.ProviderSetupObservable.DOWNLOADED_V5_BRIDGES;
-import static se.leap.bitmaskclient.providersetup.ProviderSetupObservable.DOWNLOADED_V5_SERVICE_JSON;
 import static se.leap.bitmaskclient.providersetup.ProviderSetupObservable.DOWNLOADED_V5_GATEWAYS;
+import static se.leap.bitmaskclient.providersetup.ProviderSetupObservable.DOWNLOADED_V5_SERVICE_JSON;
 import static se.leap.bitmaskclient.providersetup.ProviderSetupObservable.DOWNLOADED_VPN_CERTIFICATE;
 import static se.leap.bitmaskclient.tor.TorStatusObservable.TorStatus.OFF;
 
@@ -84,7 +86,6 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
                 break;
 
             case QUIETLY_UPDATE_VPN_CERTIFICATE:
-            case UPDATE_INVALID_VPN_CERTIFICATE:
                 result = updateVpnCertificate(provider);
                 if (result.getBoolean(BROADCAST_RESULT_KEY)) {
                     Log.d(TAG, "successfully downloaded VPN certificate");
@@ -93,6 +94,14 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
                     ProviderObservable.getInstance().updateProvider(provider);
                 }
                 break;
+            case UPDATE_INVALID_VPN_CERTIFICATE:
+                result = updateVpnCertificate(provider);
+                if (result.getBoolean(BROADCAST_RESULT_KEY)) {
+                    eventSender.sendToReceiverOrBroadcast(receiver, CORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE, result, provider);
+                } else {
+                    eventSender.sendToReceiverOrBroadcast(receiver, INCORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE, result, provider);
+                }
+                break;
         }
 
     }
@@ -314,7 +323,25 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
     }
 
     protected Bundle updateVpnCertificate(Provider provider) {
-        return null;
+        Bundle currentDownload = new Bundle();
+        BitmaskMobile bm;
+        try {
+            bm = new BitmaskMobile(provider.getMainUrl(), new PreferenceHelper.SharedPreferenceStore());
+            bm.setDebug(BuildConfig.DEBUG);
+        } catch (IllegalStateException e) {
+            return eventSender.setErrorResult(currentDownload, R.string.config_error_found, null);
+        }
+
+        try {
+            String cert = bm.getOpenVPNCert();
+            currentDownload = loadCredentials(provider, cert);
+            currentDownload = validateCertificateForProvider(currentDownload, provider);
+            ProviderSetupObservable.updateProgress(DOWNLOADED_VPN_CERTIFICATE);
+        } catch (Exception e) {
+            return eventSender.setErrorResult(currentDownload, R.string.error_json_exception_user_message, null);
+        }
+
+        return currentDownload;
     }
 
 }
-- 
GitLab


From 495252b807bbf2d5e27ed7f3d86e6ba571eeb391 Mon Sep 17 00:00:00 2001
From: cyBerta <cyberta@riseup.net>
Date: Thu, 27 Mar 2025 02:54:16 +0100
Subject: [PATCH 3/4] fix updateServiceInfo() in v5, ensure the authentication
 token is used (if available) when fetching bridges or gateways

---
 .../providersetup/ProviderApiManagerV5.java           | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
index d5640126d..71394edad 100644
--- a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
+++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
@@ -130,12 +130,21 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
             return eventSender.setErrorResult(currentDownload, R.string.config_error_found, null);
         }
 
+        try {
+            if (provider.hasIntroducer()) {
+                    bm.setIntroducer(provider.getIntroducer().toUrl());
+            }
+        } catch (Exception e) {
+            return eventSender.setErrorResult(currentDownload, R.string.config_error_found, null);
+        }
+
         if (PreferenceHelper.getUseBridges()) {
             try {
                 String bridgesJson = bm.getAllBridges("", "", "", "");
                 provider.setBridges(bridgesJson);
             } catch (Exception e) {
                 // TODO: send failed to fetch bridges event
+                return eventSender.setErrorResult(currentDownload, R.string.config_error_found, null);
             }
         } else {
             try {
@@ -147,7 +156,7 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
 
             }
         }
-
+        currentDownload.putBoolean(BROADCAST_RESULT_KEY, true);
         return currentDownload;
 
     }
-- 
GitLab


From c7cebef8ea796c7c43d40a31fea4034010185cb5 Mon Sep 17 00:00:00 2001
From: cyBerta <cyberta@riseup.net>
Date: Thu, 27 Mar 2025 02:55:01 +0100
Subject: [PATCH 4/4] remove deprecated TODOs

---
 .../leap/bitmaskclient/providersetup/ProviderApiManagerV5.java  | 2 --
 1 file changed, 2 deletions(-)

diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
index 71394edad..2680f612f 100644
--- a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
+++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV5.java
@@ -210,7 +210,6 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
         }
 
         try {
-            // TODO: check if provider supports this API endpoint?
             String gatewaysJson = bm.getAllGateways("", "", "");
             Log.d(TAG, "gateways Json reponse: " + gatewaysJson);
             provider.setGateways(gatewaysJson);
@@ -222,7 +221,6 @@ public class ProviderApiManagerV5 extends ProviderApiManagerBase implements IPro
         }
 
         try {
-            // TODO: check if provider supports this API endpoint?
             String bridgesJson = bm.getAllBridges("", "", "", "");
             Log.d(TAG, "bridges Json reponse: " + bridgesJson);
             provider.setBridges(bridgesJson);
-- 
GitLab