summaryrefslogtreecommitdiff
path: root/app/src/main/java/se/leap/bitmaskclient/eip
diff options
context:
space:
mode:
authorcyBerta <cyberta@riseup.net>2018-02-13 16:06:49 +0100
committercyBerta <cyberta@riseup.net>2018-02-13 16:06:49 +0100
commita41e0b0f7ec0cff1dc7a34b42d663c777a317e61 (patch)
treeeba639ead30462f595614677a8358e972fd4cef1 /app/src/main/java/se/leap/bitmaskclient/eip
parentfecdec8975042d0ae27efe63e8cefc7415ca5ad6 (diff)
parent9b6c368a25510c462ea357121c97edb6d0310021 (diff)
Merge branch 'origin_0.9.8' into #8831_progress_animation_when_connecting
* added new EipCommand in StartActivity * added option to add intent extras to EipCommand * resolved merge conflicts and minor refactorings in: app/src/main/java/se/leap/bitmaskclient/EipFragment.java app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
Diffstat (limited to 'app/src/main/java/se/leap/bitmaskclient/eip')
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/EIP.java39
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/EipCommand.java82
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java10
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java24
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java6
5 files changed, 135 insertions, 26 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java b/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
index 894ad672..9c7f6d1a 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
@@ -22,6 +22,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.ResultReceiver;
+import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import org.json.JSONException;
@@ -32,17 +33,20 @@ import java.lang.ref.WeakReference;
import de.blinkt.openvpn.LaunchVPN;
import se.leap.bitmaskclient.OnBootReceiver;
+import static se.leap.bitmaskclient.Constants.BROADCAST_EIP_EVENT;
+import static se.leap.bitmaskclient.Constants.BROADCAST_RESULT_CODE;
+import static se.leap.bitmaskclient.Constants.BROADCAST_RESULT_KEY;
import static se.leap.bitmaskclient.Constants.EIP_ACTION_CHECK_CERT_VALIDITY;
import static se.leap.bitmaskclient.Constants.EIP_ACTION_IS_RUNNING;
import static se.leap.bitmaskclient.Constants.EIP_ACTION_START;
import static se.leap.bitmaskclient.Constants.EIP_ACTION_START_ALWAYS_ON_VPN;
import static se.leap.bitmaskclient.Constants.EIP_ACTION_STOP;
import static se.leap.bitmaskclient.Constants.EIP_ACTION_UPDATE;
+import static se.leap.bitmaskclient.Constants.EIP_EARLY_ROUTES;
import static se.leap.bitmaskclient.Constants.EIP_RECEIVER;
import static se.leap.bitmaskclient.Constants.EIP_REQUEST;
import static se.leap.bitmaskclient.Constants.EIP_RESTART_ON_BOOT;
-import static se.leap.bitmaskclient.Constants.EIP_TRIGGERED_FROM_UI;
-import static se.leap.bitmaskclient.Constants.PROVIDER_KEY;
+import static se.leap.bitmaskclient.Constants.PROVIDER_EIP_DEFINITION;
import static se.leap.bitmaskclient.Constants.PROVIDER_VPN_CERTIFICATE;
import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES;
@@ -94,7 +98,8 @@ public final class EIP extends IntentService {
switch (action) {
case EIP_ACTION_START:
- startEIP(!intent.hasExtra(EIP_TRIGGERED_FROM_UI));
+ boolean earlyRoutes = intent.getBooleanExtra(EIP_EARLY_ROUTES, true);
+ startEIP(earlyRoutes);
break;
case EIP_ACTION_START_ALWAYS_ON_VPN:
startEIPAlwaysOnVpn();
@@ -132,9 +137,9 @@ public final class EIP extends IntentService {
gateway = gatewaysManager.select();
if (gateway != null && gateway.getProfile() != null) {
launchActiveGateway();
- tellToReceiver(EIP_ACTION_START, Activity.RESULT_OK);
+ tellToReceiverOrBroadcast(EIP_ACTION_START, Activity.RESULT_OK);
} else
- tellToReceiver(EIP_ACTION_START, Activity.RESULT_CANCELED);
+ tellToReceiverOrBroadcast(EIP_ACTION_START, Activity.RESULT_CANCELED);
}
/**
@@ -182,7 +187,7 @@ public final class EIP extends IntentService {
if (eipStatus.isConnected() || eipStatus.isConnecting())
resultCode = Activity.RESULT_OK;
- tellToReceiver(EIP_ACTION_STOP, resultCode);
+ tellToReceiverOrBroadcast(EIP_ACTION_STOP, resultCode);
}
/**
@@ -195,7 +200,7 @@ public final class EIP extends IntentService {
int resultCode = (eipStatus.isConnected()) ?
Activity.RESULT_OK :
Activity.RESULT_CANCELED;
- tellToReceiver(EIP_ACTION_IS_RUNNING, resultCode);
+ tellToReceiverOrBroadcast(EIP_ACTION_IS_RUNNING, resultCode);
}
/**
@@ -206,13 +211,13 @@ public final class EIP extends IntentService {
eipDefinition = eipDefinitionFromPreferences();
if (eipDefinition.length() > 0)
updateGateways();
- tellToReceiver(EIP_ACTION_UPDATE, Activity.RESULT_OK);
+ tellToReceiverOrBroadcast(EIP_ACTION_UPDATE, Activity.RESULT_OK);
}
private JSONObject eipDefinitionFromPreferences() {
JSONObject result = new JSONObject();
try {
- String eipDefinitionString = preferences.getString(PROVIDER_KEY, "");
+ String eipDefinitionString = preferences.getString(PROVIDER_EIP_DEFINITION, "");
if (!eipDefinitionString.isEmpty()) {
result = new JSONObject(eipDefinitionString);
}
@@ -246,14 +251,26 @@ public final class EIP extends IntentService {
int resultCode = validator.isValid() ?
Activity.RESULT_OK :
Activity.RESULT_CANCELED;
- tellToReceiver(EIP_ACTION_CHECK_CERT_VALIDITY, resultCode);
+ tellToReceiverOrBroadcast(EIP_ACTION_CHECK_CERT_VALIDITY, resultCode);
}
- private void tellToReceiver(String action, int resultCode) {
+ private void tellToReceiverOrBroadcast(String action, int resultCode) {
Bundle resultData = new Bundle();
resultData.putString(EIP_REQUEST, action);
if (mReceiverRef.get() != null) {
mReceiverRef.get().send(resultCode, resultData);
+ } else {
+ broadcastEvent(resultCode, resultData);
}
}
+
+ private void broadcastEvent(int resultCode , Bundle resultData) {
+ Intent intentUpdate = new Intent(BROADCAST_EIP_EVENT);
+ intentUpdate.addCategory(Intent.CATEGORY_DEFAULT);
+ intentUpdate.putExtra(BROADCAST_RESULT_CODE, resultCode);
+ intentUpdate.putExtra(BROADCAST_RESULT_KEY, resultData);
+ Log.d(TAG, "sending broadcast");
+ LocalBroadcastManager.getInstance(this).sendBroadcast(intentUpdate);
+ }
+
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/EipCommand.java b/app/src/main/java/se/leap/bitmaskclient/eip/EipCommand.java
new file mode 100644
index 00000000..1c2ae5da
--- /dev/null
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/EipCommand.java
@@ -0,0 +1,82 @@
+package se.leap.bitmaskclient.eip;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.ResultReceiver;
+import android.support.annotation.NonNull;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import static se.leap.bitmaskclient.Constants.EIP_ACTION_CHECK_CERT_VALIDITY;
+import static se.leap.bitmaskclient.Constants.EIP_ACTION_START;
+import static se.leap.bitmaskclient.Constants.EIP_ACTION_STOP;
+import static se.leap.bitmaskclient.Constants.EIP_ACTION_UPDATE;
+import static se.leap.bitmaskclient.Constants.EIP_EARLY_ROUTES;
+import static se.leap.bitmaskclient.Constants.EIP_RECEIVER;
+
+/**
+ * Use this class to send commands to EIP
+ */
+
+public class EipCommand {
+
+ public static void execute(@NotNull Context context, @NotNull String action) {
+ execute(context, action, null, null);
+ }
+
+ /**
+ * Send a command to EIP
+ * @param context the context to start the command from
+ * @param action A valid String constant from EIP class representing an Intent
+ * filter for the EIP class
+ * @param resultReceiver The resultreceiver to reply to
+ */
+ public static void execute(@NotNull Context context, @NotNull String action, @Nullable ResultReceiver resultReceiver, @Nullable Intent vpnIntent) {
+ // TODO validate "action"...how do we get the list of intent-filters for a class via Android API?
+ if (vpnIntent == null) {
+ vpnIntent = new Intent();
+ }
+ vpnIntent.setComponent(new ComponentName(context.getApplicationContext(), EIP.class));
+ vpnIntent.setAction(action);
+ if (resultReceiver != null)
+ vpnIntent.putExtra(EIP_RECEIVER, resultReceiver);
+ context.startService(vpnIntent);
+ }
+
+ public static void updateEipService(@NonNull Context context, ResultReceiver resultReceiver) {
+ execute(context, EIP_ACTION_UPDATE, resultReceiver, null);
+ }
+
+ public static void updateEipService(@NonNull Context context) {
+ execute(context, EIP_ACTION_UPDATE, null, null);
+ }
+
+ public static void startVPN(@NonNull Context context, boolean earlyRoutes) {
+ Intent baseIntent = new Intent();
+ baseIntent.putExtra(EIP_EARLY_ROUTES, earlyRoutes);
+ execute(context, EIP_ACTION_START, null, baseIntent);
+ }
+
+ public static void startVPN(@NonNull Context context, ResultReceiver resultReceiver) {
+ execute(context, EIP_ACTION_START, resultReceiver, null);
+ }
+
+ public static void stopVPN(@NonNull Context context) {
+ execute(context, EIP_ACTION_STOP);
+ }
+
+ public static void stopVPN(@NonNull Context context, ResultReceiver resultReceiver) {
+ execute(context, EIP_ACTION_STOP, resultReceiver, null);
+ }
+
+ public static void checkVpnCertificate(@NonNull Context context) {
+ execute(context, EIP_ACTION_CHECK_CERT_VALIDITY);
+ }
+
+ public static void checkVpnCertificate(@NonNull Context context, ResultReceiver resultReceiver) {
+ execute(context, EIP_ACTION_CHECK_CERT_VALIDITY, resultReceiver, null);
+ }
+
+}
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java b/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java
index 0da74872..df252500 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java
@@ -24,6 +24,7 @@ import java.util.Observable;
import de.blinkt.openvpn.core.ConnectionStatus;
import de.blinkt.openvpn.core.LogItem;
+import de.blinkt.openvpn.core.ProfileManager;
import de.blinkt.openvpn.core.VpnStatus;
/**
@@ -92,7 +93,14 @@ public class EipStatus extends Observable implements VpnStatus.StateListener {
currentEipLevel = EipLevel.CONNECTED;
break;
case LEVEL_VPNPAUSED:
- throw new IllegalStateException("Ics-Openvpn's VPNPAUSED state is not supported by Bitmask");
+ if (ProfileManager.getLastConnectedVpn() != null && ProfileManager.getLastConnectedVpn().mPersistTun) {
+ //if persistTun is enabled, treat EipLevel as connecting as it *shouldn't* allow passing traffic in the clear...
+ currentEipLevel = EipLevel.CONNECTING;
+ } else {
+ //... if persistTun is not enabled, background network traffic will pass in the clear
+ currentEipLevel = EipLevel.DISCONNECTED;
+ }
+ break;
case LEVEL_CONNECTING_SERVER_REPLIED:
case LEVEL_CONNECTING_NO_SERVER_REPLY_YET:
case LEVEL_WAITING_FOR_USER_INPUT:
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java b/app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java
index ff7d011e..6cccdcd2 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java
@@ -16,14 +16,16 @@
*/
package se.leap.bitmaskclient.eip;
-import com.google.gson.*;
+import com.google.gson.Gson;
-import org.json.*;
+import org.json.JSONException;
+import org.json.JSONObject;
-import java.io.*;
+import java.io.IOException;
+import java.io.StringReader;
-import de.blinkt.openvpn.*;
-import de.blinkt.openvpn.core.*;
+import de.blinkt.openvpn.VpnProfile;
+import de.blinkt.openvpn.core.ConfigParser;
/**
* Gateway provides objects defining gateways and their metadata.
@@ -37,7 +39,7 @@ public class Gateway {
public final static String TAG = Gateway.class.getSimpleName();
- private JSONObject general_configuration;
+ private JSONObject generalConfiguration;
private JSONObject secrets;
private JSONObject gateway;
@@ -54,7 +56,7 @@ public class Gateway {
this.gateway = gateway;
this.secrets = secrets;
- general_configuration = getGeneralConfiguration(eip_definition);
+ generalConfiguration = getGeneralConfiguration(eip_definition);
timezone = getTimezone(eip_definition);
mName = locationAsName(eip_definition);
@@ -80,9 +82,9 @@ public class Gateway {
return location.optString("name");
}
- private JSONObject getLocationInfo(JSONObject eip_definition) {
+ private JSONObject getLocationInfo(JSONObject eipDefinition) {
try {
- JSONObject locations = eip_definition.getJSONObject("locations");
+ JSONObject locations = eipDefinition.getJSONObject("locations");
return locations.getJSONObject(gateway.getString("location"));
} catch (JSONException e) {
@@ -97,8 +99,8 @@ public class Gateway {
try {
ConfigParser cp = new ConfigParser();
- VpnConfigGenerator vpn_configuration_generator = new VpnConfigGenerator(general_configuration, secrets, gateway);
- String configuration = vpn_configuration_generator.generate();
+ VpnConfigGenerator vpnConfigurationGenerator = new VpnConfigGenerator(generalConfiguration, secrets, gateway);
+ String configuration = vpnConfigurationGenerator.generate();
cp.parseConfig(new StringReader(configuration));
return cp.convertProfile();
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java b/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java
index 0b330ed9..1bdb53ab 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java
@@ -94,14 +94,14 @@ public class GatewaysManager {
return new Gson().toJson(gateways, list_type);
}
- public void fromEipServiceJson(JSONObject eip_definition) {
+ public void fromEipServiceJson(JSONObject eipDefinition) {
try {
- JSONArray gatewaysDefined = eip_definition.getJSONArray("gateways");
+ JSONArray gatewaysDefined = eipDefinition.getJSONArray("gateways");
for (int i = 0; i < gatewaysDefined.length(); i++) {
JSONObject gw = gatewaysDefined.getJSONObject(i);
if (isOpenVpnGateway(gw)) {
JSONObject secrets = secretsConfiguration();
- Gateway aux = new Gateway(eip_definition, secrets, gw);
+ Gateway aux = new Gateway(eipDefinition, secrets, gw);
if (!containsProfileWithSecrets(aux.getProfile())) {
addGateway(aux);
}