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

index f3f7022026d6c563b6ca01a76d45f1f0fe46f8dd..e150135801c047450b3085862a3fa39a8c0c57e3 100644 (file)
@@ -1653,14 +1653,18 @@ void clients_init(void)
                                      imap_client_enable_qresync);
 }
 
+void client_kick(struct client *client)
+{
+       mail_storage_service_io_activate_user(client->service_user);
+       if (client->output_cmd_lock == NULL)
+               client_send_line(client, "* BYE Server shutting down.");
+       client_destroy(client, "Server shutting down.");
+}
+
 void clients_destroy_all(void)
 {
-       while (imap_clients != NULL) {
-               mail_storage_service_io_activate_user(imap_clients->service_user);
-               if (imap_clients->output_cmd_lock == NULL)
-                       client_send_line(imap_clients, "* BYE Server shutting down.");
-               client_destroy(imap_clients, "Server shutting down.");
-       }
+       while (imap_clients != NULL)
+               client_kick(imap_clients);
 }
 
 struct imap_client_vfuncs imap_client_vfuncs = {
index 19c0db8cce3fa831506b1c0e1d7653aacc66f771..507d6366c23dd5e7b0f7bb689ccde5807e6ff75a 100644 (file)
@@ -282,6 +282,7 @@ void client_destroy(struct client *client, const char *reason) ATTR_NULL(2);
 void client_disconnect(struct client *client, const char *reason);
 void client_disconnect_with_error(struct client *client,
                                  const char *client_error);
+void client_kick(struct client *client);
 
 /* Add the given capability to the CAPABILITY reply. If imap_capability setting
    has an explicit capability, nothing is changed. */
index 8efcfd48abc656746571047fb6b9c2c9ba1c0105..3221a175ff4fc8e38b4ca522d2515add87f22bd4 100644 (file)
@@ -15,6 +15,7 @@
 #include "master-interface.h"
 #include "master-service.h"
 #include "master-login.h"
+#include "master-admin-client.h"
 #include "mail-user.h"
 #include "mail-storage-service.h"
 #include "smtp-submit-settings.h"
@@ -439,6 +440,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 = imap_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 */
@@ -448,9 +469,9 @@ static void client_connected(struct master_service_connection *conn)
        if (strcmp(conn->name, "imap-master") == 0) {
                /* restoring existing IMAP connection (e.g. from imap-idle) */
                imap_master_client_create(conn->fd);
-       } else {
-               master_login_add(master_login, conn->fd);
+               return;
        }
+       master_login_add(master_login, conn->fd);
 }
 
 int main(int argc, char *argv[])
@@ -518,6 +539,7 @@ int main(int argc, char *argv[])
                }
        }
 
+       master_admin_clients_init(&admin_callbacks);
        master_service_set_die_callback(master_service, imap_die);
 
        /* plugins may want to add commands, so this needs to be called early */