From: Timo Sirainen Date: Thu, 6 Jan 2022 11:34:09 +0000 (+0200) Subject: login-common: Add login_proxy_kick_user_connection() X-Git-Tag: 2.4.0~4534 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=394595cf5138c8272c08119637e17c9632cf413d;p=thirdparty%2Fdovecot%2Fcore.git login-common: Add login_proxy_kick_user_connection() --- diff --git a/src/login-common/login-proxy.c b/src/login-common/login-proxy.c index 7ad5153f24..472bb87fed 100644 --- a/src/login-common/login-proxy.c +++ b/src/login-common/login-proxy.c @@ -1027,6 +1027,21 @@ want_kick_virtual_user(struct login_proxy *proxy, const char *const *args, return str_array_find(args, proxy->client->virtual_user); } +static bool +want_kick_user(struct login_proxy *proxy, const char *const *userp, + unsigned int key_idx ATTR_UNUSED) +{ + return strcmp(proxy->client->virtual_user, *userp) == 0; +} + +static bool +want_kick_user_session(struct login_proxy *proxy, const char *const *args, + unsigned int key_idx ATTR_UNUSED) +{ + return strcmp(proxy->client->virtual_user, args[0]) == 0 && + guid_128_cmp(proxy->anvil_conn_guid, (const uint8_t *)args[1]) == 0; +} + static bool want_kick_alt_username(struct login_proxy *proxy, const char *const *args, unsigned int key_idx) @@ -1086,6 +1101,18 @@ static unsigned int login_proxy_kick_user(const char *const *users) return login_proxy_kick(users, want_kick_virtual_user, 0); } +unsigned int +login_proxy_kick_user_connection(const char *user, const guid_128_t conn_guid) +{ + if (conn_guid == NULL || guid_128_is_empty(conn_guid)) + return login_proxy_kick(&user, want_kick_user, 0); + + const char *const args[] = { + user, (const char *)conn_guid + }; + return login_proxy_kick(args, want_kick_user_session, 0); +} + static unsigned int login_proxy_kick_host(const char *const *hosts) { return login_proxy_kick(hosts, want_kick_host, 0); diff --git a/src/login-common/login-proxy.h b/src/login-common/login-proxy.h index 7cdc3beabc..280ddef4e4 100644 --- a/src/login-common/login-proxy.h +++ b/src/login-common/login-proxy.h @@ -2,6 +2,7 @@ #define LOGIN_PROXY_H #include "net.h" +#include "guid.h" #include "auth-proxy.h" /* Max. number of embedded proxying connections until proxying fails. @@ -117,6 +118,8 @@ enum auth_proxy_ssl_flags login_proxy_get_ssl_flags(const struct login_proxy *proxy) ATTR_PURE; unsigned int login_proxy_get_connect_timeout_msecs(const struct login_proxy *proxy) ATTR_PURE; +unsigned int +login_proxy_kick_user_connection(const char *user, const guid_128_t conn_guid); void login_proxy_kill_idle(void);