JAMES-2514 Handle mailbox name length at the manager layer

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/de701777
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/de701777
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/de701777

Branch: refs/heads/master
Commit: de701777b829401e45e10c82b156bb0265346d71
Parents: 3ebeae8
Author: Benoit Tellier <[email protected]>
Authored: Thu Aug 2 17:28:55 2018 +0700
Committer: Benoit Tellier <[email protected]>
Committed: Sat Aug 4 08:17:14 2018 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/MailboxManager.java    |  2 +
 .../james/mailbox/MailboxManagerTest.java       | 49 ++++++++++++++++++++
 .../mailbox/store/StoreMailboxManager.java      | 11 +++++
 3 files changed, 62 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/de701777/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java 
b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
index 1d13791..569dac4 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
@@ -70,6 +70,8 @@ import org.apache.james.mailbox.model.search.MailboxQuery;
 
 public interface MailboxManager extends RequestAware, MailboxListenerSupport, 
RightManager, MailboxAnnotationManager {
 
+    int MAX_MAILBOX_NAME_LENGTH = 200;
+
     enum MailboxCapabilities {
         Annotation,
         Move,

http://git-wip-us.apache.org/repos/asf/james-project/blob/de701777/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java 
b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index a89a602..d950afe 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -20,6 +20,7 @@ package org.apache.james.mailbox;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.io.UnsupportedEncodingException;
 import java.nio.charset.StandardCharsets;
@@ -33,6 +34,7 @@ import 
org.apache.james.mailbox.MailboxManager.MailboxCapabilities;
 import org.apache.james.mailbox.MessageManager.AppendCommand;
 import org.apache.james.mailbox.exception.AnnotationException;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.TooLongMailboxNameException;
 import org.apache.james.mailbox.mock.DataProvisioner;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxAnnotation;
@@ -55,6 +57,7 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
@@ -984,4 +987,50 @@ public abstract class MailboxManagerTest {
         testRunner.awaitTermination(1, TimeUnit.MINUTES);
         testRunner.assertNoException();
     }
+
+    @Test
+    public void creatingMailboxShouldNotFailWhenLimitNameLength() throws 
Exception {
+        MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+        String mailboxName = Strings.repeat("a", 
MailboxManager.MAX_MAILBOX_NAME_LENGTH);
+
+        assertThatCode(() -> 
mailboxManager.createMailbox(MailboxPath.forUser(USER_1, mailboxName), session))
+            .doesNotThrowAnyException();
+    }
+
+    @Test
+    public void renamingMailboxShouldNotFailWhenLimitNameLength() throws 
Exception {
+        MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+        String mailboxName = Strings.repeat("a", 
MailboxManager.MAX_MAILBOX_NAME_LENGTH);
+
+        MailboxPath originPath = MailboxPath.forUser(USER_1, "origin");
+        mailboxManager.createMailbox(originPath, session);
+
+        assertThatCode(() -> mailboxManager.renameMailbox(originPath, 
MailboxPath.forUser(USER_1, mailboxName), session))
+            .doesNotThrowAnyException();
+    }
+
+    @Test
+    public void creatingMailboxShouldThrowWhenOverLimitNameLength() throws 
Exception {
+        MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+        String mailboxName = Strings.repeat("a", 
MailboxManager.MAX_MAILBOX_NAME_LENGTH + 1);
+
+        assertThatThrownBy(() -> 
mailboxManager.createMailbox(MailboxPath.forUser(USER_1, mailboxName), session))
+            .isInstanceOf(TooLongMailboxNameException.class);
+    }
+
+    @Test
+    public void renamingMailboxShouldThrowWhenOverLimitNameLength() throws 
Exception {
+        MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+        String mailboxName = Strings.repeat("a", 
MailboxManager.MAX_MAILBOX_NAME_LENGTH + 1);
+
+        MailboxPath originPath = MailboxPath.forUser(USER_1, "origin");
+        mailboxManager.createMailbox(originPath, session);
+
+        assertThatThrownBy(() -> mailboxManager.renameMailbox(originPath, 
MailboxPath.forUser(USER_1, mailboxName), session))
+            .isInstanceOf(TooLongMailboxNameException.class);
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/de701777/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index f5d7a54..40885a6 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -47,6 +47,7 @@ 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.NotAdminException;
+import org.apache.james.mailbox.exception.TooLongMailboxNameException;
 import org.apache.james.mailbox.exception.UserDoesNotExistException;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
@@ -499,6 +500,9 @@ public class StoreMailboxManager implements MailboxManager {
             LOGGER.warn("Ignoring mailbox with empty name");
         } else {
             MailboxPath sanitizedMailboxPath = 
mailboxPath.sanitize(mailboxSession.getPathDelimiter());
+            if (isMailboxNameTooLong(mailboxPath)) {
+                throw new TooLongMailboxNameException("Mailbox name exceed 
maximum size of " + MAX_MAILBOX_NAME_LENGTH + " characters");
+            }
             if (mailboxExists(sanitizedMailboxPath, mailboxSession)) {
                 throw new 
MailboxExistsException(sanitizedMailboxPath.asString());
             }
@@ -531,6 +535,10 @@ public class StoreMailboxManager implements MailboxManager 
{
         return Optional.empty();
     }
 
+    public boolean isMailboxNameTooLong(MailboxPath mailboxPath) {
+        return mailboxPath.getName().length() > MAX_MAILBOX_NAME_LENGTH;
+    }
+
     @Override
     public void deleteMailbox(final MailboxPath mailboxPath, final 
MailboxSession session) throws MailboxException {
         LOGGER.info("deleteMailbox {}", mailboxPath);
@@ -567,6 +575,9 @@ public class StoreMailboxManager implements MailboxManager {
         if (mailboxExists(to, session)) {
             throw new MailboxExistsException(to.toString());
         }
+        if (isMailboxNameTooLong(to)) {
+            throw new TooLongMailboxNameException("Mailbox name exceed maximum 
size of " + MAX_MAILBOX_NAME_LENGTH + " characters");
+        }
 
         assertIsOwner(session, from);
         MailboxMapper mapper = 
mailboxSessionMapperFactory.getMailboxMapper(session);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to