more moving towards ldap sync ... lots of refactoring
[citadel.git] / citadel / ldap.c
index 8c60ee508d353adc637f393c12725a90daf987d3..dfa52cfc1ab20bc2832fff5decae05c7a544eaad 100644 (file)
@@ -30,6 +30,69 @@ int ctdl_require_ldap_version = 3;
 #include <ldap.h>
 
 
+/*
+ * Utility function, supply a search result and get back the fullname (display name, common name, etc) from the first result
+ */
+void derive_fullname_from_ldap_result(char *fullname, int fullname_size, LDAP *ldserver, LDAPMessage *search_result)
+{
+       char **values;
+
+       if (fullname == NULL) return;
+
+       if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD) {
+               values = ldap_get_values(ldserver, search_result, "displayName");
+               if (values) {
+                       if (values[0]) {
+                               if (fullname) safestrncpy(fullname, values[0], fullname_size);
+                               syslog(LOG_DEBUG, "ldap: displayName = %s", values[0]);
+                       }
+                       ldap_value_free(values);
+               }
+       }
+       else {
+               values = ldap_get_values(ldserver, search_result, "cn");
+               if (values) {
+                       if (values[0]) {
+                               if (fullname) safestrncpy(fullname, values[0], fullname_size);
+                               syslog(LOG_DEBUG, "ldap: cn = %s", values[0]);
+                       }
+                       ldap_value_free(values);
+               }
+       }
+}
+
+
+/*
+ * 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);
+}
+
+
 /*
  * Wrapper function for ldap_initialize() that consistently fills in the correct fields
  */
@@ -56,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;
@@ -64,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);
@@ -92,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);
@@ -141,57 +196,8 @@ int CtdlTryUserLDAP(char *username,
                        syslog(LOG_DEBUG, "ldap: dn = %s", user_dn);
                }
 
-/* begin - centralize this */
-               if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD) {
-                       values = ldap_get_values(ldserver, search_result, "displayName");
-                       if (values) {
-                               if (values[0]) {
-                                       if (fullname) safestrncpy(fullname, values[0], fullname_size);
-                                       syslog(LOG_DEBUG, "ldap: displayName = %s", values[0]);
-                               }
-                               ldap_value_free(values);
-                       }
-               }
-               else {
-                       values = ldap_get_values(ldserver, search_result, "cn");
-                       if (values) {
-                               if (values[0]) {
-                                       if (fullname) safestrncpy(fullname, values[0], fullname_size);
-                                       syslog(LOG_DEBUG, "ldap: cn = %s", values[0]);
-                               }
-                               ldap_value_free(values);
-                       }
-               }
-/* end - centralize this */
-
-               /* 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);
-                               }
-                       }
-               }
-
+               derive_fullname_from_ldap_result(fullname, fullname_size, ldserver, search_result);
+               *uid = derive_uid_from_ldap(ldserver, search_result);
        }
 
        /* free the results */
@@ -516,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");
                                        }
@@ -558,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
@@ -630,39 +634,8 @@ void CtdlSynchronizeUsersFromLDAP(void)
                        char fullname[256] = { 0 } ;
                        uid_t uid = (-1);
 
-                       if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD) {
-                               values = ldap_get_values(ldserver, entry, "displayName");       // AD schema: fullname = displayName
-                               if (values) {
-                                       if (values[0]) {
-                                               safestrncpy(fullname, values[0], fullname_size);
-                                       }
-                                       ldap_value_free(values);
-                               }
-                               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, "cn");                // POSIX schema: fullname = cn
-                               if (values) {
-                                       if (values[0]) {
-                                               safestrncpy(fullname, values[0], fullname_size);
-                                       }
-                                       ldap_value_free(values);
-                               }
-                               values = ldap_get_values(ldserver, entry, "uidNumber");         // POSIX schema: uid = uidNumber
-                               if (values) {
-                                       if (values[0]) {
-                                               uid = atoi(values[0]);
-                                       }
-                                       ldap_value_free(values);
-                               }
-                       }
-
+                       derive_fullname_from_ldap_result(fullname, fullname_size, ldserver, entry);
+                       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