The user principal identity is now used as the JID in all XMPP protocol stanzas.
[citadel.git] / citadel / user_ops.c
index aaf26a5b3a9b6fe775124121832087a8cfab8061..0507fc6baca99c4132d008d1f7f32bf91414addb 100644 (file)
@@ -31,6 +31,7 @@
 int chkpwd_write_pipe[2];
 int chkpwd_read_pipe[2];
 
+
 /*
  * Trim a string down to the maximum username size and return the new length
  */
@@ -204,7 +205,7 @@ int rename_user(char *oldname, char *newname) {
 
 /*
  * Convert a username into the format used as a database key prior to version 928
- * (This is only used during database upgrade)
+ * This only gets called by reindex_user_928()
  */
 void makeuserkey_pre928(char *key, const char *username, long len) {
        int i;
@@ -221,7 +222,7 @@ void makeuserkey_pre928(char *key, const char *username, long len) {
 
 /*
  * Read a user record using the pre-v928 index format, and write it back using the v928-and-higher index format.
- * This ONLY gets called by...
+ * This ONLY gets called during an upgrade from version <928 to version >=928.
  */
 void reindex_user_928(char *username, void *out_data) {
 
@@ -234,7 +235,7 @@ void reindex_user_928(char *username, void *out_data) {
        makeuserkey_pre928(oldkey, username, len);
        makeuserkey(newkey, username, len);
 
-       syslog(LOG_DEBUG, "user_ops: reindex_user_928 <%s> <%s> <%s>", username, oldkey, newkey);
+       syslog(LOG_DEBUG, "user_ops: reindex_user_928: %s <%s> --> <%s>", username, oldkey, newkey);
 
        // Fetch the user record using the old index format
        cdbus = cdb_fetch(CDB_USERS, oldkey, strlen(oldkey));
@@ -242,7 +243,7 @@ void reindex_user_928(char *username, void *out_data) {
                syslog(LOG_INFO, "user_ops: <%s> not found, were they already reindexed?", username);
                return;
        }
-       memcpy(&usbuf, cdbus->ptr, ((cdbus->len > sizeof(struct ctdluser)) ?  sizeof(struct ctdluser) : cdbus->len));
+       memcpy(&usbuf, cdbus->ptr, ((cdbus->len > sizeof(struct ctdluser)) ? sizeof(struct ctdluser) : cdbus->len));
        cdb_free(cdbus);
 
        // delete the old record
@@ -696,6 +697,12 @@ void do_login(void)
                AutoGenerateEmailAddressForUser(&CC->user);
        }
 
+       /* Populate the user principal identity, which is consistent and never aliased */
+       strcpy(CC->cs_principal_id, "wowowowow");
+       makeuserkey(CC->cs_principal_id, CC->user.fullname, sizeof CC->user.fullname);
+       strcat(CC->cs_principal_id, "@");
+       strcat(CC->cs_principal_id, CtdlGetConfigStr("c_fqdn"));
+
        /*
         * Populate cs_inet_email and cs_inet_other_emails with valid email addresses from the user record
         */
@@ -1194,41 +1201,46 @@ int CtdlForgetThisRoom(void) {
  */
 void ForEachUser(void (*CallBack) (char *, void *out_data), void *in_data)
 {
+       struct cdbdata *cdbus;
+       struct ctdluser *usptr;
+
        struct feu {
+               struct feu *next;
                char username[USERNAME_SIZE];
-               int version;
        };
-
-       struct cdbdata *cdbus;
-       struct ctdluser *usptr;
-       int i = 0;
-       struct feu *usernames = NULL;
-       int num_users = 0;
-       int num_users_alloc = 0;
+       struct feu *ufirst = NULL;
+       struct feu *ulast = NULL;
+       struct feu *f = NULL;
 
        cdb_rewind(CDB_USERS);
 
-       // Phase 1 : load list of usernames
+       // Phase 1 : build a linked list of all our user account names
        while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) {
                usptr = (struct ctdluser *) cdbus->ptr;
 
                if (strlen(usptr->fullname) > 0) {
-                       ++num_users;
-                       if (num_users > num_users_alloc) {
-                               num_users_alloc = ((num_users_alloc == 0) ? 1 : (num_users_alloc * 2));
-                               usernames = realloc(usernames, num_users_alloc * sizeof(struct feu));
+                       f = malloc(sizeof(struct feu));
+                       f->next = NULL;
+                       strncpy(f->username, usptr->fullname, USERNAME_SIZE);
+
+                       if (ufirst == NULL) {
+                               ufirst = f;
+                               ulast = f;
+                       }
+                       else {
+                               ulast->next = f;
+                               ulast = f;
                        }
-                       strcpy(usernames[num_users-1].username, usptr->fullname);
-                       usernames[num_users-1].version = usptr->version;
                }
        }
 
-       // Phase 2 : perform the callback for each username
-       for (i=0; i<num_users; ++i) {
-               (*CallBack) (usernames[i].username, in_data);
+       // Phase 2 : perform the callback for each user while de-allocating the list
+       while (ufirst != NULL) {
+               (*CallBack) (ufirst->username, in_data);
+               f = ufirst;
+               ufirst = ufirst->next;
+               free(f);
        }
-
-       free(usernames);
 }