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

Reply via email to