]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
login-proxy: login_proxy_new() - Call login_proxy_failed() also when returning -1
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Sun, 3 May 2020 15:41:58 +0000 (18:41 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 25 May 2020 08:38:55 +0000 (08:38 +0000)
This also changes login_proxy_new() to internally send the failure message
to client, so caller doesn't have to do it.

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

index 0d2852d0f3a6d48860ce18753c5c395f76b09a17..3d9e8210ed503ccb4ce6d8ddee153dfe642c3320 100644 (file)
@@ -506,7 +506,6 @@ static int proxy_start(struct client *client,
        if (login_proxy_new(client, event, &proxy_set, proxy_input,
                            proxy_failed) < 0) {
                event_unref(&event);
-               client_proxy_error(client, PROXY_FAILURE_MSG);
                return -1;
        }
        event_unref(&event);
index 65cd51427bc6d3135586a5216a018561a15c6d1c..47106f33adc7d2c00f140cc80432615087a13945 100644 (file)
@@ -260,8 +260,9 @@ static bool proxy_connect_failed(struct login_proxy *proxy)
        if (reconnect)
                e_debug(proxy->event, "%s", str_c(str));
        else {
-               e_error(proxy->event, "%s", str_c(str));
-               login_proxy_free(&proxy);
+               login_proxy_failed(proxy, proxy->event,
+                                  LOGIN_PROXY_FAILURE_TYPE_CONNECT,
+                                  str_c(str));
        }
        return reconnect;
 }
@@ -307,6 +308,13 @@ static int login_proxy_connect(struct login_proxy *proxy)
        proxy->num_waiting_connections_updated = FALSE;
        rec->num_waiting_connections++;
 
+       if (proxy->client->proxy_ttl <= 1) {
+               login_proxy_failed(proxy, proxy->event,
+                       LOGIN_PROXY_FAILURE_TYPE_REMOTE_CONFIG,
+                       "TTL reached zero - proxies appear to be looping?");
+               return -1;
+       }
+
        if (rec->last_success.tv_sec == 0) {
                /* first connect to this IP. don't start immediately failing
                   the check below. */
@@ -316,8 +324,9 @@ static int login_proxy_connect(struct login_proxy *proxy)
            rec->last_failure.tv_sec - rec->last_success.tv_sec > PROXY_IMMEDIATE_FAILURE_SECS &&
            rec->num_waiting_connections > 1) {
                /* the server is down. fail immediately */
-               e_error(proxy->event, "Host is down");
-               login_proxy_free(&proxy);
+               login_proxy_failed(proxy, proxy->event,
+                                  LOGIN_PROXY_FAILURE_TYPE_CONNECT,
+                                  "Host is down");
                return -1;
        }
 
@@ -327,8 +336,9 @@ static int login_proxy_connect(struct login_proxy *proxy)
        if (proxy->server_fd == -1) {
                string_t *str = t_str_new(128);
                proxy_connect_error_append(proxy, FALSE, str);
-               e_error(proxy->event, "%s", str_c(str));
-               login_proxy_free(&proxy);
+               login_proxy_failed(proxy, proxy->event,
+                                  LOGIN_PROXY_FAILURE_TYPE_CONNECT,
+                                  str_c(str));
                return -1;
        }
        proxy->server_io = io_add(proxy->server_fd, IO_WRITE,
@@ -350,11 +360,6 @@ int login_proxy_new(struct client *client, struct event *event,
        i_assert(set->host != NULL && set->host[0] != '\0');
        i_assert(client->login_proxy == NULL);
 
-       if (client->proxy_ttl <= 1) {
-               e_error(event, "TTL reached zero - proxies appear to be looping?");
-               return -1;
-       }
-
        proxy = i_new(struct login_proxy, 1);
        proxy->client = client;
        proxy->event = event;
@@ -374,13 +379,11 @@ int login_proxy_new(struct client *client, struct event *event,
 
        DLLIST_PREPEND(&login_proxies_pending, proxy);
 
-       if (login_proxy_connect(proxy) < 0)
-               return -1;
-
        proxy->input_callback = input_callback;
        proxy->failure_callback = failure_callback;
        client->login_proxy = proxy;
-       return 0;
+
+       return login_proxy_connect(proxy);
 }
 
 static void login_proxy_disconnect(struct login_proxy *proxy)