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