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 c4d7861ae0376a9a80bc5ed0b3b686fbee3a82f7 Author: Benoit TELLIER <btell...@linagora.com> AuthorDate: Wed Nov 20 11:47:33 2024 +0100 JAMES-4090 Allow disconnecting several user at once This allows doing so with a single pass onto the channels --- .../java/org/apache/james/DisconnectorNotifier.java | 4 +++- .../james/jmap/routes/EventSourceRoutes.scala | 3 ++- .../apache/james/jmap/routes/WebSocketRoutes.scala | 3 ++- .../protocols/webadmin/ProtocolServerRoutes.java | 21 ++++++++++++++++++++- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/server/data/data-api/src/main/java/org/apache/james/DisconnectorNotifier.java b/server/data/data-api/src/main/java/org/apache/james/DisconnectorNotifier.java index e0f4b3786e..f65610f333 100644 --- a/server/data/data-api/src/main/java/org/apache/james/DisconnectorNotifier.java +++ b/server/data/data-api/src/main/java/org/apache/james/DisconnectorNotifier.java @@ -19,6 +19,8 @@ package org.apache.james; +import java.util.function.Predicate; + import jakarta.inject.Inject; import org.apache.james.core.Disconnector; @@ -34,7 +36,7 @@ public interface DisconnectorNotifier extends Disconnector { } @Override - public void disconnect(Username username) { + public void disconnect(Predicate<Username> username) { 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 0d530e2f3c..c67888bd24 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 @@ -21,7 +21,9 @@ package org.apache.james.jmap.routes import java.nio.charset.StandardCharsets import java.util.concurrent.atomic.AtomicReference +import java.util.function.Predicate import java.util.stream + import cats.implicits._ import eu.timepit.refined.api.Refined import eu.timepit.refined.numeric.Positive @@ -52,7 +54,6 @@ 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 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 f2c9e7ee9d..2471f79e97 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 @@ -21,7 +21,9 @@ package org.apache.james.jmap.routes import java.nio.charset.StandardCharsets import java.util.concurrent.atomic.AtomicReference +import java.util.function.Predicate import java.util.stream + import io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE import io.netty.handler.codec.http.websocketx.WebSocketFrame import io.netty.handler.codec.http.{HttpHeaderNames, HttpMethod} @@ -51,7 +53,6 @@ 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 { 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 9211ade17e..d0b9de4c1c 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 @@ -19,6 +19,7 @@ package org.apache.james.protocols.webadmin; +import java.util.List; import java.util.Optional; import java.util.Set; @@ -33,15 +34,23 @@ import org.apache.james.webadmin.utils.ErrorResponder; import org.apache.james.webadmin.utils.Responses; import org.eclipse.jetty.http.HttpStatus; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.fge.lambdas.Throwing; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; +import com.google.common.base.Strings; +import com.google.common.collect.ImmutableSet; import spark.Request; import spark.Service; public class ProtocolServerRoutes implements Routes { public static final String SERVERS = "servers"; + public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + public static final TypeReference<List<String>> LIST_OF_STRING = new TypeReference<>() { + + }; private final Set<CertificateReloadable.Factory> servers; private final DisconnectorNotifier disconnector; @@ -87,7 +96,17 @@ public class ProtocolServerRoutes implements Routes { }); service.delete(SERVERS + "/users", (request, response) -> { - disconnector.disconnect(any -> true); + String body = request.body(); + + if (Strings.isNullOrEmpty(body)) { + disconnector.disconnect(any -> true); + } else { + ImmutableSet<Username> userSet = OBJECT_MAPPER.readValue(body, LIST_OF_STRING) + .stream() + .map(Username::of) + .collect(ImmutableSet.toImmutableSet()); + disconnector.disconnect(userSet::contains); + } return Responses.returnNoContent(response); }); --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org