]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master, global: Send kick-type for anvil CONNECT
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 15 Dec 2021 11:41:32 +0000 (13:41 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 8 Feb 2022 09:48:24 +0000 (10:48 +0100)
src/imap-hibernate/imap-client.c
src/imap/imap-client.c
src/lib-master/master-service.c
src/lib-master/master-service.h
src/lmtp/lmtp-local.c
src/login-common/login-proxy.c
src/pop3/pop3-client.c
src/submission/submission-client.c

index a2a49a0f1bba9657a05d472bd48414ebb574f768..9cd5f87a57439a24dec27d6242a0a439cb8773fa 100644 (file)
@@ -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);
index e150135801c047450b3085862a3fa39a8c0c57e3..a36c0e2e92c6ca4f1540c5171d1b78406f9d0bbb 100644 (file)
@@ -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++;
index 4ef196298cb154822ff772a4eafe6265e1377677..af14b92e7c067abcd839286bc5f0713d4be1e5c3 100644 (file)
@@ -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));
 }
index 2afa7fbb3214b76affc818366a37749cefb56d9c..039bc33c5fb887f1078d0b62ddbd87aa9bffb1a2 100644 (file)
@@ -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,
index dd2c1443b51f1ca0a2e4852b7ec67b383484d93a..fc48298e0c34278b0fd4d2b8ac548991238fcfe8 100644 (file)
@@ -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;
        }
 }
index 472bb87fed66b2ca6bd5ecec5b77c7fcd711a8b4..7c59fbc37096f71eee0f6221cff452dadf379067 100644 (file)
@@ -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) {
index 36d1ebe98dc3b0e045877a6bf003f1c690b7a557..e3194164114f728e2d3802a342940d32c4c0c063 100644 (file)
@@ -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;
 }
index 70ac34e8d6a158602e10ee08e35b009581c27ba4..ab68185d88545e8aacb27bfc5671287cb35ceecd 100644 (file)
@@ -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)