From 338c3d50f45598418e0ed29fed542e76cf071e0f Mon Sep 17 00:00:00 2001 From: Cara Salter Date: Wed, 19 Oct 2022 21:59:00 -0400 Subject: data: Fix deserialization turns out you need to pass pointers to functions that require pointers, who knew? --- src/data.c | 93 ++++++++----------------------------------------------------- src/login.c | 5 ++-- src/util.c | 17 +++++++++++ src/util.h | 2 ++ 4 files changed, 33 insertions(+), 84 deletions(-) (limited to 'src') 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 char* trimwhitespace(char* str); + +int cut_str(char* str, int begin, int len); -- cgit v1.2.3