Explorar el Código

Scene created for the selection of scripts

tcpassos hace 2 años
padre
commit
5c5452cfcd

+ 1 - 0
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h

@@ -3,3 +3,4 @@ ADD_SCENE(wifi_marauder, console_output, ConsoleOutput)
 ADD_SCENE(wifi_marauder, text_input, TextInput)
 ADD_SCENE(wifi_marauder, text_input, TextInput)
 ADD_SCENE(wifi_marauder, settings_init, SettingsInit)
 ADD_SCENE(wifi_marauder, settings_init, SettingsInit)
 ADD_SCENE(wifi_marauder, log_viewer, LogViewer)
 ADD_SCENE(wifi_marauder, log_viewer, LogViewer)
+ADD_SCENE(wifi_marauder, script_select, ScriptSelect)

+ 88 - 0
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_select.c

@@ -0,0 +1,88 @@
+#include "../wifi_marauder_app_i.h"
+
+static void wifi_marauder_scene_script_select_script_list_enter_callback(void* context, uint32_t index) {
+    furi_assert(context);
+    WifiMarauderApp* app = context;
+    if (app->script_list_count == 0) {
+        return;
+    }
+
+    char script_path[256];
+    snprintf(script_path, sizeof(script_path), "%s/%s.json", MARAUDER_APP_FOLDER_SCRIPTS, furi_string_get_cstr(app->script_list[index]));
+
+    app->script = wifi_marauder_script_parse_file(script_path, app->storage);
+    if (app->script) {
+        scene_manager_next_scene(app->scene_manager, WifiMarauderSceneConsoleOutput);
+    }
+}
+
+void wifi_marauder_scene_script_select_on_enter(void* context) {
+    furi_assert(context);
+    WifiMarauderApp* app = context;
+    VariableItemList* script_var_item_list = app->script_var_item_list;
+    variable_item_list_set_enter_callback(script_var_item_list, wifi_marauder_scene_script_select_script_list_enter_callback, app);
+
+    File* dir_scripts = storage_file_alloc(app->storage);
+    if(storage_dir_open(dir_scripts, MARAUDER_APP_FOLDER_SCRIPTS)) {
+        FileInfo file_info;
+        char file_path[255];
+        app->script_list_count = 0;
+        // Goes through the files in the folder counting the ones that end with the json extension
+        while(storage_dir_read(dir_scripts, &file_info, file_path, 255)) {
+            app->script_list_count++;
+        }
+        if (app->script_list_count > 0) {
+            app->script_list = malloc(app->script_list_count * sizeof(FuriString*));
+            storage_dir_close(dir_scripts);
+            storage_dir_open(dir_scripts, MARAUDER_APP_FOLDER_SCRIPTS);
+            // Read the files again from the beginning, adding the scripts in the list
+            int script_index = 0;
+            while(storage_dir_read(dir_scripts, &file_info, file_path, 255)) {
+                app->script_list[script_index] = furi_string_alloc();
+                path_extract_filename_no_ext(file_path, app->script_list[script_index]);
+                variable_item_list_add(script_var_item_list, furi_string_get_cstr(app->script_list[script_index]), 1, NULL, app);
+                script_index++;
+            }
+        } else {
+            variable_item_list_add(script_var_item_list, "No script found", 1, NULL, app);
+        }
+        storage_dir_close(dir_scripts);
+    }
+    storage_file_free(dir_scripts);
+
+    variable_item_list_set_selected_item(script_var_item_list, scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptSelect));
+    view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewScriptSelect);
+}
+
+bool wifi_marauder_scene_script_select_on_event(void* context, SceneManagerEvent event) {
+    furi_assert(context);
+    WifiMarauderApp* app = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        if(event.event == WifiMarauderEventStartConsole) {
+            scene_manager_set_scene_state(
+                app->scene_manager, WifiMarauderSceneScriptSelect, app->selected_script_index);
+            scene_manager_next_scene(app->scene_manager, WifiMarauderSceneConsoleOutput);
+        }
+        consumed = true;
+    } else if(event.type == SceneManagerEventTypeTick) {
+        app->selected_script_index = variable_item_list_get_selected_item_index(app->var_item_list);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void wifi_marauder_scene_script_select_on_exit(void* context) {
+    furi_assert(context);
+    WifiMarauderApp* app = context;
+
+    variable_item_list_reset(app->script_var_item_list);
+
+    for (int i = 0; i < app->script_list_count; i++) {
+        furi_string_free(app->script_list[i]);
+    }
+    free(app->script_list);
+    
+}

+ 7 - 6
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c

@@ -144,13 +144,10 @@ static void wifi_marauder_scene_start_var_list_enter_callback(void* context, uin
     furi_assert(index < NUM_MENU_ITEMS);
     furi_assert(index < NUM_MENU_ITEMS);
     const WifiMarauderItem* item = &items[index];
     const WifiMarauderItem* item = &items[index];
 
 
-    // Try to open the automation script
-    // TODO: Improve file selection, use a file explorer
+    // Select automation script
     if(index == NUM_MENU_ITEMS - 2) {
     if(index == NUM_MENU_ITEMS - 2) {
-        app->script = wifi_marauder_script_parse_file(MARAUDER_APP_SCRIPT_PATH("script.json"), app->storage);
-        if (!app->script) {
-            return;
-        }
+        view_dispatcher_send_custom_event(app->view_dispatcher, WifiMarauderEventStartScriptSelect);
+        return;
     }
     }
 
 
     if(index == NUM_MENU_ITEMS - 1) {
     if(index == NUM_MENU_ITEMS - 1) {
@@ -252,6 +249,10 @@ bool wifi_marauder_scene_start_on_event(void* context, SceneManagerEvent event)
             scene_manager_set_scene_state(
             scene_manager_set_scene_state(
                 app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index);
                 app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index);
             scene_manager_next_scene(app->scene_manager, WifiMarauderSceneLogViewer);
             scene_manager_next_scene(app->scene_manager, WifiMarauderSceneLogViewer);
+        } else if(event.event == WifiMarauderEventStartScriptSelect) {
+            scene_manager_set_scene_state(
+                app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index);
+            scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptSelect);
         }
         }
         consumed = true;
         consumed = true;
     } else if(event.type == SceneManagerEventTypeTick) {
     } else if(event.type == SceneManagerEventTypeTick) {

+ 9 - 1
applications/external/wifi_marauder_companion/script/wifi_marauder_script.h

@@ -1,5 +1,6 @@
 /*
 /*
- * Steps to add a new stage:
+ * ----------------------------------------------------------------------------------------------------
+ * STEPS TO ADD A NEW STAGE:
  * 
  * 
  * wifi_marauder_script.h
  * wifi_marauder_script.h
  * - Complement WifiMarauderScriptStageType enum with new stage
  * - Complement WifiMarauderScriptStageType enum with new stage
@@ -13,6 +14,13 @@
  * wifi_marauder_script_executor.c
  * wifi_marauder_script_executor.c
  * - Create function "void _wifi_marauder_script_execute_????(WifiMarauderScriptStage????* stage)"
  * - Create function "void _wifi_marauder_script_execute_????(WifiMarauderScriptStage????* stage)"
  * - Add case in wifi_marauder_script_execute_stage()
  * - Add case in wifi_marauder_script_execute_stage()
+ * 
+ * ----------------------------------------------------------------------------------------------------
+ * IMPLEMENTED STAGES (In order of execution):
+ * - Scan
+ * - Select
+ * - Beacon List
+ * ----------------------------------------------------------------------------------------------------
  */
  */
 
 
 #pragma once
 #pragma once

+ 22 - 7
applications/external/wifi_marauder_companion/script/wifi_marauder_script_executor.c

@@ -28,15 +28,30 @@ void _wifi_marauder_script_execute_scan(WifiMarauderScriptStageScan* stage, Wifi
 }
 }
 
 
 void _wifi_marauder_script_execute_select(WifiMarauderScriptStageSelect* stage) {
 void _wifi_marauder_script_execute_select(WifiMarauderScriptStageSelect* stage) {
+    const char* select_type = NULL;
+    switch (stage->type) {
+        case WifiMarauderScriptSelectTypeAp:
+            select_type = "-a";
+            break;
+        case WifiMarauderScriptSelectTypeStation:
+            select_type = "-c";
+            break;
+        case WifiMarauderScriptSelectTypeSsid:
+            select_type = "-s";
+            break;
+        default:
+            return;  // invalid stage
+    }
+
     char command[256];
     char command[256];
-    if (stage->type == WifiMarauderScriptSelectTypeAp) {
-        snprintf(command, sizeof(command), "select -a {%s}\n", stage->filter);
-    } else if (stage->type == WifiMarauderScriptSelectTypeStation) {
-        snprintf(command, sizeof(command), "select -c {%s}\n", stage->filter);
-    } else if (stage->type == WifiMarauderScriptSelectTypeSsid) {
-        snprintf(command, sizeof(command), "select -s {%s}\n", stage->filter);
+    if (strcmp(stage->filter, "all") == 0) {
+        snprintf(command, sizeof(command), "select %s all\n", select_type);
+    } else {
+        snprintf(command, sizeof(command), "select %s {%s}\n", select_type, stage->filter);
     }
     }
-    wifi_marauder_uart_tx((uint8_t*)(command), strlen(command));
+
+    const size_t command_length = strlen(command);
+    wifi_marauder_uart_tx((uint8_t*)command, command_length);
 }
 }
 
 
 void _wifi_marauder_script_execute_beacon_list(WifiMarauderScriptStageBeaconList* stage, WifiMarauderScriptWorker* worker) {
 void _wifi_marauder_script_execute_beacon_list(WifiMarauderScriptStageBeaconList* stage, WifiMarauderScriptWorker* worker) {

+ 8 - 0
applications/external/wifi_marauder_companion/wifi_marauder_app.c

@@ -79,6 +79,13 @@ WifiMarauderApp* wifi_marauder_app_alloc() {
         (!storage_file_exists(app->storage, SAVE_PCAP_SETTING_FILEPATH) ||
         (!storage_file_exists(app->storage, SAVE_PCAP_SETTING_FILEPATH) ||
          !storage_file_exists(app->storage, SAVE_LOGS_SETTING_FILEPATH));
          !storage_file_exists(app->storage, SAVE_LOGS_SETTING_FILEPATH));
 
 
+    // Script select
+    app->script_var_item_list = variable_item_list_alloc();
+    view_dispatcher_add_view(
+        app->view_dispatcher,
+        WifiMarauderAppViewScriptSelect,
+        variable_item_list_get_view(app->script_var_item_list));
+
     scene_manager_next_scene(app->scene_manager, WifiMarauderSceneStart);
     scene_manager_next_scene(app->scene_manager, WifiMarauderSceneStart);
 
 
     return app;
     return app;
@@ -136,6 +143,7 @@ void wifi_marauder_app_free(WifiMarauderApp* app) {
     view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewConsoleOutput);
     view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewConsoleOutput);
     view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewTextInput);
     view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewTextInput);
     view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewWidget);
     view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewWidget);
