JAMES-1721 Rename a mailbox to a system Mailbox is not possible
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/39928fdd Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/39928fdd Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/39928fdd Branch: refs/heads/master Commit: 39928fdd70afb77c26b3a353ad9cc1c6ce10da78 Parents: 80c6001 Author: Laura Royet <lro...@linagora.com> Authored: Fri Apr 22 10:31:28 2016 +0200 Committer: Laura Royet <lro...@linagora.com> Committed: Mon Apr 25 14:50:29 2016 +0200 ---------------------------------------------------------------------- .../integration/SetMailboxesMethodTest.java | 36 ++++++++++++++++++++ .../methods/SetMailboxesUpdateProcessor.java | 21 ++++++++++-- 2 files changed, 54 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/39928fdd/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java index 2c0316c..ede31d0 100644 --- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java @@ -1476,4 +1476,40 @@ public abstract class SetMailboxesMethodTest { hasEntry(equalTo("type"), equalTo("invalidArguments")), hasEntry(equalTo("description"), equalTo("Cannot update a system mailbox."))))); } + + @Test + public void setMailboxesShouldReturnNotUpdatedWhenRenameToSystemMailboxName() { + + jmapServer.serverProbe().createMailbox("#private", username, "myBox"); + Mailbox<?> mailboxMyBox = jmapServer.serverProbe().getMailbox("#private", username, "myBox"); + String mailboxIdMyBox = mailboxMyBox.getMailboxId().serialize(); + + String requestBody = + "[" + + " [ \"setMailboxes\"," + + " {" + + " \"update\": {" + + " \"" + mailboxIdMyBox + "\" : {" + + " \"name\" : \"outbox\"" + + " }" + + " }" + + " }," + + " \"#0\"" + + " ]" + + "]"; + + given() + .accept(ContentType.JSON) + .contentType(ContentType.JSON) + .header("Authorization", this.accessToken.serialize()) + .body(requestBody) + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("mailboxesSet")) + .body(ARGUMENTS + ".notUpdated", hasEntry(equalTo(mailboxIdMyBox), Matchers.allOf( + hasEntry(equalTo("type"), equalTo("invalidArguments")), + hasEntry(equalTo("description"), equalTo("The mailbox 'outbox' is a system mailbox."))))); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/39928fdd/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java index 0eee160..29efbe2 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java @@ -130,11 +130,26 @@ public class SetMailboxesUpdateProcessor<Id extends MailboxId> implements SetMai private void validateMailboxName(MailboxUpdateRequest updateRequest, MailboxSession mailboxSession) throws MailboxNameException { char pathDelimiter = mailboxSession.getPathDelimiter(); - if (updateRequest.getName() - .filter(name -> name.contains(String.valueOf(pathDelimiter))) - .isPresent()) { + + if (nameContainsPathDelimiter(updateRequest, pathDelimiter)) { throw new MailboxNameException(String.format("The mailbox '%s' contains an illegal character: '%c'", updateRequest.getName().get(), pathDelimiter)); } + if (nameMatchesSystemMailbox(updateRequest)) { + throw new MailboxNameException(String.format("The mailbox '%s' is a system mailbox.", updateRequest.getName().get())); + } + } + + private boolean nameMatchesSystemMailbox(MailboxUpdateRequest updateRequest) { + return updateRequest.getName() + .flatMap(Role::from) + .filter(Role::isSystemRole) + .isPresent(); + } + + private boolean nameContainsPathDelimiter(MailboxUpdateRequest updateRequest, char pathDelimiter) { + return updateRequest.getName() + .filter(name -> name.contains(String.valueOf(pathDelimiter))) + .isPresent() ; } private void validateParent(Mailbox mailbox, MailboxUpdateRequest updateRequest, MailboxSession mailboxSession) throws MailboxException, MailboxHasChildException { --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org