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 e988ce9a909cf48e0d75a8717247158c8cf1ff05
Author: Benoit Tellier <btell...@linagora.com>
AuthorDate: Fri Dec 2 23:20:54 2022 +0700

    JAMES-3754 IMAP Fix SUBSCRIBED LIST return option
---
 .../apache/james/imap/scripts/ListSubscribed.test   | 10 ++++++++++
 .../apache/james/imap/processor/ListProcessor.java  | 21 +++++++++++++++------
 .../apache/james/imap/processor/XListProcessor.java |  2 +-
 3 files changed, 26 insertions(+), 7 deletions(-)

diff --git 
a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListSubscribed.test
 
b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListSubscribed.test
index 28b745fc26..6c73e7950d 100644
--- 
a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListSubscribed.test
+++ 
b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListSubscribed.test
@@ -62,6 +62,16 @@ S: \* LIST \(\\HasChildren \\Subscribed\) \"\.\" "listtest"
 }
 S: A13 OK LIST completed.
 
+C: A08 LIST "" "*" RETURN (SUBSCRIBED)
+SUB {
+S: \* LIST \(\\HasChildren \\Subscribed\) \"\.\" "listtest"
+S: \* LIST \(\\HasNoChildren\) \"\.\" "INBOX"
+S: \* LIST \(\\HasNoChildren \\Subscribed\) \"\.\" "listtest.subfolder"
+S: \* LIST \(\\HasChildren\) \"\.\" "listtest1"
+S: \* LIST \(\\HasNoChildren\) \"\.\" "listtest1.subfolder1"
+}
+S: A08 OK LIST completed.
+
 C: A14 UNSUBSCRIBE listtest.subfolder
 S: A14 OK UNSUBSCRIBE completed.
 C: A15 UNSUBSCRIBE listtest
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 fd44a047ed..1fbe137595 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
@@ -28,6 +28,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.function.Function;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.tuple.Pair;
@@ -63,6 +64,7 @@ import org.slf4j.LoggerFactory;
 
 import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
@@ -136,8 +138,8 @@ public class ListProcessor<T extends ListRequest> extends 
AbstractMailboxProcess
     }
 
     protected ImapResponseMessage createResponse(MailboxMetaData.Children 
children, MailboxMetaData.Selectability selectability, String name,
-                                                 char hierarchyDelimiter, 
MailboxType type) {
-        return new ListResponse(children, selectability, name, 
hierarchyDelimiter, !RETURN_SUBSCRIBED,
+                                                 char hierarchyDelimiter, 
MailboxType type, boolean isSubscribed) {
+        return new ListResponse(children, selectability, name, 
hierarchyDelimiter, isSubscribed,
             !RETURN_NON_EXISTENT, 
EnumSet.noneOf(ListResponse.ChildInfo.class), type);
     }
 
@@ -151,7 +153,8 @@ public class ListProcessor<T extends ListRequest> extends 
AbstractMailboxProcess
             MailboxMetaData.Selectability.NOSELECT,
             referenceRoot,
             mailboxSession.getPathDelimiter(),
-            MailboxType.OTHER));
+            MailboxType.OTHER,
+            !RETURN_SUBSCRIBED));
     }
 
     private String computeReferenceRoot(String referenceName, MailboxSession 
mailboxSession) {
@@ -192,19 +195,25 @@ public class ListProcessor<T extends ListRequest> extends 
AbstractMailboxProcess
 
         if (request.selectSubscribed()) {
             return processWithSubscribed(session, request, responder, 
mailboxSession, isRelative, mailboxQuery);
+        } if 
(request.getReturnOptions().contains(ListRequest.ListReturnOption.SUBSCRIBED)) {
+            return Flux.from(Throwing.supplier(() -> 
subscriptionManager.subscriptionsReactive(mailboxSession)).get())
+                .collect(ImmutableMap.toImmutableMap(path -> path, path -> 
path))
+                .flatMap(subscribed -> processWithoutSubscribed(session, 
request, responder, mailboxSession, isRelative, mailboxQuery, 
subscribed::containsKey));
         } else {
-            return processWithoutSubscribed(session, request, responder, 
mailboxSession, isRelative, mailboxQuery);
+            return processWithoutSubscribed(session, request, responder, 
mailboxSession, isRelative, mailboxQuery, any -> false);
         }
     }
 
-    private Mono<Void> processWithoutSubscribed(ImapSession session, T 
request, Responder responder, MailboxSession mailboxSession, boolean 
isRelative, MailboxQuery mailboxQuery) {
+    private Mono<Void> processWithoutSubscribed(ImapSession session, T 
request, Responder responder, MailboxSession mailboxSession,
+                                                boolean isRelative, 
MailboxQuery mailboxQuery, Predicate<MailboxPath> isSubscribed) {
         return getMailboxManager().search(mailboxQuery, Minimal, 
mailboxSession)
             .doOnNext(metaData -> responder.respond(
                 createResponse(metaData.inferiors(),
                     metaData.getSelectability(),
                     mailboxName(isRelative, metaData.getPath(), 
metaData.getHierarchyDelimiter()),
                     metaData.getHierarchyDelimiter(),
-                    getMailboxType(request, session, metaData.getPath()))))
+                    getMailboxType(request, session, metaData.getPath()),
+                    isSubscribed.test(metaData.getPath()))))
             .doOnNext(metaData -> respondMyRights(request, responder, 
mailboxSession, metaData))
             .flatMap(metaData -> 
request.getStatusDataItems().map(statusDataItems -> 
statusProcessor.sendStatus(metaData.getPath(), statusDataItems, responder, 
session, mailboxSession)).orElse(Mono.empty()))
             .then();
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/XListProcessor.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/XListProcessor.java
index 5ae2066be6..b6cf974c1b 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/XListProcessor.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/XListProcessor.java
@@ -64,7 +64,7 @@ public class XListProcessor extends 
ListProcessor<XListRequest> implements Capab
 
     @Override
     protected ImapResponseMessage createResponse(MailboxMetaData.Children 
children, MailboxMetaData.Selectability selectability,
-                                                 String name, char 
hierarchyDelimiter, MailboxType type) {
+                                                 String name, char 
hierarchyDelimiter, MailboxType type, boolean isSubscribed) {
         return new XListResponse(children, selectability, name, 
hierarchyDelimiter, type);
     }
 


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

Reply via email to