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
This commit is contained in:
srowen 2009-03-06 15:17:38 +00:00
parent 83f6b96f82
commit 415c9257d6
2 changed files with 20 additions and 9 deletions

View file

@ -27,6 +27,9 @@ import com.google.zxing.Result;
*/ */
final class EmailDoCoMoResultParser extends AbstractDoCoMoResultParser { final class EmailDoCoMoResultParser extends AbstractDoCoMoResultParser {
private static final char[] ATEXT_SYMBOLS =
{'@','.','!','#','$','%','&','\'','*','+','-','/','=','?','^','_','`','{','|','}','~'};
public static EmailAddressParsedResult parse(Result result) { public static EmailAddressParsedResult parse(Result result) {
String rawText = result.getText(); String rawText = result.getText();
if (rawText == null || !rawText.startsWith("MATMSG:")) { 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 * 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. * an '@' contains no characters disallowed by RFC 2822. This is an overly lenient definition of
* We want to generally be lenient here since this class is only intended to encapsulate what's * validity. We want to generally be lenient here since this class is only intended to encapsulate what's
* in a barcode, not "judge" it. * in a barcode, not "judge" it.
*/ */
static boolean isBasicallyValidEmailAddress(String email) { static boolean isBasicallyValidEmailAddress(String email) {
@ -56,21 +59,29 @@ final class EmailDoCoMoResultParser extends AbstractDoCoMoResultParser {
return false; return false;
} }
boolean atFound = false; boolean atFound = false;
boolean periodFound = false;
for (int i = 0; i < email.length(); i++) { for (int i = 0; i < email.length(); i++) {
char c = email.charAt(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 (c == '@') {
if (atFound) { if (atFound) {
return false; return false;
} }
atFound = true; 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;
} }
} }

View file

@ -73,7 +73,7 @@ public final class ParsedReaderResultTestCase extends TestCase {
doTestResult("srowen@example.org", "srowen@example.org", ParsedResultType.EMAIL_ADDRESS); 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("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("srowen", "srowen", ParsedResultType.TEXT);
doTestResult("Let's meet @ 2", "Let's meet @ 2", ParsedResultType.TEXT); doTestResult("Let's meet @ 2", "Let's meet @ 2", ParsedResultType.TEXT);
} }