diff options
Diffstat (limited to 'app')
4 files changed, 298 insertions, 277 deletions
| diff --git a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java index face6ced..a8f6e110 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java +++ b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java @@ -407,7 +407,7 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn      }      private void switchProvider() { -        if (provider.hasEIP()) eip_fragment.askToStopEIP(); +        if (provider.hasEIP()) eip_fragment.stopEipIfPossible();          preferences.edit().clear().apply();          switching_provider = false; diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java index 2057a80b..5e5b76b2 100644 --- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java @@ -1,6 +1,6 @@  /**   * Copyright (c) 2013 LEAP Encryption Access Project and contributers - *  + *   * This program is free software: you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation, either version 3 of the License, or @@ -32,7 +32,7 @@ import de.blinkt.openvpn.activities.*;  import se.leap.bitmaskclient.eip.*;  public class EipFragment extends Fragment implements Observer { -	 +      public static String TAG = EipFragment.class.getSimpleName();      protected static final String IS_PENDING = TAG + ".is_pending"; @@ -55,36 +55,36 @@ public class EipFragment extends Fragment implements Observer {      @Override      public void onAttach(Activity activity) { -	super.onAttach(activity); +        super.onAttach(activity);          dashboard = (Dashboard) activity;          dashboard.providerApiCommand(Bundle.EMPTY, 0, ProviderAPI.DOWNLOAD_EIP_SERVICE);      } -     +      @Override      public void onCreate(Bundle savedInstanceState) { -	super.onCreate(savedInstanceState); -	eip_status = EipStatus.getInstance(); -	eip_status.addObserver(this); -	mEIPReceiver = new EIPReceiver(new Handler()); +        super.onCreate(savedInstanceState); +        eip_status = EipStatus.getInstance(); +        eip_status.addObserver(this); +        mEIPReceiver = new EIPReceiver(new Handler());      }      @Override      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { -	View view = inflater.inflate(R.layout.eip_service_fragment, container, false); +        View view = inflater.inflate(R.layout.eip_service_fragment, container, false);          ButterKnife.inject(this, view); -	if (eip_status.isConnecting()) -	    eip_switch.setVisibility(View.VISIBLE); +        if (eip_status.isConnecting()) +            eip_switch.setVisibility(View.VISIBLE); -	Log.d(TAG, "onCreateView, eip_switch is checked? " + eip_switch.isChecked()); +        Log.d(TAG, "onCreateView, eip_switch is checked? " + eip_switch.isChecked());          Bundle arguments = getArguments(); -	if(arguments != null && arguments.containsKey(START_ON_BOOT) && arguments.getBoolean(START_ON_BOOT)) -	    startEipFromScratch(); -    if(savedInstanceState != null) restoreState(savedInstanceState); +        if(arguments != null && arguments.containsKey(START_ON_BOOT) && arguments.getBoolean(START_ON_BOOT)) +            startEipFromScratch(); +        if(savedInstanceState != null) restoreState(savedInstanceState); -	return view; +        return view;      }      private void restoreState(@NotNull Bundle savedInstanceState) { @@ -98,22 +98,22 @@ public class EipFragment extends Fragment implements Observer {      @Override      public void onResume() { -	super.onResume(); -	eipCommand(Constants.ACTION_CHECK_CERT_VALIDITY); -	handleNewState(eip_status); +        super.onResume(); +        eipCommand(Constants.ACTION_CHECK_CERT_VALIDITY); +        handleNewState(eip_status);      } -     +      @Override      public void onSaveInstanceState(Bundle outState) { -	outState.putBoolean(IS_PENDING, eip_status.isConnecting()); -	outState.putBoolean(IS_CONNECTED, eip_status.isConnected()); -	outState.putString(STATUS_MESSAGE, status_message.getText().toString()); -	super.onSaveInstanceState(outState); +        outState.putBoolean(IS_PENDING, eip_status.isConnecting()); +        outState.putBoolean(IS_CONNECTED, eip_status.isConnected()); +        outState.putString(STATUS_MESSAGE, status_message.getText().toString()); +        super.onSaveInstanceState(outState);      }      protected void saveStatus() { -	boolean is_on = eip_switch.isChecked(); -	Dashboard.preferences.edit().putBoolean(Dashboard.START_ON_BOOT, is_on).commit(); +        boolean is_on = eip_switch.isChecked(); +        Dashboard.preferences.edit().putBoolean(Dashboard.START_ON_BOOT, is_on).commit();      }      void handleNewVpnCertificate() { @@ -122,251 +122,271 @@ public class EipFragment extends Fragment implements Observer {      @OnCheckedChanged(R.id.eipSwitch)      void handleSwitch(boolean isChecked) { -	if(isChecked) -	    handleSwitchOn(); -	else -	    handleSwitchOff(); -	 -	saveStatus(); +        if(isChecked) +            handleSwitchOn(); +        else +            handleSwitchOff(); + +        saveStatus();      }      private void handleSwitchOn() { -	if(canStartEIP()) -	    startEipFromScratch(); -	else if(canLogInToStartEIP()) { -        wants_to_connect = true; -        Bundle bundle = new Bundle(); -        bundle.putBoolean(IS_PENDING, true); -	    dashboard.sessionDialog(bundle); -	}	     -    } -     +        if(canStartEIP()) +            startEipFromScratch(); +        else if(canLogInToStartEIP()) { +            wants_to_connect = true; +            Bundle bundle = new Bundle(); +            bundle.putBoolean(IS_PENDING, true); +            dashboard.sessionDialog(bundle); +        } +    } +      private boolean canStartEIP() { -	boolean certificateExists = !Dashboard.preferences.getString(Constants.CERTIFICATE, "").isEmpty(); -	boolean isAllowedAnon = Dashboard.preferences.getBoolean(Constants.ALLOWED_ANON, false); -	return (isAllowedAnon || certificateExists) && !eip_status.isConnected() && !eip_status.isConnecting(); +        boolean certificateExists = !Dashboard.preferences.getString(Constants.CERTIFICATE, "").isEmpty(); +        boolean isAllowedAnon = Dashboard.preferences.getBoolean(Constants.ALLOWED_ANON, false); +        return (isAllowedAnon || certificateExists) && !eip_status.isConnected() && !eip_status.isConnecting();      } -     +      private boolean canLogInToStartEIP() { -	boolean isAllowedRegistered = Dashboard.preferences.getBoolean(Constants.ALLOWED_REGISTERED, false); -	boolean isLoggedIn = !LeapSRPSession.getToken().isEmpty(); -	Log.d(TAG, "Allow registered? " + isAllowedRegistered); -	Log.d(TAG, "Is logged in? " + isLoggedIn); -	return isAllowedRegistered && !isLoggedIn && !eip_status.isConnecting() && !eip_status.isConnected(); +        boolean isAllowedRegistered = Dashboard.preferences.getBoolean(Constants.ALLOWED_REGISTERED, false); +        boolean isLoggedIn = !LeapSRPSession.getToken().isEmpty(); +        Log.d(TAG, "Allow registered? " + isAllowedRegistered); +        Log.d(TAG, "Is logged in? " + isLoggedIn); +        return isAllowedRegistered && !isLoggedIn && !eip_status.isConnecting() && !eip_status.isConnected();      }      private void handleSwitchOff() { -	if(eip_status.isConnecting()) { -	    askPendingStartCancellation(); -	} else if(eip_status.isConnected()) { -	    askToStopEIP(); -	} else -        setDisconnectedUI(); -    } - -    private void askPendingStartCancellation() {	 -	AlertDialog.Builder alertBuilder = new AlertDialog.Builder(dashboard); -	alertBuilder.setTitle(dashboard.getString(R.string.eip_cancel_connect_title)) -	    .setMessage(dashboard.getString(R.string.eip_cancel_connect_text)) -	    .setPositiveButton((R.string.yes), new DialogInterface.OnClickListener() { -		    @Override -		    public void onClick(DialogInterface dialog, int which) { -			askToStopEIP(); -		    } -		}) -	    .setNegativeButton(dashboard.getString(R.string.no), new DialogInterface.OnClickListener() { -		    @Override -		    public void onClick(DialogInterface dialog, int which) { -			eip_switch.setChecked(true); -		    } -		}) -	    .show(); +        if(eip_status.isConnecting()) { +            askPendingStartCancellation(); +        } else if(eip_status.isConnected()) { +            askToStopEIP(); +        } else +            setDisconnectedUI(); +    } + +    private void askPendingStartCancellation() { +        AlertDialog.Builder alertBuilder = new AlertDialog.Builder(dashboard); +        alertBuilder.setTitle(dashboard.getString(R.string.eip_cancel_connect_title)) +                .setMessage(dashboard.getString(R.string.eip_cancel_connect_text)) +                .setPositiveButton((R.string.yes), new DialogInterface.OnClickListener() { +                    @Override +                    public void onClick(DialogInterface dialog, int which) { +                        askToStopEIP(); +                    } +                }) +                .setNegativeButton(dashboard.getString(R.string.no), new DialogInterface.OnClickListener() { +                    @Override +                    public void onClick(DialogInterface dialog, int which) { +                        eip_switch.setChecked(true); +                    } +                }) +                .show();      }      public void startEipFromScratch() {          wants_to_connect = false;          is_starting_to_connect = true;          progress_bar.setVisibility(View.VISIBLE); -	eip_switch.setVisibility(View.VISIBLE); -	String status = dashboard.getString(R.string.eip_status_start_pending); -	status_message.setText(status); -	 -	if(!eip_switch.isChecked()) { -	    eip_switch.setChecked(true); -	} +        eip_switch.setVisibility(View.VISIBLE); +        String status = dashboard.getString(R.string.eip_status_start_pending); +        status_message.setText(status); + +        if(!eip_switch.isChecked()) { +            eip_switch.setChecked(true); +        }          saveStatus(); -	eipCommand(Constants.ACTION_START_EIP); +        eipCommand(Constants.ACTION_START_EIP);      } -    private void stopEIP() { -	if(eip_status.isConnecting()) -	    VoidVpnService.stop(); -	disconnect(); +    private void stop() { +        if(eip_status.isConnecting()) +            VoidVpnService.stop(); +        disconnect();      }      private void disconnect() { -	Intent disconnect_vpn = new Intent(dashboard, DisconnectVPN.class); -	dashboard.startActivityForResult(disconnect_vpn, EIP.DISCONNECT); -	eip_status.setDisconnecting(); +        Intent disconnect_vpn = new Intent(dashboard, DisconnectVPN.class); +        dashboard.startActivityForResult(disconnect_vpn, EIP.DISCONNECT); +        eip_status.setDisconnecting();      } -    protected void askToStopEIP() { +    protected void stopEipIfPossible() { +          hideProgressBar(); -	String message = dashboard.getString(R.string.eip_state_not_connected); -	status_message.setText(message); +        String message = dashboard.getString(R.string.eip_state_not_connected); +        status_message.setText(message); + +        eipCommand(Constants.ACTION_STOP_EIP); +    } -	eipCommand(Constants.ACTION_STOP_EIP); +    private 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)) +                .setPositiveButton((R.string.yes), new DialogInterface.OnClickListener() { +                    @Override +                    public void onClick(DialogInterface dialog, int which) { +                        stopEipIfPossible(); +                    } +                }) +                .setNegativeButton(dashboard.getString(R.string.no), new DialogInterface.OnClickListener() { +                    @Override +                    public void onClick(DialogInterface dialog, int which) { +                        eip_switch.setChecked(true); +                    } +                }) +                .show();      }      protected void updateEipService() {          eipCommand(Constants.ACTION_UPDATE_EIP_SERVICE);      } -	 +      /**       * Send a command to EIP -     *  +     *       * @param action	A valid String constant from EIP class representing an Intent       * 					filter for the EIP class        */      private void eipCommand(String action){ -	// TODO validate "action"...how do we get the list of intent-filters for a class via Android API? -	Intent vpn_intent = new Intent(dashboard.getApplicationContext(), EIP.class); -	vpn_intent.setAction(action); -	vpn_intent.putExtra(Constants.RECEIVER_TAG, mEIPReceiver); -	dashboard.startService(vpn_intent); +        // TODO validate "action"...how do we get the list of intent-filters for a class via Android API? +        Intent vpn_intent = new Intent(dashboard.getApplicationContext(), EIP.class); +        vpn_intent.setAction(action); +        vpn_intent.putExtra(Constants.RECEIVER_TAG, mEIPReceiver); +        dashboard.startService(vpn_intent);      } -	 +      @Override      public void update (Observable observable, Object data) { -	if(observable instanceof EipStatus) { -	    eip_status = (EipStatus) observable; -	    final EipStatus eip_status = (EipStatus) observable; -	    dashboard.runOnUiThread(new Runnable() { -	    	    @Override -	    	    public void run() { -			handleNewState(eip_status); -		    } -		}); -	} +        if(observable instanceof EipStatus) { +            eip_status = (EipStatus) observable; +            final EipStatus eip_status = (EipStatus) observable; +            dashboard.runOnUiThread(new Runnable() { +                @Override +                public void run() { +                    handleNewState(eip_status); +                } +            }); +        }      }      private void handleNewState(EipStatus eip_status) { -	if(eip_status.wantsToDisconnect()) -	    setDisconnectedUI(); -	else if(eip_status.isConnecting() || is_starting_to_connect) -	    setInProgressUI(eip_status); -	else if (eip_status.isConnected()) -	    setConnectedUI(); -	else if (eip_status.isDisconnected() && !eip_status.isConnecting()) -	    setDisconnectedUI(); +        if(eip_status.wantsToDisconnect()) +            setDisconnectedUI(); +        else if(eip_status.isConnecting() || is_starting_to_connect) +            setInProgressUI(eip_status); +        else if (eip_status.isConnected()) +            setConnectedUI(); +        else if (eip_status.isDisconnected() && !eip_status.isConnecting()) +            setDisconnectedUI();      }      private void setConnectedUI() { -	hideProgressBar(); -	Log.d(TAG, "setConnectedUi? " + eip_status.isConnected()); -	adjustSwitch(); -    is_starting_to_connect = false; -	status_message.setText(dashboard.getString(R.string.eip_state_connected)); +        hideProgressBar(); +        Log.d(TAG, "setConnectedUi? " + eip_status.isConnected()); +        adjustSwitch(); +        is_starting_to_connect = false; +        status_message.setText(dashboard.getString(R.string.eip_state_connected));      }      private void setDisconnectedUI(){ -	hideProgressBar(); -	adjustSwitch(); -	String last_log_message = eip_status.getLastLogMessage(dashboard.getApplicationContext()); -	if((last_log_message.contains("error") || last_log_message.contains("ERROR")) -	   && !status_message.getText().toString().equalsIgnoreCase(dashboard.getString(R.string.eip_state_not_connected))){ -	    dashboard.showLog(); -	} +        hideProgressBar(); +        adjustSwitch(); +        String last_log_message = eip_status.getLastLogMessage(dashboard.getApplicationContext()); +        if((last_log_message.contains("error") || last_log_message.contains("ERROR")) +                && !status_message.getText().toString().equalsIgnoreCase(dashboard.getString(R.string.eip_state_not_connected))){ +            dashboard.showLog(); +        }          status_message.setText(dashboard.getString(R.string.eip_state_not_connected));      }      private void adjustSwitch() { -	if(eip_status.isConnected() || eip_status.isConnecting() || is_starting_to_connect) { -	    Log.d(TAG, "adjustSwitch, isConnected || isConnecting, is checked"); -	    if(!eip_switch.isChecked()) { -		eip_switch.setChecked(true); -	    } -	} else { -	    Log.d(TAG, "adjustSwitch, !isConnected && !isConnecting? " + eip_status.toString()); +        if(eip_status.isConnected() || eip_status.isConnecting() || is_starting_to_connect) { +            Log.d(TAG, "adjustSwitch, isConnected || isConnecting, is checked"); +            if(!eip_switch.isChecked()) { +                eip_switch.setChecked(true); +            } +        } else { +            Log.d(TAG, "adjustSwitch, !isConnected && !isConnecting? " + eip_status.toString()); -	    if(eip_switch.isChecked()) { -		eip_switch.setChecked(false); -	    } -	} +            if(eip_switch.isChecked()) { +                eip_switch.setChecked(false); +            } +        }      }      private void setInProgressUI(EipStatus eip_status) { -	int localizedResId = eip_status.getLocalizedResId(); -	String logmessage = eip_status.getLogMessage(); -	String prefix = dashboard.getString(localizedResId); +        int localizedResId = eip_status.getLocalizedResId(); +        String logmessage = eip_status.getLogMessage(); +        String prefix = dashboard.getString(localizedResId); -	showProgressBar(); -	status_message.setText(prefix + " " + logmessage); +        showProgressBar(); +        status_message.setText(prefix + " " + logmessage);          is_starting_to_connect = false; -	adjustSwitch(); +        adjustSwitch();      }      private void updatingCertificateUI() { -	showProgressBar(); +        showProgressBar();          status_message.setText(getString(R.string.updating_certificate_message));      }      private void showProgressBar() { -	if(progress_bar != null) -	    progress_bar.setVisibility(View.VISIBLE); +        if(progress_bar != null) +            progress_bar.setVisibility(View.VISIBLE);      }      private void hideProgressBar() { -	if(progress_bar != null) -	    progress_bar.setVisibility(View.GONE); -    } - -    protected class EIPReceiver extends ResultReceiver { - -	protected EIPReceiver(Handler handler){ -	    super(handler); -	} - -	@Override -	protected void onReceiveResult(int resultCode, Bundle resultData) { -	    super.onReceiveResult(resultCode, resultData); - -	    String request = resultData.getString(Constants.REQUEST_TAG); - -	    if (request.equals(Constants.ACTION_START_EIP)) { -		switch (resultCode){ -		case Activity.RESULT_OK: -		    break; -		case Activity.RESULT_CANCELED: -		     -		    break; -		} -	    } else if (request.equals(Constants.ACTION_STOP_EIP)) { -		switch (resultCode){ -		case Activity.RESULT_OK: -		    stopEIP(); -		    break; -		case Activity.RESULT_CANCELED: -		    break; -		} -	    } else if (request.equals(Constants.EIP_NOTIFICATION)) { -		switch  (resultCode){ -		case Activity.RESULT_OK: -		    break; -		case Activity.RESULT_CANCELED: -		    break; -		} -	    } else if (request.equals(Constants.ACTION_CHECK_CERT_VALIDITY)) { -		switch (resultCode) { -		case Activity.RESULT_OK: -		    break; -		case Activity.RESULT_CANCELED: -            updatingCertificateUI(); -            dashboard.downloadVpnCertificate(); -		    break; -		} -	    } else if (request.equals(Constants.ACTION_UPDATE_EIP_SERVICE)) { +        if(progress_bar != null) +            progress_bar.setVisibility(View.GONE); +    } + +protected class EIPReceiver extends ResultReceiver { + +    protected EIPReceiver(Handler handler){ +        super(handler); +    } + +    @Override +    protected void onReceiveResult(int resultCode, Bundle resultData) { +        super.onReceiveResult(resultCode, resultData); + +        String request = resultData.getString(Constants.REQUEST_TAG); + +        if (request.equals(Constants.ACTION_START_EIP)) { +            switch (resultCode){ +                case Activity.RESULT_OK: +                    break; +                case Activity.RESULT_CANCELED: + +                    break; +            } +        } else if (request.equals(Constants.ACTION_STOP_EIP)) { +            switch (resultCode){ +                case Activity.RESULT_OK: +                    stop(); +                    break; +                case Activity.RESULT_CANCELED: +                    break; +            } +        } else if (request.equals(Constants.EIP_NOTIFICATION)) { +            switch  (resultCode){ +                case Activity.RESULT_OK: +                    break; +                case Activity.RESULT_CANCELED: +                    break; +            } +        } else if (request.equals(Constants.ACTION_CHECK_CERT_VALIDITY)) { +            switch (resultCode) { +                case Activity.RESULT_OK: +                    break; +                case Activity.RESULT_CANCELED: +                    updatingCertificateUI(); +                    dashboard.downloadVpnCertificate(); +                    break; +            } +        } else if (request.equals(Constants.ACTION_UPDATE_EIP_SERVICE)) {              switch (resultCode) {                  case Activity.RESULT_OK:                      if(wants_to_connect) @@ -377,11 +397,11 @@ public class EipFragment extends Fragment implements Observer {                      break;              }          } -	}      } +}      public static EIPReceiver getReceiver() { -	return mEIPReceiver; +        return mEIPReceiver;      }  } 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 6f260f55..5f5dcabd 100644 --- a/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java +++ b/app/src/main/java/se/leap/bitmaskclient/eip/VpnConfigGenerator.java @@ -1,6 +1,6 @@  /**   * Copyright (c) 2013 LEAP Encryption Access Project and contributers - *  + *   * This program is free software: you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation, either version 3 of the License, or @@ -37,79 +37,79 @@ public class VpnConfigGenerator {      private final String new_line = System.getProperty("line.separator"); // Platform new line      public VpnConfigGenerator(JSONObject general_configuration, JSONObject secrets, JSONObject gateway) { -	this.general_configuration = general_configuration; -	this.gateway = gateway; +        this.general_configuration = general_configuration; +        this.gateway = gateway;          this.secrets = secrets;      } -     +      public String generate() { -	return -	    generalConfiguration() -	    + new_line -	    + gatewayConfiguration() -	    + new_line -	    + secretsConfiguration() -	    + new_line -	    + androidCustomizations(); +        return +                generalConfiguration() +                        + new_line +                        + gatewayConfiguration() +                        + new_line +                        + secretsConfiguration() +                        + new_line +                        + androidCustomizations();      }      private String generalConfiguration() { -	String common_options = ""; -	try { -	    Iterator keys = general_configuration.keys(); -	    while ( keys.hasNext() ){ -		String key = keys.next().toString(); -					 -		common_options += key + " "; -		for ( String word : general_configuration.getString(key).split(" ") ) -		    common_options += word + " "; -		common_options += new_line; -			 -	    } -	} catch (JSONException e) { -	    // TODO Auto-generated catch block -	    e.printStackTrace(); -	} - -	common_options += "client"; - -	return common_options; +        String common_options = ""; +        try { +            Iterator keys = general_configuration.keys(); +            while ( keys.hasNext() ){ +                String key = keys.next().toString(); + +                common_options += key + " "; +                for (String word : general_configuration.getString(key).split(" ")) +                    common_options += word + " "; +                common_options += new_line; + +            } +        } catch (JSONException e) { +            // TODO Auto-generated catch block +            e.printStackTrace(); +        } + +        common_options += "client"; + +        return common_options;      } -     +      private String gatewayConfiguration() { -	String remotes = ""; -		 -	String ip_address_keyword = "ip_address"; -	String remote_keyword = "remote"; -	String ports_keyword = "ports"; -	String protocol_keyword = "protocols"; -	String capabilities_keyword = "capabilities"; -	String udp = "udp"; -		 -	try { -	    String ip_address = gateway.getString(ip_address_keyword); -	    JSONObject capabilities = gateway.getJSONObject(capabilities_keyword); -	    JSONArray ports = capabilities.getJSONArray(ports_keyword); -	    for (int i=0; i<ports.length(); i++) { -		String port_specific_remotes = ""; -		int port = ports.getInt(i); -		JSONArray protocols = capabilities.getJSONArray(protocol_keyword); -		for ( int j=0; j<protocols.length(); j++ ) { -		    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; -		} -		remotes += port_specific_remotes; -	    } -	} catch (JSONException e) { -	    // TODO Auto-generated catch block -	    e.printStackTrace(); -	} -		 -	return remotes; +        String remotes = ""; + +        String ip_address_keyword = "ip_address"; +        String remote_keyword = "remote"; +        String ports_keyword = "ports"; +        String protocol_keyword = "protocols"; +        String capabilities_keyword = "capabilities"; +        String udp = "udp"; + +        try { +            String ip_address = gateway.getString(ip_address_keyword); +            JSONObject capabilities = gateway.getJSONObject(capabilities_keyword); +            JSONArray ports = capabilities.getJSONArray(ports_keyword); +            for (int i=0; i<ports.length(); i++) { +                String port_specific_remotes = ""; +                int port = ports.getInt(i); +                JSONArray protocols = capabilities.getJSONArray(protocol_keyword); +                for ( int j=0; j<protocols.length(); j++ ) { +                    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; +                } +                remotes += port_specific_remotes; +            } +        } catch (JSONException e) { +            // TODO Auto-generated catch block +            e.printStackTrace(); +        } + +        return remotes;      }      private String secretsConfiguration() { @@ -143,11 +143,11 @@ public class VpnConfigGenerator {      }      private String androidCustomizations() { -	return -	    "remote-cert-tls server" -	    + new_line -	    + "persist-tun" -	    + new_line -	    + "auth-retry nointeract"; +        return +                "remote-cert-tls server" +                        + new_line +                        + "persist-tun" +                        + new_line +                        + "auth-retry nointeract";      }  } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 897223ad..632bc1f8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -67,6 +67,7 @@      <string name="eip_status_start_pending">Initiating connection</string>      <string name="eip_cancel_connect_title">Cancel connection?</string>      <string name="eip_cancel_connect_text">There is a connection attempt in progress.  Do you wish to cancel it?</string> +    <string name="eip.warning.browser_inconsistency">In order to avoid leaking your personal information, please close your browser and start a private window after disconnecting the Encrypted VPN Internet Access. Thanks.</string>      <string name="yes">Yes</string>      <string name="no">No</string>      <string name="eip_state_not_connected">"Not running! Connection not secure!"</string> | 
