Repository: james-project
Updated Branches:
  refs/heads/master d118b167a -> fc7ded8b7


JAMES-1986 Handle JMAP messages with only attachments


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/fc7ded8b
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/fc7ded8b
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/fc7ded8b

Branch: refs/heads/master
Commit: fc7ded8b7e35ec4725d58cdcfd0c9b57ca35f15d
Parents: d118b16
Author: benwa <btell...@linagora.com>
Authored: Tue Apr 4 11:24:06 2017 +0700
Committer: benwa <btell...@linagora.com>
Committed: Wed Apr 5 17:36:49 2017 +0700

----------------------------------------------------------------------
 .../store/mail/model/impl/MessageParser.java    | 24 ++++++++++++++++----
 .../mail/model/impl/MessageParserTest.java      |  8 +++++++
 .../resources/eml/emailWithOnlyAttachment.eml   | 16 +++++++++++++
 3 files changed, 43 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/fc7ded8b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
index c36f9c5..8692375 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
@@ -33,6 +33,7 @@ import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.codec.DecoderUtil;
 import org.apache.james.mime4j.dom.Body;
 import org.apache.james.mime4j.dom.Entity;
+import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.MessageWriter;
 import org.apache.james.mime4j.dom.Multipart;
 import org.apache.james.mime4j.dom.field.ContentDispositionField;
@@ -72,10 +73,15 @@ public class MessageParser {
     public List<MessageAttachment> retrieveAttachments(InputStream 
fullContent) throws MimeException, IOException {
         DefaultMessageBuilder defaultMessageBuilder = new 
DefaultMessageBuilder();
         defaultMessageBuilder.setMimeEntityConfig(MIME_ENTITY_CONFIG);
-        Body body = defaultMessageBuilder
-                .parseMessage(fullContent)
-                .getBody();
+        Message message = defaultMessageBuilder.parseMessage(fullContent);
+        Body body = message.getBody();
         try {
+            Optional<ContentDispositionField> contentDisposition = 
readHeader(message, CONTENT_DISPOSITION, ContentDispositionField.class);
+
+            if (isMessageWithOnlyOneAttachment(contentDisposition)) {
+                return ImmutableList.of(retrieveAttachment(new 
DefaultMessageWriter(), message));
+            }
+
             if (body instanceof Multipart) {
                 Multipart multipartBody = (Multipart)body;
                 return listAttachments(multipartBody, 
Context.fromSubType(multipartBody.getSubType()));
@@ -87,6 +93,10 @@ public class MessageParser {
         }
     }
 
+    private boolean 
isMessageWithOnlyOneAttachment(Optional<ContentDispositionField> 
contentDisposition) {
+        return contentDisposition.isPresent() && 
contentDisposition.get().isAttachment();
+    }
+
     private List<MessageAttachment> listAttachments(Multipart multipart, 
Context context) throws IOException {
         ImmutableList.Builder<MessageAttachment> attachments = 
ImmutableList.builder();
         MessageWriter messageWriter = new DefaultMessageWriter();
@@ -112,8 +122,8 @@ public class MessageParser {
         Optional<ContentTypeField> contentTypeField = 
getContentTypeField(entity);
         Optional<String> contentType = contentType(contentTypeField);
         Optional<String> name = name(contentTypeField);
-        Optional<Cid> cid = 
cid(castField(entity.getHeader().getField(CONTENT_ID), ContentIdField.class));
-        boolean isInline = 
isInline(castField(entity.getHeader().getField(CONTENT_DISPOSITION), 
ContentDispositionField.class));
+        Optional<Cid> cid = cid(readHeader(entity, CONTENT_ID, 
ContentIdField.class));
+        boolean isInline = isInline(readHeader(entity, CONTENT_DISPOSITION, 
ContentDispositionField.class));
 
         return MessageAttachment.builder()
                 .attachment(Attachment.builder()
@@ -126,6 +136,10 @@ public class MessageParser {
                 .build();
     }
 
+    private <T extends ParsedField> Optional<T> readHeader(Entity entity, 
String headerName, Class<T> clazz) {
+        return castField(entity.getHeader().getField(headerName), clazz);
+    }
+
     private Optional<ContentTypeField> getContentTypeField(Entity entity) {
         return castField(entity.getHeader().getField(CONTENT_TYPE), 
ContentTypeField.class);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/fc7ded8b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/MessageParserTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/MessageParserTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/MessageParserTest.java
index d7825d7..4fc4979 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/MessageParserTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/MessageParserTest.java
@@ -212,4 +212,12 @@ public class MessageParserTest {
 
         assertThat(attachments).hasSize(2);
     }
+
+    @Test
+    public void 
getAttachmentsShouldRetrieveOneAttachmentWhenMessageWithAttachmentContentDisposition()
 throws Exception {
+        List<MessageAttachment> attachments = testee.retrieveAttachments(
+            
ClassLoader.getSystemResourceAsStream("eml/emailWithOnlyAttachment.eml"));
+
+        assertThat(attachments).hasSize(1);
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/fc7ded8b/mailbox/store/src/test/resources/eml/emailWithOnlyAttachment.eml
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/resources/eml/emailWithOnlyAttachment.eml 
b/mailbox/store/src/test/resources/eml/emailWithOnlyAttachment.eml
new file mode 100644
index 0000000..3c422f9
--- /dev/null
+++ b/mailbox/store/src/test/resources/eml/emailWithOnlyAttachment.eml
@@ -0,0 +1,16 @@
+Return-Path: <chibe...@apache.org>
+Subject: 29989 btellier
+From: <a...@mail.com>
+Content-Disposition: attachment
+MIME-Version: 1.0
+Date: Sun, 02 Apr 2017 22:09:04 -0000
+Content-Type: application/zip; name="9559333830.zip"
+To: <chibe...@apache.org>
+Message-ID: <149117094410.10639.6001033367375...@any.com>
+Content-Transfer-Encoding: base64
+
+UEsDBBQAAgAIAEQeg0oN2YT/EAsAAMsWAAAIABwAMjIwODUuanNVVAkAAxBy4VgQcuFYdXgLAAEE
+AAAAAAQAAAAApZhbi1zHFYWfY/B/MP3i7kwj1/2CokAwBPIQ+sGPkgJ1tURkdeiMbYzQf8+3q8+M
+ZmQllgn2aHrqnNq1L2uvtavnj2/b7evz26/Op5M6q/P+8OUX77784g8/lQtLisXTU/68vfzCv/Lg
+D9vqs/3b8fNXf92273ey4XTCykk9w9LpfD7tX+zGzU83b8pPg39uBr/Kmxe7w9PLuP3xwpFKTJ32
+AAEEAAAAAAQAAAAAUEsFBgAAAAABAAEATgAAAFILAAAAAA==


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to