X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=citadel%2Fuser_ops.c;h=aaf26a5b3a9b6fe775124121832087a8cfab8061;hp=0a74759ae9ba3653a99e70c8029f6a23ecc29569;hb=0c90ed3253337bfd864b4d780df4701d0cc0f2c4;hpb=cfa09472a585c534fd05c8a35811cff9ef18965f diff --git a/citadel/user_ops.c b/citadel/user_ops.c index 0a74759ae..aaf26a5b3 100644 --- a/citadel/user_ops.c +++ b/citadel/user_ops.c @@ -49,18 +49,22 @@ long cutusername(char *username) { /* * makeuserkey() - convert a username into the format used as a database key - * (it's just the username converted into lower case) + * (Key format is the username with all non-alphanumeric characters removed, and converted to lower case.) */ void makeuserkey(char *key, const char *username, long len) { int i; + int keylen = 0; if (len >= USERNAME_SIZE) { syslog(LOG_INFO, "Username too long: %s", username); len = USERNAME_SIZE - 1; } for (i=0; i<=len; ++i) { - key[i] = tolower(username[i]); + if (isalnum((username[i]))) { + key[keylen++] = tolower(username[i]); + } } + key[keylen++] = 0; } @@ -198,6 +202,57 @@ 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) + */ +void makeuserkey_pre928(char *key, const char *username, long len) { + int i; + + if (len >= USERNAME_SIZE) { + syslog(LOG_INFO, "Username too long: %s", username); + len = USERNAME_SIZE - 1; + } + for (i=0; i<=len; ++i) { + key[i] = tolower(username[i]); + } +} + + +/* + * 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... + */ +void reindex_user_928(char *username, void *out_data) { + + char oldkey[USERNAME_SIZE]; + char newkey[USERNAME_SIZE]; + struct cdbdata *cdbus; + long len = cutusername(username); + struct ctdluser usbuf; + + makeuserkey_pre928(oldkey, username, len); + makeuserkey(newkey, username, len); + + 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)); + if (cdbus == NULL) { + 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)); + cdb_free(cdbus); + + // delete the old record + cdb_delete(CDB_USERS, oldkey, strlen(oldkey)); + + // write the new record + cdb_store(CDB_USERS, newkey, strlen(newkey), &usbuf, sizeof(struct ctdluser)); +} + + /* * Index-generating function used by Ctdl[Get|Set]Relationship */ @@ -1170,9 +1225,6 @@ void ForEachUser(void (*CallBack) (char *, void *out_data), void *in_data) // Phase 2 : perform the callback for each username for (i=0; i