From: Stephan Bosch Date: Sat, 6 Oct 2018 09:21:35 +0000 (+0200) Subject: lib-smtp: server: Allow enabling the LMTP per-RCPT DATA reply behavior for ESMTP... X-Git-Tag: 2.3.5~101 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=26af7752e45d0698bfe327d4f9c0c996cda2b29c;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: server: Allow enabling the LMTP per-RCPT DATA reply behavior for ESMTP transactions. This is non-standard. --- diff --git a/src/lib-smtp/smtp-server-cmd-data.c b/src/lib-smtp/smtp-server-cmd-data.c index 4bf6bf4110..5788ba62d8 100644 --- a/src/lib-smtp/smtp-server-cmd-data.c +++ b/src/lib-smtp/smtp-server-cmd-data.c @@ -341,6 +341,7 @@ cmd_data_next(struct smtp_server_cmd_ctx *cmd, /* this command is next to send a reply */ i_assert(data_cmd != NULL); + i_assert(trans != NULL); i_assert(conn->state.pending_mail_cmds == 0 && conn->state.pending_rcpt_cmds == 0); i_assert(trans != NULL); @@ -358,7 +359,8 @@ cmd_data_next(struct smtp_server_cmd_ctx *cmd, /* LMTP 'DATA' and 'BDAT LAST' commands need to send more than one reply per recipient */ - if (conn->set.protocol == SMTP_PROTOCOL_LMTP) { + if (HAS_ALL_BITS(trans->flags, + SMTP_SERVER_TRANSACTION_FLAG_REPLY_PER_RCPT)) { smtp_server_command_set_reply_count(command, array_count(&trans->rcpt_to)); } diff --git a/src/lib-smtp/smtp-server-cmd-mail.c b/src/lib-smtp/smtp-server-cmd-mail.c index dc086e0a56..35c86c01e2 100644 --- a/src/lib-smtp/smtp-server-cmd-mail.c +++ b/src/lib-smtp/smtp-server-cmd-mail.c @@ -43,7 +43,7 @@ cmd_mail_completed(struct smtp_server_cmd_ctx *cmd, /* success */ conn->state.trans = smtp_server_transaction_create(conn, - data->path, &data->params, &data->timestamp); + data->flags, data->path, &data->params, &data->timestamp); if (conn->callbacks != NULL && conn->callbacks->conn_trans_start != NULL) { @@ -139,6 +139,9 @@ void smtp_server_cmd_mail(struct smtp_server_cmd_ctx *cmd, mail_data = p_new(cmd->pool, struct smtp_server_cmd_mail, 1); + if (conn->set.protocol == SMTP_PROTOCOL_LMTP) + mail_data->flags |= SMTP_SERVER_TRANSACTION_FLAG_REPLY_PER_RCPT; + /* [SP Mail-parameters] */ if (array_is_created(&conn->mail_param_extensions)) param_extensions = array_idx(&conn->mail_param_extensions, 0); diff --git a/src/lib-smtp/smtp-server-private.h b/src/lib-smtp/smtp-server-private.h index af8a447fa7..7c6566c130 100644 --- a/src/lib-smtp/smtp-server-private.h +++ b/src/lib-smtp/smtp-server-private.h @@ -384,9 +384,10 @@ void smtp_server_recipient_last_data(struct smtp_server_recipient *rcpt, struct smtp_server_transaction * smtp_server_transaction_create(struct smtp_server_connection *conn, - const struct smtp_address *mail_from, - const struct smtp_params_mail *params, - const struct timeval *timestamp); + enum smtp_server_transaction_flags flags, + const struct smtp_address *mail_from, + const struct smtp_params_mail *params, + const struct timeval *timestamp); void smtp_server_transaction_free(struct smtp_server_transaction **_trans); void smtp_server_transaction_add_rcpt(struct smtp_server_transaction *trans, diff --git a/src/lib-smtp/smtp-server-transaction.c b/src/lib-smtp/smtp-server-transaction.c index 08227c7659..bf33fdabb8 100644 --- a/src/lib-smtp/smtp-server-transaction.c +++ b/src/lib-smtp/smtp-server-transaction.c @@ -13,6 +13,7 @@ struct smtp_server_transaction * smtp_server_transaction_create(struct smtp_server_connection *conn, + enum smtp_server_transaction_flags flags, const struct smtp_address *mail_from, const struct smtp_params_mail *params, const struct timeval *timestamp) @@ -36,6 +37,7 @@ smtp_server_transaction_create(struct smtp_server_connection *conn, str_truncate(id, str_len(id)-2); /* drop trailing "==" */ trans->id = p_strdup(pool, str_c(id)); + trans->flags = flags; trans->mail_from = smtp_address_clone(trans->pool, mail_from); smtp_params_mail_copy(pool, &trans->params, params); trans->timestamp = *timestamp; diff --git a/src/lib-smtp/smtp-server.h b/src/lib-smtp/smtp-server.h index 957d41fd5f..a5a529300c 100644 --- a/src/lib-smtp/smtp-server.h +++ b/src/lib-smtp/smtp-server.h @@ -103,12 +103,18 @@ void smtp_server_recipient_remove_hook( * Transaction */ +enum smtp_server_transaction_flags { + SMTP_SERVER_TRANSACTION_FLAG_REPLY_PER_RCPT = BIT(0), +}; + struct smtp_server_transaction { pool_t pool; struct smtp_server_connection *conn; const char *id; struct timeval timestamp; + enum smtp_server_transaction_flags flags; + struct smtp_address *mail_from; struct smtp_params_mail params; ARRAY_TYPE(smtp_server_recipient) rcpt_to; @@ -152,6 +158,8 @@ struct smtp_server_cmd_mail { struct smtp_params_mail params; struct timeval timestamp; + + enum smtp_server_transaction_flags flags; }; struct smtp_server_cmd_auth { diff --git a/src/submission/submission-backend-relay.c b/src/submission/submission-backend-relay.c index 56620b6241..c15e660488 100644 --- a/src/submission/submission-backend-relay.c +++ b/src/submission/submission-backend-relay.c @@ -115,7 +115,7 @@ backend_relay_handle_relay_reply(struct submission_backend_relay *backend, if (!result) { const char *reason = t_strdup_printf("%s%s", msg, detail); - + smtp_client_transaction_destroy(&backend->trans); submission_backend_fail(&backend->backend, cmd, enh_code, reason); return FALSE;