]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
submission: Record accepted recipients in the client object.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 15 Sep 2018 11:17:11 +0000 (13:17 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 12 Feb 2019 13:40:41 +0000 (15:40 +0200)
Allows associating context with recipients in future changes.

src/submission/Makefile.am
src/submission/submission-client.c
src/submission/submission-client.h
src/submission/submission-commands.c
src/submission/submission-recipient.c [new file with mode: 0644]
src/submission/submission-recipient.h [new file with mode: 0644]

index 276539c30d1226451ab99a1a955b6608685490a2..08635bee34ca2e151b7fa90489d02be5d69787b3 100644 (file)
@@ -36,6 +36,7 @@ submission_DEPENDENCIES = \
 submission_SOURCES = \
        main.c \
        submission-backend-relay.c \
+       submission-recipient.c \
        submission-client.c \
        submission-commands.c \
        submission-settings.c
@@ -45,5 +46,6 @@ noinst_HEADERS = \
        submission-backend.h \
        submission-backend-relay.h \
        submission-commands.h \
+       submission-recipient.h \
        submission-client.h \
        submission-settings.h
index faef8bf4f25ed63bac862a44c9bd36a91eb24e9f..bf8d5326709400a44207bc514300ffb31bec98be 100644 (file)
@@ -21,6 +21,7 @@
 #include "imap-urlauth.h"
 
 #include "submission-backend-relay.h"
+#include "submission-recipient.h"
 #include "submission-commands.h"
 #include "submission-settings.h"
 
@@ -111,6 +112,8 @@ struct client *client_create(int fd_in, int fd_out,
        client->set = set;
        client->session_id = i_strdup(session_id);
 
+       i_array_init(&client->rcpt_to, 8);
+
        i_zero(&smtp_set);
        smtp_set.hostname = set->hostname;
        smtp_set.login_greeting = set->login_greeting;
@@ -183,6 +186,8 @@ void client_destroy(struct client *client, const char *prefix,
 
        client_disconnect(client, prefix, reason);
 
+       array_free(&client->rcpt_to);
+
        submission_client_count--;
        DLLIST_REMOVE(&submission_clients, client);
 
@@ -215,6 +220,11 @@ client_connection_trans_free(void *context,
                             struct smtp_server_transaction *trans ATTR_UNUSED)
 {
        struct client *client = context;
+       struct submission_recipient **rcptp;
+
+       array_foreach_modifiable(&client->rcpt_to, rcptp)
+               submission_recipient_destroy(rcptp);
+       array_clear(&client->rcpt_to);
 
        client_state_reset(client);
 }
@@ -293,6 +303,7 @@ void client_disconnect(struct client *client, const char *enh_code,
                       const char *reason)
 {
        struct smtp_server_connection *conn;
+       struct submission_recipient **rcptp;
 
        if (client->disconnected)
                return;
@@ -301,6 +312,12 @@ void client_disconnect(struct client *client, const char *enh_code,
        timeout_remove(&client->to_quit);
        client_proxy_destroy(client);
 
+       if (array_is_created(&client->rcpt_to)) {
+               array_foreach_modifiable(&client->rcpt_to, rcptp)
+                       submission_recipient_destroy(rcptp);
+               array_clear(&client->rcpt_to);
+       }
+
        if (client->conn != NULL) {
                const struct smtp_server_stats *stats =
                        smtp_server_connection_get_stats(client->conn);
index 44aa5868ba80a4eaf3a8fa3923136d7ce3d3d9b7..6c977fb6993cad3a40900f2ffd219f6361e11355 100644 (file)
@@ -6,6 +6,7 @@
 
 struct smtp_reply;
 
+struct submission_recipient;
 struct client;
 
 struct client_state {
@@ -23,6 +24,7 @@ struct client {
        struct smtp_server_connection *conn;
        enum smtp_server_state last_state;
        struct client_state state;
+       ARRAY(struct submission_recipient *) rcpt_to;
 
        struct mail_storage_service_user *service_user;
        struct mail_user *user;
index fff3ab5374ecbcf7ddbb259eb951a06f67cff7bd..055a05c68eae7d9ae72272bb41194aebfa0e522f 100644 (file)
@@ -14,6 +14,7 @@
 #include "smtp-client.h"
 #include "smtp-client-connection.h"
 
+#include "submission-recipient.h"
 #include "submission-commands.h"
 #include "submission-backend-relay.h"
 
@@ -109,10 +110,41 @@ int cmd_mail(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
  * RCPT command
  */
 
+static void
+cmd_rcpt_destroy(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
+                struct submission_recipient *rcpt)
+{
+       submission_recipient_destroy(&rcpt);
+}
+
+static void
+submission_rcpt_finished(struct smtp_server_cmd_ctx *cmd,
+                        struct smtp_server_transaction *trans ATTR_UNUSED,
+                        struct smtp_server_recipient *trcpt,
+                        unsigned int index)
+{
+       struct submission_recipient *rcpt = trcpt->context;
+
+       smtp_server_command_remove_hook(cmd->cmd,
+                                       SMTP_SERVER_COMMAND_HOOK_DESTROY,
+                                       cmd_rcpt_destroy);
+
+       submission_recipient_finished(rcpt, trcpt, index);
+}
+
 int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
             struct smtp_server_cmd_rcpt *data)
 {
        struct client *client = conn_ctx;
+       struct submission_recipient *rcpt;
+
+       rcpt = submission_recipient_create(client, data->path);
+
+       smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY,
+                                    cmd_rcpt_destroy, rcpt);
+
+       data->trans_context = rcpt;
+       data->hook_finished = submission_rcpt_finished;
 
        return cmd_rcpt_relay(client, cmd, data);
 }
diff --git a/src/submission/submission-recipient.c b/src/submission/submission-recipient.c
new file mode 100644 (file)
index 0000000..b53e7b8
--- /dev/null
@@ -0,0 +1,38 @@
+/* Copyright (c) 2018 Dovecot authors, see the included COPYING file */
+
+#include "submission-common.h"
+
+#include "submission-recipient.h"
+
+struct submission_recipient *
+submission_recipient_create(struct client *client, struct smtp_address *path)
+{
+       struct submission_recipient *rcpt;
+
+       rcpt = i_new(struct submission_recipient, 1);
+       rcpt->client = client;
+       rcpt->path = path;
+
+       return rcpt;
+}
+
+void submission_recipient_destroy(struct submission_recipient **_rcpt)
+{
+       struct submission_recipient *rcpt = *_rcpt;
+
+       *_rcpt = NULL;
+
+       i_free(rcpt);
+}
+
+void submission_recipient_finished(struct submission_recipient *rcpt,
+                                  struct smtp_server_recipient *trcpt,
+                                  unsigned int index)
+{
+       struct client *client = rcpt->client;
+
+       rcpt->path = trcpt->path;
+       rcpt->index = index;
+
+       array_append(&client->rcpt_to, &rcpt, 1);
+}
diff --git a/src/submission/submission-recipient.h b/src/submission/submission-recipient.h
new file mode 100644 (file)
index 0000000..3006a65
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef SUBMISSION_RECIPIENT_H
+#define SUBMISSION_RECIPIENT_H
+
+struct client;
+
+struct submission_recipient {
+       struct client *client;
+
+       struct smtp_address *path;
+       unsigned int index;
+};
+
+struct submission_recipient *
+submission_recipient_create(struct client *client, struct smtp_address *path);
+void submission_recipient_destroy(struct submission_recipient **_rcpt);
+void submission_recipient_finished(struct submission_recipient *rcpt,
+                                  struct smtp_server_recipient *trcpt,
+                                  unsigned int index);
+
+#endif