aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCara Salter <cara@devcara.com>2022-10-19 21:59:00 -0400
committerCara Salter <cara@devcara.com>2022-10-19 21:59:00 -0400
commit338c3d50f45598418e0ed29fed542e76cf071e0f (patch)
treedb9a10cc9f4e265f6079b3bae27580f998ba32fd
parentade9d8a0a58b3a94e4231c48d861236b1f17c859 (diff)
downloadcmud-338c3d50f45598418e0ed29fed542e76cf071e0f.tar.gz
cmud-338c3d50f45598418e0ed29fed542e76cf071e0f.zip
data: Fix deserialization
turns out you need to pass pointers to functions that require pointers, who knew?
-rw-r--r--src/data.c93
-rw-r--r--src/login.c5
-rw-r--r--src/util.c17
-rw-r--r--src/util.h2
4 files changed, 33 insertions, 84 deletions
diff --git a/src/data.c b/src/data.c
index 8c7ed53..8f292bb 100644
--- a/src/data.c
+++ b/src/data.c
@@ -22,18 +22,7 @@ int try_make_data_dirs() {
int try_load_plr(char *player_name, playerc_t *plr) {
int err = 0;
printf("Trying to make data directories...\n");
- err = try_make_data_dirs();
- if (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;
- }
- }
+ try_make_data_dirs();
printf("Done, opening file.\n");
@@ -42,11 +31,11 @@ int try_load_plr(char *player_name, playerc_t *plr) {
FILE *fp;
- if (fp = fopen(fname, "rb")) {
+ if (fp = fopen(fname, "r")) {
printf("Got fp\n");
- if (deserialize_player(fp, &plr->plr)) {
+ if (deserialize_player(fp, &plr->plr) == EOF) {
printf("Couldn't deserialize player\n");
return -1;
}
@@ -82,7 +71,7 @@ int try_write_plr(player_t *plr) {
char *fname;
asprintf(&fname, "data/players/%s.plr", plr->name);
- FILE *fp = fopen(fname, "wb");
+ FILE *fp = fopen(fname, "w");
char* buf = malloc(sizeof(player_t) + 1);
serialize_player(plr, fp);
@@ -110,7 +99,9 @@ int try_write_plr(player_t *plr) {
int serialize_player(player_t *plr, FILE* fp) {
int err = 0;
- 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);
+ 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);
return err;
}
@@ -136,70 +127,8 @@ int deserialize_player(FILE* fp, player_t* plr) {
enum ParsePlayerState state = ReadingData;
enum ParsePlayerType type = Xp;
- char* buf = malloc(1 << 10);
- printf("Allocated buf\n");
-
- while ((c = getc(fp) != EOF)) {
- if (c == ',') {
- state = Comma;
- printf("Found comma");
- }
- switch (state) {
- case ReadingData:
- strncat(buf, c, 1);
- break;
- case Comma:
- switch (type) {
- case Xp: ;
- int xp = atoi(buf);
- plr->xp = xp;
- state = ReadingData;
- type = Hp;
- memset(buf, 0, strlen(buf));
- break;
- case Hp: ;
- int hp = atoi(buf);
- plr->hp = hp;
- state = ReadingData;
- type = MaxHp;
- memset(buf, 0, strlen(buf));
- break;
- case MaxHp: ;
- int max_hp = atoi(buf);
- plr->max_hp = max_hp;
- state = ReadingData;
- type = Level;
- memset(buf, 0, strlen(buf));
- break;
- case Level: ;
- int level = atoi(buf);
- plr->level = level;
- state = ReadingData;
- type = LocationId;
- memset(buf, 0, strlen(buf));
- break;
- case LocationId: ;
- int location_id = atoi(buf);
- plr->location_id = location_id;
- state = ReadingData;
- type = PwHash;
- memset(buf, 0, strlen(buf));
- break;
- case PwHash: ;
- plr->pw_hash = malloc(1 << 5);
- strcpy(plr->pw_hash, buf);
- state = ReadingData;
- type = Name;
- memset(buf, 0, strlen(buf));
- break;
- case Name: ;
- plr->name = malloc(1 << 5);
- strcpy(plr->name, buf);
- // we're done here
- free(buf);
- return 0;
- }
- }
- }
- return err;
+ 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 b38fdd1..6ccebc7 100644
--- a/src/login.c
+++ b/src/login.c
@@ -73,6 +73,7 @@ int step_login(playerc_t *player, int conn_fd) {
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);
break;
case WantMakeAccount:
asprintf(&buf, "Welcome aboard %s! Why don't you start us off by giving me a password.\n", player->plr.name);
@@ -83,8 +84,8 @@ int step_login(playerc_t *player, int conn_fd) {
} 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));
-
+ err = argon2i_hash_encoded(32, 512, 1, buf, strlen(buf), "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.");
printf("%d\n", err);
diff --git a/src/util.c b/src/util.c
index 328a9cc..1f86b03 100644
--- a/src/util.c
+++ b/src/util.c
@@ -36,3 +36,20 @@ char* trimwhitespace(char* str) {
return str;
}
+
+/*
+ * Remove given section from string. Negative len means remove
+ * everything up to the end.
+ *
+ * based on SO answer https://stackoverflow.com/a/20346241
+ */
+int cut_str(char *str, int begin, int len)
+{
+ int l = strlen(str);
+
+ if (len < 0) len = l - begin;
+ if (begin + len > l) len = l - begin;
+ memmove(str + begin, str + begin + len, l - len + 1);
+
+ return len;
+}
diff --git a/src/util.h b/src/util.h
index 5ef6a2c..14fe005 100644
--- a/src/util.h
+++ b/src/util.h
@@ -20,3 +20,5 @@
#include <string.h>
char* trimwhitespace(char* str);
+
+int cut_str(char* str, int begin, int len);