]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
submission: backends: Add trans_start() and trans_free() vfuncs.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 15 Sep 2018 16:15:36 +0000 (18:15 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 12 Feb 2019 13:40:41 +0000 (15:40 +0200)
These are called when the SMTP transaction is started and freed respectively.

src/submission/submission-backend.c
src/submission/submission-backend.h
src/submission/submission-client.c
src/submission/submission-commands.c

index c92e15724f5fe55b6e3e1519c547596410da5c9c..66dfc81ca074e231ceb166b170366144bee5041b 100644 (file)
@@ -89,7 +89,44 @@ uoff_t submission_backend_get_max_mail_size(struct submission_backend *backend)
        return UOFF_T_MAX;
 }
 
-void submission_backends_trans_free(struct client *client)
+void submission_backend_trans_start(struct submission_backend *backend,
+                                   struct smtp_server_transaction *trans)
+{
+       submission_backend_start(backend);
+
+       if (backend->trans_started)
+               return;
+       backend->trans_started = TRUE;
+
+       if (backend->v.trans_start != NULL)
+               backend->v.trans_start(backend, trans);
+}
+
+static void
+submission_backend_trans_free(struct submission_backend *backend,
+                             struct smtp_server_transaction *trans)
+{
+       i_stream_unref(&backend->data_input);
+       if (backend->v.trans_free != NULL)
+               backend->v.trans_free(backend, trans);
+}
+
+void submission_backends_trans_start(struct client *client,
+                                    struct smtp_server_transaction *trans)
+{
+       struct submission_backend *const *bkp;
+
+       i_assert(client->state.backend != NULL);
+       submission_backend_trans_start(client->state.backend, trans);
+
+       array_foreach(&client->rcpt_backends, bkp) {
+               struct submission_backend *backend = *bkp;
+               submission_backend_trans_start(backend, trans);
+       }
+}
+
+void submission_backends_trans_free(struct client *client,
+                                    struct smtp_server_transaction *trans)
 {
        struct submission_backend *const *bkp;
 
@@ -98,8 +135,7 @@ void submission_backends_trans_free(struct client *client)
 
        array_foreach(&client->rcpt_backends, bkp) {
                struct submission_backend *backend = *bkp;
-
-               i_stream_unref(&backend->data_input);
+               submission_backend_trans_free(backend, trans);
        }
        array_clear(&client->rcpt_backends);
        client->state.backend = NULL;
index 54c7aa7ce774ac1c57e28feebd42aca88f53d4c1..92f58fa87c14bf0853738012ef1d3702220d0d7e 100644 (file)
@@ -13,6 +13,11 @@ struct submission_backend_vfuncs {
 
        uoff_t (*get_max_mail_size)(struct submission_backend *backend);
 
+       void (*trans_start)(struct submission_backend *backend,
+                           struct smtp_server_transaction *trans);
+       void (*trans_free)(struct submission_backend *backend,
+                          struct smtp_server_transaction *trans);
+
        int (*cmd_helo)(struct submission_backend *backend,
                        struct smtp_server_cmd_ctx *cmd,
                        struct smtp_server_cmd_helo *data);
@@ -51,6 +56,7 @@ struct submission_backend {
        uoff_t data_size;
 
        bool started:1;
+       bool trans_started:1;
 };
 
 void submission_backend_init(struct submission_backend *backend,
@@ -67,7 +73,12 @@ void submission_backends_client_input_post(struct client *client);
 
 uoff_t submission_backend_get_max_mail_size(struct submission_backend *backend);
 
-void submission_backends_trans_free(struct client *client);
+void submission_backend_trans_start(struct submission_backend *backend,
+                                   struct smtp_server_transaction *trans);
+void submission_backends_trans_start(struct client *client,
+                                    struct smtp_server_transaction *trans);
+void submission_backends_trans_free(struct client *client,
+                                    struct smtp_server_transaction *trans);
 
 void submission_backend_helo_reply_submit(struct submission_backend *backend,
                                          struct smtp_server_cmd_ctx *cmd,
index bb0a353d13067ba7f7b4bbcb8a8f0ff493745ef5..1d80074e317e838c6919cbcc896dfc1086d79a37 100644 (file)
@@ -309,9 +309,18 @@ void client_destroy(struct client *client, const char *prefix,
        submission_refresh_proctitle();
 }
 
+static void
+client_connection_trans_start(void *context,
+                             struct smtp_server_transaction *trans)
+{
+       struct client *client = context;
+
+       submission_backends_trans_start(client, trans);
+}
+
 static void
 client_connection_trans_free(void *context,
-                            struct smtp_server_transaction *trans ATTR_UNUSED)
+                            struct smtp_server_transaction *trans)
 {
        struct client *client = context;
        struct submission_recipient **rcptp;
@@ -320,7 +329,7 @@ client_connection_trans_free(void *context,
                submission_recipient_destroy(rcptp);
        array_clear(&client->rcpt_to);
 
-       submission_backends_trans_free(client);
+       submission_backends_trans_free(client, trans);
        client_state_reset(client);
 }
 
@@ -485,6 +494,7 @@ static const struct smtp_server_callbacks smtp_callbacks = {
        .conn_cmd_input_pre = client_input_pre,
        .conn_cmd_input_post = client_input_post,
 
+       .conn_trans_start = client_connection_trans_start,
        .conn_trans_free = client_connection_trans_free,
 
        .conn_state_changed = client_connection_state_changed,
index c6ef4ec33a1d9405aca56ce53ef50ac3a43396e9..865c5251ed06f98b34a5f363907e1e76abd34f55 100644 (file)
@@ -136,6 +136,7 @@ int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
             struct smtp_server_cmd_rcpt *data)
 {
        struct client *client = conn_ctx;
+       struct smtp_server_transaction *trans;
        struct submission_recipient *rcpt;
 
        rcpt = submission_recipient_create(client, data->path);
@@ -146,6 +147,10 @@ int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
        data->trans_context = rcpt;
        data->hook_finished = submission_rcpt_finished;
 
+       trans = smtp_server_connection_get_transaction(cmd->conn);
+       if (trans != NULL)
+               submission_backend_trans_start(rcpt->backend, trans);
+
        return submission_backend_cmd_rcpt(rcpt->backend, cmd, data);
 }
 
@@ -161,6 +166,8 @@ int cmd_rset(void *conn_ctx, struct smtp_server_cmd_ctx *cmd)
        if (backend == NULL)
                backend = client->backend_default;
 
+       /* all backends will also be notified through trans_free(), but that
+          doesn't allow changing the RSET command response. */
        return submission_backend_cmd_rset(backend, cmd);
 }