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