Mercurial > dovecot > core-2.3
changeset 26400:2848f5201ab6
lib-smtp: smtp-server-recipient - Add hook for the submission of a DATA/BDAT/BURL command reply.
author | Stephan Bosch <stephan.bosch@dovecot.fi> |
---|---|
date | Sat, 16 Mar 2019 14:41:37 +0100 |
parents | 5cd174ab6b81 |
children | f493fc8d3433 |
files | 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 |
diffstat | 4 files changed, 39 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-smtp/smtp-server-cmd-data.c Sat Mar 16 15:26:58 2019 +0100 +++ b/src/lib-smtp/smtp-server-cmd-data.c Sat Mar 16 14:41:37 2019 +0100 @@ -147,6 +147,21 @@ } 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 @@ 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,
--- a/src/lib-smtp/smtp-server-private.h Sat Mar 16 15:26:58 2019 +0100 +++ b/src/lib-smtp/smtp-server-private.h Sat Mar 16 14:41:37 2019 +0100 @@ -380,6 +380,7 @@ 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,
--- a/src/lib-smtp/smtp-server-recipient.c Sat Mar 16 15:26:58 2019 +0100 +++ b/src/lib-smtp/smtp-server-recipient.c Sat Mar 16 14:41:37 2019 +0100 @@ -132,6 +132,24 @@ 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);
--- a/src/lib-smtp/smtp-server.h Sat Mar 16 15:26:58 2019 +0100 +++ b/src/lib-smtp/smtp-server.h Sat Mar 16 14:41:37 2019 +0100 @@ -54,6 +54,8 @@ /* 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 @@ void *context; + bool replied:1; bool finished:1; }; ARRAY_DEFINE_TYPE(smtp_server_recipient, struct smtp_server_recipient *);