From 6d624cc4161ba0ce4892a7e7aaee7fd89dffa245 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Sat, 28 Sep 2019 16:03:37 -0400 Subject: [PATCH] ForEachUser() now uses a linked list --- citadel/modules/xmpp/xmpp_sasl_service.c | 21 ++----------- citadel/user_ops.c | 39 ++++++++++++------------ 2 files changed, 21 insertions(+), 39 deletions(-) diff --git a/citadel/modules/xmpp/xmpp_sasl_service.c b/citadel/modules/xmpp/xmpp_sasl_service.c index 78e05eebe..a6940d9ec 100644 --- a/citadel/modules/xmpp/xmpp_sasl_service.c +++ b/citadel/modules/xmpp/xmpp_sasl_service.c @@ -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); diff --git a/citadel/user_ops.c b/citadel/user_ops.c index aaf26a5b3..9a39b06b6 100644 --- a/citadel/user_ops.c +++ b/citadel/user_ops.c @@ -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; iusername, in_data); + f = usernames; + usernames = usernames->next; + free(f); } free(usernames); -- 2.30.2