You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2022/12/07 10:40:02 UTC
[james-project] 05/08: JAMES-3754 IMAP Fix SUBSCRIBED LIST return option
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 <bt...@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-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org