Repository: james-project
Updated Branches:
  refs/heads/master d0ba1776d -> 76664e4a7


MAILBOX-290 Should be normal attachment in case of inline but no cid


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

Branch: refs/heads/master
Commit: 76664e4a73d0bf15c2bbcbddcb19dc130fbbad31
Parents: d0ba177
Author: Quynh Nguyen <qngu...@linagora.com>
Authored: Wed Mar 22 13:46:41 2017 +0700
Committer: Quynh Nguyen <qngu...@linagora.com>
Committed: Fri Mar 24 16:16:16 2017 +0700

----------------------------------------------------------------------
 .../james/mailbox/model/MessageAttachment.java  | 18 +++--
 .../mailbox/model/MessageAttachmentTest.java    | 63 +++++++++++++----
 .../cassandra/mail/CassandraMessageDAO.java     |  3 -
 ...MessageAttachmentRepresentationByIdTest.java |  9 ++-
 .../mailbox/store/StoreMessageManager.java      | 15 ++--
 .../mail/model/impl/MessageParserTest.java      |  4 +-
 .../integration/SetMessagesMethodTest.java      | 12 +++-
 .../cucumber/GetMessagesMethodStepdefs.java     |  5 ++
 .../test/resources/cucumber/GetMessages.feature | 15 +++-
 ...mbeddedMultipartWithInlineTextAttachment.eml |  1 +
 .../eml/mailWithInlinedAttachmentButNoCid.eml   | 72 ++++++++++++++++++++
 .../org/apache/james/jmap/model/Attachment.java |  4 ++
 .../org/apache/james/jmap/model/Message.java    |  2 +-
 .../apache/james/jmap/model/AttachmentTest.java | 37 ++++++++++
 .../apache/james/jmap/model/MessageTest.java    |  4 ++
 15 files changed, 221 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageAttachment.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageAttachment.java
 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageAttachment.java
