Просмотр исходного кода

Added support for exec and delay stages in automation script

tcpassos 2 лет назад
Родитель
Сommit
8757863066

+ 5 - 2
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_edit.c

@@ -85,8 +85,11 @@ void wifi_marauder_scene_script_edit_on_enter(void* context) {
             case WifiMarauderScriptStageTypeBeaconAp:
             case WifiMarauderScriptStageTypeBeaconAp:
                 submenu_add_item(script_edit_submenu, "Beacon AP", stage_index, wifi_marauder_scene_script_edit_callback, app);
                 submenu_add_item(script_edit_submenu, "Beacon AP", stage_index, wifi_marauder_scene_script_edit_callback, app);
                 break;
                 break;
-            default:
-                submenu_add_item(script_edit_submenu, "Unknown", stage_index, wifi_marauder_scene_script_edit_callback, app);
+            case WifiMarauderScriptStageTypeExec:
+                submenu_add_item(script_edit_submenu, "Custom command", stage_index, wifi_marauder_scene_script_edit_callback, app);
+                break;
+            case WifiMarauderScriptStageTypeDelay:
+                submenu_add_item(script_edit_submenu, "Delay", stage_index, wifi_marauder_scene_script_edit_callback, app);
                 break;
                 break;
         }
         }
         current_stage = current_stage->next_stage;
         current_stage = current_stage->next_stage;

+ 26 - 0
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_stage_add.c

@@ -151,6 +151,30 @@ static void wifi_marauder_scene_script_stage_add_beaconap_callback(void* context
     scene_manager_previous_scene(app->scene_manager);
     scene_manager_previous_scene(app->scene_manager);
 }
 }
 
 
+// Exec
+static void wifi_marauder_scene_script_stage_add_exec_callback(void* context, uint32_t index) {
+    UNUSED(index);
+    WifiMarauderApp* app = context;
+
+    WifiMarauderScriptStageExec* stage = (WifiMarauderScriptStageExec*) malloc(sizeof(WifiMarauderScriptStageExec));
+    stage->command = NULL;
+
+    wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeExec, stage);
+    scene_manager_previous_scene(app->scene_manager);
+}
+
+// Delay
+static void wifi_marauder_scene_script_stage_add_delay_callback(void* context, uint32_t index) {
+    UNUSED(index);
+    WifiMarauderApp* app = context;
+
+    WifiMarauderScriptStageDelay* stage = (WifiMarauderScriptStageDelay*) malloc(sizeof(WifiMarauderScriptStageDelay));
+    stage->timeout = 0;
+
+    wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeDelay, stage);
+    scene_manager_previous_scene(app->scene_manager);
+}
+
 void wifi_marauder_scene_script_stage_add_on_enter(void* context) {
 void wifi_marauder_scene_script_stage_add_on_enter(void* context) {
     WifiMarauderApp* app = context;
     WifiMarauderApp* app = context;
     Submenu* script_stage_add_submenu = app->script_stage_add_submenu;
     Submenu* script_stage_add_submenu = app->script_stage_add_submenu;
@@ -169,6 +193,8 @@ void wifi_marauder_scene_script_stage_add_on_enter(void* context) {
     submenu_add_item(script_stage_add_submenu, "Sniff Pwnagotchi", menu_index++, wifi_marauder_scene_script_stage_add_sniffpwn_callback, app);
     submenu_add_item(script_stage_add_submenu, "Sniff Pwnagotchi", menu_index++, wifi_marauder_scene_script_stage_add_sniffpwn_callback, app);
     submenu_add_item(script_stage_add_submenu, "Beacon List", menu_index++, wifi_marauder_scene_script_stage_add_beaconlist_callback, app);
     submenu_add_item(script_stage_add_submenu, "Beacon List", menu_index++, wifi_marauder_scene_script_stage_add_beaconlist_callback, app);
     submenu_add_item(script_stage_add_submenu, "Beacon AP", menu_index++, wifi_marauder_scene_script_stage_add_beaconap_callback, app);
     submenu_add_item(script_stage_add_submenu, "Beacon AP", menu_index++, wifi_marauder_scene_script_stage_add_beaconap_callback, app);
+    submenu_add_item(script_stage_add_submenu, "Custom command", menu_index++, wifi_marauder_scene_script_stage_add_exec_callback, app);
+    submenu_add_item(script_stage_add_submenu, "Delay", menu_index++, wifi_marauder_scene_script_stage_add_delay_callback, app);
 
 
     submenu_set_selected_item(script_stage_add_submenu, scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptEdit));
     submenu_set_selected_item(script_stage_add_submenu, scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptEdit));
     view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewScriptStageAdd);
     view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewScriptStageAdd);

