JAMES-1721 SetMailboxes can't modify system mailboxes
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f476cbaf Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f476cbaf Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f476cbaf Branch: refs/heads/master Commit: f476cbafaf86c6554be5bebf51b864e97ab4063d Parents: 223dd81 Author: Laura Royet <lro...@linagora.com> Authored: Thu Apr 14 16:15:14 2016 +0200 Committer: Laura Royet <lro...@linagora.com> Committed: Mon Apr 25 14:50:28 2016 +0200 ---------------------------------------------------------------------- .../integration/SetMailboxesMethodTest.java | 35 ++++++++++++++++++++ .../jmap/exceptions/SystemMailboxException.java | 23 ------------- .../SystemMailboxNotUpdatableException.java | 23 +++++++++++++ .../SetMailboxesDestructionProcessor.java | 10 +++--- .../methods/SetMailboxesUpdateProcessor.java | 12 +++++++ .../SetMailboxesUpdateProcessorTest.java | 2 +- 6 files changed, 76 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/f476cbaf/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 07718f8..2c0316c 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 @@ -1441,4 +1441,39 @@ public abstract class SetMailboxesMethodTest { .body(ARGUMENTS + ".list", hasSize(1)) .body(ARGUMENTS + ".list[0].name", equalTo("mySecondBox")); } + + @Test + public void setMailboxesShouldReturnNotUpdatedWhenRenamingSystemMailbox() { + + Mailbox<?> mailbox = jmapServer.serverProbe().getMailbox("#private", username, "inbox"); + String mailboxId = mailbox.getMailboxId().serialize(); + + String requestBody = + "[" + + " [ \"setMailboxes\"," + + " {" + + " \"update\": {" + + " \"" + mailboxId + "\" : {" + + " \"name\" : \"renamed\"" + + " }" + + " }" + + " }," + + " \"#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(mailboxId), Matchers.allOf( + hasEntry(equalTo("type"), equalTo("invalidArguments")), + hasEntry(equalTo("description"), equalTo("Cannot update a system mailbox."))))); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/f476cbaf/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/SystemMailboxException.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/SystemMailboxException.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/SystemMailboxException.java deleted file mode 100644 index f82cfa1..0000000 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/SystemMailboxException.java +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.jmap.exceptions; - -public class SystemMailboxException extends Exception { -} http://git-wip-us.apache.org/repos/asf/james-project/blob/f476cbaf/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/SystemMailboxNotUpdatableException.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/SystemMailboxNotUpdatableException.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/SystemMailboxNotUpdatableException.java new file mode 100644 index 0000000..6ecebf7 --- /dev/null +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/SystemMailboxNotUpdatableException.java @@ -0,0 +1,23 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.jmap.exceptions; + +public class SystemMailboxNotUpdatableException extends RuntimeException { +} http://git-wip-us.apache.org/repos/asf/james-project/blob/f476cbaf/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesDestructionProcessor.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesDestructionProcessor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesDestructionProcessor.java index 6076fb8..5fdc8d9 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesDestructionProcessor.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesDestructionProcessor.java @@ -26,7 +26,7 @@ import java.util.Optional; import javax.inject.Inject; import org.apache.james.jmap.exceptions.MailboxHasChildException; -import org.apache.james.jmap.exceptions.SystemMailboxException; +import org.apache.james.jmap.exceptions.SystemMailboxNotUpdatableException; import org.apache.james.jmap.model.SetError; import org.apache.james.jmap.model.SetMailboxesRequest; import org.apache.james.jmap.model.SetMailboxesResponse; @@ -103,7 +103,7 @@ public class SetMailboxesDestructionProcessor<Id extends MailboxId> implements S .type("mailboxHasChild") .description(String.format("The mailbox '%s' has a child.", entry.getKey())) .build()); - } catch (SystemMailboxException e) { + } catch (SystemMailboxNotUpdatableException e) { builder.notDestroyed(entry.getKey(), SetError.builder() .type("invalidArguments") .description(String.format("The mailbox '%s' is a system mailbox.", entry.getKey())) @@ -118,7 +118,7 @@ public class SetMailboxesDestructionProcessor<Id extends MailboxId> implements S } } - private void preconditions(Mailbox mailbox, MailboxSession mailboxSession) throws MailboxHasChildException, SystemMailboxException, MailboxException { + private void preconditions(Mailbox mailbox, MailboxSession mailboxSession) throws MailboxHasChildException, SystemMailboxNotUpdatableException, MailboxException { checkForChild(mailbox.getId(), mailboxSession); checkRole(mailbox.getRole()); } @@ -129,9 +129,9 @@ public class SetMailboxesDestructionProcessor<Id extends MailboxId> implements S } } - private void checkRole(Optional<Role> role) throws SystemMailboxException { + private void checkRole(Optional<Role> role) throws SystemMailboxNotUpdatableException { if (role.map(Role::isSystemRole).orElse(false)) { - throw new SystemMailboxException(); + throw new SystemMailboxNotUpdatableException(); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/f476cbaf/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 bf4d4ac..b079b64 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 @@ -26,12 +26,14 @@ import javax.inject.Inject; import org.apache.james.jmap.exceptions.MailboxHasChildException; import org.apache.james.jmap.exceptions.MailboxNameException; import org.apache.james.jmap.exceptions.MailboxParentNotFoundException; +import org.apache.james.jmap.exceptions.SystemMailboxNotUpdatableException; import org.apache.james.jmap.model.SetError; import org.apache.james.jmap.model.SetMailboxesRequest; import org.apache.james.jmap.model.SetMailboxesResponse; import org.apache.james.jmap.model.SetMailboxesResponse.Builder; import org.apache.james.jmap.model.mailbox.Mailbox; import org.apache.james.jmap.model.mailbox.MailboxUpdateRequest; +import org.apache.james.jmap.model.mailbox.Role; import org.apache.james.jmap.utils.MailboxUtils; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; @@ -71,10 +73,14 @@ public class SetMailboxesUpdateProcessor<Id extends MailboxId> implements SetMai try { validateMailboxName(updateRequest, mailboxSession); Mailbox mailbox = getMailbox(mailboxId, mailboxSession); + checkRole(mailbox.getRole()); validateParent(mailbox, updateRequest, mailboxSession); updateMailbox(mailbox, updateRequest, mailboxSession); responseBuilder.updated(mailboxId); + + } catch (SystemMailboxNotUpdatableException e) { + notUpdated(mailboxId, "invalidArguments", "Cannot update a system mailbox.", responseBuilder); } catch (MailboxNameException e) { notUpdated(mailboxId, "invalidArguments", e.getMessage(), responseBuilder); @@ -94,6 +100,12 @@ public class SetMailboxesUpdateProcessor<Id extends MailboxId> implements SetMai notUpdated(mailboxId, "anErrorOccurred", "An error occurred when updating the mailbox", responseBuilder); } + } + + private void checkRole(Optional<Role> role) throws SystemMailboxNotUpdatableException { + if (role.map(Role::isSystemRole).orElse(false)) { + throw new SystemMailboxNotUpdatableException(); + } } private Builder notUpdated(String mailboxId, String type, String message, Builder responseBuilder) { http://git-wip-us.apache.org/repos/asf/james-project/blob/f476cbaf/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java index 73e2146..6fc0f9e 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java @@ -64,7 +64,7 @@ public class SetMailboxesUpdateProcessorTest { SetMailboxesRequest request = SetMailboxesRequest.builder() .update(mailboxId, MailboxUpdateRequest.builder().parentId(newParentId).build()) .build(); - Mailbox mailbox = Mailbox.builder().id(mailboxId).name("name").build(); + Mailbox mailbox = Mailbox.builder().id(mailboxId).name("name").role(Optional.empty()).build(); when(mockedMailboxUtils.mailboxFromMailboxId(mailboxId, mockedMailboxSession)) .thenReturn(Optional.of(mailbox)); when(mockedMailboxUtils.mailboxPathFromMailboxId(newParentId, mockedMailboxSession)) --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org