void handle_user_logout(Bank* bank, char* args) { char send_msg[MAX_LINE_SIZE + 1]; memset(send_msg, 0, MAX_LINE_SIZE); if ((char*)hash_table_find(bank->logged_user_ht, args) == NULL) { strcat(send_msg, "No user logged in"); } else { strcat(send_msg, "OK"); hash_table_del(bank->logged_user_ht, args); } bank_encrypt(bank, send_msg, strlen(send_msg)); bank_send(bank, send_msg, strlen(send_msg)); return; }
void bank_deposit(Bank* bank, char* name, char* amt) { if (!name || !amt) { printf("Usage: deposit <user-name> <amt>\n"); return; } if (check_username(name) || check_amt(amt)) { printf("Usage: deposit <user-name> <amt>\n"); return; } if (!hash_table_find(bank->user_balance_ht, name)) { printf("No such user\n"); return; } // handle name char card_name[MAX_CARD_NAME_SIZE + 1]; memset(card_name, 0, MAX_CARD_NAME_SIZE); strcat(card_name, name); strcat(card_name, ".card"); // handle balance int amount = 0; int balance = 0; sscanf(amt, "%d", &amount); sscanf((char*)hash_table_find(bank->user_balance_ht, name), "%d", &balance); if (balance + amount < 0) { printf("Too rich for this program\n"); return; } balance += amount; char* tmp; tmp = (char*)malloc(64); sprintf(tmp, "%d", balance); hash_table_del(bank->user_balance_ht, name); hash_table_add(bank->user_balance_ht, name, tmp); printf("$%d added to %s's account\n", amount, name); }
void bank_process_remote_command(Bank *bank, char *command, size_t len) { // ASSUME everything valid (checked in atm) char *comm = calloc(2, sizeof(char)); // w = withdrawal, u = user exists?, b = balance, p = user pin char *name = calloc(MAX_NAME_SIZE, sizeof(char)); char *pin = calloc(MAX_PIN_SIZE, sizeof(char)); char *amt = calloc(MAX_AMT_SIZE, sizeof(char)); unsigned char *back = (unsigned char *)calloc(10000, sizeof(unsigned char)); do_crypt(bank, (unsigned char *)command, back, 0); sscanf((char*)back, "%s %s %s %s", comm, name, pin, amt); free(back); if(strcmp(comm, "u") == 0) { if(hash_table_find(bank->user_bal,name) == NULL) { send_no(bank); return; } else { send_yes(bank); return; } } else if(strcmp(comm, "b") == 0) { if(hash_table_find(bank->user_bal, name) == NULL) { send_no_user(bank); return; } char* balance = (char *)hash_table_find(bank->user_bal, name); send_balance(bank, balance); return; } else if(strcmp(comm, "p") == 0) { if(hash_table_find(bank->user_bal, name) == NULL) { send_no_user(bank); return; } char* pin_from_hash = (char *) hash_table_find(bank->user_pin, name); if(pin_from_hash == NULL) { send_no_pin(bank); return; } if(strcmp(pin_from_hash, pin) == 0) { send_yes(bank); return; } else { send_no(bank); return; } } else if(strcmp(comm, "w") == 0) { if(hash_table_find(bank->user_bal, name) == NULL) { send_no_user(bank); return; } char *p; unsigned int amt_w = (unsigned int)strtoul(amt, &p, 10); unsigned int curr_amt = (unsigned int) strtoul((char *)hash_table_find(bank->user_bal, name), NULL, 10); if(curr_amt < amt_w) { send_no_fund(bank); return; } unsigned int new_amt = curr_amt - amt_w; char *new_amt_char = calloc(MAX_AMT_SIZE, sizeof(char)); sprintf(new_amt_char, "%u", new_amt); hash_table_del(bank->user_bal, name); hash_table_add(bank->user_bal, name,new_amt_char); send_yes(bank); return; } }
void bank_process_local_command(Bank *bank, char *command, size_t len) { char *comm = (char *)calloc(MAX_COMMAND_SIZE, sizeof(char)); char *name = (char *)calloc(MAX_COMMAND_SIZE, sizeof(char)); char *misc = (char *)calloc(MAX_COMMAND_SIZE, sizeof(char)); char *misc_two = (char *)calloc(MAX_COMMAND_SIZE, sizeof(char)); char temp_comm[MAX_LINE_SIZE]; char temp_name[MAX_LINE_SIZE]; char temp_misc[MAX_LINE_SIZE]; char temp_misc_two[MAX_LINE_SIZE]; if(strlen(command) >= MAX_LINE_SIZE) { printf("Invalid command\n"); return; } sscanf(command, "%s %s %s %s", temp_comm,temp_name,temp_misc,temp_misc_two); if(strlen(temp_comm) < 1 || strlen(temp_comm) >= MAX_COMMAND_SIZE) { printf("Invalid command\n"); return; } strncpy(comm, temp_comm, strlen(temp_comm) + 1); if(strcmp(comm, "create-user") == 0) { if(strlen(temp_name) < 1 || strlen(temp_misc) < 1 || strlen(temp_misc_two) < 1 || strlen(temp_name) >= MAX_NAME_SIZE) { printf("Usage: create-user <user-name> <pin> <balance>\n"); return; } strncpy(name, temp_name, strlen(temp_name) + 1); if(check_username(name) == 0) { printf("Usage: create-user <user-name> <pin> <balance>\n"); return; } if(hash_table_find(bank->user_bal, name) != NULL) { printf("%s already exists\n", name); return; } if(strlen(temp_misc) != 4 || strlen(temp_misc_two) > 10) { printf("Usage: create-user <user-name> <pin> <balance>\n"); return; } strncpy(misc, temp_misc, strlen(temp_misc) + 1); if(check_pin(misc) == 0) { printf("Usage: create-user <user-name> <pin> <balance>\n"); return; } strncpy(misc_two, temp_misc_two, strlen(temp_misc_two) + 1); if(check_bal(misc_two) == 0) { printf("Usage: create-user <user-name> <pin> <balance>\n"); return; } // create card int filelen = strlen(name) + 6; char cardfile[filelen]; memset(cardfile, '\0', filelen); strncpy(cardfile, name, strlen(name)); strncat(cardfile, ".card", 5); FILE *card = fopen(cardfile, "w"); if(card == NULL){ printf("Error creating card file for user %s\n", name); remove(cardfile); return; } unsigned char *buff = (unsigned char *)calloc(BLOCK_SIZE+1, sizeof(char)); do_crypt(bank, (unsigned char *)misc, buff, 1); fputs((char *)buff, card); fclose(card); hash_table_add(bank->user_bal, name, misc_two); //username balance hash_table_add(bank->user_pin, name, misc); //username pin printf("Created user %s\n", name); return; } else if(strcmp(comm, "deposit") == 0) { if(strlen(temp_name) < 1 || strlen(temp_misc) < 1 || strlen(temp_name) >= MAX_NAME_SIZE) { printf("Usage: deposit <user-name> <amt>\n"); return; } strncpy(name, temp_name, strlen(temp_name) + 1); if(check_username(name) != 1 || strlen(temp_misc) > 10) { printf("Usage: deposit <user-name> <amt>\n"); return; } if(hash_table_find(bank->user_bal, name) == NULL) { printf("No such user\n"); return; } strncpy(misc, temp_misc, strlen(temp_misc) + 1); if(check_bal(misc) == 0) { printf("Usage: deposit <user-name> <amt>\n"); return; } char *ptr; char* curr_bal = (char*) hash_table_find(bank->user_bal, name); unsigned int curr_bal_int = (unsigned int)strtoul(curr_bal, &ptr, 10); unsigned int amt = (unsigned int)strtoul(misc, &ptr, 10); unsigned int new_bal = (unsigned int)amt + (unsigned int)curr_bal_int; //checks if new_bal was capped if( new_bal > UINT_MAX || (new_bal - amt) != curr_bal_int || new_bal < curr_bal_int){ printf("Too rich for this program\n"); return; } char *new_bal_char = (char *)calloc(MAX_MISC_SIZE, sizeof(char)); sprintf(new_bal_char, "%u", new_bal); hash_table_del(bank->user_bal, name); hash_table_add(bank->user_bal, name, new_bal_char); printf("$%s added to %s's account\n", misc, name); return; } else if(strcmp(comm, "balance") == 0) { if(strlen(temp_name) < 1) { printf("Usage: balance <user-name>\n"); return; } if(strlen(temp_name) >= MAX_NAME_SIZE) { printf("Usage: balance <user-name>\n"); return; } strncpy(name, temp_name, strlen(temp_name) + 1); if(check_username(name) != 1) { printf("Usage: balance <user-name>\n"); return; } char *curr_bal = (char *) hash_table_find(bank->user_bal, name); if(curr_bal == NULL) { printf("No such user\n"); return; } printf("$%s\n", curr_bal); return; } else { printf("Invalid command\n"); return; } }