]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lmtp: Allow reauth to return referral
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 5 May 2022 17:37:18 +0000 (20:37 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 17 May 2022 10:34:24 +0000 (10:34 +0000)
Previously reauth was required to do proxying on success. Now it can also
return "nologin" and "host" to do a referral instead.

src/lmtp/lmtp-proxy.c

index 66b20a1d8fea0f6080686331e0311bad6bbbba9d..28641ca6567934d38bfbcf7269bf347e573c1809 100644 (file)
@@ -690,14 +690,28 @@ lmtp_proxy_rcpt_redirect_relookup(struct lmtp_proxy_recipient *lprcpt,
                return;
        }
 
-       if (lmtp_proxy_rcpt_parse_fields(lprcpt, set, fields, &username) <= 0) {
+       ret = lmtp_proxy_rcpt_parse_fields(lprcpt, set, fields, &username);
+       if (ret == 0 && (!lprcpt->nologin || set->set.host == NULL)) {
+               e_error(lprcpt->rcpt->rcpt->event,
+                       "Redirect authentication is missing proxy or nologin field");
+               ret = -1;
+       }
+       if (ret < 0) {
                smtp_server_recipient_reply(
                        rcpt, 451, "4.3.0",
                        "Redirect lookup yielded invalid result");
-               return;
+       } else if (ret == 0) {
+               /* referral */
+               const struct smtp_proxy_redirect predir = {
+                       .username = username,
+                       .host = set->set.host,
+                       .host_ip = set->set.host_ip,
+                       .port = set->set.port,
+               };
+               smtp_server_recipient_reply_redirect(rcpt, 0, &predir);
+       } else {
+               lmtp_proxy_rcpt_redirect_finish(lprcpt, set);
        }
-
-       lmtp_proxy_rcpt_redirect_finish(lprcpt, set);
 }
 
 static void