]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
login-common: Emit proxy_session_finished and new _started event when client is redir...
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 5 May 2026 21:15:22 +0000 (21:15 +0000)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 7 May 2026 08:38:28 +0000 (11:38 +0300)
When LOGIN_PROXY_FAILURE_TYPE_AUTH_REDIRECT was handled, the disconnect
event chain never produced an error_code=proxy_dest_redirected entry.
Fire a new proxy_session_finished event with this error_code and start
a new proxy_session_started for the new destination.

src/login-common/client-common.c
src/login-common/login-proxy.c

index 54d8795b55209a251972d33168b8728a660d4a03..1cc1b2dcbb6e6716b13bd93a654ef46864d5acb7 100644 (file)
@@ -1543,9 +1543,10 @@ bool client_get_extra_disconnect_reason(struct client *client,
                        last_reason = "temporary authentication failure";
                        break;
                case LOGIN_PROXY_FAILURE_TYPE_AUTH_REDIRECT:
-                       event_reason = "redirected";
-                       last_reason = "redirected";
-                       break;
+                       /* Redirects fire proxy_session_finished directly with
+                          error_code=proxy_dest_redirected, so this is
+                          unreachable. */
+                       i_unreached();
                case LOGIN_PROXY_FAILURE_TYPE_AUTH_LIMIT_REACHED_REPLIED:
                        event_reason = "connection_limit";
                        last_reason = "connection limit reached";
index 1661dc2e03676ba177701c0bfa740704c3b0ba72..2e7c77d77add50dcee70632db79252631ccbcf90 100644 (file)
@@ -851,6 +851,14 @@ bool login_proxy_failed(struct login_proxy *proxy, struct event *event,
 {
        const char *log_prefix;
        bool try_reconnect = TRUE;
+
+       if (type == LOGIN_PROXY_FAILURE_TYPE_AUTH_REDIRECT) {
+               proxy->redirect_callback(proxy->client, event, reason);
+               /* return value doesn't matter here, because we can't be
+                  coming from login_proxy_connect(). */
+               return FALSE;
+       }
+
        event_add_str(event, "error", reason);
 
        switch (type) {
@@ -883,11 +891,6 @@ bool login_proxy_failed(struct login_proxy *proxy, struct event *event,
        case LOGIN_PROXY_FAILURE_TYPE_AUTH_TEMPFAIL:
                log_prefix = "";
                break;
-       case LOGIN_PROXY_FAILURE_TYPE_AUTH_REDIRECT:
-               proxy->redirect_callback(proxy->client, event, reason);
-               /* return value doesn't matter here, because we can't be
-                  coming from login_proxy_connect(). */
-               return FALSE;
        default:
                i_unreached();
        }
@@ -1018,8 +1021,18 @@ void login_proxy_redirect_finish(struct login_proxy *proxy,
        /* disconnect from current backend */
        login_proxy_disconnect(proxy);
 
-       e_debug(proxy->event, "Redirecting to %s", net_ipport2str(ip, port));
+       struct event_passthrough *ef = event_create_passthrough(proxy->event)->
+               add_str("disconnect_reason", "Redirecting")->
+               add_str("disconnect_side", LOGIN_PROXY_SIDE_SELF)->
+               add_str("error_code", "proxy_dest_redirected")->
+               set_name("proxy_session_finished");
+       e_debug(ef->event(), "Redirecting to %s", net_ipport2str(ip, port));
+
        login_proxy_set_destination(proxy, net_ip2addr(ip), ip, port);
+       struct event_passthrough *es = event_create_passthrough(proxy->event)->
+               set_name("proxy_session_started");
+       e_debug(es->event(), "Started redirected proxy session");
+
        (void)login_proxy_connect(proxy);
 }