From: Stephan Bosch Date: Sat, 15 Sep 2018 11:17:11 +0000 (+0200) Subject: submission: Record accepted recipients in the client object. X-Git-Tag: 2.3.9~1309 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=35f368bc9122748e8085b8b525115874ca315037;p=thirdparty%2Fdovecot%2Fcore.git submission: Record accepted recipients in the client object. Allows associating context with recipients in future changes. --- diff --git a/src/submission/Makefile.am b/src/submission/Makefile.am index 276539c30d..08635bee34 100644 --- a/src/submission/Makefile.am +++ b/src/submission/Makefile.am @@ -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 diff --git a/src/submission/submission-client.c b/src/submission/submission-client.c index faef8bf4f2..bf8d532670 100644 --- a/src/submission/submission-client.c +++ b/src/submission/submission-client.c @@ -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); diff --git a/src/submission/submission-client.h b/src/submission/submission-client.h index 44aa5868ba..6c977fb699 100644 --- a/src/submission/submission-client.h +++ b/src/submission/submission-client.h @@ -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; diff --git a/src/submission/submission-commands.c b/src/submission/submission-commands.c index fff3ab5374..055a05c68e 100644 --- a/src/submission/submission-commands.c +++ b/src/submission/submission-commands.c @@ -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 index 0000000000..b53e7b8b2b --- /dev/null +++ b/src/submission/submission-recipient.c @@ -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 index 0000000000..3006a6582c --- /dev/null +++ b/src/submission/submission-recipient.h @@ -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