diff options
| author | Franklin Wei <git@fwei.tk> | 2016-01-08 22:27:43 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2016-01-08 22:27:43 -0500 |
| commit | 50134c46dc337c35b8ecf78b3c5b4308cf8fb791 (patch) | |
| tree | 89d73bca1951129ec7e15b642e2fa6c85567f872 /src/userdb.c | |
| parent | 2819d11ceeb1ac739ed5f17ccb0abab63f494299 (diff) | |
| download | netcosm-50134c46dc337c35b8ecf78b3c5b4308cf8fb791.zip netcosm-50134c46dc337c35b8ecf78b3c5b4308cf8fb791.tar.gz netcosm-50134c46dc337c35b8ecf78b3c5b4308cf8fb791.tar.bz2 netcosm-50134c46dc337c35b8ecf78b3c5b4308cf8fb791.tar.xz | |
some stuff
Diffstat (limited to 'src/userdb.c')
| -rw-r--r-- | src/userdb.c | 68 |
1 files changed, 53 insertions, 15 deletions
diff --git a/src/userdb.c b/src/userdb.c index 4315da4..c58771f 100644 --- a/src/userdb.c +++ b/src/userdb.c @@ -4,8 +4,6 @@ static void *map = NULL; static char *db_file = NULL; static size_t entries = 0; -#define DELIM ":" - /* * the user DB is stored on disk as an ASCII database * @@ -20,12 +18,11 @@ void userdb_init(const char *file) /* FILE* for getline() */ FILE *f = fopen(file, "r"); map = hash_init(256, hash_djb, compare_strings); - hash_setfreekey_cb(map, free); hash_setfreedata_cb(map, free); char *format; - asprintf(&format, "%%ms:%%%d%%s:%%%d%%s:%%d\n", - SALT_LEN, AUTH_HASHLEN * 2); + asprintf(&format, "%%%d[a-z0-9]:%%%d[A-Z]:%%%ds:%%d\n", + MAX_NAME_LEN, SALT_LEN, AUTH_HASHLEN * 2); if(f) { @@ -33,11 +30,13 @@ void userdb_init(const char *file) { struct userdata_t *data = calloc(1, sizeof(*data)); - if(fscanf(f, format, - &data->username, - data->salt, - data->passhash, - &data->priv) != 6) + int ret = fscanf(f, format, + &data->username, + data->salt, + data->passhash, + &data->priv); + + if(ret != 4) break; hash_insert(map, data->username, data); @@ -60,7 +59,8 @@ void userdb_write(const char *file) ptr = NULL; if(!user) break; - dprintf(fd, "%s:%*s:%*s:%d\n", user->username, + dprintf(fd, "%*s:%*s:%*s:%d\n", + MAX_NAME_LEN, user->username, SALT_LEN, user->salt, AUTH_HASHLEN*2, user->passhash, user->priv); @@ -73,18 +73,25 @@ struct userdata_t *userdb_lookup(const char *key) return hash_lookup(map, key); } -void userdb_remove(const char *key) +bool userdb_remove(const char *key) { if(hash_remove(map, key)) + { --entries; + userdb_write(db_file); + return true; + } + return false; } struct userdata_t *userdb_add(struct userdata_t *data) { struct userdata_t *new = calloc(1, sizeof(*new)); /* only in C! */ memcpy(new, data, sizeof(*new)); - new->username = strdup(data->username); + strncpy(new->username, data->username, sizeof(new->username)); + struct userdata_t *ret; + if((ret = hash_insert(map, new->username, new))) /* failure */ { hash_remove(map, new->username); @@ -93,19 +100,50 @@ struct userdata_t *userdb_add(struct userdata_t *data) userdb_write(db_file); if(!ret) - --entries; + ++entries; return ret; } void userdb_shutdown(void) { - hash_free(map); + debugf("shutting down userdb with %d entries\n", entries); + if(map) + { + hash_free(map); + map = NULL; + } if(db_file) + { free(db_file); + db_file = NULL; + } } size_t userdb_size(void) { return entries; } + +/* child request wrappers */ + +/* loop until we can return a user data structure */ +struct userdata_t *userdb_request_lookup(const char *name) +{ + send_master(REQ_GETUSERDATA, name, strlen(name) + 1); + if(reqdata_type == TYPE_USERDATA) + return &returned_reqdata.userdata; + return NULL; +} + +bool userdb_request_add(struct userdata_t *data) +{ + send_master(REQ_ADDUSERDATA, data, sizeof(*data)); + return returned_reqdata.boolean; +} + +bool userdb_request_remove(const char *name) +{ + send_master(REQ_DELUSERDATA, name, strlen(name) + 1); + return returned_reqdata.boolean; +} |