diff options
author | Cara Salter <cara@devcara.com> | 2022-01-28 15:50:38 -0500 |
---|---|---|
committer | Cara Salter <cara@devcara.com> | 2022-01-28 15:50:38 -0500 |
commit | 4585ec623286900898a09b1714b3b5de38be4fec (patch) | |
tree | cd08eef867164c3c998485063e2af1ec55c51c5a /src/login.c | |
parent | aa80bc22117d385474c8593560368adf6b57f074 (diff) | |
download | cmud-4585ec623286900898a09b1714b3b5de38be4fec.tar.gz cmud-4585ec623286900898a09b1714b3b5de38be4fec.zip |
login: Add password authentication for registrations
Diffstat (limited to 'src/login.c')
-rw-r--r-- | src/login.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/src/login.c b/src/login.c index 96f2615..8016664 100644 --- a/src/login.c +++ b/src/login.c @@ -2,11 +2,13 @@ #include "login.h" #include "data.h" #include "server.h" +#include "util.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <unistd.h> +#include <argon2.h> void handle_player(int conn_fd) { printf("Let's make a new player object\n"); @@ -45,15 +47,13 @@ int step_login(playerc_t *player, int conn_fd) { printf("Waiting to receive...\n"); recv(player->conn, buf, 1024, 0); printf("Received!\n"); - err = try_load_plr(buf, player); + char* playername = trimwhitespace(buf); + err = try_load_plr(playername, player); printf("Finished trying to load the player\n"); if (err) { // File doesn't exist, let's create a player! - printf("test inner\n"); - send_to_fd(player->conn, "Test"); player->plr.name = (char *)malloc(32); - strcpy(player->plr.name, buf); - printf("test copy\n"); + strcpy(player->plr.name, playername); send_to_fd(player->conn, "Howdy! Want to introduce yourself? [y|n]\n"); recv(player->conn, buf, sizeof(buf), 0); if (buf[0] == 'y') { @@ -69,10 +69,33 @@ int step_login(playerc_t *player, int conn_fd) { continue; } case WantMakeAccount: - asprintf(buf, "Welcome aboard %s! Why don't you start us off by giving me a password.\n", player->plr.name); + asprintf(&buf, "Welcome aboard %s! Why don't you start us off by giving me a password.\n", player->plr.name); send_to_fd(player->conn, buf); + recv(player->conn, buf, sizeof(buf), 0); + if (strlen(buf) <= 5) { + send_to_fd(player->conn, "We're sorry, but passwords need to be at least 5 characters"); + } else { + player->plr.pw_hash = (char *)malloc(512); + char* hashbuf = (char *)malloc (1 << 5); + err = argon2i_hash_raw(32, 512, 1, buf, strlen(buf), "adSAaVWIueBwP2jHfAl7diRJ9ijC1Ysb9e920d6d9+I=", strlen("adSAaVWIueBwP2jHfAl7diRJ9ijC1Ysb9e920d6d9+I="), player->plr.pw_hash, sizeof(player->plr.pw_hash)); + + if (err != ARGON2_OK) { + send_to_fd(player->conn, "Uhhh, something happened. Try again."); + printf("%d\n", err); + player->state = LoggedOut; + continue; + } else { + send_to_fd(player->conn, "Sounds good! let's drop you into a world!"); + player->state = Complete; + player->plr.hp = player->plr.max_hp = 20; + player->plr.level = 1; + player->plr.xp = 0; + player->plr.location_id = 0; + try_write_plr(&player->plr); + continue; + } + } } - printf("test\n"); } return err; |