JAMES-2218 Disable creating Outbox messages with Draft flags
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/ad893d02 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/ad893d02 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/ad893d02 Branch: refs/heads/master Commit: ad893d026fc73c07cc6204926d9413b951f7df4d Parents: 45e7f3a Author: benwa <btell...@linagora.com> Authored: Wed Nov 15 15:28:12 2017 +0700 Committer: Antoine Duprat <adup...@linagora.com> Committed: Thu Nov 16 12:28:58 2017 +0100 ---------------------------------------------------------------------- .../integration/SetMessagesMethodTest.java | 10 +++++----- .../cucumber/SetMessagesMethodStepdefs.java | 21 +++++++++++++------- .../test/resources/cucumber/SetMessages.feature | 13 ++++++++---- .../InvalidDraftKeywordsException.java | 4 +++- .../methods/SetMessagesCreationProcessor.java | 20 ++++++++++++++----- 5 files changed, 46 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/ad893d02/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 951d369..054b589 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 @@ -1288,7 +1288,7 @@ public abstract class SetMessagesMethodTest { " \"to\": [{ \"name\": \"BOB\", \"email\": \"some...@example.com\"}]," + " \"subject\": \"subject\"," + " \"isDraft\": true," + - " \"keywords\": {\"$Draft\": true}," + + " \"keywords\": {\"$Answered\": true}," + " \"mailboxIds\": [\"" + getOutboxId(accessToken) + "\"]" + " }}" + " }," + @@ -1321,7 +1321,7 @@ public abstract class SetMessagesMethodTest { " \"from\": { \"name\": \"Me\", \"email\": \"" + fromAddress + "\"}," + " \"to\": [{ \"name\": \"BOB\", \"email\": \"some...@example.com\"}]," + " \"subject\": \"subject\"," + - " \"keywords\": {\"$Draft\": true, \"$Flagged\": true}," + + " \"keywords\": {\"$Answered\": true, \"$Flagged\": true}," + " \"mailboxIds\": [\"" + getOutboxId(accessToken) + "\"]" + " }}" + " }," + @@ -1341,7 +1341,7 @@ public abstract class SetMessagesMethodTest { .body(ARGUMENTS + ".notCreated", aMapWithSize(0)) .body(ARGUMENTS + ".created", aMapWithSize(1)) .body(ARGUMENTS + ".created", hasKey(messageCreationId)) - .body(ARGUMENTS + ".created[\""+messageCreationId+"\"].keywords.$Draft", equalTo(true)) + .body(ARGUMENTS + ".created[\""+messageCreationId+"\"].keywords.$Answered", equalTo(true)) .body(ARGUMENTS + ".created[\""+messageCreationId+"\"].keywords.$Flagged", equalTo(true)); } @@ -4497,7 +4497,7 @@ public abstract class SetMessagesMethodTest { " \"from\": { \"name\": \"Me\", \"email\": \"" + fromAddress + "\"}," + " \"to\": [{ \"name\": \"BOB\", \"email\": \"some...@example.com\"}]," + " \"subject\": \"subject\"," + - " \"keywords\": {\"$Draft\": true, \"$Unknown\": true}," + + " \"keywords\": {\"$Answered\": true, \"$Unknown\": true}," + " \"mailboxIds\": [\"" + getOutboxId(accessToken) + "\"]" + " }}" + " }," + @@ -4530,7 +4530,7 @@ public abstract class SetMessagesMethodTest { " \"from\": { \"name\": \"Me\", \"email\": \"" + fromAddress + "\"}," + " \"to\": [{ \"name\": \"BOB\", \"email\": \"some...@example.com\"}]," + " \"subject\": \"subject\"," + - " \"keywords\": {\"$Draft\": true, \"$Deleted\": true}," + + " \"keywords\": {\"$Answered\": true, \"$Deleted\": true}," + " \"mailboxIds\": [\"" + getOutboxId(accessToken) + "\"]" + " }}" + " }," + http://git-wip-us.apache.org/repos/asf/james-project/blob/ad893d02/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMessagesMethodStepdefs.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMessagesMethodStepdefs.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMessagesMethodStepdefs.java index fc9370f..3522d3c 100644 --- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMessagesMethodStepdefs.java +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMessagesMethodStepdefs.java @@ -23,12 +23,12 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; import javax.inject.Inject; import javax.mail.Flags; -import org.apache.james.jmap.DefaultMailboxes; import org.apache.james.jmap.model.Keywords; import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxId; @@ -195,13 +195,12 @@ public class SetMessagesMethodStepdefs { }); } - - @Given("^\"([^\"]*)\" creates a draft message \"([^\"]*)\"") - public void createDraft(String username, String message) throws Throwable { + @Given("^\"([^\"]*)\" creates a draft message \"([^\"]*)\" in mailbox \"([^\"]*)\"") + public void createDraft(String username, String message, String mailboxName) throws Throwable { userStepdefs.execWithUser(username, () -> { Mailbox mailbox = mainStepdefs.mailboxProbe.getMailbox(MailboxConstants.USER_NAMESPACE, username, - DefaultMailboxes.DRAFTS); + mailboxName); httpClient.post("[" + " [" + " \"setMessages\","+ @@ -216,8 +215,10 @@ public class SetMessagesMethodStepdefs { " ]" + "]"); mainStepdefs.awaitMethod.run(); - String messageId = httpClient.jsonPath.read("[0][1].created." + message + ".id"); - getMessagesMethodStepdefs.addMessageId(message, mainStepdefs.messageIdFactory.fromString(messageId)); + Optional.ofNullable( + httpClient.jsonPath.<String>read("[0][1].created." + message + ".id")) + .map(mainStepdefs.messageIdFactory::fromString) + .ifPresent(id -> getMessagesMethodStepdefs.addMessageId(message, id)); }); } @@ -264,4 +265,10 @@ public class SetMessagesMethodStepdefs { .containsOnlyKeys(id.serialize()); } + @Then("^message \"([^\"]*)\" is not created") + public void assertNotCreated(String messageName) throws Exception {; + assertThat(httpClient.jsonPath.<Map<String, String>>read("[0][1].notCreated")) + .containsOnlyKeys(messageName); + } + } http://git-wip-us.apache.org/repos/asf/james-project/blob/ad893d02/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/SetMessages.feature ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/SetMessages.feature b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/SetMessages.feature index 2294513..9e6dcce 100644 --- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/SetMessages.feature +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/SetMessages.feature @@ -106,20 +106,25 @@ Feature: SetMessages method on shared folders Scenario: A user can update the flags on a draft Given "b...@domain.tld" has a mailbox "Drafts" - And "b...@domain.tld" creates a draft message "mDraft" + And "b...@domain.tld" creates a draft message "mDraft" in mailbox "Drafts" When "b...@domain.tld" sets flags "$Draft,$Seen" on message "mDraft" Then "b...@domain.tld" should see message "mDraft" with keywords $Draft,$Seen Scenario: A user can not remove a draft flag on a draft messages Given "b...@domain.tld" has a mailbox "Drafts" - And "b...@domain.tld" creates a draft message "mDraft" + And "b...@domain.tld" creates a draft message "mDraft" in mailbox "Drafts" When "b...@domain.tld" sets flags "$Seen" on message "mDraft" Then message "mDraft" is not updated And "b...@domain.tld" should see message "mDraft" with keywords $Draft Scenario: A user can destroy a draft Given "b...@domain.tld" has a mailbox "Drafts" - And "b...@domain.tld" creates a draft message "mDraft" + And "b...@domain.tld" creates a draft message "mDraft" in mailbox "Drafts" When "b...@domain.tld" destroys message "mDraft" Then "b...@domain.tld" ask for message "mDraft" - And the notFound list should contain "mDraft" \ No newline at end of file + And the notFound list should contain "mDraft" + + Scenario: Draft creation in outbox is not allowed + Given "b...@domain.tld" has a mailbox "Outbox" + When "b...@domain.tld" creates a draft message "mDraft" in mailbox "Outbox" + Then message "mDraft" is not created \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/ad893d02/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/InvalidDraftKeywordsException.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/InvalidDraftKeywordsException.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/InvalidDraftKeywordsException.java index 08dd9b6..a9f7e2f 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/InvalidDraftKeywordsException.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/InvalidDraftKeywordsException.java @@ -20,5 +20,7 @@ package org.apache.james.jmap.exceptions; public class InvalidDraftKeywordsException extends IllegalArgumentException { - + public InvalidDraftKeywordsException(String s) { + super(s); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/ad893d02/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 4bb43dc..400834e 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 @@ -126,7 +126,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor { SetError.builder() .type("invalidProperties") .properties(MessageProperty.keywords) - .description("A draft message should be flagged as Draft") + .description(e.getMessage()) .build()); } catch (AttachmentsNotFoundException e) { @@ -188,6 +188,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor { private void sendMailViaOutbox(CreationMessageEntry entry, Builder responseBuilder, MailboxSession session) throws AttachmentsNotFoundException, MailboxException, MessagingException { validateArguments(entry, session); + assertNoDraftKeywords(entry); MessageWithId created = handleOutboxMessages(entry, session); responseBuilder.created(created.getCreationId(), created.getValue()); } @@ -200,13 +201,22 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor { } private void assertDraftKeywords(CreationMessageEntry entry) { - Boolean isDraft = entry.getValue() + if (!isDraft(entry)) { + throw new InvalidDraftKeywordsException("A draft message should be flagged as Draft"); + } + } + + private void assertNoDraftKeywords(CreationMessageEntry entry) { + if (isDraft(entry)) { + throw new InvalidDraftKeywordsException("A draft message can not be created out of draft mailbox"); + } + } + + private Boolean isDraft(CreationMessageEntry entry) { + return entry.getValue() .getKeywords() .map(keywords -> keywords.contains(Keyword.DRAFT)) .orElse(false); - if (!isDraft) { - throw new InvalidDraftKeywordsException(); - } } private void validateArguments(CreationMessageEntry entry, MailboxSession session) throws MailboxInvalidMessageCreationException, AttachmentsNotFoundException, MailboxException { --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org