index f2a68cd..770efc7 100644
--- 
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageAttachment.java
+++ 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageAttachment.java
@@ -35,7 +35,7 @@ public class MessageAttachment {
         private Attachment attachment;
         private Optional<String> name;
         private Optional<Cid> cid;
-        private Boolean isInline;
+        private Optional<Boolean> isInline = Optional.absent();
 
         private Builder() {
             name = Optional.absent();
@@ -65,20 +65,14 @@ public class MessageAttachment {
             return this;
         }
 
-        public Builder isInline(boolean isInline) {
-            this.isInline = isInline;
+        public Builder isInline(Boolean isInline) {
+            this.isInline = Optional.fromNullable(isInline);
             return this;
         }
 
         public MessageAttachment build() {
             Preconditions.checkState(attachment != null, "'attachment' is 
mandatory");
-            if (isInline == null) {
-                isInline = false;
-            }
-            if (isInline && !cid.isPresent()) {
-                throw new IllegalStateException("'cid' is mandatory for inline 
attachments");
-            }
-            return new MessageAttachment(attachment, name, cid, isInline);
+            return new MessageAttachment(attachment, name, cid, 
isInline.or(false));
         }
     }
 
@@ -114,6 +108,10 @@ public class MessageAttachment {
         return isInline;
     }
 
+    public boolean isInlinedWithCid() {
+        return isInline && cid.isPresent();
+    }
+
     @Override
     public boolean equals(Object obj) {
         if (obj instanceof MessageAttachment) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentTest.java
 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentTest.java
index 1fbe0ca..949a926 100644
--- 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentTest.java
+++ 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentTest.java
@@ -21,9 +21,6 @@ package org.apache.james.mailbox.model;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.james.mailbox.model.Attachment;
-import org.apache.james.mailbox.model.Cid;
-import org.apache.james.mailbox.model.MessageAttachment;
 import org.junit.Test;
 
 import com.google.common.base.Optional;
@@ -58,7 +55,7 @@ public class MessageAttachmentTest {
     }
 
     @Test
-    public void buildShouldSetIsInlineDefaultValueWhenNotGiven() {
+    public void buildShouldAcceptIsInlineAndNoCid() {
         Attachment attachment = Attachment.builder()
                 .bytes("content".getBytes())
                 .type("type")
@@ -66,31 +63,36 @@ public class MessageAttachmentTest {
 
         MessageAttachment messageAttachment = MessageAttachment.builder()
             .attachment(attachment)
+            .isInline(true)
             .build();
 
-        assertThat(messageAttachment.isInline()).isFalse();
+        assertThat(messageAttachment.isInline()).isTrue();
     }
 
-    @Test(expected=IllegalStateException.class)
-    public void buildShouldThrowWhenIsInlineAndNoCid() {
+    @Test
+    public void buildShouldSetAttributesWhenAllAreGiven() {
         Attachment attachment = Attachment.builder()
                 .bytes("content".getBytes())
                 .type("type")
                 .build();
+        MessageAttachment expectedMessageAttachment = new 
MessageAttachment(attachment, Optional.of("name"), 
Optional.of(Cid.from("cid")), true);
 
-        MessageAttachment.builder()
+        MessageAttachment messageAttachment = MessageAttachment.builder()
             .attachment(attachment)
+            .name("name")
+            .cid(Cid.from("cid"))
             .isInline(true)
             .build();
+
+        assertThat(messageAttachment).isEqualTo(expectedMessageAttachment);
     }
 
     @Test
-    public void buildShouldSetAttributesWhenAllAreGiven() {
+    public void isInlinedWithCidShouldReturnTrueWhenIsInlineAndHasCid() throws 
Exception {
         Attachment attachment = Attachment.builder()
-                .bytes("content".getBytes())
-                .type("type")
-                .build();
-        MessageAttachment expectedMessageAttachment = new 
MessageAttachment(attachment, Optional.of("name"), 
Optional.of(Cid.from("cid")), true);
+            .bytes("content".getBytes())
+            .type("type")
+            .build();
 
         MessageAttachment messageAttachment = MessageAttachment.builder()
             .attachment(attachment)
@@ -99,6 +101,39 @@ public class MessageAttachmentTest {
             .isInline(true)
             .build();
 
-        assertThat(messageAttachment).isEqualTo(expectedMessageAttachment);
+        assertThat(messageAttachment.isInlinedWithCid()).isTrue();
+    }
+
+    @Test
+    public void isInlinedWithCidShouldReturnFalseWhenIsNotInline() throws 
Exception {
+        Attachment attachment = Attachment.builder()
+            .bytes("content".getBytes())
+            .type("type")
+            .build();
+
+        MessageAttachment messageAttachment = MessageAttachment.builder()
+            .attachment(attachment)
+            .name("name")
+            .cid(Cid.from("cid"))
+            .isInline(false)
+            .build();
+
+        assertThat(messageAttachment.isInlinedWithCid()).isFalse();
+    }
+
+    @Test
+    public void isInlinedWithCidShouldReturnFalseWhenIsInlineButNoCid() throws 
Exception {
+        Attachment attachment = Attachment.builder()
+            .bytes("content".getBytes())
+            .type("type")
+            .build();
+
+        MessageAttachment messageAttachment = MessageAttachment.builder()
+            .attachment(attachment)
+            .name("name")
+            .isInline(true)
+            .build();
+
+        assertThat(messageAttachment.isInlinedWithCid()).isFalse();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
index 990d53d..3b39fac 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
@@ -381,9 +381,6 @@ public class CassandraMessageDAO {
             public MessageAttachmentRepresentation build() {
                 Preconditions.checkState(attachmentId != null, "'attachmentId' 
is mandatory");
                 boolean builtIsInLine = isInline.orElse(false);
-                if (builtIsInLine && !cid.isPresent()) {
-                    throw new IllegalStateException("'cid' is mandatory for 
inline attachments");
-                }
                 return new MessageAttachmentRepresentation(attachmentId, name, 
cid, builtIsInLine);
             }
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
index 0f8fba6..1ae585a 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
@@ -65,14 +65,17 @@ public class MessageAttachmentRepresentationByIdTest {
         assertThat(messageAttachmentRepresentation.isInline()).isFalse();
     }
 
-    @Test(expected=IllegalStateException.class)
-    public void buildShouldThrowWhenIsInlineAndNoCid() {
+    @Test
+    public void buildShouldAcceptInlineAndWithoutCid() {
         AttachmentId attachmentId = AttachmentId.from("1");
+        CassandraMessageDAO.MessageAttachmentRepresentation 
expectedMessageAttachmentRepresentation = new 
CassandraMessageDAO.MessageAttachmentRepresentation(attachmentId, 
Optional.empty(), Optional.empty(), true);
 
-        CassandraMessageDAO.MessageAttachmentRepresentation.builder()
+        CassandraMessageDAO.MessageAttachmentRepresentation 
messageAttachmentRepresentation = 
CassandraMessageDAO.MessageAttachmentRepresentation.builder()
             .attachmentId(attachmentId)
             .isInline(true)
             .build();
+
+        
assertThat(messageAttachmentRepresentation).isEqualTo(expectedMessageAttachmentRepresentation);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 1fb527b..919b59b 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -138,6 +138,14 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
 
     private static final Logger LOG = 
LoggerFactory.getLogger(StoreMessageManager.class);
 
+    private static final Predicate<MessageAttachment> NOT_INLINE_ATTACHMENT() {
+        return new Predicate<MessageAttachment>() {
+            @Override
+            public boolean apply(MessageAttachment input) {
+                return !input.isInlinedWithCid();
+            }
+        };
+    }
 
     private final Mailbox mailbox;
 
@@ -453,12 +461,7 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
     }
 
     private boolean hasNonInlinedAttachment(List<MessageAttachment> 
attachments) {
-        return FluentIterable.from(attachments).anyMatch(new 
Predicate<MessageAttachment>() {
-            @Override
-            public boolean apply(MessageAttachment input) {
-                return !input.isInline();
-            }
-        });
+        return 
FluentIterable.from(attachments).anyMatch(NOT_INLINE_ATTACHMENT());
     }
 
     private List<MessageAttachment> extractAttachments(SharedFileInputStream 
contentIn) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/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 0ac16f8..d7825d7 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
@@ -200,10 +200,10 @@ public class MessageParserTest {
     }
 
     @Test
-    public void 
getAttachmentsShouldRetrieveAttachmentsWhenOneFailBecauseOfNonCIDForInlined() 
throws Exception {
+    public void getAttachmentsShouldRetrieveAttachmentsWhenNoCidForInlined() 
throws Exception {
         List<MessageAttachment> attachments = 
testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/multiAttachmentsWithOneWrongInlinedAttachment.eml"));
 
-        assertThat(attachments).hasSize(1);
+        assertThat(attachments).hasSize(2);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
index 8b6255e..f372583 100644
--- 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
@@ -3144,7 +3144,7 @@ public abstract class SetMessagesMethodTest {
     }
 
     @Test
-    public void 
setMessagesShouldReturnAttachmentsWhenMessageHasWrongInlinedAttachment() throws 
Exception {
+    public void 
setMessagesShouldReturnAttachmentsWhenMessageHasInlinedAttachmentButNoCid() 
throws Exception {
         Attachment attachment = Attachment.builder()
             .bytes("attachment".getBytes(Charsets.UTF_8))
             .type("application/octet-stream")
@@ -3186,6 +3186,7 @@ public abstract class SetMessagesMethodTest {
 
         String createdPath = ARGUMENTS + ".created[\""+messageCreationId+"\"]";
         String firstAttachment = createdPath + ".attachments[0]";
+        String secondAttachment = createdPath + ".attachments[1]";
 
         given()
             .header("Authorization", accessToken.serialize())
@@ -3197,11 +3198,16 @@ public abstract class SetMessagesMethodTest {
             .body(NAME, equalTo("messagesSet"))
             .body(ARGUMENTS + ".notCreated", aMapWithSize(0))
             .body(ARGUMENTS + ".created", aMapWithSize(1))
-            .body(createdPath + ".attachments", hasSize(1))
+            .body(createdPath + ".attachments", hasSize(2))
             .body(firstAttachment + ".blobId", 
equalTo(attachment.getAttachmentId().getId()))
             .body(firstAttachment + ".type", 
equalTo("application/octet-stream; charset=UTF-8"))
             .body(firstAttachment + ".size", equalTo((int) 
attachment.getSize()))
             .body(firstAttachment + ".cid", nullValue())
-            .body(firstAttachment + ".isInline", equalTo(false));
+            .body(firstAttachment + ".isInline", equalTo(false))
+            .body(secondAttachment + ".blobId", 
equalTo(attachment2.getAttachmentId().getId()))
+            .body(secondAttachment + ".type", 
equalTo("application/octet-stream; charset=UTF-8"))
+            .body(secondAttachment + ".size", equalTo((int) 
attachment2.getSize()))
+            .body(secondAttachment + ".cid", nullValue())
+            .body(secondAttachment + ".isInline", equalTo(true));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
index 070b219..620328e 100644
--- 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
@@ -208,6 +208,11 @@ public class GetMessagesMethodStepdefs {
         appendMessage(messageName, "eml/noTextBodyButHtmlBody.eml");
     }
 
+    @Given("^the user has a message \"([^\"]*)\" in \"([^\"]*)\" mailbox with 
inline attachment but no CID$")
+    public void appendMessageWithInlineAttachmentButNoCid(String messageName, 
String mailbox) throws Throwable {
+        appendMessage(messageName, 
"eml/mailWithInlinedAttachmentButNoCid.eml");
+    }
+
     private void appendMessage(String messageName, String emlFileName) throws 
Exception {
         ZonedDateTime dateTime = ZonedDateTime.parse("2014-10-30T14:12:00Z");
         MessageId id = 
mainStepdefs.jmapServer.getProbe(MailboxProbeImpl.class).appendMessage(userStepdefs.lastConnectedUser,

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
index c8d1050..7a27e6d 100644
--- 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
@@ -247,4 +247,17 @@ Feature: GetMessages method
     Then no error is returned
     And the list should contain 1 message
     And the textBody of the message is "The Test User created an issue"
-    And the htmlBody of the message is "<a>The Test User</a> 
<strong>created</strong> an issue"
\ No newline at end of file
+    And the htmlBody of the message is "<a>The Test User</a> 
<strong>created</strong> an issue"
+
+  Scenario: Retrieving message with inline attachment but no CID should 
convert that inlined attachment to normal attachment
+    Given the user has a message "m1" in "INBOX" mailbox with inline 
attachment but no CID
+    When the user ask for messages "m1"
+    Then no error is returned
+    And the list should contain 1 message
+    And the hasAttachment of the message is "true"
+    And the list of attachments of the message contains 1 attachments
+    And the first attachment is:
+      |key      | value                                     |
+      |type     |"application/pdf"                               |
+      |cid      |null                                       |
+      |isInline |true                                      |

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/embeddedMultipartWithInlineTextAttachment.eml
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/embeddedMultipartWithInlineTextAttachment.eml
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/embeddedMultipartWithInlineTextAttachment.eml
index f9c8665..7e572cd 100644
--- 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/embeddedMultipartWithInlineTextAttachment.eml
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/embeddedMultipartWithInlineTextAttachment.eml
@@ -32,6 +32,7 @@ Content-Transfer-Encoding: 7bit
 --------------060506070600060108040700--
 
 ------------=_1483455916-7086-3
+Content-ID: <14672787885774e5c4d4cee471352...@linagora.com>
 Content-Type: text/plain; charset="iso-8859-1"; name="avertissement.txt"
 Content-Disposition: inline; filename="avertissement.txt"
 Content-Transfer-Encoding: binary

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/mailWithInlinedAttachmentButNoCid.eml
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/mailWithInlinedAttachmentButNoCid.eml
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/mailWithInlinedAttachmentButNoCid.eml
new file mode 100644
index 0000000..de13d72
--- /dev/null
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/mailWithInlinedAttachmentButNoCid.eml
@@ -0,0 +1,72 @@
+Return-Path: <sen...@gmail.com>
+MIME-Version: 1.0
+Delivered-To: test@localhost
+Received: from localhost
+X-Virus-Scanned: Debian
+X-Spam-Flag: NO
+X-Spam-Score: -1.78
+X-Spam-Level:
+X-Spam-Status: No, score=-1.78 tagged_above=-99 required=2
+       tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, FREEMAIL_FROM=0.001,
+       RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001, T_DKIM_INVALID=0.01,
+       T_FREEMAIL_DOC_PDF=0.01] autolearn=no
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+        d=gmail.com; s=20161025;
+        h=from:mime-version:subject:message-id:date:cc:to;
+        bh=lgK1xUjmh9FzAPFKLN2lvhSSlfI6ujj8K57kqImKrA8=;
+        b=tw7ave7egTqm3ZcXDe0NeuPSli3nkOBuqjOWLaK0MivSzO8FTQEWzCMEAlyhG4PMcP
+         jkxmhKAAjNPshiFnAYzPB4LNQV6GKPNUQ5igA9HDzh4dfbdT/6GiTEvUyWKZ6VpGVASR
+         x9Ioyiwxrdf4phsMYSHT7/Y+94/SvmAQj5gZZXfQ8JvmIAlxN9F4mvMnk2JQM4wcGv8Z
+         15zNoTxcUPODEybnawotJUewQu2sCKL7S46vFfKiuYEiKPC/XhGPFsjvwBAvcMBfRgbm
+         jJSAPk0TlXERVjhd3CSCHC1ukQ1nICb3yTZacuOK0gUgJ7rKY25zQoq2QvYgX97SuThz
+         BpHw==
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+        d=1e100.net; s=20161025;
+        h=x-gm-message-state:from:mime-version:subject:message-id:date:cc:to;
+        bh=lgK1xUjmh9FzAPFKLN2lvhSSlfI6ujj8K57kqImKrA8=;
+        b=VmTt7K8LRHq/MdOYtIhRnA/Lkbx41VnZh6+SYior8s5kLaKgrJWi+N/ql7SU6lCR2m
+         JFTyvIfUqsNFiHy0wPMlI4RauXHNVQWe9C+UQ5hc5BT+Z67O/5dxe+KDhtchRqh7JWC5
+         aWDjuvROFqhEEqphuEtGLqEqnHPbmweMZBIouasP2Z0TiHTSASSJq60HUcwf7UcVbmbw
+         m5O35XykCkecEX+H9fGAqgzlvFvtfy4PDENWfz8Yhzv730FsAmDutRjww0HYriyLwgpN
+         OjrT1o6p6DrWs5JlcgRh7F5qauiR/WTq+srbWbe/tLD7Lx8WRKyeXuzjKyTKJ5TjV6c5
+         AHKA==
+X-Gm-Message-State: 
AFeK/H1blcvejtSjL0KgKvb81Bc5uVOYQpq8wm/HouMZgtBr1kw+d9+VOes+FQrObRJdbQ==
+X-Received: by 10.28.133.84 with SMTP id h81mr8649035wmd.23.1489999897292;
+        Mon, 20 Mar 2017 01:51:37 -0700 (PDT)
+From: <from@localhost>
+Content-Type: multipart/mixed;
+ boundary="Apple-Mail=_DF3869A6-784C-445C-8AA0-EBEFE28034A4"
+Subject: mail with attachment from apple mail
+Message-Id: <153836c4-4563-400a-acbf-e2e2ed0fb...@gmail.com>
+Date: Mon, 20 Mar 2017 09:51:28 +0100
+To: <to@localhost>
+X-Mailer: Apple Mail (2.3259)
+
+
+--Apple-Mail=_DF3869A6-784C-445C-8AA0-EBEFE28034A4
+Content-Transfer-Encoding: quoted-printable
+Content-Type: text/plain;
+       charset=utf-8
+
+Voil=C3=A0
+
+--=20
+Voila=
+
+--Apple-Mail=_DF3869A6-784C-445C-8AA0-EBEFE28034A4
+Content-Disposition: inline;
+       filename=deromaCollection-628.pdf
+Content-Type: application/pdf;
+       x-unix-mode=0644;
+       name="deromaCollection-628.pdf"
+Content-Transfer-Encoding: base64
+
+JVBERi0xLjQKJeLjz9MKMSAwIG9iaiAKPDwvVHlwZSAvQ2F0YWxvZyAvVmVyc2lvbiAvMS40IC9Q
+YWdlcyAyIDAgUiAvTmFtZXMgNiAwIFIgPj4KZW5kb2JqCjIgMCBvYmogCjw8L1R5cGUgL1BhZ2Vz
+IC9LaWRzIFsxMCAwIFIgMTIgMCBSIDE5IDAgUiBdIC9Db3VudCAzID4+CmVuZG9iagozIDAgb2Jq
+IAo8PC9UaXRsZSAo/v8AVADpAG4A6QByAOkpIC9BdXRob3IgKERlcm9tYSBTcGEpIC9TdWJqZWN0
+ICj+/wBDAG8AbABsAGUAYwB0AGkAbwBuACAAVADpAG4A6QByAOkpIC9LZXl3b3JkcyAo/v8ARABl
+AHMALABwAGkA6ABjAGUAcwAsAHUAbgBpAHEAdQBlAHMALAAsAGMAcgDpAOkAZQBzACwAcABhAHIA
+LABkAGUALAB0AGEAbABlAG4AdAB1AGUAdQB4ACwAYQByAHQAaQBzAGEAbgBzACwAcABvAHQAaQBl
+bmZvIDMgMCBSID4+CnN0YXJ0eHJlZgoyOTQ0MDcKJSVFT0YK
+--Apple-Mail=_DF3869A6-784C-445C-8AA0-EBEFE28034A4--

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Attachment.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Attachment.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Attachment.java
index 2a62684..68606cc 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Attachment.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Attachment.java
@@ -139,6 +139,10 @@ public class Attachment {
         return isInline;
     }
 
+    public Boolean isInlinedWithCid() {
+        return isInline && cid.isPresent();
+    }
+
     public Optional<Long> getWidth() {
         return width;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java
index 9351460..f9170a2 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java
@@ -244,7 +244,7 @@ public class Message {
 
     private static boolean hasAttachment(List<Attachment> attachments) {
         return attachments.stream()
-                .filter(attachment -> !attachment.isIsInline())
+                .filter(attachment -> !attachment.isInlinedWithCid())
                 .findAny()
                 .isPresent();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/AttachmentTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/AttachmentTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/AttachmentTest.java
index c6a433a..0632dda 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/AttachmentTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/AttachmentTest.java
@@ -78,4 +78,41 @@ public class AttachmentTest {
         assertThat(tested).isEqualToComparingFieldByField(expected);
     }
 
+    @Test
+    public void isInlinedWithCidShouldReturnTrueWhenIsInlineAndHasCid() throws 
Exception {
+        Attachment tested = Attachment.builder()
+            .blobId(BlobId.of("blobId"))
+            .type("type")
+            .size(123)
+            .cid("cid")
+            .isInline(true)
+            .build();
+
+        assertThat(tested.isInlinedWithCid()).isTrue();
+    }
+
+    @Test
+    public void isInlinedWithCidShouldReturnFalseWhenIsNotInline() throws 
Exception {
+        Attachment tested = Attachment.builder()
+            .blobId(BlobId.of("blobId"))
+            .type("type")
+            .size(123)
+            .cid("cid")
+            .isInline(false)
+            .build();
+
+        assertThat(tested.isInlinedWithCid()).isFalse();
+    }
+
+    @Test
+    public void isInlinedWithCidShouldReturnFalseWhenIsInlineButNoCid() throws 
Exception {
+        Attachment tested = Attachment.builder()
+            .blobId(BlobId.of("blobId"))
+            .type("type")
+            .size(123)
+            .isInline(true)
+            .build();
+
+        assertThat(tested.isInlinedWithCid()).isFalse();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/76664e4a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java
index 844396d..dffd764 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java
@@ -291,12 +291,14 @@ public class MessageTest {
                         .blobId(BlobId.of("key"))
                         .size(1)
                         .type("type")
+                        .cid("cid1")
                         .isInline(true)
                         .build(),
                     Attachment.builder()
                         .blobId(BlobId.of("key2"))
                         .size(2)
                         .type("type2")
+                        .cid("cid2")
                         .isInline(true)
                         .build()))
             .build();
@@ -321,6 +323,7 @@ public class MessageTest {
                         .blobId(BlobId.of("key"))
                         .size(1)
                         .type("type")
+                        .cid("cid1")
                         .isInline(true)
                         .build(),
                     Attachment.builder()
@@ -333,6 +336,7 @@ public class MessageTest {
                         .blobId(BlobId.of("key3"))
                         .size(3)
                         .type("type3")
+                        .cid("c")
                         .isInline(true)
                         .build()))
             .build();


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