From: Stephan Bosch Date: Fri, 18 Jun 2021 17:31:54 +0000 (+0200) Subject: submission: Separately pass XCLIENT HELO value from pre-login to post-login service. X-Git-Tag: 2.3.17~281 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=52516b0566f5d8f1495b65474590658765967e91;p=thirdparty%2Fdovecot%2Fcore.git submission: Separately pass XCLIENT HELO value from pre-login to post-login service. --- diff --git a/src/submission-login/client-authenticate.c b/src/submission-login/client-authenticate.c index 1e55918b12..cff7c5ba06 100644 --- a/src/submission-login/client-authenticate.c +++ b/src/submission-login/client-authenticate.c @@ -268,6 +268,7 @@ int cmd_auth(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, struct submission_client *subm_client = conn_ctx; struct client *client = &subm_client->common; struct smtp_server_helo_data *helo; + struct smtp_proxy_data proxy; i_assert(subm_client->pending_auth == NULL); @@ -281,6 +282,13 @@ int cmd_auth(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, } buffer_append_c(buf, '\0'); + /* pass proxied ehlo parameter to post-login service upon successful + login */ + smtp_server_connection_get_proxy_data(subm_client->conn, &proxy); + if (proxy.helo != NULL) + buffer_append(buf, proxy.helo, strlen(proxy.helo)); + buffer_append_c(buf, '\0'); + i_free(client->master_data_prefix); client->master_data_prefix_len = buf->used; client->master_data_prefix = buffer_free_without_data(&buf); diff --git a/src/submission/main.c b/src/submission/main.c index 89f1bf0427..d64325dfb2 100644 --- a/src/submission/main.c +++ b/src/submission/main.c @@ -148,6 +148,7 @@ client_create_from_input(const struct mail_storage_service_input *input, struct submission_settings *set; const char *errstr; const char *helo = NULL; + struct smtp_proxy_data proxy_data; const unsigned char *data; size_t data_len; @@ -188,11 +189,14 @@ client_create_from_input(const struct mail_storage_service_input *input, /* parse input data */ data = NULL; data_len = 0; + i_zero(&proxy_data); if (input_buf != NULL && input_buf->used > 0) { data = input_buf->data; data_len = input_buf->used; - if (extract_input_data_field(&data, &data_len, &helo)) { + if (extract_input_data_field(&data, &data_len, &helo) && + extract_input_data_field(&data, &data_len, + &proxy_data.helo)) { /* nothing to do */ } @@ -202,7 +206,7 @@ client_create_from_input(const struct mail_storage_service_input *input, } (void)client_create(fd_in, fd_out, mail_user, - user, set, helo, data, data_len); + user, set, helo, &proxy_data, data, data_len); return 0; } diff --git a/src/submission/submission-client.c b/src/submission/submission-client.c index cd93dee22c..6627e117a0 100644 --- a/src/submission/submission-client.c +++ b/src/submission/submission-client.c @@ -178,6 +178,7 @@ struct client * client_create(int fd_in, int fd_out, struct mail_user *user, struct mail_storage_service_user *service_user, const struct submission_settings *set, const char *helo, + const struct smtp_proxy_data *proxy_data, const unsigned char *pdata, unsigned int pdata_len) { enum submission_client_workarounds workarounds = @@ -229,6 +230,7 @@ client_create(int fd_in, int fd_out, struct mail_user *user, client->conn = smtp_server_connection_create(smtp_server, fd_in, fd_out, user->conn.remote_ip, user->conn.remote_port, FALSE, &smtp_set, &smtp_callbacks, client); + smtp_server_connection_set_proxy_data(client->conn, proxy_data); smtp_server_connection_login(client->conn, client->user->username, helo, pdata, pdata_len, user->conn.ssl_secured); diff --git a/src/submission/submission-client.h b/src/submission/submission-client.h index 102aa10eab..76776ed732 100644 --- a/src/submission/submission-client.h +++ b/src/submission/submission-client.h @@ -136,6 +136,7 @@ struct client * client_create(int fd_in, int fd_out, struct mail_user *user, struct mail_storage_service_user *service_user, const struct submission_settings *set, const char *helo, + const struct smtp_proxy_data *proxy_data, const unsigned char *pdata, unsigned int pdata_len); void client_destroy(struct client **client, const char *prefix, const char *reason) ATTR_NULL(2, 3);