From: Stephan Bosch Date: Thu, 13 Sep 2018 21:30:26 +0000 (+0200) Subject: lib-smtp: server: Add proper infrastructure for adding custom MAIL/RCPT command param... X-Git-Tag: 2.3.9~1237 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eb1651466c8b0cde6e0ad57b09cb32bde3523450;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: server: Add proper infrastructure for adding custom MAIL/RCPT command parameters. --- diff --git a/src/lib-smtp/smtp-server-cmd-mail.c b/src/lib-smtp/smtp-server-cmd-mail.c index b4b5b8a482..dc086e0a56 100644 --- a/src/lib-smtp/smtp-server-cmd-mail.c +++ b/src/lib-smtp/smtp-server-cmd-mail.c @@ -78,6 +78,7 @@ void smtp_server_cmd_mail(struct smtp_server_cmd_ctx *cmd, struct smtp_server_command *command = cmd->cmd; struct smtp_server_cmd_mail *mail_data; enum smtp_address_parse_flags path_parse_flags; + const char *const *param_extensions = NULL; struct smtp_address *path; enum smtp_param_parse_error pperror; const char *error; @@ -139,9 +140,11 @@ void smtp_server_cmd_mail(struct smtp_server_cmd_ctx *cmd, mail_data = p_new(cmd->pool, struct smtp_server_cmd_mail, 1); /* [SP Mail-parameters] */ - if (smtp_params_mail_parse(cmd->pool, params, caps, - set->mail_param_extensions, NULL, - &mail_data->params, &pperror, &error) < 0) { + if (array_is_created(&conn->mail_param_extensions)) + param_extensions = array_idx(&conn->mail_param_extensions, 0); + if (smtp_params_mail_parse(cmd->pool, params, caps, 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); diff --git a/src/lib-smtp/smtp-server-cmd-rcpt.c b/src/lib-smtp/smtp-server-cmd-rcpt.c index f05f05d96a..93114762c8 100644 --- a/src/lib-smtp/smtp-server-cmd-rcpt.c +++ b/src/lib-smtp/smtp-server-cmd-rcpt.c @@ -95,6 +95,7 @@ void smtp_server_cmd_rcpt(struct smtp_server_cmd_ctx *cmd, struct smtp_server_command *command = cmd->cmd; struct smtp_server_cmd_rcpt *rcpt_data; enum smtp_address_parse_flags path_parse_flags; + const char *const *param_extensions = NULL; struct smtp_address *path; enum smtp_param_parse_error pperror; const char *error; @@ -155,8 +156,9 @@ void smtp_server_cmd_rcpt(struct smtp_server_cmd_ctx *cmd, rcpt_data = p_new(cmd->pool, struct smtp_server_cmd_rcpt, 1); /* [SP Rcpt-parameters] */ - if (smtp_params_rcpt_parse(cmd->pool, params, caps, - set->rcpt_param_extensions, + if (array_is_created(&conn->rcpt_param_extensions)) + param_extensions = array_idx(&conn->rcpt_param_extensions, 0); + if (smtp_params_rcpt_parse(cmd->pool, params, caps, param_extensions, &rcpt_data->params, &pperror, &error) < 0) { switch (pperror) { case SMTP_PARAM_PARSE_ERROR_BAD_SYNTAX: diff --git a/src/lib-smtp/smtp-server-connection.c b/src/lib-smtp/smtp-server-connection.c index 82689498be..7deafd7ed7 100644 --- a/src/lib-smtp/smtp-server-connection.c +++ b/src/lib-smtp/smtp-server-connection.c @@ -906,6 +906,29 @@ smtp_server_connection_alloc(struct smtp_server *server, conn->set.debug = conn->set.debug || set->debug; } + if (set != NULL && set->mail_param_extensions != NULL) { + const char *const *extp; + + p_array_init(&conn->mail_param_extensions, pool, + str_array_length(set->mail_param_extensions) + 8); + for (extp = set->mail_param_extensions; *extp != NULL; extp++) { + const char *ext = p_strdup(pool, *extp); + array_append(&conn->mail_param_extensions, &ext, 1); + } + array_append_zero(&conn->mail_param_extensions); + } + if (set != NULL && set->rcpt_param_extensions != NULL) { + const char *const *extp; + + p_array_init(&conn->rcpt_param_extensions, pool, + str_array_length(set->rcpt_param_extensions) + 8); + for (extp = set->rcpt_param_extensions; *extp != NULL; extp++) { + const char *ext = p_strdup(pool, *extp); + array_append(&conn->rcpt_param_extensions, &ext, 1); + } + array_append_zero(&conn->rcpt_param_extensions); + } + conn->remote_pid = (pid_t)-1; conn->remote_uid = (uid_t)-1; if (remote_ip != NULL && remote_ip->family != 0) { @@ -1492,6 +1515,42 @@ void smtp_server_connection_set_proxy_data(struct smtp_server_connection *conn, } } +void smtp_server_connection_register_mail_param( + struct smtp_server_connection *conn, const char *param) +{ + param = p_strdup(conn->pool, param); + + if (!array_is_created(&conn->mail_param_extensions)) { + p_array_init(&conn->mail_param_extensions, conn->pool, 8); + array_append(&conn->mail_param_extensions, ¶m, 1); + } else { + unsigned int count = array_count(&conn->mail_param_extensions); + + i_assert(count > 0); + array_idx_set(&conn->mail_param_extensions, + count - 1, ¶m); + } + array_append_zero(&conn->mail_param_extensions); +} + +void smtp_server_connection_register_rcpt_param( + struct smtp_server_connection *conn, const char *param) +{ + param = p_strdup(conn->pool, param); + + if (!array_is_created(&conn->rcpt_param_extensions)) { + p_array_init(&conn->rcpt_param_extensions, conn->pool, 8); + array_append(&conn->rcpt_param_extensions, ¶m, 1); + } else { + unsigned int count = array_count(&conn->rcpt_param_extensions); + + i_assert(count > 0); + array_idx_set(&conn->rcpt_param_extensions, + count - 1, ¶m); + } + array_append_zero(&conn->rcpt_param_extensions); +} + void smtp_server_connection_switch_ioloop(struct smtp_server_connection *conn) { if (conn->to_idle != NULL) diff --git a/src/lib-smtp/smtp-server-private.h b/src/lib-smtp/smtp-server-private.h index dad37cdfe1..2a80948765 100644 --- a/src/lib-smtp/smtp-server-private.h +++ b/src/lib-smtp/smtp-server-private.h @@ -125,6 +125,10 @@ struct smtp_server_connection { unsigned int refcount; struct smtp_server_settings set; + + ARRAY_TYPE(const_string) mail_param_extensions; /* NULL-terminated */ + ARRAY_TYPE(const_string) rcpt_param_extensions; /* NULL-terminated */ + const struct smtp_server_callbacks *callbacks; void *context; diff --git a/src/lib-smtp/smtp-server.h b/src/lib-smtp/smtp-server.h index 9e5a9058e9..9800ef9468 100644 --- a/src/lib-smtp/smtp-server.h +++ b/src/lib-smtp/smtp-server.h @@ -381,6 +381,11 @@ void smtp_server_connection_get_proxy_data(struct smtp_server_connection *conn, void smtp_server_connection_set_capabilities( struct smtp_server_connection *conn, enum smtp_capability capabilities); +void smtp_server_connection_register_mail_param( + struct smtp_server_connection *conn, const char *param); +void smtp_server_connection_register_rcpt_param( + struct smtp_server_connection *conn, const char *param); + bool smtp_server_connection_is_ssl_secured(struct smtp_server_connection *conn); bool smtp_server_connection_is_trusted(struct smtp_server_connection *conn);