]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
anvil, global: Split CONNECT/DISCONNECT/LOOKUP ident to separate parameters
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Sun, 12 Dec 2021 22:58:24 +0000 (00:58 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 8 Feb 2022 09:48:24 +0000 (10:48 +0100)
src/anvil/anvil-connection.c
src/lib-master/master-service.c
src/lmtp/lmtp-local.c
src/login-common/sasl-server.c

index c984467617eaca29a56572e362ec03e4b51ad97e..f9a26732682c7be2c3c5dc48e061c4c48deea841 100644 (file)
@@ -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)
+       /* <username> <service> <ip> */
+       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;
                }
index f47f7d8a09d22ef9e921d978da22fa2d9880f445..fa1ba5d3e42c255627752486f9ae43214a4ffeb3 100644 (file)
@@ -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,
index 7c685553da3327d81aca337b8b9a0ed465a8a417..61de1f6b82934d2f1134e59356dd0953f6202419 100644 (file)
@@ -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;
index 58a99575ef5df8105ad3d0ad3b0b413279be73f1..492016b1b657b73b4f55f9beebb2298236ccec95 100644 (file)
@@ -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);