This is an automated email from the ASF dual-hosted git repository. rcordier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 316522363b679d53fb2cc9e7b1561f6d75f2414e Author: Benoit TELLIER <btell...@linagora.com> AuthorDate: Wed Oct 9 21:38:45 2024 +0200 JAMES-2182 MailboxManager mailbox search for specific other user --- .../apache/james/mailbox/MailboxManagerTest.java | 26 ++++++++++++++++++++++ .../james/mailbox/store/StoreMailboxManager.java | 12 ++++++++-- .../james/imap/scripts/ListWithSharedMailbox.test | 4 ---- 3 files changed, 36 insertions(+), 6 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 f189c1a3a0..528dea7b8c 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 @@ -1199,6 +1199,32 @@ public abstract class MailboxManagerTest<T extends MailboxManager> { .extracting(MailboxMetaData::getPath) .containsOnly(inbox1, inbox2); } + + @Test + void searchShouldAllowListingAnotherUserMailbox() throws Exception { + assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.ACL)); + MailboxSession session1 = mailboxManager.createSystemSession(USER_1); + MailboxSession session2 = mailboxManager.createSystemSession(USER_2); + MailboxPath inbox1 = MailboxPath.inbox(session1); + MailboxPath inbox2 = MailboxPath.inbox(session2); + mailboxManager.createMailbox(inbox1, session1); + mailboxManager.createMailbox(inbox2, session2); + mailboxManager.setRights(inbox1, + MailboxACL.EMPTY.apply(MailboxACL.command() + .forUser(USER_2) + .rights(MailboxACL.Right.Read, MailboxACL.Right.Lookup) + .asAddition()), + session1); + + MailboxQuery mailboxQuery = MailboxQuery.builder() + .userAndNamespaceFrom(inbox1) + .matchesAllMailboxNames() + .build(); + + assertThat(mailboxManager.search(mailboxQuery, session2).toStream()) + .extracting(MailboxMetaData::getPath) + .containsExactly(inbox1); + } @Test void searchShouldAllowUserFiltering() throws Exception { 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 c3415c0491..37e68ce6bb 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 @@ -808,14 +808,22 @@ public class StoreMailboxManager implements MailboxManager { private Flux<Mailbox> searchMailboxes(MailboxQuery mailboxQuery, MailboxSession session, Right right) { MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(session); - Flux<Mailbox> baseMailboxes = mailboxMapper - .findMailboxWithPathLike(toSingleUserQuery(mailboxQuery, session)); + Flux<Mailbox> baseMailboxes = getBaseMailboxes(mailboxMapper, mailboxQuery, session); Flux<Mailbox> delegatedMailboxes = getDelegatedMailboxes(mailboxMapper, mailboxQuery, right, session) .filter(Throwing.predicate(mailbox -> storeRightManager.hasRight(mailbox, right, session))) .filter(mailbox -> !mailbox.getUser().equals(session.getUser())); return Flux.concat(baseMailboxes, delegatedMailboxes); } + private Flux<Mailbox> getBaseMailboxes(MailboxMapper mailboxMapper,MailboxQuery mailboxQuery, MailboxSession session) { + if (mailboxQuery.isPrivateMailboxes(session) + || mailboxQuery.getNamespace().isEmpty() && mailboxQuery.getUser().isEmpty()) { + return mailboxMapper.findMailboxWithPathLike(toSingleUserQuery(mailboxQuery, session)); + } else { + return Flux.empty(); + } + } + private Flux<MailboxId> accessibleMailboxIds(MultimailboxesSearchQuery.Namespace namespace, Right right, MailboxSession session) { MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(session); Flux<MailboxId> baseMailboxes = mailboxMapper diff --git a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListWithSharedMailbox.test b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListWithSharedMailbox.test index 29243651e5..c462bb7bc0 100644 --- a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListWithSharedMailbox.test +++ b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListWithSharedMailbox.test @@ -59,15 +59,11 @@ S: \* STATUS \"#user.boby.sharedMailbox\" \(RECENT 0 UNSEEN 0\) S: a3 OK STATUS completed. C: a4 LIST "#user.diana" "*" -# TODO why double results -S: \* LIST \(\\HasNoChildren\) \".\" \"#user.diana.sharedMailbox\" S: \* LIST \(\\HasNoChildren\) \".\" \"#user.diana.sharedMailbox\" S: a4 OK LIST completed. C: a7 LIST "#user" "*" -# TODO personal mailboxes shall not be included SUB { -S: \* LIST \(\\HasNoChildren\) \"\.\" \"#private.INBOX\" S: \* LIST \(\\HasNoChildren\) \".\" \"#user.diana.sharedMailbox\" S: \* LIST \(\\HasChildren\) \".\" \"#user.boby.sharedMailbox\" S: \* LIST \(\\HasNoChildren\) \".\" \"#user.boby.sharedMailbox.child\" --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org