]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
submission: Add admin-client with KICK-USER command
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 13 Jan 2022 16:09:51 +0000 (18:09 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 8 Feb 2022 09:48:24 +0000 (10:48 +0100)
src/submission/main.c
src/submission/submission-client.c
src/submission/submission-client.h

index d335716dab183281afafb1870a857a810c1afb86..cabdc8e1cf7a722f2cd191970bd6135f1907d3bf 100644 (file)
@@ -17,6 +17,7 @@
 #include "master-login.h"
 #include "master-service-settings.h"
 #include "master-interface.h"
+#include "master-admin-client.h"
 #include "var-expand.h"
 #include "mail-error.h"
 #include "mail-user.h"
@@ -289,6 +290,26 @@ static void login_client_failed(const struct master_login_client *client,
        }
 }
 
+static unsigned int
+master_admin_cmd_kick_user(const char *user, const guid_128_t conn_guid)
+{
+       struct client *client, *next;
+       unsigned int count = 0;
+
+       for (client = submission_clients; client != NULL; client = next) {
+               next = client->next;
+               if (strcmp(client->user->username, user) == 0 &&
+                   (guid_128_is_empty(conn_guid) ||
+                    guid_128_cmp(client->anvil_conn_guid, conn_guid) == 0))
+                       client_kick(client);
+       }
+       return count;
+}
+
+static const struct master_admin_client_callback admin_callbacks = {
+       .cmd_kick_user = master_admin_cmd_kick_user,
+};
+
 static void client_connected(struct master_service_connection *conn)
 {
        /* when running standalone, we shouldn't even get here */
@@ -373,6 +394,7 @@ int main(int argc, char *argv[])
        login_set.callback = login_client_connected;
        login_set.failure_callback = login_client_failed;
 
+       master_admin_clients_init(&admin_callbacks);
        master_service_set_die_callback(master_service, submission_die);
 
        storage_service =
index 6a5fcf31682d65177f8dbf3be00bc19f98afe97f..123087bdeddad52b5ba3590496f3025a6a586869 100644 (file)
@@ -493,14 +493,16 @@ void client_add_extra_capability(struct client *client, const char *capability,
        array_push_back(&client->extra_capabilities, &cap);
 }
 
-void clients_destroy_all(void)
+void client_kick(struct client *client)
 {
-       while (submission_clients != NULL) {
-               struct client *client = submission_clients;
+       mail_storage_service_io_activate_user(client->service_user);
+       client_destroy(&client, "4.3.2", "Shutting down");
+}
 
-               mail_storage_service_io_activate_user(client->service_user);
-               client_destroy(&client, "4.3.2", "Shutting down");
-       }
+void clients_destroy_all(void)
+{
+       while (submission_clients != NULL)
+               client_kick(submission_clients);
 }
 
 static const struct smtp_server_callbacks smtp_callbacks = {
index 3545e6f7c11083a059180a0e6d5ca6a889f484d4..805ea42d2a9cbbabcce23270a00ec3c3f3f8ea41 100644 (file)
@@ -143,6 +143,7 @@ client_create(int fd_in, int fd_out, struct mail_user *user,
              bool no_greeting);
 void client_destroy(struct client **client, const char *prefix,
                    const char *reason) ATTR_NULL(2, 3);
+void client_kick(struct client *client);
 
 typedef void (*client_input_callback_t)(struct client *context);