Sophie

Sophie

distrib > Mandriva > 2010.1 > x86_64 > media > main-release-src > by-pkgid > 84aaf34fd388b0842826b58040be7b0f > files > 13

cyrus-imapd-2.3.15-7mdv2010.1.src.rpm

diff -Naurp cyrus-imapd-2.3.13/configure cyrus-imapd-2.3.13.oden/configure
--- cyrus-imapd-2.3.13/configure	2008-10-17 14:56:20.000000000 +0200
+++ cyrus-imapd-2.3.13.oden/configure	2008-12-16 12:31:20.000000000 +0100
@@ -19667,7 +19667,7 @@ for flag in ${ldflags} ${default_ldflags
 done
 
 IMAP_COM_ERR_LIBS="${COM_ERR_LIBS}"
-IMAP_LIBS="${LIB_SASL} ${LIBS} ${SQL_LIBS}"
+IMAP_LIBS="${LIB_SASL} -lldap -llber ${LIBS}"
 
 
 
diff -Naurp cyrus-imapd-2.3.13/configure.in cyrus-imapd-2.3.13.oden/configure.in
--- cyrus-imapd-2.3.13/configure.in	2008-10-09 01:28:58.000000000 +0200
+++ cyrus-imapd-2.3.13.oden/configure.in	2008-12-16 12:30:17.000000000 +0100
@@ -1253,7 +1253,7 @@ for flag in ${ldflags} ${default_ldflags
 done
 
 IMAP_COM_ERR_LIBS="${COM_ERR_LIBS}"
-IMAP_LIBS="${LIB_SASL} ${LIBS} ${SQL_LIBS}"
+IMAP_LIBS="${LIB_SASL} -lldap -llber ${LIBS}"
 
 AC_SUBST(LIB_RT)
 AC_SUBST(IMAP_COM_ERR_LIBS)
diff -Naurp cyrus-imapd-2.3.13/imap/global.c cyrus-imapd-2.3.13.oden/imap/global.c
--- cyrus-imapd-2.3.13/imap/global.c	2008-07-30 18:03:37.000000000 +0200
+++ cyrus-imapd-2.3.13.oden/imap/global.c	2008-12-16 12:29:23.000000000 +0100
@@ -53,6 +53,9 @@
 #include <netinet/in.h>
 #include <sys/stat.h>
 
+#include <ldap.h>
+#include <lber.h>
+
 #if HAVE_UNISTD_H
 # include <unistd.h>
 #endif
@@ -378,6 +381,18 @@ char *canonify_userid(char *user, char *
     char *domain = NULL;
     int len = strlen(user);
     char buf[81];
+    const char *uri;
+    const char *base;
+    const char *binddn;
+    const char *bindpw;
+    struct timeval timeout;
+    char filter[255];
+    LDAP *handle;
+    LDAPMessage *res;
+    LDAPMessage *entry;
+    char ** vals;
+
+    int rc;
 
     /* check for domain */
     if (config_virtdomains &&
@@ -396,6 +411,47 @@ char *canonify_userid(char *user, char *
     }
 
     if (config_virtdomains) {
+        if (config_virtdomains == IMAP_ENUM_VIRTDOMAINS_LDAP) {
+           uri = config_getstring(IMAPOPT_LDAP_URI);
+           base = config_getstring(IMAPOPT_LDAP_BASE);
+           binddn = config_getstring(IMAPOPT_LDAP_BIND_DN);
+           bindpw = config_getstring(IMAPOPT_LDAP_PASSWORD);
+           timeout.tv_sec = config_getint(IMAPOPT_LDAP_TIME_LIMIT);
+           timeout.tv_usec = 0;
+           sprintf(filter, "(uid=%s)", user);
+           rc = ldap_initialize(&handle, uri);
+           if (rc != LDAP_SUCCESS) {
+                syslog(LOG_ERR, "ldap_initialize failed (%s)", uri);
+           } else {
+	        rc = ldap_simple_bind_s(handle, binddn, bindpw);
+	        if (rc != LDAP_SUCCESS) {
+                     syslog(LOG_ERR, "ldap_simple_bind() failed %d (%s)", rc, ldap_err2string(rc));
+	        } else {
+	             rc = ldap_search_st(handle, base, LDAP_SCOPE_SUBTREE, filter, NULL, 0, &timeout, &res);
+                     if (rc != LDAP_SUCCESS) {
+                          syslog(LOG_ERR, "ldap_search_st failed %d (%s)", rc, ldap_err2string(rc));
+                     } else {
+	                  if ( (entry = ldap_first_entry(handle, res)) != NULL ) {
+			       // read mail attribute from entry
+			       if ( (vals = ldap_get_values(handle, entry, "mail")) ) {
+  				    if (strchr(vals[0], '@')) {
+				        static char buf[81]; /* same size as in auth_canonifyid */
+					strncpy( buf, vals[0], sizeof(buf) );
+					buf[80] = '\0'; /* make sure it's null-terminated */
+					ldap_value_free( vals );
+				        ldap_msgfree( res );
+					ldap_unbind_s(handle); /* also frees handle */
+				        return auth_canonifyid( buf, 0) ;
+				    }
+				    ldap_value_free( vals );
+			       }			       	
+   	                  }
+			  ldap_msgfree( res );
+                     }
+                }
+		ldap_unbind_s(handle); /* also frees handle */
+           }
+        }
 	if (domain) {
 	    if (config_defdomain && !strcasecmp(config_defdomain, domain+1)) {
 		*domain = '\0'; /* trim the default domain */
@@ -408,7 +464,7 @@ char *canonify_userid(char *user, char *
 		user = buf;
 	    }
 	}
-	else if (config_virtdomains != IMAP_ENUM_VIRTDOMAINS_USERID) {
+	else if (config_virtdomains != IMAP_ENUM_VIRTDOMAINS_USERID && config_virtdomains != IMAP_ENUM_VIRTDOMAINS_LDAP) {
 	    socklen_t salen;
 	    int error;
 	    struct sockaddr_storage localaddr;
diff -Naurp cyrus-imapd-2.3.13/lib/imapoptions cyrus-imapd-2.3.13.oden/lib/imapoptions
--- cyrus-imapd-2.3.13/lib/imapoptions	2008-12-16 12:30:40.000000000 +0100
+++ cyrus-imapd-2.3.13.oden/lib/imapoptions	2008-12-16 12:29:23.000000000 +0100
@@ -1169,7 +1169,7 @@ product version in the capabilities */
    mailbox hierarchy.  The default is to use the netnews separator
    character '.'. */
 
-{ "virtdomains", "off", ENUM("off", "userid", "on") }
+{ "virtdomains", "off", ENUM("off", "userid", "ldap", "on") }
 /* Enable virtual domain support.  If enabled, the user's domain will
    be determined by splitting a fully qualified userid at the last '@'
    or '%' symbol.  If the userid is unqualified, and the virtdomains
diff -Naurp cyrus-imapd-2.3.13/lib/imapopts.c cyrus-imapd-2.3.13.oden/lib/imapopts.c
--- cyrus-imapd-2.3.13/lib/imapopts.c	2008-10-17 14:56:20.000000000 +0200
+++ cyrus-imapd-2.3.13.oden/lib/imapopts.c	2008-12-16 12:29:23.000000000 +0100
@@ -234,7 +234,7 @@ struct imapopt_s imapopts[] =
   { IMAPOPT_USERPREFIX, "userprefix", 0, {(void *)("Other Users")}, OPT_STRING, {  { NULL, IMAP_ENUM_ZERO } } },
   { IMAPOPT_UNIX_GROUP_ENABLE, "unix_group_enable", 0, {(void*)1}, OPT_SWITCH, {  { NULL, IMAP_ENUM_ZERO } } },
   { IMAPOPT_UNIXHIERARCHYSEP, "unixhierarchysep", 0, {(void*)0}, OPT_SWITCH, {  { NULL, IMAP_ENUM_ZERO } } },
-  { IMAPOPT_VIRTDOMAINS, "virtdomains", 0, {(void *)(IMAP_ENUM_VIRTDOMAINS_OFF)}, OPT_ENUM, { { "off" , IMAP_ENUM_VIRTDOMAINS_OFF }, { "userid" , IMAP_ENUM_VIRTDOMAINS_USERID }, { "on" , IMAP_ENUM_VIRTDOMAINS_ON },  { NULL, IMAP_ENUM_ZERO } } },
+  { IMAPOPT_VIRTDOMAINS, "virtdomains", 0, {(void *)(IMAP_ENUM_VIRTDOMAINS_OFF)}, OPT_ENUM, { { "off" , IMAP_ENUM_VIRTDOMAINS_OFF }, { "userid" , IMAP_ENUM_VIRTDOMAINS_USERID }, { "ldap" , IMAP_ENUM_VIRTDOMAINS_LDAP }, { "on" , IMAP_ENUM_VIRTDOMAINS_ON },  { NULL, IMAP_ENUM_ZERO } } },
 
   { IMAPOPT_LAST, NULL, 0, { NULL }, OPT_NOTOPT, {  { NULL, IMAP_ENUM_ZERO } } }
 
diff -Naurp cyrus-imapd-2.3.13/lib/imapopts.h cyrus-imapd-2.3.13.oden/lib/imapopts.h
--- cyrus-imapd-2.3.13/lib/imapopts.h	2008-10-17 14:56:20.000000000 +0200
+++ cyrus-imapd-2.3.13.oden/lib/imapopts.h	2008-12-16 12:29:23.000000000 +0100
@@ -264,7 +264,8 @@ enum enum_value {
   IMAP_ENUM_SIEVE_EXTENSIONS_COPY = (1<<11),
   IMAP_ENUM_VIRTDOMAINS_OFF = 0,
   IMAP_ENUM_VIRTDOMAINS_USERID,
-  IMAP_ENUM_VIRTDOMAINS_ON
+  IMAP_ENUM_VIRTDOMAINS_ON,
+  IMAP_ENUM_VIRTDOMAINS_LDAP
 
 };