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 a37894bda2fee6362abdb3a3a4a64145e55730ec Author: Benoit TELLIER <btell...@linagora.com> AuthorDate: Wed Oct 9 21:57:52 2024 +0200 JAMES-2182 ListProcessor: extract ListRequest -> MailboxQuery convertion to PathConverter This allows customization... --- .../org/apache/james/imap/main/PathConverter.java | 79 ++++++++++++++++++++++ .../apache/james/imap/processor/ListProcessor.java | 79 +--------------------- 2 files changed, 81 insertions(+), 77 deletions(-) diff --git a/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java b/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java index 8a53728fa7..4eabd621b0 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java @@ -23,10 +23,14 @@ import java.util.List; import org.apache.james.core.Domain; import org.apache.james.core.Username; +import org.apache.james.imap.api.display.ModifiedUtf7; import org.apache.james.imap.api.process.ImapSession; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.mailbox.model.search.MailboxQuery; +import org.apache.james.mailbox.model.search.PrefixedRegex; +import org.apache.james.mailbox.model.search.Wildcard; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; @@ -158,9 +162,84 @@ public interface PathConverter { return joinMailboxPath(path, session); } } + + public MailboxQuery mailboxQuery(String finalReferencename, String mailboxName, ImapSession session) { + MailboxSession mailboxSession = session.getMailboxSession(); + String decodedMailboxName = ModifiedUtf7.decodeModifiedUTF7(mailboxName); + if (finalReferencename.isEmpty()) { + if (mailboxName.equals("*")) { + return MailboxQuery.builder() + .matchesAllMailboxNames() + .build(); + } + return MailboxQuery.builder() + .expression(new PrefixedRegex( + "", + decodedMailboxName, + mailboxSession.getPathDelimiter())) + .build(); + } + + MailboxPath basePath = computeBasePath(session, finalReferencename); + if (basePath.getNamespace().equals(MailboxConstants.USER_NAMESPACE) + && basePath.getUser() == null) { + + int separatorPosition = decodedMailboxName.indexOf(mailboxSession.getPathDelimiter()); + if (separatorPosition >= 0) { + // interpret first part as the user + Username username = Username.of(decodedMailboxName.substring(0, separatorPosition)); + return MailboxQuery.builder() + .namespace(MailboxConstants.USER_NAMESPACE) + .username(username) + .expression(new PrefixedRegex( + basePath.getName(), + decodedMailboxName.substring(separatorPosition + 1), + mailboxSession.getPathDelimiter())) + .build(); + } + + return MailboxQuery.builder() + .namespace(MailboxConstants.USER_NAMESPACE) + .expression(new PrefixedRegex( + basePath.getName(), + decodedMailboxName, + mailboxSession.getPathDelimiter())) + .build(); + } + if (basePath.getNamespace().equals(MailboxConstants.USER_NAMESPACE) + && basePath.getUser().equals(mailboxSession.getUser()) + && basePath.getName().isEmpty() + && mailboxName.equals("*")) { + + return MailboxQuery.builder() + .userAndNamespaceFrom(basePath) + .expression(Wildcard.INSTANCE) + .build(); + } + + return MailboxQuery.builder() + .userAndNamespaceFrom(basePath) + .expression(new PrefixedRegex( + basePath.getName(), + decodedMailboxName, + mailboxSession.getPathDelimiter())) + .build(); + } + + private MailboxPath computeBasePath(ImapSession session, String finalReferencename) { + String decodedName = ModifiedUtf7.decodeModifiedUTF7(finalReferencename); + boolean isRelative = !finalReferencename.startsWith("#"); + if (isRelative) { + return MailboxPath.forUser(session.getUserName(), decodedName); + } else { + return buildFullPath(decodedName); + } + } } MailboxPath buildFullPath(String mailboxName); String mailboxName(boolean relative, MailboxPath path, MailboxSession session); + + MailboxQuery mailboxQuery(String finalReferencename, String mailboxName, ImapSession session); } 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 4642620d44..fcb1a48aa6 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 @@ -36,7 +36,6 @@ import jakarta.inject.Inject; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; -import org.apache.james.core.Username; import org.apache.james.imap.api.display.HumanReadableText; import org.apache.james.imap.api.display.ModifiedUtf7; import org.apache.james.imap.api.message.Capability; @@ -62,8 +61,6 @@ 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.MailboxQuery; -import org.apache.james.mailbox.model.search.PrefixedRegex; -import org.apache.james.mailbox.model.search.Wildcard; import org.apache.james.metrics.api.MetricFactory; import org.apache.james.util.MDCBuilder; import org.apache.james.util.ReactorUtils; @@ -196,7 +193,8 @@ public class ListProcessor<T extends ListRequest> extends AbstractMailboxProcess // Should the namespace section be returned or not? boolean isRelative = ((request.getBaseReferenceName() + request.getMailboxPattern()).charAt(0) != MailboxConstants.NAMESPACE_PREFIX_CHAR); - MailboxQuery mailboxQuery = mailboxQuery(request.getBaseReferenceName(), request.getMailboxPattern(), mailboxSession, session, isRelative); + MailboxQuery mailboxQuery = pathConverterFactory.forSession(session) + .mailboxQuery(request.getBaseReferenceName(), request.getMailboxPattern(), session); if (request.selectSubscribed()) { return processWithSubscribed(session, request, responder, mailboxSession, isRelative, mailboxQuery); @@ -331,79 +329,6 @@ public class ListProcessor<T extends ListRequest> extends AbstractMailboxProcess return metaData.getResolvedAcls().getEntries().get(entryKey); } - private MailboxQuery mailboxQuery(String finalReferencename, String mailboxName, MailboxSession mailboxSession, - ImapSession session, boolean isRelative) { - String decodedMailboxName = ModifiedUtf7.decodeModifiedUTF7(mailboxName); - if (finalReferencename.isEmpty()) { - if (mailboxName.equals("*")) { - return MailboxQuery.builder() - .matchesAllMailboxNames() - .build(); - } - return MailboxQuery.builder() - .expression(new PrefixedRegex( - "", - decodedMailboxName, - mailboxSession.getPathDelimiter())) - .build(); - } - - MailboxPath basePath = computeBasePath(session, finalReferencename, isRelative); - if (basePath.getNamespace().equals(MailboxConstants.USER_NAMESPACE) - && basePath.getUser() == null) { - - int separatorPosition = decodedMailboxName.indexOf(mailboxSession.getPathDelimiter()); - if (separatorPosition >= 0) { - // interpret first part as the user - Username username = Username.of(decodedMailboxName.substring(0, separatorPosition)); - return MailboxQuery.builder() - .namespace(MailboxConstants.USER_NAMESPACE) - .username(username) - .expression(new PrefixedRegex( - basePath.getName(), - decodedMailboxName.substring(separatorPosition + 1), - mailboxSession.getPathDelimiter())) - .build(); - } - - return MailboxQuery.builder() - .namespace(MailboxConstants.USER_NAMESPACE) - .expression(new PrefixedRegex( - basePath.getName(), - decodedMailboxName, - mailboxSession.getPathDelimiter())) - .build(); - } - if (basePath.getNamespace().equals(MailboxConstants.USER_NAMESPACE) - && basePath.getUser().equals(mailboxSession.getUser()) - && basePath.getName().isEmpty() - && mailboxName.equals("*")) { - - return MailboxQuery.builder() - .userAndNamespaceFrom(basePath) - .expression(Wildcard.INSTANCE) - .build(); - } - - return MailboxQuery.builder() - .userAndNamespaceFrom(basePath) - .expression(new PrefixedRegex( - basePath.getName(), - decodedMailboxName, - mailboxSession.getPathDelimiter())) - .build(); - } - - private MailboxPath computeBasePath(ImapSession session, String finalReferencename, boolean isRelative) { - String decodedName = ModifiedUtf7.decodeModifiedUTF7(finalReferencename); - if (isRelative) { - return MailboxPath.forUser(session.getUserName(), decodedName); - } else { - return pathConverterFactory.forSession(session).buildFullPath(decodedName); - } - } - - /** * retrieve mailboxType for specified mailboxPath using provided * MailboxTyper --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org