aboutsummaryrefslogtreecommitdiff
path: root/src/auth.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2015-12-03 17:57:36 -0500
committerFranklin Wei <git@fwei.tk>2015-12-03 17:57:36 -0500
commit1c795424fde9839ab6ebfd49ce7a84ac946be3c0 (patch)
tree2a33473d1ada10efe52b770ce9ec8ab2d452ec20 /src/auth.c
downloadnetcosm-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.c68
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);
+}