From 415c9257d633d432c81b41dd125f9006899dffb2 Mon Sep 17 00:00:00 2001 From: srowen Date: Fri, 6 Mar 2009 15:17:38 +0000 Subject: [PATCH] Fix #150 again by moving towards a more RFC 2822-compliant definition of valid syntax git-svn-id: https://zxing.googlecode.com/svn/trunk@872 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- .../result/EmailDoCoMoResultParser.java | 27 +++++++++++++------ .../result/ParsedReaderResultTestCase.java | 2 +- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/core/src/com/google/zxing/client/result/EmailDoCoMoResultParser.java b/core/src/com/google/zxing/client/result/EmailDoCoMoResultParser.java index 94ebb0202..b4eb70edd 100644 --- a/core/src/com/google/zxing/client/result/EmailDoCoMoResultParser.java +++ b/core/src/com/google/zxing/client/result/EmailDoCoMoResultParser.java @@ -27,6 +27,9 @@ import com.google.zxing.Result; */ final class EmailDoCoMoResultParser extends AbstractDoCoMoResultParser { + private static final char[] ATEXT_SYMBOLS = + {'@','.','!','#','$','%','&','\'','*','+','-','/','=','?','^','_','`','{','|','}','~'}; + public static EmailAddressParsedResult parse(Result result) { String rawText = result.getText(); if (rawText == null || !rawText.startsWith("MATMSG:")) { @@ -47,8 +50,8 @@ final class EmailDoCoMoResultParser extends AbstractDoCoMoResultParser { /** * This implements only the most basic checking for an email address's validity -- that it contains - * an '@' and a '.', and that it contains no space or LF. - * We want to generally be lenient here since this class is only intended to encapsulate what's + * an '@' contains no characters disallowed by RFC 2822. This is an overly lenient definition of + * validity. We want to generally be lenient here since this class is only intended to encapsulate what's * in a barcode, not "judge" it. */ static boolean isBasicallyValidEmailAddress(String email) { @@ -56,21 +59,29 @@ final class EmailDoCoMoResultParser extends AbstractDoCoMoResultParser { return false; } boolean atFound = false; - boolean periodFound = false; for (int i = 0; i < email.length(); i++) { char c = email.charAt(i); + if ((c < 'a' || c > 'z') && (c < 'A' || c > 'Z') && (c < '0' || c > '9') && + !isAtextSymbol(c)) { + return false; + } if (c == '@') { if (atFound) { return false; } atFound = true; - } else if (c == '.') { - periodFound = true; - } else if (c == ' ' || c == '\n') { - return false; } } - return atFound && periodFound; + return atFound; + } + + private static boolean isAtextSymbol(char c) { + for (int i = 0; i < ATEXT_SYMBOLS.length; i++) { + if (c == ATEXT_SYMBOLS[i]) { + return true; + } + } + return false; } } \ No newline at end of file diff --git a/core/test/src/com/google/zxing/client/result/ParsedReaderResultTestCase.java b/core/test/src/com/google/zxing/client/result/ParsedReaderResultTestCase.java index eef5816da..125c6a52c 100644 --- a/core/test/src/com/google/zxing/client/result/ParsedReaderResultTestCase.java +++ b/core/test/src/com/google/zxing/client/result/ParsedReaderResultTestCase.java @@ -73,7 +73,7 @@ public final class ParsedReaderResultTestCase extends TestCase { doTestResult("srowen@example.org", "srowen@example.org", ParsedResultType.EMAIL_ADDRESS); doTestResult("mailto:srowen@example.org", "srowen@example.org", ParsedResultType.EMAIL_ADDRESS); doTestResult("MAILTO:srowen@example.org", "srowen@example.org", ParsedResultType.EMAIL_ADDRESS); - doTestResult("srowen@example", "srowen@example", ParsedResultType.TEXT); + doTestResult("srowen@example", "srowen@example", ParsedResultType.EMAIL_ADDRESS); doTestResult("srowen", "srowen", ParsedResultType.TEXT); doTestResult("Let's meet @ 2", "Let's meet @ 2", ParsedResultType.TEXT); }