diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/se/leap/bitmaskclient/ConfigHelper.java | 3 | ||||
| -rw-r--r-- | src/se/leap/bitmaskclient/ConfigurationWizard.java | 95 | ||||
| -rw-r--r-- | src/se/leap/bitmaskclient/Dashboard.java | 3 | ||||
| -rw-r--r-- | src/se/leap/bitmaskclient/DownloadFailedDialog.java | 45 | ||||
| -rw-r--r-- | src/se/leap/bitmaskclient/EIP.java | 16 | ||||
| -rw-r--r-- | src/se/leap/bitmaskclient/EipServiceFragment.java | 5 | ||||
| -rw-r--r-- | src/se/leap/bitmaskclient/LeapSRPSession.java | 11 | ||||
| -rw-r--r-- | src/se/leap/bitmaskclient/NewProviderDialog.java | 8 | ||||
| -rw-r--r-- | src/se/leap/bitmaskclient/ProviderAPI.java | 174 | ||||
| -rw-r--r-- | src/se/leap/bitmaskclient/ProviderListAdapter.java | 8 | ||||
| -rw-r--r-- | src/se/leap/bitmaskclient/ProviderListFragment.java | 14 | ||||
| -rw-r--r-- | src/se/leap/openvpn/OpenVpnService.java | 4 | 
12 files changed, 327 insertions, 59 deletions
diff --git a/src/se/leap/bitmaskclient/ConfigHelper.java b/src/se/leap/bitmaskclient/ConfigHelper.java index dd7049a7..6b49d7d7 100644 --- a/src/se/leap/bitmaskclient/ConfigHelper.java +++ b/src/se/leap/bitmaskclient/ConfigHelper.java @@ -168,6 +168,9 @@ public class ConfigHelper {  		return shared_preferences.getInt(shared_preferences_key, 0);  	} +	protected static boolean sharedPrefContainsKey(String shared_preferences_key) { +		return shared_preferences.contains(shared_preferences_key); +	}  	/*  	 * This method defaults to false.  	 * If you use this method, be sure to fail-closed on false! diff --git a/src/se/leap/bitmaskclient/ConfigurationWizard.java b/src/se/leap/bitmaskclient/ConfigurationWizard.java index 444be843..cf027660 100644 --- a/src/se/leap/bitmaskclient/ConfigurationWizard.java +++ b/src/se/leap/bitmaskclient/ConfigurationWizard.java @@ -22,9 +22,15 @@ import java.util.Iterator;  import org.json.JSONException;
  import org.json.JSONObject;
 -import se.leap.bitmaskclient.R;
 -import se.leap.bitmaskclient.ProviderAPIResultReceiver.Receiver;
 -import se.leap.bitmaskclient.ProviderListContent.ProviderItem;
 + +import se.leap.bitmaskclient.R; +import se.leap.bitmaskclient.ProviderAPIResultReceiver.Receiver; +import se.leap.bitmaskclient.ProviderListContent.ProviderItem; + +import se.leap.bitmaskclient.DownloadFailedDialog.DownloadFailedDialogInterface; +import se.leap.bitmaskclient.NewProviderDialog.NewProviderDialogInterface; +import se.leap.bitmaskclient.ProviderDetailFragment.ProviderDetailFragmentInterface; +  import android.app.Activity;
  import android.app.DialogFragment;
  import android.app.Fragment;
 @@ -61,7 +67,7 @@ import android.widget.TextView;   *
   */
  public class ConfigurationWizard extends Activity
 -implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogInterface, ProviderDetailFragment.ProviderDetailFragmentInterface, Receiver {
 +implements ProviderListFragment.Callbacks, NewProviderDialogInterface, ProviderDetailFragmentInterface, DownloadFailedDialogInterface, Receiver {
  	private ProgressBar mProgressBar;
  	private TextView progressbar_description;
 @@ -78,7 +84,7 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn      public ProviderAPIResultReceiver providerAPI_result_receiver;
      private ProviderAPIBroadcastReceiver_Update providerAPI_broadcast_receiver_update;
 -
 +      @Override
      protected void onCreate(Bundle savedInstanceState) {
 @@ -192,9 +198,15 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn  	//	resetOldConnection();
  	    ProviderItem selected_provider = getProvider(id);
  	    int provider_index = getProviderIndex(id);
 -	    startProgressBar(provider_index);
 + + +	    startProgressBar(provider_index+1);  	    provider_list_fragment.hideAllBut(provider_index); -	    setUpProvider(selected_provider.providerMainUrl(), true); + +	    boolean danger_on = true; +	    if(ConfigHelper.sharedPrefContainsKey(ProviderItem.DANGER_ON)) +		danger_on = ConfigHelper.getBoolFromSharedPref(ProviderItem.DANGER_ON); +	    setUpProvider(selected_provider.providerMainUrl(), danger_on);      }
      @Override
 @@ -238,6 +250,13 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn  	    }
  	    return "";
      }
 + +	
 +	private void startProgressBar() {
 +	    mProgressBar.setVisibility(ProgressBar.VISIBLE);
 +	    mProgressBar.setProgress(0);
 +	    mProgressBar.setMax(3);
 +	}
  	private void startProgressBar(int list_item_index) {
  	    mProgressBar.setVisibility(ProgressBar.VISIBLE);
 @@ -256,8 +275,12 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn  		    ProviderItem provider = providers_iterator.next();
  		    if(provider.name().equalsIgnoreCase(id)) {
  			    break;
 -		    }
 -		    index++;
 +//<<<<<<< HEAD +//		    }
 +//		    index++;
 +//======= +		    } else index++;
 +//>>>>>>> bug/more-detailed-response-to-CW-errors  	    }
  	    return index;
      }
 @@ -343,6 +366,24 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn  	}
  	/**
 +	 * Open the new provider dialog with data
 +	 */
 +	public void addAndSelectNewProvider(String main_url, boolean danger_on) {
 +		FragmentTransaction fragment_transaction = getFragmentManager().beginTransaction();
 +		Fragment previous_new_provider_dialog = getFragmentManager().findFragmentByTag(NewProviderDialog.TAG);
 +		if (previous_new_provider_dialog != null) {
 +			fragment_transaction.remove(previous_new_provider_dialog);
 +		}
 +		
 +		DialogFragment newFragment = NewProviderDialog.newInstance();
 +		Bundle data = new Bundle();
 +		data.putString(Provider.MAIN_URL, main_url);
 +		data.putBoolean(ProviderItem.DANGER_ON, danger_on);
 +		newFragment.setArguments(data);
 +		newFragment.show(fragment_transaction, NewProviderDialog.TAG);
 +	}
 +	
 +	/**
  	 * Once selected a provider, this fragment offers the user to log in, 
  	 * use it anonymously (if possible) 
  	 * or cancel his/her election pressing the back button.
 @@ -391,6 +432,8 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn  	}
  	private void autoSelectProvider(String provider_main_url, boolean danger_on) {
 + +		ConfigHelper.saveSharedPref(ProviderItem.DANGER_ON, danger_on);
  		onItemSelected(getId(provider_main_url));
  	}
 @@ -409,10 +452,24 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn  		provider_API_command.setAction(ProviderAPI.SET_UP_PROVIDER);
  		provider_API_command.putExtra(ProviderAPI.PARAMETERS, parameters);
  		provider_API_command.putExtra(ProviderAPI.RECEIVER_KEY, providerAPI_result_receiver);
 -
 -		startService(provider_API_command);
 -	}
 -
 + +		startService(provider_API_command); +	} + +	public void retrySetUpProvider() { +		cancelSettingUpProvider(); +		if(!ProviderAPI.caCertDownloaded()) { +			addAndSelectNewProvider(ProviderAPI.lastProviderMainUrl(), ProviderAPI.lastDangerOn()); +		} else { +			Intent provider_API_command = new Intent(this, ProviderAPI.class); + +			provider_API_command.setAction(ProviderAPI.SET_UP_PROVIDER); +			provider_API_command.putExtra(ProviderAPI.RECEIVER_KEY, providerAPI_result_receiver); + +			startService(provider_API_command); +		} +	} +	  	@Override
  	public boolean onCreateOptionsMenu(Menu menu) {
  		getMenuInflater().inflate(R.menu.configuration_wizard_activity, menu);
 @@ -438,6 +495,18 @@ implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogIn  		if(provider_list_fragment != null)
  			provider_list_fragment.unhideAll();
  	}
 +	
 +	public void cancelSettingUpProvider() {
 +		provider_list_fragment = (ProviderListFragment) getFragmentManager().findFragmentByTag(ProviderListFragment.TAG);
 +		if(provider_list_fragment != null && ConfigHelper.sharedPrefContainsKey(ProviderItem.DANGER_ON)) {
 +			provider_list_fragment.removeLastItem();
 +		}
 +
 +		ConfigHelper.removeFromSharedPref(Provider.KEY);
 +		ConfigHelper.removeFromSharedPref(ProviderItem.DANGER_ON);
 +		ConfigHelper.removeFromSharedPref(EIP.ALLOWED_ANON);
 +		ConfigHelper.removeFromSharedPref(EIP.KEY);
 +	}
  	@Override
  	public void login() {
 diff --git a/src/se/leap/bitmaskclient/Dashboard.java b/src/se/leap/bitmaskclient/Dashboard.java index 0ef50f4a..44cf8247 100644 --- a/src/se/leap/bitmaskclient/Dashboard.java +++ b/src/se/leap/bitmaskclient/Dashboard.java @@ -112,6 +112,7 @@ public class Dashboard extends Activity implements LogInDialog.LogInDialogInterf  			if ( resultCode == RESULT_OK ){		  				ConfigHelper.saveSharedPref(EIP.PARSED_SERIAL, 0);  				ConfigHelper.saveSharedPref(EIP.AUTHED_EIP, authed_eip); +  				startService( new Intent(EIP.ACTION_UPDATE_EIP_SERVICE) );  				buildDashboard(); @@ -166,6 +167,8 @@ public class Dashboard extends Activity implements LogInDialog.LogInDialogInterf  		providerNameTV = (TextView) findViewById(R.id.providerName);  		providerNameTV.setText(provider.getDomain());  		providerNameTV.setTextSize(28); +		 +	    mProgressBar = (ProgressBar) findViewById(R.id.eipProgress);  		FragmentManager fragMan = getFragmentManager();  		if ( provider.hasEIP()){ diff --git a/src/se/leap/bitmaskclient/DownloadFailedDialog.java b/src/se/leap/bitmaskclient/DownloadFailedDialog.java index 3ce101a6..f78002b0 100644 --- a/src/se/leap/bitmaskclient/DownloadFailedDialog.java +++ b/src/se/leap/bitmaskclient/DownloadFailedDialog.java @@ -14,9 +14,12 @@   * You should have received a copy of the GNU General Public License   * along with this program. If not, see <http://www.gnu.org/licenses/>.   */ - package se.leap.bitmaskclient; +package se.leap.bitmaskclient;  import se.leap.bitmaskclient.R; +import se.leap.bitmaskclient.NewProviderDialog.NewProviderDialogInterface; +import se.leap.bitmaskclient.ProviderListContent.ProviderItem; +import android.app.Activity;  import android.app.AlertDialog;  import android.app.Dialog;  import android.app.DialogFragment; @@ -42,18 +45,50 @@ public class DownloadFailedDialog extends DialogFragment {  		return dialog_fragment;  	} -    @Override +	@Override  	public Dialog onCreateDialog(Bundle savedInstanceState) {  		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); -		 +  		builder.setMessage(reason_to_fail) -		.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { +		.setPositiveButton(R.string.retry, new DialogInterface.OnClickListener() { +			public void onClick(DialogInterface dialog, int id) { +				dismiss(); +				interface_with_ConfigurationWizard.retrySetUpProvider(); +			} +		}) +		.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {  			public void onClick(DialogInterface dialog, int id) { +				interface_with_ConfigurationWizard.cancelSettingUpProvider();  				dialog.dismiss();  			}  		}); -			 +  		// Create the AlertDialog object and return it  		return builder.create();  	} + +	public interface DownloadFailedDialogInterface { +		public void retrySetUpProvider(); +		public void cancelSettingUpProvider(); +	} + +	DownloadFailedDialogInterface interface_with_ConfigurationWizard; + +	@Override +	public void onAttach(Activity activity) { +		super.onAttach(activity); +		try { +			interface_with_ConfigurationWizard = (DownloadFailedDialogInterface) activity; +		} catch (ClassCastException e) { +			throw new ClassCastException(activity.toString() +					+ " must implement NoticeDialogListener"); +		} +	} + +	@Override +	public void onCancel(DialogInterface dialog) { +		interface_with_ConfigurationWizard.cancelSettingUpProvider(); +		dialog.dismiss(); +	} +  } diff --git a/src/se/leap/bitmaskclient/EIP.java b/src/se/leap/bitmaskclient/EIP.java index ec2f6972..2b7fd39f 100644 --- a/src/se/leap/bitmaskclient/EIP.java +++ b/src/se/leap/bitmaskclient/EIP.java @@ -58,10 +58,10 @@ import android.util.Log;   */  public final class EIP extends IntentService { +	public final static String AUTHED_EIP = "authed eip";  	public final static String ACTION_START_EIP = "se.leap.bitmaskclient.START_EIP";  	public final static String ACTION_STOP_EIP = "se.leap.bitmaskclient.STOP_EIP";  	public final static String ACTION_UPDATE_EIP_SERVICE = "se.leap.bitmaskclient.UPDATE_EIP_SERVICE"; -	public final static String AUTHED_EIP = "authed_eip";  	public final static String ACTION_IS_EIP_RUNNING = "se.leap.bitmaskclient.IS_RUNNING";  	public final static String EIP_NOTIFICATION = "EIP_NOTIFICATION";  	public final static String ALLOWED_ANON = "allow_anonymous"; @@ -439,7 +439,8 @@ public final class EIP extends IntentService {  			String ports = "ports";  			String protos = "protocols";  			String capabilities = "capabilities"; -			String location = "location"; +			String location_key = "location"; +			String locations = "locations";  			Vector<String> arg = new Vector<String>();  			Vector<Vector<String>> args = new Vector<Vector<String>>(); @@ -456,7 +457,6 @@ public final class EIP extends IntentService {  						arg.add(word);  					value.add( (Vector<String>) arg.clone() );  					options.put(key, (Vector<Vector<String>>) value.clone()); -  					value.clear();  					arg.clear();  				} @@ -477,16 +477,22 @@ public final class EIP extends IntentService {  			arg.clear();  			args.clear(); +  			try { -				arg.add(location); -				arg.add(mGateway.getString(location)); +				 +				arg.add(location_key); +				String locationText = ""; +				locationText = eipDefinition.getJSONObject(locations).getJSONObject(mGateway.getString(location_key)).getString("name");		 +				arg.add(locationText); +  			} catch (JSONException e) {  				// TODO Auto-generated catch block  				e.printStackTrace();  			}  			args.add((Vector<String>) arg.clone());  			options.put("location", (Vector<Vector<String>>) args.clone() ); +  			arg.clear();  			args.clear();  			JSONArray protocolsJSON = null; diff --git a/src/se/leap/bitmaskclient/EipServiceFragment.java b/src/se/leap/bitmaskclient/EipServiceFragment.java index e182b3fd..b409394b 100644 --- a/src/se/leap/bitmaskclient/EipServiceFragment.java +++ b/src/se/leap/bitmaskclient/EipServiceFragment.java @@ -202,7 +202,10 @@ public class EipServiceFragment extends Fragment implements StateListener, OnCli  						switchState = false;  					} else if (state.equals("NOPROCESS")){  						statusMessage = logmessage; -					} else { +					} else if (state.equals("ASSIGN_IP")){ //don't show assigning message in eipStatus +						statusMessage = (String) eipStatus.getText(); +					} +					else {  						statusMessage = prefix + " " + logmessage;  					} diff --git a/src/se/leap/bitmaskclient/LeapSRPSession.java b/src/se/leap/bitmaskclient/LeapSRPSession.java index 14a8bff2..0849f777 100644 --- a/src/se/leap/bitmaskclient/LeapSRPSession.java +++ b/src/se/leap/bitmaskclient/LeapSRPSession.java @@ -35,9 +35,12 @@ import org.jboss.security.srp.SRPParameters;   */  public class LeapSRPSession { +	private static String token = ""; +	  	final public static String SALT = "salt";  	final public static String M1 = "M1";  	final public static String M2 = "M2"; +	final public static String TOKEN = "token";  	private SRPParameters params;  	private String username; @@ -312,6 +315,14 @@ public class LeapSRPSession {  		boolean valid = Arrays.equals(M2, myM2);  		return valid;  	} +	 +	protected static void setToken(String token) { +		LeapSRPSession.token = token; +	} +	 +	protected static String getToken() { +		return token; +	}  	/**  	 * @return a new SHA-256 digest. diff --git a/src/se/leap/bitmaskclient/NewProviderDialog.java b/src/se/leap/bitmaskclient/NewProviderDialog.java index 98686bd2..cf09c64b 100644 --- a/src/se/leap/bitmaskclient/NewProviderDialog.java +++ b/src/se/leap/bitmaskclient/NewProviderDialog.java @@ -16,6 +16,7 @@   */   package se.leap.bitmaskclient; +import se.leap.bitmaskclient.ProviderListContent.ProviderItem;  import se.leap.bitmaskclient.R;  import android.app.Activity;  import android.app.AlertDialog; @@ -71,7 +72,14 @@ public class NewProviderDialog extends DialogFragment {  		LayoutInflater inflater = getActivity().getLayoutInflater();  		View new_provider_dialog_view = inflater.inflate(R.layout.new_provider_dialog, null);  		final EditText url_input_field = (EditText)new_provider_dialog_view.findViewById(R.id.new_provider_url); +		if(getArguments() != null && getArguments().containsKey(Provider.MAIN_URL)) { +			url_input_field.setText(getArguments().getString(Provider.MAIN_URL)); +		}  		final CheckBox danger_checkbox = (CheckBox)new_provider_dialog_view.findViewById(R.id.danger_checkbox); +		if(getArguments() != null && getArguments().containsKey(ProviderItem.DANGER_ON)) { +			danger_checkbox.setActivated(getArguments().getBoolean(ProviderItem.DANGER_ON)); +		} +		  		builder.setView(new_provider_dialog_view)  			.setMessage(R.string.introduce_new_provider)  			.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() { diff --git a/src/se/leap/bitmaskclient/ProviderAPI.java b/src/se/leap/bitmaskclient/ProviderAPI.java index 2a1cd29b..ff6dd852 100644 --- a/src/se/leap/bitmaskclient/ProviderAPI.java +++ b/src/se/leap/bitmaskclient/ProviderAPI.java @@ -27,6 +27,7 @@ import java.net.CookieManager;  import java.net.CookiePolicy;  import java.net.MalformedURLException;  import java.net.SocketTimeoutException; +import java.net.URISyntaxException;  import java.net.URL;  import java.net.URLConnection;  import java.net.URLEncoder; @@ -58,7 +59,6 @@ import org.apache.http.client.ClientProtocolException;  import org.jboss.security.srp.SRPParameters;  import org.json.JSONException;  import org.json.JSONObject; -import org.json.JSONStringer;  import se.leap.bitmaskclient.R;  import se.leap.bitmaskclient.ProviderListContent.ProviderItem; @@ -69,7 +69,7 @@ import android.os.Handler;  import android.os.ResultReceiver;  import android.util.Base64;  import android.util.Log; -import android.widget.Toast; +  /**   * Implements HTTP api methods used to manage communications with the provider server. @@ -97,8 +97,8 @@ public class ProviderAPI extends IntentService {      SESSION_ID_COOKIE_KEY = "session_id_cookie_key",      SESSION_ID_KEY = "session_id",      ERRORS = "errors", -    UPDATE_PROGRESSBAR = "update_action", -    CURRENT_PROGRESS = "update data", +    UPDATE_PROGRESSBAR = "update_progressbar", +    CURRENT_PROGRESS = "current_progress",      TAG = "provider_api_tag"      ; @@ -118,6 +118,15 @@ public class ProviderAPI extends IntentService {      INCORRECTLY_DOWNLOADED_ANON_CERTIFICATE = 14      ; +    private static boolean  +    CA_CERT_DOWNLOADED = false, +    PROVIDER_JSON_DOWNLOADED = false, +    EIP_SERVICE_JSON_DOWNLOADED = false +    ; +     +    private static String last_provider_main_url; +    private static boolean last_danger_on = false; +      	public ProviderAPI() {  		super("ProviderAPI");  		Log.v("ClassName", "Provider API"); @@ -130,22 +139,30 @@ public class ProviderAPI extends IntentService {  		CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER) );  	} +	public static String lastProviderMainUrl() { +		return last_provider_main_url; +	} +	 +    public static boolean lastDangerOn() { +    	return last_danger_on; +    } +      	private String formatErrorMessage(final int toast_string_id) {  		return "{ \"" + ERRORS + "\" : \""+getResources().getString(toast_string_id)+"\" }";  	}  	@Override  	protected void onHandleIntent(Intent command) { -		final ResultReceiver receiver = command.getParcelableExtra("receiver"); +		final ResultReceiver receiver = command.getParcelableExtra(RECEIVER_KEY);  		String action = command.getAction();  		Bundle parameters = command.getBundleExtra(PARAMETERS);  		if(action.equalsIgnoreCase(SET_UP_PROVIDER)) {  			Bundle result = setUpProvider(parameters);  			if(result.getBoolean(RESULT_KEY)) { -				receiver.send(PROVIDER_OK, result); +				receiver.send(PROVIDER_OK, Bundle.EMPTY);  			} else {  -				receiver.send(PROVIDER_NOK, Bundle.EMPTY); +				receiver.send(PROVIDER_NOK, result);  			}  		} else if (action.equalsIgnoreCase(SRP_AUTH)) {  			Bundle session_id_bundle = authenticateBySRP(parameters); @@ -343,6 +360,9 @@ public class ProviderAPI extends IntentService {  			session_idAndM2.put(ConfigHelper.SESSION_ID_COOKIE_KEY, session_id_cookie.getName());  			session_idAndM2.put(ConfigHelper.SESSION_ID_KEY, session_id_cookie.getValue());*/  			session_idAndM2.put(LeapSRPSession.M2, ConfigHelper.trim(M2_not_trimmed)); +			CookieHandler.setDefault(null); // we don't need cookies anymore +			String token = json_response.getString(LeapSRPSession.TOKEN); +			LeapSRPSession.setToken(token);  		}  		return session_idAndM2;  	} @@ -414,38 +434,85 @@ public class ProviderAPI extends IntentService {  	    return result.toString();  	} +	 +	 +	 +	  	/**  	 * Downloads a provider.json from a given URL, adding a new provider using the given name.    	 * @param task containing a boolean meaning if the provider is custom or not, another boolean meaning if the user completely trusts this provider, the provider name and its provider.json url.  	 * @return a bundle with a boolean value mapped to a key named RESULT_KEY, and which is true if the update was successful.   	 */  	private Bundle setUpProvider(Bundle task) { -		Bundle result = new Bundle(); +//<<<<<<< HEAD +//		Bundle result = new Bundle(); +//		int progress = 0; +//		boolean danger_on = task.getBoolean(ProviderItem.DANGER_ON); +//		String provider_main_url = task.getString(Provider.MAIN_URL); +//		if(downloadCACert(provider_main_url, danger_on)) { +//			broadcast_progress(progress++); +//			result.putBoolean(RESULT_KEY, true); +//			if(getAndSetProviderJson(provider_main_url)) { +//				broadcast_progress(progress++); +//				if(getAndSetEipServiceJson()) +//					broadcast_progress(progress++); +//			} +//		} +//		return result; +//	} +//	 +//	 +//=======  		int progress = 0; -		boolean danger_on = task.getBoolean(ProviderItem.DANGER_ON); -		String provider_main_url = task.getString(Provider.MAIN_URL); -		if(downloadCACert(provider_main_url, danger_on)) { +		Bundle current_download = new Bundle(); +		 +		if(task != null && task.containsKey(ProviderItem.DANGER_ON) && task.containsKey(Provider.MAIN_URL)) { +			last_danger_on = task.getBoolean(ProviderItem.DANGER_ON); +			last_provider_main_url = task.getString(Provider.MAIN_URL); +			CA_CERT_DOWNLOADED = PROVIDER_JSON_DOWNLOADED = EIP_SERVICE_JSON_DOWNLOADED = false; +		} + +		if(!CA_CERT_DOWNLOADED) +			current_download = downloadCACert(last_provider_main_url, last_danger_on); +		if(CA_CERT_DOWNLOADED || (current_download.containsKey(RESULT_KEY) && current_download.getBoolean(RESULT_KEY))) {  			broadcast_progress(progress++); -			result.putBoolean(RESULT_KEY, true); -			if(getAndSetProviderJson(provider_main_url)) { +			CA_CERT_DOWNLOADED = true; +			if(!PROVIDER_JSON_DOWNLOADED) +				current_download = getAndSetProviderJson(last_provider_main_url);  +			if(PROVIDER_JSON_DOWNLOADED || (current_download.containsKey(RESULT_KEY) && current_download.getBoolean(RESULT_KEY))) {  				broadcast_progress(progress++); -				if(getAndSetEipServiceJson()) +				PROVIDER_JSON_DOWNLOADED = true; +				current_download = getAndSetEipServiceJson();  +				if(current_download.containsKey(RESULT_KEY) && current_download.getBoolean(RESULT_KEY)) {  					broadcast_progress(progress++); +					EIP_SERVICE_JSON_DOWNLOADED = true; +				}  			}  		} -		return result; +		 +		return current_download;  	} -	private boolean downloadCACert(String provider_main_url, boolean danger_on) { +	private Bundle downloadCACert(String provider_main_url, boolean danger_on) { +		Bundle result = new Bundle();  		String cert_string = downloadWithCommercialCA(provider_main_url + "/ca.crt", danger_on); -		if(validCertificate(cert_string)) +		if(validCertificate(cert_string)) {  			ConfigHelper.saveSharedPref(Provider.CA_CERT, cert_string); -		else -			return false; +			result.putBoolean(RESULT_KEY, true); +		} else { +			String reason_to_fail = pickErrorMessage(cert_string); +			result.putString(ERRORS, reason_to_fail); +			result.putBoolean(RESULT_KEY, false); +		} -		return true; +		return result;  	} + +	public static boolean caCertDownloaded() { +		return CA_CERT_DOWNLOADED; +	} +  	private boolean validCertificate(String cert_string) {  		boolean result = false;  		if(!ConfigHelper.checkErroneousDownload(cert_string)) { @@ -461,8 +528,8 @@ public class ProviderAPI extends IntentService {  		return result;  	} -	private boolean getAndSetProviderJson(String provider_main_url) { -		boolean result = false; +	private Bundle getAndSetProviderJson(String provider_main_url) { +		Bundle result = new Bundle();  		String provider_dot_json_string = downloadWithProviderCA(provider_main_url + "/provider.json", true); @@ -473,31 +540,67 @@ public class ProviderAPI extends IntentService {  			ConfigHelper.saveSharedPref(Provider.KEY, provider_json);  			ConfigHelper.saveSharedPref(EIP.ALLOWED_ANON, provider_json.getJSONObject(Provider.SERVICE).getBoolean(EIP.ALLOWED_ANON)); -			ProviderItem added_provider = new ProviderItem(name, provider_main_url); -			 -			result = true; + +			result.putBoolean(RESULT_KEY, true);  		} catch (JSONException e) { +			//TODO Error message should be contained in that provider_dot_json_string +			String reason_to_fail = pickErrorMessage(provider_dot_json_string); +			result.putString(ERRORS, reason_to_fail); +			result.putBoolean(RESULT_KEY, false);  		}  		return result;  	} + -	private boolean getAndSetEipServiceJson() { -		boolean result = false; +	public static boolean providerJsonDownloaded() { +		return PROVIDER_JSON_DOWNLOADED; +	} +	private Bundle getAndSetEipServiceJson() { +		Bundle result = new Bundle(); +		String eip_service_json_string = "";  		try {  			JSONObject provider_json = ConfigHelper.getJsonFromSharedPref(Provider.KEY);  			String eip_service_url = provider_json.getString(Provider.API_URL) +  "/" + provider_json.getString(Provider.API_VERSION) + "/" + EIP.SERVICE_API_PATH; -			String eip_service_json_string = downloadWithProviderCA(eip_service_url, true); +			eip_service_json_string = downloadWithProviderCA(eip_service_url, true);  			JSONObject eip_service_json = new JSONObject(eip_service_json_string);  			eip_service_json.getInt(Provider.API_RETURN_SERIAL);  			ConfigHelper.saveSharedPref(EIP.KEY, eip_service_json); -			result = true; + +			result.putBoolean(RESULT_KEY, true);  		} catch (JSONException e) { +			String reason_to_fail = pickErrorMessage(eip_service_json_string); +			result.putString(ERRORS, reason_to_fail); +			result.putBoolean(RESULT_KEY, false);  		}  		return result;  	} + +	public static boolean eipServiceDownloaded() { +		return EIP_SERVICE_JSON_DOWNLOADED; +	} +	 +	/** +	 * Interprets the error message as a JSON object and extract the "errors" keyword pair. +	 * If the error message is not a JSON object, then it is returned untouched. +	 * @param string_json_error_message +	 * @return final error message +	 */ +	private String pickErrorMessage(String string_json_error_message) { +		String error_message = ""; +		try { +			JSONObject json_error_message = new JSONObject(string_json_error_message); +			error_message = json_error_message.getString(ERRORS); +		} catch (JSONException e) { +			// TODO Auto-generated catch block +			error_message = string_json_error_message; +		} +		 +		return error_message; +	} +	  	/**  	 * Tries to download the contents of the provided url using commercially validated CA certificate from chosen provider.  	 *  @@ -516,6 +619,8 @@ public class ProviderAPI extends IntentService {  			provider_url = new URL(string_url);  			URLConnection url_connection = provider_url.openConnection();  			url_connection.setConnectTimeout(seconds_of_timeout*1000); +			if(!LeapSRPSession.getToken().isEmpty()) +				url_connection.addRequestProperty(LeapSRPSession.TOKEN, LeapSRPSession.getToken());  			json_file_content = new Scanner(url_connection.getInputStream()).useDelimiter("\\A").next();  		} catch (MalformedURLException e) {  			json_file_content = formatErrorMessage(R.string.malformed_url); @@ -551,6 +656,8 @@ public class ProviderAPI extends IntentService {  			HttpsURLConnection urlConnection =  					(HttpsURLConnection)url.openConnection();  			urlConnection.setSSLSocketFactory(getProviderSSLSocketFactory()); +			if(!LeapSRPSession.getToken().isEmpty()) +				urlConnection.addRequestProperty(LeapSRPSession.TOKEN, LeapSRPSession.getToken());  			json_file_content = new Scanner(urlConnection.getInputStream()).useDelimiter("\\A").next();  		} catch (CertificateException e) {  			// TODO Auto-generated catch block @@ -670,6 +777,7 @@ public class ProviderAPI extends IntentService {  			int responseCode = urlConnection.getResponseCode();  			broadcast_progress(progress++); +			LeapSRPSession.setToken("");  			Log.d("logout", Integer.toString(responseCode));  		} catch (ClientProtocolException e) {  			// TODO Auto-generated catch block @@ -710,11 +818,13 @@ public class ProviderAPI extends IntentService {  		try {  			String type_of_certificate = task.getString(ConfigurationWizard.TYPE_OF_CERTIFICATE);  			JSONObject provider_json = ConfigHelper.getJsonFromSharedPref(Provider.KEY); -			URL provider_main_url = new URL(provider_json.getString(Provider.API_URL)); -			String new_cert_string_url = provider_main_url.toString() + "/" + provider_json.getString(Provider.API_VERSION) + "/" + EIP.CERTIFICATE; +			String provider_main_url = provider_json.getString(Provider.API_URL); +			URL new_cert_string_url = new URL(provider_main_url + "/" + provider_json.getString(Provider.API_VERSION) + "/" + EIP.CERTIFICATE);  			boolean danger_on = ConfigHelper.getBoolFromSharedPref(ProviderItem.DANGER_ON); -			String cert_string = downloadWithProviderCA(new_cert_string_url, true); + +			String cert_string = downloadWithProviderCA(new_cert_string_url.toString(), danger_on); +  			if(!cert_string.isEmpty()) {  				if(ConfigHelper.checkErroneousDownload(cert_string)) {  					String reason_to_fail = provider_json.getString(ERRORS); diff --git a/src/se/leap/bitmaskclient/ProviderListAdapter.java b/src/se/leap/bitmaskclient/ProviderListAdapter.java index 4abf15a2..c5e8b64d 100644 --- a/src/se/leap/bitmaskclient/ProviderListAdapter.java +++ b/src/se/leap/bitmaskclient/ProviderListAdapter.java @@ -86,6 +86,14 @@ public class ProviderListAdapter<T> extends ArrayAdapter<T> {  		new_hidden[hidden.length] = false;  		hidden = new_hidden;  	} +	 +	@Override +	public void remove(T item) { +		super.remove(item); +		boolean[] new_hidden = new boolean[hidden.length-1]; +		System.arraycopy(hidden, 0, new_hidden, 0, hidden.length-1); +		hidden = new_hidden; +	}  	@Override  	public View getView(int index, View convertView, ViewGroup parent) { diff --git a/src/se/leap/bitmaskclient/ProviderListFragment.java b/src/se/leap/bitmaskclient/ProviderListFragment.java index 501da609..45047982 100644 --- a/src/se/leap/bitmaskclient/ProviderListFragment.java +++ b/src/se/leap/bitmaskclient/ProviderListFragment.java @@ -19,7 +19,6 @@  import se.leap.bitmaskclient.R;
  import se.leap.bitmaskclient.ProviderListContent.ProviderItem;
  import android.app.Activity;
 -import android.app.DialogFragment;
  import android.app.ListFragment;
  import android.os.Bundle;
  import android.view.LayoutInflater;
 @@ -156,6 +155,11 @@ public class ProviderListFragment extends ListFragment {          // Notify the active callbacks interface (the activity, if the
          // fragment is attached to one) that an item has been selected.
          mCallbacks.onItemSelected(ProviderListContent.ITEMS.get(position).name());
 +
 +        for(int item_position = 0; item_position < listView.getCount(); item_position++) {
 +        	if(item_position != position)
 +        		content_adapter.hide(item_position);
 +        }
      }
      @Override
 @@ -192,6 +196,12 @@ public class ProviderListFragment extends ListFragment {          mActivatedPosition = position;
      }
 +    public void removeLastItem() {
 +    	unhideAll();
 +    	content_adapter.remove(content_adapter.getItem(content_adapter.getCount()-1));
 +    	content_adapter.notifyDataSetChanged();
 +    }
 +    
      public void addItem(ProviderItem provider) {
      	content_adapter.add(provider);
      	content_adapter.notifyDataSetChanged();
 @@ -206,7 +216,7 @@ public class ProviderListFragment extends ListFragment {      			real_count--;
      		} else {
      			i++;
 -    		}
 +    		}      }
      public void unhideAll() {
 diff --git a/src/se/leap/openvpn/OpenVpnService.java b/src/se/leap/openvpn/OpenVpnService.java index 69dd56f4..b5c9c798 100644 --- a/src/se/leap/openvpn/OpenVpnService.java +++ b/src/se/leap/openvpn/OpenVpnService.java @@ -114,7 +114,7 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac  		android.app.Notification.Builder nbuilder = new Notification.Builder(this); -		nbuilder.setContentTitle(getString(R.string.notifcation_title,mProfile.mName)); +		nbuilder.setContentTitle(getString(R.string.notifcation_title,mProfile.mLocation));  		nbuilder.setContentText(msg);  		nbuilder.setOnlyAlertOnce(true);  		nbuilder.setOngoing(persistant); @@ -482,6 +482,8 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac  			if (("NOPROCESS".equals(state) ) || ("EXITING").equals(state)){  				showNotification(state, getString(R.string.eip_state_not_connected), ticker, false, 0, persist);  			} +			else if (state.equals("GET_CONFIG") || state.equals("ASSIGN_IP")){ //don't show them in the notification message +			}  			else{  				persist = true;  				showNotification(state, getString(resid) +" " + logmessage,ticker,false,0,persist);  | 
