]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: Add XCLIENT CLIENT-TRANSPORT field
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 4 Nov 2022 20:33:37 +0000 (22:33 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 16 Nov 2022 08:09:54 +0000 (08:09 +0000)
src/lib-smtp/smtp-client-connection.c
src/lib-smtp/smtp-common.c
src/lib-smtp/smtp-common.h
src/lib-smtp/smtp-server-cmd-xclient.c
src/lib-smtp/smtp-server-connection.c
src/lib-smtp/smtp-server-private.h
src/lib-smtp/smtp-server-reply.c

index 1bb2458d63f0a03aba6a5c871ca1c191a96fc5fd..6090bd01d0b38b926a47e0828a328f1ddb017b05 100644 (file)
@@ -657,6 +657,13 @@ void smtp_client_connection_send_xclient(struct smtp_client_connection *conn)
                                                   "SESSION", xclient->session);
        }
 
+       /* CLIENT-TRANSPORT */
+       if (xclient->client_transport != NULL &&
+           str_array_icase_find(xclient_args, "CLIENT-TRANSPORT")) {
+               smtp_client_connection_xclient_add(conn, str, offset,
+                       "CLIENT-TRANSPORT", xclient->client_transport);
+       }
+
        /* TTL */
        if (xclient->ttl_plus_1 > 0 &&
            str_array_icase_find(xclient_args, "TTL")) {
index 177116911f7b7f5a28277761d5383d49ed6bcd4e..3d108a5d789136c94318ff533cb5895cbe0abd45 100644 (file)
@@ -82,6 +82,8 @@ void smtp_proxy_data_merge(pool_t pool, struct smtp_proxy_data *dst,
                dst->login = p_strdup(pool, src->login);
        if (src->session != NULL && *src->session != '\0')
                dst->session = p_strdup(pool, src->session);
+       if (src->client_transport != NULL && *src->client_transport != '\0')
+               dst->client_transport = p_strdup(pool, src->client_transport);
        if (src->ttl_plus_1 > 0)
                dst->ttl_plus_1 = src->ttl_plus_1;
        if (src->timeout_secs > 0)
index d0b685dc4776b4bfd59cfa9356960a1f7c18cb6f..5a13965e5af5e46104e1d51f7b4ae19b7d15a14d 100644 (file)
@@ -96,6 +96,8 @@ struct smtp_proxy_data {
        const char *helo, *login;
        /* SESSION */
        const char *session;
+       /* CLIENT-TRANSPORT */
+       const char *client_transport;
 
        /* TTL: send as this -1, so the default 0 means "don't send it" */
        unsigned int ttl_plus_1;
index 4de426cfee40b3c0eee5c598108efecf6a32b260..d9d8c902e0826a9f036f36ab13070b9d436c5f33 100644 (file)
@@ -185,6 +185,11 @@ void smtp_server_cmd_xclient(struct smtp_server_cmd_ctx *cmd,
                        if (strcasecmp(param.value, "[UNAVAILABLE]") == 0)
                                continue;
                        proxy_data->session = p_strdup(cmd->pool, param.value);
+               } else if (strcmp(param.keyword, "CLIENT-TRANSPORT") == 0) {
+                       if (strcasecmp(param.value, "[UNAVAILABLE]") == 0)
+                               continue;
+                       proxy_data->client_transport =
+                               p_strdup(cmd->pool, param.value);
                } else if (strcmp(param.keyword, "TIMEOUT") == 0) {
                        if (str_to_uint(param.value,
                                &proxy_data->timeout_secs) < 0) {
index 6a0717f8fa8228b366fc3997741ef3d349ec292b..8e34946f10d42c407a9a6a45978831f8173fa77f 100644 (file)
@@ -1528,6 +1528,7 @@ void smtp_server_connection_get_proxy_data(struct smtp_server_connection *conn,
                proxy_data->helo = conn->helo.domain;
        proxy_data->login = conn->username;
        proxy_data->session = conn->session_id;
+       proxy_data->client_transport = conn->client_transport;
 
        if (conn->proxy_proto != SMTP_PROXY_PROTOCOL_UNKNOWN)
                proxy_data->proto = conn->proxy_proto;
@@ -1573,6 +1574,10 @@ void smtp_server_connection_set_proxy_data(
                i_free(conn->session_id);
                conn->session_id = i_strdup(proxy_data->session);
        }
+       if (proxy_data->client_transport != NULL) {
+               i_free(conn->client_transport);
+               conn->client_transport = i_strdup(proxy_data->client_transport);
+       }
 
        if (proxy_data->ttl_plus_1 > 0)
                conn->proxy_ttl_plus_1 = proxy_data->ttl_plus_1;
index 3ee7e446e67a51748b567ff9b0a8f6d2788e0ea0..618c23b22cf742e8bc82f35e5fecdb2908bdf670 100644 (file)
@@ -157,6 +157,7 @@ struct smtp_server_connection {
        unsigned int proxy_ttl_plus_1;
        unsigned int proxy_timeout_secs;
        char *proxy_helo;
+       char *client_transport;
 
        struct smtp_server_helo_data helo, *pending_helo;
        char *helo_domain, *username;
index 60342db0b26fe9ccd6a8d36b224fab122b36cac6..39dd6bf6a5897bc4f54e7814b91d872f2bdd9e73 100644 (file)
@@ -856,7 +856,7 @@ void smtp_server_reply_ehlo_add_vrfy(struct smtp_server_reply *reply)
 void smtp_server_reply_ehlo_add_xclient(struct smtp_server_reply *reply)
 {
        static const char *base_fields =
-               "ADDR PORT PROTO HELO LOGIN SESSION TTL TIMEOUT";
+               "ADDR PORT PROTO HELO LOGIN SESSION CLIENT-TRANSPORT TTL TIMEOUT";
        struct smtp_server_cmd_ctx *cmd = &reply->command->context;
        struct smtp_server_connection *conn = cmd->conn;