james-server-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From adup...@apache.org
Subject [1/2] james-project git commit: JAMES-1794 Handle correctly binary attachments when sending a message
Date Tue, 12 Jul 2016 11:31:05 GMT
Repository: james-project
Updated Branches:
  refs/heads/master c3d7956eb -> 0afefc0bd


JAMES-1794 Handle correctly binary attachments when sending a message


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

Branch: refs/heads/master
Commit: cb8d4e41e3cf32852e9a2ae1d7bc50f0bb280823
Parents: 03be8a46
Author: Antoine Duprat <aduprat@linagora.com>
Authored: Tue Jul 12 12:37:51 2016 +0200
Committer: Antoine Duprat <aduprat@linagora.com>
Committed: Tue Jul 12 13:30:13 2016 +0200

----------------------------------------------------------------------
 .../integration/SetMessagesMethodTest.java      | 77 +++++++++++++++++++-
 .../jmap/methods/MIMEMessageConverter.java      |  7 +-
 2 files changed, 79 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/cb8d4e41/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 306c070..4d2726a 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
@@ -1692,7 +1692,79 @@ public abstract class SetMessagesMethodTest {
     }
 
     @Test
-    public void attachmentsShouldBeRetrievedWhenChainingSetMessagesAndGetMessages() throws
Exception {
+    public void attachmentsShouldBeRetrievedWhenChainingSetMessagesAndGetMessagesBinaryAttachment()
throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username,
"sent");
+
+        byte[] rawBytes = new byte[]{-128,-127,-126,-125,-124,-123,-122,-121,-120,-119,-118,-117,-116,-115,-114,-113,-112,-111,-110,-109,-108,-107,-106,-105,-104,-103,-102,-101,-100,
+                -99,-98,-97,-96,-95,-94,-93,-92,-91,-90,-89,-88,-87,-86,-85,-84,-83,-82,-81,-80,-79,-78,-77,-76,-75,-74,-73,-72,-71,-70,-69,-68,-67,-66,-65,-64,-63,-62,-61,-60,-59,-58,-57,-56,-55,-54,-53,-52,-51,
+                -50,-49,-48,-47,-46,-45,-44,-43,-42,-41,-40,-39,-38,-37,-36,-35,-34,-33,-32,-31,-30,-29,-28,-27,-26,-25,-24,-23,-22,-21,-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,
+                0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,
+                50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,
+                100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127};
+        
+        Attachment attachment = Attachment.builder()
+                .bytes(rawBytes)
+                .type("application/octet-stream")
+                .build();
+        uploadAttachment(attachment);
+        String expectedBlobId = attachment.getAttachmentId().getId();
+
+        String messageCreationId = "creationId";
+        String fromAddress = username;
+        String outboxId = getOutboxId(accessToken);
+        String requestBody = "[" +
+                "  [" +
+                "    \"setMessages\","+
+                "    {" +
+                "      \"create\": { \"" + messageCreationId  + "\" : {" +
+                "        \"from\": { \"name\": \"Me\", \"email\": \"" + fromAddress + "\"},"
+
+                "        \"to\": [{ \"name\": \"Me\", \"email\": \"" + fromAddress + "\"}],"
+
+                "        \"subject\": \"Message with an attachment\"," +
+                "        \"textBody\": \"Test body\"," +
+                "        \"mailboxIds\": [\"" + outboxId + "\"], " +
+                "        \"attachments\": [" +
+                "               {\"blobId\" : \"" + attachment.getAttachmentId().getId()
+ "\", " +
+                "               \"type\" : \"" + attachment.getType() + "\", " +
+                "               \"size\" : " + attachment.getSize() + ", " +
+                "               \"cid\" : \"123456789\", " +
+                "               \"isInline\" : true }" +
+                "           ]" +
+                "      }}" +
+                "    }," +
+                "    \"#0\"" +
+                "  ]" +
+                "]";
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body(requestBody)
+        .when()
+            .post("/jmap");
+
+        calmlyAwait.atMost(30, TimeUnit.SECONDS).until( () -> isAnyMessageFoundInInbox(accessToken));
+
+        String firstMessage = ARGUMENTS + ".list[0]";
+        String firstAttachment = firstMessage + ".attachments[0]";
+        String presumedMessageId = "username@domain.tld|INBOX|1";
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessages\", {\"ids\": [\"" + presumedMessageId + "\"]}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messages"))
+            .body(ARGUMENTS + ".list", hasSize(1))
+            .body(firstMessage + ".attachments", hasSize(1))
+            .body(firstAttachment + ".blobId", equalTo(expectedBlobId))
+            .body(firstAttachment + ".type", equalTo("application/octet-stream"))
+            .body(firstAttachment + ".size", equalTo((int) attachment.getSize()))
+            .body(firstAttachment + ".cid", equalTo("123456789"))
+            .body(firstAttachment + ".isInline", equalTo(true));
+    }
+
+    @Test
+    public void attachmentsShouldBeRetrievedWhenChainingSetMessagesAndGetMessagesTextAttachment()
throws Exception {
         jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username,
"sent");
 
         Attachment attachment = Attachment.builder()
@@ -1700,6 +1772,7 @@ public abstract class SetMessagesMethodTest {
                 .type("application/octet-stream")
                 .build();
         uploadAttachment(attachment);
+        String expectedBlobId = attachment.getAttachmentId().getId();
 
         String messageCreationId = "creationId";
         String fromAddress = username;
@@ -1748,7 +1821,7 @@ public abstract class SetMessagesMethodTest {
             .body(NAME, equalTo("messages"))
             .body(ARGUMENTS + ".list", hasSize(1))
             .body(firstMessage + ".attachments", hasSize(1))
-            .body(firstAttachment + ".blobId", equalTo(attachment.getAttachmentId().getId()))
+            .body(firstAttachment + ".blobId", equalTo(expectedBlobId))
             .body(firstAttachment + ".type", equalTo("application/octet-stream"))
             .body(firstAttachment + ".size", equalTo((int) attachment.getSize()))
             .body(firstAttachment + ".cid", equalTo("123456789"))

http://git-wip-us.apache.org/repos/asf/james-project/blob/cb8d4e41/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java
index 7a50287..f598d98 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java
@@ -27,7 +27,6 @@ import java.util.TimeZone;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
-import org.apache.commons.io.IOUtils;
 import org.apache.james.jmap.model.CreationMessage;
 import org.apache.james.jmap.model.CreationMessage.DraftEmailer;
 import org.apache.james.jmap.model.CreationMessageId;
@@ -63,6 +62,7 @@ import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMap.Builder;
+import com.google.common.io.ByteStreams;
 import com.google.common.net.MediaType;
 
 public class MIMEMessageConverter {
@@ -237,9 +237,10 @@ public class MIMEMessageConverter {
     private BodyPart attachmentBodyPart(MessageAttachment att) throws IOException {
         BodyPartBuilder builder = BodyPartBuilder.create()
             .use(bodyFactory)
-            .setBody(IOUtils.toString(att.getAttachment().getStream()), Charsets.UTF_8)
+            .setBody(new BasicBodyFactory().binaryBody(ByteStreams.toByteArray(att.getAttachment().getStream())))
             .setField(contentTypeField(att))
-            .setField(contentDispositionField(att.isInline()));
+            .setField(contentDispositionField(att.isInline()))
+            .setContentTransferEncoding("base64");
         contentId(builder, att);
         return builder.build();
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


Mime
View raw message