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]
