aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCara Salter <cara@devcara.com>2022-01-28 15:50:38 -0500
committerCara Salter <cara@devcara.com>2022-01-28 15:50:38 -0500
commit4585ec623286900898a09b1714b3b5de38be4fec (patch)
treecd08eef867164c3c998485063e2af1ec55c51c5a
parentaa80bc22117d385474c8593560368adf6b57f074 (diff)
downloadcmud-4585ec623286900898a09b1714b3b5de38be4fec.tar.gz
cmud-4585ec623286900898a09b1714b3b5de38be4fec.zip
login: Add password authentication for registrations
-rw-r--r--Makefile3
-rw-r--r--src/data.c17
-rw-r--r--src/login.c37
-rw-r--r--src/login.h3
-rw-r--r--src/util.c38
-rw-r--r--src/util.h22
6 files changed, 106 insertions, 14 deletions
diff --git a/Makefile b/Makefile
index 855e7a6..9907492 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,8 @@
CC=gcc
CFLAGS=-I. -static
-SRCS=src/main.c src/login.c src/server.c src/data.c
+SRCS=src/main.c src/login.c src/server.c src/data.c src/util.c
BIN=cmud
+LFLAGS=-largon2 -lconfig
%.o: %.c
$(CC) -c -o $@ $< $(CFLAGS)
diff --git a/src/data.c b/src/data.c
index dabdee7..3884170 100644
--- a/src/data.c
+++ b/src/data.c
@@ -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);