+ 55 - 2
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_stage_edit.c

@@ -264,7 +264,9 @@ static void wifi_marauder_select_stage_type_change_callback(VariableItem* item)
 static void wifi_marauder_select_stage_filter_setup_callback(VariableItem* item) {
 static void wifi_marauder_select_stage_filter_setup_callback(VariableItem* item) {
     WifiMarauderApp* app = variable_item_get_context(item);
     WifiMarauderApp* app = variable_item_get_context(item);
     WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
     WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
-    variable_item_set_current_value_text(item, stage->filter);
+    if (stage->filter != NULL) {
+        variable_item_set_current_value_text(item, stage->filter);
+    }
 }
 }
 
 
 static void wifi_marauder_select_stage_filter_select_callback(WifiMarauderApp* app) {
 static void wifi_marauder_select_stage_filter_select_callback(WifiMarauderApp* app) {
@@ -589,6 +591,51 @@ WifiMarauderScriptEditItem beaconap_items[] = {
     }
     }
 };
 };
 
 
+// Exec stage =============================================================================================================================
+static void wifi_marauder_exec_stage_filter_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageExec* stage = app->script_edit_selected_stage->stage;
+    if (stage->command != NULL) {
+        variable_item_set_current_value_text(item, stage->command);
+    }
+}
+
+static void wifi_marauder_exec_stage_filter_select_callback(WifiMarauderApp* app) {
+    WifiMarauderScriptStageExec* stage_select = app->script_edit_selected_stage->stage;
+    if (stage_select->command == NULL) {
+        stage_select->command = malloc(128);
+    }
+    app->user_input_string_reference = &stage_select->command;
+}
+
+WifiMarauderScriptEditItem exec_items[] = {
+    {
+        "Command", WifiMarauderScriptEditItemTypeString, 1, {NULL},
+        wifi_marauder_exec_stage_filter_setup_callback, NULL, wifi_marauder_exec_stage_filter_select_callback
+    }
+};
+
+// Delay stage ============================================================================================================================
+static void wifi_marauder_delay_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageDelay* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+static void wifi_marauder_delay_stage_timeout_select_callback(WifiMarauderApp* app) {
+    WifiMarauderScriptStageDelay* stage_delay = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_delay->timeout;
+}
+
+WifiMarauderScriptEditItem delay_items[] = {
+    {
+        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
+        wifi_marauder_delay_stage_timeout_setup_callback, NULL, wifi_marauder_delay_stage_timeout_select_callback
+    }
+};
+
 // ========================================================================================================================================
 // ========================================================================================================================================
 void wifi_marauder_scene_script_stage_edit_setup(WifiMarauderApp* app) {
 void wifi_marauder_scene_script_stage_edit_setup(WifiMarauderApp* app) {
     switch (app->script_edit_selected_stage->type) {
     switch (app->script_edit_selected_stage->type) {
@@ -640,7 +687,13 @@ void wifi_marauder_scene_script_stage_edit_setup(WifiMarauderApp* app) {
             stage_items = beaconap_items;
             stage_items = beaconap_items;
             num_stage_items = 1;
             num_stage_items = 1;
             break;
             break;
-        default:
+        case WifiMarauderScriptStageTypeExec:
+            stage_items = exec_items;
+            num_stage_items = 1;
+            break;
+        case WifiMarauderScriptStageTypeDelay:
+            stage_items = delay_items;
+            num_stage_items = 1;
             break;
             break;
     }
     }
 }
 }

+ 76 - 5
applications/external/wifi_marauder_companion/script/wifi_marauder_script.c

@@ -91,10 +91,9 @@ WifiMarauderScriptStageSelect* _wifi_marauder_script_get_stage_select(cJSON *sta
     cJSON *indexes_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "indexes");
     cJSON *indexes_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "indexes");
     cJSON *allow_repeat_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "allow_repeat");
     cJSON *allow_repeat_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "allow_repeat");
 
 
