You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mime4j-dev@james.apache.org by ol...@apache.org on 2011/11/22 09:29:30 UTC

svn commit: r1204855 - in /james/mime4j/trunk/dom/src: main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.java test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.java

Author: olegk
Date: Tue Nov 22 08:29:29 2011
New Revision: 1204855

URL: http://svn.apache.org/viewvc?rev=1204855&view=rev
Log:
MIME4J-207: IndexOutOfBoundsException while parsing email address with a leading 'at' character

Modified:
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.java
    james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.java

Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.java?rev=1204855&r1=1204854&r2=1204855&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.java Tue Nov 22 08:29:29 2011
@@ -50,7 +50,6 @@ public class LenientAddressBuilder {
 
     private static final BitSet AT_AND_CLOSING_BRACKET = RawFieldParser.INIT_BITSET(AT, CLOSING_BRACKET);
     private static final BitSet CLOSING_BRACKET_ONLY   = RawFieldParser.INIT_BITSET(CLOSING_BRACKET);
-    private static final BitSet COMMA_AND_COLON        = RawFieldParser.INIT_BITSET(COMMA, COLON);
     private static final BitSet COMMA_ONLY             = RawFieldParser.INIT_BITSET(COMMA);
     private static final BitSet COLON_ONLY             = RawFieldParser.INIT_BITSET(COLON);
     private static final BitSet SEMICOLON_ONLY         = RawFieldParser.INIT_BITSET(SEMICOLON);
@@ -81,10 +80,17 @@ public class LenientAddressBuilder {
         return dst.toString();
     }
 
-    DomainList parseRoute(final ByteSequence buf, final ParserCursor cursor) {
+    DomainList parseRoute(final ByteSequence buf, final ParserCursor cursor, final BitSet delimiters) {
+        BitSet bitset = RawFieldParser.INIT_BITSET(COMMA, COLON);
+        if (delimiters != null) {
+            bitset.or(delimiters);
+        }
         List<String> domains = null;
-        while (!cursor.atEnd()) {
+        for (;;) {
             this.parser.skipAllWhiteSpace(buf, cursor);
+            if (cursor.atEnd()) {
+                break;
+            }
             int pos = cursor.getPos();
             int current = (char) (buf.byteAt(pos) & 0xff);
             if (current == AT) {
@@ -92,13 +98,16 @@ public class LenientAddressBuilder {
             } else {
                 break;
             }
-            String s = parseDomain(buf, cursor, COMMA_AND_COLON);
+            String s = parseDomain(buf, cursor, bitset);
             if (s != null && s.length() > 0) {
                 if (domains == null) {
                     domains = new ArrayList<String>();
                 }
                 domains.add(s);
             }
+            if (cursor.atEnd()) {
+                break;
+            }
             pos = cursor.getPos();
             current = (char) (buf.byteAt(pos) & 0xff);
             if (current == COMMA) {
@@ -126,7 +135,7 @@ public class LenientAddressBuilder {
         } else {
             return new Mailbox(null, null, openingText, null);
         }
-        DomainList domainList = parseRoute(buf, cursor);
+        DomainList domainList = parseRoute(buf, cursor, CLOSING_BRACKET_ONLY);
         String localPart = this.parser.parseValue(buf, cursor, AT_AND_CLOSING_BRACKET);
         if (cursor.atEnd()) {
             return new Mailbox(openingText, domainList, localPart, null);

Modified: james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.java?rev=1204855&r1=1204854&r2=1204855&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.java (original)
+++ james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.java Tue Nov 22 08:29:29 2011
@@ -122,7 +122,7 @@ public class LenientAddressBuilderTest e
         ByteSequence raw = ContentUtil.encode(s);
         ParserCursor cursor = new ParserCursor(0, s.length());
 
-        DomainList route = parser.parseRoute(raw, cursor);
+        DomainList route = parser.parseRoute(raw, cursor, null);
         assertNotNull(route);
         assertEquals(3, route.size());
         assertEquals("a", route.get(0));
@@ -131,12 +131,26 @@ public class LenientAddressBuilderTest e
         assertEquals('m', raw.byteAt(cursor.getPos()));
     }
 
+    public void testParseAddressStartingWithAt() throws Exception {
+        String s = "<@s...@somehost.com>";
+        ByteSequence raw = ContentUtil.encode(s);
+        ParserCursor cursor = new ParserCursor(0, s.length());
+
+        Mailbox mailbox = parser.parseMailboxAddress(null, raw, cursor);
+        assertEquals("", mailbox.getLocalPart());
+        assertEquals(null, mailbox.getDomain());
+        DomainList route = mailbox.getRoute();
+        assertNotNull(route);
+        assertEquals(1, route.size());
+        assertEquals("somehost.com@somehost.com", route.get(0));
+    }
+    
     public void testParseNoRoute() throws Exception {
         String s = "stuff";
         ByteSequence raw = ContentUtil.encode(s);
         ParserCursor cursor = new ParserCursor(0, s.length());
 
-        DomainList route = parser.parseRoute(raw, cursor);
+        DomainList route = parser.parseRoute(raw, cursor, null);
         assertNull(route);
     }