From: Stephan Bosch Date: Tue, 30 Mar 2021 19:12:41 +0000 (+0200) Subject: lib-smtp: smtp-params - Make explicit which extra parameters can be written by smtp_p... X-Git-Tag: 2.3.15~57 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=32961a5fe3e526a067e57e43c6b139a83b330ccc;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-params - Make explicit which extra parameters can be written by smtp_params_*_write(). This can be used to prevent sending unsupported parameters to the remote server, even when these are listed in extra_parameters. Before, blindly proxying parameters would cause MAIL/RCPT error replies from the remote server. --- diff --git a/src/lib-smtp/smtp-client-command.c b/src/lib-smtp/smtp-client-command.c index 569fdd39e0..9d9490b231 100644 --- a/src/lib-smtp/smtp-client-command.c +++ b/src/lib-smtp/smtp-client-command.c @@ -1142,8 +1142,16 @@ smtp_client_command_mail_submit(struct smtp_client_connection *conn, } if (params != NULL) { size_t orig_len = str_len(cmd->data); + const char *const *extensions = NULL; + + if (array_is_created(&conn->caps.mail_param_extensions)) { + extensions = + array_front(&conn->caps.mail_param_extensions); + } + str_append_c(cmd->data, ' '); - smtp_params_mail_write(cmd->data, conn->caps.standard, params); + smtp_params_mail_write(cmd->data, conn->caps.standard, + extensions, params); if (str_len(cmd->data) == orig_len + 1) str_truncate(cmd->data, orig_len); } @@ -1171,8 +1179,16 @@ smtp_client_command_rcpt_submit_after(struct smtp_client_connection *conn, smtp_address_encode(to)); if (params != NULL) { size_t orig_len = str_len(cmd->data); + const char *const *extensions = NULL; + + if (array_is_created(&conn->caps.rcpt_param_extensions)) { + extensions = + array_front(&conn->caps.rcpt_param_extensions); + } + str_append_c(cmd->data, ' '); - smtp_params_rcpt_write(cmd->data, conn->caps.standard, params); + smtp_params_rcpt_write(cmd->data, conn->caps.standard, + extensions, params); if (str_len(cmd->data) == orig_len + 1) str_truncate(cmd->data, orig_len); } diff --git a/src/lib-smtp/smtp-params.c b/src/lib-smtp/smtp-params.c index ea6b2654b3..3994ce5764 100644 --- a/src/lib-smtp/smtp-params.c +++ b/src/lib-smtp/smtp-params.c @@ -176,15 +176,19 @@ void smtp_param_write(string_t *out, const struct smtp_param *param) } static void -smtp_params_write(string_t *buffer, const ARRAY_TYPE(smtp_param) *params) +smtp_params_write(string_t *buffer, const char *const *param_keywords, + const ARRAY_TYPE(smtp_param) *params) ATTR_NULL(2) { const struct smtp_param *param; + if (param_keywords == NULL || *param_keywords == NULL) + return; if (!array_is_created(params)) return; array_foreach(params, param) { - smtp_param_write(buffer, param); + if (str_array_icase_find(param_keywords, param->keyword)) + smtp_param_write(buffer, param); str_append_c(buffer, ' '); } } @@ -723,6 +727,7 @@ smtp_params_mail_write_size(string_t *buffer, enum smtp_capability caps, } void smtp_params_mail_write(string_t *buffer, enum smtp_capability caps, + const char *const *extra_params, const struct smtp_params_mail *params) { size_t init_len = str_len(buffer); @@ -733,7 +738,7 @@ void smtp_params_mail_write(string_t *buffer, enum smtp_capability caps, smtp_params_mail_write_ret(buffer, caps, params); smtp_params_mail_write_size(buffer, caps, params); - smtp_params_write(buffer, ¶ms->extra_params); + smtp_params_write(buffer, extra_params, ¶ms->extra_params); if (str_len(buffer) > init_len) str_truncate(buffer, str_len(buffer)-1); @@ -1251,6 +1256,7 @@ smtp_params_rcpt_write_orcpt(string_t *buffer, enum smtp_capability caps, } void smtp_params_rcpt_write(string_t *buffer, enum smtp_capability caps, + const char *const *extra_params, const struct smtp_params_rcpt *params) { size_t init_len = str_len(buffer); @@ -1258,7 +1264,7 @@ void smtp_params_rcpt_write(string_t *buffer, enum smtp_capability caps, smtp_params_rcpt_write_notify(buffer, caps, params); smtp_params_rcpt_write_orcpt(buffer, caps, params); - smtp_params_write(buffer, ¶ms->extra_params); + smtp_params_write(buffer, extra_params, ¶ms->extra_params); if (str_len(buffer) > init_len) str_truncate(buffer, str_len(buffer)-1); diff --git a/src/lib-smtp/smtp-params.h b/src/lib-smtp/smtp-params.h index b1aefc6503..34568ce070 100644 --- a/src/lib-smtp/smtp-params.h +++ b/src/lib-smtp/smtp-params.h @@ -146,7 +146,8 @@ bool smtp_params_mail_drop_extra(struct smtp_params_mail *params, /* write */ void smtp_params_mail_write(string_t *buffer, enum smtp_capability caps, - const struct smtp_params_mail *params); + const char *const *extra_params, + const struct smtp_params_mail *params) ATTR_NULL(3); /* evaluate */ @@ -203,7 +204,8 @@ void smtp_params_rcpt_set_orcpt(struct smtp_params_rcpt *params, pool_t pool, /* write */ void smtp_params_rcpt_write(string_t *buffer, enum smtp_capability caps, - const struct smtp_params_rcpt *params); + const char *const *extra_params, + const struct smtp_params_rcpt *params) ATTR_NULL(3); /* evaluate */ diff --git a/src/lib-smtp/test-smtp-params.c b/src/lib-smtp/test-smtp-params.c index 35e215beba..2847441e37 100644 --- a/src/lib-smtp/test-smtp-params.c +++ b/src/lib-smtp/test-smtp-params.c @@ -415,7 +415,8 @@ static void test_smtp_mail_params_parse_valid(void) test_smtp_mail_params_extensions(&test->params, ¶ms); encoded = t_str_new(256); - smtp_params_mail_write(encoded, test->caps, ¶ms); + smtp_params_mail_write(encoded, test->caps, + test->extensions, ¶ms); output = (test->output == NULL ? test->input : test->output); test_out(t_strdup_printf("encode() = \"%s\"", @@ -796,7 +797,8 @@ static void test_smtp_rcpt_params_parse_valid(void) test_smtp_rcpt_params_extensions(&test->params, ¶ms); encoded = t_str_new(256); - smtp_params_rcpt_write(encoded, test->caps, ¶ms); + smtp_params_rcpt_write(encoded, test->caps, + test->extensions, ¶ms); output = (test->output == NULL ? test->input : test->output); test_out(t_strdup_printf("encode() = \"%s\"",