From e372ac10854b0eea594ddf98e843e4d67b5857ee Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Wed, 5 Feb 2014 20:32:25 +0000 Subject: [PATCH] Add detailed invalid URI messages --- res/values/strings.xml | 12 +++++++ .../fedorahosted/freeotp/MainActivity.java | 5 ++- src/org/fedorahosted/freeotp/Token.java | 34 +++++++++++++------ 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 3fda9b6..fb2a288 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -35,6 +35,18 @@ <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache 2.0</a> Error while opening camera! + No scheme provided + No authority provided + No path provided + No algorithm provided + Invalid scheme + Invalid authority + Invalid path + Invalid digits + Invalid number + Invalid counter + Invalid period + Invalid secret %d token selected diff --git a/src/org/fedorahosted/freeotp/MainActivity.java b/src/org/fedorahosted/freeotp/MainActivity.java index 0a65fc4..be77fb0 100644 --- a/src/org/fedorahosted/freeotp/MainActivity.java +++ b/src/org/fedorahosted/freeotp/MainActivity.java @@ -110,7 +110,10 @@ public class MainActivity extends Activity implements OnMenuItemClickListener { try { mTokenAdapter.add(uri); } catch (TokenUriInvalidException e) { - Toast.makeText(this, R.string.invalid_token, Toast.LENGTH_SHORT).show(); + String text = getString(R.string.invalid_token); + if (e.getErrorResourceID() != 0) + text = text + "\n" + getString(e.getErrorResourceID()); + Toast.makeText(this, text, Toast.LENGTH_LONG).show(); e.printStackTrace(); } } diff --git a/src/org/fedorahosted/freeotp/Token.java b/src/org/fedorahosted/freeotp/Token.java index 43342b1..0e111e2 100644 --- a/src/org/fedorahosted/freeotp/Token.java +++ b/src/org/fedorahosted/freeotp/Token.java @@ -28,6 +28,7 @@ import java.util.Locale; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; +import android.content.res.Resources; import android.net.Uri; import com.google.android.apps.authenticator.Base32String; @@ -36,6 +37,13 @@ import com.google.android.apps.authenticator.Base32String.DecodingException; public class Token { public static class TokenUriInvalidException extends Exception { private static final long serialVersionUID = -1108624734612362345L; + private static int errorResourceID = 0; + public TokenUriInvalidException(int id) { + this.errorResourceID = id; + } + public int getErrorResourceID() { + return this.errorResourceID; + } } public static enum TokenType { @@ -58,24 +66,28 @@ public class Token { String authority = uri.getAuthority(); String path = uri.getPath(); - if (scheme == null || authority == null || path == null) - throw new TokenUriInvalidException(); + if (scheme == null) + throw new TokenUriInvalidException(R.string.error_no_scheme); + if (authority == null) + throw new TokenUriInvalidException(R.string.error_no_authority); + if (path == null) + throw new TokenUriInvalidException(R.string.error_no_path); if (!scheme.equals("otpauth")) - throw new TokenUriInvalidException(); + throw new TokenUriInvalidException(R.string.error_invalid_scheme); if (authority.equals("totp")) mType = TokenType.TOTP; else if (authority.equals("hotp")) mType = TokenType.HOTP; else - throw new TokenUriInvalidException(); + throw new TokenUriInvalidException(R.string.error_invalid_authority); // Strip the path of its leading '/' for (int i = 0; path.charAt(i) == '/'; i++) path = path.substring(1); if (path.length() == 0) - throw new TokenUriInvalidException(); + throw new TokenUriInvalidException(R.string.error_invalid_path); int i = path.indexOf(':'); mIssuerExt = i < 0 ? "" : path.substring(0, i); @@ -89,7 +101,7 @@ public class Token { try { Mac.getInstance("Hmac" + mAlgorithm); } catch (NoSuchAlgorithmException e1) { - throw new TokenUriInvalidException(); + throw new TokenUriInvalidException(R.string.error_no_algorithm); } try { @@ -98,9 +110,9 @@ public class Token { d = "6"; mDigits = Integer.parseInt(d); if (mDigits != 6 && mDigits != 8) - throw new TokenUriInvalidException(); + throw new TokenUriInvalidException(R.string.error_invalid_digits); } catch (NumberFormatException e) { - throw new TokenUriInvalidException(); + throw new TokenUriInvalidException(R.string.error_invalid_number); } switch (mType) { @@ -111,7 +123,7 @@ public class Token { c = "0"; mCounter = Long.parseLong(c) - 1; } catch (NumberFormatException e) { - throw new TokenUriInvalidException(); + throw new TokenUriInvalidException(R.string.error_invalid_counter); } break; case TOTP: @@ -121,7 +133,7 @@ public class Token { p = "30"; mPeriod = Integer.parseInt(p); } catch (NumberFormatException e) { - throw new TokenUriInvalidException(); + throw new TokenUriInvalidException(R.string.error_invalid_period); } break; } @@ -130,7 +142,7 @@ public class Token { String s = uri.getQueryParameter("secret"); mSecret = Base32String.decode(s); } catch (DecodingException e) { - throw new TokenUriInvalidException(); + throw new TokenUriInvalidException(R.string.error_invalid_secret); } } -- 2.43.2