You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ad...@apache.org on 2017/11/03 12:27:27 UTC
[04/15] james-project git commit: PROTOCOLS-117 General fixes: LSUB
should not be used for hierarchy delimiter finding
PROTOCOLS-117 General fixes: LSUB should not be used for hierarchy delimiter finding
RFC-3501 Have no mentions about it.
Most probably code was originally copy and pasted from LIST.
We should also take this occasion to refactor LSUB a bit
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/4e74c7c1
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/4e74c7c1
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/4e74c7c1
Branch: refs/heads/master
Commit: 4e74c7c1bd07d398c58aa799386ba2101665e6a2
Parents: 8ffa76d
Author: benwa <bt...@linagora.com>
Authored: Wed Nov 1 14:57:09 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri Nov 3 11:11:44 2017 +0700
----------------------------------------------------------------------
.../james/imap/processor/LSubProcessor.java | 105 ++++++-------------
.../james/imap/processor/LSubProcessorTest.java | 20 ----
2 files changed, 34 insertions(+), 91 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/4e74c7c1/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
index 62b7d29..f3a2dd8 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
@@ -30,7 +30,6 @@ import org.apache.james.imap.api.display.HumanReadableText;
import org.apache.james.imap.api.message.response.StatusResponseFactory;
import org.apache.james.imap.api.process.ImapProcessor;
import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.main.PathConverter;
import org.apache.james.imap.message.request.LsubRequest;
import org.apache.james.imap.message.response.LSubResponse;
import org.apache.james.mailbox.MailboxManager;
@@ -38,9 +37,7 @@ import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.SubscriptionManager;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.SubscriptionException;
-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.MailboxNameExpression;
import org.apache.james.mailbox.model.search.PrefixedRegex;
import org.apache.james.metrics.api.MetricFactory;
import org.apache.james.util.MDCBuilder;
@@ -55,49 +52,54 @@ public class LSubProcessor extends AbstractSubscriptionProcessor<LsubRequest> {
super(LsubRequest.class, next, mailboxManager, subscriptionManager, factory, metricFactory);
}
- private void listSubscriptions(ImapSession session, Responder responder, String referenceName, String mailboxName) throws SubscriptionException, MailboxException {
- final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
- final Collection<String> mailboxes = getSubscriptionManager().subscriptions(mailboxSession);
- // If the mailboxName is fully qualified, ignore the reference name.
- String finalReferencename = referenceName;
+ /**
+ * @see org.apache.james.imap.processor.AbstractSubscriptionProcessor
+ * #doProcessRequest(org.apache.james.imap.api.message.request.ImapRequest,
+ * org.apache.james.imap.api.process.ImapSession, java.lang.String,
+ * org.apache.james.imap.api.ImapCommand,
+ * org.apache.james.imap.api.process.ImapProcessor.Responder)
+ */
+ protected void doProcessRequest(LsubRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+ String referenceName = request.getBaseReferenceName();
+ String mailboxPattern = request.getMailboxPattern();
- if (mailboxName.charAt(0) == MailboxConstants.NAMESPACE_PREFIX_CHAR) {
- finalReferencename = "";
- }
+ try {
+ listSubscriptions(session, responder, referenceName, mailboxPattern);
- // Is the interpreted (combined) pattern relative?
- boolean isRelative = ((finalReferencename + mailboxName).charAt(0) != MailboxConstants.NAMESPACE_PREFIX_CHAR);
- MailboxPath basePath = null;
- if (isRelative) {
- basePath = MailboxPath.forUser(mailboxSession.getUser().getUserName(), CharsetUtil.decodeModifiedUTF7(finalReferencename));
- } else {
- basePath = PathConverter.forSession(session).buildFullPath(CharsetUtil.decodeModifiedUTF7(finalReferencename));
+ okComplete(command, tag, responder);
+ } catch (MailboxException e) {
+ LOGGER.error("LSub failed for reference " + referenceName + " and pattern " + mailboxPattern, e);
+ no(command, tag, responder, HumanReadableText.GENERIC_LSUB_FAILURE);
}
+ }
+
+ private void listSubscriptions(ImapSession session, Responder responder, String referenceName, String mailboxName) throws SubscriptionException, MailboxException {
+ MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
+ Collection<String> mailboxes = getSubscriptionManager().subscriptions(mailboxSession);
+
+ String decodedMailName = CharsetUtil.decodeModifiedUTF7(referenceName);
+
+ MailboxNameExpression expression = new PrefixedRegex(
+ decodedMailName,
+ CharsetUtil.decodeModifiedUTF7(mailboxName),
+ mailboxSession.getPathDelimiter());
+ Collection<String> mailboxResponses = new ArrayList<>();
- final MailboxQuery expression = MailboxQuery.builder()
- .userAndNamespaceFrom(basePath)
- .expression(new PrefixedRegex(
- basePath.getName(),
- CharsetUtil.decodeModifiedUTF7(mailboxName),
- mailboxSession.getPathDelimiter()))
- .build();
- final Collection<String> mailboxResponses = new ArrayList<>();
for (String mailbox : mailboxes) {
respond(responder, expression, mailbox, true, mailboxes, mailboxResponses, mailboxSession.getPathDelimiter());
}
}
- private void respond(Responder responder, MailboxQuery expression, String mailboxName, boolean originalSubscription, Collection<String> mailboxes, Collection<String> mailboxResponses, char delimiter) {
+ private void respond(Responder responder, MailboxNameExpression expression, String mailboxName, boolean originalSubscription, Collection<String> mailboxes, Collection<String> mailboxResponses, char delimiter) {
if (expression.isExpressionMatch(mailboxName)) {
if (!mailboxResponses.contains(mailboxName)) {
- final LSubResponse response = new LSubResponse(mailboxName, !originalSubscription, delimiter);
- responder.respond(response);
+ responder.respond(new LSubResponse(mailboxName, !originalSubscription, delimiter));
mailboxResponses.add(mailboxName);
}
} else {
- final int lastDelimiter = mailboxName.lastIndexOf(delimiter);
+ int lastDelimiter = mailboxName.lastIndexOf(delimiter);
if (lastDelimiter > 0) {
- final String parentMailbox = mailboxName.substring(0, lastDelimiter);
+ String parentMailbox = mailboxName.substring(0, lastDelimiter);
if (!mailboxes.contains(parentMailbox)) {
respond(responder, expression, parentMailbox, false, mailboxes, mailboxResponses, delimiter);
}
@@ -105,45 +107,6 @@ public class LSubProcessor extends AbstractSubscriptionProcessor<LsubRequest> {
}
}
- /**
- * An empty mailboxPattern signifies a request for the hierarchy delimiter
- * and root name of the referenceName argument
- *
- * @param referenceName
- * IMAP reference name, possibly null
- */
- private void respondWithHierarchyDelimiter(Responder responder, char delimiter) {
- final LSubResponse response = new LSubResponse("", true, delimiter);
- responder.respond(response);
- }
-
- /**
- * @see org.apache.james.imap.processor.AbstractSubscriptionProcessor
- * #doProcessRequest(org.apache.james.imap.api.message.request.ImapRequest,
- * org.apache.james.imap.api.process.ImapSession, java.lang.String,
- * org.apache.james.imap.api.ImapCommand,
- * org.apache.james.imap.api.process.ImapProcessor.Responder)
- */
- protected void doProcessRequest(LsubRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
- final String referenceName = request.getBaseReferenceName();
- final String mailboxPattern = request.getMailboxPattern();
- final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
-
- try {
- if (mailboxPattern.length() == 0) {
- respondWithHierarchyDelimiter(responder, mailboxSession.getPathDelimiter());
- } else {
- listSubscriptions(session, responder, referenceName, mailboxPattern);
- }
-
- okComplete(command, tag, responder);
- } catch (MailboxException e) {
- LOGGER.error("LSub failed for reference " + referenceName + " and pattern " + mailboxPattern, e);
- final HumanReadableText displayTextKey = HumanReadableText.GENERIC_LSUB_FAILURE;
- no(command, tag, responder, displayTextKey);
- }
- }
-
@Override
protected Closeable addContextToMDC(LsubRequest message) {
return MDCBuilder.create()
http://git-wip-us.apache.org/repos/asf/james-project/blob/4e74c7c1/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
index 0f62d3a..058103f 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
@@ -139,26 +139,6 @@ public class LSubProcessorTest {
}
@Test
- public void testHierarchy() throws Exception {
- subscriptions.add(MAILBOX_A);
- subscriptions.add(MAILBOX_B);
- subscriptions.add(MAILBOX_C);
-
- mockery.checking(new Expectations() {{
- allowing(session).getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY); will(returnValue(mailboxSession));
- allowing(mailboxSession).getPathDelimiter(); will(returnValue(HIERARCHY_DELIMITER));
- oneOf(responder).respond(with(
- equal(new LSubResponse("", true, HIERARCHY_DELIMITER))));
- }});
-
- expectOk();
-
- LsubRequest request = new LsubRequest(command, "", "", TAG);
- processor.doProcessRequest(request, session, TAG, command, responderImpl);
-
- }
-
- @Test
public void testShouldRespondToRegexWithSubscribedMailboxes()
throws Exception {
subscriptions.add(MAILBOX_A);
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org