]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-params - Make explicit which extra parameters can be written by smtp_p...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 30 Mar 2021 19:12:41 +0000 (21:12 +0200)
committerMarkus Valentin <markus.valentin@open-xchange.com>
Tue, 20 Apr 2021 10:30:17 +0000 (12:30 +0200)
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.

src/lib-smtp/smtp-client-command.c
src/lib-smtp/smtp-params.c
src/lib-smtp/smtp-params.h
src/lib-smtp/test-smtp-params.c

index 569fdd39e0ae09d8d2137afb2426e7b679e12f73..9d9490b231dfeaff15066aa492b28f433b0f53d0 100644 (file)
@@ -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);
        }
index ea6b2654b347fc4c3aa2119d0efe408d14487064..3994ce5764c91f5c47191ff6d6de9e474f1f5537 100644 (file)
@@ -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, &params->extra_params);
+       smtp_params_write(buffer, extra_params, &params->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, &params->extra_params);
+       smtp_params_write(buffer, extra_params, &params->extra_params);
 
        if (str_len(buffer) > init_len)
                str_truncate(buffer, str_len(buffer)-1);
index b1aefc6503926e62bbceb942f4dda33b3f23ccc3..34568ce070570f182b79a031b27eaa68716ac8ab 100644 (file)
@@ -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 */
 
index 35e215beba2e954ced66b4d9415b90c3c3faa8c6..2847441e373fc788098c099a99d0d66ce61ab335 100644 (file)
@@ -415,7 +415,8 @@ static void test_smtp_mail_params_parse_valid(void)
                                test_smtp_mail_params_extensions(&test->params, &params);
 
                        encoded = t_str_new(256);
-                       smtp_params_mail_write(encoded, test->caps, &params);
+                       smtp_params_mail_write(encoded, test->caps,
+                                              test->extensions, &params);
 
                        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, &params);
 
                        encoded = t_str_new(256);
-                       smtp_params_rcpt_write(encoded, test->caps, &params);
+                       smtp_params_rcpt_write(encoded, test->caps,
+                                              test->extensions, &params);
 
                        output = (test->output == NULL ? test->input : test->output);
                        test_out(t_strdup_printf("encode() = \"%s\"",