Tighten up detection of URLs on some garbage strings
authorsrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Tue, 22 Dec 2009 18:30:09 +0000 (18:30 +0000)
committersrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Tue, 22 Dec 2009 18:30:09 +0000 (18:30 +0000)
git-svn-id: http://zxing.googlecode.com/svn/trunk@1167 59b500cc-1b3d-0410-9834-0bbf25fbcc57

core/src/com/google/zxing/client/result/URIResultParser.java
core/test/src/com/google/zxing/client/result/AddressBookParsedResultTestCase.java
core/test/src/com/google/zxing/client/result/CalendarParsedResultTestCase.java
core/test/src/com/google/zxing/client/result/EmailAddressParsedResultTestCase.java
core/test/src/com/google/zxing/client/result/GeoParsedResultTestCase.java
core/test/src/com/google/zxing/client/result/ISBNParsedResultTestCase.java
core/test/src/com/google/zxing/client/result/ParsedReaderResultTestCase.java
core/test/src/com/google/zxing/client/result/ProductParsedResultTestCase.java
core/test/src/com/google/zxing/client/result/SMSMMSParsedResultTestCase.java
core/test/src/com/google/zxing/client/result/TelParsedResultTestCase.java
core/test/src/com/google/zxing/client/result/URIParsedResultTestCase.java

index 6330728..5b2c24b 100644 (file)
@@ -46,13 +46,42 @@ final class URIResultParser extends ResultParser {
    * need to know when a string is obviously not a URI.
    */
   static boolean isBasicallyValidURI(String uri) {
-
     if (uri == null || uri.indexOf(' ') >= 0 || uri.indexOf('\n') >= 0) {
       return false;
     }
-    int period = uri.indexOf('.');
     // Look for period in a domain but followed by at least a two-char TLD
-    return period < uri.length() - 2 && (period >= 0 || uri.indexOf(':') >= 0);
+    // Forget strings that don't have a valid-looking protocol
+    int period = uri.indexOf('.');
+    if (period >= uri.length() - 2) {
+      return false;
+    }
+    int colon = uri.indexOf(':');
+    if (period < 0 && colon < 0) {
+      return false;
+    }
+    if (colon >= 0) {
+      if (period < 0 || period > colon) {
+        // colon ends the protocol
+        for (int i = 0; i < colon; i++) {
+          char c = uri.charAt(i);
+          if ((c < 'a' || c > 'z') && (c < 'A' || c > 'Z')) {
+            return false;
+          }
+        }
+      } else {
+        // colon starts the port; crudely look for at least two numbers
+        if (colon >= uri.length() - 2) {
+          return false;
+        }
+        for (int i = colon + 1; i < colon + 3; i++) {
+          char c = uri.charAt(i);
+          if (c < '0' || c > '9') {
+            return false;
+          }
+        }
+      }
+    }
+    return true;
   }
 
 }
