]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-server-recipient - Add hook for the submission of a DATA/BDAT/BURL...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 16 Mar 2019 13:41:37 +0000 (14:41 +0100)
committerStephan Bosch <stephan.bosch@dovecot.fi>
Tue, 19 Mar 2019 12:31:21 +0000 (13:31 +0100)
src/lib-smtp/smtp-server-cmd-data.c
src/lib-smtp/smtp-server-private.h
src/lib-smtp/smtp-server-recipient.c
src/lib-smtp/smtp-server.h

index ddbdec15e592c34dfa5558d490b273907b6d3c41..26506437dd9d0ab680478b41fe4e440374f23ba2 100644 (file)
@@ -146,6 +146,21 @@ cmd_data_destroy(struct smtp_server_cmd_ctx *cmd,
        i_stream_unref(&data_cmd->chunk_input);
 }
 
+static void
+cmd_data_replied_one(struct smtp_server_cmd_ctx *cmd,
+                    struct cmd_data_context *data_cmd ATTR_UNUSED)
+{
+       struct smtp_server_connection *conn = cmd->conn;
+       struct smtp_server_transaction *trans = conn->state.trans;
+       struct smtp_server_recipient **rcptp;
+
+       if (trans == NULL || !array_is_created(&trans->rcpt_to))
+               return;
+
+       array_foreach_modifiable(&trans->rcpt_to, rcptp)
+               smtp_server_recipient_data_replied(*rcptp);
+}
+
 static void
 cmd_data_replied(struct smtp_server_cmd_ctx *cmd,
                 struct cmd_data_context *data_cmd ATTR_UNUSED)
@@ -513,6 +528,8 @@ void smtp_server_cmd_data(struct smtp_server_cmd_ctx *cmd,
 
        smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_NEXT,
                                     cmd_data_start, data_cmd);
+       smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_REPLIED_ONE,
+                                    cmd_data_replied_one, data_cmd);
        smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_REPLIED,
                                     cmd_data_replied, data_cmd);
        smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_DESTROY,
index cdc2c719c316998a0790814c731c27b0a725dd12..1e973d1cf9cc91264a0b89ccbf76355d91b280a9 100644 (file)
@@ -380,6 +380,7 @@ void smtp_server_recipient_denied(struct smtp_server_recipient *rcpt,
 
 void smtp_server_recipient_last_data(struct smtp_server_recipient *rcpt,
                                     struct smtp_server_cmd_ctx *cmd);
+void smtp_server_recipient_data_replied(struct smtp_server_recipient *rcpt);
 
 void smtp_server_recipient_reset(struct smtp_server_recipient *rcpt);
 void smtp_server_recipient_finished(struct smtp_server_recipient *rcpt,
index 904d79f530eff4bbf8fe6cf2df6f6005d9a2e4d4..94331fbb41b42d3b99e977792a84af6cd93afa62 100644 (file)
@@ -134,6 +134,24 @@ void smtp_server_recipient_last_data(struct smtp_server_recipient *rcpt,
        rcpt->cmd = cmd;
 }
 
+void smtp_server_recipient_data_replied(struct smtp_server_recipient *rcpt)
+{
+       unsigned int reply_index = 0;
+
+       if (rcpt->replied)
+               return;
+       if (HAS_ALL_BITS(rcpt->trans->flags,
+                        SMTP_SERVER_TRANSACTION_FLAG_REPLY_PER_RCPT))
+               reply_index = rcpt->index;
+       if (smtp_server_command_get_reply(rcpt->cmd->cmd, reply_index) == NULL)
+               return;
+       rcpt->replied = TRUE;
+       if (!smtp_server_recipient_call_hooks(
+               &rcpt, SMTP_SERVER_RECIPIENT_HOOK_DATA_REPLIED)) {
+               /* nothing to do */
+       }
+}
+
 bool smtp_server_recipient_is_replied(struct smtp_server_recipient *rcpt)
 {
        i_assert(rcpt->cmd != NULL);
index 0cbc5d4b535d7550e19a7b6f728d34883c2c6f60..dbc4afb286c80015aa689f32f6d2818b4aa93f59 100644 (file)
@@ -54,6 +54,8 @@ enum smtp_server_recipient_hook_type {
        /* approved: the server is about to approve this recipient by sending
           a success reply to the RCPT command. */
        SMTP_SERVER_RECIPIENT_HOOK_APPROVED,
+       /* data_replied: the DATA command is replied for this recipient */
+       SMTP_SERVER_RECIPIENT_HOOK_DATA_REPLIED,
        /* destroy: recipient is about to be destroyed. */
        SMTP_SERVER_RECIPIENT_HOOK_DESTROY
 };
@@ -79,6 +81,7 @@ struct smtp_server_recipient {
 
        void *context;
 
+       bool replied:1;
        bool finished:1;
 };
 ARRAY_DEFINE_TYPE(smtp_server_recipient, struct smtp_server_recipient *);