return -1;
}
-int lmtp_proxy_rcpt(struct lmtp_recipient *lrcpt)
+static void
+lmtp_proxy_rcpt_user_lookup_cb(struct lmtp_proxy_recipient *lprcpt, int result,
+ const char *const *fields)
{
+ struct lmtp_recipient *lrcpt = lprcpt->rcpt;
struct client *client = lrcpt->client;
- 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_address *address = rcpt->path;
- struct auth_user_info info;
- struct mail_storage_service_input input;
- const char *const *fields, *errstr, *username;
+ const char *username = lrcpt->username, *errstr;
struct smtp_address *user;
- pool_t auth_pool;
- int result, ret;
-
- lprcpt = p_new(rcpt->pool, struct lmtp_proxy_recipient, 1);
- lprcpt->rcpt = lrcpt;
-
- lrcpt->type = LMTP_RECIPIENT_TYPE_PROXY;
- lrcpt->backend_context = lprcpt;
-
- i_zero(&input);
- input.service = "lmtp";
- mail_storage_service_init_settings(storage_service, &input);
-
- lmtp_proxy_rcpt_init_auth_user_info(lrcpt, &info);
+ int ret;
- // FIXME: make this async
- username = lrcpt->username;
- auth_pool = pool_alloconly_create("auth lookup", 1024);
- auth_conn = mail_storage_service_get_auth_conn(storage_service);
- result = auth_master_pass_lookup(auth_conn, username, &info,
- auth_pool, &fields);
if (result <= 0) {
errstr = (result < 0 && fields[0] != NULL ?
t_strdup(fields[0]) :
"Temporary user lookup failure");
- pool_unref(&auth_pool);
if (result < 0) {
smtp_server_recipient_reply(rcpt, 451, "4.3.0", "%s",
errstr);
- return -1;
+ return;
} else {
/* User not found from passdb. revert to local delivery
*/
- return lmtp_rcpt_continue(lrcpt);
+ (void)lmtp_rcpt_continue(lrcpt);
+ return;
}
}
smtp_server_recipient_reply(
rcpt, 550, "5.3.5",
"Internal user lookup failure");
- pool_unref(&auth_pool);
- return -1;
+ return;
}
if (ret == 0) {
/* Not proxying this user */
ret = lmtp_proxy_rcpt_handle_not_proxied(lprcpt, &set, username);
- pool_unref(&auth_pool);
if (ret < 0)
- return ret;
- return lmtp_rcpt_continue(lrcpt);
+ return;
+ (void)lmtp_rcpt_continue(lrcpt);
+ return;
}
e_debug(rcpt->event, "Recipient maps to proxy user %s", username);
smtp_server_recipient_reply(
rcpt, 550, "5.3.5",
"Internal user lookup failure");
- pool_unref(&auth_pool);
- return -1;
+ return;
}
/* Username changed. change the address as well */
if (*lrcpt->detail == '\0') {
username);
smtp_server_recipient_reply(rcpt, 554, "5.4.6",
"Proxying loops to itself");
- pool_unref(&auth_pool);
- return -1;
+ return;
}
- if (lmtp_proxy_rcpt_get_connection(lprcpt, &set, &conn) < 0) {
- pool_unref(&auth_pool);
- return -1;
- }
+ if (lmtp_proxy_rcpt_get_connection(lprcpt, &set, &conn) < 0)
+ return;
lprcpt->address = smtp_address_clone(rcpt->pool, address);
rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED,
lmtp_proxy_rcpt_approved, lprcpt);
- pool_unref(&auth_pool);
-
smtp_client_connection_connect(conn->lmtp_conn,
lmtp_proxy_rcpt_login_cb, lprcpt);
+}
+
+int lmtp_proxy_rcpt(struct lmtp_recipient *lrcpt)
+{
+ struct smtp_server_recipient *rcpt = lrcpt->rcpt;
+ struct lmtp_proxy_recipient *lprcpt;
+ struct auth_master_connection *auth_conn;
+ struct auth_user_info info;
+ struct mail_storage_service_input input;
+ const char *const *fields, *username;
+ pool_t auth_pool;
+ int result;
+
+ lprcpt = p_new(rcpt->pool, struct lmtp_proxy_recipient, 1);
+ lprcpt->rcpt = lrcpt;
+
+ lrcpt->type = LMTP_RECIPIENT_TYPE_PROXY;
+ lrcpt->backend_context = lprcpt;
+
+ i_zero(&input);
+ input.service = "lmtp";
+ mail_storage_service_init_settings(storage_service, &input);
+
+ lmtp_proxy_rcpt_init_auth_user_info(lrcpt, &info);
+
+ // FIXME: make this async
+ username = lrcpt->username;
+ auth_pool = pool_alloconly_create("auth lookup", 1024);
+ auth_conn = mail_storage_service_get_auth_conn(storage_service);
+ result = auth_master_pass_lookup(auth_conn, username, &info,
+ auth_pool, &fields);
+ lmtp_proxy_rcpt_user_lookup_cb(lprcpt, result, fields);
+ pool_unref(&auth_pool);
+
return 0;
}