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 696c62c0e4e26513a8cbd678e9820dc83b528d76 Author: Benoit TELLIER <btell...@linagora.com> AuthorDate: Sun Nov 17 09:50:45 2024 +0100 JAMES-4090 Propose a generic framework to use disconnector outside of the protocol-api --- core/pom.xml | 4 +++ .../java/org/apache/james/core/Disconnector.java | 29 ++++++++++++++-------- .../james/modules/protocols/IMAPServerModule.java | 3 +++ .../james/modules/protocols/SMTPServerModule.java | 2 ++ .../james/modules/server/ServerRouteModule.java | 7 ++++++ .../apache/james/imapserver/netty/IMAPServer.java | 6 +++-- .../james/imapserver/netty/IMAPServerFactory.java | 12 ++++++++- .../james/imapserver/netty/IMAPServerTest.java | 2 +- .../protocols/lib/netty/CertificateReloadable.java | 4 --- .../apache/james/smtpserver/netty/SMTPServer.java | 5 ++-- .../james/smtpserver/netty/SMTPServerFactory.java | 11 +++++++- .../protocols/webadmin/ProtocolServerRoutes.java | 10 ++++---- 12 files changed, 69 insertions(+), 26 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 4f26db199f..03bc742762 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -57,6 +57,10 @@ <groupId>jakarta.annotation</groupId> <artifactId>jakarta.annotation-api</artifactId> </dependency> + <dependency> + <groupId>jakarta.inject</groupId> + <artifactId>jakarta.inject-api</artifactId> + </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> diff --git a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java b/core/src/main/java/org/apache/james/core/Disconnector.java similarity index 65% copy from server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java copy to core/src/main/java/org/apache/james/core/Disconnector.java index 212cceedca..cd22b01046 100644 --- a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java +++ b/core/src/main/java/org/apache/james/core/Disconnector.java @@ -16,22 +16,31 @@ * specific language governing permissions and limitations * * under the License. * ****************************************************************/ -package org.apache.james.protocols.lib.netty; -import java.util.stream.Stream; +package org.apache.james.core; -import org.apache.james.core.Username; +import java.util.Set; -public interface CertificateReloadable { - interface Factory { - Stream<? extends CertificateReloadable> certificatesReloadable(); - } +import jakarta.inject.Inject; + +public interface Disconnector { + Disconnector NOOP = user -> { + + }; - void reloadSSLCertificate() throws Exception; + void disconnect(Username username); - int getPort(); + class CompositeDisconnector implements Disconnector { + private final Set<Disconnector> disconnectorSet; - default void logout(Username user) { + @Inject + public CompositeDisconnector(Set<Disconnector> disconnectorSet) { + this.disconnectorSet = disconnectorSet; + } + @Override + public void disconnect(Username username) { + disconnectorSet.forEach(disconnector -> disconnector.disconnect(username)); + } } } 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 617f75630f..b79d43afa8 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 @@ -28,6 +28,7 @@ import org.apache.commons.configuration2.tree.ImmutableNode; import org.apache.commons.lang3.tuple.Pair; import org.apache.james.ProtocolConfigurationSanitizer; import org.apache.james.RunArguments; +import org.apache.james.core.Disconnector; import org.apache.james.core.healthcheck.HealthCheck; import org.apache.james.filesystem.api.FileSystem; import org.apache.james.imap.ImapSuite; @@ -116,6 +117,8 @@ public class IMAPServerModule extends AbstractModule { bind(ConnectionCheckFactory.class).to(ConnectionCheckFactoryImpl.class); Multibinder.newSetBinder(binder(), HealthCheck.class).addBinding().to(IMAPHealthCheck.class); + + Multibinder.newSetBinder(binder(), Disconnector.class).addBinding().to(IMAPServerFactory.class); } @Provides diff --git a/server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SMTPServerModule.java b/server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SMTPServerModule.java index b4f6b08e3c..9612eb0bf6 100644 --- a/server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SMTPServerModule.java +++ b/server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SMTPServerModule.java @@ -21,6 +21,7 @@ package org.apache.james.modules.protocols; import org.apache.james.ProtocolConfigurationSanitizer; import org.apache.james.RunArguments; +import org.apache.james.core.Disconnector; import org.apache.james.filesystem.api.FileSystem; import org.apache.james.lifecycle.api.ConfigurationSanitizer; import org.apache.james.protocols.lib.netty.CertificateReloadable; @@ -46,6 +47,7 @@ public class SMTPServerModule extends AbstractModule { Multibinder.newSetBinder(binder(), GuiceProbe.class).addBinding().to(SmtpGuiceProbe.class); Multibinder.newSetBinder(binder(), CertificateReloadable.Factory.class).addBinding().to(SMTPServerFactory.class); + Multibinder.newSetBinder(binder(), Disconnector.class).addBinding().to(SMTPServerFactory.class); } @ProvidesIntoSet diff --git a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/ServerRouteModule.java b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/ServerRouteModule.java index a8c20b902f..7d34b6114b 100644 --- a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/ServerRouteModule.java +++ b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/ServerRouteModule.java @@ -19,11 +19,13 @@ package org.apache.james.modules.server; +import org.apache.james.core.Disconnector; import org.apache.james.protocols.lib.netty.AbstractServerFactory; import org.apache.james.protocols.webadmin.ProtocolServerRoutes; import org.apache.james.webadmin.Routes; import com.google.inject.AbstractModule; +import com.google.inject.Scopes; import com.google.inject.multibindings.Multibinder; public class ServerRouteModule extends AbstractModule { @@ -34,5 +36,10 @@ public class ServerRouteModule extends AbstractModule { Multibinder.newSetBinder(binder(), Routes.class) .addBinding() .to(ProtocolServerRoutes.class); + + Multibinder.newSetBinder(binder(), Disconnector.class); + + bind(Disconnector.class).to(Disconnector.CompositeDisconnector.class); + bind(Disconnector.CompositeDisconnector.class).in(Scopes.SINGLETON); } } diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java index b929758a56..01b0ec4b6f 100644 --- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java +++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java @@ -29,6 +29,7 @@ import java.util.concurrent.TimeUnit; import org.apache.commons.configuration2.HierarchicalConfiguration; import org.apache.commons.configuration2.ex.ConfigurationException; import org.apache.commons.configuration2.tree.ImmutableNode; +import org.apache.james.core.Disconnector; import org.apache.james.core.Username; import org.apache.james.imap.api.ConnectionCheck; import org.apache.james.imap.api.ImapConfiguration; @@ -68,7 +69,7 @@ import io.netty.util.concurrent.GlobalEventExecutor; /** * NIO IMAP Server which use Netty. */ -public class IMAPServer extends AbstractConfigurableAsyncServer implements ImapConstants, IMAPServerMBean, NettyConstants { +public class IMAPServer extends AbstractConfigurableAsyncServer implements ImapConstants, IMAPServerMBean, NettyConstants, Disconnector { private static final Logger LOG = LoggerFactory.getLogger(IMAPServer.class); public static class AuthenticationConfiguration { @@ -197,7 +198,8 @@ public class IMAPServer extends AbstractConfigurableAsyncServer implements ImapC processor.configure(imapConfiguration); } - public void logout(Username user) { + @Override + public void disconnect(Username user) { imapChannelGroup.stream() .filter(channel -> Optional.ofNullable(channel.attr(IMAP_SESSION_ATTRIBUTE_KEY).get()) .flatMap(session -> Optional.ofNullable(session.getUserName())) diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java index ca6a97ff42..7880a634e9 100644 --- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java +++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java @@ -25,6 +25,8 @@ import jakarta.inject.Inject; import org.apache.commons.configuration2.HierarchicalConfiguration; import org.apache.commons.configuration2.tree.ImmutableNode; +import org.apache.james.core.Disconnector; +import org.apache.james.core.Username; import org.apache.james.filesystem.api.FileSystem; import org.apache.james.imap.ImapSuite; import org.apache.james.imap.api.ConnectionCheckFactory; @@ -38,7 +40,7 @@ import org.apache.james.protocols.lib.netty.AbstractServerFactory; import com.github.fge.lambdas.functions.ThrowingFunction; -public class IMAPServerFactory extends AbstractServerFactory { +public class IMAPServerFactory extends AbstractServerFactory implements Disconnector { protected final FileSystem fileSystem; protected final ThrowingFunction<HierarchicalConfiguration<ImmutableNode>, ImapSuite> imapSuiteProvider; @@ -94,4 +96,12 @@ public class IMAPServerFactory extends AbstractServerFactory { .map(IMAPServer.class::cast) .toList(); } + + @Override + public void disconnect(Username username) { + getServers() + .stream() + .map(server -> (IMAPServer) server) + .forEach(imapServer -> imapServer.disconnect(username)); + } } diff --git a/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java b/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java index f2896fbaf2..d467988fbd 100644 --- a/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java +++ b/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java @@ -253,7 +253,7 @@ class IMAPServerTest { testIMAPClient.connect("127.0.0.1", port) .login(USER.asString(), USER_PASS); - imapServer.logout(USER); + imapServer.disconnect(USER); assertThatThrownBy(() -> testIMAPClient .append("INBOX", SMALL_MESSAGE)); diff --git a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java b/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java index 212cceedca..9fdf4195cf 100644 --- a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java +++ b/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java @@ -30,8 +30,4 @@ public interface CertificateReloadable { void reloadSSLCertificate() throws Exception; int getPort(); - - default void logout(Username user) { - - } } diff --git a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java index 5ed535b7d3..b56c28f904 100644 --- a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java +++ b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java @@ -33,6 +33,7 @@ import jakarta.inject.Inject; import org.apache.commons.configuration2.HierarchicalConfiguration; import org.apache.commons.configuration2.ex.ConfigurationException; import org.apache.commons.configuration2.tree.ImmutableNode; +import org.apache.james.core.Disconnector; import org.apache.james.core.Username; import org.apache.james.dnsservice.api.DNSService; import org.apache.james.dnsservice.library.netmatcher.NetMatcher; @@ -66,7 +67,7 @@ import io.netty.util.concurrent.GlobalEventExecutor; /** * NIO SMTPServer which use Netty */ -public class SMTPServer extends AbstractProtocolAsyncServer implements SMTPServerMBean { +public class SMTPServer extends AbstractProtocolAsyncServer implements SMTPServerMBean, Disconnector { private static final Logger LOGGER = LoggerFactory.getLogger(SMTPServer.class); private SMTPProtocol transport; @@ -425,7 +426,7 @@ public class SMTPServer extends AbstractProtocolAsyncServer implements SMTPServe } @Override - public void logout(Username user) { + public void disconnect(Username user) { smtpChannelGroup.stream() .filter(channel -> { if (channel.attr(SESSION_ATTRIBUTE_KEY).get() instanceof SMTPSession smtpSession) { diff --git a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServerFactory.java b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServerFactory.java index 80562cd7a3..644ae1acc4 100644 --- a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServerFactory.java +++ b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServerFactory.java @@ -26,6 +26,8 @@ import jakarta.inject.Inject; import org.apache.commons.configuration2.HierarchicalConfiguration; import org.apache.commons.configuration2.tree.ImmutableNode; +import org.apache.james.core.Disconnector; +import org.apache.james.core.Username; import org.apache.james.dnsservice.api.DNSService; import org.apache.james.filesystem.api.FileSystem; import org.apache.james.metrics.api.MetricFactory; @@ -33,7 +35,7 @@ import org.apache.james.protocols.lib.handler.ProtocolHandlerLoader; import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer; import org.apache.james.protocols.lib.netty.AbstractServerFactory; -public class SMTPServerFactory extends AbstractServerFactory { +public class SMTPServerFactory extends AbstractServerFactory implements Disconnector { protected final DNSService dns; protected final ProtocolHandlerLoader loader; @@ -71,4 +73,11 @@ public class SMTPServerFactory extends AbstractServerFactory { return servers; } + @Override + public void disconnect(Username username) { + getServers() + .stream() + .map(server -> (SMTPServer) server) + .forEach(smtpServer -> smtpServer.disconnect(username)); + } } diff --git a/server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java b/server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java index 00aebd1528..9dffaa7d53 100644 --- a/server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java +++ b/server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java @@ -24,6 +24,7 @@ import java.util.Set; import jakarta.inject.Inject; +import org.apache.james.core.Disconnector; import org.apache.james.core.Username; import org.apache.james.protocols.lib.netty.CertificateReloadable; import org.apache.james.util.Port; @@ -43,10 +44,12 @@ public class ProtocolServerRoutes implements Routes { public static final String SERVERS = "servers"; private final Set<CertificateReloadable.Factory> servers; + private final Disconnector disconnector; @Inject - public ProtocolServerRoutes(Set<CertificateReloadable.Factory> servers) { + public ProtocolServerRoutes(Set<CertificateReloadable.Factory> servers, Disconnector disconnector) { this.servers = servers; + this.disconnector = disconnector; } @Override @@ -77,10 +80,7 @@ public class ProtocolServerRoutes implements Routes { }); service.delete(SERVERS + "/users/:user", (request, response) -> { - Username username = Username.of(request.params("user")); - servers.stream() - .flatMap(CertificateReloadable.Factory::certificatesReloadable) - .forEach(s -> s.logout(username)); + disconnector.disconnect(Username.of(request.params("user"))); return Responses.returnNoContent(response); }); --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org