summaryrefslogtreecommitdiff
path: root/data.c
diff options
context:
space:
mode:
authordefault <nobody@localhost>2023-10-13 06:33:12 +0200
committerdefault <nobody@localhost>2023-10-13 06:33:12 +0200
commit253e7f9eaa3f3279f2a8639949f74acf0797de33 (patch)
treebb7ff4868154bdad2325c27fdd0b4c55083dd5f4 /data.c
parente127269a4a095c8628cef8e83c10588fd91666da (diff)
Don't allow creating users which user name strings only differ in case.
Diffstat (limited to 'data.c')
-rw-r--r--data.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/data.c b/data.c
index 02e5234..f06e99c 100644
--- a/data.c
+++ b/data.c
@@ -154,12 +154,34 @@ int user_open(snac *snac, const char *uid)
memset(snac, '\0', sizeof(struct _snac));
if (validate_uid(uid)) {
- xs *cfg_file;
+ xs *cfg_file = NULL;
FILE *f;
- snac->uid = xs_str_new(uid);
+ xs *t = xs_fmt("%s/user/%s", srv_basedir, uid);
- snac->basedir = xs_fmt("%s/user/%s", srv_basedir, uid);
+ if (mtime(t) == 0.0) {
+ /* user folder does not exist; try with a different case */
+ xs *lcuid = xs_tolower_i(xs_dup(uid));
+ xs *ulist = user_list();
+ xs_list *p = ulist;
+ xs_str *v;
+
+ while (xs_list_iter(&p, &v)) {
+ xs *v2 = xs_tolower_i(xs_dup(v));
+
+ if (strcmp(lcuid, v2) == 0) {
+ snac->uid = xs_dup(v);
+ break;
+ }
+ }
+ }
+ else
+ snac->uid = xs_str_new(uid);
+
+ if (snac->uid == NULL)
+ return ret;
+
+ snac->basedir = xs_fmt("%s/user/%s", srv_basedir, snac->uid);
cfg_file = xs_fmt("%s/user.json", snac->basedir);
@@ -176,7 +198,7 @@ int user_open(snac *snac, const char *uid)
fclose(f);
if (snac->key != NULL) {
- snac->actor = xs_fmt("%s/%s", srv_baseurl, uid);
+ snac->actor = xs_fmt("%s/%s", srv_baseurl, snac->uid);
snac->md5 = xs_md5_hex(snac->actor, strlen(snac->actor));
/* everything is ok right now */