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

Reply via email to