You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ad...@apache.org on 2017/01/26 12:52:59 UTC
[05/13] james-project git commit: JAMES-1869: mailbox functions
should limit the size of a mailbox name
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org