http://git-wip-us.apache.org/repos/asf/james-project/blob/e9436237/protocols/imap/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java ---------------------------------------------------------------------- diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java b/protocols/imap/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java index 6db33e2..42dba98 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java @@ -75,6 +75,8 @@ public class HumanReadableText { public static final HumanReadableText ILLEGAL_ARGUMENTS = new HumanReadableText("org.apache.james.imap.ILLEGAL_ARGUMENTS", "failed. Illegal arguments."); + public static final HumanReadableText FAILURE_MAILBOX_NAME = new HumanReadableText("org.apache.james.imap.ILLEGAL_ARGUMENTS", "too long mailbox name. Illegal arguments."); + public static final HumanReadableText FAILURE_MAIL_PARSE = new HumanReadableText("org.apache.james.imap.FAILURE_MAIL_PARSE", "failed. Mail cannot be parsed."); public static final HumanReadableText FAILURE_NO_SUCH_MAILBOX = new HumanReadableText("org.apache.james.imap.FAILURE_NO_SUCH_MAILBOX", "failed. No such mailbox.");
http://git-wip-us.apache.org/repos/asf/james-project/blob/e9436237/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java ---------------------------------------------------------------------- diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java index 71b78ef..2908013 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java @@ -30,6 +30,7 @@ import org.apache.james.imap.message.request.CreateRequest; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxExistsException; +import org.apache.james.mailbox.exception.TooLongMailboxNameException; import org.apache.james.mailbox.model.MailboxPath; public class CreateProcessor extends AbstractMailboxProcessor<CreateRequest> { @@ -57,6 +58,11 @@ public class CreateProcessor extends AbstractMailboxProcessor<CreateRequest> { session.getLog().debug("Create failed for mailbox " + mailboxPath + " as it already exists", e); } no(command, tag, responder, HumanReadableText.MAILBOX_EXISTS); + } catch (TooLongMailboxNameException e) { + if (session.getLog().isDebugEnabled()) { + session.getLog().debug("The mailbox name is over limit: " + mailboxPath.getName(), e); + } + taggedBad(command, tag, responder, HumanReadableText.FAILURE_MAILBOX_NAME); } catch (MailboxException e) { if (session.getLog().isInfoEnabled()) { session.getLog().info("Create failed for mailbox " + mailboxPath, e); http://git-wip-us.apache.org/repos/asf/james-project/blob/e9436237/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java ---------------------------------------------------------------------- diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java index 4d1d600..06ec75b 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java @@ -31,6 +31,7 @@ import org.apache.james.imap.message.request.DeleteRequest; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxNotFoundException; +import org.apache.james.mailbox.exception.TooLongMailboxNameException; import org.apache.james.mailbox.model.MailboxPath; public class DeleteProcessor extends AbstractMailboxProcessor<DeleteRequest> { @@ -62,6 +63,11 @@ public class DeleteProcessor extends AbstractMailboxProcessor<DeleteRequest> { session.getLog().debug("Delete failed for mailbox " + mailboxPath + " as it not exist", e); } no(command, tag, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX); + } catch (TooLongMailboxNameException e) { + if (session.getLog().isDebugEnabled()) { + session.getLog().debug("The mailbox name is over limit: " + mailboxPath.getName(), e); + } + taggedBad(command, tag, responder, HumanReadableText.FAILURE_MAILBOX_NAME); } catch (MailboxException e) { if (session.getLog().isInfoEnabled()) { session.getLog().info("Delete failed for mailbox " + mailboxPath, e); http://git-wip-us.apache.org/repos/asf/james-project/blob/e9436237/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java ---------------------------------------------------------------------- diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java index 6d83a21..751b940 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java @@ -33,6 +33,7 @@ import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxExistsException; import org.apache.james.mailbox.exception.MailboxNotFoundException; +import org.apache.james.mailbox.exception.TooLongMailboxNameException; import org.apache.james.mailbox.model.MailboxPath; public class RenameProcessor extends AbstractMailboxProcessor<RenameRequest> { @@ -73,6 +74,11 @@ public class RenameProcessor extends AbstractMailboxProcessor<RenameRequest> { session.getLog().debug("Rename from " + existingPath + " to " + newPath + " failed because the source mailbox not exists", e); } no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND); + } catch (TooLongMailboxNameException e) { + if (session.getLog().isDebugEnabled()) { + session.getLog().debug("The mailbox name is over limit: " + newPath.getName(), e); + } + taggedBad(command, tag, responder, HumanReadableText.FAILURE_MAILBOX_NAME); } catch (MailboxException e) { if (session.getLog().isInfoEnabled()) { session.getLog().info("Rename from " + existingPath + " to " + newPath + " failed", e); http://git-wip-us.apache.org/repos/asf/james-project/blob/e9436237/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 6e229a3..426ce55 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 @@ -37,6 +37,7 @@ import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.collection.IsMapWithSize.aMapWithSize; +import org.apache.commons.lang3.StringUtils; import org.apache.james.JmapJamesServer; import org.apache.james.jmap.JmapAuthentication; import org.apache.james.jmap.api.access.AccessToken; @@ -317,6 +318,72 @@ public abstract class SetMailboxesMethodTest { } @Test + public void setMailboxesShouldNotCreateWhenOverLimitName() { + String overLimitName = StringUtils.repeat("a", MailboxConstants.DEFAULT_LIMIT_MAILBOX_NAME_LENGTH); + String requestBody = + "[" + + " [ \"setMailboxes\"," + + " {" + + " \"create\": {" + + " \"create-id01\" : {" + + " \"name\" : \"" + overLimitName + "\"" + + " }" + + " }" + + " }," + + " \"#0\"" + + " ]" + + "]"; + + given() + .header("Authorization", this.accessToken.serialize()) + .body(requestBody) + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("mailboxesSet")) + .body(ARGUMENTS + ".notCreated", aMapWithSize(1)) + .body(ARGUMENTS + ".notCreated", hasEntry(equalTo("create-id01"), Matchers.allOf( + hasEntry(equalTo("type"), equalTo("invalidArguments")), + hasEntry(equalTo("description"), equalTo("The mailbox name length '" + overLimitName + "' is over limitation: " + MailboxConstants.DEFAULT_LIMIT_MAILBOX_NAME_LENGTH))) + )); + } + + @Test + public void setMailboxesShouldNotUpdateMailboxWhenOverLimitName() { + String overLimitName = StringUtils.repeat("a", MailboxConstants.DEFAULT_LIMIT_MAILBOX_NAME_LENGTH); + jmapServer.serverProbe().createMailbox("#private", username, "myBox"); + Mailbox mailbox = jmapServer.serverProbe().getMailbox("#private", username, "myBox"); + String mailboxId = mailbox.getMailboxId().serialize(); + String requestBody = + "[" + + " [ \"setMailboxes\"," + + " {" + + " \"update\": {" + + " \"" + mailboxId + "\" : {" + + " \"name\" : \"" + overLimitName + "\"" + + " }" + + " }" + + " }," + + " \"#0\"" + + " ]" + + "]"; + given() + .header("Authorization", this.accessToken.serialize()) + .body(requestBody) + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("mailboxesSet")) + .body(ARGUMENTS + ".notUpdated", aMapWithSize(1)) + .body(ARGUMENTS + ".notUpdated", hasEntry(equalTo(mailboxId), Matchers.allOf( + hasEntry(equalTo("type"), equalTo("invalidArguments")), + hasEntry(equalTo("description"), equalTo("The mailbox name length '" + overLimitName + "' is over limitation: " + MailboxConstants.DEFAULT_LIMIT_MAILBOX_NAME_LENGTH))) + )); + } + + @Test public void setMailboxesShouldErrorNotSupportedWhenRoleGiven() { String requestBody = "[" + http://git-wip-us.apache.org/repos/asf/james-project/blob/e9436237/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/MailboxNameException.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/MailboxNameException.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/MailboxNameException.java deleted file mode 100644 index 1828eee..0000000 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/MailboxNameException.java +++ /dev/null @@ -1,27 +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 MailboxNameException extends RuntimeException { - - public MailboxNameException(String message) { - super(message); - } -} http://git-wip-us.apache.org/repos/asf/james-project/blob/e9436237/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java index e3e957c..a4e0a28 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java @@ -25,7 +25,6 @@ import java.util.Optional; import javax.inject.Inject; -import org.apache.james.jmap.exceptions.MailboxNameException; import org.apache.james.jmap.exceptions.MailboxParentNotFoundException; import org.apache.james.jmap.model.MailboxCreationId; import org.apache.james.jmap.model.MailboxFactory; @@ -41,7 +40,9 @@ import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.SubscriptionManager; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxExistsException; +import org.apache.james.mailbox.exception.MailboxNameException; import org.apache.james.mailbox.exception.MailboxNotFoundException; +import org.apache.james.mailbox.exception.TooLongMailboxNameException; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxId.Factory; import org.apache.james.mailbox.model.MailboxPath; @@ -111,10 +112,15 @@ public class SetMailboxesCreationProcessor implements SetMailboxesProcessor { creationIdsToCreatedMailboxId.put(mailboxCreationId, mailbox.get().getId()); } else { builder.notCreated(mailboxCreationId, SetError.builder() - .type("anErrorOccurred") - .description("An error occurred when creating the mailbox") - .build()); + .type("anErrorOccurred") + .description("An error occurred when creating the mailbox") + .build()); } + } catch (TooLongMailboxNameException e) { + builder.notCreated(mailboxCreationId, SetError.builder() + .type("invalidArguments") + .description("The mailbox name length is too long") + .build()); } catch (MailboxNameException | MailboxParentNotFoundException e) { builder.notCreated(mailboxCreationId, SetError.builder() .type("invalidArguments") @@ -136,7 +142,7 @@ public class SetMailboxesCreationProcessor implements SetMailboxesProcessor { } } - private void ensureValidMailboxName(MailboxCreateRequest mailboxRequest, MailboxSession mailboxSession) { + private void ensureValidMailboxName(MailboxCreateRequest mailboxRequest, MailboxSession mailboxSession) throws MailboxNameException { String name = mailboxRequest.getName(); char pathDelimiter = mailboxSession.getPathDelimiter(); if (name.contains(String.valueOf(pathDelimiter))) { http://git-wip-us.apache.org/repos/asf/james-project/blob/e9436237/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 faf18a5..cbf5108 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 @@ -40,6 +40,8 @@ import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.SubscriptionManager; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.exception.TooLongMailboxNameException; +import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; import org.slf4j.Logger; @@ -114,9 +116,14 @@ public class SetMailboxesDestructionProcessor implements SetMailboxesProcessor { .build()); } catch (SystemMailboxNotUpdatableException e) { builder.notDestroyed(entry.getKey(), SetError.builder() - .type("invalidArguments") - .description(String.format("The mailbox '%s' is a system mailbox.", entry.getKey().serialize())) - .build()); + .type("invalidArguments") + .description(String.format("The mailbox '%s' is a system mailbox.", entry.getKey().serialize())) + .build()); + } catch (TooLongMailboxNameException e) { + builder.notDestroyed(entry.getKey(), SetError.builder() + .type("invalidArguments") + .description("The mailbox name length is too long") + .build()); } catch (MailboxException e) { String message = String.format("An error occurred when deleting the mailbox '%s'", entry.getKey().serialize()); LOGGER.error(message, e); http://git-wip-us.apache.org/repos/asf/james-project/blob/e9436237/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 ec4fd69..85f06d3 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 @@ -24,7 +24,6 @@ import java.util.Optional; 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.MailboxFactory; @@ -41,7 +40,9 @@ import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.SubscriptionManager; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxExistsException; +import org.apache.james.mailbox.exception.MailboxNameException; import org.apache.james.mailbox.exception.MailboxNotFoundException; +import org.apache.james.mailbox.exception.TooLongMailboxNameException; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; @@ -92,6 +93,11 @@ public class SetMailboxesUpdateProcessor implements SetMailboxesProcessor { .type("invalidArguments") .description("Cannot update a system mailbox.") .build()); + } catch (TooLongMailboxNameException e) { + responseBuilder.notUpdated(mailboxId, SetError.builder() + .type("invalidArguments") + .description("The mailbox name length is too long") + .build()); } catch (MailboxNameException e) { responseBuilder.notUpdated(mailboxId, SetError.builder() .type("invalidArguments") --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
