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.
}
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);
}
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);
}
}
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, ' ');
}
}
}
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);
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);
}
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);
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);
/* 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 */
/* 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 */
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\"",
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\"",