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 | |
parent | aa80bc22117d385474c8593560368adf6b57f074 (diff) | |
download | cmud-4585ec623286900898a09b1714b3b5de38be4fec.tar.gz cmud-4585ec623286900898a09b1714b3b5de38be4fec.zip |
login: Add password authentication for registrations
Diffstat (limited to 'src')
-rw-r--r-- | src/data.c | 17 | ||||
-rw-r--r-- | src/login.c | 37 | ||||
-rw-r--r-- | src/login.h | 3 | ||||
-rw-r--r-- | src/util.c | 38 | ||||
-rw-r--r-- | src/util.h | 22 |
5 files changed, 104 insertions, 13 deletions
@@ -6,6 +6,7 @@ #include <stdio.h> #include <string.h> #include <sys/stat.h> +#include <unistd.h> int try_make_data_dirs() { int err = 0; @@ -39,7 +40,6 @@ int try_load_plr(char *player_name, playerc_t *plr) { FILE *fp; if (fp = fopen(fname, "rb")) { - printf("%p", fp); printf("Got fp\n"); @@ -59,17 +59,24 @@ int try_write_plr(player_t *plr) { err = try_make_data_dirs(); if (err) { - perror("creating data directories"); - printf("Could not create data/\n"); - return err; + switch (err) { + // Now the errors that continue will be from I/O, which we can use to + // figure out if the file exists in login + case EACCES: /* No permissions***************************************/ + printf("No permissions to create directories\n"); + return -1; + default: /* Do nothing because this is fine****************************/ + break; + } } char *fname; - asprintf(&fname, "data/players/%s.plr", *plr->name); + asprintf(&fname, "data/players/%s.plr", plr->name); FILE *fp = fopen(fname, "wb"); fwrite(&plr, sizeof(player_t), 1, fp); + fsync(fp); return err; } 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; diff --git a/src/login.h b/src/login.h index 50a5b23..b3e60a0 100644 --- a/src/login.h +++ b/src/login.h @@ -16,13 +16,14 @@ typedef struct player { int level; int location_id; + char *pw_hash; char *name; } player_t; typedef struct player_conn { int conn; enum login_state state; - struct player plr; + player_t plr; } playerc_t; int step_login(playerc_t *player, int conn_fd); diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..328a9cc --- /dev/null +++ b/src/util.c @@ -0,0 +1,38 @@ +/* + * ===================================================================================== + * + * Filename: util.c + * + * Description: + * + * Version: 1.0 + * Created: 01/28/2022 03:47:07 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), + * Organization: + * + * ===================================================================================== + */ +#include <stdlib.h> +#include <ctype.h> +#include <string.h> + +char* trimwhitespace(char* str) { + char* end; + + // Trim leading spaces + while(isspace((unsigned char) *str)) str++; + + if (*str == 0) // All spaces? + return str; + + // trailing spaces + end = str + strlen(str) -1; + while (end > str && isspace((unsigned char)* end)) end--; + + end[1] = '\0'; + + return str; +} diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..5ef6a2c --- /dev/null +++ b/src/util.h @@ -0,0 +1,22 @@ +/* + * ===================================================================================== + * + * Filename: util.h + * + * Description: Helpful utility functions for dealing with common issues + * + * Version: 1.0 + * Created: 01/28/2022 03:43:56 PM + * Revision: none + * Compiler: gcc + * + * Author: Cara Salter (cara@devcara.com), + * Organization: Muirrum Software Workshops + * + * ===================================================================================== + */ + +#include <ctype.h> +#include <string.h> + +char* trimwhitespace(char* str); |