# HG changeset patch # User Timo Sirainen # Date 1250101937 14400 # Node ID e3ccd235a7e5651e16d50ebb1af22cea3a9a6654 # Parent b7dbcf86086b29ac6cf910c12f0de034dc1814af login proxy: Added client_proxy passdb extra field to specify proxy's connect timeout. diff -r b7dbcf86086b -r e3ccd235a7e5 src/imap-login/client-authenticate.c --- a/src/imap-login/client-authenticate.c Tue Aug 11 17:38:06 2009 -0400 +++ b/src/imap-login/client-authenticate.c Wed Aug 12 14:32:17 2009 -0400 @@ -128,6 +128,7 @@ enum login_proxy_ssl_flags ssl_flags = 0; string_t *reply; unsigned int port = 143; + unsigned int proxy_timeout_msecs = 0; bool proxy = FALSE, temp = FALSE, nologin = !success; bool authz_failure = FALSE; @@ -161,6 +162,8 @@ destuser = value; else if (strcmp(key, "pass") == 0) pass = value; + else if (strcmp(key, "proxy_timeout") == 0) + proxy_timeout_msecs = 1000*atoi(value); else if (strcmp(key, "master") == 0) master_user = value; else if (strcmp(key, "ssl") == 0) { @@ -191,7 +194,7 @@ if (!success) return FALSE; if (imap_proxy_new(client, host, port, destuser, master_user, - pass, ssl_flags) < 0) + pass, ssl_flags, proxy_timeout_msecs) < 0) client_auth_failed(client, TRUE); return TRUE; } diff -r b7dbcf86086b -r e3ccd235a7e5 src/imap-login/imap-proxy.c --- a/src/imap-login/imap-proxy.c Tue Aug 11 17:38:06 2009 -0400 +++ b/src/imap-login/imap-proxy.c Wed Aug 12 14:32:17 2009 -0400 @@ -400,7 +400,8 @@ int imap_proxy_new(struct imap_client *client, const char *host, unsigned int port, const char *user, const char *master_user, - const char *password, enum login_proxy_ssl_flags ssl_flags) + const char *password, enum login_proxy_ssl_flags ssl_flags, + unsigned int connect_timeout_msecs) { i_assert(user != NULL); i_assert(!client->destroyed); @@ -426,6 +427,7 @@ } client->proxy = login_proxy_new(&client->common, host, port, ssl_flags, + connect_timeout_msecs, proxy_input, client); if (client->proxy == NULL) { client_send_tagline(client, PROXY_FAILURE_MSG); diff -r b7dbcf86086b -r e3ccd235a7e5 src/imap-login/imap-proxy.h --- a/src/imap-login/imap-proxy.h Tue Aug 11 17:38:06 2009 -0400 +++ b/src/imap-login/imap-proxy.h Wed Aug 12 14:32:17 2009 -0400 @@ -5,6 +5,7 @@ int imap_proxy_new(struct imap_client *client, const char *hosts, unsigned int port, const char *user, const char *master_user, - const char *password, enum login_proxy_ssl_flags ssl_flags); + const char *password, enum login_proxy_ssl_flags ssl_flags, + unsigned int connect_timeout_msecs); #endif diff -r b7dbcf86086b -r e3ccd235a7e5 src/login-common/login-proxy.c --- a/src/login-common/login-proxy.c Tue Aug 11 17:38:06 2009 -0400 +++ b/src/login-common/login-proxy.c Wed Aug 12 14:32:17 2009 -0400 @@ -24,6 +24,8 @@ struct ip_addr ip; struct ssl_proxy *ssl_proxy; + struct timeout *to; + char *host, *user; unsigned int port; enum login_proxy_ssl_flags ssl_flags; @@ -139,6 +141,9 @@ return; } + if (proxy->to != NULL) + timeout_remove(&proxy->to); + if ((proxy->ssl_flags & PROXY_SSL_FLAG_YES) != 0 && (proxy->ssl_flags & PROXY_SSL_FLAG_STARTTLS) == 0) { if (login_proxy_starttls(proxy) < 0) { @@ -151,10 +156,17 @@ } } +static void proxy_connect_timeout(struct login_proxy *proxy) +{ + i_error("proxy: connect(%s, %u) timed out", proxy->host, proxy->port); + login_proxy_free(&proxy); +} + #undef login_proxy_new struct login_proxy * login_proxy_new(struct client *client, const char *host, unsigned int port, enum login_proxy_ssl_flags ssl_flags, + unsigned int connect_timeout_msecs, proxy_callback_t *callback, void *context) { struct login_proxy *proxy; @@ -188,6 +200,10 @@ proxy->server_fd = fd; proxy->server_io = io_add(fd, IO_WRITE, proxy_wait_connect, proxy); + if (connect_timeout_msecs != 0) { + proxy->to = timeout_add(connect_timeout_msecs, + proxy_connect_timeout, proxy); + } proxy->callback = callback; proxy->context = context; @@ -208,6 +224,9 @@ return; proxy->destroying = TRUE; + if (proxy->to != NULL) + timeout_remove(&proxy->to); + if (proxy->server_io != NULL) io_remove(&proxy->server_io); if (proxy->server_input != NULL) diff -r b7dbcf86086b -r e3ccd235a7e5 src/login-common/login-proxy.h --- a/src/login-common/login-proxy.h Tue Aug 11 17:38:06 2009 -0400 +++ b/src/login-common/login-proxy.h Wed Aug 12 14:32:17 2009 -0400 @@ -20,15 +20,20 @@ struct login_proxy * login_proxy_new(struct client *client, const char *host, unsigned int port, enum login_proxy_ssl_flags ssl_flags, + unsigned int connect_timeout_msecs, proxy_callback_t *callback, void *context); #ifdef CONTEXT_TYPE_SAFETY -# define login_proxy_new(client, host, port, ssl_flags, callback, context) \ +# define login_proxy_new(client, host, port, ssl_flags, \ + connect_timeout_msecs, callback, context) \ ({(void)(1 ? 0 : callback(context)); \ login_proxy_new(client, host, port, ssl_flags, \ + connect_timeout_msecs, \ (proxy_callback_t *)callback, context); }) #else -# define login_proxy_new(client, host, port, ssl_flags, callback, context) \ +# define login_proxy_new(client, host, port, ssl_flags, \ + connect_timeout_msecs, callback, context) \ login_proxy_new(client, host, port, ssl_flags, \ + connect_timeout_msecs, \ (proxy_callback_t *)callback, context) #endif /* Free the proxy. This should be called if authentication fails. */ diff -r b7dbcf86086b -r e3ccd235a7e5 src/pop3-login/client-authenticate.c --- a/src/pop3-login/client-authenticate.c Tue Aug 11 17:38:06 2009 -0400 +++ b/src/pop3-login/client-authenticate.c Wed Aug 12 14:32:17 2009 -0400 @@ -130,6 +130,7 @@ enum login_proxy_ssl_flags ssl_flags = 0; string_t *reply; unsigned int port = 110; + unsigned int proxy_timeout_msecs = 0; bool proxy = FALSE, temp = FALSE, nologin = !success; *nodelay_r = FALSE; @@ -160,6 +161,8 @@ destuser = value; else if (strcmp(key, "pass") == 0) pass = value; + else if (strcmp(key, "proxy_timeout") == 0) + proxy_timeout_msecs = 1000*atoi(value); else if (strcmp(key, "master") == 0) master_user = value; else if (strcmp(key, "ssl") == 0) { @@ -190,7 +193,7 @@ if (!success) return FALSE; if (pop3_proxy_new(client, host, port, destuser, master_user, - pass, ssl_flags) < 0) + pass, ssl_flags, proxy_timeout_msecs) < 0) client_auth_failed(client, TRUE); return TRUE; } diff -r b7dbcf86086b -r e3ccd235a7e5 src/pop3-login/pop3-proxy.c --- a/src/pop3-login/pop3-proxy.c Tue Aug 11 17:38:06 2009 -0400 +++ b/src/pop3-login/pop3-proxy.c Wed Aug 12 14:32:17 2009 -0400 @@ -259,7 +259,8 @@ int pop3_proxy_new(struct pop3_client *client, const char *host, unsigned int port, const char *user, const char *master_user, - const char *password, enum login_proxy_ssl_flags ssl_flags) + const char *password, enum login_proxy_ssl_flags ssl_flags, + unsigned int connect_timeout_msecs) { i_assert(user != NULL); i_assert(!client->destroyed); @@ -285,6 +286,7 @@ } client->proxy = login_proxy_new(&client->common, host, port, ssl_flags, + connect_timeout_msecs, proxy_input, client); if (client->proxy == NULL) { client_send_line(client, PROXY_FAILURE_MSG); diff -r b7dbcf86086b -r e3ccd235a7e5 src/pop3-login/pop3-proxy.h --- a/src/pop3-login/pop3-proxy.h Tue Aug 11 17:38:06 2009 -0400 +++ b/src/pop3-login/pop3-proxy.h Wed Aug 12 14:32:17 2009 -0400 @@ -5,6 +5,7 @@ int pop3_proxy_new(struct pop3_client *client, const char *host, unsigned int port, const char *user, const char *master_user, - const char *password, enum login_proxy_ssl_flags ssl_flags); + const char *password, enum login_proxy_ssl_flags ssl_flags, + unsigned int connect_timeout_msecs); #endif