-    if (!cJSON_IsString(type_json) || !cJSON_IsString(filter_json)) {
+    if (!cJSON_IsString(type_json)) {
         return NULL;
         return NULL;
     }
     }
-
     WifiMarauderScriptSelectType select_type;
     WifiMarauderScriptSelectType select_type;
     if (strcmp(type_json->valuestring, "ap") == 0) {
     if (strcmp(type_json->valuestring, "ap") == 0) {
         select_type = WifiMarauderScriptSelectTypeAp;
         select_type = WifiMarauderScriptSelectTypeAp;
@@ -105,13 +104,12 @@ WifiMarauderScriptStageSelect* _wifi_marauder_script_get_stage_select(cJSON *sta
     } else {
     } else {
         return NULL;
         return NULL;
     }
     }
-
-    char *filter_str = strdup(filter_json->valuestring);
+    char *filter_str = cJSON_IsString(filter_json) ? strdup(filter_json->valuestring) : NULL;
 
 
     WifiMarauderScriptStageSelect *stage_select = (WifiMarauderScriptStageSelect*) malloc(sizeof(WifiMarauderScriptStageSelect));
     WifiMarauderScriptStageSelect *stage_select = (WifiMarauderScriptStageSelect*) malloc(sizeof(WifiMarauderScriptStageSelect));
     stage_select->type = select_type;
     stage_select->type = select_type;
-    stage_select->filter = filter_str;
     stage_select->allow_repeat = cJSON_IsBool(allow_repeat_json) ? allow_repeat_json->valueint : true;
     stage_select->allow_repeat = cJSON_IsBool(allow_repeat_json) ? allow_repeat_json->valueint : true;
+    stage_select->filter = filter_str;
 
 
     if (cJSON_IsArray(indexes_json)) {
     if (cJSON_IsArray(indexes_json)) {
         int indexes_size = cJSON_GetArraySize(indexes_json);
         int indexes_size = cJSON_GetArraySize(indexes_json);
@@ -319,6 +317,36 @@ WifiMarauderScriptStageBeaconAp* _wifi_marauder_script_get_stage_beacon_ap(cJSON
     return beacon_ap_stage;
     return beacon_ap_stage;
 }
 }
 
 
+WifiMarauderScriptStageExec* _wifi_marauder_script_get_stage_exec(cJSON *stages) {
+    cJSON* exec_stage_json = cJSON_GetObjectItem(stages, "exec");
+    if (exec_stage_json == NULL) {
+        return NULL;
+    }
+
+    cJSON *command_json = cJSON_GetObjectItemCaseSensitive(exec_stage_json, "command");
+    char *command_str = cJSON_IsString(command_json) ? strdup(command_json->valuestring) : NULL;
+
+    WifiMarauderScriptStageExec *exec_stage = (WifiMarauderScriptStageExec*) malloc(sizeof(WifiMarauderScriptStageExec));
+    exec_stage->command = command_str;
+
+    return exec_stage;
+}
+
+WifiMarauderScriptStageDelay* _wifi_marauder_script_get_stage_delay(cJSON *stages) {
+    cJSON* delay_stage_json = cJSON_GetObjectItem(stages, "delay");
+    if (delay_stage_json == NULL) {
+        return NULL;
+    }
+
+    cJSON* timeout_json = cJSON_GetObjectItem(delay_stage_json, "timeout");
+    int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) : 0;
+
+    WifiMarauderScriptStageDelay *delay_stage = (WifiMarauderScriptStageDelay*) malloc(sizeof(WifiMarauderScriptStageDelay));
+    delay_stage->timeout = timeout;
+
+    return delay_stage;
+}
+
 WifiMarauderScriptStage* _wifi_marauder_script_create_stage(WifiMarauderScriptStageType type, void* stage_data) {
 WifiMarauderScriptStage* _wifi_marauder_script_create_stage(WifiMarauderScriptStageType type, void* stage_data) {
     WifiMarauderScriptStage* stage = (WifiMarauderScriptStage*) malloc(sizeof(WifiMarauderScriptStage));
     WifiMarauderScriptStage* stage = (WifiMarauderScriptStage*) malloc(sizeof(WifiMarauderScriptStage));
     stage->type = type;
     stage->type = type;
@@ -365,6 +393,10 @@ void _wifi_marauder_script_load_stages(WifiMarauderScript *script, cJSON *stages
     wifi_marauder_script_add_stage(script, WifiMarauderScriptStageTypeBeaconList, _wifi_marauder_script_get_stage_beacon_list(stages));
     wifi_marauder_script_add_stage(script, WifiMarauderScriptStageTypeBeaconList, _wifi_marauder_script_get_stage_beacon_list(stages));
     // Beacon Ap stage
     // Beacon Ap stage
     wifi_marauder_script_add_stage(script, WifiMarauderScriptStageTypeBeaconAp, _wifi_marauder_script_get_stage_beacon_ap(stages));
     wifi_marauder_script_add_stage(script, WifiMarauderScriptStageTypeBeaconAp, _wifi_marauder_script_get_stage_beacon_ap(stages));
+    // Exec stage
+    wifi_marauder_script_add_stage(script, WifiMarauderScriptStageTypeExec, _wifi_marauder_script_get_stage_exec(stages));
+    // Delay stage
+    wifi_marauder_script_add_stage(script, WifiMarauderScriptStageTypeDelay, _wifi_marauder_script_get_stage_delay(stages));
 }
 }
 
 
 WifiMarauderScript *wifi_marauder_script_parse_raw(const char* json_raw) {
 WifiMarauderScript *wifi_marauder_script_parse_raw(const char* json_raw) {
@@ -596,6 +628,26 @@ cJSON* _wifi_marauder_script_create_json_beaconap(WifiMarauderScriptStageBeaconA
     return stage_json;
     return stage_json;
 }
 }
 
 
+cJSON* _wifi_marauder_script_create_json_exec(WifiMarauderScriptStageExec* exec_stage) {
+    cJSON* stage_json = cJSON_CreateObject();
+    cJSON_AddItemToObject(stage_json, "exec", cJSON_CreateObject());
+    cJSON* exec_json = cJSON_GetObjectItem(stage_json, "exec");
+    // Command
+    cJSON_AddStringToObject(exec_json, "command", exec_stage->command != NULL ? exec_stage->command : "");
+    return stage_json;
+}
+
+cJSON* _wifi_marauder_script_create_json_delay(WifiMarauderScriptStageDelay* delay_stage) {
+    cJSON* stage_json = cJSON_CreateObject();
+    cJSON_AddItemToObject(stage_json, "delay", cJSON_CreateObject());
+    cJSON* delay_json = cJSON_GetObjectItem(stage_json, "delay");
+    // Timeout
+    if (delay_stage->timeout > 0) {
+        cJSON_AddNumberToObject(delay_json, "timeout", delay_stage->timeout);
+    }
+    return stage_json;
+}
+
 void wifi_marauder_script_save_json(Storage* storage, const char* file_path, WifiMarauderScript* script) {
 void wifi_marauder_script_save_json(Storage* storage, const char* file_path, WifiMarauderScript* script) {
     File* script_file = storage_file_alloc(storage);
     File* script_file = storage_file_alloc(storage);
 
 
@@ -676,6 +728,16 @@ void wifi_marauder_script_save_json(Storage* storage, const char* file_path, Wif
                     stage_json = _wifi_marauder_script_create_json_beaconap(beaconap_stage);
                     stage_json = _wifi_marauder_script_create_json_beaconap(beaconap_stage);
                     break;
                     break;
                 }
                 }
+                case WifiMarauderScriptStageTypeExec: {
+                    WifiMarauderScriptStageExec* exec_stage = (WifiMarauderScriptStageExec*) stage->stage;
+                    stage_json = _wifi_marauder_script_create_json_exec(exec_stage);
+                    break;
+                }
+                case WifiMarauderScriptStageTypeDelay: {
+                    WifiMarauderScriptStageDelay* delay_stage = (WifiMarauderScriptStageDelay*) stage->stage;
+                    stage_json = _wifi_marauder_script_create_json_delay(delay_stage);
+                    break;
+                }
             }
             }
 
 
             // Add the stage JSON object to the "stages" array
             // Add the stage JSON object to the "stages" array
@@ -764,6 +826,15 @@ void wifi_marauder_script_free(WifiMarauderScript *script) {
             case WifiMarauderScriptStageTypeBeaconAp:
             case WifiMarauderScriptStageTypeBeaconAp:
                 free(current_stage->stage);
                 free(current_stage->stage);
                 break;
                 break;
+            case WifiMarauderScriptStageTypeExec:
+                if (((WifiMarauderScriptStageExec *) current_stage->stage)->command != NULL) {
+                    free(((WifiMarauderScriptStageExec *) current_stage->stage)->command);
+                }
+                free(current_stage->stage);
+                break;
+            case WifiMarauderScriptStageTypeDelay:
+                free(current_stage->stage);
+                break;
         }
         }
         free(current_stage);
         free(current_stage);
         current_stage = next_stage;
         current_stage = next_stage;

+ 16 - 0
applications/external/wifi_marauder_companion/script/wifi_marauder_script.h

@@ -84,6 +84,12 @@
  *         "beaconAp": {
  *         "beaconAp": {
  *             "timeout": seconds
  *             "timeout": seconds
  *         }
  *         }
+ *         "exec": {
+ *             "command": Command (eg: "clearlist -a")
+ *         }
+ *         "delay": {
+ *             "timeout": seconds
+ *         }
  *     }
  *     }
  * }
  * }
  * 
  * 
