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 *);