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


The following commit(s) were added to refs/heads/master by this push:
     new 323ec1b8e7 JAMES-3754 - Fix IMAP LIST EXTENSION - return incorrect 
list response when SUBCRIBED in request option with other usersnamespace query 
(#2585)
323ec1b8e7 is described below

commit 323ec1b8e758f6c7b9112b84205e6d93b8eae941
Author: vttran <vtt...@linagora.com>
AuthorDate: Wed Jan 8 09:24:26 2025 +0700

    JAMES-3754 - Fix IMAP LIST EXTENSION - return incorrect list response when 
SUBCRIBED in request option with other usersnamespace query (#2585)
---
 .../james/imap/scripts/ListWithSharedMailbox.test       | 16 ++++++++++++++++
 .../org/apache/james/imap/processor/ListProcessor.java  | 17 +++++++++++++++++
 2 files changed, 33 insertions(+)

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 07d7432556..23c0d0c8e3 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
@@ -201,6 +201,22 @@ S: \* LIST \(\\HasNoChildren \\Subscribed\) \".\" 
\"#user.boby.Sent\"
 }
 S: b15 OK LIST completed.
 
+C: b16 LIST (SUBSCRIBED) "" "#user.*"
+SUB {
+S: \* LIST \(\\HasChildren \\Subscribed\) \".\" \"#user.boby.sharedMailbox\"
+S: \* LIST \(\\HasNoChildren \\Subscribed\) \".\" 
\"#user.boby.sharedMailbox.child\"
+S: \* LIST \(\\HasNoChildren \\Subscribed\) \".\" \"#user.boby.Sent\"
+}
+S: b16 OK LIST completed.
+
+C: b17 LIST (SUBSCRIBED) "#user." "*"
+SUB {
+S: \* LIST \(\\HasChildren \\Subscribed\) \".\" \"#user.boby.sharedMailbox\"
+S: \* LIST \(\\HasNoChildren \\Subscribed\) \".\" 
\"#user.boby.sharedMailbox.child\"
+S: \* LIST \(\\HasNoChildren \\Subscribed\) \".\" \"#user.boby.Sent\"
+}
+S: b17 OK LIST completed.
+
 C: c01 SELECT #user.diana.sharedMailbox
 S: \* OK \[MAILBOXID \(.*\)\] Ok
 S: \* FLAGS \(.*\)
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
index 17c92b022a..f5e23c5abc 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
@@ -60,7 +60,9 @@ import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.search.MailboxNameExpression;
 import org.apache.james.mailbox.model.search.MailboxQuery;
+import org.apache.james.mailbox.model.search.PrefixedRegex;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.util.MDCBuilder;
 import org.apache.james.util.ReactorUtils;
@@ -265,9 +267,12 @@ public class ListProcessor<T extends ListRequest> extends 
AbstractMailboxProcess
         listRecursiveMatch.forEach(pair -> 
responseBuilders.add(Triple.of(pair.getLeft(), pair.getRight(), 
Optional.ofNullable(searchedResultMap.get(pair.getLeft())))));
         Set<MailboxPath> listRecursiveMatchPath = 
listRecursiveMatch.stream().map(Pair::getKey).collect(Collectors.toUnmodifiableSet());
 
+        Predicate<MailboxPath> subscribedPredicate = 
subscribedPredicate(mailboxSession, relative, listRequest);
+
         allSubscribedSearch.stream()
             .filter(subscribed -> !listRecursiveMatchPath.contains(subscribed))
             .filter(mailboxQuery::isPathMatch)
+            .filter(subscribedPredicate)
             .flatMap(subscribed -> buildListResponse(listRequest, 
searchedResultMap, session, relative, subscribed).stream())
             .filter(pair -> 
!listRequest.getSelectOptions().contains(SPECIAL_USE) || 
mailboxTyper.getMailboxType(session, pair.getKey()).getRfc6154attributeName() 
!= null)
             .forEach(pair -> responseBuilders.add(Triple.of(pair.getLeft(), 
pair.getRight(), Optional.ofNullable(searchedResultMap.get(pair.getLeft())))));
@@ -275,6 +280,18 @@ public class ListProcessor<T extends ListRequest> extends 
AbstractMailboxProcess
         return responseBuilders.build();
     }
 
+    private Predicate<MailboxPath> subscribedPredicate(MailboxSession 
mailboxSession, boolean isRelative, ListRequest request) {
+        MailboxNameExpression subscribeExpression = new PrefixedRegex(
+            request.getBaseReferenceName(),
+            ModifiedUtf7.decodeModifiedUTF7(request.getMailboxPattern()),
+            mailboxSession.getPathDelimiter());
+
+        PathConverter pathConverter = 
pathConverterFactory.forSession(mailboxSession);
+
+        return subscribedMailboxPath -> pathConverter.mailboxName(isRelative, 
subscribedMailboxPath, mailboxSession)
+            .map(subscribeExpression::isExpressionMatch).orElse(false);
+    }
+
     private Optional<Pair<MailboxPath, ListResponse>> 
buildListResponse(ListRequest listRequest, Map<MailboxPath, MailboxMetaData> 
searchedResultMap, ImapSession session, boolean relative, MailboxPath 
subscribed) {
         return pathConverterFactory.forSession(session).mailboxName(relative, 
subscribed, session.getMailboxSession())
             .map(name -> Pair.of(subscribed, 
Optional.ofNullable(searchedResultMap.get(subscribed))


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to