summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorcyberta <cyberta@riseup.net>2026-01-23 12:59:27 +0100
committercyberta <cyberta@riseup.net>2026-01-26 14:33:48 +0100
commitf61d448aed0ef86b589396bb1384eed3bbd1c0f3 (patch)
tree4f4e7602f5545e8b63af2c3e27de221489ba61f9 /app
parenta02b69c804a3366dfe7bdfcff9a9038a5bd25981 (diff)
ensure manually added v5 provider is properly saved after successfully configuring it
Diffstat (limited to 'app')
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/models/Provider.java7
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java105
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderAPI.java2
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManager.java1
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerBase.java102
5 files changed, 110 insertions, 107 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/models/Provider.java b/app/src/main/java/se/leap/bitmaskclient/base/models/Provider.java
index bca9fc9a..bf3fab04 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/models/Provider.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/models/Provider.java
@@ -47,7 +47,6 @@ import org.json.JSONException;
import org.json.JSONObject;
import java.net.MalformedURLException;
-import java.net.URISyntaxException;
import java.net.URL;
import java.security.PrivateKey;
import java.util.ArrayList;
@@ -981,7 +980,11 @@ public final class Provider implements Parcelable {
}
public void setIntroducer(String introducerUrl) throws NullPointerException, IllegalArgumentException {
- this.introducer = Introducer.fromUrl(introducerUrl);
+ this.introducer = Introducer.fromUrl(introducerUrl);
+ }
+
+ public void setIntroducer(Introducer introducer) {
+ this.introducer = introducer;
}
/**
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java b/app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java
index 7e8955cd..200617cf 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java
@@ -54,6 +54,10 @@ import static se.leap.bitmaskclient.base.models.Constants.USE_PORT_HOPPING;
import static se.leap.bitmaskclient.base.models.Constants.USE_SNOWFLAKE;
import static se.leap.bitmaskclient.base.models.Constants.USE_SYSTEM_PROXY;
import static se.leap.bitmaskclient.base.models.Constants.USE_TUNNEL;
+import static se.leap.bitmaskclient.base.models.Provider.CA_CERT;
+import static se.leap.bitmaskclient.base.models.Provider.GEOIP_URL;
+import static se.leap.bitmaskclient.base.models.Provider.PROVIDER_API_IP;
+import static se.leap.bitmaskclient.base.models.Provider.PROVIDER_IP;
import static se.leap.bitmaskclient.base.utils.BitmaskCoreProvider.getBitmaskMobile;
import android.content.Context;
@@ -208,15 +212,20 @@ public class PreferenceHelper {
Set<String> providerDomains = getCustomProviderDomains();
HashMap<String, Provider> customProviders = new HashMap<>();
for (String domain : providerDomains) {
- String mainURL = preferences.getString(Provider.MAIN_URL + "." + domain, null);
- if (mainURL != null) {
+ String mainURL = getFromPersistedProvider(Provider.MAIN_URL, domain);
+ if (!mainURL.isEmpty()) {
Introducer introducer = null;
try {
introducer = Introducer.fromUrl(BitmaskCoreProvider.getBitmaskMobile().getIntroducerURLByDomain(domain));
} catch (Exception e) {
e.printStackTrace();
}
- customProviders.put(mainURL, Provider.createCustomProvider(mainURL, domain, introducer));
+ Provider customProvider = new Provider(mainURL);
+ customProvider.setIntroducer(introducer);
+ if (hasUpdatedProviderDetails(domain)) {
+ getPersistedProviderUpdates(customProvider);
+ }
+ customProviders.put(mainURL, customProvider);
}
}
@@ -292,6 +301,10 @@ public class PreferenceHelper {
putStringSet(PROVIDER_MOTD_HASHES + "." + providerDomain, provider.getMotdLastSeenHashes()).
putLong(PROVIDER_MOTD_LAST_SEEN + "." + providerDomain, provider.getLastMotdSeen()).
putLong(PROVIDER_MOTD_LAST_UPDATED + "." + providerDomain, provider.getLastMotdUpdate()).
+ putString(PROVIDER_MODELS_GATEWAYS + "." + providerDomain, provider.getGatewaysJson()).
+ putString(PROVIDER_MODELS_BRIDGES + "." + providerDomain, provider.getBridgesJson()).
+ putString(PROVIDER_MODELS_EIPSERVICE + "." + providerDomain, provider.getServiceJson()).
+ putString(PROVIDER_MODELS_PROVIDER + "." + providerDomain, provider.getModelsProviderJson()).
apply();
}
}
@@ -339,6 +352,10 @@ public class PreferenceHelper {
remove(PROVIDER_MOTD_HASHES + "." + providerDomain).
remove(PROVIDER_MOTD_LAST_SEEN + "." + providerDomain).
remove(PROVIDER_MOTD_LAST_UPDATED + "." + providerDomain).
+ remove(PROVIDER_MODELS_PROVIDER + "." + providerDomain).
+ remove(PROVIDER_MODELS_EIPSERVICE + "." + providerDomain).
+ remove(PROVIDER_MODELS_GATEWAYS + "." + providerDomain).
+ remove(PROVIDER_MODELS_BRIDGES + "." + providerDomain).
apply();
}
}
@@ -360,6 +377,10 @@ public class PreferenceHelper {
remove(PROVIDER_MOTD_HASHES).
remove(PROVIDER_MOTD_LAST_SEEN).
remove(PROVIDER_MOTD_LAST_UPDATED).
+ remove(PROVIDER_MODELS_PROVIDER).
+ remove(PROVIDER_MODELS_EIPSERVICE).
+ remove(PROVIDER_MODELS_GATEWAYS).
+ remove(PROVIDER_MODELS_BRIDGES).
apply();
}
}
@@ -693,6 +714,84 @@ public class PreferenceHelper {
return result;
}
+ public static void getPersistedProviderUpdates(Provider provider) {
+ String providerDomain = provider.getDomain();
+ if (hasUpdatedProviderDetails(providerDomain)) {
+ provider.setCaCert(getPersistedProviderCA(providerDomain));
+ provider.define(getPersistedProviderDefinition(providerDomain));
+ provider.setPrivateKeyString(getPersistedPrivateKey(providerDomain));
+ provider.setVpnCertificate(getPersistedVPNCertificate(providerDomain));
+ provider.setProviderApiIp(getPersistedProviderApiIp(providerDomain));
+ provider.setProviderIp(getPersistedProviderIp(providerDomain));
+ provider.setGeoipUrl(getPersistedGeoIp(providerDomain)); // TODO: do we really need to persist the Geoip URL??
+ provider.setLastMotdSeen(getPersistedMotdLastSeen(providerDomain));
+ provider.setMotdLastSeenHashes(getPersistedMotdHashes(providerDomain));
+ provider.setLastMotdUpdate(getPersistedMotdLastUpdate(providerDomain));
+ provider.setMotdJson(getPersistedMotd(providerDomain));
+ provider.setModelsProvider(getFromPersistedProvider(PROVIDER_MODELS_PROVIDER, providerDomain));
+ provider.setService(getFromPersistedProvider(PROVIDER_MODELS_EIPSERVICE, providerDomain));
+ provider.setGateways(getFromPersistedProvider(PROVIDER_MODELS_GATEWAYS, providerDomain));
+ provider.setBridges(getFromPersistedProvider(PROVIDER_MODELS_BRIDGES, providerDomain));
+ }
+ }
+
+ public static String getPersistedPrivateKey(String providerDomain) {
+ return getFromPersistedProvider(PROVIDER_PRIVATE_KEY, providerDomain);
+ }
+
+ public static String getPersistedVPNCertificate(String providerDomain) {
+ return getFromPersistedProvider(PROVIDER_VPN_CERTIFICATE, providerDomain);
+ }
+
+ public static JSONObject getPersistedProviderDefinition(String providerDomain) {
+ try {
+ return new JSONObject(getFromPersistedProvider(Provider.KEY, providerDomain));
+ } catch (JSONException e) {
+ e.printStackTrace();
+ return new JSONObject();
+ }
+ }
+
+ public static String getPersistedProviderCA(String providerDomain) {
+ return getFromPersistedProvider(CA_CERT, providerDomain);
+ }
+
+ public static String getPersistedProviderApiIp(String providerDomain) {
+ return getFromPersistedProvider(PROVIDER_API_IP, providerDomain);
+ }
+
+ public static String getPersistedProviderIp(String providerDomain) {
+ return getFromPersistedProvider(PROVIDER_IP, providerDomain);
+ }
+
+ public static String getPersistedGeoIp(String providerDomain) {
+ return getFromPersistedProvider(GEOIP_URL, providerDomain);
+ }
+
+ public static JSONObject getPersistedMotd(String providerDomain) {
+ try {
+ return new JSONObject(getFromPersistedProvider(PROVIDER_MOTD, providerDomain));
+ } catch (JSONException e) {
+ return new JSONObject();
+ }
+ }
+
+ public static long getPersistedMotdLastSeen(String providerDomain) {
+ return getLongFromPersistedProvider(PROVIDER_MOTD_LAST_SEEN, providerDomain);
+ }
+
+ public static long getPersistedMotdLastUpdate(String providerDomain) {
+ return getLongFromPersistedProvider(PROVIDER_MOTD_LAST_UPDATED, providerDomain);
+ }
+
+ public static Set<String> getPersistedMotdHashes(String providerDomain) {
+ return getStringSetFromPersistedProvider(PROVIDER_MOTD_HASHES, providerDomain);
+ }
+
+ public static boolean hasUpdatedProviderDetails(String domain) {
+ return PreferenceHelper.hasKey(Provider.KEY + "." + domain) && PreferenceHelper.hasKey(CA_CERT + "." + domain);
+ }
+
public static void setExcludedApps(Set<String> apps) {
putStringSet(EXCLUDED_APPS, apps);
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderAPI.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderAPI.java
index a981a6ef..46b4f10b 100644
--- a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderAPI.java
+++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderAPI.java
@@ -30,6 +30,7 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import java.util.concurrent.TimeoutException;
import se.leap.bitmaskclient.base.models.Provider;
+import se.leap.bitmaskclient.base.utils.PreferenceHelper;
import se.leap.bitmaskclient.tor.TorServiceCommand;
/**
@@ -173,6 +174,7 @@ public class ProviderAPI extends JobIntentService implements ProviderApiManagerB
ProviderManager pm = ProviderManager.getInstance(this.getAssets());
pm.add(p);
pm.saveCustomProviders();
+ PreferenceHelper.storeProviderInPreferences(p);
}
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManager.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManager.java
index 55024b2c..d27253c6 100644
--- a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManager.java
+++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManager.java
@@ -2,6 +2,7 @@ package se.leap.bitmaskclient.providersetup;
import static se.leap.bitmaskclient.R.string.malformed_url;
import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_KEY;
+import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getPersistedProviderUpdates;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.DELAY;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.ERRORS;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.MISSING_NETWORK_CONNECTION;
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 25a9fcce..09273983 100644
--- a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerBase.java
+++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerBase.java
@@ -17,25 +17,7 @@
package se.leap.bitmaskclient.providersetup;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_MODELS_BRIDGES;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_MODELS_EIPSERVICE;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_MODELS_GATEWAYS;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_MODELS_PROVIDER;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_MOTD;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_MOTD_HASHES;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_MOTD_LAST_SEEN;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_MOTD_LAST_UPDATED;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_PRIVATE_KEY;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_VPN_CERTIFICATE;
-import static se.leap.bitmaskclient.base.models.Provider.CA_CERT;
-import static se.leap.bitmaskclient.base.models.Provider.GEOIP_URL;
-import static se.leap.bitmaskclient.base.models.Provider.PROVIDER_API_IP;
-import static se.leap.bitmaskclient.base.models.Provider.PROVIDER_IP;
import static se.leap.bitmaskclient.base.utils.CertificateHelper.getFingerprintFromCertificate;
-import static se.leap.bitmaskclient.base.utils.ConfigHelper.getDomainFromMainURL;
-import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getFromPersistedProvider;
-import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getLongFromPersistedProvider;
-import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getStringSetFromPersistedProvider;
import android.content.Intent;
import android.content.res.Resources;
@@ -47,12 +29,10 @@ import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
-import java.util.Set;
import java.util.concurrent.TimeoutException;
import se.leap.bitmaskclient.base.models.Provider;
import se.leap.bitmaskclient.base.utils.ConfigHelper;
-import se.leap.bitmaskclient.base.utils.PreferenceHelper;
/**
* Implements the logic of the http api calls. The methods of this class needs to be called from
@@ -134,86 +114,4 @@ public abstract class ProviderApiManagerBase {
return result;
}
- 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));
- provider.setPrivateKeyString(getPersistedPrivateKey(providerDomain));
- provider.setVpnCertificate(getPersistedVPNCertificate(providerDomain));
- provider.setProviderApiIp(getPersistedProviderApiIp(providerDomain));
- provider.setProviderIp(getPersistedProviderIp(providerDomain));
- provider.setGeoipUrl(getPersistedGeoIp(providerDomain)); // TODO: do we really need to persist the Geoip URL??
- provider.setLastMotdSeen(getPersistedMotdLastSeen(providerDomain));
- provider.setMotdLastSeenHashes(getPersistedMotdHashes(providerDomain));
- provider.setLastMotdUpdate(getPersistedMotdLastUpdate(providerDomain));
- provider.setMotdJson(getPersistedMotd(providerDomain));
- provider.setModelsProvider(getFromPersistedProvider(PROVIDER_MODELS_PROVIDER, providerDomain));
- provider.setService(getFromPersistedProvider(PROVIDER_MODELS_EIPSERVICE, providerDomain));
- provider.setGateways(getFromPersistedProvider(PROVIDER_MODELS_GATEWAYS, providerDomain));
- provider.setBridges(getFromPersistedProvider(PROVIDER_MODELS_BRIDGES, providerDomain));
- }
- }
-
- protected String getPersistedPrivateKey(String providerDomain) {
- return getFromPersistedProvider(PROVIDER_PRIVATE_KEY, providerDomain);
- }
-
- protected String getPersistedVPNCertificate(String providerDomain) {
- return getFromPersistedProvider(PROVIDER_VPN_CERTIFICATE, providerDomain);
- }
-
- protected JSONObject getPersistedProviderDefinition(String providerDomain) {
- try {
- return new JSONObject(getFromPersistedProvider(Provider.KEY, providerDomain));
- } catch (JSONException e) {
- e.printStackTrace();
- return new JSONObject();
- }
- }
-
- protected String getPersistedProviderCA(String providerDomain) {
- return getFromPersistedProvider(CA_CERT, providerDomain);
- }
-
- protected String getPersistedProviderApiIp(String providerDomain) {
- return getFromPersistedProvider(PROVIDER_API_IP, providerDomain);
- }
-
- protected String getPersistedProviderIp(String providerDomain) {
- return getFromPersistedProvider(PROVIDER_IP, providerDomain);
- }
-
- protected String getPersistedGeoIp(String providerDomain) {
- return getFromPersistedProvider(GEOIP_URL, providerDomain);
- }
-
- protected JSONObject getPersistedMotd(String providerDomain) {
- try {
- return new JSONObject(getFromPersistedProvider(PROVIDER_MOTD, providerDomain));
- } catch (JSONException e) {
- return new JSONObject();
- }
- }
-
- protected long getPersistedMotdLastSeen(String providerDomain) {
- return getLongFromPersistedProvider(PROVIDER_MOTD_LAST_SEEN, providerDomain);
- }
-
- protected long getPersistedMotdLastUpdate(String providerDomain) {
- return getLongFromPersistedProvider(PROVIDER_MOTD_LAST_UPDATED, providerDomain);
- }
-
- protected Set<String> getPersistedMotdHashes(String providerDomain) {
- return getStringSetFromPersistedProvider(PROVIDER_MOTD_HASHES, providerDomain);
- }
-
-
- protected boolean hasUpdatedProviderDetails(String domain) {
- return PreferenceHelper.hasKey(Provider.KEY + "." + domain) && PreferenceHelper.hasKey(CA_CERT + "." + domain);
- }
-
}