This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 3d21b8bb27f2e1ec85b554221cd8715b4bee132d Author: RĂ©mi KOWALSKI <rkowal...@linagora.com> AuthorDate: Mon Oct 28 15:20:52 2019 +0100 JAMES-2936 reject path with empty names in the hierachy when renaming mailbox and sanitize new name --- .../apache/james/mailbox/MailboxManagerTest.java | 62 ++++++++++++++++++++++ .../james/mailbox/store/StoreMailboxManager.java | 13 +++-- 2 files changed, 70 insertions(+), 5 deletions(-) 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 138422c..e0a2ad9 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 @@ -261,6 +261,68 @@ public abstract class MailboxManagerTest<T extends MailboxManager> { .isInstanceOf(HasEmptyMailboxNameInHierarchyException.class); } + @Test + void renamingMailboxShouldNotThrowWhenNameWithoutEmptyHierarchicalLevel() throws Exception { + MailboxSession session = mailboxManager.createSystemSession(USER_1); + + String mailboxName = "a.b.c"; + + MailboxPath originPath = MailboxPath.forUser(USER_1, "origin"); + mailboxManager.createMailbox(originPath, session); + + assertThatCode(() -> mailboxManager.renameMailbox(originPath, MailboxPath.forUser(USER_1, mailboxName), session)).doesNotThrowAnyException(); + } + + @Test + void renamingMailboxShouldNotThrowWhenNameWithASingleToBeNormalizedTrailingDelimiter() throws Exception { + MailboxSession session = mailboxManager.createSystemSession(USER_1); + + String mailboxName = "a.b."; + + MailboxPath originPath = MailboxPath.forUser(USER_1, "origin"); + mailboxManager.createMailbox(originPath, session); + + assertThatCode(() -> mailboxManager.renameMailbox(originPath, MailboxPath.forUser(USER_1, mailboxName), session)).doesNotThrowAnyException(); + } + + @Test + void renamingMailboxShouldThrowWhenNameWithMoreThanOneTrailingDelimiter() throws Exception { + MailboxSession session = mailboxManager.createSystemSession(USER_1); + + String mailboxName = "a.."; + + MailboxPath originPath = MailboxPath.forUser(USER_1, "origin"); + mailboxManager.createMailbox(originPath, session); + + assertThatThrownBy(() -> mailboxManager.renameMailbox(originPath, MailboxPath.forUser(USER_1, mailboxName), session)) + .isInstanceOf(HasEmptyMailboxNameInHierarchyException.class); + } + + @Test + void renamingMailboxShouldThrowWhenNameWithHeadingDelimiter() throws Exception { + MailboxSession session = mailboxManager.createSystemSession(USER_1); + + String mailboxName = ".a"; + + MailboxPath originPath = MailboxPath.forUser(USER_1, "origin"); + mailboxManager.createMailbox(originPath, session); + + assertThatThrownBy(() -> mailboxManager.renameMailbox(originPath, MailboxPath.forUser(USER_1, mailboxName), session)) + .isInstanceOf(HasEmptyMailboxNameInHierarchyException.class); + } + + @Test + void renamingMailboxShouldThrowWhenNameWithEmptyHierarchicalLevel() throws Exception { + MailboxSession session = mailboxManager.createSystemSession(USER_1); + + String mailboxName = "a..b"; + + MailboxPath originPath = MailboxPath.forUser(USER_1, "origin"); + mailboxManager.createMailbox(originPath, session); + + assertThatThrownBy(() -> mailboxManager.renameMailbox(originPath, MailboxPath.forUser(USER_1, mailboxName), session)) + .isInstanceOf(HasEmptyMailboxNameInHierarchyException.class); + } } @Nested 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 7944aa2..abd895c 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 @@ -438,22 +438,25 @@ public class StoreMailboxManager implements MailboxManager { return m; }); - } @Override public void renameMailbox(MailboxPath from, MailboxPath to, MailboxSession session) throws MailboxException { LOGGER.debug("renameMailbox {} to {}", from, to); - if (mailboxExists(to, session)) { - throw new MailboxExistsException(to.toString()); + MailboxPath sanitizedMailboxPath = to.sanitize(session.getPathDelimiter()); + if (mailboxExists(sanitizedMailboxPath, session)) { + throw new MailboxExistsException(sanitizedMailboxPath.toString()); } - if (isMailboxNameTooLong(to)) { + if (isMailboxNameTooLong(sanitizedMailboxPath)) { throw new TooLongMailboxNameException("Mailbox name exceed maximum size of " + MAX_MAILBOX_NAME_LENGTH + " characters"); } + if (sanitizedMailboxPath.hasEmptyNameInHierarchy(session.getPathDelimiter())) { + throw new HasEmptyMailboxNameInHierarchyException(to.asString()); + } assertIsOwner(session, from); MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session); - mapper.execute(Mapper.toTransaction(() -> doRenameMailbox(from, to, session, mapper))); + mapper.execute(Mapper.toTransaction(() -> doRenameMailbox(from, sanitizedMailboxPath, session, mapper))); } private void assertIsOwner(MailboxSession mailboxSession, MailboxPath mailboxPath) throws MailboxNotFoundException { --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org