Repository: james-project
Updated Branches:
  refs/heads/master 656de840c -> c01150221


JAMES-2126 Use filename as fallback for attachment names


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

Branch: refs/heads/master
Commit: c01150221cb89f79a0aa2685432a26e159c49e3f
Parents: 42cfec1
Author: benwa <btell...@linagora.com>
Authored: Tue Aug 22 10:24:11 2017 +0700
Committer: benwa <btell...@linagora.com>
Committed: Wed Aug 23 09:32:45 2017 +0700

----------------------------------------------------------------------
 .../store/mail/model/impl/MessageParser.java    | 17 ++++++++---
 .../mail/model/impl/MessageParserTest.java      | 18 ++++++++++++
 .../src/test/resources/eml/filenameAndName.eml  | 31 ++++++++++++++++++++
 .../src/test/resources/eml/filenameOnly.eml     | 31 ++++++++++++++++++++
 .../resources/eml/oneAttachmentWithoutName.eml  |  3 +-
 5 files changed, 94 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/c0115022/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 f5aabf7..000dc08 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
@@ -31,6 +31,7 @@ import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.dom.Body;
 import org.apache.james.mime4j.dom.Entity;
 import org.apache.james.mime4j.dom.Message;
@@ -81,6 +82,7 @@ public class MessageParser {
     public List<MessageAttachment> retrieveAttachments(InputStream 
fullContent) throws MimeException, IOException {
         DefaultMessageBuilder defaultMessageBuilder = new 
DefaultMessageBuilder();
         defaultMessageBuilder.setMimeEntityConfig(MIME_ENTITY_CONFIG);
+        defaultMessageBuilder.setDecodeMonitor(DecodeMonitor.SILENT);
         Message message = defaultMessageBuilder.parseMessage(fullContent);
         Body body = message.getBody();
         try {
@@ -128,8 +130,9 @@ public class MessageParser {
 
     private MessageAttachment retrieveAttachment(MessageWriter messageWriter, 
Entity entity) throws IOException {
         Optional<ContentTypeField> contentTypeField = 
getContentTypeField(entity);
+        Optional<ContentDispositionField> contentDispositionField = 
getContentDispositionField(entity);
         Optional<String> contentType = contentType(contentTypeField);
-        Optional<String> name = name(contentTypeField);
+        Optional<String> name = name(contentTypeField, 
contentDispositionField);
         Optional<Cid> cid = cid(readHeader(entity, CONTENT_ID, 
ContentIdField.class));
         boolean isInline = isInline(readHeader(entity, CONTENT_DISPOSITION, 
ContentDispositionField.class));
 
@@ -152,6 +155,10 @@ public class MessageParser {
         return castField(entity.getHeader().getField(CONTENT_TYPE), 
ContentTypeField.class);
     }
 
+    private Optional<ContentDispositionField> 
getContentDispositionField(Entity entity) {
+        return castField(entity.getHeader().getField(CONTENT_DISPOSITION), 
ContentDispositionField.class);
+    }
+
     @SuppressWarnings("unchecked")
     private <U extends ParsedField> Optional<U> castField(Field field, 
Class<U> clazz) {
         if (field == null || !clazz.isInstance(field)) {
@@ -164,10 +171,12 @@ public class MessageParser {
         return contentTypeField.map(ContentTypeField::getMimeType);
     }
 
-    private Optional<String> name(Optional<ContentTypeField> contentTypeField) 
{
+    private Optional<String> name(Optional<ContentTypeField> contentTypeField, 
Optional<ContentDispositionField> contentDispositionField) {
         return contentTypeField
-            .flatMap(field -> Optional.ofNullable(field.getParameter("name"))
-            .map(MimeUtil::unscrambleHeaderValue));
+            .map(field -> Optional.ofNullable(field.getParameter("name")))
+            .filter(Optional::isPresent)
+            .orElseGet(() -> 
contentDispositionField.map(ContentDispositionField::getFilename))
+            .map(MimeUtil::unscrambleHeaderValue);
     }
 
     private Optional<Cid> cid(Optional<ContentIdField> contentIdField) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/c0115022/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 cc2b8ce..2e82305 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
@@ -149,6 +149,24 @@ public class MessageParserTest {
     }
 
     @Test
+    public void retrieveAttachmentShouldUseFilenameAsNameWhenNoName() throws 
Exception {
+        List<MessageAttachment> attachments = 
testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/filenameOnly.eml"));
+
+        assertThat(attachments).hasSize(1)
+            .extracting(MessageAttachment::getName)
+            .containsExactly(Optional.of("inventory.csv"));
+    }
+
+    @Test
+    public void retrieveAttachmentShouldUseNameWhenBothNameAndFilename() 
throws Exception {
+        List<MessageAttachment> attachments = 
testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/filenameAndName.eml"));
+
+        assertThat(attachments).hasSize(1)
+            .extracting(MessageAttachment::getName)
+            .containsExactly(Optional.of("good.csv"));
+    }
+
+    @Test
     public void getAttachmentsShouldRetrieveEmbeddedAttachmentsWhenSome() 
throws Exception {
         List<MessageAttachment> attachments = 
testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/embeddedAttachmentWithInline.eml"));
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/c0115022/mailbox/store/src/test/resources/eml/filenameAndName.eml
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/resources/eml/filenameAndName.eml 
b/mailbox/store/src/test/resources/eml/filenameAndName.eml
new file mode 100644
index 0000000..9181f2b
--- /dev/null
+++ b/mailbox/store/src/test/resources/eml/filenameAndName.eml
@@ -0,0 +1,31 @@
+Return-Path: <a...@linagora.com>
+MIME-Version: 1.0
+Delivered-To: d...@linagora.com
+Date: Mon, 21 Aug 2017 00:17:47 +0200
+From: a...@linagora.com
+To: a...@linagora.com
+Subject: Inventaire des VMs
+Message-ID: <599a0a8b.MepmS5MLy1x/pobr%...@linagora.com>
+Content-Type: multipart/mixed;
+ boundary="=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA"
+
+This is a multi-part message in MIME format.
+
+--=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+Bonjour
+En pièce jointe l'inventaire à jour des VMs et les erreurs
+Cordialement.
+
+
+--=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA
+Content-Type: text/csv;
+ charset=utf-8; name="good.csv";
+Content-Transfer-Encoding: 8bit
+Content-Disposition: attachment;
+ filename="bad.csv"
+
+DATA
+--=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA

http://git-wip-us.apache.org/repos/asf/james-project/blob/c0115022/mailbox/store/src/test/resources/eml/filenameOnly.eml
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/resources/eml/filenameOnly.eml 
b/mailbox/store/src/test/resources/eml/filenameOnly.eml
new file mode 100644
index 0000000..79f0bf0
--- /dev/null
+++ b/mailbox/store/src/test/resources/eml/filenameOnly.eml
@@ -0,0 +1,31 @@
+Return-Path: <a...@linagora.com>
+MIME-Version: 1.0
+Delivered-To: d...@linagora.com
+Date: Mon, 21 Aug 2017 00:17:47 +0200
+From: a...@linagora.com
+To: a...@linagora.com
+Subject: Inventaire des VMs
+Message-ID: <599a0a8b.MepmS5MLy1x/pobr%...@linagora.com>
+Content-Type: multipart/mixed;
+ boundary="=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA"
+
+This is a multi-part message in MIME format.
+
+--=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+Bonjour
+En pièce jointe l'inventaire à jour des VMs et les erreurs
+Cordialement.
+
+
+--=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA
+Content-Type: text/csv;
+ charset=utf-8
+Content-Transfer-Encoding: 8bit
+Content-Disposition: attachment;
+ filename="inventory.csv"
+
+DATA
+--=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA

http://git-wip-us.apache.org/repos/asf/james-project/blob/c0115022/mailbox/store/src/test/resources/eml/oneAttachmentWithoutName.eml
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/resources/eml/oneAttachmentWithoutName.eml 
b/mailbox/store/src/test/resources/eml/oneAttachmentWithoutName.eml
index f38cba8..f0bd9b7 100644
--- a/mailbox/store/src/test/resources/eml/oneAttachmentWithoutName.eml
+++ b/mailbox/store/src/test/resources/eml/oneAttachmentWithoutName.eml
@@ -29,8 +29,7 @@ Content-Disposition: inline
 ------=_Part_0_1330682067197
 Content-Type: application/octet-stream;
 Content-Transfer-Encoding: base64
-Content-Disposition: attachment;
-       filename="gimp.png"
+Content-Disposition: attachment
 
 
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
 


---------------------------------------------------------------------
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