getuserbyuid() now uses the extauth index, so we can do ldap sync
[citadel.git] / citadel / modules / upgrade / serv_upgrade.c
index d4cd4904b81f380c3c62ffaa22d14972e5bbd94c..56ba219df0044f594d7395e0fc3005b3a2fa511b 100644 (file)
@@ -4,7 +4,7 @@
  * guesses about what kind of data format changes need to be applied, and
  * we apply them transparently.
  *
- * Copyright (c) 1987-2016 by the citadel.org team
+ * Copyright (c) 1987-2017 by the citadel.org team
  *
  * This program is open source software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version 3.
@@ -52,6 +52,8 @@
 #include "serv_upgrade.h"
 #include "euidindex.h"
 #include "ctdl_module.h"
+#include "serv_vcard.h"
+#include "internet_addressing.h"
 
 
 /*
@@ -98,21 +100,24 @@ void fix_sys_user_name(void)
 
 
 /* 
- * Back end processing function for convert_ctdluid_to_minusone()
+ * Back end processing function for reindex_uids()
+ * Call this function as a ForEachUser backend in order to queue up
+ * user names, or call it with a null user to make it do the processing.
+ * This allows us to maintain the list as a static instead of passing
+ * pointers around.
  */
-void cbtm_backend(struct ctdluser *usbuf, void *data) {
+void reindex_uids_backend(struct ctdluser *usbuf, void *data) {
        static struct UserProcList *uplist = NULL;
        struct UserProcList *ptr;
        struct ctdluser us;
 
-       /* Lazy programming here.  Call this function as a ForEachUser backend
-        * in order to queue up the room names, or call it with a null user
-        * to make it do the processing.
-        */
+       /* this is the calling mode where we add a user */
+
        if (usbuf != NULL) {
-               ptr = (struct UserProcList *)
-                       malloc(sizeof (struct UserProcList));
-               if (ptr == NULL) return;
+               ptr = (struct UserProcList *) malloc(sizeof (struct UserProcList));
+               if (ptr == NULL) {
+                       return;
+               }
 
                safestrncpy(ptr->user, usbuf->fullname, sizeof ptr->user);
                ptr->next = uplist;
@@ -120,14 +125,26 @@ void cbtm_backend(struct ctdluser *usbuf, void *data) {
                return;
        }
 
+       /* this is the calling mode where we do the processing */
+
        while (uplist != NULL) {
 
                if (CtdlGetUserLock(&us, uplist->user) == 0) {
-                       syslog(LOG_DEBUG, "Processing <%s>...", uplist->user);
+                       syslog(LOG_DEBUG, "Processing <%s> (%d)", uplist->user, us.uid);
                        if (us.uid == CTDLUID) {
-                               us.uid = (-1);
+                               us.uid = NATIVE_AUTH_UID;
                        }
                        CtdlPutUserLock(&us);
+                       if ((us.uid > 0) && (us.uid != NATIVE_AUTH_UID)) {              // if non-native auth , index by uid
+
+                               syslog(LOG_DEBUG, "\033[31m attaching %d to %s \033[0m", us.uid , us.fullname);
+
+
+                               StrBuf *claimed_id = NewStrBuf();
+                               StrBufPrintf(claimed_id, "uid:%d", us.uid);
+                               attach_extauth(&us, claimed_id);
+                               FreeStrBuf(&claimed_id);
+                       }
                }
 
                ptr = uplist;
@@ -137,12 +154,13 @@ void cbtm_backend(struct ctdluser *usbuf, void *data) {
 }
 
 /*
- * quick fix to change all CTDLUID users to (-1)
+ * Build extauth index of all users with uid-based join (system auth, LDAP auth)
+ * Also changes all users with a uid of CTDLUID to NATIVE_AUTH_UID (-1)
  */
-void convert_ctdluid_to_minusone(void) {
-       syslog(LOG_WARNING, "Applying uid changes");
-       ForEachUser(cbtm_backend, NULL);
-       cbtm_backend(NULL, NULL);
+void reindex_uids(void) {
+       syslog(LOG_WARNING, "upgrade: reindexing and applying uid changes");
+       ForEachUser(reindex_uids_backend, NULL);
+       reindex_uids_backend(NULL, NULL);
        return;
 }
 
@@ -202,7 +220,6 @@ void guess_time_zone(void) {
 }
 
 
-
 /*
  * Per-room callback function for ingest_old_roominfo_and_roompic_files()
  *
@@ -218,8 +235,6 @@ void iorarf_oneroom(char *roomname, char *infofile, char *picfile)
        long pic_msgnum = 0;
        char subject[SIZ];
 
-       syslog(LOG_DEBUG, "iorarf_oneroom( %s , %s , %s )", roomname, infofile, picfile);
-
        // Test for the presence of a legacy "room info file"
        if (!IsEmptyStr(infofile)) {
                fp = fopen(infofile, "r");
@@ -248,7 +263,7 @@ void iorarf_oneroom(char *roomname, char *infofile, char *picfile)
                        }
                }
                fclose(fp);
-               // unlink(filename);
+               if (info_msgnum > 0) unlink(infofile);
        }
 
        // Test for the presence of a legacy "room picture file" and import it.
@@ -279,7 +294,7 @@ void iorarf_oneroom(char *roomname, char *infofile, char *picfile)
                        }
                }
                fclose(fp);
-               // unlink(filename);
+               if (pic_msgnum > 0) unlink(picfile);
        }
 
        // Now we have the message numbers of our new banner and icon.  Record them in the room record.
@@ -296,7 +311,6 @@ void iorarf_oneroom(char *roomname, char *infofile, char *picfile)
 }
 
 
-
 struct iorarf_list {
        struct iorarf_list *next;
        char name[ROOMNAMELEN];
@@ -369,6 +383,7 @@ void ingest_old_roominfo_and_roompic_files(void)
                il = p;
        }
 
+       unlink(ctdl_info_dir);
 }
 
 
@@ -422,6 +437,90 @@ void update_config(void) {
 }
 
 
+/*
+ * Helper function for move_inet_addrs_from_vcards_to_user_records()
+ *
+ * Call this function as a ForEachUser backend in order to queue up
+ * user names, or call it with a null user to make it do the processing.
+ * This allows us to maintain the list as a static instead of passing
+ * pointers around.
+ */
+void miafvtur_backend(struct ctdluser *usbuf, void *data) {
+
+       struct miafvtur {
+               char name[64];
+               char emails[512];
+       };
+
+       static struct miafvtur *m = NULL;
+       static int num_m = 0;
+       static int alloc_m = 0;
+
+       /* this is the calling mode where we add a user */
+
+       if (usbuf != NULL) {
+               char primary_inet_email[512] = { 0 };
+               char other_inet_emails[512] = { 0 };
+               struct vCard *v = vcard_get_user(usbuf);
+               if (!v) return;
+               extract_inet_email_addrs(primary_inet_email, sizeof primary_inet_email, other_inet_emails, sizeof other_inet_emails, v, 1);
+               vcard_free(v);
+       
+               if ( (IsEmptyStr(primary_inet_email)) && (IsEmptyStr(other_inet_emails)) ) {
+                       return;
+               }
+
+               if (num_m >= alloc_m) {
+                       if (alloc_m == 0) {
+                               alloc_m = 100;
+                               m = malloc(sizeof(struct miafvtur) * alloc_m);
+                       }
+                       else {
+                               alloc_m *= 2;
+                               m = realloc(m, (sizeof(struct miafvtur) * alloc_m));
+                       }
+               }
+
+               strcpy(m[num_m].name, usbuf->fullname);
+               snprintf(m[num_m].emails, 512, "%s%s%s",
+                       (!IsEmptyStr(primary_inet_email) ? primary_inet_email : ""),
+                       ((!IsEmptyStr(primary_inet_email)&&(!IsEmptyStr(other_inet_emails))) ? "|" : ""),
+                       (!IsEmptyStr(other_inet_emails) ? other_inet_emails : "")
+               );
+               ++num_m;
+               return;
+       }
+
+       /* this is the calling mode where we do the processing */
+
+       int i;
+       struct ctdluser u;
+
+       for (i=0; i<num_m; ++i) {
+               syslog(LOG_DEBUG, "<%s> = <%s>", m[i].name, m[i].emails);
+               if (CtdlGetUser(&u, m[i].name) == 0) {
+                       safestrncpy(u.emailaddrs, m[i].emails, sizeof u.emailaddrs);
+                       CtdlPutUser(&u);
+               }
+       }
+       free(m);
+       num_m = 0;
+       alloc_m = 0;
+       return;
+}
+
+
+/*
+ * Prior to version 912 we kept a user's various Internet email addresses in their vCards.
+ * This function moves them over to the user record, which is where we keep them now.
+ */
+void move_inet_addrs_from_vcards_to_user_records(void)
+{
+       ForEachUser(miafvtur_backend, NULL);
+       miafvtur_backend(NULL, NULL);
+       CtdlRebuildDirectoryIndex();
+}
+
 
 /*
  * Based on the server version number reported by the existing database,
@@ -444,8 +543,8 @@ void check_server_upgrades(void) {
                syslog(LOG_EMERG, "This database is too old to be upgraded.  Citadel server will exit.");
                exit(EXIT_FAILURE);
        }
-       if ((CtdlGetConfigInt("MM_hosted_upgrade_level") > 000) && (CtdlGetConfigInt("MM_hosted_upgrade_level") < 608)) {
-               convert_ctdluid_to_minusone();
+       if ((CtdlGetConfigInt("MM_hosted_upgrade_level") > 000) && (CtdlGetConfigInt("MM_hosted_upgrade_level") < 913)) {
+               reindex_uids();
        }
        if ((CtdlGetConfigInt("MM_hosted_upgrade_level") > 000) && (CtdlGetConfigInt("MM_hosted_upgrade_level") < 659)) {
                rebuild_euid_index();
@@ -465,16 +564,16 @@ void check_server_upgrades(void) {
                        QRoom.QRdefaultview = VIEW_QUEUE;
                        CtdlPutRoom(&QRoom);
                }
-               if (!CtdlGetRoom(&QRoom, FNBL_QUEUE_ROOM)) {
-                       QRoom.QRdefaultview = VIEW_QUEUE;
-                       CtdlPutRoom(&QRoom);
-               }
        }
 
        if ((CtdlGetConfigInt("MM_hosted_upgrade_level") > 000) && (CtdlGetConfigInt("MM_hosted_upgrade_level") < 902)) {
                ingest_old_roominfo_and_roompic_files();
        }
 
+       if ((CtdlGetConfigInt("MM_hosted_upgrade_level") > 000) && (CtdlGetConfigInt("MM_hosted_upgrade_level") < 912)) {
+               move_inet_addrs_from_vcards_to_user_records();
+       }
+
        CtdlSetConfigInt("MM_hosted_upgrade_level", REV_LEVEL);
 
        /*