From 49b18fcdc45433d34eefb46ab236144e19022dcb Mon Sep 17 00:00:00 2001 From: cyBerta Date: Thu, 23 Jul 2020 16:56:41 +0200 Subject: implement gateway selection based on geoip service --- .../main/java/se/leap/bitmaskclient/Provider.java | 164 ++++++++++++++------- 1 file changed, 109 insertions(+), 55 deletions(-) (limited to 'app/src/main/java/se/leap/bitmaskclient/Provider.java') diff --git a/app/src/main/java/se/leap/bitmaskclient/Provider.java b/app/src/main/java/se/leap/bitmaskclient/Provider.java index 8db3cc97..9d1b0095 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Provider.java +++ b/app/src/main/java/se/leap/bitmaskclient/Provider.java @@ -18,7 +18,6 @@ package se.leap.bitmaskclient; import android.os.Parcel; import android.os.Parcelable; -import androidx.annotation.NonNull; import com.google.gson.Gson; @@ -46,8 +45,10 @@ import static se.leap.bitmaskclient.ProviderAPI.ERRORS; public final class Provider implements Parcelable { private static long EIP_SERVICE_TIMEOUT = 1000 * 60 * 60 * 24 * 3; + private static long GEOIP_SERVICE_TIMEOUT = 1000 * 60 * 60; private JSONObject definition = new JSONObject(); // Represents our Provider's provider.json private JSONObject eipServiceJson = new JSONObject(); + private JSONObject geoIpJson = new JSONObject(); private DefaultedURL mainUrl = new DefaultedURL(); private DefaultedURL apiUrl = new DefaultedURL(); private DefaultedURL geoipUrl = new DefaultedURL(); @@ -60,6 +61,7 @@ public final class Provider implements Parcelable { private String privateKey = ""; private String vpnCertificate = ""; private long lastEipServiceUpdate = 0L; + private long lastGeoIpUpdate = 0L; private boolean allowAnonymous; private boolean allowRegistered; @@ -96,11 +98,7 @@ public final class Provider implements Parcelable { } catch (MalformedURLException e) { this.mainUrl = new DefaultedURL(); } - try { - this.geoipUrl.setUrl(new URL(geoipUrl)); - } catch (MalformedURLException e) { - this.geoipUrl = new DefaultedURL(); - } + setGeoipUrl(geoipUrl); } public Provider(String mainUrl, String providerIp, String providerApiIp) { @@ -120,11 +118,7 @@ public final class Provider implements Parcelable { e.printStackTrace(); return; } - try { - this.geoipUrl.setUrl(new URL(geoipUrl)); - } catch (MalformedURLException e) { - this.geoipUrl = new DefaultedURL(); - } + setGeoipUrl(geoipUrl); } @@ -252,11 +246,19 @@ public final class Provider implements Parcelable { protected DefaultedURL getApiUrl() { return apiUrl; } - - protected DefaultedURL getGeoipUrl() { + + public DefaultedURL getGeoipUrl() { return geoipUrl; } + public void setGeoipUrl(String url) { + try { + this.geoipUrl.setUrl(new URL(url)); + } catch (MalformedURLException e) { + this.geoipUrl = new DefaultedURL(); + } + } + protected String getApiUrlWithVersion() { return getApiUrlString() + "/" + getApiVersion(); } @@ -278,6 +280,10 @@ public final class Provider implements Parcelable { return definition != null && definition.length() > 0; } + public boolean hasGeoIpJson() { + return geoIpJson != null && geoIpJson.length() > 0; + } + public String getCaCert() { return caCert; @@ -341,19 +347,71 @@ public final class Provider implements Parcelable { parcel.writeString(getDefinitionString()); parcel.writeString(getCaCert()); parcel.writeString(getEipServiceJsonString()); + parcel.writeString(getGeoIpJsonString()); parcel.writeString(getPrivateKey()); parcel.writeString(getVpnCertificate()); parcel.writeLong(lastEipServiceUpdate); + parcel.writeLong(lastGeoIpUpdate); + } + + + //TODO: write a test for marshalling! + private Provider(Parcel in) { + try { + mainUrl.setUrl(new URL(in.readString())); + String tmpString = in.readString(); + if (!tmpString.isEmpty()) { + providerIp = tmpString; + } + tmpString = in.readString(); + if (!tmpString.isEmpty()) { + providerApiIp = tmpString; + } + tmpString = in.readString(); + if (!tmpString.isEmpty()) { + geoipUrl.setUrl(new URL(tmpString)); + } + tmpString = in.readString(); + if (!tmpString.isEmpty()) { + definition = new JSONObject((tmpString)); + parseDefinition(definition); + } + tmpString = in.readString(); + if (!tmpString.isEmpty()) { + this.caCert = tmpString; + } + tmpString = in.readString(); + if (!tmpString.isEmpty()) { + this.setEipServiceJson(new JSONObject(tmpString)); + } + tmpString = in.readString(); + if (!tmpString.isEmpty()) { + this.setGeoIpJson(new JSONObject(tmpString)); + } + tmpString = in.readString(); + if (!tmpString.isEmpty()) { + this.setPrivateKey(tmpString); + } + tmpString = in.readString(); + if (!tmpString.isEmpty()) { + this.setVpnCertificate(tmpString); + } + this.lastEipServiceUpdate = in.readLong(); + this.lastGeoIpUpdate = in.readLong(); + } catch (MalformedURLException | JSONException e) { + e.printStackTrace(); + } } + @Override public boolean equals(Object o) { if (o instanceof Provider) { Provider p = (Provider) o; return p.getDomain().equals(getDomain()) && definition.toString().equals(p.getDefinition().toString()) && - eipServiceJson.toString().equals(p.getEipServiceJson().toString())&& - mainUrl.equals(p.getMainUrl()) && + eipServiceJson.toString().equals(p.getEipServiceJsonString()) && + geoIpJson.toString().equals(p.getGeoIpJsonString()) && providerIp.equals(p.getProviderIp()) && providerApiIp.equals(p.getProviderApiIp()) && apiUrl.equals(p.getApiUrl()) && @@ -366,10 +424,12 @@ public final class Provider implements Parcelable { vpnCertificate.equals(p.getVpnCertificate()) && allowAnonymous == p.allowsAnonymous() && allowRegistered == p.allowsRegistered() && - lastEipServiceUpdate == p.getLastEipServiceUpdate(); + lastEipServiceUpdate == p.getLastEipServiceUpdate() && + lastGeoIpUpdate == p.getLastGeoIpUpdate(); } else return false; } + public JSONObject toJson() { JSONObject json = new JSONObject(); try { @@ -390,45 +450,6 @@ public final class Provider implements Parcelable { return new Gson().toJson(this); } - //TODO: write a test for marshalling! - private Provider(Parcel in) { - try { - mainUrl.setUrl(new URL(in.readString())); - String tmpString = in.readString(); - if (!tmpString.isEmpty()) { - providerIp = tmpString; - } - tmpString = in.readString(); - if (!tmpString.isEmpty()) { - providerApiIp = tmpString; - } - tmpString = in.readString(); - if (!tmpString.isEmpty()) { - definition = new JSONObject((tmpString)); - parseDefinition(definition); - } - tmpString = in.readString(); - if (!tmpString.isEmpty()) { - this.caCert = tmpString; - } - tmpString = in.readString(); - if (!tmpString.isEmpty()) { - this.setEipServiceJson(new JSONObject(tmpString)); - } - tmpString = in.readString(); - if (!tmpString.isEmpty()) { - this.setPrivateKey(tmpString); - } - tmpString = in.readString(); - if (!tmpString.isEmpty()) { - this.setVpnCertificate(tmpString); - } - this.lastEipServiceUpdate = in.readLong(); - } catch (MalformedURLException | JSONException e) { - e.printStackTrace(); - } - } - private boolean parseDefinition(JSONObject definition) { try { String pin = definition.getString(CA_CERT_FINGERPRINT); @@ -468,6 +489,20 @@ public final class Provider implements Parcelable { return System.currentTimeMillis() - lastEipServiceUpdate >= EIP_SERVICE_TIMEOUT; } + + public void setLastGeoIpUpdate(long timestamp) { + lastGeoIpUpdate = timestamp; + } + + public long getLastGeoIpUpdate() { + return lastGeoIpUpdate; + } + + public boolean shouldUpdateGeoIpJson() { + return System.currentTimeMillis() - lastGeoIpUpdate >= GEOIP_SERVICE_TIMEOUT; + } + + public boolean setEipServiceJson(JSONObject eipServiceJson) { if (eipServiceJson.has(ERRORS)) { return false; @@ -476,16 +511,34 @@ public final class Provider implements Parcelable { return true; } + public boolean setGeoIpJson(JSONObject geoIpJson) { + if (geoIpJson.has(ERRORS)) { + return false; + } + this.geoIpJson = geoIpJson; + return true; + } + public JSONObject getEipServiceJson() { return eipServiceJson; } + public JSONObject getGeoIpJson() { + return geoIpJson; + } + + public String getGeoIpJsonString() { + return geoIpJson.toString(); + } + public String getEipServiceJsonString() { return getEipServiceJson().toString(); } + public boolean isDefault() { return getMainUrl().isDefault() && getApiUrl().isDefault() && + getGeoipUrl().isDefault() && certificatePin.isEmpty() && certificatePinEncoding.isEmpty() && caCert.isEmpty(); @@ -533,6 +586,7 @@ public final class Provider implements Parcelable { public void reset() { definition = new JSONObject(); eipServiceJson = new JSONObject(); + geoIpJson = new JSONObject(); apiUrl = new DefaultedURL(); certificatePin = ""; certificatePinEncoding = ""; -- cgit v1.2.3