From 89e49adf5abb8703c42f24999514df948e38823e Mon Sep 17 00:00:00 2001 From: objnull Date: Sun, 8 Sep 2024 00:46:13 -0400 Subject: [PATCH] Created creation screen & fixing major bugs --- build/data.bin | 1 + project/backend/manager.c | 80 ++++++++++++++ project/backend/manager.h | 1 + project/backend/ui.c | 223 +++++++++++++++++++++++++++++--------- project/backend/ui.h | 3 + project/flippypass.c | 2 +- 6 files changed, 255 insertions(+), 55 deletions(-) create mode 100644 build/data.bin diff --git a/build/data.bin b/build/data.bin new file mode 100644 index 0000000..deac0b3 --- /dev/null +++ b/build/data.bin @@ -0,0 +1 @@ +Data: Q|A|S|0 diff --git a/project/backend/manager.c b/project/backend/manager.c index 1e4acdf..aa6a1df 100644 --- a/project/backend/manager.c +++ b/project/backend/manager.c @@ -35,10 +35,33 @@ char** split_string(const char* str, char delimiter, int* count) { return result; } +void string_append(char* first, const char* second) { + // Get to the end of string 1 + while (*first) { + ++first; + } + + // Copying Strings + while (*second) { + *first++ = *second++; + } +} void manager_loadnames(Manager* manager){ // Loading the names of all passwords char* data = store_load("Data"); + // Do we not have any passwords? + if (!data) { + // DEBUG + FURI_LOG_D(TAG, "No passwords found."); + + // Creating names + manager->names = malloc(sizeof(char*)); + + // Returning + return; + } + // Splitting string int count = 0; char** split = split_string(data, '|', &count); @@ -88,6 +111,63 @@ Manager* manager_init() { } // Functions +void manager_savepass(Manager* manager, Password* pass) { + // Not using Manager Right Now + UNUSED(manager); + + // DEBUG + FURI_LOG_D(TAG, "Saving:\nN:%s\nU:%s\nP:%s", + pass->name, + pass->user, + pass->phrase); + + // Our resulting string + char* result = store_load("Data"); + + // Is the result empty? + if(!result) { + // Allocating result + result = malloc(sizeof(char*)); + + // Setting stuff + string_append(result, pass->name); + string_append(result, "|"); + string_append(result, pass->user); + string_append(result, "|"); + string_append(result, pass->phrase); + string_append(result, "|0"); + + // Saving the data + store_save("Data", result); + + // Cleanup + free(result); + free(pass); + } else { + // Our new stuff + char* new_addon = malloc(sizeof(char*)); + + // Adding the Name + string_append(new_addon, "|"); + string_append(new_addon, pass->name); + string_append(new_addon, "|"); + string_append(new_addon, pass->user); + string_append(new_addon, "|"); + string_append(new_addon, pass->phrase); + string_append(new_addon, "|0"); + + // Appending addon to result + string_append(result, new_addon); + + // Saving the data + store_save("Data", result); + + // Cleanup + free(new_addon); + free(result); + free(pass); + } +} void manager_loadpass(Manager* manager, char* name) { // Freeing previous password if (manager->current != NULL) { diff --git a/project/backend/manager.h b/project/backend/manager.h index d21a240..a2208a4 100644 --- a/project/backend/manager.h +++ b/project/backend/manager.h @@ -21,6 +21,7 @@ typedef struct { Manager* manager_init(); // Functions +void manager_savepass(Manager* manager, Password* pass); void manager_loadpass(Manager* manager, char* name); void manager_free(Manager* manager); diff --git a/project/backend/ui.c b/project/backend/ui.c index 163a684..41dc8b7 100644 --- a/project/backend/ui.c +++ b/project/backend/ui.c @@ -13,13 +13,14 @@ typedef enum { FP_Scene_Cred, FP_Scene_Send, FP_Scene_Create, + FP_Scene_Type, FP_Scene_Archive, FP_Scene_About, FP_Scene_Count // Last Index, says how many scenes there are } FP_Scene; /* Types of Views */ -typedef enum { FP_View_VariableItemList, FP_View_Submenu, FP_View_TextBox, FP_View_Dialog, FP_View_Popup } FP_View; +typedef enum { FP_View_VariableItemList, FP_View_Submenu, FP_View_TextBox, FP_View_TextInput, FP_View_Dialog, FP_View_Popup } FP_View; /* Scene events */ typedef enum { @@ -33,21 +34,12 @@ typedef enum { FP_Scene_View_Event_Password, FP_Scene_View_Event_BadUSB } FP_Scene_View_Event; - -/* Extras */ -typedef struct { - const char* title; - const char* options[MAX_OPTIONS]; - int selection; -} FP_Variable_Item; - -/* Variable Item Lists */ -const FP_Variable_Item fp_scene_create_options[4] = { - {"Name", {""}, 0}, - {"Username", {""}, 0}, - {"Password", {""}, 0}, - {"Create", {""}, 0} -}; +typedef enum { + FP_Scene_Create_Event_Name, + FP_Scene_Create_Event_Username, + FP_Scene_Create_Event_Password, + FP_Scene_Create_Event_Done +} FP_Scene_Create_Event; // Page functions void FP_Scene_Callback_Default(void* context, uint32_t index) { @@ -64,7 +56,16 @@ void FP_Scene_Callback_Dialog(DialogExResult result, void* context) { // Sending it to the scene manager scene_manager_handle_custom_event(app->scene_manager, result); } +void FP_Scene_Callback_Type(void* context) { + // Setting context + FP_App* app = context; + // DEBUG + FURI_LOG_D(TAG, "Typed: %s", app->temp); + + // Going back a page + scene_manager_previous_scene(app->scene_manager); +} void FP_Scene_Enter_MainMenu(void* context) { // Setting context @@ -226,47 +227,109 @@ void FP_Scene_Enter_Create(void* context) { FP_App* app = context; // Reset page - variable_item_list_reset(app->varitemlist); + submenu_reset(app->submenu); - // Drawing - variable_item_list_add( - app->varitemlist, - "Name", - 1, - NULL, - app - ); - variable_item_list_add( - app->varitemlist, - "Username", - 1, - NULL, - app - ); - variable_item_list_add( - app->varitemlist, - "Password", - 1, - NULL, - app - ); - variable_item_list_add( - app->varitemlist, - "Create", - 1, - NULL, - app - ); + // Did we already start a password? + if (!app->manager->current) { + app->manager->current = malloc(sizeof(Password)); + } - // Callbacks - variable_item_list_set_enter_callback( - app->varitemlist, + // Checking if we typed something before + if (app->temp) { + // Checking what we selected + switch (app->selection) { + case 0: // Name + // Does name already exist? + if (app->manager->current->name) { + free(app->manager->current->name); + } + + // Copying it + app->manager->current->name = malloc(sizeof(char*)); + strcpy(app->manager->current->name, app->temp); + + break; + case 1: // Username + // Does user already exist? + if (app->manager->current->user) { + free(app->manager->current->user); + } + + // Copying it + app->manager->current->user = malloc(sizeof(char*)); + strcpy(app->manager->current->user, app->temp); + break; + case 2: // Password + // Does phrase already exist? + if (app->manager->current->phrase) { + free(app->manager->current->phrase); + } + + // Copying it + app->manager->current->phrase = malloc(sizeof(char*)); + strcpy(app->manager->current->phrase, app->temp); + break; + } + + // Freeing temp + free(app->temp); + } + + // Options + submenu_add_item( + app->submenu, + "Set Name", + FP_Scene_Create_Event_Name, + FP_Scene_Callback_Default, + app + ); + submenu_add_item( + app->submenu, + "Set Username", + FP_Scene_Create_Event_Username, + FP_Scene_Callback_Default, + app + ); + submenu_add_item( + app->submenu, + "Set Password", + FP_Scene_Create_Event_Password, + FP_Scene_Callback_Default, + app + ); + submenu_add_item( + app->submenu, + "Finish", + FP_Scene_Create_Event_Done, FP_Scene_Callback_Default, app ); // Send view to Flipper - view_dispatcher_switch_to_view(app->view_dispatcher, FP_View_VariableItemList); + view_dispatcher_switch_to_view(app->view_dispatcher, FP_View_Submenu); +} +void FP_Scene_Enter_Type(void* context) { + // Set Context + FP_App* app = context; + + // Reset view + text_input_reset(app->textinput); + + // Creating temp string + app->temp = malloc(sizeof(char*)); + + // Setting stuff + text_input_set_result_callback( + app->textinput, + FP_Scene_Callback_Type, + app, + app->temp, + 255, + true + ); + + // Send view to Flipper + view_dispatcher_switch_to_view(app->view_dispatcher, FP_View_TextInput); } void FP_Scene_Exit_Default(void* context) { @@ -442,8 +505,52 @@ bool FP_Scene_Event_Create(void* context, SceneManagerEvent event) { // We consumed it consumed = true; - // Debug log about what we pressed - FURI_LOG_D(TAG, "Pressed %li", event.event); + // What to do? + switch (event.event) { + case FP_Scene_Create_Event_Name: + case FP_Scene_Create_Event_Username: + case FP_Scene_Create_Event_Password: + // Set selection + app->selection = event.event; + + // Switch to keyboard scene + scene_manager_next_scene(app->scene_manager, FP_Scene_Type); + break; + case FP_Scene_Create_Event_Done: + // Save the password + manager_savepass(app->manager, app->manager->current); + + // Freeing temp string + if (app->temp) { + free(app->temp); + } + + // Reload manager + manager_free(app->manager); + app->manager = manager_init(); + + // Switching scenes + scene_manager_previous_scene(app->scene_manager); + break; + default: + break; + } + } else { + consumed = false; + } + + // Return result + return consumed; +} +bool FP_Scene_Event_Type(void* context, SceneManagerEvent event) { + // Setting context + FP_App* app = context; + bool consumed = false; + + // Switching based on event + if (event.type == SceneManagerEventTypeCustom) { + // We consumed it + consumed = true; UNUSED(app); @@ -467,7 +574,8 @@ void (*const FP_Scene_Enter_Handlers[])(void*) = { FP_Scene_Enter_View, FP_Scene_Enter_Cred, FP_Scene_Enter_Send, - FP_Scene_Enter_Create + FP_Scene_Enter_Create, + FP_Scene_Enter_Type }; bool (*const FP_Scene_Event_Handlers[])(void*, SceneManagerEvent) = { FP_Scene_Event_MainMenu, @@ -475,7 +583,8 @@ bool (*const FP_Scene_Event_Handlers[])(void*, SceneManagerEvent) = { FP_Scene_Event_View, FP_Scene_Event_Cred, FP_Scene_Event_Send, - FP_Scene_Event_Create + FP_Scene_Event_Create, + FP_Scene_Event_Type }; void (*const FP_Scene_Exit_Handlers[])(void*) = { FP_Scene_Exit_Default, @@ -483,6 +592,7 @@ void (*const FP_Scene_Exit_Handlers[])(void*) = { FP_Scene_Exit_Default, FP_Scene_Exit_Cred, FP_Scene_Exit_Default, + FP_Scene_Exit_Default, FP_Scene_Exit_Default }; @@ -532,6 +642,7 @@ FP_App* fp_app_init() { // Allocating all types of views result->varitemlist = variable_item_list_alloc(); + result->textinput = text_input_alloc(); result->dialog = dialog_ex_alloc(); result->submenu = submenu_alloc(); result->textbox = text_box_alloc(); @@ -544,6 +655,7 @@ FP_App* fp_app_init() { // Adding views to dispatcher view_dispatcher_add_view(result->view_dispatcher, FP_View_VariableItemList, variable_item_list_get_view(result->varitemlist)); + view_dispatcher_add_view(result->view_dispatcher, FP_View_TextInput, text_input_get_view(result->textinput)); view_dispatcher_add_view(result->view_dispatcher, FP_View_TextBox, text_box_get_view(result->textbox)); view_dispatcher_add_view(result->view_dispatcher, FP_View_Dialog, dialog_ex_get_view(result->dialog)); view_dispatcher_add_view(result->view_dispatcher, FP_View_Submenu, submenu_get_view(result->submenu)); @@ -575,15 +687,18 @@ void fp_app_free(FP_App* app) { manager_free(app->manager); scene_manager_free(app->scene_manager); view_dispatcher_remove_view(app->view_dispatcher, FP_View_VariableItemList); + view_dispatcher_remove_view(app->view_dispatcher, FP_View_TextInput); view_dispatcher_remove_view(app->view_dispatcher, FP_View_Submenu); view_dispatcher_remove_view(app->view_dispatcher, FP_View_TextBox); view_dispatcher_remove_view(app->view_dispatcher, FP_View_Dialog); view_dispatcher_remove_view(app->view_dispatcher, FP_View_Popup); view_dispatcher_free(app->view_dispatcher); variable_item_list_free(app->varitemlist); + text_input_free(app->textinput); dialog_ex_free(app->dialog); text_box_free(app->textbox); submenu_free(app->submenu); popup_free(app->popup); + free(app->temp); free(app); } \ No newline at end of file diff --git a/project/backend/ui.h b/project/backend/ui.h index d0454a4..0159545 100644 --- a/project/backend/ui.h +++ b/project/backend/ui.h @@ -15,6 +15,7 @@ #include #include #include +#include #include "app.h" #include "manager.h" @@ -24,12 +25,14 @@ typedef struct { SceneManager* scene_manager; ViewDispatcher* view_dispatcher; VariableItemList* varitemlist; + TextInput* textinput; DialogEx* dialog; Submenu* submenu; TextBox* textbox; Popup* popup; Manager* manager; + int selection; char* temp; } FP_App; diff --git a/project/flippypass.c b/project/flippypass.c index 111a22b..ffaa9cf 100644 --- a/project/flippypass.c +++ b/project/flippypass.c @@ -14,7 +14,7 @@ int32_t flippypass_app(void* p) { UNUSED(p); // Saving to a default file: - debug_template(); + //debug_template(); // Creating App FP_App* app = fp_app_init();