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 <[email protected]> Authored: Tue Jul 12 12:37:51 2016 +0200 Committer: Antoine Duprat <[email protected]> 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 = "[email protected]|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: [email protected] For additional commands, e-mail: [email protected]
