From: Aki Tuomi Date: Mon, 3 Apr 2023 09:23:56 +0000 (+0300) Subject: lib-smtp: Send and accept DESTNAME parameter for XCLIENT X-Git-Tag: 2.4.0~2137 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=050bbd4d7e2bd2afee2bfb71a4f87f46ffaf8b94;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: Send and accept DESTNAME parameter for XCLIENT --- diff --git a/src/lib-smtp/smtp-client-connection.c b/src/lib-smtp/smtp-client-connection.c index 6090bd01d0..c19d3b2a2b 100644 --- a/src/lib-smtp/smtp-client-connection.c +++ b/src/lib-smtp/smtp-client-connection.c @@ -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")) { diff --git a/src/lib-smtp/smtp-common.c b/src/lib-smtp/smtp-common.c index 3d108a5d78..989287d688 100644 --- a/src/lib-smtp/smtp-common.c +++ b/src/lib-smtp/smtp-common.c @@ -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) diff --git a/src/lib-smtp/smtp-common.h b/src/lib-smtp/smtp-common.h index 5a13965e5a..9ba0a27273 100644 --- a/src/lib-smtp/smtp-common.h +++ b/src/lib-smtp/smtp-common.h @@ -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; diff --git a/src/lib-smtp/smtp-server-cmd-xclient.c b/src/lib-smtp/smtp-server-cmd-xclient.c index d9d8c902e0..cbbd77434c 100644 --- a/src/lib-smtp/smtp-server-cmd-xclient.c +++ b/src/lib-smtp/smtp-server-cmd-xclient.c @@ -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) { diff --git a/src/lib-smtp/smtp-server-connection.c b/src/lib-smtp/smtp-server-connection.c index 9e331922b3..bb52ade616 100644 --- a/src/lib-smtp/smtp-server-connection.c +++ b/src/lib-smtp/smtp-server-connection.c @@ -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) diff --git a/src/lib-smtp/smtp-server-private.h b/src/lib-smtp/smtp-server-private.h index 618c23b22c..7c41416e67 100644 --- a/src/lib-smtp/smtp-server-private.h +++ b/src/lib-smtp/smtp-server-private.h @@ -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; diff --git a/src/lib-smtp/smtp-server-reply.c b/src/lib-smtp/smtp-server-reply.c index 97b2d08c34..b5dd605bed 100644 --- a/src/lib-smtp/smtp-server-reply.c +++ b/src/lib-smtp/smtp-server-reply.c @@ -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;