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 bt...@apache.org on 2019/10/31 09:48:44 UTC
[james-project] 06/06: JAMES-2936 reject path with empty names in
the hierachy when renaming mailbox and sanitize new name
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 <rk...@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org