changeset 9306:e3ccd235a7e5 HEAD

login proxy: Added client_proxy passdb extra field to specify proxy's connect timeout.
author Timo Sirainen <tss@iki.fi>
date Wed, 12 Aug 2009 14:32:17 -0400
parents b7dbcf86086b
children dfbcb8ead5ef
files src/imap-login/client-authenticate.c src/imap-login/imap-proxy.c src/imap-login/imap-proxy.h src/login-common/login-proxy.c src/login-common/login-proxy.h src/pop3-login/client-authenticate.c src/pop3-login/pop3-proxy.c src/pop3-login/pop3-proxy.h
diffstat 8 files changed, 44 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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;
 	}
--- 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);
--- 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
--- 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)
--- 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. */
--- 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;
 	}
--- 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);
--- 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