]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-client-transaction - Emit named recipient events.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Wed, 6 Feb 2019 22:06:38 +0000 (23:06 +0100)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Fri, 28 Jun 2019 07:09:30 +0000 (10:09 +0300)
src/lib-smtp/smtp-client-private.h
src/lib-smtp/smtp-client-transaction.c

index 883358bad9f07f607665ca400ece417ab9d3f964..916da8ede63580ed5ad1c8cada65fe3367f126a1 100644 (file)
@@ -75,6 +75,7 @@ struct smtp_client_transaction_mail {
 struct smtp_client_transaction_rcpt {
        pool_t pool;
        struct smtp_client_transaction *trans;
+       struct event *event;
 
        struct smtp_client_transaction_rcpt *prev, *next;
 
index b8c9ca9925d709d8b0b67a8bdd26d018fa9c87c4..36ab444580fdc1c958731c2674f435ca604d935e 100644 (file)
@@ -133,6 +133,20 @@ smtp_client_transaction_mail_fail_reply(
  * Recipient
  */
 
+static void
+smtp_client_transaction_rcpt_update_event(
+       struct smtp_client_transaction_rcpt *rcpt)
+{
+       struct smtp_client_connection *conn = rcpt->trans->conn;
+       const char *to = smtp_address_encode(rcpt->rcpt_to);
+
+       event_set_append_log_prefix(rcpt->event,
+                                   t_strdup_printf("rcpt <%s>: ", to));
+       event_add_str(rcpt->event, "rcpt_to", to);
+       smtp_params_rcpt_add_to_event(&rcpt->rcpt_params, conn->caps.standard,
+                                     rcpt->event);
+}
+
 static struct smtp_client_transaction_rcpt *
 smtp_client_transaction_rcpt_new(
        struct smtp_client_transaction *trans, pool_t pool,
@@ -156,7 +170,11 @@ smtp_client_transaction_rcpt_new(
        if (trans->rcpts_send == NULL)
                trans->rcpts_send = rcpt;
 
+       rcpt->event = event_create(trans->event);
+       smtp_client_transaction_rcpt_update_event(rcpt);
+
        trans->rcpts_total++;
+
        return rcpt;
 }
 
@@ -184,9 +202,24 @@ smtp_client_transaction_rcpt_free(
        }
 
        if (!rcpt->finished) {
+               struct smtp_reply failure;
+
                trans->rcpts_aborted++;
+
+               smtp_reply_init(&failure,
+                               SMTP_CLIENT_COMMAND_ERROR_ABORTED,
+                               "Aborted");
+               failure.enhanced_code = SMTP_REPLY_ENH_CODE(9, 0, 0);
+
+               struct event_passthrough *e =
+                       event_create_passthrough(rcpt->event)->
+                       set_name("smtp_client_transaction_rcpt_finished");
+               smtp_reply_add_to_event(&failure, e);
+               e_debug(e->event(), "Aborted");
        }
 
+       event_unref(&rcpt->event);
+
        if (rcpt->queued || rcpt->external_pool) {
                i_assert(rcpt->pool != NULL);
                pool_unref(&rcpt->pool);
@@ -225,6 +258,9 @@ smtp_client_transaction_rcpt_approved(
                rcpt->data_callback = prcpt->data_callback;
                rcpt->data_context = prcpt->data_context;
 
+               rcpt->event = prcpt->event;
+               event_ref(rcpt->event);
+
                /* free the old object, thereby removing it from the queue */
                smtp_client_transaction_rcpt_free(&prcpt);
        }
@@ -240,7 +276,8 @@ smtp_client_transaction_rcpt_approved(
 
 static void
 smtp_client_transaction_rcpt_denied(
-       struct smtp_client_transaction_rcpt **_rcpt)
+       struct smtp_client_transaction_rcpt **_rcpt,
+       const struct smtp_reply *reply)
 {
        struct smtp_client_transaction_rcpt *prcpt = *_rcpt;
        struct smtp_client_transaction *trans = prcpt->trans;
@@ -250,6 +287,12 @@ smtp_client_transaction_rcpt_denied(
        trans->rcpts_denied++;
        trans->rcpts_failed++;
 
+       struct event_passthrough *e =
+               event_create_passthrough(prcpt->event)->
+               set_name("smtp_client_transaction_rcpt_finished");
+       smtp_reply_add_to_event(reply, e);
+       e_debug(e->event(), "Denied");
+
        /* not pending anymore */
        smtp_client_transaction_rcpt_free(&prcpt);
 }
@@ -273,7 +316,7 @@ smtp_client_transaction_rcpt_replied(
        if (success)
                smtp_client_transaction_rcpt_approved(_rcpt);
        else
-               smtp_client_transaction_rcpt_denied(_rcpt);
+               smtp_client_transaction_rcpt_denied(_rcpt, reply);
 
        /* call the callback */
        if (rcpt_callback != NULL)
@@ -320,6 +363,12 @@ smtp_client_transaction_rcpt_fail_reply(
        rcpt->rcpt_callback = NULL;
        rcpt->data_callback = NULL;
 
+       struct event_passthrough *e =
+               event_create_passthrough(rcpt->event)->
+               set_name("smtp_client_transaction_rcpt_finished");
+       smtp_reply_add_to_event(reply, e);
+       e_debug(e->event(), "Failed");
+
        if (callback != NULL)
                callback(reply, context);
 
@@ -340,6 +389,12 @@ smtp_client_transaction_rcpt_finished(struct smtp_client_transaction_rcpt *rcpt,
        else
                trans->rcpts_failed++;
 
+       struct event_passthrough *e =
+               event_create_passthrough(rcpt->event)->
+               set_name("smtp_client_transaction_rcpt_finished");
+       smtp_reply_add_to_event(reply, e);
+       e_debug(e->event(), "Finished");
+
        if (rcpt->data_callback != NULL)
                rcpt->data_callback(reply, rcpt->data_context);
        rcpt->data_callback = NULL;