diff options
Diffstat (limited to 'app/src')
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); - } - } |
