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