From: Timo Sirainen Date: Sun, 12 Dec 2021 22:58:24 +0000 (+0200) Subject: anvil, global: Split CONNECT/DISCONNECT/LOOKUP ident to separate parameters X-Git-Tag: 2.4.0~4540 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4e927ef9808fa0cc188f6fb69816d9d2d1c87f0c;p=thirdparty%2Fdovecot%2Fcore.git anvil, global: Split CONNECT/DISCONNECT/LOOKUP ident to separate parameters --- diff --git a/src/anvil/anvil-connection.c b/src/anvil/anvil-connection.c index c984467617..f9a2673268 100644 --- a/src/anvil/anvil-connection.c +++ b/src/anvil/anvil-connection.c @@ -44,28 +44,22 @@ anvil_connection_next_line(struct anvil_connection *conn) } static bool -connect_limit_key_parse(const char *ident, struct connect_limit_key *key_r) +connect_limit_key_parse(const char *const **_args, + struct connect_limit_key *key_r) { - const char *p, *p2, *ip_str; + const char *const *args = *_args; - /* imap, pop3: service/ip/username - lmtp: service/username */ - p = strchr(ident, '/'); - if (p == NULL) + /* */ + if (str_array_length(args) < 3) return FALSE; i_zero(key_r); - key_r->service = t_strdup_until(ident, p++); + key_r->username = args[0]; + key_r->service = args[1]; + if (args[2][0] != '\0' && net_addr2ip(args[2], &key_r->ip) < 0) + return FALSE; - p2 = strchr(p, '/'); - if (p2 == NULL) - key_r->username = p; - else { - ip_str = t_strdup_until(p, p2++); - key_r->username = p2; - if (ip_str[0] != '\0' && net_addr2ip(ip_str, &key_r->ip) < 0) - return FALSE; - } + *_args += 3; return TRUE; } @@ -89,7 +83,8 @@ anvil_connection_request(struct anvil_connection *conn, *error_r = "CONNECT: Invalid pid"; return -1; } - if (!connect_limit_key_parse(args[1], &key)) { + args++; + if (!connect_limit_key_parse(&args, &key)) { *error_r = "CONNECT: Invalid ident string"; return -1; } @@ -103,7 +98,8 @@ anvil_connection_request(struct anvil_connection *conn, *error_r = "DISCONNECT: Invalid pid"; return -1; } - if (!connect_limit_key_parse(args[1], &key)) { + args++; + if (!connect_limit_key_parse(&args, &key)) { *error_r = "DISCONNECT: Invalid ident string"; return -1; } @@ -129,7 +125,7 @@ anvil_connection_request(struct anvil_connection *conn, *error_r = "LOOKUP: Not enough parameters"; return -1; } - if (!connect_limit_key_parse(args[0], &key)) { + if (!connect_limit_key_parse(&args, &key)) { *error_r = "LOOKUP: Invalid ident string"; return -1; } diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index f47f7d8a09..fa1ba5d3e4 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -952,13 +952,12 @@ master_service_anvil_session_to_cmd(string_t *cmd, const struct master_service_anvil_session *session) { str_printfa(cmd, "%s\t", my_pid); + str_append_tabescaped(cmd, session->username); + str_append_c(cmd, '\t'); str_append_tabescaped(cmd, session->service_name); - if (session->ip.family != 0) { - str_append_c(cmd, '/'); + str_append_c(cmd, '\t'); + if (session->ip.family != 0) str_append(cmd, net_ip2addr(&session->ip)); - } - str_append_c(cmd, '/'); - str_append_tabescaped(cmd, session->username); } bool master_service_anvil_connect(struct master_service *service, diff --git a/src/lmtp/lmtp-local.c b/src/lmtp/lmtp-local.c index 7c685553da..61de1f6b82 100644 --- a/src/lmtp/lmtp-local.c +++ b/src/lmtp/lmtp-local.c @@ -352,8 +352,8 @@ int lmtp_local_rcpt(struct client *client, const struct mail_storage_service_input *input = mail_storage_service_user_get_input(llrcpt->service_user); const char *query = t_strconcat("LOOKUP\t", - master_service_get_name(master_service), - "/", str_tabescape(input->username), NULL); + str_tabescape(input->username), "\t", + master_service_get_name(master_service), "\t", NULL); llrcpt->anvil_query = anvil_client_query(anvil, query, lmtp_local_rcpt_anvil_cb, llrcpt); return 0; diff --git a/src/login-common/sasl-server.c b/src/login-common/sasl-server.c index 58a99575ef..492016b1b6 100644 --- a/src/login-common/sasl-server.c +++ b/src/login-common/sasl-server.c @@ -273,9 +273,10 @@ anvil_check_too_many_connections(struct client *client, return; } - query = t_strconcat("LOOKUP\t", login_binary->protocol, "/", - net_ip2addr(&client->ip), "/", - str_tabescape(client->virtual_user), NULL); + query = t_strconcat("LOOKUP\t", + str_tabescape(client->virtual_user), "\t", + login_binary->protocol, "\t", + net_ip2addr(&client->ip), NULL); client->anvil_request = req; client->anvil_query = anvil_client_query(anvil, query, anvil_lookup_callback, req);