+    view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewScriptSelect);
     widget_free(app->widget);
     widget_free(app->widget);
     text_box_free(app->text_box);
     text_box_free(app->text_box);
     furi_string_free(app->text_box_store);
     furi_string_free(app->text_box_store);

+ 10 - 4
applications/external/wifi_marauder_companion/wifi_marauder_app_i.h

@@ -20,6 +20,7 @@
 #include <gui/modules/widget.h>
 #include <gui/modules/widget.h>
 
 
 #include <storage/storage.h>
 #include <storage/storage.h>
+#include <lib/toolbox/path.h>
 #include <dialogs/dialogs.h>
 #include <dialogs/dialogs.h>
 
 
 #define NUM_MENU_ITEMS (18)
 #define NUM_MENU_ITEMS (18)
@@ -32,7 +33,6 @@
 #define MARAUDER_APP_FOLDER_PCAPS MARAUDER_APP_FOLDER "/pcaps"
 #define MARAUDER_APP_FOLDER_PCAPS MARAUDER_APP_FOLDER "/pcaps"
 #define MARAUDER_APP_FOLDER_LOGS MARAUDER_APP_FOLDER "/logs"
 #define MARAUDER_APP_FOLDER_LOGS MARAUDER_APP_FOLDER "/logs"
 #define MARAUDER_APP_FOLDER_SCRIPTS MARAUDER_APP_FOLDER "/scripts"
 #define MARAUDER_APP_FOLDER_SCRIPTS MARAUDER_APP_FOLDER "/scripts"
