]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lmtp: RCPT command: Allocate lmtp_recipient object immediately.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 3 Nov 2018 13:26:24 +0000 (14:26 +0100)
committerStephan Bosch <stephan.bosch@dovecot.fi>
Tue, 11 Dec 2018 20:39:21 +0000 (21:39 +0100)
src/lmtp/client.h
src/lmtp/commands.c
src/lmtp/lmtp-local.c
src/lmtp/lmtp-local.h
src/lmtp/lmtp-proxy.c
src/lmtp/lmtp-proxy.h
src/lmtp/lmtp-recipient.c
src/lmtp/lmtp-recipient.h

index 7ad88aaec1490bd21b1bd7510b95407ae48bfb35..406dfb1dd534675ecd7536f3c3203fdbdf77d64f 100644 (file)
@@ -6,6 +6,7 @@
 
 #define CLIENT_MAIL_DATA_MAX_INMEMORY_SIZE (1024*128)
 
+struct lmtp_recipient;
 struct client;
 
 struct client_state {
index ad785cdf777d6c83cb04613be230df3fbeb83d0c..7081df94f61c5b88c5584b496543ab30c81642cd 100644 (file)
@@ -11,6 +11,7 @@
 #include "lda-settings.h"
 #include "mail-user.h"
 #include "smtp-address.h"
+#include "lmtp-recipient.h"
 #include "lmtp-proxy.h"
 #include "lmtp-local.h"
 #include "mail-deliver.h"
@@ -42,23 +43,26 @@ int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
             struct smtp_server_recipient *rcpt)
 {
        struct client *client = (struct client *)conn_ctx;
+       struct lmtp_recipient *lrcpt;
        const char *username, *detail;
        char delim = '\0';
        int ret;
 
+       lrcpt = lmtp_recipient_create(client, rcpt);
+
        smtp_address_detail_parse_temp(
                client->unexpanded_lda_set->recipient_delimiter,
                rcpt->path, &username, &delim, &detail);
        if (client->lmtp_set->lmtp_proxy) {
                /* proxied? */
-               if ((ret=lmtp_proxy_rcpt(client, cmd, rcpt,
+               if ((ret=lmtp_proxy_rcpt(client, cmd, lrcpt,
                                         username, detail, delim)) != 0)
                        return (ret < 0 ? -1 : 0);
                /* no */
        }
 
        /* local delivery */
-       return lmtp_local_rcpt(client, cmd, rcpt, username, detail);
+       return lmtp_local_rcpt(client, cmd, lrcpt, username, detail);
 }
 
 /*
index 828cf4ed08e4fe19408e1768b3c4514f46c79015..cdc32d2abb33140e20382846360c6310f67ddd7d 100644 (file)
@@ -26,7 +26,7 @@
 #include "lmtp-local.h"
 
 struct lmtp_local_recipient {
-       struct lmtp_recipient rcpt;
+       struct lmtp_recipient *rcpt;
        char *session_id;
 
        char *detail;
@@ -120,7 +120,7 @@ lmtp_local_rcpt_reply_overquota(struct lmtp_local_recipient *llrcpt,
                                struct smtp_server_cmd_ctx *cmd,
                                const char *error)
 {
-       struct smtp_server_recipient *rcpt = llrcpt->rcpt.rcpt;
+       struct smtp_server_recipient *rcpt = llrcpt->rcpt->rcpt;
        struct smtp_address *address = rcpt->path;
        unsigned int rcpt_idx = rcpt->index;
        struct lda_settings *lda_set =
@@ -152,7 +152,7 @@ lmtp_local_rcpt_fail_all(struct lmtp_local *local,
 
        llrcpts = array_get(&local->rcpt_to, &count);
        for (i = 0; i < count; i++) {
-               struct smtp_server_recipient *rcpt = llrcpts[i]->rcpt.rcpt;
+               struct smtp_server_recipient *rcpt = llrcpts[i]->rcpt->rcpt;
 
                smtp_server_reply_index(cmd, rcpt->index,
                        status, enh_code, "<%s> %s",
@@ -167,8 +167,8 @@ lmtp_local_rcpt_fail_all(struct lmtp_local *local,
 static int
 lmtp_local_rcpt_check_quota(struct lmtp_local_recipient *llrcpt)
 {
-       struct client *client = llrcpt->rcpt.client;
-       struct smtp_server_recipient *rcpt = llrcpt->rcpt.rcpt;
+       struct client *client = llrcpt->rcpt->client;
+       struct smtp_server_recipient *rcpt = llrcpt->rcpt->rcpt;
        struct smtp_server_cmd_ctx *cmd = rcpt->cmd;
        struct smtp_address *address = rcpt->path;
        struct mail_user *user;
@@ -232,13 +232,16 @@ static void
 lmtp_local_rcpt_approved(struct smtp_server_recipient *rcpt,
                         struct lmtp_local_recipient *llrcpt)
 {
-       struct client *client = llrcpt->rcpt.client;
+       struct client *client = llrcpt->rcpt->client;
+       struct lmtp_recipient *drcpt;
 
        /* resolve duplicate recipient */
-       llrcpt->duplicate = (struct lmtp_local_recipient *)
-               lmtp_recipient_find_duplicate(&llrcpt->rcpt, rcpt->trans);
-       i_assert(llrcpt->duplicate == NULL ||
-                llrcpt->duplicate->duplicate == NULL);
+       drcpt = lmtp_recipient_find_duplicate(llrcpt->rcpt, rcpt->trans);
+       if (drcpt != NULL) {
+               i_assert(drcpt->type == LMTP_RECIPIENT_TYPE_LOCAL);
+               llrcpt->duplicate = drcpt->backend_context;
+               i_assert(llrcpt->duplicate->duplicate == NULL);
+       }
 
        /* add to local recipients */
        array_append(&client->local->rcpt_to, &llrcpt, 1);
@@ -247,7 +250,7 @@ lmtp_local_rcpt_approved(struct smtp_server_recipient *rcpt,
 static bool
 lmtp_local_rcpt_anvil_finish(struct lmtp_local_recipient *llrcpt)
 {
-       struct smtp_server_recipient *rcpt = llrcpt->rcpt.rcpt;
+       struct smtp_server_recipient *rcpt = llrcpt->rcpt->rcpt;
        struct smtp_server_cmd_ctx *cmd = rcpt->cmd;
        int ret;
 
@@ -263,8 +266,8 @@ lmtp_local_rcpt_anvil_cb(const char *reply, void *context)
 {
        struct lmtp_local_recipient *llrcpt =
                (struct lmtp_local_recipient *)context;
-       struct client *client = llrcpt->rcpt.client;
-       struct smtp_server_recipient *rcpt = llrcpt->rcpt.rcpt;
+       struct client *client = llrcpt->rcpt->client;
+       struct smtp_server_recipient *rcpt = llrcpt->rcpt->rcpt;
        struct smtp_server_cmd_ctx *cmd = rcpt->cmd;
        struct smtp_address *address = rcpt->path;
        const struct mail_storage_service_input *input;
@@ -290,12 +293,12 @@ lmtp_local_rcpt_anvil_cb(const char *reply, void *context)
        }
 }
 
-int lmtp_local_rcpt(struct client *client,
-       struct smtp_server_cmd_ctx *cmd,
-       struct smtp_server_recipient *rcpt,
-       const char *username, const char *detail)
+int lmtp_local_rcpt(struct client *client, struct smtp_server_cmd_ctx *cmd,
+                   struct lmtp_recipient *lrcpt, const char *username,
+                   const char *detail)
 {
        struct smtp_server_connection *conn = cmd->conn;
+       struct smtp_server_recipient *rcpt = lrcpt->rcpt;
        const struct smtp_address *address = rcpt->path;
        struct smtp_server_transaction *trans;
        struct lmtp_local_recipient *llrcpt;
@@ -350,20 +353,20 @@ int lmtp_local_rcpt(struct client *client,
                client->local = lmtp_local_init(client);
 
        llrcpt = p_new(rcpt->pool, struct lmtp_local_recipient, 1);
-       lmtp_recipient_init(&llrcpt->rcpt, client,
-                           LMTP_RECIPIENT_TYPE_LOCAL, rcpt);
-
+       llrcpt->rcpt = lrcpt;
        llrcpt->detail = p_strdup(rcpt->pool, detail);
        llrcpt->service_user = service_user;
        llrcpt->session_id = p_strdup(rcpt->pool, session_id);
 
+       lrcpt->type = LMTP_RECIPIENT_TYPE_LOCAL;
+       lrcpt->backend_context = llrcpt;
+
        smtp_server_recipient_add_hook(
                rcpt, SMTP_SERVER_RECIPIENT_HOOK_DESTROY,
                lmtp_local_rcpt_destroy, llrcpt);
        smtp_server_recipient_add_hook(
                rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED,
                lmtp_local_rcpt_approved, llrcpt);
-       rcpt->context = llrcpt;
 
        if (client->lmtp_set->lmtp_user_concurrency_limit == 0) {
                (void)lmtp_local_rcpt_anvil_finish(llrcpt);
@@ -402,6 +405,8 @@ void lmtp_local_add_headers(struct lmtp_local *local,
 
        llrcpts = array_get(&local->rcpt_to, &count);
        if (count == 1) {
+               struct smtp_server_recipient *rcpt = llrcpts[0]->rcpt->rcpt;
+
                sets = mail_storage_service_user_get_set(llrcpts[0]->service_user);
                lmtp_set = sets[3];
 
@@ -409,10 +414,10 @@ void lmtp_local_add_headers(struct lmtp_local *local,
                case LMTP_HDR_DELIVERY_ADDRESS_NONE:
                        break;
                case LMTP_HDR_DELIVERY_ADDRESS_FINAL:
-                       rcpt_to = llrcpts[0]->rcpt.rcpt->path;
+                       rcpt_to = rcpt->path;
                        break;
                case LMTP_HDR_DELIVERY_ADDRESS_ORIGINAL:
-                       rcpt_to = llrcpts[0]->rcpt.rcpt->params.orcpt.addr;
+                       rcpt_to = rcpt->params.orcpt.addr;
                        break;
                }
        }
@@ -431,7 +436,7 @@ lmtp_local_deliver(struct lmtp_local *local,
                   struct mail_deliver_session *session)
 {
        struct client *client = local->client;
-       struct smtp_server_recipient *rcpt = llrcpt->rcpt.rcpt;
+       struct smtp_server_recipient *rcpt = llrcpt->rcpt->rcpt;
        struct smtp_address *rcpt_to = rcpt->path;
        unsigned int rcpt_idx = rcpt->index;
        struct mail_storage_service_user *service_user = llrcpt->service_user;
@@ -620,11 +625,11 @@ lmtp_local_deliver_to_rcpts(struct lmtp_local *local,
        llrcpts = array_get(&local->rcpt_to, &count);
        for (i = 0; i < count; i++) {
                struct lmtp_local_recipient *llrcpt = llrcpts[i];
-               struct smtp_server_recipient *rcpt = llrcpt->rcpt.rcpt;
+               struct smtp_server_recipient *rcpt = llrcpt->rcpt->rcpt;
 
                if (llrcpt->duplicate != NULL) {
                        struct smtp_server_recipient *drcpt =
-                               llrcpt->duplicate->rcpt.rcpt;
+                               llrcpt->duplicate->rcpt->rcpt;
                        /* don't deliver more than once to the same recipient */
                        smtp_server_reply_submit_duplicate(cmd, rcpt->index,
                                                           drcpt->index);
index 11331f9511fd54825f2558d3a7c1e090f4197f28..e75c09378cfad1caf9e3ae30cd7599f0137b80a6 100644 (file)
@@ -13,8 +13,8 @@ void lmtp_local_deinit(struct lmtp_local **_local);
 
 int lmtp_local_rcpt(struct client *client,
                    struct smtp_server_cmd_ctx *cmd,
-                   struct smtp_server_recipient *rcpt,
-                   const char *username, const char *detail);
+                   struct lmtp_recipient *lrcpt, const char *username,
+                   const char *detail);
 
 void lmtp_local_add_headers(struct lmtp_local *local,
                            struct smtp_server_transaction *trans,
index 4479606862354e5b17ddff6f56f067bbbf1536d2..b124ba663358b8abcf47385d6a49cfe13b07e6ee 100644 (file)
@@ -45,7 +45,7 @@ struct lmtp_proxy_rcpt_settings {
 };
 
 struct lmtp_proxy_recipient {
-       struct lmtp_recipient rcpt;
+       struct lmtp_recipient *rcpt;
        struct lmtp_proxy_connection *conn;
 
        struct smtp_address *address;
@@ -424,7 +424,7 @@ static void
 lmtp_proxy_rcpt_approved(struct smtp_server_recipient *rcpt ATTR_UNUSED,
                         struct lmtp_proxy_recipient *lprcpt)
 {
-       struct client *client = lprcpt->rcpt.client;
+       struct client *client = lprcpt->rcpt->client;
 
        /* add to proxy recipients */
        array_append(&client->proxy->rcpt_to, &lprcpt, 1);
@@ -434,7 +434,7 @@ static void
 lmtp_proxy_rcpt_cb(const struct smtp_reply *proxy_reply,
                   struct lmtp_proxy_recipient *lprcpt)
 {
-       struct smtp_server_recipient *rcpt = lprcpt->rcpt.rcpt;
+       struct smtp_server_recipient *rcpt = lprcpt->rcpt->rcpt;
        struct smtp_server_cmd_ctx *cmd = rcpt->cmd;
        struct smtp_reply reply;
 
@@ -455,13 +455,14 @@ lmtp_proxy_rcpt_cb(const struct smtp_reply *proxy_reply,
 
 int lmtp_proxy_rcpt(struct client *client,
                    struct smtp_server_cmd_ctx *cmd,
-                   struct smtp_server_recipient *rcpt,
+                   struct lmtp_recipient *lrcpt,
                    const char *username, const char *detail,
                    char delim)
 {
        struct auth_master_connection *auth_conn;
        struct lmtp_proxy_rcpt_settings set;
        struct lmtp_proxy_connection *conn;
+       struct smtp_server_recipient *rcpt = lrcpt->rcpt;
        struct lmtp_proxy_recipient *lprcpt;
        struct smtp_server_transaction *trans;
        struct smtp_address *address = rcpt->path;
@@ -561,15 +562,16 @@ int lmtp_proxy_rcpt(struct client *client,
        pool_unref(&auth_pool);
 
        lprcpt = p_new(rcpt->pool, struct lmtp_proxy_recipient, 1);
-       lmtp_recipient_init(&lprcpt->rcpt, client,
-                           LMTP_RECIPIENT_TYPE_PROXY, rcpt);
+       lprcpt->rcpt = lrcpt;
        lprcpt->address = smtp_address_clone(rcpt->pool, address);
        lprcpt->conn = conn;
 
+       lrcpt->type = LMTP_RECIPIENT_TYPE_PROXY;
+       lrcpt->backend_context = lprcpt;
+
        smtp_server_recipient_add_hook(
                rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED,
                lmtp_proxy_rcpt_approved, lprcpt);
-       rcpt->context = lprcpt;
 
        relay_rcpt = smtp_client_transaction_add_pool_rcpt(
                conn->lmtp_trans, rcpt->pool, address, &rcpt->params,
@@ -588,7 +590,7 @@ lmtp_proxy_data_cb(const struct smtp_reply *proxy_reply,
                   struct lmtp_proxy_recipient *lprcpt)
 {
        struct lmtp_proxy_connection *conn = lprcpt->conn;
-       struct smtp_server_recipient *rcpt = lprcpt->rcpt.rcpt;
+       struct smtp_server_recipient *rcpt = lprcpt->rcpt->rcpt;
        struct lmtp_proxy *proxy = conn->proxy;
        struct smtp_server_cmd_ctx *cmd = proxy->pending_data_cmd;
        struct smtp_server_transaction *trans = proxy->trans;
index bd475eac937ee1bcb963b79ca725007928313e1d..18d27b716dc89d50e874f8232605ff72ab1b99de 100644 (file)
@@ -18,8 +18,8 @@ void lmtp_proxy_deinit(struct lmtp_proxy **proxy);
 
 int lmtp_proxy_rcpt(struct client *client,
                    struct smtp_server_cmd_ctx *cmd,
-                   struct smtp_server_recipient *rcpt,
-                   const char *username, const char *detail, char delim);
+                   struct lmtp_recipient *rcpt, const char *username,
+                   const char *detail, char delim);
 
 void lmtp_proxy_data(struct client *client,
                     struct smtp_server_cmd_ctx *cmd,
index 9e321f43e1f19b83793dad6486e4865ceb6434f3..2be468427b9837584a60f65cb0fdd7b70a6bf4b2 100644 (file)
@@ -4,14 +4,19 @@
 #include "smtp-server.h"
 #include "lmtp-recipient.h"
 
-void lmtp_recipient_init(struct lmtp_recipient *lrcpt,
-                        struct client *client,
-                        enum lmtp_recipient_type type,
-                        struct smtp_server_recipient *rcpt)
+struct lmtp_recipient *
+lmtp_recipient_create(struct client *client,
+                     struct smtp_server_recipient *rcpt)
 {
+       struct lmtp_recipient *lrcpt;
+
+       lrcpt = p_new(rcpt->pool, struct lmtp_recipient, 1);
+       lrcpt->rcpt = rcpt;     
        lrcpt->client = client;
-       lrcpt->type = type;
-       lrcpt->rcpt = rcpt;
+
+       rcpt->context = lrcpt;
+
+       return lrcpt;
 }
 
 struct lmtp_recipient *
index 8626e6f556b5558c539e1c5ed6ada3b8863118df..89720d443fb539b8978e9aa7f3a8718457a2554c 100644 (file)
@@ -15,13 +15,14 @@ enum lmtp_recipient_type {
 struct lmtp_recipient {
        struct client *client;
        struct smtp_server_recipient *rcpt;
+
        enum lmtp_recipient_type type;
+       void *backend_context;
 };
 
-void lmtp_recipient_init(struct lmtp_recipient *lrcpt,
-                        struct client *client,
-                        enum lmtp_recipient_type type,
-                        struct smtp_server_recipient *rcpt);
+struct lmtp_recipient *
+lmtp_recipient_create(struct client *client,
+                     struct smtp_server_recipient *rcpt);
 
 struct lmtp_recipient *
 lmtp_recipient_find_duplicate(struct lmtp_recipient *lrcpt,