ForEachUser() now uses a linked list
authorArt Cancro <ajc@citadel.org>
Sat, 28 Sep 2019 20:03:37 +0000 (16:03 -0400)
committerArt Cancro <ajc@citadel.org>
Sat, 28 Sep 2019 20:03:37 +0000 (16:03 -0400)
citadel/modules/xmpp/xmpp_sasl_service.c
citadel/user_ops.c

index 78e05eebe0374bb465be61612623adbe9991cdc8..a6940d9ec4ca495b10b72225766b8315d18372b6 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Note: RFC3920 says we "must" support DIGEST-MD5 but we only support PLAIN.
  *
- * Copyright (c) 2007-2018 by Art Cancro
+ * Copyright (c) 2007-2019 by Art Cancro
  *
  * 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.
@@ -63,7 +63,6 @@ int xmpp_auth_plain(char *authstring)
        char pass[256];
        int result;
        long len;
-       int i;
 
        /* Take apart the authentication string */
        memset(pass, 0, sizeof(pass));
@@ -72,25 +71,9 @@ int xmpp_auth_plain(char *authstring)
        safestrncpy(ident, decoded_authstring, sizeof ident);
        safestrncpy(user, &decoded_authstring[strlen(ident) + 1], sizeof user);
        len = safestrncpy(pass, &decoded_authstring[strlen(ident) + strlen(user) + 2], sizeof pass);
-       if (len < 0)
+       if (len < 0) {
                len = -len;
-
-       /* If there are underscores in either string, change them to spaces.  Some clients
-        * do not allow spaces so we can tell the user to substitute underscores if their
-        * login name contains spaces.
-        */
-       for (i=0; ident[i]!=0; ++i) {
-               if (ident[i] == '_') {
-                       ident[i] = ' ';
-               }
        }
-       for (i=0; user[i]!=0; ++i) {
-               if (user[i] == '_') {
-                       user[i] = ' ';
-               }
-       }
-
-       /* Now attempt authentication */
 
        if (!IsEmptyStr(ident)) {
                result = CtdlLoginExistingUser(ident);
index aaf26a5b3a9b6fe775124121832087a8cfab8061..9a39b06b6754b7b4c940fbd0e06acf0959476411 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
@@ -1194,17 +1195,15 @@ 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 *f = NULL;
 
        cdb_rewind(CDB_USERS);
 
@@ -1213,19 +1212,19 @@ void ForEachUser(void (*CallBack) (char *, void *out_data), void *in_data)
                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));
-                       }
-                       strcpy(usernames[num_users-1].username, usptr->fullname);
-                       usernames[num_users-1].version = usptr->version;
+                       f = malloc(sizeof(struct feu));
+                       f->next = usernames;
+                       strncpy(f->username, usptr->fullname, USERNAME_SIZE);
+                       usernames = f;
                }
        }
 
        // Phase 2 : perform the callback for each username
-       for (i=0; i<num_users; ++i) {
-               (*CallBack) (usernames[i].username, in_data);
+       while (usernames != NULL) {
+               (*CallBack) (usernames->username, in_data);
+               f = usernames;
+               usernames = usernames->next;
+               free(f);
        }
 
        free(usernames);