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 34e909b29557a4b6698c99b46a5f3a3c44bab4c5 Author: Benoit TELLIER <btell...@linagora.com> AuthorDate: Wed Nov 20 11:42:14 2024 +0100 JAMES-4090 Endpoint to diconnect all users --- core/src/main/java/org/apache/james/core/Disconnector.java | 5 +++-- .../scala/org/apache/james/jmap/routes/EventSourceRoutes.scala | 5 +++-- .../scala/org/apache/james/jmap/routes/WebSocketRoutes.scala | 5 +++-- .../main/java/org/apache/james/imapserver/netty/IMAPServer.java | 5 +++-- .../org/apache/james/imapserver/netty/IMAPServerFactory.java | 3 ++- .../java/org/apache/james/imapserver/netty/IMAPServerTest.java | 2 +- .../main/java/org/apache/james/smtpserver/netty/SMTPServer.java | 5 +++-- .../org/apache/james/smtpserver/netty/SMTPServerFactory.java | 3 ++- .../apache/james/protocols/webadmin/ProtocolServerRoutes.java | 9 ++++++++- 9 files changed, 28 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/org/apache/james/core/Disconnector.java b/core/src/main/java/org/apache/james/core/Disconnector.java index cd22b01046..e736c243f8 100644 --- a/core/src/main/java/org/apache/james/core/Disconnector.java +++ b/core/src/main/java/org/apache/james/core/Disconnector.java @@ -20,6 +20,7 @@ package org.apache.james.core; import java.util.Set; +import java.util.function.Predicate; import jakarta.inject.Inject; @@ -28,7 +29,7 @@ public interface Disconnector { }; - void disconnect(Username username); + void disconnect(Predicate<Username> username); class CompositeDisconnector implements Disconnector { private final Set<Disconnector> disconnectorSet; @@ -39,7 +40,7 @@ public interface Disconnector { } @Override - public void disconnect(Username username) { + public void disconnect(Predicate<Username> username) { disconnectorSet.forEach(disconnector -> disconnector.disconnect(username)); } } diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/EventSourceRoutes.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/EventSourceRoutes.scala index 35f0105504..0d530e2f3c 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/EventSourceRoutes.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/EventSourceRoutes.scala @@ -52,6 +52,7 @@ import reactor.core.scala.publisher.{SFlux, SMono} import reactor.core.scheduler.Schedulers import reactor.netty.http.server.{HttpServerRequest, HttpServerResponse} +import java.util.function.Predicate import scala.concurrent.duration._ import scala.jdk.CollectionConverters._ import scala.language.postfixOps @@ -236,10 +237,10 @@ class EventSourceRoutes@Inject() (@Named(InjectionKeys.RFC_8621) val authenticat StandardCharsets.UTF_8) .`then`) - override def disconnect(username: Username): Unit = { + override def disconnect(username: Predicate[Username]): Unit = { val contexts = connectedUsers.values() .stream() - .filter(context => username.equals(context.session.getUser)) + .filter(context => username.test(context.session.getUser)) .toList contexts diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala index bd35b6f7c3..f2c9e7ee9d 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala @@ -51,6 +51,7 @@ import reactor.core.scheduler.Schedulers import reactor.netty.http.server.{HttpServerRequest, HttpServerResponse} import reactor.netty.http.websocket.{WebsocketInbound, WebsocketOutbound} +import java.util.function.Predicate import scala.jdk.CollectionConverters._ object WebSocketRoutes { @@ -195,10 +196,10 @@ class WebSocketRoutes @Inject() (@Named(InjectionKeys.RFC_8621) val authenticato StandardCharsets.UTF_8) .`then`) - override def disconnect(username: Username): Unit = { + override def disconnect(username: Predicate[Username]): Unit = { val contexts = connectedUsers.values() .stream() - .filter(context => username.equals(context.session.getUser)) + .filter(context => username.test(context.session.getUser)) .toList contexts 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 01b0ec4b6f..f2e08114a6 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 @@ -25,6 +25,7 @@ import java.util.LinkedHashMap; import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; import org.apache.commons.configuration2.HierarchicalConfiguration; import org.apache.commons.configuration2.ex.ConfigurationException; @@ -199,11 +200,11 @@ public class IMAPServer extends AbstractConfigurableAsyncServer implements ImapC } @Override - public void disconnect(Username user) { + public void disconnect(Predicate<Username> user) { imapChannelGroup.stream() .filter(channel -> Optional.ofNullable(channel.attr(IMAP_SESSION_ATTRIBUTE_KEY).get()) .flatMap(session -> Optional.ofNullable(session.getUserName())) - .map(user::equals) + .map(user::test) .orElse(false)) .forEach(channel -> channel.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE)); } 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 7880a634e9..9ddcdb30b0 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 @@ -20,6 +20,7 @@ package org.apache.james.imapserver.netty; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; import jakarta.inject.Inject; @@ -98,7 +99,7 @@ public class IMAPServerFactory extends AbstractServerFactory implements Disconne } @Override - public void disconnect(Username username) { + public void disconnect(Predicate<Username> username) { getServers() .stream() .map(server -> (IMAPServer) server) 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 d467988fbd..54a76fdb86 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.disconnect(USER); + imapServer.disconnect(USER::equals); assertThatThrownBy(() -> testIMAPClient .append("INBOX", SMALL_MESSAGE)); 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 b56c28f904..8ead90f36a 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 @@ -27,6 +27,7 @@ import java.net.URISyntaxException; import java.util.Locale; import java.util.Optional; import java.util.Set; +import java.util.function.Predicate; import jakarta.inject.Inject; @@ -426,11 +427,11 @@ public class SMTPServer extends AbstractProtocolAsyncServer implements SMTPServe } @Override - public void disconnect(Username user) { + public void disconnect(Predicate<Username> user) { smtpChannelGroup.stream() .filter(channel -> { if (channel.attr(SESSION_ATTRIBUTE_KEY).get() instanceof SMTPSession smtpSession) { - return user.equals(smtpSession.getUsername()); + return user.test(smtpSession.getUsername()); } return false; }) 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 644ae1acc4..17b6197660 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 @@ -21,6 +21,7 @@ package org.apache.james.smtpserver.netty; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; import jakarta.inject.Inject; @@ -74,7 +75,7 @@ public class SMTPServerFactory extends AbstractServerFactory implements Disconne } @Override - public void disconnect(Username username) { + public void disconnect(Predicate<Username> username) { getServers() .stream() .map(server -> (SMTPServer) server) 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 b21d58e481..9211ade17e 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 @@ -80,7 +80,14 @@ public class ProtocolServerRoutes implements Routes { }); service.delete(SERVERS + "/users/:user", (request, response) -> { - disconnector.disconnect(Username.of(request.params("user"))); + Username username = Username.of(request.params("user")); + disconnector.disconnect(username::equals); + + return Responses.returnNoContent(response); + }); + + service.delete(SERVERS + "/users", (request, response) -> { + disconnector.disconnect(any -> true); return Responses.returnNoContent(response); }); --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org