more moving towards ldap sync ... lots of refactoring
[citadel.git] / citadel / ldap.c
index fa423ffb759d81a2856392af90709af299509f96..dfa52cfc1ab20bc2832fff5decae05c7a544eaad 100644 (file)
@@ -59,10 +59,38 @@ void derive_fullname_from_ldap_result(char *fullname, int fullname_size, LDAP *l
                        ldap_value_free(values);
                }
        }
-       syslog(LOG_DEBUG, "\033[31mldap: display name: <%s> \033[0m", fullname);
 }
 
 
+/*
+ * Utility function, supply a search result and get back the uid from the first result
+ */
+uid_t derive_uid_from_ldap(LDAP *ldserver, LDAPMessage *entry)
+{
+       char **values;
+       uid_t uid = (-1);
+
+       if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD) {
+               values = ldap_get_values(ldserver, entry, "objectGUID");        // AD schema: uid hashed from objectGUID
+               if (values) {
+                       if (values[0]) {
+                               uid = abs(HashLittle(values[0], strlen(values[0])));
+                       }
+                       ldap_value_free(values);
+               }
+       }
+       else {
+               values = ldap_get_values(ldserver, entry, "uidNumber");         // POSIX schema: uid = uidNumber
+               if (values) {
+                       if (values[0]) {
+                               uid = atoi(values[0]);
+                       }
+                       ldap_value_free(values);
+               }
+       }
+
+       return(uid);
+}
 
 
 /*
@@ -91,7 +119,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, int lookup_based_on_username)
+               uid_t *uid)
 {
        LDAP *ldserver = NULL;
        int i;
@@ -99,7 +127,6 @@ int CtdlTryUserLDAP(char *username,
        LDAPMessage *entry = NULL;
        char searchstring[1024];
        struct timeval tv;
-       char **values;
        char *user_dn = NULL;
 
        if (fullname) safestrncpy(fullname, username, fullname_size);
@@ -127,18 +154,11 @@ int CtdlTryUserLDAP(char *username,
        tv.tv_usec = 0;
 
        if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD) {
-               if (lookup_based_on_username != 0)
-                       snprintf(searchstring, sizeof(searchstring), "(displayName=%s)",username);
-               else
-                       snprintf(searchstring, sizeof(searchstring), "(sAMAccountName=%s)", username);
+               snprintf(searchstring, sizeof(searchstring), "(sAMAccountName=%s)", username);
        }
        else {
-               if (lookup_based_on_username != 0) {
-                       snprintf(searchstring, sizeof(searchstring), "(cn=%s)",username);
-               }
-               else {
-                       snprintf(searchstring, sizeof(searchstring), "(&(objectclass=posixAccount)(uid=%s))", username);
-               }
+               snprintf(searchstring, sizeof(searchstring), "(&(objectclass=posixAccount)(cn=%s))", username);
+               // snprintf(searchstring, sizeof(searchstring), "(&(objectclass=posixAccount)(uid=%s))", username);
        }
 
        syslog(LOG_DEBUG, "ldap: search: %s", searchstring);
@@ -177,35 +197,7 @@ int CtdlTryUserLDAP(char *username,
                }
 
                derive_fullname_from_ldap_result(fullname, fullname_size, ldserver, search_result);
-
-               /* If we know the username is the CN/displayName, we already set the uid*/
-               if (lookup_based_on_username==0) {
-                       if (CtdlGetConfigInt("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, "ldap: uid hashed from objectGUID = %d", *uid);
-                                               }
-                                       }
-                                       ldap_value_free(values);
-                               }
-                       }
-                       else {
-                               values = ldap_get_values(ldserver, search_result, "uidNumber");
-                               if (values) {
-                                       if (values[0]) {
-                                               syslog(LOG_DEBUG, "ldap: uidNumber = %s", values[0]);
-                                               if (uid != NULL) {
-                                                       *uid = atoi(values[0]);
-                                               }
-                                       }
-                                       ldap_value_free(values);
-                               }
-                       }
-               }
-
+               *uid = derive_uid_from_ldap(ldserver, search_result);
        }
 
        /* free the results */
@@ -530,13 +522,12 @@ int extract_email_addresses_from_ldap(char *ldap_dn, char *emailaddrs)
        entry = ldap_first_entry(ldserver, search_result);
        if (entry) {
                syslog(LOG_DEBUG, "ldap: search got user details");
-               mail=ldap_get_values(ldserver, search_result, "mail");
+               mail = ldap_get_values(ldserver, search_result, "mail");
 
                if (mail) {
                        int q;
                        for (q=0; q<ldap_count_values(mail); ++q) {
                                if (IsDirectory(mail[q], 0)) {
-                                       syslog(LOG_DEBUG, "\035FIXME YES DIRECTORY %s\033[0m", mail[q]);
                                        if ((strlen(emailaddrs) + strlen(mail[q]) + 2) > 512) {
                                                syslog(LOG_ERR, "ldap: can't fit all email addresses into user record");
                                        }
@@ -572,7 +563,6 @@ void CtdlSynchronizeUsersFromLDAP(void)
        char *user_dn = NULL;
        char searchstring[1024];
        struct timeval tv;
-       char **values;
 
        if ((CtdlGetConfigInt("c_auth_mode") != AUTHMODE_LDAP) && (CtdlGetConfigInt("c_auth_mode") != AUTHMODE_LDAP_AD)) {
                return;         // not running LDAP
@@ -645,26 +635,7 @@ void CtdlSynchronizeUsersFromLDAP(void)
                        uid_t uid = (-1);
 
                        derive_fullname_from_ldap_result(fullname, fullname_size, ldserver, entry);
-
-                       if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD) {
-                               values = ldap_get_values(ldserver, entry, "objectGUID");        // AD schema: uid hashed from objectGUID
-                               if (values) {
-                                       if (values[0]) {
-                                               uid = abs(HashLittle(values[0], strlen(values[0])));
-                                       }
-                                       ldap_value_free(values);
-                               }
-                       }
-                       else {
-                               values = ldap_get_values(ldserver, entry, "uidNumber");         // POSIX schema: uid = uidNumber
-                               if (values) {
-                                       if (values[0]) {
-                                               uid = atoi(values[0]);
-                                       }
-                                       ldap_value_free(values);
-                               }
-                       }
-
+                       uid = derive_uid_from_ldap(ldserver, entry);
                        syslog(LOG_DEBUG, "\033[33mldap: display name: <%s> , uid = <%d>\033[0m", fullname, uid);
 
                        // FIXME now create or update the user