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 2023/01/19 03:21:56 UTC

[james-project] 03/03: JAMES-3867 Fix Capability/Enable injection

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 2dc84e79b393dcdfc6e8c610df44c00d815c0b7d
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Jan 18 23:12:08 2023 +0700

    JAMES-3867 Fix Capability/Enable injection
---
 .../org/apache/james/examples/imap/PingProcessor.java | 12 +++++++++++-
 .../james/examples/imap/ImapCustomPackagesTest.java   |  8 ++++++++
 .../james/modules/protocols/IMAPServerModule.java     | 19 +++++++++++--------
 3 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/examples/custom-imap/src/main/java/org/apache/james/examples/imap/PingProcessor.java b/examples/custom-imap/src/main/java/org/apache/james/examples/imap/PingProcessor.java
index fe26a5c6a3..c7ec4687ea 100644
--- a/examples/custom-imap/src/main/java/org/apache/james/examples/imap/PingProcessor.java
+++ b/examples/custom-imap/src/main/java/org/apache/james/examples/imap/PingProcessor.java
@@ -19,20 +19,25 @@
 
 package org.apache.james.examples.imap;
 
+import java.util.List;
 import java.util.Properties;
 
 import javax.inject.Inject;
 
 import org.apache.james.imap.api.ImapConfiguration;
 import org.apache.james.imap.api.display.HumanReadableText;
+import org.apache.james.imap.api.message.Capability;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.processor.CapabilityImplementingProcessor;
 import org.apache.james.imap.processor.base.AbstractProcessor;
 import org.apache.james.util.MDCBuilder;
 
+import com.google.common.collect.ImmutableList;
+
 import reactor.core.publisher.Mono;
 
-public class PingProcessor extends AbstractProcessor<PingImapPackages.PingRequest> {
+public class PingProcessor extends AbstractProcessor<PingImapPackages.PingRequest> implements CapabilityImplementingProcessor {
     private final StatusResponseFactory factory;
     private String pongResponse;
 
@@ -42,6 +47,11 @@ public class PingProcessor extends AbstractProcessor<PingImapPackages.PingReques
         this.factory = factory;
     }
 
+    @Override
+    public List<Capability> getImplementedCapabilities(ImapSession session) {
+        return ImmutableList.of(Capability.of("PING"));
+    }
+
     @Override
     public void configure(ImapConfiguration imapConfiguration) {
         Properties customProperties = imapConfiguration.getCustomProperties();
diff --git a/examples/custom-imap/src/test/java/org/apache/james/examples/imap/ImapCustomPackagesTest.java b/examples/custom-imap/src/test/java/org/apache/james/examples/imap/ImapCustomPackagesTest.java
index 922227ee91..9450570f34 100644
--- a/examples/custom-imap/src/test/java/org/apache/james/examples/imap/ImapCustomPackagesTest.java
+++ b/examples/custom-imap/src/test/java/org/apache/james/examples/imap/ImapCustomPackagesTest.java
@@ -66,6 +66,14 @@ class ImapCustomPackagesTest {
             .contains("PONG");
     }
 
+    @Test
+    void imapServerShouldSupportModularCapability(GuiceJamesServer server) throws IOException {
+        assertThat(new TestIMAPClient().connect("127.0.0.1", server.getProbe(ImapGuiceProbe.class).getImapPort())
+            .login(BOB, BOB_PASSWORD)
+            .sendCommand("CAPABILITY"))
+            .contains("PING");
+    }
+
     @Test
     void imapServerShouldSupportCustomConfigurationValues(GuiceJamesServer server) throws IOException {
         assertThat(new TestIMAPClient().connect("127.0.0.1", server.getProbe(ImapGuiceProbe.class).getImapPort())
diff --git a/server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/IMAPServerModule.java b/server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/IMAPServerModule.java
index 536aee23ac..bafd667fc8 100644
--- a/server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/IMAPServerModule.java
+++ b/server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/IMAPServerModule.java
@@ -93,8 +93,13 @@ public class IMAPServerModule extends AbstractModule {
     }
 
     @Provides
-    ImapProcessor provideImapProcessor(ImapPackage imapPackage, GuiceGenericLoader loader, StatusResponseFactory statusResponseFactory) {
-        ImmutableMap<Class, ImapProcessor> processorMap = imapPackage.processors()
+    ImapProcessor provideImapProcessor(ImmutableMap<Class, ImapProcessor> processorMap, StatusResponseFactory statusResponseFactory) {
+        return new DefaultProcessor(processorMap, new UnknownRequestProcessor(statusResponseFactory));
+    }
+
+    @Provides
+    ImmutableMap<Class, ImapProcessor> provideClassImapProcessors(ImapPackage imapPackage, GuiceGenericLoader loader) {
+        return imapPackage.processors()
             .stream()
             .map(Throwing.function(loader::instantiate))
             .map(AbstractProcessor.class::cast)
@@ -102,8 +107,6 @@ public class IMAPServerModule extends AbstractModule {
             .collect(ImmutableMap.toImmutableMap(
                 Pair::getLeft,
                 Pair::getRight));
-
-        return new DefaultProcessor(processorMap, new UnknownRequestProcessor(statusResponseFactory));
     }
 
     @Provides
@@ -158,22 +161,22 @@ public class IMAPServerModule extends AbstractModule {
     }
 
     @ProvidesIntoSet
-    InitializationOperation configureEnable(EnableProcessor enableProcessor, ImapPackage imapPackage) {
+    InitializationOperation configureEnable(EnableProcessor enableProcessor, ImmutableMap<Class, ImapProcessor> processorMap) {
         return InitilizationOperationBuilder
             .forClass(IMAPServerFactory.class)
             .init(() ->
-                imapPackage.processors().stream()
+                processorMap.values().stream()
                     .filter(PermitEnableCapabilityProcessor.class::isInstance)
                     .map(PermitEnableCapabilityProcessor.class::cast)
                     .forEach(enableProcessor::addProcessor));
     }
 
     @ProvidesIntoSet
-    InitializationOperation configureCapability(CapabilityProcessor capabilityProcessor, ImapPackage imapPackage) {
+    InitializationOperation configureCapability(CapabilityProcessor capabilityProcessor, ImmutableMap<Class, ImapProcessor> processorMap) {
         return InitilizationOperationBuilder
             .forClass(IMAPServerFactory.class)
             .init(() ->
-                imapPackage.processors().stream()
+                processorMap.values().stream()
                     .filter(CapabilityImplementingProcessor.class::isInstance)
                     .map(CapabilityImplementingProcessor.class::cast)
                     .forEach(capabilityProcessor::addProcessor));


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