]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lmtp: lmtp-proxy - Split off lmtp_proxy_rcpt_user_lookup_cb() from lmtp_proxy_rcpt()
authorStephan Bosch <stephan.bosch@open-xchange.com>
Mon, 18 May 2020 20:39:37 +0000 (22:39 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 6 Apr 2026 17:25:10 +0000 (17:25 +0000)
This is not an actual callback yet.

src/lmtp/lmtp-proxy.c

index 6b9a6948e91e418209ffbe546230bdf84cb93746..7c6b02ac23f9e2cf753d47df288166a0bd9fe066 100644 (file)
@@ -887,53 +887,33 @@ lmtp_proxy_rcpt_handle_not_proxied(struct lmtp_proxy_recipient *lprcpt,
        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;
                }
        }
 
@@ -948,16 +928,15 @@ int lmtp_proxy_rcpt(struct lmtp_recipient *lrcpt)
                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);
@@ -976,8 +955,7 @@ int lmtp_proxy_rcpt(struct lmtp_recipient *lrcpt)
                        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') {
@@ -991,14 +969,11 @@ int lmtp_proxy_rcpt(struct lmtp_recipient *lrcpt)
                        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);
 
@@ -1009,10 +984,42 @@ int lmtp_proxy_rcpt(struct lmtp_recipient *lrcpt)
                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;
 }