From: Timo Sirainen Date: Fri, 4 Nov 2022 20:33:37 +0000 (+0200) Subject: lib-smtp: Add XCLIENT CLIENT-TRANSPORT field X-Git-Tag: 2.4.0~3413 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a995ca1185afe80dd6819a856ca079ca4aae5126;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: Add XCLIENT CLIENT-TRANSPORT field --- diff --git a/src/lib-smtp/smtp-client-connection.c b/src/lib-smtp/smtp-client-connection.c index 1bb2458d63..6090bd01d0 100644 --- a/src/lib-smtp/smtp-client-connection.c +++ b/src/lib-smtp/smtp-client-connection.c @@ -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")) { diff --git a/src/lib-smtp/smtp-common.c b/src/lib-smtp/smtp-common.c index 177116911f..3d108a5d78 100644 --- a/src/lib-smtp/smtp-common.c +++ b/src/lib-smtp/smtp-common.c @@ -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) diff --git a/src/lib-smtp/smtp-common.h b/src/lib-smtp/smtp-common.h index d0b685dc47..5a13965e5a 100644 --- a/src/lib-smtp/smtp-common.h +++ b/src/lib-smtp/smtp-common.h @@ -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; diff --git a/src/lib-smtp/smtp-server-cmd-xclient.c b/src/lib-smtp/smtp-server-cmd-xclient.c index 4de426cfee..d9d8c902e0 100644 --- a/src/lib-smtp/smtp-server-cmd-xclient.c +++ b/src/lib-smtp/smtp-server-cmd-xclient.c @@ -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) { diff --git a/src/lib-smtp/smtp-server-connection.c b/src/lib-smtp/smtp-server-connection.c index 6a0717f8fa..8e34946f10 100644 --- a/src/lib-smtp/smtp-server-connection.c +++ b/src/lib-smtp/smtp-server-connection.c @@ -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; diff --git a/src/lib-smtp/smtp-server-private.h b/src/lib-smtp/smtp-server-private.h index 3ee7e446e6..618c23b22c 100644 --- a/src/lib-smtp/smtp-server-private.h +++ b/src/lib-smtp/smtp-server-private.h @@ -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; diff --git a/src/lib-smtp/smtp-server-reply.c b/src/lib-smtp/smtp-server-reply.c index 60342db0b2..39dd6bf6a5 100644 --- a/src/lib-smtp/smtp-server-reply.c +++ b/src/lib-smtp/smtp-server-reply.c @@ -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;