]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: server: Allow enabling the LMTP per-RCPT DATA reply behavior for ESMTP...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 6 Oct 2018 09:21:35 +0000 (11:21 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 12 Feb 2019 13:41:17 +0000 (15:41 +0200)
This is non-standard.

src/lib-smtp/smtp-server-cmd-data.c
src/lib-smtp/smtp-server-cmd-mail.c
src/lib-smtp/smtp-server-private.h
src/lib-smtp/smtp-server-transaction.c
src/lib-smtp/smtp-server.h
src/submission/submission-backend-relay.c

index 4bf6bf4110ab3b87cacfa26666704c83a339df68..5788ba62d826cf27ebe9841df20bcaa27b2e4cee 100644 (file)
@@ -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));
                }
index dc086e0a5646786cc3a4fc9bc24128143b3ffad2..35c86c01e230a1b3de8dad90bd827b2776a71267 100644 (file)
@@ -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);
index af8a447fa7a87990bef0ee1c26761947cd093469..7c6566c1308074e4690aa07cdc0129da0b4c4900 100644 (file)
@@ -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,
index 08227c765945f23b560f27ab8adc8b75b6b23d17..bf33fdabb89d0f0b20d8c8118976f48cd2acfe49 100644 (file)
@@ -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;
index 957d41fd5f0bbd190a768b3dae798e5eb88119b8..a5a529300cd56f37271219c80a4d3ad2fbb49088 100644 (file)
@@ -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 {
index 56620b6241cbbce11db552bc29c1c4d6939cc57b..c15e66048894976484b24ab6fa79df87535385a7 100644 (file)
@@ -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;