diff options
Diffstat (limited to 'app/src/main')
7 files changed, 98 insertions, 27 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 025c98f0..67fd0a1a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -85,7 +85,7 @@ android:name="se.leap.bitmaskclient.Dashboard" android:label="@string/title_activity_dashboard" android:uiOptions="splitActionBarWhenNarrow" - android:launchMode="singleTask" + android:launchMode="singleTop" > <intent-filter android:label="@string/app_name"> diff --git a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java index 5faa1de4..835e69b3 100644 --- a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java +++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java @@ -322,9 +322,11 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac } - Intent disconnectVPN = new Intent(this, DisconnectVPN.class); - disconnectVPN.setAction(DISCONNECT_VPN); - PendingIntent disconnectPendingIntent = PendingIntent.getActivity(this, 0, disconnectVPN, 0); + Intent disconnectVPN = new Intent(this, Dashboard.class); + disconnectVPN.putExtra(Dashboard.ACTION_ASK_TO_CANCEL_VPN, true); + disconnectVPN.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | + Intent.FLAG_ACTIVITY_SINGLE_TOP); + PendingIntent disconnectPendingIntent = PendingIntent.getActivity(this, 0, disconnectVPN, PendingIntent.FLAG_CANCEL_CURRENT); nbuilder.addAction(R.drawable.ic_menu_close_clear_cancel, getString(R.string.cancel_connection), disconnectPendingIntent); diff --git a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java index dbdf0a51..a6a3717b 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java +++ b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java @@ -66,9 +66,11 @@ public class Dashboard extends Activity implements ProviderAPIResultReceiver.Rec public static final String TAG = Dashboard.class.getSimpleName(); public static final String SHARED_PREFERENCES = "LEAPPreferences"; public static final String ACTION_QUIT = "quit"; + public static final String ACTION_ASK_TO_CANCEL_VPN = "ask to cancel vpn"; public static final String REQUEST_CODE = "request_code"; public static final String PARAMETERS = "dashboard parameters"; public static final String START_ON_BOOT = "dashboard start on boot"; + //FIXME: remove OR FIX ON_BOOT public static final String ON_BOOT = "dashboard on boot"; public static final String APP_VERSION = "bitmask version"; @@ -116,6 +118,12 @@ public class Dashboard extends Activity implements ProviderAPIResultReceiver.Rec } } + @Override + protected void onResume() { + super.onResume(); + handleVPNCancellation(getIntent()); + } + private boolean previousProviderExists(Bundle savedInstanceState) { return providerInSavedInstance(savedInstanceState) || providerInSharedPreferences(); } @@ -176,6 +184,13 @@ public class Dashboard extends Activity implements ProviderAPIResultReceiver.Rec } @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + handleVPNCancellation(intent); + } + + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CONFIGURE_LEAP || requestCode == SWITCH_PROVIDER) { if (resultCode == RESULT_OK && data.hasExtra(Provider.KEY)) { @@ -192,8 +207,13 @@ public class Dashboard extends Activity implements ProviderAPIResultReceiver.Rec finish(); } else configErrorDialog(); - } else if (requestCode == EIP.DISCONNECT) { - EipStatus.getInstance().setConnectedOrDisconnected(); + } + } + + private void handleVPNCancellation(Intent intent) { + if (intent.hasExtra(Dashboard.ACTION_ASK_TO_CANCEL_VPN)) { + eip_fragment.askToStopEIP(); + intent.removeExtra(ACTION_ASK_TO_CANCEL_VPN); } } @@ -247,7 +267,9 @@ public class Dashboard extends Activity implements ProviderAPIResultReceiver.Rec eip_fragment = new VpnFragment(); if (hide_and_turn_on_eip) { + //TODO: remove line below if not in use anymore... preferences.edit().remove(Dashboard.START_ON_BOOT).apply(); + //FIXME: always start on Boot? Why do we keep shared preferences then? Bundle arguments = new Bundle(); arguments.putBoolean(VpnFragment.START_ON_BOOT, true); if (eip_fragment != null) eip_fragment.setArguments(arguments); diff --git a/app/src/main/java/se/leap/bitmaskclient/VpnFragment.java b/app/src/main/java/se/leap/bitmaskclient/VpnFragment.java index 9e9adef1..8cd9fa0f 100644 --- a/app/src/main/java/se/leap/bitmaskclient/VpnFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/VpnFragment.java @@ -19,7 +19,6 @@ package se.leap.bitmaskclient; import android.app.*; import android.content.*; import android.os.*; -import android.util.Log; import android.view.*; import android.widget.*; @@ -28,7 +27,10 @@ import org.jetbrains.annotations.*; import java.util.*; import butterknife.*; -import de.blinkt.openvpn.activities.*; +import de.blinkt.openvpn.core.IOpenVPNServiceInternal; +import de.blinkt.openvpn.core.OpenVPNService; +import de.blinkt.openvpn.core.ProfileManager; +import de.blinkt.openvpn.core.VpnStatus; import mbanje.kurt.fabbutton.*; import se.leap.bitmaskclient.eip.*; @@ -50,15 +52,31 @@ public class VpnFragment extends Fragment implements Observer { private static EipStatus eip_status; private boolean wants_to_connect; + private IOpenVPNServiceInternal mService; + private ServiceConnection openVpnConnection = new ServiceConnection() { + + + + @Override + public void onServiceConnected(ComponentName className, + IBinder service) { + + mService = IOpenVPNServiceInternal.Stub.asInterface(service); + } + + @Override + public void onServiceDisconnected(ComponentName arg0) { + mService = null; + } + + }; + //FIXME: replace with onAttach(Context context) public void onAttach(Activity activity) { super.onAttach(activity); dashboard = (Dashboard) activity; - ProviderAPIResultReceiver provider_api_receiver = new ProviderAPIResultReceiver(new Handler(), dashboard); - - if(eip_receiver != null) - ProviderAPICommand.execute(Bundle.EMPTY, ProviderAPI.DOWNLOAD_EIP_SERVICE, provider_api_receiver); + downloadEIPServiceConfig(); } @Override @@ -95,6 +113,13 @@ public class VpnFragment extends Fragment implements Observer { //FIXME: avoid race conditions while checking certificate an logging in at about the same time //eipCommand(Constants.ACTION_CHECK_CERT_VALIDITY); handleNewState(eip_status); + bindOpenVpnService(); + } + + @Override + public void onPause() { + super.onPause(); + dashboard.unbindService(openVpnConnection); } @Override @@ -104,7 +129,7 @@ public class VpnFragment extends Fragment implements Observer { super.onSaveInstanceState(outState); } - protected void saveStatus() { + private void saveStatus() { boolean is_on = eip_status.isConnected() || eip_status.isConnecting(); Dashboard.preferences.edit().putBoolean(Dashboard.START_ON_BOOT, is_on).commit(); } @@ -184,16 +209,29 @@ public class VpnFragment extends Fragment implements Observer { } private void disconnect() { - Intent disconnect_vpn = new Intent(dashboard, DisconnectVPN.class); - dashboard.startActivityForResult(disconnect_vpn, EIP.DISCONNECT); eip_status.setDisconnecting(); + ProfileManager.setConntectedVpnProfileDisconnected(dashboard); + if (mService != null) { + try { + mService.stopVPN(false); + eip_status.setConnectedOrDisconnected(); + } catch (RemoteException e) { + VpnStatus.logException(e); + } + } } protected void stopEipIfPossible() { eipCommand(Constants.ACTION_STOP_EIP); } - private void askToStopEIP() { + private void downloadEIPServiceConfig() { + ProviderAPIResultReceiver provider_api_receiver = new ProviderAPIResultReceiver(new Handler(), dashboard); + if(eip_receiver != null) + ProviderAPICommand.execute(Bundle.EMPTY, ProviderAPI.DOWNLOAD_EIP_SERVICE, provider_api_receiver); + } + + protected void askToStopEIP() { AlertDialog.Builder alertBuilder = new AlertDialog.Builder(dashboard); alertBuilder.setTitle(dashboard.getString(R.string.eip_cancel_connect_title)) .setMessage(dashboard.getString(R.string.eip_warning_browser_inconsistency)) @@ -282,6 +320,12 @@ public class VpnFragment extends Fragment implements Observer { } } + private void bindOpenVpnService() { + Intent intent = new Intent(dashboard, OpenVPNService.class); + intent.setAction(OpenVPNService.START_SERVICE); + dashboard.bindService(intent, openVpnConnection, Context.BIND_AUTO_CREATE); + } + protected class EIPReceiver extends ResultReceiver { protected EIPReceiver(Handler handler) { 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 5b72a4e7..73c7337b 100644 --- a/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java +++ b/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java @@ -42,8 +42,6 @@ public final class EIP extends IntentService { public final static String TAG = EIP.class.getSimpleName(); public final static String SERVICE_API_PATH = "config/eip-service.json"; - public static final int DISCONNECT = 15; - private static Context context; private static ResultReceiver mReceiver; private static SharedPreferences preferences; @@ -170,6 +168,7 @@ public final class EIP extends IntentService { } private void updateGateways() { + gateways_manager.clearGatewaysAndProfiles(); gateways_manager.fromEipServiceJson(eip_definition); gatewaysToPreferences(); } 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 f41049c5..6a7e3d0b 100644 --- a/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java +++ b/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java @@ -143,15 +143,20 @@ public class GatewaysManager { return result; } + protected void clearGatewaysAndProfiles() { + gateways.clear(); + ArrayList<VpnProfile> profiles = new ArrayList<>(profile_manager.getProfiles()); + for (VpnProfile profile : profiles) { + profile_manager.removeProfile(context, profile); + } + } + private void addGateway(Gateway gateway) { removeDuplicatedGateway(gateway); - gateways.add(gateway); VpnProfile profile = gateway.getProfile(); profile_manager.addProfile(profile); - //profile_manager.saveProfile(context, profile); - //profile_manager.saveProfileList(context); } private void removeDuplicatedGateway(Gateway gateway) { diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java b/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java index 0b9c5832..53d81ed3 100644 --- a/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java +++ b/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java @@ -56,7 +56,7 @@ public class VpnConfigGenerator { String key = keys.next().toString(); common_options += key + " "; - for (String word : general_configuration.getString(key).split(" ")) + for (String word : String.valueOf(general_configuration.get(key)).split(" ")) common_options += word + " "; common_options += new_line; @@ -79,7 +79,6 @@ public class VpnConfigGenerator { String ports_keyword = "ports"; String protocol_keyword = "protocols"; String capabilities_keyword = "capabilities"; - String udp = "udp"; try { String ip_address = gateway.getString(ip_address_keyword); @@ -93,9 +92,7 @@ public class VpnConfigGenerator { String protocol = protocols.optString(j); String new_remote = remote_keyword + " " + ip_address + " " + port + " " + protocol + new_line; - port_specific_remotes = protocol.equalsIgnoreCase(udp) ? - port_specific_remotes.replaceFirst(remote_keyword, new_remote + new_line + remote_keyword) : - new_remote; + port_specific_remotes += new_remote; } remotes += port_specific_remotes; } @@ -103,7 +100,9 @@ public class VpnConfigGenerator { // TODO Auto-generated catch block e.printStackTrace(); } - + if (remotes.endsWith(new_line)) { + remotes = remotes.substring(0, remotes.lastIndexOf(new_line)); + } return remotes; } |