By Harry Coin:
[citadel.git] / citadel / ldap.c
index cb5a017037c70a2c7ae9ffa0f130be3b264caa33..58a8fa1374e63c5d71f6cac3ee4c8148e736bced 100644 (file)
@@ -60,7 +60,7 @@ int ctdl_ldap_initialize(LDAP **ld) {
 int CtdlTryUserLDAP(char *username,
                char *found_dn, int found_dn_size,
                char *fullname, int fullname_size,
-               uid_t *uid)
+               uid_t *uid, int lookup_based_on_uid)
 {
        LDAP *ldserver = NULL;
        int i;
@@ -73,7 +73,6 @@ int CtdlTryUserLDAP(char *username,
 
        if (fullname) safestrncpy(fullname, username, fullname_size);
 
-       ldserver = ldap_init(config.c_ldap_host, config.c_ldap_port);
        if (ctdl_ldap_initialize(&ldserver) != LDAP_SUCCESS) {
                return(errno);
        }
@@ -97,10 +96,16 @@ int CtdlTryUserLDAP(char *username,
        tv.tv_usec = 0;
 
        if (config.c_auth_mode == AUTHMODE_LDAP_AD) {
-               snprintf(searchstring, sizeof(searchstring), "(sAMAccountName=%s)", username);
+               if (lookup_based_on_uid!=0)
+                       snprintf(searchstring, sizeof(searchstring), "(objectGUID=%d)",*uid);
+               else
+                       snprintf(searchstring, sizeof(searchstring), "(sAMAccountName=%s)", username);
        }
        else {
-               snprintf(searchstring, sizeof(searchstring), "(&(objectclass=posixAccount)(uid=%s))", username);
+               if (lookup_based_on_uid!=0)
+                       snprintf(searchstring, sizeof(searchstring), "(uidNumber=%d)",*uid);
+               else
+                       snprintf(searchstring, sizeof(searchstring), "(&(objectclass=posixAccount)(uid=%s))", username);
        }
 
        syslog(LOG_DEBUG, "LDAP search: %s", searchstring);
@@ -159,28 +164,30 @@ int CtdlTryUserLDAP(char *username,
                        }
                }
 
-               if (config.c_auth_mode == AUTHMODE_LDAP_AD) {
-                       values = ldap_get_values(ldserver, search_result, "objectGUID");
-                       if (values) {
-                               if (values[0]) {
-                                       if (uid != NULL) {
-                                               *uid = abs(HashLittle(values[0], strlen(values[0])));
-                                               syslog(LOG_DEBUG, "uid hashed from objectGUID = %d", *uid);
+               if (lookup_based_on_uid==0) {
+                       if (config.c_auth_mode == AUTHMODE_LDAP_AD) {
+                               values = ldap_get_values(ldserver, search_result, "objectGUID");
+                               if (values) {
+                                       if (values[0]) {
+                                               if (uid != NULL) {
+                                                       *uid = abs(HashLittle(values[0], strlen(values[0])));
+                                                       syslog(LOG_DEBUG, "uid hashed from objectGUID = %d", *uid);
+                                               }
                                        }
+                                       ldap_value_free(values);
                                }
-                               ldap_value_free(values);
                        }
-               }
-               else {
-                       values = ldap_get_values(ldserver, search_result, "uidNumber");
-                       if (values) {
-                               if (values[0]) {
-                                       syslog(LOG_DEBUG, "uidNumber = %s", values[0]);
-                                       if (uid != NULL) {
-                                               *uid = atoi(values[0]);
+                       else {
+                               values = ldap_get_values(ldserver, search_result, "uidNumber");
+                               if (values) {
+                                       if (values[0]) {
+                                               syslog(LOG_DEBUG, "uidNumber = %s", values[0]);
+                                               if (uid != NULL) {
+                                                       *uid = atoi(values[0]);
+                                               }
                                        }
+                                       ldap_value_free(values);
                                }
-                               ldap_value_free(values);
                        }
                }
 
@@ -214,8 +221,8 @@ int CtdlTryPasswordLDAP(char *user_dn, const char *password)
        }
 
        syslog(LOG_DEBUG, "LDAP: trying to bind as %s", user_dn);
-       ldserver = ldap_init(config.c_ldap_host, config.c_ldap_port);
-       if (ldserver) {
+       i = ctdl_ldap_initialize(&ldserver);
+       if (i == LDAP_SUCCESS) {
                ldap_set_option(ldserver, LDAP_OPT_PROTOCOL_VERSION, &ctdl_require_ldap_version);
                i = ldap_simple_bind_s(ldserver, user_dn, password);
                if (i == LDAP_SUCCESS) {
@@ -306,12 +313,8 @@ int Ctdl_LDAP_to_vCard(char *ldap_dn, struct vCard *v)
 
        if (!ldap_dn) return(0);
        if (!v) return(0);
-       ldserver = ldap_init(config.c_ldap_host, config.c_ldap_port);
-       if (ldserver == NULL) {
-               syslog(LOG_ALERT, "LDAP: Could not connect to %s:%d : %s",
-                       config.c_ldap_host, config.c_ldap_port,
-                       strerror(errno)
-               );
+
+       if (ctdl_ldap_initialize(&ldserver) != LDAP_SUCCESS) {
                return(0);
        }