Before the choice was between allowing any extension or none.
static int smtp_params_mail_parse_body(
struct smtp_params_mail_parser *pmparser,
- const char *value, bool extensions)
+ const char *value, const char *const *extensions)
{
struct smtp_params_mail *params = pmparser->params;
enum smtp_capability caps = pmparser->caps;
strcmp(value, "BINARYMIME") == 0) {
params->body.type = SMTP_PARAM_MAIL_BODY_TYPE_BINARYMIME;
/* =?? */
- } else if (extensions) {
+ } else if (extensions != NULL &&
+ str_array_icase_find(extensions, value)) {
params->body.type = SMTP_PARAM_MAIL_BODY_TYPE_EXTENSION;
params->body.ext = p_strdup(pmparser->pool, value);
} else {
}
int smtp_params_mail_parse(pool_t pool, const char *args,
- enum smtp_capability caps, bool extensions,
- struct smtp_params_mail *params_r,
- enum smtp_param_parse_error *error_code_r,
- const char **error_r)
+ enum smtp_capability caps,
+ const char *const *extensions,
+ const char *const *body_extensions,
+ struct smtp_params_mail *params_r,
+ enum smtp_param_parse_error *error_code_r,
+ const char **error_r)
{
struct smtp_params_mail_parser pmparser;
struct smtp_param param;
break;
}
} else if (strcmp(param.keyword, "BODY") == 0) {
- if (smtp_params_mail_parse_body
- (&pmparser, param.value, extensions) < 0) {
+ if (smtp_params_mail_parse_body(
+ &pmparser, param.value, body_extensions) < 0) {
ret = -1;
break;
}
ret = -1;
break;
}
- } else if (extensions) {
+ } else if (extensions != NULL &&
+ str_array_icase_find(extensions, param.keyword)) {
/* add the rest to ext_param for specific
applications */
if (!array_is_created(¶ms_r->extra_params))
}
int smtp_params_rcpt_parse(pool_t pool, const char *args,
- enum smtp_capability caps, bool extensions,
- struct smtp_params_rcpt *params_r,
- enum smtp_param_parse_error *error_code_r,
- const char **error_r)
+ enum smtp_capability caps,
+ const char *const *extensions,
+ struct smtp_params_rcpt *params_r,
+ enum smtp_param_parse_error *error_code_r,
+ const char **error_r)
{
struct smtp_params_rcpt_parser prparser;
struct smtp_param param;
ret = -1;
break;
}
- } else if (extensions) {
+ } else if (extensions != NULL &&
+ str_array_icase_find(extensions, param.keyword)) {
/* add the rest to ext_param for specific applications
*/
if (!array_is_created(¶ms_r->extra_params))
*/
int smtp_params_mail_parse(pool_t pool, const char *args,
- enum smtp_capability caps, bool extensions,
- struct smtp_params_mail *params_r,
- enum smtp_param_parse_error *error_code_r,
- const char **error_r);
+ enum smtp_capability caps,
+ const char *const *param_extensions,
+ const char *const *body_param_extensions,
+ struct smtp_params_mail *params_r,
+ enum smtp_param_parse_error *error_code_r,
+ const char **error_r) ATTR_NULL(4, 5);
void smtp_params_mail_copy(pool_t pool,
struct smtp_params_mail *dst, const struct smtp_params_mail *src)
*/
int smtp_params_rcpt_parse(pool_t pool, const char *args,
- enum smtp_capability caps, bool extensions,
- struct smtp_params_rcpt *params_r,
- enum smtp_param_parse_error *error_code_r,
- const char **error_r);
+ enum smtp_capability caps,
+ const char *const *param_extensions,
+ struct smtp_params_rcpt *params_r,
+ enum smtp_param_parse_error *error_code_r,
+ const char **error_r) ATTR_NULL(4);
void smtp_params_rcpt_copy(pool_t pool,
struct smtp_params_rcpt *dst, const struct smtp_params_rcpt *src)
/* [SP Mail-parameters] */
if (smtp_params_mail_parse(cmd->pool, params, caps,
- set->param_extensions, &mail_data->params,
- &pperror, &error) < 0) {
+ set->mail_param_extensions, NULL,
+ &mail_data->params, &pperror, &error) < 0) {
switch (pperror) {
case SMTP_PARAM_PARSE_ERROR_BAD_SYNTAX:
smtp_server_reply(cmd, 501, "5.5.4", "%s", error);
/* [SP Rcpt-parameters] */
if (smtp_params_rcpt_parse(cmd->pool, params, caps,
- set->param_extensions, &rcpt_data->params,
- &pperror, &error) < 0) {
+ set->rcpt_param_extensions,
+ &rcpt_data->params, &pperror, &error) < 0) {
switch (pperror) {
case SMTP_PARAM_PARSE_ERROR_BAD_SYNTAX:
smtp_server_reply(cmd,
SMTP_SERVER_DEFAULT_MAX_SIZE_EXCESS_LIMIT;
}
+ if (set->mail_param_extensions != NULL) {
+ conn->set.mail_param_extensions =
+ p_strarray_dup(pool, set->mail_param_extensions);
+ }
+ if (set->rcpt_param_extensions != NULL) {
+ conn->set.rcpt_param_extensions =
+ p_strarray_dup(pool, set->rcpt_param_extensions);
+ }
if (set->xclient_extensions != NULL) {
server->set.xclient_extensions =
p_strarray_dup(pool, set->xclient_extensions);
conn->set.rcpt_domain_optional =
conn->set.rcpt_domain_optional ||
set->rcpt_domain_optional;
- conn->set.param_extensions =
- conn->set.param_extensions || set->param_extensions;
conn->set.debug = conn->set.debug || set->debug;
}
server->set.command_limits = set->command_limits;
server->set.max_message_size = set->max_message_size;
+ if (set->mail_param_extensions != NULL) {
+ server->set.mail_param_extensions =
+ p_strarray_dup(pool, set->mail_param_extensions);
+ }
+ if (set->rcpt_param_extensions != NULL) {
+ server->set.rcpt_param_extensions =
+ p_strarray_dup(pool, set->rcpt_param_extensions);
+ }
if (set->xclient_extensions != NULL) {
server->set.xclient_extensions =
p_strarray_dup(pool, set->xclient_extensions);
server->set.tls_required = set->tls_required;
server->set.auth_optional = set->auth_optional;
server->set.rcpt_domain_optional = set->rcpt_domain_optional;
- server->set.param_extensions = set->param_extensions;
server->set.debug = set->debug;
server->conn_list = smtp_server_connection_list_init();
/* message size limit */
uoff_t max_message_size;
+ /* accept these additional custom MAIL parameters */
+ const char *const *mail_param_extensions;
+ /* accept these additional custom RCPT parameters */
+ const char *const *rcpt_param_extensions;
/* accept these additional custom XCLIENT fields */
const char *const *xclient_extensions;
bool auth_optional:1;
bool tls_required:1;
bool rcpt_domain_optional:1;
- bool param_extensions:1;
};
struct smtp_server_stats {
#include "smtp-address.h"
#include "smtp-params.h"
+static const char *test_extensions[] = { "FROP", "FRUP", NULL };
+
static struct smtp_address test_address1 =
{ .localpart = NULL, .domain = NULL };
static struct smtp_address test_address2 =
const char *input, *output;
enum smtp_capability caps;
- bool extensions;
+ const char *const *extensions;
+ const char *const *body_extensions;
struct smtp_params_mail params;
};
.caps = SMTP_CAPABILITY_8BITMIME |
SMTP_CAPABILITY_BINARYMIME |
SMTP_CAPABILITY_CHUNKING,
- .extensions = TRUE,
+ .body_extensions = test_extensions,
.params = {
.body = {
.type = SMTP_PARAM_MAIL_BODY_TYPE_EXTENSION,
},{
.input = "FROP=friep",
.caps = SMTP_CAPABILITY_SIZE,
- .extensions = TRUE,
+ .extensions = test_extensions,
.params = {
.extra_params = {
.arr = {
}
},{
.input = "FROP=friep FRUP=frml",
- .extensions = TRUE,
+ .extensions = test_extensions,
.params = {
.extra_params = {
.arr = {
test = &valid_mail_params_parse_tests[i];
ret = smtp_params_mail_parse(pool_datastack_create(),
- test->input, test->caps, test->extensions, ¶ms,
- &error_code, &error);
+ test->input, test->caps, test->extensions,
+ test->body_extensions, ¶ms, &error_code, &error);
test_begin(t_strdup_printf("smtp mail params valid [%d]", i));
test_out_reason(t_strdup_printf("parse(\"%s\")",
if ((test->caps & SMTP_CAPABILITY_SIZE) != 0)
test_smtp_mail_params_size(&test->params, ¶ms);
/* <extensions> */
- if (test->extensions)
+ if (test->extensions != NULL)
test_smtp_mail_params_extensions(&test->params, ¶ms);
encoded = t_str_new(256);
const char *input;
enum smtp_capability caps;
- bool extensions;
+ const char *const *extensions;
};
static const struct invalid_mail_params_parse_test
test = &invalid_mail_params_parse_tests[i];
ret = smtp_params_mail_parse(pool_datastack_create(),
- test->input, test->caps, test->extensions, ¶ms,
- &error_code, &error);
+ test->input, test->caps, test->extensions, NULL,
+ ¶ms, &error_code, &error);
test_begin(t_strdup_printf("smtp mail params invalid [%d]", i));
test_out_reason(t_strdup_printf("parse(\"%s\")",
const char *input, *output;
enum smtp_capability caps;
- bool extensions;
+ const char *const *extensions;
struct smtp_params_rcpt params;
};
},{
.input = "FROP=friep",
.caps = SMTP_CAPABILITY_SIZE,
- .extensions = TRUE,
+ .extensions = test_extensions,
.params = {
.extra_params = {
.arr = {
}
},{
.input = "FROP=friep FRUP=frml",
- .extensions = TRUE,
+ .extensions = test_extensions,
.params = {
.extra_params = {
.arr = {
test = &valid_rcpt_params_parse_tests[i];
ret = smtp_params_rcpt_parse(pool_datastack_create(),
- test->input, test->caps, test->extensions, ¶ms,
- &error_code, &error);
+ test->input, test->caps, test->extensions,
+ ¶ms, &error_code, &error);
test_begin(t_strdup_printf("smtp rcpt params valid [%d]", i));
test_out_reason(t_strdup_printf("parse(\"%s\")",
if ((test->caps & SMTP_CAPABILITY_DSN) != 0)
test_smtp_rcpt_params_notify(&test->params, ¶ms);
/* <extensions> */
- if (test->extensions)
+ if (test->extensions != NULL)
test_smtp_rcpt_params_extensions(&test->params, ¶ms);
encoded = t_str_new(256);
const char *input;
enum smtp_capability caps;
- bool extensions;
+ const char *const *extensions;
};
static const struct invalid_rcpt_params_parse_test
test = &invalid_rcpt_params_parse_tests[i];
ret = smtp_params_rcpt_parse(pool_datastack_create(),
- test->input, test->caps, test->extensions, ¶ms,
- &error_code, &error);
+ test->input, test->caps, test->extensions,
+ ¶ms, &error_code, &error);
test_begin(t_strdup_printf("smtp rcpt params invalid [%d]", i));
test_out_reason(t_strdup_printf("parse(\"%s\")",