You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by gn...@apache.org on 2009/03/12 21:34:18 UTC

svn commit: r753004 - in /geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src: main/java/org/apache/geronimo/javamail/store/imap/connection/ test/java/org/apache/geronimo/javamail/store/imap/connection/ test/resources/imap/

Author: gnodet
Date: Thu Mar 12 20:34:17 2009
New Revision: 753004

URL: http://svn.apache.org/viewvc?rev=753004&view=rev
Log:
GERONIMO-4585: Disposition is incorrectly parsed on multiparts imap messages

Added:
    geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/test/java/org/apache/geronimo/javamail/store/imap/connection/
    geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/test/java/org/apache/geronimo/javamail/store/imap/connection/IMAPBodyStructureTest.java
    geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/test/resources/imap/
    geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/test/resources/imap/multipart.bodystructure
Modified:
    geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPBodyStructure.java
    geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPResponseTokenizer.java
    geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPStatusResponse.java

Modified: geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPBodyStructure.java
URL: http://svn.apache.org/viewvc/geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPBodyStructure.java?rev=753004&r1=753003&r2=753004&view=diff
==============================================================================
--- geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPBodyStructure.java (original)
+++ geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPBodyStructure.java Thu Mar 12 20:34:17 2009
@@ -27,6 +27,8 @@
 import javax.mail.internet.ContentDisposition;
 import javax.mail.internet.ContentType;
 
+import org.apache.geronimo.javamail.util.ResponseFormatException;
+
 
 public class IMAPBodyStructure extends IMAPFetchDataItem {
 
@@ -94,9 +96,6 @@
         // get the subtype (required)
         mimeType.setSubType(source.readString());
 
-        if (source.checkListEnd()) {
-            return;
-        }
         // if the next token is the list terminator, we're done.  Otherwise, we need to read extension
         // data.
         if (source.checkListEnd()) {
@@ -168,8 +167,16 @@
 
         disposition = new ContentDisposition();
         // now the dispostion.  This is a string, followed by a parameter list.
-        disposition.setDisposition(source.readString());
-        disposition.setParameterList(source.readParameterList());
+        if (source.peek(true).getType() == '(') {
+            source.checkLeftParen();
+            disposition.setDisposition(source.readString());
+            disposition.setParameterList(source.readParameterList());
+            source.checkRightParen();
+        } else if (source.peek(true) == IMAPResponseTokenizer.NIL) {
+            source.next();
+        } else {
+            throw new ResponseFormatException("Expecting NIL or '(' in response");
+        }
 
         // once more
         if (source.checkListEnd()) {
@@ -187,11 +194,13 @@
         // read the location info.
         source.readStringList();
 
-
         // we don't recognize any other forms of extension, so just skip over these.
         while (source.notListEnd()) {
             source.skipExtensionItem();
         }
+
+        // step over the closing paren
+        source.next();
     }
 
 

Modified: geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPResponseTokenizer.java
URL: http://svn.apache.org/viewvc/geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPResponseTokenizer.java?rev=753004&r1=753003&r2=753004&view=diff
==============================================================================
--- geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPResponseTokenizer.java (original)
+++ geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPResponseTokenizer.java Thu Mar 12 20:34:17 2009
@@ -613,9 +613,11 @@
      * @exception ResponseFormatException
      */
     public String readString() throws MessagingException {
-        Token token = next();
+        Token token = next(true);
         int type = token.getType();
-
+        if (type == Token.NIL) {
+            return null;
+        }
         if (type != Token.ATOM && type != Token.QUOTEDSTRING && type != Token.LITERAL && type != Token.NUMERIC) {
             throw new ResponseFormatException("String token expected in response: " + token.getValue());
         }
@@ -1083,11 +1085,11 @@
      * @exception ResponseFormatException
      */
     public List readStringList() throws MessagingException {
-        Token token = peek();
-
-        List list = new ArrayList();
+        Token token = peek(true);
 
         if (token.getType() == '(') {
+            List list = new ArrayList();
+
             next();
 
             while (notListEnd()) {
@@ -1098,17 +1100,25 @@
                 }
             }
             // step over the closing paren 
-            next(); 
+            next();
+
+            return list;
         }
-        else {
+        else if (token != NIL) {
+            List list = new ArrayList();
+
             // just a single string value.
             String value = readString();
             // this can be NIL, technically
             if (value != null) {
                 list.add(value);
             }
+
+            return list;
+        } else {
+            next();
         }
-        return list;
+        return null;
     }
 
 

Modified: geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPStatusResponse.java
URL: http://svn.apache.org/viewvc/geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPStatusResponse.java?rev=753004&r1=753003&r2=753004&view=diff
==============================================================================
--- geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPStatusResponse.java (original)
+++ geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/imap/connection/IMAPStatusResponse.java Thu Mar 12 20:34:17 2009
@@ -46,6 +46,9 @@
 
         // parse the list of flag values
         List flags = source.readStringList();
+        if (flags == null) {
+            return;
+        }
 
         for (int i = 0; i < flags.size(); i += 2) {
             String field = ((String)flags.get(i)).toUpperCase();

Added: geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/test/java/org/apache/geronimo/javamail/store/imap/connection/IMAPBodyStructureTest.java
URL: http://svn.apache.org/viewvc/geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/test/java/org/apache/geronimo/javamail/store/imap/connection/IMAPBodyStructureTest.java?rev=753004&view=auto
==============================================================================
--- geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/test/java/org/apache/geronimo/javamail/store/imap/connection/IMAPBodyStructureTest.java (added)
+++ geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/test/java/org/apache/geronimo/javamail/store/imap/connection/IMAPBodyStructureTest.java Thu Mar 12 20:34:17 2009
@@ -0,0 +1,42 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.javamail.store.imap.connection;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.BufferedReader;
+
+import javax.mail.internet.MimeMessage;
+
+import junit.framework.TestCase;
+import org.apache.geronimo.javamail.store.imap.IMAPStoreTest;
+
+public class IMAPBodyStructureTest extends TestCase {
+
+    public void testMultipart() throws Exception {
+        InputStream in = IMAPStoreTest.class.getResourceAsStream("/imap/multipart.bodystructure");
+        BufferedReader r = new BufferedReader(new InputStreamReader(in));
+        try {
+            IMAPResponseTokenizer tokenizer = new IMAPResponseTokenizer(r.readLine().getBytes());
+            IMAPBodyStructure s = new IMAPBodyStructure(tokenizer);
+            assertNull(s.disposition.getDisposition());
+            assertNull(s.md5Hash);
+        } finally {
+            in.close();
+        }
+    }
+}

Added: geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/test/resources/imap/multipart.bodystructure
URL: http://svn.apache.org/viewvc/geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/test/resources/imap/multipart.bodystructure?rev=753004&view=auto
==============================================================================
--- geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/test/resources/imap/multipart.bodystructure (added)
+++ geronimo/javamail/trunk/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/test/resources/imap/multipart.bodystructure Thu Mar 12 20:34:17 2009
@@ -0,0 +1 @@
+(("TEXT" "PLAIN" ("CHARSET" "ISO-8859-1") NIL NIL "7BIT" 1281 28 NIL NIL NIL)("TEXT" "HTML" ("CHARSET" "ISO-8859-1") NIL NIL "7BIT" 1510 33 NIL NIL NIL) "ALTERNATIVE" ("BOUNDARY" "0016e6d976ed8989d30464e986d1") NIL NIL)
\ No newline at end of file