more moving towards ldap sync ... lots of refactoring
[citadel.git] / citadel / ldap.c
index 2a770f839c66bf108fd908e06d0d7c55b080c124..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");
                                        }
@@ -549,7 +554,7 @@ int extract_email_addresses_from_ldap(char *ldap_dn, char *emailaddrs)
 /*
  * Scan LDAP for users and populate Citadel's user database with everyone
  */
-void CtdlPopulateUsersFromLDAP(void)
+void CtdlSynchronizeUsersFromLDAP(void)
 {
        LDAP *ldserver = NULL;
        int i;
@@ -558,13 +563,12 @@ void CtdlPopulateUsersFromLDAP(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
        }
 
-       syslog(LOG_INFO, "ldap: populating Citadel user database from LDAP");
+       syslog(LOG_INFO, "ldap: synchronizing Citadel user database from LDAP");
 
        if (ctdl_ldap_initialize(&ldserver) != LDAP_SUCCESS) {
                return;
@@ -626,51 +630,15 @@ void CtdlPopulateUsersFromLDAP(void)
                if (user_dn) {
                        syslog(LOG_DEBUG, "ldap: found %s", user_dn);
 
-                       // FIXME now create or update the user begin
                        int fullname_size = 256;
                        char fullname[256] = { 0 } ;
                        uid_t uid = (-1);
 
-                       if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD) {
-                               values = ldap_get_values(ldserver, entry, "displayName");       // AD: 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: 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");                // non-AD: fullname = cn
-                               if (values) {
-                                       if (values[0]) {
-                                               safestrncpy(fullname, values[0], fullname_size);
-                                       }
-                                       ldap_value_free(values);
-                               }
-                               values = ldap_get_values(ldserver, entry, "uidNumber");         // non-AD: 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 end
-
-
-
+                       // FIXME now create or update the user
 
 
                }