JAMES-2244 Ensure creation message being sent are just in outbox
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/fa601b9f Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/fa601b9f Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/fa601b9f Branch: refs/heads/master Commit: fa601b9fb559f68af91b9f4fe958712aa35f5e66 Parents: 1eef6ea Author: benwa <btell...@linagora.com> Authored: Thu Nov 30 17:34:33 2017 +0700 Committer: Antoine Duprat <adup...@linagora.com> Committed: Fri Dec 1 13:51:43 2017 +0100 ---------------------------------------------------------------------- .../integration/SetMessagesMethodTest.java | 9 ++++++--- .../methods/SetMessagesCreationProcessor.java | 19 ++++++++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/fa601b9f/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 5652090..3842a0e 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 @@ -1496,9 +1496,12 @@ public abstract class SetMessagesMethodTest { .log().ifValidationFails() .statusCode(200) .body(NAME, equalTo("messagesSet")) - .body(ARGUMENTS + ".notCreated", aMapWithSize(0)) - .body(ARGUMENTS + ".created", aMapWithSize(1)) - .body(ARGUMENTS + ".created", hasKey(messageCreationId)); + .body(ARGUMENTS + ".created", aMapWithSize(0)) + .body(ARGUMENTS + ".notCreated", aMapWithSize(1)) + .body(ARGUMENTS + ".notCreated", hasKey(messageCreationId)) + .body(ARGUMENTS + ".notCreated." + messageCreationId + ".type", equalTo("invalidProperties")) + .body(ARGUMENTS + ".notCreated." + messageCreationId + ".description", equalTo("Message creation is only supported in mailboxes with role Draft and Outbox")) + .body(ARGUMENTS + ".notCreated." + messageCreationId + ".properties", contains("mailboxIds")); } @Test http://git-wip-us.apache.org/repos/asf/james-project/blob/fa601b9f/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java index 5cd4882..7733b46 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java @@ -178,10 +178,11 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor { } private void performCreate(CreationMessageEntry entry, Builder responseBuilder, MailboxSession session) throws MailboxException, InvalidMailboxForCreationException, MessagingException, AttachmentsNotFoundException { - if (isDraft(entry.getValue())) { - saveDraft(entry, responseBuilder, session); - } else if (isAppendToMailboxWithRole(Role.OUTBOX, entry.getValue(), session)) { + if (isAppendToMailboxWithRole(Role.OUTBOX, entry.getValue(), session)) { sendMailViaOutbox(entry, responseBuilder, session); + } else if (isDraft(entry.getValue())) { + assertNoOutbox(entry, session); + saveDraft(entry, responseBuilder, session); } else { if (isAppendToMailboxWithRole(Role.DRAFTS, entry.getValue(), session)) { throw new InvalidDraftKeywordsException("A draft message should be flagged as Draft"); @@ -190,6 +191,12 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor { } } + private void assertNoOutbox(CreationMessageEntry entry, MailboxSession session) throws MailboxException { + if (isTargettingAMailboxWithRole(Role.OUTBOX, entry.getValue(), session)) { + throw new InvalidMailboxForCreationException("Mailbox ids can combine Outbox with other mailbox"); + } + } + private void sendMailViaOutbox(CreationMessageEntry entry, Builder responseBuilder, MailboxSession session) throws AttachmentsNotFoundException, MailboxException, MessagingException { validateArguments(entry, session); MessageWithId created = handleOutboxMessages(entry, session); @@ -270,6 +277,12 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor { .orElse(false); } + private boolean isTargettingAMailboxWithRole(Role role, CreationMessage entry, MailboxSession mailboxSession) throws MailboxException { + return getMailboxWithRole(mailboxSession, role) + .map(entry::isIn) + .orElse(false); + } + private Optional<MessageManager> getMailboxWithRole(MailboxSession mailboxSession, Role role) throws MailboxException { return systemMailboxesProvider.getMailboxByRole(role, mailboxSession).findFirst(); } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org