@@ -129,6 +135,8 @@ typedef enum {
     WifiMarauderScriptStageTypeSniffPwn,
     WifiMarauderScriptStageTypeSniffPwn,
     WifiMarauderScriptStageTypeBeaconList,
     WifiMarauderScriptStageTypeBeaconList,
     WifiMarauderScriptStageTypeBeaconAp,
     WifiMarauderScriptStageTypeBeaconAp,
+    WifiMarauderScriptStageTypeExec,
+    WifiMarauderScriptStageTypeDelay,
 } WifiMarauderScriptStageType;
 } WifiMarauderScriptStageType;
 
 
 typedef enum {
 typedef enum {
@@ -209,6 +217,14 @@ typedef struct WifiMarauderScriptStageBeaconAp {
     int timeout;
     int timeout;
 } WifiMarauderScriptStageBeaconAp;
 } WifiMarauderScriptStageBeaconAp;
 
 
+typedef struct WifiMarauderScriptStageExec {
+    char* command;
+} WifiMarauderScriptStageExec;
+
+typedef struct WifiMarauderScriptStageDelay {
+    int timeout;
+} WifiMarauderScriptStageDelay;
+
 // Script
 // Script
 typedef struct WifiMarauderScript {
 typedef struct WifiMarauderScript {
     char* name;
     char* name;

+ 15 - 1
applications/external/wifi_marauder_companion/script/wifi_marauder_script_executor.c

@@ -178,6 +178,16 @@ void _wifi_marauder_script_execute_beacon_ap(WifiMarauderScriptStageBeaconAp* st
     _send_stop();
     _send_stop();
 }
 }
 
 
+void _wifi_marauder_script_execute_exec(WifiMarauderScriptStageExec* stage) {
+    if (stage->command != NULL) {
+        wifi_marauder_uart_tx((uint8_t*)stage->command, strlen(stage->command));
+    }
+}
+
+void _wifi_marauder_script_execute_delay(WifiMarauderScriptStageDelay* stage, WifiMarauderScriptWorker* worker) {
+    _wifi_marauder_script_delay(worker, stage->timeout);
+}
+
 void wifi_marauder_script_execute_start(void *context) {
 void wifi_marauder_script_execute_start(void *context) {
     furi_assert(context);
     furi_assert(context);
     WifiMarauderScriptWorker* worker = context;
     WifiMarauderScriptWorker* worker = context;
@@ -242,7 +252,11 @@ void wifi_marauder_script_execute_stage(WifiMarauderScriptStage* stage, void *co
         case WifiMarauderScriptStageTypeBeaconAp:
         case WifiMarauderScriptStageTypeBeaconAp:
             _wifi_marauder_script_execute_beacon_ap((WifiMarauderScriptStageBeaconAp*)stage_data, worker);
             _wifi_marauder_script_execute_beacon_ap((WifiMarauderScriptStageBeaconAp*)stage_data, worker);
             break;
             break;
-        default:
+        case WifiMarauderScriptStageTypeExec:
+            _wifi_marauder_script_execute_exec((WifiMarauderScriptStageExec*)stage_data);
+            break;
+        case WifiMarauderScriptStageTypeDelay:
+            _wifi_marauder_script_execute_delay((WifiMarauderScriptStageDelay*)stage_data, worker);
             break;
             break;
     }
     }
 }
 }