-#define MARAUDER_APP_SCRIPT_PATH(file_name) MARAUDER_APP_FOLDER "/scripts/" file_name
 #define MARAUDER_APP_FOLDER_USER_PCAPS MARAUDER_APP_FOLDER_USER "/pcaps"
 #define MARAUDER_APP_FOLDER_USER_PCAPS MARAUDER_APP_FOLDER_USER "/pcaps"
 #define MARAUDER_APP_FOLDER_USER_LOGS MARAUDER_APP_FOLDER_USER "/logs"
 #define MARAUDER_APP_FOLDER_USER_LOGS MARAUDER_APP_FOLDER_USER "/logs"
 #define SAVE_PCAP_SETTING_FILEPATH MARAUDER_APP_FOLDER "/save_pcaps_here.setting"
 #define SAVE_PCAP_SETTING_FILEPATH MARAUDER_APP_FOLDER "/save_pcaps_here.setting"
@@ -61,9 +61,6 @@ struct WifiMarauderApp {
     bool has_saved_logs_this_session;
     bool has_saved_logs_this_session;
     DialogsApp* dialogs;
     DialogsApp* dialogs;
 
 
-    WifiMarauderScript* script;
-    WifiMarauderScriptWorker* script_worker;
-
     VariableItemList* var_item_list;
     VariableItemList* var_item_list;
     Widget* widget;
     Widget* widget;
     int open_log_file_page;
     int open_log_file_page;
@@ -81,6 +78,14 @@ struct WifiMarauderApp {
     bool is_writing_pcap;
     bool is_writing_pcap;
     bool is_writing_log;
     bool is_writing_log;
 
 
+    // Automation script
+    WifiMarauderScript* script;
+    WifiMarauderScriptWorker* script_worker;
+    VariableItemList* script_var_item_list;
+    FuriString** script_list;
+    int script_list_count;
+    int selected_script_index;
+
     // For input source and destination MAC in targeted deauth attack
     // For input source and destination MAC in targeted deauth attack
     int special_case_input_step;
     int special_case_input_step;
     char special_case_input_src_addr[20];
     char special_case_input_src_addr[20];
@@ -113,4 +118,5 @@ typedef enum {
     WifiMarauderAppViewConsoleOutput,
     WifiMarauderAppViewConsoleOutput,
     WifiMarauderAppViewTextInput,
     WifiMarauderAppViewTextInput,
     WifiMarauderAppViewWidget,
     WifiMarauderAppViewWidget,
+    WifiMarauderAppViewScriptSelect,
 } WifiMarauderAppView;
 } WifiMarauderAppView;

+ 2 - 1
applications/external/wifi_marauder_companion/wifi_marauder_custom_event.h

@@ -7,5 +7,6 @@ typedef enum {
     WifiMarauderEventSaveSourceMac,
     WifiMarauderEventSaveSourceMac,
     WifiMarauderEventSaveDestinationMac,
     WifiMarauderEventSaveDestinationMac,
     WifiMarauderEventStartSettingsInit,
     WifiMarauderEventStartSettingsInit,
-    WifiMarauderEventStartLogViewer
+    WifiMarauderEventStartLogViewer,
+    WifiMarauderEventStartScriptSelect
 } WifiMarauderCustomEvent;
 } WifiMarauderCustomEvent;