From: Tobias Brunner Date: Tue, 17 Jan 2017 10:14:33 +0000 (+0100) Subject: android: Handle errors when fetching profile in more detail X-Git-Tag: 5.5.2dr5~52^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c79af8c38446addbfd9148530dd8a8d65de4286;p=thirdparty%2Fstrongswan.git android: Handle errors when fetching profile in more detail --- diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileImportActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileImportActivity.java index 1ed6e08343..1b6b6e896e 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileImportActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileImportActivity.java @@ -61,6 +61,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.net.UnknownHostException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; @@ -69,6 +70,8 @@ import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.UUID; +import javax.net.ssl.SSLHandshakeException; + public class VpnProfileImportActivity extends AppCompatActivity { private static final String PKCS12_INSTALLED = "PKCS12_INSTALLED"; @@ -99,22 +102,22 @@ public class VpnProfileImportActivity extends AppCompatActivity private ViewGroup mRemoteCertificate; private RelativeLayout mRemoteCert; - private LoaderManager.LoaderCallbacks mProfileLoaderCallbacks = new LoaderManager.LoaderCallbacks() + private LoaderManager.LoaderCallbacks mProfileLoaderCallbacks = new LoaderManager.LoaderCallbacks() { @Override - public Loader onCreateLoader(int id, Bundle args) + public Loader onCreateLoader(int id, Bundle args) { return new ProfileLoader(VpnProfileImportActivity.this, getIntent().getData()); } @Override - public void onLoadFinished(Loader loader, String data) + public void onLoadFinished(Loader loader, ProfileLoadResult data) { handleProfile(data); } @Override - public void onLoaderReset(Loader loader) + public void onLoaderReset(Loader loader) { } @@ -279,16 +282,16 @@ public class VpnProfileImportActivity extends AppCompatActivity } } - public void handleProfile(String data) + public void handleProfile(ProfileLoadResult data) { mProgress.dismiss(); mProfile = null; - if (data != null) + if (data != null && data.ThrownException == null) { try { - JSONObject obj = new JSONObject(data); + JSONObject obj = new JSONObject(data.Profile); mProfile = parseProfile(obj); } catch (JSONException e) @@ -302,7 +305,38 @@ public class VpnProfileImportActivity extends AppCompatActivity } if (mProfile == null) { - Toast.makeText(this, R.string.profile_import_failed, Toast.LENGTH_LONG).show(); + String error = null; + if (data.ThrownException != null) + { + try + { + throw data.ThrownException; + } + catch (FileNotFoundException e) + { + error = getString(R.string.profile_import_failed_not_found); + } + catch (UnknownHostException e) + { + error = getString(R.string.profile_import_failed_host); + } + catch (SSLHandshakeException e) + { + error = getString(R.string.profile_import_failed_tls); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + if (error != null) + { + Toast.makeText(this, getString(R.string.profile_import_failed_detail, error), Toast.LENGTH_LONG).show(); + } + else + { + Toast.makeText(this, R.string.profile_import_failed, Toast.LENGTH_LONG).show(); + } finish(); return; } @@ -529,10 +563,10 @@ public class VpnProfileImportActivity extends AppCompatActivity /** * Load the JSON-encoded VPN profile from the given URI */ - private static class ProfileLoader extends AsyncTaskLoader + private static class ProfileLoader extends AsyncTaskLoader { private final Uri mUri; - private String mData; + private ProfileLoadResult mData; public ProfileLoader(Context context, Uri uri) { @@ -541,8 +575,9 @@ public class VpnProfileImportActivity extends AppCompatActivity } @Override - public String loadInBackground() + public ProfileLoadResult loadInBackground() { + ProfileLoadResult result = new ProfileLoadResult(); InputStream in = null; if (ContentResolver.SCHEME_CONTENT.equals(mUri.getScheme()) || @@ -554,7 +589,7 @@ public class VpnProfileImportActivity extends AppCompatActivity } catch (FileNotFoundException e) { - e.printStackTrace(); + result.ThrownException = e; } } else @@ -566,14 +601,14 @@ public class VpnProfileImportActivity extends AppCompatActivity } catch (IOException e) { - e.printStackTrace(); + result.ThrownException = e; } } if (in != null) { - return streamToString(in); + result.Profile = streamToString(in); } - return null; + return result; } @Override @@ -590,7 +625,7 @@ public class VpnProfileImportActivity extends AppCompatActivity } @Override - public void deliverResult(String data) + public void deliverResult(ProfileLoadResult data) { if (isReset()) { @@ -633,6 +668,12 @@ public class VpnProfileImportActivity extends AppCompatActivity } } + private static class ProfileLoadResult + { + public String Profile; + public Exception ThrownException; + } + /** * Ask the user to select an available certificate. */ diff --git a/src/frontends/android/app/src/main/res/values-de/strings.xml b/src/frontends/android/app/src/main/res/values-de/strings.xml index 383fd24d61..0bb73cb1e4 100644 --- a/src/frontends/android/app/src/main/res/values-de/strings.xml +++ b/src/frontends/android/app/src/main/res/values-de/strings.xml @@ -84,6 +84,10 @@ Blockiere IPv6 Verkehr der nicht für das VPN bestimmt ist VPN Profile importieren VPN Profil-Import fehlgeschlagen + VPN Profil-Import fehlgeschlagen: %1$s + Datei nicht gefunden + Host unbekannt + TLS-Handshake fehlgeschlagen Dieses VPN Profil existiert bereits, die bestehenden Einstellungen werden ersetzt. Zertifikat aus VPN Profil importieren Zertifikat für \"%1$s\" diff --git a/src/frontends/android/app/src/main/res/values-pl/strings.xml b/src/frontends/android/app/src/main/res/values-pl/strings.xml index c2b2184504..bf08b8ee1d 100644 --- a/src/frontends/android/app/src/main/res/values-pl/strings.xml +++ b/src/frontends/android/app/src/main/res/values-pl/strings.xml @@ -84,6 +84,10 @@ Block IPv6 traffic not destined for the VPN Import VPN profile Failed to import VPN profile + Failed to import VPN profile: %1$s + File not found + Host unknown + TLS handshake failed This VPN profile already exists, its current settings will be replaced. Import certificate from VPN profile Certificate for \"%1$s\" diff --git a/src/frontends/android/app/src/main/res/values-ru/strings.xml b/src/frontends/android/app/src/main/res/values-ru/strings.xml index e165aab76f..03ee02670a 100644 --- a/src/frontends/android/app/src/main/res/values-ru/strings.xml +++ b/src/frontends/android/app/src/main/res/values-ru/strings.xml @@ -81,6 +81,10 @@ Block IPv6 traffic not destined for the VPN Import VPN profile Failed to import VPN profile + Failed to import VPN profile: %1$s + File not found + Host unknown + TLS handshake failed This VPN profile already exists, its current settings will be replaced. Import certificate from VPN profile Certificate for \"%1$s\" diff --git a/src/frontends/android/app/src/main/res/values-ua/strings.xml b/src/frontends/android/app/src/main/res/values-ua/strings.xml index c548069d85..07c726a960 100644 --- a/src/frontends/android/app/src/main/res/values-ua/strings.xml +++ b/src/frontends/android/app/src/main/res/values-ua/strings.xml @@ -82,6 +82,10 @@ Block IPv6 traffic not destined for the VPN Import VPN profile Failed to import VPN profile + Failed to import VPN profile: %1$s + File not found + Host unknown + TLS handshake failed This VPN profile already exists, its current settings will be replaced. Import certificate from VPN profile Certificate for \"%1$s\" diff --git a/src/frontends/android/app/src/main/res/values/strings.xml b/src/frontends/android/app/src/main/res/values/strings.xml index ddca469d82..8d74e45442 100644 --- a/src/frontends/android/app/src/main/res/values/strings.xml +++ b/src/frontends/android/app/src/main/res/values/strings.xml @@ -84,6 +84,10 @@ Block IPv6 traffic not destined for the VPN Import VPN profile Failed to import VPN profile + Failed to import VPN profile: %1$s + File not found + Host unknown + TLS handshake failed This VPN profile already exists, its current settings will be replaced. Import certificate from VPN profile Certificate for \"%1$s\"