From: Timo Sirainen Date: Wed, 15 Dec 2021 11:41:32 +0000 (+0200) Subject: lib-master, global: Send kick-type for anvil CONNECT X-Git-Tag: 2.4.0~4520 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f450f40b0651d25956376985d25dd125dfee52c7;p=thirdparty%2Fdovecot%2Fcore.git lib-master, global: Send kick-type for anvil CONNECT --- diff --git a/src/imap-hibernate/imap-client.c b/src/imap-hibernate/imap-client.c index a2a49a0f1b..9cd5f87a57 100644 --- a/src/imap-hibernate/imap-client.c +++ b/src/imap-hibernate/imap-client.c @@ -636,7 +636,7 @@ imap_client_create(int fd, const struct imap_client_state *state) .ip = client->state.remote_ip, }; if (master_service_anvil_connect(master_service, &anvil_session, - client->state.anvil_conn_guid)) + FALSE, client->state.anvil_conn_guid)) client->state.anvil_sent = TRUE; p_array_init(&client->notifys, pool, 2); diff --git a/src/imap/imap-client.c b/src/imap/imap-client.c index e150135801..a36c0e2e92 100644 --- a/src/imap/imap-client.c +++ b/src/imap/imap-client.c @@ -205,7 +205,7 @@ struct client *client_create(int fd_in, int fd_out, struct master_service_anvil_session anvil_session; mail_user_get_anvil_session(client->user, &anvil_session); if (master_service_anvil_connect(master_service, &anvil_session, - client->anvil_conn_guid)) + TRUE, client->anvil_conn_guid)) client->anvil_sent = TRUE; imap_client_count++; diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 4ef196298c..af14b92e7c 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -962,7 +962,7 @@ master_service_anvil_session_to_cmd(string_t *cmd, bool master_service_anvil_connect(struct master_service *service, const struct master_service_anvil_session *session, - guid_128_t conn_guid_r) + bool kick_supported, guid_128_t conn_guid_r) { guid_128_generate(conn_guid_r); @@ -971,6 +971,13 @@ bool master_service_anvil_connect(struct master_service *service, str_append(cmd, guid_128_to_string(conn_guid_r)); str_append_c(cmd, '\t'); master_service_anvil_session_to_cmd(cmd, session); + str_append_c(cmd, '\t'); + if (!kick_supported) + str_append_c(cmd, 'N'); + else if (master_service_get_client_limit(service) == 1) + str_append_c(cmd, 'S'); + else + str_append_c(cmd, 'A'); str_append_c(cmd, '\n'); return master_service_anvil_send(service, str_c(cmd)); } diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index 2afa7fbb32..039bc33c5f 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -232,11 +232,12 @@ bool master_service_is_killed(struct master_service *service); standalone. */ bool master_service_is_master_stopped(struct master_service *service); -/* Send CONNECT command to anvil process, if it's still connected. - Returns TRUE and connection GUID if it was successfully sent. */ +/* Send CONNECT command to anvil process, if it's still connected. Returns TRUE + and connection GUID if it was successfully sent. If kick_supported=TRUE, the + process implements the KICK-USER command in anvil and admin sockets. */ bool master_service_anvil_connect(struct master_service *service, const struct master_service_anvil_session *session, - guid_128_t conn_guid_r); + bool kick_supported, guid_128_t conn_guid_r); /* Send DISCONNECT command to anvil process, if it's still connected. The conn_guid must match the guid returned by _connect(). */ void master_service_anvil_disconnect(struct master_service *service, diff --git a/src/lmtp/lmtp-local.c b/src/lmtp/lmtp-local.c index dd2c1443b5..fc48298e0c 100644 --- a/src/lmtp/lmtp-local.c +++ b/src/lmtp/lmtp-local.c @@ -283,7 +283,7 @@ lmtp_local_rcpt_anvil_cb(const char *reply, void *context) .service_name = master_service_get_name(master_service), }; if (master_service_anvil_connect(master_service, &anvil_session, - llrcpt->anvil_conn_guid)) + FALSE, llrcpt->anvil_conn_guid)) llrcpt->anvil_connect_sent = TRUE; } } diff --git a/src/login-common/login-proxy.c b/src/login-common/login-proxy.c index 472bb87fed..7c59fbc370 100644 --- a/src/login-common/login-proxy.c +++ b/src/login-common/login-proxy.c @@ -912,7 +912,7 @@ void login_proxy_detach(struct login_proxy *proxy) .ip = client->ip, }; if (master_service_anvil_connect(master_service, &anvil_session, - proxy->anvil_conn_guid)) + TRUE, proxy->anvil_conn_guid)) proxy->anvil_connect_sent = TRUE; if (login_proxy_ipc_server == NULL) { diff --git a/src/pop3/pop3-client.c b/src/pop3/pop3-client.c index 36d1ebe98d..e319416411 100644 --- a/src/pop3/pop3-client.c +++ b/src/pop3/pop3-client.c @@ -476,7 +476,7 @@ int client_init_mailbox(struct client *client, const char **error_r) struct master_service_anvil_session anvil_session; mail_user_get_anvil_session(client->user, &anvil_session); if (master_service_anvil_connect(master_service, &anvil_session, - client->anvil_conn_guid)) + TRUE, client->anvil_conn_guid)) client->anvil_sent = TRUE; return 0; } diff --git a/src/submission/submission-client.c b/src/submission/submission-client.c index 70ac34e8d6..ab68185d88 100644 --- a/src/submission/submission-client.c +++ b/src/submission/submission-client.c @@ -251,7 +251,7 @@ client_create(int fd_in, int fd_out, struct mail_user *user, struct master_service_anvil_session anvil_session; mail_user_get_anvil_session(client->user, &anvil_session); if (master_service_anvil_connect(master_service, &anvil_session, - client->anvil_conn_guid)) + TRUE, client->anvil_conn_guid)) client->anvil_sent = TRUE; if (hook_client_created != NULL)