dovecot-2.2: login proxy: If passdb returns "source_ip" extra fi...

dovecot at dovecot.org dovecot at dovecot.org
Mon Jun 16 16:22:59 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/75d254897442
changeset: 17503:75d254897442
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Jun 16 19:21:36 2014 +0300
description:
login proxy: If passdb returns "source_ip" extra field, use it for outgoing connections.

diffstat:

 src/login-common/client-common-auth.c |   5 +++++
 src/login-common/client-common.h      |   3 ++-
 src/login-common/login-proxy.c        |  10 ++++++++--
 src/login-common/login-proxy.h        |   2 +-
 4 files changed, 16 insertions(+), 4 deletions(-)

diffs (88 lines):

diff -r 6abf982c268d -r 75d254897442 src/login-common/client-common-auth.c
--- a/src/login-common/client-common-auth.c	Mon Jun 16 18:01:58 2014 +0300
+++ b/src/login-common/client-common-auth.c	Mon Jun 16 19:21:36 2014 +0300
@@ -95,6 +95,8 @@
 			reply_r->host = value;
 		else if (strcmp(key, "hostip") == 0)
 			reply_r->hostip = value;
+		else if (strcmp(key, "source_ip") == 0)
+			reply_r->source_ip = value;
 		else if (strcmp(key, "port") == 0)
 			reply_r->port = atoi(value);
 		else if (strcmp(key, "destuser") == 0)
@@ -336,6 +338,9 @@
 	if (reply->hostip != NULL &&
 	    net_addr2ip(reply->hostip, &proxy_set.ip) < 0)
 		proxy_set.ip.family = 0;
+	if (reply->source_ip != NULL &&
+	    net_addr2ip(reply->source_ip, &proxy_set.source_ip) < 0)
+		proxy_set.source_ip.family = 0;
 	proxy_set.port = reply->port;
 	proxy_set.connect_timeout_msecs = reply->proxy_timeout_msecs;
 	if (proxy_set.connect_timeout_msecs == 0)
diff -r 6abf982c268d -r 75d254897442 src/login-common/client-common.h
--- a/src/login-common/client-common.h	Mon Jun 16 18:01:58 2014 +0300
+++ b/src/login-common/client-common.h	Mon Jun 16 19:21:36 2014 +0300
@@ -55,7 +55,8 @@
 struct client_auth_reply {
 	const char *master_user, *reason;
 	/* for proxying */
-	const char *host, *hostip, *destuser, *password, *proxy_mech;
+	const char *host, *hostip, *source_ip;
+	const char *destuser, *password, *proxy_mech;
 	unsigned int port;
 	unsigned int proxy_timeout_msecs;
 	unsigned int proxy_refresh_secs;
diff -r 6abf982c268d -r 75d254897442 src/login-common/login-proxy.c
--- a/src/login-common/login-proxy.c	Mon Jun 16 18:01:58 2014 +0300
+++ b/src/login-common/login-proxy.c	Mon Jun 16 19:21:36 2014 +0300
@@ -39,7 +39,7 @@
 	struct timeout *to, *to_notify;
 	struct login_proxy_record *state_rec;
 
-	struct ip_addr ip;
+	struct ip_addr ip, source_ip;
 	char *host;
 	unsigned int port;
 	unsigned int connect_timeout_msecs;
@@ -229,6 +229,9 @@
 	    net_getsockname(proxy->server_fd, &local_ip, &local_port) == 0) {
 		str_printfa(str, ", local=%s:%u",
 			    net_ip2addr(&local_ip), local_port);
+	} else if (proxy->source_ip.family != 0) {
+		str_printfa(str, ", local=%s",
+			    net_ip2addr(&proxy->source_ip));
 	}
 
 	str_append_c(str, ')');
@@ -285,7 +288,9 @@
 		return -1;
 	}
 
-	proxy->server_fd = net_connect_ip(&proxy->ip, proxy->port, NULL);
+	proxy->server_fd = net_connect_ip(&proxy->ip, proxy->port,
+					  proxy->source_ip.family == 0 ? NULL :
+					  &proxy->source_ip);
 	if (proxy->server_fd == -1) {
 		proxy_log_connect_error(proxy);
 		login_proxy_free(&proxy);
@@ -328,6 +333,7 @@
 	proxy->server_fd = -1;
 	proxy->created = ioloop_timeval;
 	proxy->ip = set->ip;
+	proxy->source_ip = set->source_ip;
 	proxy->host = i_strdup(set->host);
 	proxy->port = set->port;
 	proxy->connect_timeout_msecs = set->connect_timeout_msecs;
diff -r 6abf982c268d -r 75d254897442 src/login-common/login-proxy.h
--- a/src/login-common/login-proxy.h	Mon Jun 16 18:01:58 2014 +0300
+++ b/src/login-common/login-proxy.h	Mon Jun 16 19:21:36 2014 +0300
@@ -24,7 +24,7 @@
 
 struct login_proxy_settings {
 	const char *host;
-	struct ip_addr ip;
+	struct ip_addr ip, source_ip;
 	unsigned int port;
 	unsigned int connect_timeout_msecs;
 	/* send a notification about proxy connection to proxy-notify pipe


More information about the dovecot-cvs mailing list