summaryrefslogtreecommitdiffhomepage
path: root/src/mail/ngx_mail_proxy_module.c
diff options
context:
space:
mode:
authorSergey Kandaurov <pluknet@nginx.com>2025-09-11 18:23:10 +0400
committerpluknet <pluknet@nginx.com>2025-09-26 17:04:20 +0400
commit6f81314a070201afc4e25b975b1f915698cff634 (patch)
tree79fc997ab5cb5c091c8a2c30ca05619090f23b1d /src/mail/ngx_mail_proxy_module.c
parent8255bd29ac9a7bcdc317a8889420554e00d435cb (diff)
downloadnginx-6f81314a070201afc4e25b975b1f915698cff634.tar.gz
nginx-6f81314a070201afc4e25b975b1f915698cff634.tar.bz2
Mail: xtext encoding (RFC 3461) in XCLIENT LOGIN.
The XCLIENT command uses xtext encoding for attribute values, as specified in https://www.postfix.org/XCLIENT_README.html. Reported by Igor Morgenstern of Aisle Research.
Diffstat (limited to 'src/mail/ngx_mail_proxy_module.c')
-rw-r--r--src/mail/ngx_mail_proxy_module.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/mail/ngx_mail_proxy_module.c b/src/mail/ngx_mail_proxy_module.c
index 1c6d0372e..84a7f61a4 100644
--- a/src/mail/ngx_mail_proxy_module.c
+++ b/src/mail/ngx_mail_proxy_module.c
@@ -531,6 +531,7 @@ ngx_mail_proxy_smtp_handler(ngx_event_t *rev)
ngx_int_t rc;
ngx_str_t line, auth, encoded;
ngx_buf_t *b;
+ uintptr_t n;
ngx_connection_t *c;
ngx_mail_session_t *s;
ngx_mail_proxy_conf_t *pcf;
@@ -627,6 +628,10 @@ ngx_mail_proxy_smtp_handler(ngx_event_t *rev)
CRLF) - 1
+ s->connection->addr_text.len + s->login.len + s->host.len;
+ n = ngx_escape_uri(NULL, s->login.data, s->login.len,
+ NGX_ESCAPE_MAIL_XTEXT);
+ line.len += n * 2;
+
#if (NGX_HAVE_INET6)
if (s->connection->sockaddr->sa_family == AF_INET6) {
line.len += sizeof("IPV6:") - 1;
@@ -654,7 +659,14 @@ ngx_mail_proxy_smtp_handler(ngx_event_t *rev)
if (s->login.len && !pcf->smtp_auth) {
p = ngx_cpymem(p, " LOGIN=", sizeof(" LOGIN=") - 1);
- p = ngx_copy(p, s->login.data, s->login.len);
+
+ if (n == 0) {
+ p = ngx_copy(p, s->login.data, s->login.len);
+
+ } else {
+ p = (u_char *) ngx_escape_uri(p, s->login.data, s->login.len,
+ NGX_ESCAPE_MAIL_XTEXT);
+ }
}
p = ngx_cpymem(p, " NAME=", sizeof(" NAME=") - 1);