From: Timo Sirainen Date: Thu, 13 Jan 2022 16:09:51 +0000 (+0200) Subject: submission: Add admin-client with KICK-USER command X-Git-Tag: 2.4.0~4530 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bff673d3d6d9ea97aac083ece92912f1c51b3e95;p=thirdparty%2Fdovecot%2Fcore.git submission: Add admin-client with KICK-USER command --- diff --git a/src/submission/main.c b/src/submission/main.c index d335716dab..cabdc8e1cf 100644 --- a/src/submission/main.c +++ b/src/submission/main.c @@ -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 = diff --git a/src/submission/submission-client.c b/src/submission/submission-client.c index 6a5fcf3168..123087bded 100644 --- a/src/submission/submission-client.c +++ b/src/submission/submission-client.c @@ -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 = { diff --git a/src/submission/submission-client.h b/src/submission/submission-client.h index 3545e6f7c1..805ea42d2a 100644 --- a/src/submission/submission-client.h +++ b/src/submission/submission-client.h @@ -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);