From b0a0805ab81aaa4e204ecfc77d3a6a7f7ed66b2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= <parmegv@sdf.org> Date: Mon, 8 Jun 2015 19:56:43 +0200 Subject: [PATCH] s/buildtype/flavor, changed riseup's pin Riseup's EE certificate expired (EE = End-Entity, the commercial certificate signed by the issuer), and we weren't able to fetch provider.json because the pin wasn't valid. This problem needs to be avoided in the future, using HKPK (https://tools.ietf.org/html/rfc7469), which Micah's implementing on Riseup. Switching from build types from flavors enables us to run tests against production apk, not just debug. I didn't detect this pinning problem because tests were run only against the debug apk, which trusted preseeded providers by default (thus bypassing pinning issue). --- app/assets/urls/riseup.url | 2 +- app/build.gradle | 18 +- .../bitmaskclient/test/ConnectionManager.java | 2 +- .../bitmaskclient/test/testVpnFragment.java | 29 ++- .../{debug => insecure}/AndroidManifest.xml | 0 .../assets/urls/cdev.bitmask.net.url | 0 .../assets/urls/dev.bitmask.net.url | 4 +- .../bitmaskclient/ConfigurationWizard.java | 0 .../leap/bitmaskclient/NewProviderDialog.java | 0 .../se/leap/bitmaskclient/ProviderAPI.java | 0 .../bitmaskclient/ProviderDetailFragment.java | 222 +++++++++--------- .../bitmaskclient/ProviderListContent.java | 164 ++++++------- .../res/layout-xlarge/new_provider_dialog.xml | 0 .../res/layout/new_provider_dialog.xml | 0 .../res/values/strings.xml | 0 .../bitmaskclient/ConfigurationWizard.java | 0 .../leap/bitmaskclient/NewProviderDialog.java | 0 .../se/leap/bitmaskclient/ProviderAPI.java | 0 .../bitmaskclient/ProviderDetailFragment.java | 222 +++++++++--------- .../bitmaskclient/ProviderListContent.java | 162 ++++++------- .../res/layout-xlarge/new_provider_dialog.xml | 0 .../res/layout/new_provider_dialog.xml | 0 22 files changed, 424 insertions(+), 401 deletions(-) rename app/src/{debug => insecure}/AndroidManifest.xml (100%) rename app/src/{debug => insecure}/assets/urls/cdev.bitmask.net.url (100%) rename app/src/{debug => insecure}/assets/urls/dev.bitmask.net.url (95%) rename app/src/{debug => insecure}/java/se/leap/bitmaskclient/ConfigurationWizard.java (100%) rename app/src/{debug => insecure}/java/se/leap/bitmaskclient/NewProviderDialog.java (100%) rename app/src/{debug => insecure}/java/se/leap/bitmaskclient/ProviderAPI.java (100%) rename app/src/{debug => insecure}/java/se/leap/bitmaskclient/ProviderDetailFragment.java (97%) rename app/src/{debug => insecure}/java/se/leap/bitmaskclient/ProviderListContent.java (96%) rename app/src/{debug => insecure}/res/layout-xlarge/new_provider_dialog.xml (100%) rename app/src/{debug => insecure}/res/layout/new_provider_dialog.xml (100%) rename app/src/{debug => insecure}/res/values/strings.xml (100%) rename app/src/{release => production}/java/se/leap/bitmaskclient/ConfigurationWizard.java (100%) rename app/src/{release => production}/java/se/leap/bitmaskclient/NewProviderDialog.java (100%) rename app/src/{release => production}/java/se/leap/bitmaskclient/ProviderAPI.java (100%) rename app/src/{release => production}/java/se/leap/bitmaskclient/ProviderDetailFragment.java (97%) rename app/src/{release => production}/java/se/leap/bitmaskclient/ProviderListContent.java (96%) rename app/src/{release => production}/res/layout-xlarge/new_provider_dialog.xml (100%) rename app/src/{release => production}/res/layout/new_provider_dialog.xml (100%) diff --git a/app/assets/urls/riseup.url b/app/assets/urls/riseup.url index e250e93f..4c565076 100644 --- a/app/assets/urls/riseup.url +++ b/app/assets/urls/riseup.url @@ -1,4 +1,4 @@ { "main_url" : "https://riseup.net/", - "ca_cert_fingerprint" : "c429750763322fcc20b6402d7b508ba9e754b176" + "ca_cert_fingerprint" : "aef7a642d7f8e046770521b354961a95cd4a76a8" } diff --git a/app/build.gradle b/app/build.gradle index 0f73442c..994f8b7b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,4 @@ -apply plugin: 'android' -import org.ajoberstar.grgit.Grgit +apply plugin: 'com.android.application' android { compileSdkVersion 21 @@ -14,6 +13,15 @@ android { } } + productFlavors { + production { + + } + insecure { + + } + } + buildTypes { release { //runProguard true @@ -22,9 +30,9 @@ android { } } - lintOptions { - abortOnError false - } + lintOptions { + abortOnError false + } sourceSets { main { diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/test/ConnectionManager.java b/app/src/androidTest/java/se/leap/bitmaskclient/test/ConnectionManager.java index a664c885..f7ab4b1e 100644 --- a/app/src/androidTest/java/se/leap/bitmaskclient/test/ConnectionManager.java +++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/ConnectionManager.java @@ -16,7 +16,7 @@ public class ConnectionManager { try { method.invoke(conman, enabled); } catch (InvocationTargetException | IllegalAccessException e) { - e.printStackTrace(); + //e.printStackTrace(); } } } diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/test/testVpnFragment.java b/app/src/androidTest/java/se/leap/bitmaskclient/test/testVpnFragment.java index 106d5cf2..d23be601 100644 --- a/app/src/androidTest/java/se/leap/bitmaskclient/test/testVpnFragment.java +++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/testVpnFragment.java @@ -54,13 +54,28 @@ public class testVpnFragment extends BaseTestDashboard { } public void testVpnEveryProvider() { - String[] providers = {"demo.bitmask.net", "riseup.net", "calyx.net"}; - for(String provider : providers) { - changeProviderAndLogIn(provider); - vpn_controller.sleepSeconds(1); - vpn_controller.turnVpnOndAndOff(provider); - vpn_controller.sleepSeconds(1); - } + testDemoBitmaskNet(); + testRiseupNet(); + testCalyxNet(); + } + + private void testDemoBitmaskNet() { + testProvider("demo.bitmask.net"); + } + + private void testRiseupNet() { + testProvider("riseup.net"); + } + + private void testCalyxNet() { + testProvider("calyx.net"); + } + + private void testProvider(String provider) { + changeProviderAndLogIn(provider); + vpn_controller.sleepSeconds(1); + vpn_controller.turnVpnOndAndOff(provider); + vpn_controller.sleepSeconds(1); } public void testVpnIconIsDisplayed() { diff --git a/app/src/debug/AndroidManifest.xml b/app/src/insecure/AndroidManifest.xml similarity index 100% rename from app/src/debug/AndroidManifest.xml rename to app/src/insecure/AndroidManifest.xml diff --git a/app/src/debug/assets/urls/cdev.bitmask.net.url b/app/src/insecure/assets/urls/cdev.bitmask.net.url similarity index 100% rename from app/src/debug/assets/urls/cdev.bitmask.net.url rename to app/src/insecure/assets/urls/cdev.bitmask.net.url diff --git a/app/src/debug/assets/urls/dev.bitmask.net.url b/app/src/insecure/assets/urls/dev.bitmask.net.url similarity index 95% rename from app/src/debug/assets/urls/dev.bitmask.net.url rename to app/src/insecure/assets/urls/dev.bitmask.net.url index a1e53f69..5d4ae485 100644 --- a/app/src/debug/assets/urls/dev.bitmask.net.url +++ b/app/src/insecure/assets/urls/dev.bitmask.net.url @@ -1,3 +1,3 @@ -{ - "main_url" : "https://dev.bitmask.net/" +{ + "main_url" : "https://dev.bitmask.net/" } \ No newline at end of file diff --git a/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java b/app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java similarity index 100% rename from app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java rename to app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java diff --git a/app/src/debug/java/se/leap/bitmaskclient/NewProviderDialog.java b/app/src/insecure/java/se/leap/bitmaskclient/NewProviderDialog.java similarity index 100% rename from app/src/debug/java/se/leap/bitmaskclient/NewProviderDialog.java rename to app/src/insecure/java/se/leap/bitmaskclient/NewProviderDialog.java diff --git a/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java b/app/src/insecure/java/se/leap/bitmaskclient/ProviderAPI.java similarity index 100% rename from app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java rename to app/src/insecure/java/se/leap/bitmaskclient/ProviderAPI.java diff --git a/app/src/debug/java/se/leap/bitmaskclient/ProviderDetailFragment.java b/app/src/insecure/java/se/leap/bitmaskclient/ProviderDetailFragment.java similarity index 97% rename from app/src/debug/java/se/leap/bitmaskclient/ProviderDetailFragment.java rename to app/src/insecure/java/se/leap/bitmaskclient/ProviderDetailFragment.java index bd21f91e..6d9a16cd 100644 --- a/app/src/debug/java/se/leap/bitmaskclient/ProviderDetailFragment.java +++ b/app/src/insecure/java/se/leap/bitmaskclient/ProviderDetailFragment.java @@ -1,111 +1,111 @@ -package se.leap.bitmaskclient; - -import org.json.*; - -import se.leap.bitmaskclient.eip.*; -import se.leap.bitmaskclient.ProviderListContent.ProviderItem; - -import android.app.*; -import android.content.*; -import android.os.*; -import android.view.*; -import android.widget.*; - -public class ProviderDetailFragment extends DialogFragment { - - final public static String TAG = "providerDetailFragment"; - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - try { - - LayoutInflater inflater = getActivity().getLayoutInflater(); - View provider_detail_view = inflater.inflate(R.layout.provider_detail_fragment, null); - - JSONObject provider_json = new JSONObject(getActivity().getSharedPreferences(Dashboard.SHARED_PREFERENCES, getActivity().MODE_PRIVATE).getString(Provider.KEY, "")); - - final TextView domain = (TextView) provider_detail_view.findViewById(R.id.provider_detail_domain); - domain.setText(provider_json.getString(Provider.DOMAIN)); - final TextView name = (TextView) provider_detail_view.findViewById(R.id.provider_detail_name); - name.setText(provider_json.getJSONObject(Provider.NAME).getString("en")); - final TextView description = (TextView) provider_detail_view.findViewById(R.id.provider_detail_description); - description.setText(provider_json.getJSONObject(Provider.DESCRIPTION).getString("en")); - - builder.setView(provider_detail_view); - builder.setTitle(R.string.provider_details_fragment_title); - - if (anon_allowed(provider_json)) { - builder.setPositiveButton(R.string.use_anonymously_button, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - interface_with_configuration_wizard.use_anonymously(); - } - }); - } - - if (registration_allowed(provider_json)) { - builder.setNegativeButton(R.string.signup_or_login_button, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - interface_with_configuration_wizard.login(); - } - }); - } - - return builder.create(); - } catch (JSONException e) { - return null; - } - } - - private boolean anon_allowed(JSONObject provider_json) { - try { - JSONObject service_description = provider_json.getJSONObject(Provider.SERVICE); - return service_description.has(Constants.ALLOWED_ANON) && service_description.getBoolean(Constants.ALLOWED_ANON); - } catch (JSONException e) { - return false; - } - } - - private boolean registration_allowed(JSONObject provider_json) { - try { - JSONObject service_description = provider_json.getJSONObject(Provider.SERVICE); - return service_description.has(Provider.ALLOW_REGISTRATION) && service_description.getBoolean(Provider.ALLOW_REGISTRATION); - } catch (JSONException e) { - return false; - } - } - - @Override - public void onCancel(DialogInterface dialog) { - super.onCancel(dialog); - SharedPreferences.Editor editor = getActivity().getSharedPreferences(Dashboard.SHARED_PREFERENCES, Activity.MODE_PRIVATE).edit(); - editor.remove(Provider.KEY).remove(ProviderItem.DANGER_ON).remove(Constants.ALLOWED_ANON).remove(Constants.KEY).commit(); - interface_with_configuration_wizard.showAllProviders(); - } - - public static DialogFragment newInstance() { - ProviderDetailFragment provider_detail_fragment = new ProviderDetailFragment(); - return provider_detail_fragment; - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - interface_with_configuration_wizard = (ProviderDetailFragmentInterface) activity; - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() - + " must implement LogInDialogListener"); - } - } - - public interface ProviderDetailFragmentInterface { - public void login(); - - public void use_anonymously(); - - public void showAllProviders(); - } - - ProviderDetailFragmentInterface interface_with_configuration_wizard; -} +package se.leap.bitmaskclient; + +import org.json.*; + +import se.leap.bitmaskclient.eip.*; +import se.leap.bitmaskclient.ProviderListContent.ProviderItem; + +import android.app.*; +import android.content.*; +import android.os.*; +import android.view.*; +import android.widget.*; + +public class ProviderDetailFragment extends DialogFragment { + + final public static String TAG = "providerDetailFragment"; + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + try { + + LayoutInflater inflater = getActivity().getLayoutInflater(); + View provider_detail_view = inflater.inflate(R.layout.provider_detail_fragment, null); + + JSONObject provider_json = new JSONObject(getActivity().getSharedPreferences(Dashboard.SHARED_PREFERENCES, getActivity().MODE_PRIVATE).getString(Provider.KEY, "")); + + final TextView domain = (TextView) provider_detail_view.findViewById(R.id.provider_detail_domain); + domain.setText(provider_json.getString(Provider.DOMAIN)); + final TextView name = (TextView) provider_detail_view.findViewById(R.id.provider_detail_name); + name.setText(provider_json.getJSONObject(Provider.NAME).getString("en")); + final TextView description = (TextView) provider_detail_view.findViewById(R.id.provider_detail_description); + description.setText(provider_json.getJSONObject(Provider.DESCRIPTION).getString("en")); + + builder.setView(provider_detail_view); + builder.setTitle(R.string.provider_details_fragment_title); + + if (anon_allowed(provider_json)) { + builder.setPositiveButton(R.string.use_anonymously_button, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + interface_with_configuration_wizard.use_anonymously(); + } + }); + } + + if (registration_allowed(provider_json)) { + builder.setNegativeButton(R.string.signup_or_login_button, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + interface_with_configuration_wizard.login(); + } + }); + } + + return builder.create(); + } catch (JSONException e) { + return null; + } + } + + private boolean anon_allowed(JSONObject provider_json) { + try { + JSONObject service_description = provider_json.getJSONObject(Provider.SERVICE); + return service_description.has(Constants.ALLOWED_ANON) && service_description.getBoolean(Constants.ALLOWED_ANON); + } catch (JSONException e) { + return false; + } + } + + private boolean registration_allowed(JSONObject provider_json) { + try { + JSONObject service_description = provider_json.getJSONObject(Provider.SERVICE); + return service_description.has(Provider.ALLOW_REGISTRATION) && service_description.getBoolean(Provider.ALLOW_REGISTRATION); + } catch (JSONException e) { + return false; + } + } + + @Override + public void onCancel(DialogInterface dialog) { + super.onCancel(dialog); + SharedPreferences.Editor editor = getActivity().getSharedPreferences(Dashboard.SHARED_PREFERENCES, Activity.MODE_PRIVATE).edit(); + editor.remove(Provider.KEY).remove(ProviderItem.DANGER_ON).remove(Constants.ALLOWED_ANON).remove(Constants.KEY).commit(); + interface_with_configuration_wizard.showAllProviders(); + } + + public static DialogFragment newInstance() { + ProviderDetailFragment provider_detail_fragment = new ProviderDetailFragment(); + return provider_detail_fragment; + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + interface_with_configuration_wizard = (ProviderDetailFragmentInterface) activity; + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + + " must implement LogInDialogListener"); + } + } + + public interface ProviderDetailFragmentInterface { + public void login(); + + public void use_anonymously(); + + public void showAllProviders(); + } + + ProviderDetailFragmentInterface interface_with_configuration_wizard; +} diff --git a/app/src/debug/java/se/leap/bitmaskclient/ProviderListContent.java b/app/src/insecure/java/se/leap/bitmaskclient/ProviderListContent.java similarity index 96% rename from app/src/debug/java/se/leap/bitmaskclient/ProviderListContent.java rename to app/src/insecure/java/se/leap/bitmaskclient/ProviderListContent.java index 0a05e839..c8dfc092 100644 --- a/app/src/debug/java/se/leap/bitmaskclient/ProviderListContent.java +++ b/app/src/insecure/java/se/leap/bitmaskclient/ProviderListContent.java @@ -1,82 +1,82 @@ -/** - * 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 - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * 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; - -import java.util.*; -import java.net.*; - -/** - * Models the provider list shown in the ConfigurationWizard. - * - * @author parmegv - */ -public class ProviderListContent { - - public static List<ProviderItem> ITEMS = new ArrayList<ProviderItem>(); - - public static Map<String, ProviderItem> ITEM_MAP = new HashMap<String, ProviderItem>(); - - /** - * Adds a new provider item to the end of the items map, and to the items list. - * - * @param item - */ - public static void addItem(ProviderItem item) { - ITEMS.add(item); - ITEM_MAP.put(String.valueOf(ITEMS.size()), item); - } - - public static void removeItem(ProviderItem item) { - ITEMS.remove(item); - ITEM_MAP.remove(item); - } - - /** - * A provider item. - */ - public static class ProviderItem { - final public static String CUSTOM = "custom"; - final public static String DANGER_ON = "danger_on"; - private String provider_main_url; - private String name; - - /** - * @param name of the provider - * @param provider_main_url used to download provider.json file of the provider - */ - public ProviderItem(String name, String provider_main_url) { - this.name = name; - this.provider_main_url = provider_main_url; - } - - public String name() { - return name; - } - - public String providerMainUrl() { - return provider_main_url; - } - - public String domain() { - try { - return new URL(provider_main_url).getHost(); - } catch (MalformedURLException e) { - return provider_main_url.replaceFirst("http[s]?://", "").replaceFirst("/.*", ""); - } - } - } -} +/** + * 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 + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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; + +import java.util.*; +import java.net.*; + +/** + * Models the provider list shown in the ConfigurationWizard. + * + * @author parmegv + */ +public class ProviderListContent { + + public static List<ProviderItem> ITEMS = new ArrayList<ProviderItem>(); + + public static Map<String, ProviderItem> ITEM_MAP = new HashMap<String, ProviderItem>(); + + /** + * Adds a new provider item to the end of the items map, and to the items list. + * + * @param item + */ + public static void addItem(ProviderItem item) { + ITEMS.add(item); + ITEM_MAP.put(String.valueOf(ITEMS.size()), item); + } + + public static void removeItem(ProviderItem item) { + ITEMS.remove(item); + ITEM_MAP.remove(item); + } + + /** + * A provider item. + */ + public static class ProviderItem { + final public static String CUSTOM = "custom"; + final public static String DANGER_ON = "danger_on"; + private String provider_main_url; + private String name; + + /** + * @param name of the provider + * @param provider_main_url used to download provider.json file of the provider + */ + public ProviderItem(String name, String provider_main_url) { + this.name = name; + this.provider_main_url = provider_main_url; + } + + public String name() { + return name; + } + + public String providerMainUrl() { + return provider_main_url; + } + + public String domain() { + try { + return new URL(provider_main_url).getHost(); + } catch (MalformedURLException e) { + return provider_main_url.replaceFirst("http[s]?://", "").replaceFirst("/.*", ""); + } + } + } +} diff --git a/app/src/debug/res/layout-xlarge/new_provider_dialog.xml b/app/src/insecure/res/layout-xlarge/new_provider_dialog.xml similarity index 100% rename from app/src/debug/res/layout-xlarge/new_provider_dialog.xml rename to app/src/insecure/res/layout-xlarge/new_provider_dialog.xml diff --git a/app/src/debug/res/layout/new_provider_dialog.xml b/app/src/insecure/res/layout/new_provider_dialog.xml similarity index 100% rename from app/src/debug/res/layout/new_provider_dialog.xml rename to app/src/insecure/res/layout/new_provider_dialog.xml diff --git a/app/src/debug/res/values/strings.xml b/app/src/insecure/res/values/strings.xml similarity index 100% rename from app/src/debug/res/values/strings.xml rename to app/src/insecure/res/values/strings.xml diff --git a/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java b/app/src/production/java/se/leap/bitmaskclient/ConfigurationWizard.java similarity index 100% rename from app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java rename to app/src/production/java/se/leap/bitmaskclient/ConfigurationWizard.java diff --git a/app/src/release/java/se/leap/bitmaskclient/NewProviderDialog.java b/app/src/production/java/se/leap/bitmaskclient/NewProviderDialog.java similarity index 100% rename from app/src/release/java/se/leap/bitmaskclient/NewProviderDialog.java rename to app/src/production/java/se/leap/bitmaskclient/NewProviderDialog.java diff --git a/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java b/app/src/production/java/se/leap/bitmaskclient/ProviderAPI.java similarity index 100% rename from app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java rename to app/src/production/java/se/leap/bitmaskclient/ProviderAPI.java diff --git a/app/src/release/java/se/leap/bitmaskclient/ProviderDetailFragment.java b/app/src/production/java/se/leap/bitmaskclient/ProviderDetailFragment.java similarity index 97% rename from app/src/release/java/se/leap/bitmaskclient/ProviderDetailFragment.java rename to app/src/production/java/se/leap/bitmaskclient/ProviderDetailFragment.java index 24d048a6..08fc5f3d 100644 --- a/app/src/release/java/se/leap/bitmaskclient/ProviderDetailFragment.java +++ b/app/src/production/java/se/leap/bitmaskclient/ProviderDetailFragment.java @@ -1,111 +1,111 @@ -package se.leap.bitmaskclient; - -import org.json.*; - -import se.leap.bitmaskclient.eip.*; -import se.leap.bitmaskclient.ProviderListContent.ProviderItem; - -import android.app.*; -import android.content.*; -import android.os.*; -import android.view.*; -import android.widget.*; - -public class ProviderDetailFragment extends DialogFragment { - - final public static String TAG = "providerDetailFragment"; - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - try { - - LayoutInflater inflater = getActivity().getLayoutInflater(); - View provider_detail_view = inflater.inflate(R.layout.provider_detail_fragment, null); - - JSONObject provider_json = new JSONObject(getActivity().getSharedPreferences(Dashboard.SHARED_PREFERENCES, getActivity().MODE_PRIVATE).getString(Provider.KEY, "")); - - final TextView domain = (TextView) provider_detail_view.findViewById(R.id.provider_detail_domain); - domain.setText(provider_json.getString(Provider.DOMAIN)); - final TextView name = (TextView) provider_detail_view.findViewById(R.id.provider_detail_name); - name.setText(provider_json.getJSONObject(Provider.NAME).getString("en")); - final TextView description = (TextView) provider_detail_view.findViewById(R.id.provider_detail_description); - description.setText(provider_json.getJSONObject(Provider.DESCRIPTION).getString("en")); - - builder.setView(provider_detail_view); - builder.setTitle(R.string.provider_details_fragment_title); - - if (anon_allowed(provider_json)) { - builder.setPositiveButton(R.string.use_anonymously_button, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - interface_with_configuration_wizard.use_anonymously(); - } - }); - } - - if (registration_allowed(provider_json)) { - builder.setNegativeButton(R.string.signup_or_login_button, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - interface_with_configuration_wizard.login(); - } - }); - } - - return builder.create(); - } catch (JSONException e) { - return null; - } - } - - private boolean anon_allowed(JSONObject provider_json) { - try { - JSONObject service_description = provider_json.getJSONObject(Provider.SERVICE); - return service_description.has(Constants.ALLOWED_ANON) && service_description.getBoolean(Constants.ALLOWED_ANON); - } catch (JSONException e) { - return false; - } - } - - private boolean registration_allowed(JSONObject provider_json) { - try { - JSONObject service_description = provider_json.getJSONObject(Provider.SERVICE); - return service_description.has(Provider.ALLOW_REGISTRATION) && service_description.getBoolean(Provider.ALLOW_REGISTRATION); - } catch (JSONException e) { - return false; - } - } - - @Override - public void onCancel(DialogInterface dialog) { - super.onCancel(dialog); - SharedPreferences.Editor editor = getActivity().getSharedPreferences(Dashboard.SHARED_PREFERENCES, Activity.MODE_PRIVATE).edit(); - editor.remove(Provider.KEY).remove(Constants.ALLOWED_ANON).remove(Constants.KEY).commit(); - interface_with_configuration_wizard.showAllProviders(); - } - - public static DialogFragment newInstance() { - ProviderDetailFragment provider_detail_fragment = new ProviderDetailFragment(); - return provider_detail_fragment; - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - interface_with_configuration_wizard = (ProviderDetailFragmentInterface) activity; - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() - + " must implement LogInDialogListener"); - } - } - - public interface ProviderDetailFragmentInterface { - public void login(); - - public void use_anonymously(); - - public void showAllProviders(); - } - - ProviderDetailFragmentInterface interface_with_configuration_wizard; -} +package se.leap.bitmaskclient; + +import org.json.*; + +import se.leap.bitmaskclient.eip.*; +import se.leap.bitmaskclient.ProviderListContent.ProviderItem; + +import android.app.*; +import android.content.*; +import android.os.*; +import android.view.*; +import android.widget.*; + +public class ProviderDetailFragment extends DialogFragment { + + final public static String TAG = "providerDetailFragment"; + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + try { + + LayoutInflater inflater = getActivity().getLayoutInflater(); + View provider_detail_view = inflater.inflate(R.layout.provider_detail_fragment, null); + + JSONObject provider_json = new JSONObject(getActivity().getSharedPreferences(Dashboard.SHARED_PREFERENCES, getActivity().MODE_PRIVATE).getString(Provider.KEY, "")); + + final TextView domain = (TextView) provider_detail_view.findViewById(R.id.provider_detail_domain); + domain.setText(provider_json.getString(Provider.DOMAIN)); + final TextView name = (TextView) provider_detail_view.findViewById(R.id.provider_detail_name); + name.setText(provider_json.getJSONObject(Provider.NAME).getString("en")); + final TextView description = (TextView) provider_detail_view.findViewById(R.id.provider_detail_description); + description.setText(provider_json.getJSONObject(Provider.DESCRIPTION).getString("en")); + + builder.setView(provider_detail_view); + builder.setTitle(R.string.provider_details_fragment_title); + + if (anon_allowed(provider_json)) { + builder.setPositiveButton(R.string.use_anonymously_button, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + interface_with_configuration_wizard.use_anonymously(); + } + }); + } + + if (registration_allowed(provider_json)) { + builder.setNegativeButton(R.string.signup_or_login_button, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + interface_with_configuration_wizard.login(); + } + }); + } + + return builder.create(); + } catch (JSONException e) { + return null; + } + } + + private boolean anon_allowed(JSONObject provider_json) { + try { + JSONObject service_description = provider_json.getJSONObject(Provider.SERVICE); + return service_description.has(Constants.ALLOWED_ANON) && service_description.getBoolean(Constants.ALLOWED_ANON); + } catch (JSONException e) { + return false; + } + } + + private boolean registration_allowed(JSONObject provider_json) { + try { + JSONObject service_description = provider_json.getJSONObject(Provider.SERVICE); + return service_description.has(Provider.ALLOW_REGISTRATION) && service_description.getBoolean(Provider.ALLOW_REGISTRATION); + } catch (JSONException e) { + return false; + } + } + + @Override + public void onCancel(DialogInterface dialog) { + super.onCancel(dialog); + SharedPreferences.Editor editor = getActivity().getSharedPreferences(Dashboard.SHARED_PREFERENCES, Activity.MODE_PRIVATE).edit(); + editor.remove(Provider.KEY).remove(Constants.ALLOWED_ANON).remove(Constants.KEY).commit(); + interface_with_configuration_wizard.showAllProviders(); + } + + public static DialogFragment newInstance() { + ProviderDetailFragment provider_detail_fragment = new ProviderDetailFragment(); + return provider_detail_fragment; + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + interface_with_configuration_wizard = (ProviderDetailFragmentInterface) activity; + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + + " must implement LogInDialogListener"); + } + } + + public interface ProviderDetailFragmentInterface { + public void login(); + + public void use_anonymously(); + + public void showAllProviders(); + } + + ProviderDetailFragmentInterface interface_with_configuration_wizard; +} diff --git a/app/src/release/java/se/leap/bitmaskclient/ProviderListContent.java b/app/src/production/java/se/leap/bitmaskclient/ProviderListContent.java similarity index 96% rename from app/src/release/java/se/leap/bitmaskclient/ProviderListContent.java rename to app/src/production/java/se/leap/bitmaskclient/ProviderListContent.java index 235ae5ab..6466e769 100644 --- a/app/src/release/java/se/leap/bitmaskclient/ProviderListContent.java +++ b/app/src/production/java/se/leap/bitmaskclient/ProviderListContent.java @@ -1,81 +1,81 @@ -/** - * 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 - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * 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; - -import java.util.*; -import java.net.*; - -/** - * Models the provider list shown in the ConfigurationWizard. - * - * @author parmegv - */ -public class ProviderListContent { - - public static List<ProviderItem> ITEMS = new ArrayList<ProviderItem>(); - - public static Map<String, ProviderItem> ITEM_MAP = new HashMap<String, ProviderItem>(); - - /** - * Adds a new provider item to the end of the items map, and to the items list. - * - * @param item - */ - public static void addItem(ProviderItem item) { - ITEMS.add(item); - ITEM_MAP.put(String.valueOf(ITEMS.size()), item); - } - - public static void removeItem(ProviderItem item) { - ITEMS.remove(item); - ITEM_MAP.remove(item); - } - - /** - * A provider item. - */ - public static class ProviderItem { - final public static String CUSTOM = "custom"; - private String provider_main_url; - private String name; - - /** - * @param name of the provider - * @param provider_main_url used to download provider.json file of the provider - */ - public ProviderItem(String name, String provider_main_url) { - this.name = name; - this.provider_main_url = provider_main_url; - } - - public String name() { - return name; - } - - public String providerMainUrl() { - return provider_main_url; - } - - public String domain() { - try { - return new URL(provider_main_url).getHost(); - } catch (MalformedURLException e) { - return provider_main_url.replaceFirst("http[s]?://", "").replaceFirst("/.*", ""); - } - } - } -} +/** + * 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 + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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; + +import java.util.*; +import java.net.*; + +/** + * Models the provider list shown in the ConfigurationWizard. + * + * @author parmegv + */ +public class ProviderListContent { + + public static List<ProviderItem> ITEMS = new ArrayList<ProviderItem>(); + + public static Map<String, ProviderItem> ITEM_MAP = new HashMap<String, ProviderItem>(); + + /** + * Adds a new provider item to the end of the items map, and to the items list. + * + * @param item + */ + public static void addItem(ProviderItem item) { + ITEMS.add(item); + ITEM_MAP.put(String.valueOf(ITEMS.size()), item); + } + + public static void removeItem(ProviderItem item) { + ITEMS.remove(item); + ITEM_MAP.remove(item); + } + + /** + * A provider item. + */ + public static class ProviderItem { + final public static String CUSTOM = "custom"; + private String provider_main_url; + private String name; + + /** + * @param name of the provider + * @param provider_main_url used to download provider.json file of the provider + */ + public ProviderItem(String name, String provider_main_url) { + this.name = name; + this.provider_main_url = provider_main_url; + } + + public String name() { + return name; + } + + public String providerMainUrl() { + return provider_main_url; + } + + public String domain() { + try { + return new URL(provider_main_url).getHost(); + } catch (MalformedURLException e) { + return provider_main_url.replaceFirst("http[s]?://", "").replaceFirst("/.*", ""); + } + } + } +} diff --git a/app/src/release/res/layout-xlarge/new_provider_dialog.xml b/app/src/production/res/layout-xlarge/new_provider_dialog.xml similarity index 100% rename from app/src/release/res/layout-xlarge/new_provider_dialog.xml rename to app/src/production/res/layout-xlarge/new_provider_dialog.xml diff --git a/app/src/release/res/layout/new_provider_dialog.xml b/app/src/production/res/layout/new_provider_dialog.xml similarity index 100% rename from app/src/release/res/layout/new_provider_dialog.xml rename to app/src/production/res/layout/new_provider_dialog.xml -- GitLab