String clue_down[MAX_PUZZLE_SIZE][MAX_PUZZLE_SIZE];
int grid_size;
bool grid_frozen;
- char hashed_password[256];
- char salt[256];
+ char hashed_master_password[256];
+ char hashed_solution_password[256];
} Puzzle;
/* The player data struct type - for the player app */
char char_ans[MAX_PUZZLE_SIZE][MAX_PUZZLE_SIZE];
int cur_row;
int cur_col;
+ bool solution_revealed;
enum ORIENTATION current_movement;
} MainPlayerData;
return n;
}
-/* verify password */
-bool verify_password (Puzzle *p, const char* password)
+/* verify solution password */
+bool verify_solution_password (Puzzle *p, const char* password)
{
/* no password set */
- if (strcmp (p->hashed_password, "\0") == 0)
+ if (strcmp (p->hashed_solution_password, "\0") == 0)
return true;
/* hash the user input password and compare it with the stored password */
- unsigned char* hashed_password;
+ unsigned char* hashed_sol_password;
unsigned int len;
digest_message ((const unsigned char *)password, strlen(password),
- &hashed_password, &len);
+ &hashed_sol_password, &len);
char hashed_hex_pwd[256] = { (char) NULL };
- to_hexadecimal (hashed_hex_pwd, hashed_password, len);
+ to_hexadecimal (hashed_hex_pwd, hashed_sol_password, len);
- if (strcmp (p->hashed_password, hashed_hex_pwd) == 0)
+ if (strcmp (p->hashed_solution_password, hashed_hex_pwd) == 0)
return true;
return false;
}
-/* Set or reset password for puzzle */
-void set_puzzle_password (Puzzle *p, const char *password)
+
+/* verify master password */
+bool verify_master_password (Puzzle *p, const char* password)
+{
+ /* no password set */
+ if (strcmp (p->hashed_master_password, "\0") == 0)
+ return true;
+
+ /* hash the user input password and compare it with the stored password */
+ unsigned char* hashed_mas_password;
+ unsigned int len;
+ digest_message ((const unsigned char *)password, strlen(password),
+ &hashed_mas_password, &len);
+ char hashed_hex_pwd[256] = { (char) NULL };
+ to_hexadecimal (hashed_hex_pwd, hashed_mas_password, len);
+
+ if (strcmp (p->hashed_master_password, hashed_hex_pwd) == 0)
+ return true;
+
+ return false;
+}
+
+/* Set or reset solution password for puzzle */
+void set_solution_password (Puzzle *p, const char *password)
{
/* if it is a null string, reset the password */
if (strcmp (password, "\0") == 0)
+ strcpy (p->hashed_solution_password, "\0");
+ else
{
- strcpy (p->hashed_password, "\0");
- strcpy (p->salt, "\0");
+
+ unsigned char* hashedpwd;
+ unsigned int len;
+ digest_message ((const unsigned char *)password, strlen(password),
+ &hashedpwd, &len);
+ /* the hashedpwd contains binary data - we will convert it to
+ hexadecimal data and store in file */
+
+ to_hexadecimal (p->hashed_solution_password, hashedpwd, len);
}
+}
+
+/* Set or reset master password for puzzle */
+void set_master_password (Puzzle *p, const char *password)
+{
+ /* if it is a null string, reset the password */
+ if (strcmp (password, "\0") == 0)
+ strcpy (p->hashed_master_password, "\0");
else
{
/* the hashedpwd contains binary data - we will convert it to
hexadecimal data and store in file */
- to_hexadecimal (p->hashed_password, hashedpwd, len);
- printf ("%s\n", p->hashed_password);
-
- strcpy (p->salt, "\0");
-
+ to_hexadecimal (p->hashed_master_password, hashedpwd, len);
}
}
strcpy (p->clue_down[i][j], "");
}
}
- strcpy (p->hashed_password, "\0");
- strcpy (p->salt, "\0");
+ strcpy (p->hashed_master_password, "\0");
+ strcpy (p->hashed_solution_password, "\0");
}
/* save the puzzle to a file */
-void save_puzzle (Puzzle *puzzle, const char* file) {
+void save_puzzle (Puzzle *puzzle, const char* file)
+{
FILE *outfile;
/* First output the uncompressed contents to a temp file */
outfile = tmpfile ();
/* whether grid is frozen or not */
fprintf (outfile, "%d\n", puzzle->grid_frozen);
/* the hashed password */
- fprintf (outfile, "%s\n", puzzle->hashed_password);
- /* the salt */
- fprintf (outfile, "%s\n", puzzle->salt);
+ fprintf (outfile, "%s\n", puzzle->hashed_master_password);
+ /* the hashed_solution_password */
+ fprintf (outfile, "%s\n", puzzle->hashed_solution_password);
/* First output the grid characters columns/rows */
for (int i = 0; i < puzzle->grid_size; i ++)
}
/* read the puzzle from a file */
-Puzzle load_puzzle (const char* file) {
+Puzzle load_puzzle (const char* file)
+{
/* First open the GZip file */
gzFile insourcefile = gzopen (file, "rb");
if (insourcefile == NULL)
p.grid_frozen = atoi (line) == 0 ? false : true ;
fgets (line, MAX_CLUE_LENGTH + 10, infile);
if (strlen (line) != 1)
- strcpy (p.hashed_password, strtok (line, "\n"));
+ strcpy (p.hashed_master_password, strtok (line, "\n"));
else
- strcpy (p.hashed_password, "\0");
+ strcpy (p.hashed_master_password, "\0");
fgets (line, MAX_CLUE_LENGTH + 10, infile);
if (strlen (line) != 1)
- strcpy (p.salt, strtok (line, "\n"));
+ strcpy (p.hashed_solution_password, strtok (line, "\n"));
else
- strcpy (p.salt, "\0");
+ strcpy (p.hashed_solution_password, "\0");
/* read each character of the grid */
for (int i = 0; i < p.grid_size; i ++ )
reset_color (); printf ("\n");
}
-/* reset the player data, from the new file */
+/* reset the player data, loading from the puzzle file */
void reset_player_data (MainPlayerData *app_data, const char *filename)
{
app_data->puzzle = load_puzzle (filename);
app_data->is_loaded = app_data->puzzle.grid_frozen;
app_data->cur_col = -1;
app_data->cur_row = -1;
+ app_data->solution_revealed = false;
strcpy (app_data->filename, filename);
/* reset the answer keys */
for (int i = 0; i < app_data->puzzle.grid_size; i ++)
}
+/* save the user grid to a file */
+void save_user_data (MainPlayerData *app_data, const char *filename)
+{
+ FILE *outfile;
+ outfile = fopen (filename, "wb");
+ if (outfile == NULL)
+ {
+ fprintf (stderr, ERROR_WRITING_FILE);
+ return;
+ }
+ fprintf (outfile, "%s\n", app_data->filename);
+ for (int i = 0; i < app_data->puzzle.grid_size; i ++)
+ {
+ for (int j = 0; j < app_data->puzzle.grid_size; j ++)
+ fprintf (outfile, "%c", app_data->char_ans[i][j]);
+ fprintf (outfile, "\n");
+ }
+
+ fclose (outfile);
+}
+
+/* load the user grid from a file */
+void load_user_data (MainPlayerData *app_data, const char *filename)
+{
+ FILE *infile;
+ infile = fopen (filename, "rb");
+ if (infile == NULL)
+ {
+ fprintf (stderr, "%s\n", ERROR_READING_FILE);
+ return;
+ }
+
+ char puzzle_file_name[65535];
+ fgets (puzzle_file_name, 65535, infile);
+ reset_player_data (app_data, strtok (puzzle_file_name, "\n"));
+
+ char line[MAX_PUZZLE_SIZE+10];
+ for (int i = 0; i < app_data->puzzle.grid_size; i ++)
+ {
+ fgets (line, MAX_PUZZLE_SIZE+10, infile);
+ for (int j = 0; j < app_data->puzzle.grid_size; j ++)
+ app_data->char_ans[i][j] = line[j];
+
+ }
+ fclose (infile);
+}
+
/* in the player app, move the current selection index left or right */
void move_current_col (MainPlayerData *app_data, enum DIRECTION dir)
{