Skip to content

Commit

Permalink
lmtp: Start using the new lib-smtp/server recipient pool.
Browse files Browse the repository at this point in the history
  • Loading branch information
stephanbosch committed Oct 11, 2018
1 parent ccff7a5 commit 078a025
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 68 deletions.
2 changes: 1 addition & 1 deletion src/lmtp/lmtp-common.h
Expand Up @@ -14,11 +14,11 @@ enum lmtp_recipient_type {

struct lmtp_recipient {
struct client *client;
struct smtp_server_recipient *rcpt;
enum lmtp_recipient_type type;

struct smtp_address *path;
struct smtp_server_cmd_ctx *rcpt_cmd;
struct smtp_server_recipient *rcpt;
unsigned int index;
};

Expand Down
48 changes: 10 additions & 38 deletions src/lmtp/lmtp-local.c
Expand Up @@ -55,9 +55,6 @@ struct lmtp_local {
struct mail_user *rcpt_user;
};

static void
lmtp_local_rcpt_deinit(struct lmtp_local_recipient *llrcpt);

/*
* LMTP local
*/
Expand All @@ -77,15 +74,11 @@ lmtp_local_init(struct client *client)
void lmtp_local_deinit(struct lmtp_local **_local)
{
struct lmtp_local *local = *_local;
struct lmtp_local_recipient *const *llrcptp;

*_local = NULL;

if (array_is_created(&local->rcpt_to)) {
array_foreach_modifiable(&local->rcpt_to, llrcptp)
lmtp_local_rcpt_deinit(*llrcptp);
if (array_is_created(&local->rcpt_to))
array_free(&local->rcpt_to);
}

if (local->raw_mail != NULL) {
struct mailbox_transaction_context *raw_trans =
Expand Down Expand Up @@ -120,16 +113,13 @@ lmtp_local_rcpt_anvil_disconnect(struct lmtp_local_recipient *llrcpt)
}

static void
lmtp_local_rcpt_deinit(struct lmtp_local_recipient *llrcpt)
lmtp_local_rcpt_destroy(struct smtp_server_recipient *rcpt ATTR_UNUSED,
struct lmtp_local_recipient *llrcpt)
{
if (llrcpt->anvil_query != NULL)
anvil_client_query_abort(anvil, &llrcpt->anvil_query);
lmtp_local_rcpt_anvil_disconnect(llrcpt);
mail_storage_service_user_unref(&llrcpt->service_user);

i_free(llrcpt->session_id);
i_free(llrcpt->detail);
i_free(llrcpt);
}

static void
Expand All @@ -142,8 +132,6 @@ lmtp_local_rcpt_reply_overquota(struct lmtp_local_recipient *llrcpt,
struct lda_settings *lda_set =
mail_storage_service_user_get_set(llrcpt->service_user)[2];

i_assert(rcpt_idx == 0 || llrcpt->rcpt.rcpt_cmd == NULL);

if (lda_set->quota_full_tempfail) {
smtp_server_reply_index(cmd, rcpt_idx, 452, "4.2.2", "<%s> %s",
smtp_address_encode(address), error);
Expand Down Expand Up @@ -180,15 +168,6 @@ lmtp_local_rcpt_fail_all(struct lmtp_local *local,
* RCPT command
*/

static void
lmtp_local_rcpt_cmd_destroy(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
struct lmtp_local_recipient *llrcpt)
{
/* failed in RCPT command; clean up early */
lmtp_local_rcpt_deinit(llrcpt);
return;
}

static int
lmtp_local_rcpt_check_quota(struct lmtp_local_recipient *llrcpt)
{
Expand Down Expand Up @@ -258,11 +237,6 @@ lmtp_local_rcpt_approved(struct smtp_server_recipient *rcpt,
{
struct client *client = llrcpt->rcpt.client;

smtp_server_command_remove_hook(
llrcpt->rcpt.rcpt_cmd->cmd,
SMTP_SERVER_COMMAND_HOOK_DESTROY,
lmtp_local_rcpt_cmd_destroy);

lmtp_recipient_finish(&llrcpt->rcpt);

/* resolve duplicate recipient */
Expand All @@ -281,10 +255,8 @@ lmtp_local_rcpt_anvil_finish(struct lmtp_local_recipient *llrcpt)
struct smtp_server_cmd_ctx *cmd = llrcpt->rcpt.rcpt_cmd;
int ret;

if ((ret = lmtp_local_rcpt_check_quota(llrcpt)) < 0) {
lmtp_local_rcpt_deinit(llrcpt);
if ((ret = lmtp_local_rcpt_check_quota(llrcpt)) < 0)
return FALSE;
}

smtp_server_reply(cmd, 250, "2.1.5", "OK");
return TRUE;
Expand Down Expand Up @@ -380,17 +352,17 @@ int lmtp_local_rcpt(struct client *client,
if (client->local == NULL)
client->local = lmtp_local_init(client);

llrcpt = i_new(struct lmtp_local_recipient, 1);
llrcpt = p_new(rcpt->pool, struct lmtp_local_recipient, 1);
lmtp_recipient_init(&llrcpt->rcpt, client,
LMTP_RECIPIENT_TYPE_LOCAL, cmd, rcpt);

llrcpt->detail = i_strdup(detail);
llrcpt->detail = p_strdup(rcpt->pool, detail);
llrcpt->service_user = service_user;
llrcpt->session_id = i_strdup(session_id);

smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY,
lmtp_local_rcpt_cmd_destroy, llrcpt);
llrcpt->session_id = p_strdup(rcpt->pool, session_id);

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);
Expand Down
31 changes: 2 additions & 29 deletions src/lmtp/lmtp-proxy.c
Expand Up @@ -135,12 +135,6 @@ lmtp_proxy_init(struct client *client,
return proxy;
}

static void
lmtp_proxy_recipient_deinit(struct lmtp_proxy_recipient *lprcpt)
{
i_free(lprcpt);
}

static void
lmtp_proxy_connection_deinit(struct lmtp_proxy_connection *conn)
{
Expand All @@ -155,14 +149,10 @@ lmtp_proxy_connection_deinit(struct lmtp_proxy_connection *conn)
void lmtp_proxy_deinit(struct lmtp_proxy **_proxy)
{
struct lmtp_proxy *proxy = *_proxy;
struct lmtp_proxy_recipient *const *lprcpts;
struct lmtp_proxy_connection *const *conns;

*_proxy = NULL;

array_foreach(&proxy->rcpt_to, lprcpts)
lmtp_proxy_recipient_deinit(*lprcpts);

array_foreach(&proxy->connections, conns)
lmtp_proxy_connection_deinit(*conns);

Expand Down Expand Up @@ -436,29 +426,15 @@ lmtp_proxy_is_ourself(const struct client *client,
return TRUE;
}

static void
lmtp_proxy_rcpt_cmd_destroy(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
struct lmtp_proxy_recipient *lprcpt)
{
lmtp_proxy_recipient_deinit(lprcpt);
}

static void
lmtp_proxy_rcpt_approved(struct smtp_server_recipient *rcpt ATTR_UNUSED,
struct lmtp_proxy_recipient *lprcpt)
{
struct client *client = lprcpt->rcpt.client;

if (lprcpt->rcpt.rcpt_cmd != NULL) {
smtp_server_command_remove_hook(
lprcpt->rcpt.rcpt_cmd->cmd,
SMTP_SERVER_COMMAND_HOOK_DESTROY,
lmtp_proxy_rcpt_cmd_destroy);
}

lmtp_recipient_finish(&lprcpt->rcpt);

/* add to local recipients */
/* add to proxy recipients */
array_append(&client->proxy->rcpt_to, &lprcpt, 1);
}

Expand Down Expand Up @@ -590,15 +566,12 @@ int lmtp_proxy_rcpt(struct client *client,
conn = lmtp_proxy_get_connection(client->proxy, &set);
pool_unref(&auth_pool);

lprcpt = i_new(struct lmtp_proxy_recipient, 1);
lprcpt = p_new(rcpt->pool, struct lmtp_proxy_recipient, 1);
lmtp_recipient_init(&lprcpt->rcpt, client,
LMTP_RECIPIENT_TYPE_PROXY, cmd, rcpt);
lprcpt->rcpt.path = smtp_address_clone(rcpt->pool, address);
lprcpt->conn = conn;

smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY,
lmtp_proxy_rcpt_cmd_destroy, lprcpt);

smtp_server_recipient_add_hook(
rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED,
lmtp_proxy_rcpt_approved, lprcpt);
Expand Down

0 comments on commit 078a025

Please sign in to comment.