From 06424150e5a592f2ea73c17ec9f364afaa2544d5 Mon Sep 17 00:00:00 2001 From: Timo Sirainen <timo.sirainen@open-xchange.com> Date: Thu, 20 Jan 2022 11:03:42 +0100 Subject: [PATCH] managesieve: Add admin-client with KICK-USER command --- src/managesieve/main.c | 22 ++++++++++++++++++++++ src/managesieve/managesieve-client.c | 15 ++++++++++----- src/managesieve/managesieve-client.h | 1 + 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/managesieve/main.c b/src/managesieve/main.c index 340b7b6f9..c5fa3e1b7 100644 --- a/src/managesieve/main.c +++ b/src/managesieve/main.c @@ -14,6 +14,7 @@ #include "restrict-access.h" #include "settings-parser.h" #include "master-interface.h" +#include "master-admin-client.h" #include "master-service.h" #include "master-login.h" #include "mail-user.h" @@ -276,6 +277,26 @@ 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 = managesieve_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 */ @@ -338,6 +359,7 @@ int main(int argc, char *argv[]) } } + master_admin_clients_init(&admin_callbacks); master_service_set_die_callback(master_service, managesieve_die); /* plugins may want to add commands, so this needs to be called early */ diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c index 79d0f8640..f7fb0ccf4 100644 --- a/src/managesieve/managesieve-client.c +++ b/src/managesieve/managesieve-client.c @@ -777,11 +777,16 @@ int client_output(struct client *client) return ret; } +void client_kick(struct client *client) +{ + mail_storage_service_io_activate_user(client->service_user); + if (!client->command_pending) + client_send_bye(client, "Server shutting down."); + client_destroy(client, "Server shutting down."); +} + void clients_destroy_all(void) { - while (managesieve_clients != NULL) { - mail_storage_service_io_activate_user(managesieve_clients->service_user); - client_send_bye(managesieve_clients, "Server shutting down."); - client_destroy(managesieve_clients, "Server shutting down."); - } + while (managesieve_clients != NULL) + client_kick(managesieve_clients); } diff --git a/src/managesieve/managesieve-client.h b/src/managesieve/managesieve-client.h index 2448dc22b..96a6646f0 100644 --- a/src/managesieve/managesieve-client.h +++ b/src/managesieve/managesieve-client.h @@ -159,6 +159,7 @@ void _client_reset_command(struct client *client); void client_input(struct client *client); int client_output(struct client *client); +void client_kick(struct client *client); void clients_destroy_all(void); #endif -- GitLab