On Tue, 21 Dec 2004, Igor Brezac wrote:
On Tue, 21 Dec 2004, Mike O'Rourke wrote:
Hi all,
I have IMAPd 2.2.10, compiled with --with-auth=pts --with-pts=ldap --with-ldap OpenLDAP 2.2.17
my /etc/imapd.conf is:
configdirectory: /var/imap defaultpartition: default partition-default: /var/spool/imap unixhierarchysep: yes allowanonymouslogin: no allowplaintext: yes allowusermoves: yes servername: server12.mydom.com virtdomains: userid defaultdomain: mydom.com autocreatequota: -1 createonpost: 1 autocreateinboxfolders: Sent|Trash autosubscribeinboxfolders: Sent|Trash admins: cyrus lmtpsocket: /var/imap/socket/lmtp sendmail: /usr/sbin/sendmail tls_cert_file: /var/imap/server12_cert.pem tls_key_file: /var/imap/server12_key.pem tls_CA_file: /var/imap/cacerts/cacert.pem tls_CA_path: /var/imap/cacerts tls_require_cert: 0 ldap_sasl: 0 ldap_base: ou=email,o=internet,o=mycom ldap_bind_dn: cn=server12.mydom.com,ou=hosts,o=internet,o=mycom ldap_filter: (&(uid=%u)(MailUserDefHost=server12.mydom.com)) ldap_password: mypass ldap_tls_cacert_file: /var/imap/cacerts/cacert.pem ldap_tls_cert: /var/imap/server12_cert.pem ldap_tls_key: /var/imap/server12_key.pem ldap_uri: ldaps://192.168.7.11 ldaps://ldap1.mydom.com ldaps://ldap2.mydom.com ptloader_sock: /var/imap/socket/ptsock
In the ldap_filter, MailUserDefHost is a private attribute to limit which host the user can login to.
Authorization fails with a generic failure (see the output from imtest below, if you wish). Even though "ldap_sasl" is set to 0 in imapd.conf, it would seem that it is trying to use SASL (proxy) authentication after a successful bind (see the debugging output from the LDAP server below, if you wish).
This is a bug in ptloader/ldap.
Please try this patch:
Index: ldap.c =================================================================== RCS file: /cvs/src/cyrus/ptclient/ldap.c,v retrieving revision 1.7 diff -u -r1.7 ldap.c --- ldap.c 24 Jun 2004 19:28:39 -0000 1.7 +++ ldap.c 21 Dec 2004 05:27:18 -0000
This patch will not work when ldap_sasl is enabled. Here is an updated patch:
Index: ldap.c =================================================================== RCS file: /cvs/src/cyrus/ptclient/ldap.c,v retrieving revision 1.7 diff -u -r1.7 ldap.c --- ldap.c 24 Jun 2004 19:28:39 -0000 1.7 +++ ldap.c 21 Dec 2004 15:38:49 -0000 @@ -799,64 +799,66 @@
#if LDAP_VENDOR_VERSION >= 20125
- authzid = xmalloc(size + sizeof("u:")); - if (authzid == NULL) - return PTSM_NOMEM; - - strcpy(authzid, "u:"); - strcpy(authzid+2, canon_id); - c.ldctl_oid = LDAP_CONTROL_PROXY_AUTHZ; - c.ldctl_value.bv_val = authzid; - c.ldctl_value.bv_len = size + 2; - c.ldctl_iscritical = 1; - - ctrl[0] = &c; - ctrl[1] = NULL; - rc = ldap_whoami_s(ptsm->ld, &dn, ctrl, NULL); - free(authzid); - if ( rc != LDAP_SUCCESS || !dn ) { - if (rc == LDAP_SERVER_DOWN) { - ldap_unbind(ptsm->ld); - ptsm->ld = NULL; - return PTSM_RETRY; + if (ptsm->sasl) { + authzid = xmalloc(size + sizeof("u:")); + if (authzid == NULL) + return PTSM_NOMEM; + + strcpy(authzid, "u:"); + strcpy(authzid+2, canon_id); + c.ldctl_oid = LDAP_CONTROL_PROXY_AUTHZ; + c.ldctl_value.bv_val = authzid; + c.ldctl_value.bv_len = size + 2; + c.ldctl_iscritical = 1; + + ctrl[0] = &c; + ctrl[1] = NULL; + rc = ldap_whoami_s(ptsm->ld, &dn, ctrl, NULL); + free(authzid); + if ( rc != LDAP_SUCCESS || !dn ) { + if (rc == LDAP_SERVER_DOWN) { + ldap_unbind(ptsm->ld); + ptsm->ld = NULL; + return PTSM_RETRY; + } + return PTSM_FAIL; } - return PTSM_FAIL; - }
- if ( dn->bv_val && - !strncmp(dn->bv_val, "dn:", 3) ) - *ret = strdup(dn->bv_val+3); - ber_bvfree(dn); - -#else - - rc = ptsmodule_expand_tokens(ptsm->filter, canon_id, NULL, &filter); - if (rc != PTSM_OK) - return rc; - - rc = ptsmodule_expand_tokens(ptsm->base, canon_id, NULL, &base); - if (rc != PTSM_OK) - return rc; - - rc = ldap_search_st(ptsm->ld, base, ptsm->scope, filter, attrs, 0, &(ptsm->timeout), &res); - free(filter); - free(base); - if (rc != LDAP_SUCCESS) { - if (rc == LDAP_SERVER_DOWN) { - ldap_unbind(ptsm->ld); - ptsm->ld = NULL; - return PTSM_RETRY; - } - return PTSM_FAIL; - } + if ( dn->bv_val && + !strncmp(dn->bv_val, "dn:", 3) ) + *ret = strdup(dn->bv_val+3); + ber_bvfree(dn); + } else + +#endif
- if ( (entry = ldap_first_entry(ptsm->ld, res)) != NULL ) - *ret = ldap_get_dn(ptsm->ld, entry); + { + rc = ptsmodule_expand_tokens(ptsm->filter, canon_id, NULL, &filter); + if (rc != PTSM_OK) + return rc; + + rc = ptsmodule_expand_tokens(ptsm->base, canon_id, NULL, &base); + if (rc != PTSM_OK) + return rc; + + rc = ldap_search_st(ptsm->ld, base, ptsm->scope, filter, attrs, 0, &(ptsm->timeout), &res); + free(filter); + free(base); + if (rc != LDAP_SUCCESS) { + if (rc == LDAP_SERVER_DOWN) { + ldap_unbind(ptsm->ld); + ptsm->ld = NULL; + return PTSM_RETRY; + } + return PTSM_FAIL; + }
- ldap_msgfree(res); - res = NULL; + if ( (entry = ldap_first_entry(ptsm->ld, res)) != NULL ) + *ret = ldap_get_dn(ptsm->ld, entry);
-#endif + ldap_msgfree(res); + res = NULL; + }
return (*ret ? PTSM_OK : PTSM_FAIL); }
-- Igor --- Cyrus Home Page: http://asg.web.cmu.edu/cyrus Cyrus Wiki/FAQ: http://cyruswiki.andrew.cmu.edu List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html