\ No newline at end of file
index bd23ebc..9c2ecaa 100644 (file)
@@ -73,7 +73,7 @@ public final class AddressBookParsedResultTestCase extends TestCase {
                              String note) {
     Result fakeResult = new Result(contents, null, null, BarcodeFormat.QR_CODE);
     ParsedResult result = ResultParser.parseResult(fakeResult);
-    assertEquals(ParsedResultType.ADDRESSBOOK, result.getType());
+    assertSame(ParsedResultType.ADDRESSBOOK, result.getType());
     AddressBookParsedResult addressResult = (AddressBookParsedResult) result;
     assertEquals(title, addressResult.getTitle());
     assertTrue(Arrays.equals(names, addressResult.getNames()));
index 4054ab0..d44c340 100644 (file)
@@ -43,7 +43,7 @@ public final class CalendarParsedResultTestCase extends TestCase {
                              String attendee) {
     Result fakeResult = new Result(contents, null, null, BarcodeFormat.QR_CODE);
     ParsedResult result = ResultParser.parseResult(fakeResult);
-    assertEquals(ParsedResultType.CALENDAR, result.getType());
+    assertSame(ParsedResultType.CALENDAR, result.getType());
     CalendarParsedResult calResult = (CalendarParsedResult) result;
     assertEquals(title, calResult.getTitle());
     assertEquals(summary, calResult.getSummary());
index dfb37c4..152d1c0 100644 (file)
@@ -42,7 +42,7 @@ public final class EmailAddressParsedResultTestCase extends TestCase {
   private static void doTest(String contents, String email, String subject, String body) {
     Result fakeResult = new Result(contents, null, null, BarcodeFormat.QR_CODE);
     ParsedResult result = ResultParser.parseResult(fakeResult);
-    assertEquals(ParsedResultType.EMAIL_ADDRESS, result.getType());
+    assertSame(ParsedResultType.EMAIL_ADDRESS, result.getType());
     EmailAddressParsedResult emailResult = (EmailAddressParsedResult) result;
     assertEquals(email, emailResult.getEmailAddress());
     assertEquals("mailto:" + email, emailResult.getMailtoURI());
index d40e0f5..292da83 100644 (file)
@@ -35,7 +35,7 @@ public final class GeoParsedResultTestCase extends TestCase {
   private static void doTest(String contents, double latitude, double longitude, double altitude) {
     Result fakeResult = new Result(contents, null, null, BarcodeFormat.QR_CODE);
     ParsedResult result = ResultParser.parseResult(fakeResult);
-    assertEquals(ParsedResultType.GEO, result.getType());
+    assertSame(ParsedResultType.GEO, result.getType());
     GeoParsedResult geoResult = (GeoParsedResult) result;
     assertEquals(latitude, geoResult.getLatitude());
     assertEquals(longitude, geoResult.getLongitude());
index 6376340..8a25849 100644 (file)
@@ -34,7 +34,7 @@ public final class ISBNParsedResultTestCase extends TestCase {
   private static void doTest(String contents) {
     Result fakeResult = new Result(contents, null, null, BarcodeFormat.EAN_13);
     ParsedResult result = ResultParser.parseResult(fakeResult);
-    assertEquals(ParsedResultType.ISBN, result.getType());
+    assertSame(ParsedResultType.ISBN, result.getType());
     ISBNParsedResult isbnResult = (ISBNParsedResult) result;
     assertEquals(contents, isbnResult.getISBN());
   }
index 5141bb8..ae7ccf9 100644 (file)
@@ -295,20 +295,10 @@ public final class ParsedReaderResultTestCase extends TestCase {
     Result fakeResult = new Result(contents, null, null, format);
     ParsedResult result = ResultParser.parseResult(fakeResult);
     assertNotNull(result);
-    assertEquals(type, result.getType());
+    assertSame(type, result.getType());
 
     String displayResult = result.getDisplayResult();
-    assertTrue("Expected:\n" + goldenResult + "\nbut got:\n" + displayResult,
-        goldenResult.equals(displayResult));
+    assertEquals(goldenResult, displayResult);
   }
 
-  /*
-  private static void doTestResult(byte[] rawBytes, ParsedResultType type) {
-    Result fakeResult = new Result(null, rawBytes, null, null);
-    ParsedResult result = ResultParser.parseResult(fakeResult);
-    assertNotNull(result);
-    assertEquals(type, result.getType());
-  }
-   */
-
 }
\ No newline at end of file
index 07f8541..36a95cd 100644 (file)
@@ -37,7 +37,7 @@ public final class ProductParsedResultTestCase extends TestCase {
   private static void doTest(String contents, String normalized, BarcodeFormat format) {
     Result fakeResult = new Result(contents, null, null, format);
     ParsedResult result = ResultParser.parseResult(fakeResult);
-    assertEquals(ParsedResultType.PRODUCT, result.getType());
+    assertSame(ParsedResultType.PRODUCT, result.getType());
     ProductParsedResult productResult = (ProductParsedResult) result;
     assertEquals(contents, productResult.getProductID());
     assertEquals(normalized, productResult.getNormalizedProductID());
index 9af3ec5..663bfa4 100644 (file)
@@ -42,7 +42,7 @@ public final class SMSMMSParsedResultTestCase extends TestCase {
   private static void doTest(String contents, String number, String subject, String body, String via) {
     Result fakeResult = new Result(contents, null, null, BarcodeFormat.QR_CODE);
     ParsedResult result = ResultParser.parseResult(fakeResult);
-    assertEquals(ParsedResultType.SMS, result.getType());
+    assertSame(ParsedResultType.SMS, result.getType());
     SMSParsedResult smsResult = (SMSParsedResult) result;
     assertEquals(number, smsResult.getNumber());
     assertEquals(subject, smsResult.getSubject());
index 3a219f1..9e11098 100644 (file)
@@ -35,7 +35,7 @@ public final class TelParsedResultTestCase extends TestCase {
   private static void doTest(String contents, String number, String title) {
     Result fakeResult = new Result(contents, null, null, BarcodeFormat.QR_CODE);
     ParsedResult result = ResultParser.parseResult(fakeResult);
-    assertEquals(ParsedResultType.TEL, result.getType());
+    assertSame(ParsedResultType.TEL, result.getType());
     TelParsedResult telResult = (TelParsedResult) result;
     assertEquals(number, telResult.getNumber());
     assertEquals(title, telResult.getTitle());
index 3da39c1..d35cec2 100644 (file)
@@ -49,6 +49,14 @@ public final class URIParsedResultTestCase extends TestCase {
     doTest("urlto:foo:bar.com", "http://bar.com", "foo");
   }
 
+  public void testGarbage() {
+    String text = "Da65cV1g^>%^f0bAbPn1CJB6lV7ZY8hs0Sm:DXU0cd]GyEeWBz8]bUHLB";
+    Result fakeResult = new Result(text, null, null, BarcodeFormat.QR_CODE);
+    ParsedResult result = ResultParser.parseResult(fakeResult);
+    assertSame(ParsedResultType.TEXT, result.getType());
+    assertEquals(text, result.getDisplayResult());
+  }
+
   public void testIsPossiblyMalicious() {
     doTestIsPossiblyMalicious("http://google.com", false);
     doTestIsPossiblyMalicious("http://google.com@evil.com", true);
@@ -61,7 +69,7 @@ public final class URIParsedResultTestCase extends TestCase {
   private static void doTest(String contents, String uri, String title) {
     Result fakeResult = new Result(contents, null, null, BarcodeFormat.QR_CODE);
     ParsedResult result = ResultParser.parseResult(fakeResult);
-    assertEquals(ParsedResultType.URI, result.getType());
+    assertSame(ParsedResultType.URI, result.getType());
     URIParsedResult uriResult = (URIParsedResult) result;
     assertEquals(uri, uriResult.getURI());
     assertEquals(title, uriResult.getTitle());