aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCara Salter <cara@devcara.com>2022-10-24 13:21:37 -0400
committerCara Salter <cara@devcara.com>2022-10-24 13:21:37 -0400
commitf0f0efcafeec83850add53712eb463c8ff5ee9be (patch)
tree709ad1678f10788c57c713e6683f5be2b780479b
parent338c3d50f45598418e0ed29fed542e76cf071e0f (diff)
downloadcmud-f0f0efcafeec83850add53712eb463c8ff5ee9be.tar.gz
cmud-f0f0efcafeec83850add53712eb463c8ff5ee9be.zip
login: Login complete!
segfaults... so many segfaults but i'm learning so that's what matters!
-rw-r--r--src/data.c7
-rw-r--r--src/login.c20
-rw-r--r--src/main.c2
-rw-r--r--src/server.c3
-rw-r--r--src/server.h2
5 files changed, 28 insertions, 6 deletions
diff --git a/src/data.c b/src/data.c
index 8f292bb..de0c5b9 100644
--- a/src/data.c
+++ b/src/data.c
@@ -101,7 +101,7 @@ int serialize_player(player_t *plr, FILE* fp) {
printf("%s\n", plr->pw_hash);
- err = fprintf(fp, "%d:%d:%d:%d:%d:%s:%s", plr->xp, plr->hp, plr->max_hp, plr->level, plr->location_id, plr->pw_hash, plr->name);
+ err = fprintf(fp, "%d:%d:%d:%d:%d:%s %s", plr->xp, plr->hp, plr->max_hp, plr->level, plr->location_id, plr->pw_hash, plr->name);
return err;
}
@@ -127,7 +127,10 @@ int deserialize_player(FILE* fp, player_t* plr) {
enum ParsePlayerState state = ReadingData;
enum ParsePlayerType type = Xp;
- err = fscanf(fp, "%d:%d:%d:%d:%d:%s:%s", &(plr->xp), &(plr->hp), &(plr->max_hp), &(plr->level), &(plr->location_id), plr->pw_hash, plr->name);
+ plr->pw_hash = (char*) malloc(512);
+ plr->name = (char*) malloc(32);
+
+ err = fscanf(fp, "%d:%d:%d:%d:%d:%s %s", &(plr->xp), &(plr->hp), &(plr->max_hp), &(plr->level), &(plr->location_id), plr->pw_hash, plr->name);
return err;
diff --git a/src/login.c b/src/login.c
index 6ccebc7..8214234 100644
--- a/src/login.c
+++ b/src/login.c
@@ -72,19 +72,33 @@ int step_login(playerc_t *player, int conn_fd) {
case EnterPassword: ;
asprintf(&buf, "Welcome back %s! Please enter your password, so we can confirm it.\n", player->plr.name);
send_to_fd(player->conn, buf);
- recv(player->conn, buf, sizeof(buf), 0);
- printf("%s\n", player->plr.pw_hash);
+ memset(buf, '\0', 1 << 9);
+ recv(player->conn, buf, sizeof(buf), 0);
+ char* pw = trimwhitespace(buf);
+ int res = argon2i_verify(player->plr.pw_hash, pw, strlen(pw));
+ printf("%d\n", res);
+ if (res == ARGON2_OK) {
+ // The password is good!
+ send_to_fd(player->conn, "That looks good to me! Let's get you loaded in\n");
+ player->state = Complete;
+ } else {
+ // Password is incorrect
+ send_to_fd(player->conn, "Password incorrect, please try again\n");
+ break;
+ }
break;
case WantMakeAccount:
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);
+ memset(buf, '\0', 1 << 9);
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_encoded(32, 512, 1, buf, strlen(buf), "adSAaVWIueBwP2jHfAl7diRJ9ijC1Ysb9e920d6d9+I=", strlen("adSAaVWIueBwP2jHfAl7diRJ9ijC1Ysb9e920d6d9+I="), 32, player->plr.pw_hash, 512);
+ char* pw = trimwhitespace(buf);
+ err = argon2i_hash_encoded(32, 512, 1, pw, strlen(pw), "adSAaVWIueBwP2jHfAl7diRJ9ijC1Ysb9e920d6d9+I=", strlen("adSAaVWIueBwP2jHfAl7diRJ9ijC1Ysb9e920d6d9+I="), 32, player->plr.pw_hash, 512);
if (err != ARGON2_OK) {
send_to_fd(player->conn, "Uhhh, something happened. Try again.");
diff --git a/src/main.c b/src/main.c
index 856b1c6..551962b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -27,5 +27,7 @@ int main() {
}
}
+ closeServer(0);
+
return 0;
}
diff --git a/src/server.c b/src/server.c
index 632cb28..87cf6b7 100644
--- a/src/server.c
+++ b/src/server.c
@@ -11,7 +11,8 @@
static int socket_fd;
void closeServer(int dummy) {
- shutdown(socket_fd, 2);
+ close(socket_fd);
+ printf("Caught SIGINT\n");
}
int server_listen(server_t *server) {
diff --git a/src/server.h b/src/server.h
index 5392f56..aacc88e 100644
--- a/src/server.h
+++ b/src/server.h
@@ -14,4 +14,6 @@ int server_accept(server_t *server);
int send_to_fd(int fd, char *msg);
+void closeServer(int dummy);
+
#endif // SERVER_H_