#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"
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);
}
/*
#include "lmtp-local.h"
struct lmtp_local_recipient {
- struct lmtp_recipient rcpt;
+ struct lmtp_recipient *rcpt;
char *session_id;
char *detail;
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 =
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",
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;
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);
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;
{
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;
}
}
-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;
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);
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];
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;
}
}
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;
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);
};
struct lmtp_proxy_recipient {
- struct lmtp_recipient rcpt;
+ struct lmtp_recipient *rcpt;
struct lmtp_proxy_connection *conn;
struct smtp_address *address;
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);
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;
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;
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,
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;