You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2017/04/05 10:38:03 UTC

james-project git commit: JAMES-1986 Handle JMAP messages with only attachments

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 <bt...@linagora.com>
Authored: Tue Apr 4 11:24:06 2017 +0700
Committer: benwa <bt...@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: <ch...@apache.org>
+Subject: 29989 btellier
+From: <an...@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: <ch...@apache.org>
+Message-ID: <14...@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org