From: Stephan Bosch Date: Sat, 3 Nov 2018 13:26:24 +0000 (+0100) Subject: lmtp: RCPT command: Allocate lmtp_recipient object immediately. X-Git-Tag: 2.3.9~993 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f8629e39802a44b32e761b5a56573aa73ccb2f09;p=thirdparty%2Fdovecot%2Fcore.git lmtp: RCPT command: Allocate lmtp_recipient object immediately. --- diff --git a/src/lmtp/client.h b/src/lmtp/client.h index 7ad88aaec1..406dfb1dd5 100644 --- a/src/lmtp/client.h +++ b/src/lmtp/client.h @@ -6,6 +6,7 @@ #define CLIENT_MAIL_DATA_MAX_INMEMORY_SIZE (1024*128) +struct lmtp_recipient; struct client; struct client_state { diff --git a/src/lmtp/commands.c b/src/lmtp/commands.c index ad785cdf77..7081df94f6 100644 --- a/src/lmtp/commands.c +++ b/src/lmtp/commands.c @@ -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); } /* diff --git a/src/lmtp/lmtp-local.c b/src/lmtp/lmtp-local.c index 828cf4ed08..cdc32d2abb 100644 --- a/src/lmtp/lmtp-local.c +++ b/src/lmtp/lmtp-local.c @@ -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); diff --git a/src/lmtp/lmtp-local.h b/src/lmtp/lmtp-local.h index 11331f9511..e75c09378c 100644 --- a/src/lmtp/lmtp-local.h +++ b/src/lmtp/lmtp-local.h @@ -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, diff --git a/src/lmtp/lmtp-proxy.c b/src/lmtp/lmtp-proxy.c index 4479606862..b124ba6633 100644 --- a/src/lmtp/lmtp-proxy.c +++ b/src/lmtp/lmtp-proxy.c @@ -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; diff --git a/src/lmtp/lmtp-proxy.h b/src/lmtp/lmtp-proxy.h index bd475eac93..18d27b716d 100644 --- a/src/lmtp/lmtp-proxy.h +++ b/src/lmtp/lmtp-proxy.h @@ -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, diff --git a/src/lmtp/lmtp-recipient.c b/src/lmtp/lmtp-recipient.c index 9e321f43e1..2be468427b 100644 --- a/src/lmtp/lmtp-recipient.c +++ b/src/lmtp/lmtp-recipient.c @@ -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 * diff --git a/src/lmtp/lmtp-recipient.h b/src/lmtp/lmtp-recipient.h index 8626e6f556..89720d443f 100644 --- a/src/lmtp/lmtp-recipient.h +++ b/src/lmtp/lmtp-recipient.h @@ -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,