From 0c6462f5a0451d632a600bd06f2f9d297d4a03a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Tue, 7 Apr 2015 12:01:25 +0200 Subject: Traducidos strings normales. --- app/src/main/res/values-es/strings.xml | 82 ++++++++++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 8 deletions(-) (limited to 'app/src') diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ec8c21ff..249a9720 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,11 +1,77 @@ - información - Mostrar detalles de la conexión - Rutas: %s - Rutas IPv6: %s - El nombre de usuario no debe estar vacío. - Conseguido el certificado de \'%s\' de almacén de claves - Código fuente disponible en https://github.com/leapcode/bitmask_android/ - Tracker disponible en https://leap.se/code + + + Reintentar + Traducciones son bienvenidas. Puedes ir a nuestra página de Transifex: https://www.transifex.com/projects/p/bitmask-android/ + Cambiar de proveedor + información + Mostrar detalles de la conexión + Rutas: %s + Rutas IPv6: %s + El usuario no puede estar vacío. + Certificado de \'%s\' obtenido de almacén de claves + Código fuente disponible en https://github.com/leapcode/bitmask_android/ + Tracker disponible en https://leap.se/code + Bitmask + Proveedor: + Ningún proveedor configurado + Estado no definido. + Acceso a Internet Encriptado + Elige un proveedor + Nuevo proveedor + Añadir un nuevo proveedor + Guardar + Dominio + El dominio está bien formado + Dominio no válido + Detalles del proveedor + Utilizar sin registrarse + usuario + Por favor, introduce tu usuario + contraseña + Mensaje al usuario + Acerca de Bitmask" + Inténtalo de nuevo: error en el servidor. + Usuario o contraseña incorrectos. + Al menos 8 caracteres. + Inténtalo de nuevo: error en el cliente HTTP + Inténtalo de nuevo: error de E/S + Inténtalo de nuevo: respuesta mal formada del servidor + Actualiza Bitmask + Registrarse/Iniciar sesión + Iniciar sesión + Cerrar sesión + Registrarse + Error de configuración + Configurar + Salir + Sucedió un error configurando Bitmask con tu proveedor elegido.\n\nPuedes volver a intentarlo, o elegir otro proveedor. + No se ha detectado red para hablar con el servidor, inténtalo de nuevo. + No parece que sea un proveedor de Bitmask. + No es un proveedor de Bitmak de confianza. + El servicio está caído. + Configurando el proveedor + Tu certificado VPN no pudo ser descargado. Intenta iniciar sesión si es posible. + Descargando certificado VPN + Actualizando certificado VPN + Iniciando sesión + Registrando un nuevo usuario + Cerrando sesión. + Sesión terminada. + No pudo cerrarse la sesión. Inténtalo más tarde, quizás sea un problema de la red o del proveedor. Si el problema persiste, borra los datos locales de Bitmask desde la configuración de Android. + "Usuarios de Riseup: es necesario crear una cuenta aparte para utilizar el servicio de VPN." + Sesión iniciada. + Inicio de sesión fallido. + Falló el registro de un nuevo usuario. + Iniciando la conexión + ¿Abortar conexión? + Hay una conexión iniciándose. ¿Quieres cancelarla? + Para salvaguardar la privacidad de tu información personal, te recomendamos que después de apagar la VPN cierres la sesión del navegador y abras una sesión privada en él. Gracias. + + No + "¡Conexión no protegida!" + Conexión protegida. + Parece que hay un problema con el proveedor. + Prueba con otro proveedor, o contacta con este. -- cgit v1.2.3 From fe85613a73d48ebeadc7d35e8d346d68bd0b4fc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Tue, 7 Apr 2015 12:55:09 +0200 Subject: Move switch down --- app/src/main/res/layout/eip_service_fragment.xml | 18 +++++++++--------- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) (limited to 'app/src') diff --git a/app/src/main/res/layout/eip_service_fragment.xml b/app/src/main/res/layout/eip_service_fragment.xml index 64d22147..6adcfab0 100644 --- a/app/src/main/res/layout/eip_service_fragment.xml +++ b/app/src/main/res/layout/eip_service_fragment.xml @@ -13,15 +13,7 @@ android:layout_marginLeft="10dp" android:clickable="true" android:text="@string/eip_service_label" - android:textAppearance="?android:attr/textAppearanceLarge" /> - - + android:textAppearance="?android:attr/textAppearanceMedium" /> + + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 249a9720..b9c01afa 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -17,7 +17,7 @@ Proveedor: Ningún proveedor configurado Estado no definido. - Acceso a Internet Encriptado + Acceso a Internet Encriptado con VPN Elige un proveedor Nuevo proveedor Añadir un nuevo proveedor diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d1e33928..47ff2832 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,7 +16,7 @@ Provider: No provider configured Status unknown. - Encrypted Internet + VPN Encrypted Internet Access Select a service provider Add new Provider Add a new service provider -- cgit v1.2.3 From c8d84fb5fdf1bc834c3ef26eacb4eb1df9ed3668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Tue, 7 Apr 2015 17:45:20 +0200 Subject: Trying to conjugate the Spanish verbs programmatically. --- .../java/se/leap/bitmaskclient/ProviderAPI.java | 17 ++++++++------ .../main/java/se/leap/bitmaskclient/Dashboard.java | 5 ++-- .../java/se/leap/bitmaskclient/LeapSRPSession.java | 1 - app/src/main/java/se/leap/bitmaskclient/User.java | 12 ++++++---- .../se/leap/bitmaskclient/UserSessionStatus.java | 27 +++++++++++++--------- app/src/main/res/values-es/arrays.xml | 18 +++++++++++++++ app/src/main/res/values/arrays.xml | 17 ++++++++++++++ .../java/se/leap/bitmaskclient/ProviderAPI.java | 16 +++++++------ 8 files changed, 81 insertions(+), 32 deletions(-) (limited to 'app/src') diff --git a/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java b/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java index 0b24e1c9..b0df5ab8 100644 --- a/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java +++ b/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java @@ -18,6 +18,7 @@ package se.leap.bitmaskclient; import android.app.*; import android.content.*; +import android.content.res.*; import android.os.*; import android.util.*; @@ -87,6 +88,7 @@ public class ProviderAPI extends IntentService { private static boolean go_ahead = true; private static SharedPreferences preferences; private static String provider_api_url; + private Resources resources; public static void stop() { go_ahead = false; @@ -101,6 +103,7 @@ public class ProviderAPI extends IntentService { super.onCreate(); preferences = getSharedPreferences(Dashboard.SHARED_PREFERENCES, MODE_PRIVATE); + resources = getResources(); CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER)); } @@ -141,7 +144,7 @@ public class ProviderAPI extends IntentService { } } } else if (action.equalsIgnoreCase(SIGN_UP)) { - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.SIGNING_UP); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.SIGNING_UP, resources); Bundle result = tryToRegister(parameters); if (result.getBoolean(RESULT_KEY)) { receiver.send(SUCCESSFUL_SIGNUP, result); @@ -149,23 +152,23 @@ public class ProviderAPI extends IntentService { receiver.send(FAILED_SIGNUP, result); } } else if (action.equalsIgnoreCase(LOG_IN)) { - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGING_IN); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGING_IN, resources); Bundle result = tryToAuthenticate(parameters); if (result.getBoolean(RESULT_KEY)) { receiver.send(SUCCESSFUL_LOGIN, result); - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGED_IN); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGED_IN, resources); } else { receiver.send(FAILED_LOGIN, result); - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.NOT_LOGGED_IN); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.NOT_LOGGED_IN, resources); } } else if (action.equalsIgnoreCase(LOG_OUT)) { - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGING_OUT); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGING_OUT, resources); if (logOut()) { receiver.send(SUCCESSFUL_LOGOUT, Bundle.EMPTY); - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGED_OUT); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGED_OUT, resources); } else { receiver.send(LOGOUT_FAILED, Bundle.EMPTY); - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.DIDNT_LOG_OUT); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.DIDNT_LOG_OUT, resources); } } else if (action.equalsIgnoreCase(DOWNLOAD_CERTIFICATE)) { if (updateVpnCertificate()) { diff --git a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java index ee64a1b3..4207872d 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java +++ b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java @@ -78,7 +78,7 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn super.onCreate(savedInstanceState); app = this; - user_session_status = UserSessionStatus.getInstance(); + user_session_status = UserSessionStatus.getInstance(getResources()); user_session_status.addObserver(this); PRNGFixes.apply(); @@ -86,6 +86,7 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn preferences = getSharedPreferences(SHARED_PREFERENCES, MODE_PRIVATE); fragment_manager = new FragmentManagerEnhanced(getFragmentManager()); handleVersion(); + User.init(); restoreProvider(savedInstanceState); if (provider == null || provider.getName().isEmpty()) @@ -109,7 +110,7 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn if (savedInstanceState != null) if (savedInstanceState.containsKey(UserSessionStatus.TAG)) { UserSessionStatus.SessionStatus status = (UserSessionStatus.SessionStatus) savedInstanceState.getSerializable(UserSessionStatus.TAG); - user_session_status.updateStatus(status); + user_session_status.updateStatus(status, getResources()); } } diff --git a/app/src/main/java/se/leap/bitmaskclient/LeapSRPSession.java b/app/src/main/java/se/leap/bitmaskclient/LeapSRPSession.java index b961350e..1ced6d60 100644 --- a/app/src/main/java/se/leap/bitmaskclient/LeapSRPSession.java +++ b/app/src/main/java/se/leap/bitmaskclient/LeapSRPSession.java @@ -42,7 +42,6 @@ public class LeapSRPSession { final public static String AUTHORIZATION_HEADER = "Authorization"; final public static String TAG = "Leap SRP session class tag"; - private User user; private SRPParameters params; private String username; private String password; diff --git a/app/src/main/java/se/leap/bitmaskclient/User.java b/app/src/main/java/se/leap/bitmaskclient/User.java index 4bbd9a91..5b0bab47 100644 --- a/app/src/main/java/se/leap/bitmaskclient/User.java +++ b/app/src/main/java/se/leap/bitmaskclient/User.java @@ -17,12 +17,15 @@ package se.leap.bitmaskclient; public class User { - private static String user_name = "You"; + private static String user_name; private static User user; + public static int DEFAULT_CONJUGATION_PERSON = 1; - public static User getInstance() { + public static User init() { if (user == null) { - user = new User(); + String[] personal_pronouns = Dashboard.getContext().getResources().getStringArray(R.array.personal_pronouns); + String default_username = personal_pronouns[DEFAULT_CONJUGATION_PERSON]; + user = new User(default_username); } return user; } @@ -31,7 +34,8 @@ public class User { User.user_name = user_name; } - private User() { + private User(String user_name) { + User.user_name = user_name; } public static String userName() { diff --git a/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java b/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java index e43c8a25..ee818635 100644 --- a/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java +++ b/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java @@ -16,13 +16,14 @@ */ package se.leap.bitmaskclient; -import android.os.*; +import android.content.res.*; import java.util.*; public class UserSessionStatus extends Observable { public static String TAG = UserSessionStatus.class.getSimpleName(); private static UserSessionStatus current_status; + private static Resources resources; public enum SessionStatus { LOGGED_IN, @@ -36,14 +37,15 @@ public class UserSessionStatus extends Observable { private static SessionStatus session_status = SessionStatus.NOT_LOGGED_IN; - public static UserSessionStatus getInstance() { + public static UserSessionStatus getInstance(Resources resources) { if (current_status == null) { - current_status = new UserSessionStatus(); + current_status = new UserSessionStatus(resources); } return current_status; } - private UserSessionStatus() { + private UserSessionStatus(Resources resources) { + UserSessionStatus.resources = resources; } private void sessionStatus(SessionStatus session_status) { @@ -59,8 +61,8 @@ public class UserSessionStatus extends Observable { || session_status == SessionStatus.LOGGING_OUT; } - public static void updateStatus(SessionStatus session_status) { - current_status = getInstance(); + public static void updateStatus(SessionStatus session_status, Resources resources) { + current_status = getInstance(resources); current_status.sessionStatus(session_status); current_status.setChanged(); current_status.notifyObservers(); @@ -76,11 +78,14 @@ public class UserSessionStatus extends Observable { private String conjugateToBe(String subject) { String conjugation = ""; - if(subject.equalsIgnoreCase("I")) - conjugation = "am"; - else if(subject.equalsIgnoreCase("you") || subject.equalsIgnoreCase("we")|| subject.equalsIgnoreCase("they")) - conjugation = "are"; - else conjugation = "is"; + String[] personal_pronouns = resources.getStringArray(R.array.personal_pronouns); + String[] verb_to_be = resources.getStringArray(R.array.verb_to_be); + for (int i = 0; i < personal_pronouns.length ; i++) + if(subject.equalsIgnoreCase(personal_pronouns[i])) { + conjugation = verb_to_be[i]; + break; + } + if(conjugation.isEmpty()) conjugation = verb_to_be[User.DEFAULT_CONJUGATION_PERSON]; return conjugation; } diff --git a/app/src/main/res/values-es/arrays.xml b/app/src/main/res/values-es/arrays.xml index 045e125f..731330b2 100644 --- a/app/src/main/res/values-es/arrays.xml +++ b/app/src/main/res/values-es/arrays.xml @@ -1,3 +1,21 @@ + + + soy + estás + está + estamos + estáis + están + + + + Yo + + Él + Nosotros + Vosotros + Ellos + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 66f07a87..3c960442 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -1,4 +1,21 @@ + + am + are + is + are + are + are + + + + I + You + He + We + You + They + diff --git a/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java b/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java index 7cf80a4f..24e7df20 100644 --- a/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java +++ b/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java @@ -18,6 +18,7 @@ package se.leap.bitmaskclient; import android.app.*; import android.content.*; +import android.content.res.*; import android.os.*; import android.util.*; @@ -86,6 +87,7 @@ public class ProviderAPI extends IntentService { private static boolean go_ahead = true; private static SharedPreferences preferences; private static String provider_api_url; + private Resources resources; public static void stop() { go_ahead = false; @@ -137,7 +139,7 @@ public class ProviderAPI extends IntentService { } } } else if (action.equalsIgnoreCase(SIGN_UP)) { - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.SIGNING_UP); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.SIGNING_UP, resources); Bundle result = tryToRegister(parameters); if (result.getBoolean(RESULT_KEY)) { receiver.send(SUCCESSFUL_SIGNUP, result); @@ -145,23 +147,23 @@ public class ProviderAPI extends IntentService { receiver.send(FAILED_SIGNUP, result); } } else if (action.equalsIgnoreCase(LOG_IN)) { - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGING_IN); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGING_IN, resources); Bundle result = tryToAuthenticate(parameters); if (result.getBoolean(RESULT_KEY)) { receiver.send(SUCCESSFUL_LOGIN, result); - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGED_IN); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGED_IN, resources); } else { receiver.send(FAILED_LOGIN, result); - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.NOT_LOGGED_IN); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.NOT_LOGGED_IN, resources); } } else if (action.equalsIgnoreCase(LOG_OUT)) { - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGING_OUT); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGING_OUT, resources); if (logOut()) { receiver.send(SUCCESSFUL_LOGOUT, Bundle.EMPTY); - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGED_OUT); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.LOGGED_OUT, resources); } else { receiver.send(LOGOUT_FAILED, Bundle.EMPTY); - UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.DIDNT_LOG_OUT); + UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.DIDNT_LOG_OUT, resources); } } else if (action.equalsIgnoreCase(DOWNLOAD_CERTIFICATE)) { if (updateVpnCertificate()) { -- cgit v1.2.3 From f8f636d90a1110554eda858420e5052e88a250b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Fri, 10 Apr 2015 10:39:51 +0200 Subject: Seems to work. --- app/src/main/java/se/leap/bitmaskclient/User.java | 10 ++---- .../se/leap/bitmaskclient/UserSessionStatus.java | 37 +++++++++++++++++++--- app/src/main/res/values-es/strings.xml | 8 +++++ app/src/main/res/values/strings.xml | 8 ++++- 4 files changed, 51 insertions(+), 12 deletions(-) (limited to 'app/src') diff --git a/app/src/main/java/se/leap/bitmaskclient/User.java b/app/src/main/java/se/leap/bitmaskclient/User.java index 5b0bab47..f3d3b8b1 100644 --- a/app/src/main/java/se/leap/bitmaskclient/User.java +++ b/app/src/main/java/se/leap/bitmaskclient/User.java @@ -17,15 +17,13 @@ package se.leap.bitmaskclient; public class User { - private static String user_name; + private static String user_name = ""; private static User user; public static int DEFAULT_CONJUGATION_PERSON = 1; public static User init() { if (user == null) { - String[] personal_pronouns = Dashboard.getContext().getResources().getStringArray(R.array.personal_pronouns); - String default_username = personal_pronouns[DEFAULT_CONJUGATION_PERSON]; - user = new User(default_username); + user = new User(); } return user; } @@ -34,9 +32,7 @@ public class User { User.user_name = user_name; } - private User(String user_name) { - User.user_name = user_name; - } + private User() { } public static String userName() { return user_name; diff --git a/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java b/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java index ee818635..d5d53b6f 100644 --- a/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java +++ b/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java @@ -32,7 +32,26 @@ public class UserSessionStatus extends Observable { DIDNT_LOG_OUT, LOGGING_IN, LOGGING_OUT, - SIGNING_UP + SIGNING_UP; + + @Override + public String toString() { + int id = 0; + if(this == SessionStatus.LOGGED_IN) + id = R.string.logged_in_user_status; + else if(this == SessionStatus.LOGGED_OUT) + id = R.string.logged_out_user_status; + else if(this == SessionStatus.NOT_LOGGED_IN) + id = R.string.not_logged_in_user_status; + else if(this == SessionStatus.DIDNT_LOG_OUT) + id = R.string.didnt_log_out_user_status; + else if(this == SessionStatus.LOGGING_IN) + id = R.string.logging_in_user_status; + else if(this == SessionStatus.LOGGING_OUT) + id = R.string.logging_out_user_status; + + return resources.getString(id); + } } private static SessionStatus session_status = SessionStatus.NOT_LOGGED_IN; @@ -70,10 +89,20 @@ public class UserSessionStatus extends Observable { @Override public String toString() { - String username = User.userName(); + String user_session_status = User.userName(); + + String default_username = resources.getString(R.string.default_user, ""); + if(user_session_status.isEmpty() && !default_username.equalsIgnoreCase("null")) user_session_status = default_username; + user_session_status += " " + session_status.toString(); + + user_session_status = user_session_status.trim(); + if(User.userName().isEmpty()) + user_session_status = capitalize(user_session_status); + return user_session_status; + } - return username + " " + conjugateToBe(username) + " " - + session_status.toString().toLowerCase().replaceAll("_", " "); + private String capitalize(String to_be_capitalized) { + return to_be_capitalized.substring(0,1).toUpperCase() + to_be_capitalized.substring(1); } private String conjugateToBe(String subject) { diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b9c01afa..47dc2bc8 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -74,4 +74,12 @@ Conexión protegida. Parece que hay un problema con el proveedor. Prueba con otro proveedor, o contacta con este. + + inició sesión. + cerró la sesión. + no cerró la sesión. + no has iniciado sesión. + está iniciando sesión. + está cerrando sesión. + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 47ff2832..ea2d74ae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -58,7 +58,6 @@ Signing up Logging out from this session. Logged out. - Didn\'t log out. Try later, it may be a problem in the network or in the provider. If the problem persists, then wipe Bitmask data from the Android settings "Riseup users: You need to create a separate account to use the VPN service" Authentication succeeded. Authentication failed. @@ -73,4 +72,11 @@ Connection Secure. It seems there is a problem with the provider. Please try another provider, or contact yours. + You + is logged in. + logged out. + didn\'t log out. Try later, it may be a problem in the network or in the provider. If the problem persists, then wipe Bitmask data from the Android settings + have not logged in. + is logging in. + is logging out. -- cgit v1.2.3 From a1a00e4340ac869eb6be524fb9ae1197ab79762c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Tue, 14 Apr 2015 17:57:54 +0200 Subject: Signing up string. --- .../java/se/leap/bitmaskclient/UserSessionStatus.java | 2 ++ app/src/main/res/values-es/strings.xml | 5 +---- app/src/main/res/values/arrays.xml | 17 ----------------- app/src/main/res/values/strings.xml | 5 +---- 4 files changed, 4 insertions(+), 25 deletions(-) (limited to 'app/src') diff --git a/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java b/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java index d5d53b6f..a767ec97 100644 --- a/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java +++ b/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java @@ -49,6 +49,8 @@ public class UserSessionStatus extends Observable { id = R.string.logging_in_user_status; else if(this == SessionStatus.LOGGING_OUT) id = R.string.logging_out_user_status; + else if(this == SessionStatus.SIGNING_UP) + id = R.string.signingup_message; return resources.getString(id); } diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 47dc2bc8..9e0382dd 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -55,10 +55,6 @@ Tu certificado VPN no pudo ser descargado. Intenta iniciar sesión si es posible. Descargando certificado VPN Actualizando certificado VPN - Iniciando sesión - Registrando un nuevo usuario - Cerrando sesión. - Sesión terminada. No pudo cerrarse la sesión. Inténtalo más tarde, quizás sea un problema de la red o del proveedor. Si el problema persiste, borra los datos locales de Bitmask desde la configuración de Android. "Usuarios de Riseup: es necesario crear una cuenta aparte para utilizar el servicio de VPN." Sesión iniciada. @@ -81,5 +77,6 @@ no has iniciado sesión. está iniciando sesión. está cerrando sesión. + está siendo registrado. diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 3c960442..66f07a87 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -1,21 +1,4 @@ - - am - are - is - are - are - are - - - - I - You - He - We - You - They - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ea2d74ae..ac6191a9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -54,10 +54,6 @@ Your anon cert was not downloaded Downloading VPN certificate Updating VPN certificate - Logging in - Signing up - Logging out from this session. - Logged out. "Riseup users: You need to create a separate account to use the VPN service" Authentication succeeded. Authentication failed. @@ -79,4 +75,5 @@ have not logged in. is logging in. is logging out. + is being registered. -- cgit v1.2.3 From 2073ced5c853a8919f4d1c86b2d7a2cec6659c47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Tue, 14 Apr 2015 18:30:27 +0200 Subject: Show session error in user dialog --- app/src/main/java/se/leap/bitmaskclient/SessionDialog.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'app/src') diff --git a/app/src/main/java/se/leap/bitmaskclient/SessionDialog.java b/app/src/main/java/se/leap/bitmaskclient/SessionDialog.java index e92c6b7b..30344ff2 100644 --- a/app/src/main/java/se/leap/bitmaskclient/SessionDialog.java +++ b/app/src/main/java/se/leap/bitmaskclient/SessionDialog.java @@ -114,9 +114,10 @@ public class SessionDialog extends DialogFragment { if (arguments.containsKey(ERRORS.USERNAME_MISSING.toString())) { username_field.setError(getString(R.string.username_ask)); } - if (arguments.containsKey(getString(R.string.user_message))) + if (arguments.containsKey(getString(R.string.user_message))) { user_message.setText(arguments.getString(getString(R.string.user_message))); - else if (user_message.getVisibility() != TextView.VISIBLE) + user_message.setVisibility(View.VISIBLE); + } else if (user_message.getVisibility() != TextView.VISIBLE) user_message.setVisibility(View.GONE); if (!username_field.getText().toString().isEmpty() && password_field.isFocusable()) -- cgit v1.2.3 From e522e5e325e6ed19b1316fd251f3c212a2344d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Tue, 14 Apr 2015 18:35:20 +0200 Subject: Typo, segunda persona --- app/src/main/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/src') diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 9e0382dd..7ab5150e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -74,7 +74,7 @@ inició sesión. cerró la sesión. no cerró la sesión. - no has iniciado sesión. + no ha iniciado sesión. está iniciando sesión. está cerrando sesión. está siendo registrado. -- cgit v1.2.3 From c8994b645b607723bdaba4c2aa1ff0d19a9c0c13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Wed, 15 Apr 2015 10:41:59 +0200 Subject: Set accept-language in ProviderAPI, language-country String locale = Locale.getDefault().getLanguage() + Locale.getDefault().getCountry(); --- .../debug/java/se/leap/bitmaskclient/ProviderAPI.java | 2 ++ .../java/se/leap/bitmaskclient/UserSessionStatus.java | 14 -------------- app/src/main/res/values-es/arrays.xml | 18 ------------------ .../java/se/leap/bitmaskclient/ProviderAPI.java | 2 ++ 4 files changed, 4 insertions(+), 32 deletions(-) (limited to 'app/src') diff --git a/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java b/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java index b0df5ab8..9b5601a9 100644 --- a/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java +++ b/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java @@ -423,6 +423,8 @@ public class ProviderAPI extends IntentService { InputStream is = null; urlConnection = (HttpsURLConnection) new URL(url).openConnection(); urlConnection.setRequestMethod(request_method); + String locale = Locale.getDefault().getLanguage() + Locale.getDefault().getCountry(); + urlConnection.setRequestProperty("Accept-Language", locale); urlConnection.setChunkedStreamingMode(0); urlConnection.setSSLSocketFactory(getProviderSSLSocketFactory()); diff --git a/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java b/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java index a767ec97..28c7ecc7 100644 --- a/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java +++ b/app/src/main/java/se/leap/bitmaskclient/UserSessionStatus.java @@ -106,18 +106,4 @@ public class UserSessionStatus extends Observable { private String capitalize(String to_be_capitalized) { return to_be_capitalized.substring(0,1).toUpperCase() + to_be_capitalized.substring(1); } - - private String conjugateToBe(String subject) { - String conjugation = ""; - String[] personal_pronouns = resources.getStringArray(R.array.personal_pronouns); - String[] verb_to_be = resources.getStringArray(R.array.verb_to_be); - for (int i = 0; i < personal_pronouns.length ; i++) - if(subject.equalsIgnoreCase(personal_pronouns[i])) { - conjugation = verb_to_be[i]; - break; - } - if(conjugation.isEmpty()) conjugation = verb_to_be[User.DEFAULT_CONJUGATION_PERSON]; - - return conjugation; - } } diff --git a/app/src/main/res/values-es/arrays.xml b/app/src/main/res/values-es/arrays.xml index 731330b2..045e125f 100644 --- a/app/src/main/res/values-es/arrays.xml +++ b/app/src/main/res/values-es/arrays.xml @@ -1,21 +1,3 @@ - - - soy - estás - está - estamos - estáis - están - - - - Yo - - Él - Nosotros - Vosotros - Ellos - diff --git a/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java b/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java index 24e7df20..890262ce 100644 --- a/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java +++ b/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java @@ -416,6 +416,8 @@ public class ProviderAPI extends IntentService { InputStream is = null; urlConnection = (HttpsURLConnection) new URL(url).openConnection(); urlConnection.setRequestMethod(request_method); + String locale = Locale.getDefault().getLanguage() + Locale.getDefault().getCountry(); + urlConnection.setRequestProperty("Accept-Language", locale); urlConnection.setChunkedStreamingMode(0); urlConnection.setSSLSocketFactory(getProviderSSLSocketFactory()); -- cgit v1.2.3 From 106502134068155563f877966e1c5b0edfae2d51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Wed, 15 Apr 2015 13:01:10 +0200 Subject: Wants to disconnect and is connecting work fine. --- .../main/java/se/leap/bitmaskclient/EipFragment.java | 9 +++------ .../java/se/leap/bitmaskclient/eip/EipStatus.java | 20 ++++++++++++-------- 2 files changed, 15 insertions(+), 14 deletions(-) (limited to 'app/src') diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java index 02eedd77..bfa67815 100644 --- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java @@ -50,7 +50,6 @@ public class EipFragment extends Fragment implements Observer { private static Dashboard dashboard; private static EIPReceiver mEIPReceiver; private static EipStatus eip_status; - private boolean is_starting_to_connect; private boolean wants_to_connect; public void onAttach(Activity activity) { @@ -180,7 +179,7 @@ public class EipFragment extends Fragment implements Observer { public void startEipFromScratch() { wants_to_connect = false; - is_starting_to_connect = true; + eip_status.setConnecting(); progress_bar.setVisibility(View.VISIBLE); eip_switch.setVisibility(View.VISIBLE); String status = dashboard.getString(R.string.eip_status_start_pending); @@ -269,7 +268,7 @@ public class EipFragment extends Fragment implements Observer { private void handleNewState(EipStatus eip_status) { if (eip_status.wantsToDisconnect()) setDisconnectedUI(); - else if (eip_status.isConnecting() || is_starting_to_connect) + else if (eip_status.isConnecting()) setInProgressUI(eip_status); else if (eip_status.isConnected()) setConnectedUI(); @@ -280,7 +279,6 @@ public class EipFragment extends Fragment implements Observer { private void setConnectedUI() { hideProgressBar(); adjustSwitch(); - is_starting_to_connect = false; status_message.setText(dashboard.getString(R.string.eip_state_connected)); } @@ -296,7 +294,7 @@ public class EipFragment extends Fragment implements Observer { } private void adjustSwitch() { - if (eip_status.isConnected() || eip_status.isConnecting() || is_starting_to_connect) { + if (eip_status.isConnected() || eip_status.isConnecting()) { if (!eip_switch.isChecked()) { eip_switch.setChecked(true); } @@ -315,7 +313,6 @@ public class EipFragment extends Fragment implements Observer { showProgressBar(); status_message.setText(prefix + " " + logmessage); - is_starting_to_connect = false; adjustSwitch(); } diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java b/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java index ad68f96e..b7f95277 100644 --- a/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java +++ b/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java @@ -27,7 +27,10 @@ public class EipStatus extends Observable implements VpnStatus.StateListener { private static EipStatus current_status; private static VpnStatus.ConnectionStatus level = VpnStatus.ConnectionStatus.LEVEL_NOTCONNECTED; - private static boolean wants_to_disconnect = false; + private static boolean + wants_to_disconnect = false, + is_connecting = false; + private String state, log_message; private int localized_res_id; @@ -46,9 +49,9 @@ public class EipStatus extends Observable implements VpnStatus.StateListener { @Override public void updateState(final String state, final String logmessage, final int localizedResId, final VpnStatus.ConnectionStatus level) { updateStatus(state, logmessage, localizedResId, level); - if (isConnected() || isDisconnected()) { + if (isConnected() || isDisconnected() || wantsToDisconnect()) { setConnectedOrDisconnected(); - } else if (isConnecting()) + } else setConnecting(); } @@ -66,10 +69,7 @@ public class EipStatus extends Observable implements VpnStatus.StateListener { } public boolean isConnecting() { - return - !isConnected() && - !isDisconnected() && - !isPaused(); + return is_connecting; } public boolean isConnected() { @@ -85,19 +85,23 @@ public class EipStatus extends Observable implements VpnStatus.StateListener { } public void setConnecting() { + is_connecting = true; + wants_to_disconnect = false; current_status.setChanged(); current_status.notifyObservers(); } public void setConnectedOrDisconnected() { + is_connecting = false; wants_to_disconnect = false; current_status.setChanged(); current_status.notifyObservers(); } public void setDisconnecting() { - wants_to_disconnect = false; + wants_to_disconnect = true; + is_connecting = false; } public String getState() { -- cgit v1.2.3 From e2b289726f3c1813f9fafecc94bc61a70dbdb899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Tue, 21 Apr 2015 20:37:19 +0200 Subject: Pinning connection to provider.json Using AndroidPinning library from Moxie, I make sure the provider.json file Bitmask downloads is fetched from a pinned https connection, so that the api certificate fingerprint is the good one. --- .../se/leap/bitmaskclient/ConfigurationWizard.java | 28 +++++---- .../java/se/leap/bitmaskclient/ProviderAPI.java | 68 ++++++++++++++++------ .../main/java/se/leap/bitmaskclient/Provider.java | 14 +++-- .../se/leap/bitmaskclient/ProviderManager.java | 52 +++++++++++------ app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + .../se/leap/bitmaskclient/ConfigurationWizard.java | 23 ++++---- .../java/se/leap/bitmaskclient/ProviderAPI.java | 43 ++++++++++++-- 8 files changed, 159 insertions(+), 71 deletions(-) (limited to 'app/src') diff --git a/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java b/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java index 59d77d83..8910891a 100644 --- a/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java +++ b/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java @@ -126,7 +126,7 @@ public class ConfigurationWizard extends Activity if (fragment_manager.findFragmentByTag(ProviderDetailFragment.TAG) == null && setting_up_provider) { if (selected_provider != null) - onItemSelectedUi(selected_provider); + onItemSelectedUi(); if (progress > 0) mProgressBar.setProgress(progress); } @@ -231,20 +231,18 @@ public class ConfigurationWizard extends Activity void onItemSelected(int position) { //TODO Code 2 pane view selected_provider = adapter.getItem(position); - onItemSelectedLogic(selected_provider); - onItemSelectedUi(selected_provider); + onItemSelectedLogic(); + onItemSelectedUi(); } - private void onItemSelectedLogic(Provider selected_provider) { - boolean danger_on = true; - if (preferences.contains(ProviderItem.DANGER_ON)) - danger_on = preferences.getBoolean(ProviderItem.DANGER_ON, false); - setUpProvider(selected_provider.mainUrl(), danger_on); + private void onItemSelectedLogic() { + boolean danger_on = preferences.getBoolean(ProviderItem.DANGER_ON, false); + setUpProvider(danger_on); } - private void onItemSelectedUi(Provider provider) { + private void onItemSelectedUi() { startProgressBar(); - adapter.hideAllBut(adapter.indexOf(provider)); + adapter.hideAllBut(adapter.indexOf(selected_provider)); } @Override @@ -383,21 +381,21 @@ public class ConfigurationWizard extends Activity private void autoSelectProvider(Provider provider, boolean danger_on) { preferences.edit().putBoolean(ProviderItem.DANGER_ON, danger_on).apply(); selected_provider = provider; - onItemSelectedLogic(selected_provider); - onItemSelectedUi(selected_provider); + onItemSelectedLogic(); + onItemSelectedUi(); } /** * Asks ProviderAPI to download a new provider.json file * - * @param provider_main_url * @param danger_on tells if HTTPS client should bypass certificate errors */ - public void setUpProvider(URL provider_main_url, boolean danger_on) { + public void setUpProvider(boolean danger_on) { Intent provider_API_command = new Intent(this, ProviderAPI.class); Bundle parameters = new Bundle(); - parameters.putString(Provider.MAIN_URL, provider_main_url.toString()); + parameters.putString(Provider.MAIN_URL, selected_provider.mainUrl().toString()); parameters.putBoolean(ProviderItem.DANGER_ON, danger_on); + parameters.putString(Provider.CA_CERT_FINGERPRINT, selected_provider.certificatePin()); provider_API_command.setAction(ProviderAPI.SET_UP_PROVIDER); provider_API_command.putExtra(ProviderAPI.PARAMETERS, parameters); diff --git a/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java b/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java index 9b5601a9..6c57fca2 100644 --- a/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java +++ b/app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java @@ -22,6 +22,10 @@ import android.content.res.*; import android.os.*; import android.util.*; +import org.apache.http.client.*; +import org.json.*; +import org.thoughtcrime.ssl.pinning.util.*; + import java.io.*; import java.math.*; import java.net.*; @@ -32,10 +36,7 @@ import java.util.*; import javax.net.ssl.*; -import org.apache.http.client.*; -import org.json.*; - -import se.leap.bitmaskclient.ProviderListContent.ProviderItem; +import se.leap.bitmaskclient.ProviderListContent.*; import se.leap.bitmaskclient.eip.*; /** @@ -88,6 +89,7 @@ public class ProviderAPI extends IntentService { private static boolean go_ahead = true; private static SharedPreferences preferences; private static String provider_api_url; + private static String provider_ca_cert_fingerprint; private Resources resources; public static void stop() { @@ -102,6 +104,7 @@ public class ProviderAPI extends IntentService { public void onCreate() { super.onCreate(); + preferences = getSharedPreferences(Dashboard.SHARED_PREFERENCES, MODE_PRIVATE); resources = getResources(); CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER)); @@ -124,7 +127,7 @@ public class ProviderAPI extends IntentService { final ResultReceiver receiver = command.getParcelableExtra(RECEIVER_KEY); String action = command.getAction(); Bundle parameters = command.getBundleExtra(PARAMETERS); - if (provider_api_url == null) { + if (provider_api_url == null && preferences.contains(Provider.KEY)) { try { JSONObject provider_json = new JSONObject(preferences.getString(Provider.KEY, "no provider")); provider_api_url = provider_json.getString(Provider.API_URL) + "/" + provider_json.getString(Provider.API_VERSION); @@ -136,12 +139,10 @@ public class ProviderAPI extends IntentService { if (action.equalsIgnoreCase(SET_UP_PROVIDER)) { Bundle result = setUpProvider(parameters); - if (go_ahead) { - if (result.getBoolean(RESULT_KEY)) { - receiver.send(PROVIDER_OK, result); - } else { - receiver.send(PROVIDER_NOK, result); - } + if (result.getBoolean(RESULT_KEY)) { + receiver.send(PROVIDER_OK, result); + } else { + receiver.send(PROVIDER_NOK, result); } } else if (action.equalsIgnoreCase(SIGN_UP)) { UserSessionStatus.updateStatus(UserSessionStatus.SessionStatus.SIGNING_UP, resources); @@ -511,15 +512,20 @@ public class ProviderAPI extends IntentService { int progress = 0; 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); + if (task != null) { + last_danger_on = task.containsKey(ProviderItem.DANGER_ON) && task.getBoolean(ProviderItem.DANGER_ON); + last_provider_main_url = task.containsKey(Provider.MAIN_URL) ? + task.getString(Provider.MAIN_URL) : + ""; + provider_ca_cert_fingerprint = task.containsKey(Provider.CA_CERT_FINGERPRINT) ? + task.getString(Provider.CA_CERT_FINGERPRINT) : + ""; CA_CERT_DOWNLOADED = PROVIDER_JSON_DOWNLOADED = EIP_SERVICE_JSON_DOWNLOADED = false; go_ahead = true; } if (!PROVIDER_JSON_DOWNLOADED) - current_download = getAndSetProviderJson(last_provider_main_url, last_danger_on); + current_download = getAndSetProviderJson(last_provider_main_url, last_danger_on, provider_ca_cert_fingerprint); if (PROVIDER_JSON_DOWNLOADED || (current_download.containsKey(RESULT_KEY) && current_download.getBoolean(RESULT_KEY))) { broadcastProgress(progress++); PROVIDER_JSON_DOWNLOADED = true; @@ -608,11 +614,15 @@ public class ProviderAPI extends IntentService { return hexData.toString(); } - private Bundle getAndSetProviderJson(String provider_main_url, boolean danger_on) { + private Bundle getAndSetProviderJson(String provider_main_url, boolean danger_on, String provider_ca_cert_fingerprint) { Bundle result = new Bundle(); if (go_ahead) { - String provider_dot_json_string = downloadWithCommercialCA(provider_main_url + "/provider.json", danger_on); + String provider_dot_json_string; + if(provider_ca_cert_fingerprint.isEmpty()) + provider_dot_json_string = downloadWithCommercialCA(provider_main_url + "/provider.json", danger_on); + else + provider_dot_json_string = downloadWithCommercialCA(provider_main_url + "/provider.json", danger_on, provider_ca_cert_fingerprint); try { JSONObject provider_json = new JSONObject(provider_dot_json_string); @@ -678,6 +688,29 @@ public class ProviderAPI extends IntentService { return error_message; } + private String downloadWithCommercialCA(String url_string, boolean danger_on, String ca_cert_fingerprint) { + String result = ""; + + int seconds_of_timeout = 2; + String[] pins = new String[] {ca_cert_fingerprint}; + try { + URL url = new URL(url_string); + HttpsURLConnection connection = PinningHelper.getPinnedHttpsURLConnection(Dashboard.getContext(), pins, url); + connection.setConnectTimeout(seconds_of_timeout * 1000); + if (!LeapSRPSession.getToken().isEmpty()) + connection.addRequestProperty(LeapSRPSession.AUTHORIZATION_HEADER, "Token token = " + LeapSRPSession.getToken()); + result = new Scanner(connection.getInputStream()).useDelimiter("\\A").next(); + } catch (IOException e) { + if(e instanceof SSLHandshakeException) { + result = danger_on ? downloadWithoutCA(url_string) : + formatErrorMessage(R.string.error_security_pinnedcertificate); + } else + result = formatErrorMessage(R.string.error_io_exception_user_message); + } + + return result; + } + /** * Tries to download the contents of the provided url using commercially validated CA certificate from chosen provider. *

@@ -696,6 +729,7 @@ public class ProviderAPI extends IntentService { try { 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.AUTHORIZATION_HEADER, "Token token = " + LeapSRPSession.getToken()); diff --git a/app/src/main/java/se/leap/bitmaskclient/Provider.java b/app/src/main/java/se/leap/bitmaskclient/Provider.java index ee06a586..54bfcc19 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Provider.java +++ b/app/src/main/java/se/leap/bitmaskclient/Provider.java @@ -32,6 +32,7 @@ public final class Provider implements Parcelable { private JSONObject definition; // Represents our Provider's provider.json private URL main_url; + private String certificate_pin; final public static String API_URL = "api_uri", @@ -62,8 +63,9 @@ public final class Provider implements Parcelable { this.main_url = main_url; } - public Provider(File provider_file) { - + public Provider(URL main_url, String certificate_pin) { + this.main_url = main_url; + this.certificate_pin = certificate_pin; } public static final Parcelable.Creator CREATOR @@ -81,11 +83,9 @@ public final class Provider implements Parcelable { try { main_url = new URL(in.readString()); String definition_string = in.readString(); - if (definition_string != null) + if (!definition_string.isEmpty()) definition = new JSONObject((definition_string)); - } catch (MalformedURLException e) { - e.printStackTrace(); - } catch (JSONException e) { + } catch (MalformedURLException | JSONException e) { e.printStackTrace(); } } @@ -106,6 +106,8 @@ public final class Provider implements Parcelable { return main_url; } + protected String certificatePin() { return certificate_pin; } + protected String getName() { // Should we pass the locale in, or query the system here? String lang = Locale.getDefault().getLanguage(); diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderManager.java b/app/src/main/java/se/leap/bitmaskclient/ProviderManager.java index 40fe8b5a..220a71c8 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ProviderManager.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderManager.java @@ -49,11 +49,14 @@ public class ProviderManager implements AdapteeCollection { Set providers = new HashSet(); try { for (String file : relative_file_paths) { - String main_url = extractMainUrlFromInputStream(assets_manager.open(directory + "/" + file)); - providers.add(new Provider(new URL(main_url))); + InputStream provider_file = assets_manager.open(directory + "/" + file); + String main_url = extractMainUrlFromInputStream(provider_file); + String certificate_pin = extractCertificatePinFromInputStream(provider_file); + if(certificate_pin.isEmpty()) + providers.add(new Provider(new URL(main_url))); + else + providers.add(new Provider(new URL(main_url), certificate_pin)); } - } catch (MalformedURLException e) { - e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } @@ -75,30 +78,43 @@ public class ProviderManager implements AdapteeCollection { String main_url = extractMainUrlFromInputStream(new FileInputStream(external_files_dir.getAbsolutePath() + "/" + file)); providers.add(new Provider(new URL(main_url))); } - } catch (MalformedURLException e) { - e.printStackTrace(); - } catch (FileNotFoundException e) { + } catch (MalformedURLException | FileNotFoundException e) { e.printStackTrace(); } return providers; } - private String extractMainUrlFromInputStream(InputStream input_stream_file_contents) { + private String extractMainUrlFromInputStream(InputStream input_stream) { String main_url = ""; - byte[] bytes = new byte[0]; + + JSONObject file_contents = inputStreamToJson(input_stream); + if(file_contents != null) + main_url = file_contents.optString(Provider.MAIN_URL); + return main_url; + } + + private String extractCertificatePinFromInputStream(InputStream input_stream) { + String certificate_pin = ""; + + JSONObject file_contents = inputStreamToJson(input_stream); + if(file_contents != null) + certificate_pin = file_contents.optString(Provider.CA_CERT_FINGERPRINT); + + return certificate_pin; + } + + private JSONObject inputStreamToJson(InputStream input_stream) { + JSONObject json = null; try { - bytes = new byte[input_stream_file_contents.available()]; - if (input_stream_file_contents.read(bytes) > 0) { - JSONObject file_contents = new JSONObject(new String(bytes)); - main_url = file_contents.getString(Provider.MAIN_URL); - } - } catch (IOException e) { - e.printStackTrace(); - } catch (JSONException e) { + byte[] bytes = new byte[input_stream.available()]; + if (input_stream.read(bytes) > 0) + json = new JSONObject(new String(bytes)); + input_stream.reset(); + } catch (IOException | JSONException e) { e.printStackTrace(); } - return main_url; + return json; } public Set providers() { diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 7ab5150e..82ca44e9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -48,6 +48,7 @@ Salir Sucedió un error configurando Bitmask con tu proveedor elegido.\n\nPuedes volver a intentarlo, o elegir otro proveedor. No se ha detectado red para hablar con el servidor, inténtalo de nuevo. + Error de seguridad, actualiza la aplicación o elige otro proveedor. No parece que sea un proveedor de Bitmask. No es un proveedor de Bitmak de confianza. El servicio está caído. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ac6191a9..bcfd3a2c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -47,6 +47,7 @@ Exit There was an error configuring Bitmask with your chosen provider.\n\nYou may choose to reconfigure, or exit and configure a provider upon next launch. Server is unreachable, please try again. + Security error, update the app or choose another provider. It doesn\'t seem to be a Bitmask provider. This is not a trusted Bitmask provider. Service is down. diff --git a/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java b/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java index 19ba1ba8..68ff9e47 100644 --- a/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java +++ b/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java @@ -126,7 +126,7 @@ public class ConfigurationWizard extends Activity if (fragment_manager.findFragmentByTag(ProviderDetailFragment.TAG) == null && setting_up_provider) { if (selected_provider != null) - onItemSelectedUi(selected_provider); + onItemSelectedUi(); if (progress > 0) mProgressBar.setProgress(progress); } @@ -229,17 +229,17 @@ public class ConfigurationWizard extends Activity void onItemSelected(int position) { //TODO Code 2 pane view selected_provider = adapter.getItem(position); - onItemSelectedUi(selected_provider); - onItemSelectedLogic(selected_provider); + onItemSelectedUi(); + onItemSelectedLogic(); } - private void onItemSelectedLogic(Provider selected_provider) { - setUpProvider(selected_provider.mainUrl()); + private void onItemSelectedLogic() { + setUpProvider(); } - private void onItemSelectedUi(Provider provider) { + private void onItemSelectedUi() { startProgressBar(); - adapter.hideAllBut(adapter.indexOf(provider)); + adapter.hideAllBut(adapter.indexOf(selected_provider)); } @Override @@ -379,8 +379,8 @@ public class ConfigurationWizard extends Activity private void autoSelectProvider(Provider provider) { selected_provider = provider; - onItemSelectedUi(selected_provider); - onItemSelectedLogic(selected_provider); + onItemSelectedUi(); + onItemSelectedLogic(); } /** @@ -389,10 +389,11 @@ public class ConfigurationWizard extends Activity * @param provider_name * @param provider_main_url */ - public void setUpProvider(URL provider_main_url) { + public void setUpProvider() { Intent provider_API_command = new Intent(this, ProviderAPI.class); Bundle parameters = new Bundle(); - parameters.putString(Provider.MAIN_URL, provider_main_url.toString()); + parameters.putString(Provider.MAIN_URL, selected_provider.mainUrl().toString()); + parameters.putString(Provider.CA_CERT_FINGERPRINT, selected_provider.certificatePin()); provider_API_command.setAction(ProviderAPI.SET_UP_PROVIDER); provider_API_command.putExtra(ProviderAPI.PARAMETERS, parameters); diff --git a/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java b/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java index 890262ce..a96556bc 100644 --- a/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java +++ b/app/src/release/java/se/leap/bitmaskclient/ProviderAPI.java @@ -34,6 +34,7 @@ import javax.net.ssl.*; import org.apache.http.client.*; import org.json.*; +import org.thoughtcrime.ssl.pinning.util.*; import se.leap.bitmaskclient.ProviderListContent.ProviderItem; import se.leap.bitmaskclient.eip.*; @@ -87,6 +88,7 @@ public class ProviderAPI extends IntentService { private static boolean go_ahead = true; private static SharedPreferences preferences; private static String provider_api_url; + private static String provider_ca_cert_fingerprint; private Resources resources; public static void stop() { @@ -504,13 +506,19 @@ public class ProviderAPI extends IntentService { Bundle current_download = new Bundle(); if (task != null && task.containsKey(Provider.MAIN_URL)) { - last_provider_main_url = task.getString(Provider.MAIN_URL); + last_provider_main_url = task.containsKey(Provider.MAIN_URL) ? + task.getString(Provider.MAIN_URL) : + ""; + provider_ca_cert_fingerprint = task.containsKey(Provider.CA_CERT_FINGERPRINT) ? + task.getString(Provider.CA_CERT_FINGERPRINT) : + ""; + CA_CERT_DOWNLOADED = PROVIDER_JSON_DOWNLOADED = EIP_SERVICE_JSON_DOWNLOADED = false; go_ahead = true; } if (!PROVIDER_JSON_DOWNLOADED) - current_download = getAndSetProviderJson(last_provider_main_url); + current_download = getAndSetProviderJson(last_provider_main_url, provider_ca_cert_fingerprint); if (PROVIDER_JSON_DOWNLOADED || (current_download.containsKey(RESULT_KEY) && current_download.getBoolean(RESULT_KEY))) { broadcastProgress(progress++); PROVIDER_JSON_DOWNLOADED = true; @@ -602,11 +610,16 @@ public class ProviderAPI extends IntentService { return hexData.toString(); } - private Bundle getAndSetProviderJson(String provider_main_url) { + private Bundle getAndSetProviderJson(String provider_main_url, String provider_ca_cert_fingerprint) { Bundle result = new Bundle(); if (go_ahead) { - String provider_dot_json_string = downloadWithCommercialCA(provider_main_url + "/provider.json"); + String provider_dot_json_string; + + if(provider_ca_cert_fingerprint.isEmpty()) + provider_dot_json_string = downloadWithCommercialCA(provider_main_url + "/provider.json"); + else + provider_dot_json_string = downloadWithCommercialCA(provider_main_url + "/provider.json", provider_ca_cert_fingerprint); try { JSONObject provider_json = new JSONObject(provider_dot_json_string); @@ -672,6 +685,28 @@ public class ProviderAPI extends IntentService { return error_message; } + private String downloadWithCommercialCA(String url_string, String ca_cert_fingerprint) { + String result = ""; + + int seconds_of_timeout = 2; + String[] pins = new String[] {ca_cert_fingerprint}; + try { + URL url = new URL(url_string); + HttpsURLConnection connection = PinningHelper.getPinnedHttpsURLConnection(Dashboard.getContext(), pins, url); + connection.setConnectTimeout(seconds_of_timeout * 1000); + if (!LeapSRPSession.getToken().isEmpty()) + connection.addRequestProperty(LeapSRPSession.AUTHORIZATION_HEADER, "Token token = " + LeapSRPSession.getToken()); + result = new Scanner(connection.getInputStream()).useDelimiter("\\A").next(); + } catch (IOException e) { + if(e instanceof SSLHandshakeException) + result = formatErrorMessage(R.string.error_security_pinnedcertificate); + else + result = formatErrorMessage(R.string.error_io_exception_user_message); + } + + return result; + } + /** * Tries to download the contents of the provided url using commercially validated CA certificate from chosen provider. * -- cgit v1.2.3 From 7d6d55cb62fcdc1e3a36f2634f0399b2d77db263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Wed, 22 Apr 2015 12:29:04 +0200 Subject: Initialize ca fingerprint, avoiding nullpointer Danger on defaults to true in debug build --- app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java | 2 +- app/src/main/java/se/leap/bitmaskclient/Provider.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'app/src') diff --git a/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java b/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java index 8910891a..aac53a07 100644 --- a/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java +++ b/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java @@ -236,7 +236,7 @@ public class ConfigurationWizard extends Activity } private void onItemSelectedLogic() { - boolean danger_on = preferences.getBoolean(ProviderItem.DANGER_ON, false); + boolean danger_on = preferences.getBoolean(ProviderItem.DANGER_ON, true); setUpProvider(danger_on); } diff --git a/app/src/main/java/se/leap/bitmaskclient/Provider.java b/app/src/main/java/se/leap/bitmaskclient/Provider.java index 54bfcc19..a030927d 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Provider.java +++ b/app/src/main/java/se/leap/bitmaskclient/Provider.java @@ -32,7 +32,7 @@ public final class Provider implements Parcelable { private JSONObject definition; // Represents our Provider's provider.json private URL main_url; - private String certificate_pin; + private String certificate_pin = ""; final public static String API_URL = "api_uri", -- cgit v1.2.3 From cdeaf6c2ae2fa96a2ef1e0ae6c931c6d50b27271 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Thu, 16 Apr 2015 13:02:06 +0200 Subject: Button with circle progress, added. Next step: a bit of UI design, removing the switch. --- .../java/se/leap/bitmaskclient/EipFragment.java | 24 ++++++++++++++++++++-- app/src/main/res/layout/eip_service_fragment.xml | 20 ++++++++++++++++++ app/src/main/res/values/dimens.xml | 1 + 3 files changed, 43 insertions(+), 2 deletions(-) (limited to 'app/src') diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java index bfa67815..454530be 100644 --- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java @@ -19,7 +19,6 @@ package se.leap.bitmaskclient; import android.app.*; import android.content.*; import android.os.*; -import android.util.*; import android.view.*; import android.widget.*; @@ -29,6 +28,7 @@ import java.util.*; import butterknife.*; import de.blinkt.openvpn.activities.*; +import mbanje.kurt.fabbutton.*; import se.leap.bitmaskclient.eip.*; public class EipFragment extends Fragment implements Observer { @@ -46,6 +46,8 @@ public class EipFragment extends Fragment implements Observer { TextView status_message; @InjectView(R.id.eipProgress) ProgressBar progress_bar; + @InjectView(R.id.vpn_Status_Image) + FabButton vpn_status_image; private static Dashboard dashboard; private static EIPReceiver mEIPReceiver; @@ -112,6 +114,16 @@ public class EipFragment extends Fragment implements Observer { Dashboard.preferences.edit().putBoolean(Dashboard.START_ON_BOOT, is_on).commit(); } + @OnClick(R.id.vpn_Status_Image) + void handleIcon() { + if (eip_status.isConnected() || eip_status.isConnecting()) + handleSwitchOff(); + else + handleSwitchOn(); + + saveStatus(); + } + void handleNewVpnCertificate() { handleSwitch(!eip_switch.isEnabled()); } @@ -298,11 +310,19 @@ public class EipFragment extends Fragment implements Observer { if (!eip_switch.isChecked()) { eip_switch.setChecked(true); } + if(eip_status.isConnecting()) { + vpn_status_image.showProgress(true); + vpn_status_image.setIcon(R.drawable.ic_stat_vpn_empty_halo, R.drawable.ic_stat_vpn_empty_halo); + } else { + vpn_status_image.showProgress(false); + vpn_status_image.setIcon(R.drawable.ic_stat_vpn, R.drawable.ic_stat_vpn); + } } else { - if (eip_switch.isChecked()) { eip_switch.setChecked(false); } + vpn_status_image.setIcon(R.drawable.ic_stat_vpn_offline, R.drawable.ic_stat_vpn_offline); + vpn_status_image.showProgress(false); } } diff --git a/app/src/main/res/layout/eip_service_fragment.xml b/app/src/main/res/layout/eip_service_fragment.xml index 6adcfab0..0cc1df7d 100644 --- a/app/src/main/res/layout/eip_service_fragment.xml +++ b/app/src/main/res/layout/eip_service_fragment.xml @@ -48,4 +48,24 @@ android:layout_toRightOf="@+id/status_message" android:layout_toEndOf="@+id/status_message" /> + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 727f5a78..4e8dad45 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -17,4 +17,5 @@ 56dp 16dp 16dp + 32dp \ No newline at end of file -- cgit v1.2.3 From 90c28f492b800b706c1d6f14482baf3e75c4be7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Thu, 16 Apr 2015 13:16:04 +0200 Subject: Remove eip switch. --- .../java/se/leap/bitmaskclient/EipFragment.java | 31 ++-------------------- app/src/main/res/layout/eip_service_fragment.xml | 17 ++++-------- 2 files changed, 7 insertions(+), 41 deletions(-) (limited to 'app/src') diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java index 454530be..a9ceec52 100644 --- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java @@ -40,8 +40,6 @@ public class EipFragment extends Fragment implements Observer { protected static final String STATUS_MESSAGE = TAG + ".status_message"; public static final String START_ON_BOOT = "start on boot"; - @InjectView(R.id.eipSwitch) - Switch eip_switch; @InjectView(R.id.status_message) TextView status_message; @InjectView(R.id.eipProgress) @@ -74,9 +72,6 @@ public class EipFragment extends Fragment implements Observer { View view = inflater.inflate(R.layout.eip_service_fragment, container, false); ButterKnife.inject(this, view); - if (eip_status.isConnecting()) - eip_switch.setVisibility(View.VISIBLE); - Bundle arguments = getArguments(); if (arguments != null && arguments.containsKey(START_ON_BOOT) && arguments.getBoolean(START_ON_BOOT)) startEipFromScratch(); @@ -110,7 +105,7 @@ public class EipFragment extends Fragment implements Observer { } protected void saveStatus() { - boolean is_on = eip_switch.isChecked(); + boolean is_on = eip_status.isConnected() || eip_status.isConnecting(); Dashboard.preferences.edit().putBoolean(Dashboard.START_ON_BOOT, is_on).commit(); } @@ -125,17 +120,7 @@ public class EipFragment extends Fragment implements Observer { } void handleNewVpnCertificate() { - handleSwitch(!eip_switch.isEnabled()); - } - - @OnCheckedChanged(R.id.eipSwitch) - void handleSwitch(boolean isChecked) { - if (isChecked) - handleSwitchOn(); - else - handleSwitchOff(); - - saveStatus(); + handleIcon(); } private void handleSwitchOn() { @@ -183,7 +168,6 @@ public class EipFragment extends Fragment implements Observer { .setNegativeButton(dashboard.getString(R.string.no), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - eip_switch.setChecked(true); } }) .show(); @@ -193,13 +177,9 @@ public class EipFragment extends Fragment implements Observer { wants_to_connect = false; eip_status.setConnecting(); 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); - } saveStatus(); eipCommand(Constants.ACTION_START_EIP); } @@ -239,7 +219,6 @@ public class EipFragment extends Fragment implements Observer { .setNegativeButton(dashboard.getString(R.string.no), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - eip_switch.setChecked(true); } }) .show(); @@ -307,9 +286,6 @@ public class EipFragment extends Fragment implements Observer { private void adjustSwitch() { if (eip_status.isConnected() || eip_status.isConnecting()) { - if (!eip_switch.isChecked()) { - eip_switch.setChecked(true); - } if(eip_status.isConnecting()) { vpn_status_image.showProgress(true); vpn_status_image.setIcon(R.drawable.ic_stat_vpn_empty_halo, R.drawable.ic_stat_vpn_empty_halo); @@ -318,9 +294,6 @@ public class EipFragment extends Fragment implements Observer { vpn_status_image.setIcon(R.drawable.ic_stat_vpn, R.drawable.ic_stat_vpn); } } else { - if (eip_switch.isChecked()) { - eip_switch.setChecked(false); - } vpn_status_image.setIcon(R.drawable.ic_stat_vpn_offline, R.drawable.ic_stat_vpn_offline); vpn_status_image.showProgress(false); } diff --git a/app/src/main/res/layout/eip_service_fragment.xml b/app/src/main/res/layout/eip_service_fragment.xml index 0cc1df7d..669abef0 100644 --- a/app/src/main/res/layout/eip_service_fragment.xml +++ b/app/src/main/res/layout/eip_service_fragment.xml @@ -40,14 +40,6 @@ android:clickable="true" android:text="@string/eip_state_not_connected" /> - - -- cgit v1.2.3 From 8862197a0a138f942e9c76a29aaf189f4c5141b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Thu, 16 Apr 2015 13:20:45 +0200 Subject: Remove progress bar. --- .../main/java/se/leap/bitmaskclient/Dashboard.java | 1 - .../main/java/se/leap/bitmaskclient/EipFragment.java | 20 -------------------- app/src/main/res/layout/eip_service_fragment.xml | 13 +------------ 3 files changed, 1 insertion(+), 33 deletions(-) (limited to 'app/src') diff --git a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java index 4207872d..d5d06322 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java +++ b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java @@ -373,7 +373,6 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn protected void providerApiCommand(Bundle parameters, int progressbar_message_resId, String providerApi_action) { if (eip_fragment != null && progressbar_message_resId != 0) { - eip_fragment.progress_bar.setVisibility(ProgressBar.VISIBLE); setStatusMessage(progressbar_message_resId); } diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java index a9ceec52..bed61d24 100644 --- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java @@ -42,8 +42,6 @@ public class EipFragment extends Fragment implements Observer { @InjectView(R.id.status_message) TextView status_message; - @InjectView(R.id.eipProgress) - ProgressBar progress_bar; @InjectView(R.id.vpn_Status_Image) FabButton vpn_status_image; @@ -176,7 +174,6 @@ public class EipFragment extends Fragment implements Observer { public void startEipFromScratch() { wants_to_connect = false; eip_status.setConnecting(); - progress_bar.setVisibility(View.VISIBLE); String status = dashboard.getString(R.string.eip_status_start_pending); status_message.setText(status); @@ -197,9 +194,6 @@ public class EipFragment extends Fragment implements Observer { } protected void stopEipIfPossible() { - - hideProgressBar(); - String message = dashboard.getString(R.string.eip_state_not_connected); status_message.setText(message); @@ -268,13 +262,11 @@ public class EipFragment extends Fragment implements Observer { } private void setConnectedUI() { - hideProgressBar(); adjustSwitch(); status_message.setText(dashboard.getString(R.string.eip_state_connected)); } private void setDisconnectedUI() { - hideProgressBar(); adjustSwitch(); if (eip_status.errorInLast(5, dashboard.getApplicationContext()) && !status_message.getText().toString().equalsIgnoreCase(dashboard.getString(R.string.eip_state_not_connected))) { @@ -304,26 +296,14 @@ public class EipFragment extends Fragment implements Observer { String logmessage = eip_status.getLogMessage(); String prefix = dashboard.getString(localizedResId); - showProgressBar(); status_message.setText(prefix + " " + logmessage); adjustSwitch(); } private void updatingCertificateUI() { - showProgressBar(); status_message.setText(getString(R.string.updating_certificate_message)); } - private void showProgressBar() { - 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) { diff --git a/app/src/main/res/layout/eip_service_fragment.xml b/app/src/main/res/layout/eip_service_fragment.xml index 669abef0..fea0093e 100644 --- a/app/src/main/res/layout/eip_service_fragment.xml +++ b/app/src/main/res/layout/eip_service_fragment.xml @@ -15,23 +15,12 @@ android:text="@string/eip_service_label" android:textAppearance="?android:attr/textAppearanceMedium" /> - - Date: Mon, 20 Apr 2015 18:20:05 +0200 Subject: Remove textual status. I had a difficult moment trying to detect if the LogWindow had already been shown after an error. Finally, I implemented a LogWindowWrapper which contains a field for the reason it was shown, so that we can check if the previous error is the same than the current one leading to the avoidance of the second LogWindow. For this to work, we need to reset that reason each time we trigger a new vpn state (i.e. each time the user taps on the vpn icon). --- .../main/java/se/leap/bitmaskclient/Dashboard.java | 13 +------ .../java/se/leap/bitmaskclient/EipFragment.java | 45 ++++++---------------- .../se/leap/bitmaskclient/LogWindowWrapper.java | 41 ++++++++++++++++++++ .../java/se/leap/bitmaskclient/eip/EipStatus.java | 15 ++++++-- .../se/leap/bitmaskclient/eip/VoidVpnService.java | 4 ++ app/src/main/res/layout/eip_service_fragment.xml | 14 ------- 6 files changed, 70 insertions(+), 62 deletions(-) create mode 100644 app/src/main/java/se/leap/bitmaskclient/LogWindowWrapper.java (limited to 'app/src') diff --git a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java index d5d06322..921bf95b 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java +++ b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java @@ -285,8 +285,8 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn } public void showLog() { - Intent startLW = new Intent(getContext(), LogWindow.class); - startActivity(startLW); + LogWindowWrapper log_window_wrapper = LogWindowWrapper.getInstance(getContext()); + log_window_wrapper.showLog(); } @Override @@ -372,10 +372,6 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn } protected void providerApiCommand(Bundle parameters, int progressbar_message_resId, String providerApi_action) { - if (eip_fragment != null && progressbar_message_resId != 0) { - setStatusMessage(progressbar_message_resId); - } - Intent command = prepareProviderAPICommand(parameters, providerApi_action); startService(command); } @@ -449,11 +445,6 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn } } - private void setStatusMessage(int string_resId) { - if (eip_fragment != null && eip_fragment.status_message != null) - eip_fragment.status_message.setText(string_resId); - } - public static Context getContext() { return app; } diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java index bed61d24..c92ae3cd 100644 --- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java @@ -20,7 +20,6 @@ import android.app.*; import android.content.*; import android.os.*; import android.view.*; -import android.widget.*; import org.jetbrains.annotations.*; @@ -37,11 +36,9 @@ public class EipFragment extends Fragment implements Observer { protected static final String IS_PENDING = TAG + ".is_pending"; protected static final String IS_CONNECTED = TAG + ".is_connected"; - protected static final String STATUS_MESSAGE = TAG + ".status_message"; public static final String START_ON_BOOT = "start on boot"; + private static final String SHOWED_LOG = TAG + ".showed_log"; - @InjectView(R.id.status_message) - TextView status_message; @InjectView(R.id.vpn_Status_Image) FabButton vpn_status_image; @@ -83,8 +80,6 @@ public class EipFragment extends Fragment implements Observer { eip_status.setConnecting(); else if (savedInstanceState.getBoolean(IS_CONNECTED)) eip_status.setConnectedOrDisconnected(); - else - status_message.setText(savedInstanceState.getString(STATUS_MESSAGE)); } @Override @@ -98,7 +93,6 @@ public class EipFragment extends Fragment implements Observer { 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); } @@ -109,6 +103,7 @@ public class EipFragment extends Fragment implements Observer { @OnClick(R.id.vpn_Status_Image) void handleIcon() { + LogWindowWrapper.getInstance(dashboard.getApplicationContext()).clearReason(); if (eip_status.isConnected() || eip_status.isConnecting()) handleSwitchOff(); else @@ -174,8 +169,6 @@ public class EipFragment extends Fragment implements Observer { public void startEipFromScratch() { wants_to_connect = false; eip_status.setConnecting(); - String status = dashboard.getString(R.string.eip_status_start_pending); - status_message.setText(status); saveStatus(); eipCommand(Constants.ACTION_START_EIP); @@ -194,9 +187,6 @@ public class EipFragment extends Fragment implements Observer { } protected void stopEipIfPossible() { - String message = dashboard.getString(R.string.eip_state_not_connected); - status_message.setText(message); - eipCommand(Constants.ACTION_STOP_EIP); } @@ -251,29 +241,24 @@ public class EipFragment extends Fragment implements Observer { } private void handleNewState(EipStatus eip_status) { - if (eip_status.wantsToDisconnect()) - setDisconnectedUI(); - else if (eip_status.isConnecting()) - setInProgressUI(eip_status); - else if (eip_status.isConnected()) - setConnectedUI(); - else if (eip_status.isDisconnected() && !eip_status.isConnecting()) - setDisconnectedUI(); + Context context = dashboard.getApplicationContext(); + String error = eip_status.lastError(5, context); + LogWindowWrapper log_window = LogWindowWrapper.getInstance(context); + + if (!error.isEmpty() && log_window != null && !log_window.reason().equalsIgnoreCase(error)) { + log_window.showLog(); + log_window.showedBecauseOf(error); + VoidVpnService.stop(); + } + adjustSwitch(); } private void setConnectedUI() { adjustSwitch(); - status_message.setText(dashboard.getString(R.string.eip_state_connected)); } private void setDisconnectedUI() { adjustSwitch(); - if (eip_status.errorInLast(5, dashboard.getApplicationContext()) - && !status_message.getText().toString().equalsIgnoreCase(dashboard.getString(R.string.eip_state_not_connected))) { - dashboard.showLog(); - VoidVpnService.stop(); - } - status_message.setText(dashboard.getString(R.string.eip_state_not_connected)); } private void adjustSwitch() { @@ -292,16 +277,10 @@ public class EipFragment extends Fragment implements Observer { } private void setInProgressUI(EipStatus eip_status) { - int localizedResId = eip_status.getLocalizedResId(); - String logmessage = eip_status.getLogMessage(); - String prefix = dashboard.getString(localizedResId); - - status_message.setText(prefix + " " + logmessage); adjustSwitch(); } private void updatingCertificateUI() { - status_message.setText(getString(R.string.updating_certificate_message)); } protected class EIPReceiver extends ResultReceiver { diff --git a/app/src/main/java/se/leap/bitmaskclient/LogWindowWrapper.java b/app/src/main/java/se/leap/bitmaskclient/LogWindowWrapper.java new file mode 100644 index 00000000..441eb28e --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/LogWindowWrapper.java @@ -0,0 +1,41 @@ +package se.leap.bitmaskclient; + +import android.content.*; + +import de.blinkt.openvpn.activities.*; + +public class LogWindowWrapper { + private static LogWindowWrapper instance; + + private static String TAG = LogWindowWrapper.class.getName(); + private Context context; + private String reason = ""; + + public LogWindowWrapper(Context context) { + this.context = context; + } + + public void showLog() { + Intent startLW = new Intent(context, LogWindow.class); + startLW.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(startLW); + } + + public static LogWindowWrapper getInstance(Context context) { + if(instance == null) + instance = new LogWindowWrapper(context); + return instance; + } + + public void clearReason() { + reason = ""; + } + + public void showedBecauseOf(String reason) { + this.reason = reason; + } + + public String reason() { + return reason; + } +} diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java b/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java index b7f95277..356cf6b0 100644 --- a/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java +++ b/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java @@ -137,18 +137,25 @@ public class EipStatus extends Observable implements VpnStatus.StateListener { } public boolean errorInLast(int lines, Context context) { - boolean result = false; + return !lastError(lines, context).isEmpty(); + } + + public String lastError(int lines, Context context) { + String error = ""; + String[] error_keywords = {"error", "ERROR", "fatal", "FATAL"}; VpnStatus.LogItem[] log = VpnStatus.getlogbuffer(); String message = ""; for (int i = 1; i <= lines && log.length > i; i++) { - message = log[log.length - i].getString(context); + VpnStatus.LogItem log_item = log[log.length - i]; + message = log_item.getString(context); for (int j = 0; j < error_keywords.length; j++) if (message.contains(error_keywords[j])) - result = true; + error = message; } - return result; + + return error; } @Override diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/VoidVpnService.java b/app/src/main/java/se/leap/bitmaskclient/eip/VoidVpnService.java index dac92fe2..cbf0fed2 100644 --- a/app/src/main/java/se/leap/bitmaskclient/eip/VoidVpnService.java +++ b/app/src/main/java/se/leap/bitmaskclient/eip/VoidVpnService.java @@ -50,6 +50,10 @@ public class VoidVpnService extends VpnService { closeFd(); } + public static boolean isRunning() throws NullPointerException { + return thread.isAlive() && fd != null; + } + private static void closeFd() { try { if (fd != null) diff --git a/app/src/main/res/layout/eip_service_fragment.xml b/app/src/main/res/layout/eip_service_fragment.xml index fea0093e..4ad8725d 100644 --- a/app/src/main/res/layout/eip_service_fragment.xml +++ b/app/src/main/res/layout/eip_service_fragment.xml @@ -15,20 +15,6 @@ android:text="@string/eip_service_label" android:textAppearance="?android:attr/textAppearanceMedium" /> - - Date: Mon, 20 Apr 2015 19:55:00 +0200 Subject: Always show the log if an error happens. I've removed the "reason" management in LogWindowWrapper, letting EipStatus display the error log message only if it's a new one (based on the log buffer position). --- app/src/main/java/se/leap/bitmaskclient/EipFragment.java | 7 ++----- app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java | 11 ++++++++--- 2 files changed, 10 insertions(+), 8 deletions(-) (limited to 'app/src') diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java index c92ae3cd..a13cab09 100644 --- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java @@ -103,7 +103,6 @@ public class EipFragment extends Fragment implements Observer { @OnClick(R.id.vpn_Status_Image) void handleIcon() { - LogWindowWrapper.getInstance(dashboard.getApplicationContext()).clearReason(); if (eip_status.isConnected() || eip_status.isConnecting()) handleSwitchOff(); else @@ -243,11 +242,9 @@ public class EipFragment extends Fragment implements Observer { private void handleNewState(EipStatus eip_status) { Context context = dashboard.getApplicationContext(); String error = eip_status.lastError(5, context); - LogWindowWrapper log_window = LogWindowWrapper.getInstance(context); - if (!error.isEmpty() && log_window != null && !log_window.reason().equalsIgnoreCase(error)) { - log_window.showLog(); - log_window.showedBecauseOf(error); + if (!error.isEmpty()) { + dashboard.showLog(); VoidVpnService.stop(); } adjustSwitch(); diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java b/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java index 356cf6b0..4bfef1cb 100644 --- a/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java +++ b/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java @@ -31,7 +31,7 @@ public class EipStatus extends Observable implements VpnStatus.StateListener { wants_to_disconnect = false, is_connecting = false; - + int last_error_line = 0; private String state, log_message; private int localized_res_id; @@ -146,13 +146,18 @@ public class EipStatus extends Observable implements VpnStatus.StateListener { String[] error_keywords = {"error", "ERROR", "fatal", "FATAL"}; VpnStatus.LogItem[] log = VpnStatus.getlogbuffer(); + if(log.length < last_error_line) + last_error_line = 0; String message = ""; for (int i = 1; i <= lines && log.length > i; i++) { - VpnStatus.LogItem log_item = log[log.length - i]; + int line = log.length - i; + VpnStatus.LogItem log_item = log[line]; message = log_item.getString(context); for (int j = 0; j < error_keywords.length; j++) - if (message.contains(error_keywords[j])) + if (message.contains(error_keywords[j]) && line > last_error_line) { error = message; + last_error_line = line; + } } return error; -- cgit v1.2.3 From 1a1b49a36e6c8ddccdb2a3308b6739601a691efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Mon, 20 Apr 2015 19:57:22 +0200 Subject: Remove traces of the "reason" field. --- .../main/java/se/leap/bitmaskclient/LogWindowWrapper.java | 13 ------------- 1 file changed, 13 deletions(-) (limited to 'app/src') diff --git a/app/src/main/java/se/leap/bitmaskclient/LogWindowWrapper.java b/app/src/main/java/se/leap/bitmaskclient/LogWindowWrapper.java index 441eb28e..2476f6a4 100644 --- a/app/src/main/java/se/leap/bitmaskclient/LogWindowWrapper.java +++ b/app/src/main/java/se/leap/bitmaskclient/LogWindowWrapper.java @@ -9,7 +9,6 @@ public class LogWindowWrapper { private static String TAG = LogWindowWrapper.class.getName(); private Context context; - private String reason = ""; public LogWindowWrapper(Context context) { this.context = context; @@ -26,16 +25,4 @@ public class LogWindowWrapper { instance = new LogWindowWrapper(context); return instance; } - - public void clearReason() { - reason = ""; - } - - public void showedBecauseOf(String reason) { - this.reason = reason; - } - - public String reason() { - return reason; - } } -- cgit v1.2.3 From 449c3953ce79947554bbfd6ed0386d68aa9f04bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Wed, 22 Apr 2015 14:20:09 +0200 Subject: Avoid the check for a null provider. A provider can be asked if it's configured or not, so that we don't find more provider = null issues. I've created a DefaultedURL which links to https://example.net, so that we can initialize an URL. I use composition instead of inheritance, since URL class is final. --- .../se/leap/bitmaskclient/ConfigurationWizard.java | 8 ++--- .../main/java/se/leap/bitmaskclient/Dashboard.java | 13 ++++---- .../java/se/leap/bitmaskclient/DefaultedURL.java | 37 ++++++++++++++++++++++ .../main/java/se/leap/bitmaskclient/Provider.java | 33 ++++++++++++------- .../se/leap/bitmaskclient/ConfigurationWizard.java | 6 ++-- 5 files changed, 70 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/se/leap/bitmaskclient/DefaultedURL.java (limited to 'app/src') diff --git a/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java b/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java index aac53a07..6ab08a06 100644 --- a/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java +++ b/app/src/debug/java/se/leap/bitmaskclient/ConfigurationWizard.java @@ -97,8 +97,7 @@ public class ConfigurationWizard extends Activity outState.putInt(PROGRESSBAR_NUMBER, mProgressBar.getProgress()); if (progressbar_description != null) outState.putString(PROGRESSBAR_TEXT, progressbar_description.getText().toString()); - if (selected_provider != null) - outState.putParcelable(Provider.KEY, selected_provider); + outState.putParcelable(Provider.KEY, selected_provider); super.onSaveInstanceState(outState); } @@ -125,8 +124,7 @@ public class ConfigurationWizard extends Activity progress = savedInstanceState.getInt(PROGRESSBAR_NUMBER, -1); if (fragment_manager.findFragmentByTag(ProviderDetailFragment.TAG) == null && setting_up_provider) { - if (selected_provider != null) - onItemSelectedUi(); + onItemSelectedUi(); if (progress > 0) mProgressBar.setProgress(progress); } @@ -393,7 +391,7 @@ public class ConfigurationWizard extends Activity public void setUpProvider(boolean danger_on) { Intent provider_API_command = new Intent(this, ProviderAPI.class); Bundle parameters = new Bundle(); - parameters.putString(Provider.MAIN_URL, selected_provider.mainUrl().toString()); + parameters.putString(Provider.MAIN_URL, selected_provider.mainUrl().getUrl().toString()); parameters.putBoolean(ProviderItem.DANGER_ON, danger_on); parameters.putString(Provider.CA_CERT_FINGERPRINT, selected_provider.certificatePin()); diff --git a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java index 921bf95b..ddd03dbc 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java +++ b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java @@ -68,7 +68,7 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn ProgressBar user_session_status_progress_bar; EipFragment eip_fragment; - private Provider provider; + private Provider provider = new Provider(); private UserSessionStatus user_session_status; public ProviderAPIResultReceiver providerAPI_result_receiver; private boolean switching_provider; @@ -89,7 +89,7 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn User.init(); restoreProvider(savedInstanceState); - if (provider == null || provider.getName().isEmpty()) + if (!provider.isConfigured()) startActivityForResult(new Intent(this, ConfigurationWizard.class), CONFIGURE_LEAP); else { buildDashboard(getIntent().getBooleanExtra(ON_BOOT, false)); @@ -102,7 +102,7 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn if (savedInstanceState.containsKey(Provider.KEY)) provider = savedInstanceState.getParcelable(Provider.KEY); } - if (provider == null && preferences.getBoolean(Constants.PROVIDER_CONFIGURED, false)) + if (!provider.isConfigured() && preferences.getBoolean(Constants.PROVIDER_CONFIGURED, false)) provider = getSavedProviderFromSharedPreferences(); } @@ -116,8 +116,7 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn @Override protected void onSaveInstanceState(@NotNull Bundle outState) { - if (provider != null) - outState.putParcelable(Provider.KEY, provider); + outState.putParcelable(Provider.KEY, provider); if (user_session_status_text_view != null && user_session_status_text_view.getVisibility() == TextView.VISIBLE) outState.putSerializable(UserSessionStatus.TAG, user_session_status.sessionStatus()); @@ -125,9 +124,9 @@ public class Dashboard extends Activity implements SessionDialog.SessionDialogIn } private Provider getSavedProviderFromSharedPreferences() { - Provider provider = null; + Provider provider = new Provider(); try { - provider = new Provider(new URL(preferences.getString(Provider.MAIN_URL, ""))); + provider.setUrl(new URL(preferences.getString(Provider.MAIN_URL, ""))); provider.define(new JSONObject(preferences.getString(Provider.KEY, ""))); } catch (MalformedURLException | JSONException e) { e.printStackTrace(); diff --git a/app/src/main/java/se/leap/bitmaskclient/DefaultedURL.java b/app/src/main/java/se/leap/bitmaskclient/DefaultedURL.java new file mode 100644 index 00000000..8daa7d8c --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/DefaultedURL.java @@ -0,0 +1,37 @@ +package se.leap.bitmaskclient; + +import java.net.*; + +public class DefaultedURL { + private URL DEFAULT_URL; + private String default_url = "https://example.net"; + + private URL url; + + public DefaultedURL() { + try { + DEFAULT_URL = new URL(default_url); + url = DEFAULT_URL; + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + + public boolean isDefault() { return url.equals(DEFAULT_URL); } + + public void setUrl(URL url) { + this.url = url; + } + + public String getDomain() { + return url.getHost(); + } + + public URL getUrl() { + return url; + } + + public String toString() { + return url.toString(); + } +} diff --git a/app/src/main/java/se/leap/bitmaskclient/Provider.java b/app/src/main/java/se/leap/bitmaskclient/Provider.java index a030927d..a66d53e7 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Provider.java +++ b/app/src/main/java/se/leap/bitmaskclient/Provider.java @@ -30,8 +30,8 @@ import java.util.*; */ public final class Provider implements Parcelable { - private JSONObject definition; // Represents our Provider's provider.json - private URL main_url; + private JSONObject definition = new JSONObject(); // Represents our Provider's provider.json + private DefaultedURL main_url = new DefaultedURL(); private String certificate_pin = ""; final public static String @@ -59,12 +59,14 @@ public final class Provider implements Parcelable { private static final String API_TERM_DEFAULT_LANGUAGE = "default_language"; protected static final String[] API_EIP_TYPES = {"openvpn"}; + public Provider() { } + public Provider(URL main_url) { - this.main_url = main_url; + this.main_url.setUrl(main_url); } public Provider(URL main_url, String certificate_pin) { - this.main_url = main_url; + this.main_url.setUrl(main_url); this.certificate_pin = certificate_pin; } @@ -81,7 +83,7 @@ public final class Provider implements Parcelable { private Provider(Parcel in) { try { - main_url = new URL(in.readString()); + main_url.setUrl(new URL(in.readString())); String definition_string = in.readString(); if (!definition_string.isEmpty()) definition = new JSONObject((definition_string)); @@ -90,6 +92,14 @@ public final class Provider implements Parcelable { } } + public boolean isConfigured() { + return !main_url.isDefault() && definition.length() > 0; + } + + protected void setUrl(URL url) { + main_url.setUrl(url); + } + protected void define(JSONObject provider_json) { definition = provider_json; } @@ -99,10 +109,10 @@ public final class Provider implements Parcelable { } protected String getDomain() { - return main_url.getHost(); + return main_url.getDomain(); } - protected URL mainUrl() { + protected DefaultedURL mainUrl() { return main_url; } @@ -118,7 +128,7 @@ public final class Provider implements Parcelable { else throw new JSONException("Provider not defined"); } catch (JSONException e) { if (main_url != null) { - String host = main_url.getHost(); + String host = main_url.getDomain(); name = host.substring(0, host.indexOf(".")); } } @@ -181,7 +191,8 @@ public final class Provider implements Parcelable { @Override public void writeToParcel(Parcel parcel, int i) { - parcel.writeString(main_url.toString()); + if(main_url != null) + parcel.writeString(main_url.toString()); if (definition != null) parcel.writeString(definition.toString()); } @@ -190,7 +201,7 @@ public final class Provider implements Parcelable { public boolean equals(Object o) { if (o instanceof Provider) { Provider p = (Provider) o; - return p.mainUrl().getHost().equals(mainUrl().getHost()); + return p.mainUrl().getDomain().equals(mainUrl().getDomain()); } else return false; } @@ -206,6 +217,6 @@ public final class Provider implements Parcelable { @Override public int hashCode() { - return mainUrl().getHost().hashCode(); + return mainUrl().getDomain().hashCode(); } } diff --git a/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java b/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java index 68ff9e47..2742e1e9 100644 --- a/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java +++ b/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java @@ -98,8 +98,7 @@ public class ConfigurationWizard extends Activity outState.putInt(PROGRESSBAR_NUMBER, mProgressBar.getProgress()); if (progressbar_description != null) outState.putString(PROGRESSBAR_TEXT, progressbar_description.getText().toString()); - if (selected_provider != null) - outState.putParcelable(Provider.KEY, selected_provider); + outState.putParcelable(Provider.KEY, selected_provider); super.onSaveInstanceState(outState); } @@ -125,8 +124,7 @@ public class ConfigurationWizard extends Activity selected_provider = savedInstanceState.getParcelable(Provider.KEY); if (fragment_manager.findFragmentByTag(ProviderDetailFragment.TAG) == null && setting_up_provider) { - if (selected_provider != null) - onItemSelectedUi(); + onItemSelectedUi(); if (progress > 0) mProgressBar.setProgress(progress); } -- cgit v1.2.3 From acb5e7e33b554b236995926853eb9f1abcb7b6c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Wed, 22 Apr 2015 14:59:49 +0200 Subject: Tests for ConfigurationWizard pass I've done this because of https://leap.se/code/issues/6863#note-2, testing the previous commit's changes. --- .../java/se/leap/bitmaskclient/test/testConfigurationWizard.java | 6 ++++-- app/src/debug/java/se/leap/bitmaskclient/ProviderAPI.java | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'app/src') diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/test/testConfigurationWizard.java b/app/src/androidTest/java/se/leap/bitmaskclient/test/testConfigurationWizard.java index 1fa4cf2f..8db755dd 100644 --- a/app/src/androidTest/java/se/leap/bitmaskclient/test/testConfigurationWizard.java +++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/testConfigurationWizard.java @@ -1,5 +1,6 @@ package se.leap.bitmaskclient.test; +import android.app.Instrumentation; import android.test.*; import android.widget.*; @@ -27,12 +28,13 @@ public class testConfigurationWizard extends ActivityInstrumentationTestCase2 Date: Thu, 23 Apr 2015 16:41:03 +0200 Subject: Test to check that the vpn button is shown Fixed more tests, broken due to previous pullreqs... --- .../test/testConfigurationWizard.java | 1 - .../test/testDashboardIntegration.java | 69 ++++++++++------------ 2 files changed, 31 insertions(+), 39 deletions(-) (limited to 'app/src') diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/test/testConfigurationWizard.java b/app/src/androidTest/java/se/leap/bitmaskclient/test/testConfigurationWizard.java index 3a6cd754..ff32f5aa 100644 --- a/app/src/androidTest/java/se/leap/bitmaskclient/test/testConfigurationWizard.java +++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/testConfigurationWizard.java @@ -1,6 +1,5 @@ package se.leap.bitmaskclient.test; -import android.app.Instrumentation; import android.test.*; import android.widget.*; diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/test/testDashboardIntegration.java b/app/src/androidTest/java/se/leap/bitmaskclient/test/testDashboardIntegration.java index ee217e15..42cabea9 100644 --- a/app/src/androidTest/java/se/leap/bitmaskclient/test/testDashboardIntegration.java +++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/testDashboardIntegration.java @@ -1,9 +1,9 @@ package se.leap.bitmaskclient.test; import android.content.*; -import android.graphics.Rect; +import android.graphics.*; import android.test.*; -import android.view.View; +import android.view.*; import android.widget.*; import com.robotium.solo.*; @@ -11,6 +11,7 @@ import com.robotium.solo.*; import java.io.*; import de.blinkt.openvpn.activities.*; +import mbanje.kurt.fabbutton.FabButton; import se.leap.bitmaskclient.*; public class testDashboardIntegration extends ActivityInstrumentationTestCase2 { @@ -43,19 +44,19 @@ public class testDashboardIntegration extends ActivityInstrumentationTestCase2 Date: Thu, 23 Apr 2015 17:20:18 +0200 Subject: FlowLayout, to show the vpn icon in some small devices Tested with physical Galaxy Young S6310. --- .../res/layout-xlarge/eip_service_fragment.xml | 58 +++++++++------------- app/src/main/res/layout/eip_service_fragment.xml | 15 +++--- 2 files changed, 29 insertions(+), 44 deletions(-) (limited to 'app/src') diff --git a/app/src/main/res/layout-xlarge/eip_service_fragment.xml b/app/src/main/res/layout-xlarge/eip_service_fragment.xml index 38b6aca3..bfa1105c 100644 --- a/app/src/main/res/layout-xlarge/eip_service_fragment.xml +++ b/app/src/main/res/layout-xlarge/eip_service_fragment.xml @@ -3,54 +3,42 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" - android:layout_marginLeft="20dp" > + android:layout_marginLeft="20dp" + android:layout_marginStart="20dp"> - - - - - - + android:max="100" + fbb_autoStart="true" + fbb_progressColor="#ff170aff" + fbb_progressWidthRatio="0.1" + android:layout_toRightOf="@id/eipLabel" + android:layout_toEndOf="@id/eipLabel" + android:layout_alignTop="@id/eipLabel" + android:layout_marginStart="@dimen/add_button_margin" + android:layout_marginLeft="@dimen/add_button_margin" + /> diff --git a/app/src/main/res/layout/eip_service_fragment.xml b/app/src/main/res/layout/eip_service_fragment.xml index 4ad8725d..e013c7b4 100644 --- a/app/src/main/res/layout/eip_service_fragment.xml +++ b/app/src/main/res/layout/eip_service_fragment.xml @@ -1,16 +1,16 @@ - + android:layout_marginTop="10dp" + android:orientation="horizontal"> @@ -29,11 +29,8 @@ fbb_autoStart="true" fbb_progressColor="#ff170aff" fbb_progressWidthRatio="0.1" - android:layout_toRightOf="@id/eipLabel" - android:layout_toEndOf="@id/eipLabel" - android:layout_alignTop="@id/eipLabel" android:layout_marginStart="@dimen/add_button_margin" android:layout_marginLeft="@dimen/add_button_margin" /> - + -- cgit v1.2.3 From f349ab1a50d807afd49d8bef912438d64f6f6db8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Thu, 23 Apr 2015 18:36:36 +0200 Subject: Tests pay attention to the vpn icon to know status They were relying on status messages, but I've removed that TextView. --- .../test/testDashboardIntegration.java | 64 +++++++++++++++++----- 1 file changed, 49 insertions(+), 15 deletions(-) (limited to 'app/src') diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/test/testDashboardIntegration.java b/app/src/androidTest/java/se/leap/bitmaskclient/test/testDashboardIntegration.java index 42cabea9..68416b4a 100644 --- a/app/src/androidTest/java/se/leap/bitmaskclient/test/testDashboardIntegration.java +++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/testDashboardIntegration.java @@ -4,14 +4,15 @@ import android.content.*; import android.graphics.*; import android.test.*; import android.view.*; -import android.widget.*; import com.robotium.solo.*; import java.io.*; import de.blinkt.openvpn.activities.*; +import mbanje.kurt.fabbutton.CircleImageView; import mbanje.kurt.fabbutton.FabButton; +import mbanje.kurt.fabbutton.ProgressRingView; import se.leap.bitmaskclient.*; public class testDashboardIntegration extends ActivityInstrumentationTestCase2 { @@ -66,32 +67,61 @@ public class testDashboardIntegration extends ActivityInstrumentationTestCase2 Date: Mon, 27 Apr 2015 17:10:20 +0200 Subject: testEveryProvider also works --- .../test/testConfigurationWizard.java | 2 +- .../test/testDashboardIntegration.java | 45 +++++++++++----------- .../se/leap/bitmaskclient/ConfigurationWizard.java | 4 -- .../main/java/se/leap/bitmaskclient/Dashboard.java | 14 +++++-- .../java/se/leap/bitmaskclient/EipFragment.java | 34 ++++------------ app/src/main/res/values-es/strings.xml | 2 - app/src/main/res/values/strings.xml | 2 - .../se/leap/bitmaskclient/ConfigurationWizard.java | 4 -- 8 files changed, 41 insertions(+), 66 deletions(-) (limited to 'app/src') diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/test/testConfigurationWizard.java b/app/src/androidTest/java/se/leap/bitmaskclient/test/testConfigurationWizard.java index ff32f5aa..6d267e6e 100644 --- a/app/src/androidTest/java/se/leap/bitmaskclient/test/testConfigurationWizard.java +++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/testConfigurationWizard.java @@ -72,7 +72,7 @@ public class testConfigurationWizard extends ActivityInstrumentationTestCase2¿Abortar conexión? Hay una conexión iniciándose. ¿Quieres cancelarla? Para salvaguardar la privacidad de tu información personal, te recomendamos que después de apagar la VPN cierres la sesión del navegador y abras una sesión privada en él. Gracias. - - No "¡Conexión no protegida!" Conexión protegida. Parece que hay un problema con el proveedor. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bcfd3a2c..07bc4770 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -63,8 +63,6 @@ Cancel connection? There is a connection attempt in progress. Do you wish to cancel it? 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. - Yes - No "Not running! Connection not secure!" Connection Secure. It seems there is a problem with the provider. diff --git a/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java b/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java index 2742e1e9..eed9413b 100644 --- a/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java +++ b/app/src/release/java/se/leap/bitmaskclient/ConfigurationWizard.java @@ -193,8 +193,6 @@ public class ConfigurationWizard extends Activity mProgressBar.incrementProgressBy(1); hideProgressBar(); - setResult(RESULT_OK); - showProviderDetails(); } } else if (resultCode == ProviderAPI.PROVIDER_NOK) { @@ -211,8 +209,6 @@ public class ConfigurationWizard extends Activity hideProgressBar(); showProviderDetails(); - - setResult(RESULT_OK); } else if (resultCode == ProviderAPI.INCORRECTLY_DOWNLOADED_CERTIFICATE) { hideProgressBar(); -- cgit v1.2.3 From bd68fe662af7734d94a8853b38f418f19879e389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Mon, 27 Apr 2015 18:08:59 +0200 Subject: Added a button to the UI Turn on VPN touching that button, and leave the image as a mere indicator. --- .../test/testDashboardIntegration.java | 36 +++++++++++++--------- .../java/se/leap/bitmaskclient/EipFragment.java | 19 ++++++++++-- .../se/leap/bitmaskclient/eip/GatewaysManager.java | 1 + app/src/main/res/layout/eip_service_fragment.xml | 6 ++++ app/src/main/res/values-es/strings.xml | 3 +- app/src/main/res/values/strings.xml | 2 ++ 6 files changed, 49 insertions(+), 18 deletions(-) (limited to 'app/src') diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/test/testDashboardIntegration.java b/app/src/androidTest/java/se/leap/bitmaskclient/test/testDashboardIntegration.java index 06fe0a42..18d7b45d 100644 --- a/app/src/androidTest/java/se/leap/bitmaskclient/test/testDashboardIntegration.java +++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/testDashboardIntegration.java @@ -4,7 +4,7 @@ import android.content.*; import android.graphics.*; import android.test.*; import android.view.*; -import android.widget.Toast; +import android.widget.Button; import com.robotium.solo.*; @@ -46,19 +46,19 @@ public class testDashboardIntegration extends ActivityInstrumentationTestCase2 +