Olaf Reitmaier Veracierta
2011-Mar-25 22:26 UTC
[Dovecot] Ignored proxy_maybe var and no local login when "host = Proxy FQDN"
Hi help is preciated, PROBLEM The dovecot-ldap.conf of "proxy server A" is working when the "host" attribute is the FQDN of other server: pass_attrs = uid=user,userPassword={SSHA}password,\ =proxy_maybe=,maildrop=host,=port=143,=destuser=%u,=starttls=any-cert pass_filter = (&(objectClass=posixAccount)(uid=%u)) CASES When the "host" attribute is the "FQDN of server A" dovecot imap-login start and infinite loop which swallow all RAM, and process are showing many connections although is just 1 test user connected. It seems that connections are infinitely proxified to it self. When the "host" attribute is the "IP of server A" dovecot imap-login works OK, login the user locally in the server A. I include debug message int the source of "dovecot-2.0.11/src/auth/auth-request.c" which appears: Mar 25 14:10:49 debian dovecot: auth: Debug: ldap(steran,172.26.98.85): result: uid(user)=steran maildrop(host)=smtp2.tsj-dem.gob.ve Mar 25 14:10:49 debian dovecot: auth: Debug: BROKEN SETUP The modifications appears here and reveals problems with the call to net_addr2ip(host, &ip) in auth_request_proxy_is_self: static bool auth_request_proxy_is_self(struct auth_request *request) { const char *const *tmp, *host = NULL, *port = NULL, *destuser NULL; struct ip_addr ip; tmp = auth_stream_split(request->extra_fields); for (; *tmp != NULL; tmp++) { if (strncmp(*tmp, "host=", 5) == 0) host = *tmp + 5; else if (strncmp(*tmp, "port=", 5) == 0) port = *tmp + 5; if (strncmp(*tmp, "destuser=", 9) == 0) destuser = *tmp + 9; } if (host == NULL || net_addr2ip(host, &ip) < 0) { /* broken setup */ T_BEGIN { i_debug("BROKEN SETUP %s", host); } T_END; return FALSE; } if (!net_ip_compare(&ip, &request->local_ip)){ T_BEGIN { i_debug("%s", "IPS NOT EQUAL"); }T_END; return FALSE; } if (port != NULL && !str_uint_equals(port, request->local_port)){ T_BEGIN { i_debug("%s", "PORTS DIFFERENT"); } T_END; return FALSE; } return destuser == NULL || strcmp(destuser, request->original_username) == 0; } -- "You don't know where your shadow will fall", Somebody.- ---------------------------------------------------------------- Olaf Reitmaier Veracierta <olafrv at gmail.com> ---------------------------------------------------------------- http://www.olafrv.com ----------------------------------------------------------------
Timo Sirainen
2011-Mar-25 23:35 UTC
[Dovecot] Ignored proxy_maybe var and no local login when "host = Proxy FQDN"
On Fri, 2011-03-25 at 17:56 -0430, Olaf Reitmaier Veracierta wrote:> The dovecot-ldap.conf of "proxy server A" is working when the "host" > attribute is the FQDN of other server: > > pass_attrs = uid=user,userPassword={SSHA}password,\ > =proxy_maybe=,maildrop=host,=port=143,=destuser=%u,=starttls=any-cert > pass_filter = (&(objectClass=posixAccount)(uid=%u))..> The modifications appears here and reveals problems with the call to > net_addr2ip(host, &ip) in auth_request_proxy_is_self:Yeah. The main problem is that this loop detection code is in auth process, which won't be doing any DNS lookups. I already once tried moving it to login process code where it belongs to, but I failed back then. Hmm. Maybe because request->original_username isn't available to login processes. But I guess it could be set back. Anyway, I think it's a bit too dangerous to go change this logic too much for v2.0. For v2.1 I guess this could be fixed (and you could easily backport that patch then).