]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: Send and accept DESTNAME parameter for XCLIENT
authorAki Tuomi <aki.tuomi@open-xchange.com>
Mon, 3 Apr 2023 09:23:56 +0000 (12:23 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:21:55 +0000 (14:21 +0200)
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 6090bd01d0b38b926a47e0828a328f1ddb017b05..c19d3b2a2b74a38520eb82b1aae1a8cc25c772de 100644 (file)
@@ -664,6 +664,15 @@ void smtp_client_connection_send_xclient(struct smtp_client_connection *conn)
                        "CLIENT-TRANSPORT", xclient->client_transport);
        }
 
+       /* DESTNAME */
+       if (xclient->local_name != NULL &&
+           str_array_icase_find(xclient_args, "DESTNAME")) {
+               /* This should already be checked elsewhere */
+               i_assert(connection_is_valid_dns_name(xclient->local_name));
+               smtp_client_connection_xclient_add(conn, str, offset,
+                               "DESTNAME", xclient->local_name);
+       }
+
        /* TTL */
        if (xclient->ttl_plus_1 > 0 &&
            str_array_icase_find(xclient_args, "TTL")) {
index 3d108a5d789136c94318ff533cb5895cbe0abd45..989287d6887274cfec82affdd5026abdcfebaedf 100644 (file)
@@ -84,6 +84,8 @@ void smtp_proxy_data_merge(pool_t pool, struct smtp_proxy_data *dst,
                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->local_name != NULL && *src->local_name != '\0')
+               dst->local_name = p_strdup_empty(pool, src->local_name);
        if (src->ttl_plus_1 > 0)
                dst->ttl_plus_1 = src->ttl_plus_1;
        if (src->timeout_secs > 0)
index 5a13965e5af5e46104e1d51f7b4ae19b7d15a14d..9ba0a2727348659b8f389436805ed51b2aad28f5 100644 (file)
@@ -98,6 +98,8 @@ struct smtp_proxy_data {
        const char *session;
        /* CLIENT-TRANSPORT */
        const char *client_transport;
+       /* DESTNAME */
+       const char *local_name;
 
        /* TTL: send as this -1, so the default 0 means "don't send it" */
        unsigned int ttl_plus_1;
index d9d8c902e0826a9f036f36ab13070b9d436c5f33..cbbd77434c02bcbc48f767a0444f84be7847d62a 100644 (file)
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "array.h"
 #include "istream.h"
+#include "connection.h"
 #include "smtp-syntax.h"
 #include "smtp-reply.h"
 
@@ -190,6 +191,13 @@ void smtp_server_cmd_xclient(struct smtp_server_cmd_ctx *cmd,
                                continue;
                        proxy_data->client_transport =
                                p_strdup(cmd->pool, param.value);
+               } else if (strcmp(param.keyword, "DESTNAME") == 0) {
+                       if (!connection_is_valid_dns_name(param.value)) {
+                               smtp_server_reply(cmd, 501, "5.5.4",
+                                                 "Invalid DESTNAME parameter");
+                               return;
+                       }
+                       proxy_data->local_name = 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 9e331922b34fbf61b5d4e3b8f113f12e3ef4729d..bb52ade6160db2f511cae11138e86ca78f66c569 100644 (file)
@@ -1536,6 +1536,7 @@ void smtp_server_connection_get_proxy_data(struct smtp_server_connection *conn,
        proxy_data->login = conn->username;
        proxy_data->session = conn->session_id;
        proxy_data->client_transport = conn->client_transport;
+       proxy_data->local_name = conn->local_name;
 
        if (conn->proxy_proto != SMTP_PROXY_PROTOCOL_UNKNOWN)
                proxy_data->proto = conn->proxy_proto;
@@ -1585,7 +1586,10 @@ void smtp_server_connection_set_proxy_data(
                i_free(conn->client_transport);
                conn->client_transport = i_strdup(proxy_data->client_transport);
        }
-
+       if (proxy_data->local_name != NULL) {
+               i_free(conn->local_name);
+               conn->local_name = i_strdup(proxy_data->local_name);
+       }
        if (proxy_data->ttl_plus_1 > 0)
                conn->proxy_ttl_plus_1 = proxy_data->ttl_plus_1;
        if (conn->proxy_timeout_secs > 0)
index 618c23b22cf742e8bc82f35e5fecdb2908bdf670..7c41416e67e425a7243ea2df2707cf4338ef7f3c 100644 (file)
@@ -158,6 +158,7 @@ struct smtp_server_connection {
        unsigned int proxy_timeout_secs;
        char *proxy_helo;
        char *client_transport;
+       char *local_name;
 
        struct smtp_server_helo_data helo, *pending_helo;
        char *helo_domain, *username;
index 97b2d08c34d2497b45917a999f8dde7c2a085666..b5dd605bed2310fc20c616b7fd6f2415231c8c7e 100644 (file)
@@ -866,7 +866,8 @@ 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 CLIENT-TRANSPORT TTL TIMEOUT";
+               "ADDR PORT PROTO HELO LOGIN SESSION CLIENT-TRANSPORT TTL TIMEOUT "
+               "DESTNAME";
        struct smtp_server_cmd_ctx *cmd = &reply->command->context;
        struct smtp_server_connection *conn = cmd->conn;