diff options
| author | Franklin Wei <git@fwei.tk> | 2015-12-03 17:57:36 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2015-12-03 17:57:36 -0500 |
| commit | 1c795424fde9839ab6ebfd49ce7a84ac946be3c0 (patch) | |
| tree | 2a33473d1ada10efe52b770ce9ec8ab2d452ec20 /src/auth.c | |
| download | netcosm-1c795424fde9839ab6ebfd49ce7a84ac946be3c0.zip netcosm-1c795424fde9839ab6ebfd49ce7a84ac946be3c0.tar.gz netcosm-1c795424fde9839ab6ebfd49ce7a84ac946be3c0.tar.bz2 netcosm-1c795424fde9839ab6ebfd49ce7a84ac946be3c0.tar.xz | |
initial commit
Diffstat (limited to 'src/auth.c')
| -rw-r--r-- | src/auth.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/auth.c b/src/auth.c new file mode 100644 index 0000000..55fe083 --- /dev/null +++ b/src/auth.c @@ -0,0 +1,68 @@ +#include "netcosm.h" + +/* add a user to the on-disk database */ + +/* + * format: + * [login]:[hash]\n +*/ + +void add_user(const char *name, const char *pass) +{ + int fd = open(USERFILE, O_WRONLY | O_CREAT | O_APPEND, 0600); + + int hash_len = gcry_md_get_algo_dlen(GCRY_MD_SHA512); + unsigned char *hash = malloc(hash_len); + gcry_md_hash_buffer(GCRY_MD_SHA512, hash, pass, strlen(pass)); + char *hex = malloc(hash_len * 2 + 1); + char *ptr = hex; + for(int i = 0; i < hash_len; ++i, ++ptr) + snprintf(ptr, 3, "%02x", hash[i]); + + flock(fd, LOCK_EX); + + dprintf(fd, "%s:%s\n", name, hex); + + flock(fd, LOCK_UN); +} + +bool valid_login_name(const char *name) +{ + while(*name) + { + char c = *name++; + switch(c) + { + case ':': + return false; + default: + break; + } + } + return true; +} + +void first_run_setup(void) +{ + printf("Welcome to NetCosm!\n"); + printf("Please set up the administrator account now.\n"); + + char *admin_name; + size_t len = 0; + do { + admin_name = NULL; + printf("Admin account name: "); + fflush(stdout); + getline(&admin_name, &len, stdin); + } while(!valid_login_name(admin_name)); + + printf("Admin password (DO NOT USE A VALUABLE PASSWORD): "); + fflush(stdout); + char *admin_pass = NULL; + len = 0; + getline(&admin_pass, &len, stdin); + + /* hash and store */ + + add_user(admin_name, admin_pass); +} |