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

Added support for select stage in automation script

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

+ 56 - 9
applications/external/wifi_marauder_companion/script/wifi_marauder_script.c

@@ -33,7 +33,7 @@ void _wifi_marauder_script_load_meta(WifiMarauderScript *script, cJSON *meta_sec
     }
     }
 }
 }
 
 
-WifiMarauderScriptStageScan *_wifi_marauder_script_get_stage_scan(cJSON *stages) {
+WifiMarauderScriptStageScan* _wifi_marauder_script_get_stage_scan(cJSON *stages) {
     cJSON* stage_scan = cJSON_GetObjectItem(stages, "scan");
     cJSON* stage_scan = cJSON_GetObjectItem(stages, "scan");
     if (stage_scan == NULL) {
     if (stage_scan == NULL) {
         return NULL;
         return NULL;
@@ -60,6 +60,40 @@ WifiMarauderScriptStageScan *_wifi_marauder_script_get_stage_scan(cJSON *stages)
     return scan_stage;
     return scan_stage;
 }
 }
 
 
+WifiMarauderScriptStageSelect* _wifi_marauder_script_get_stage_select(cJSON *stages) {
+    cJSON *select_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "select");
+    if (select_stage_json == NULL) {
+        return NULL;
+    }
+
+    cJSON *type_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "type");
+    cJSON *filter_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "filter");
+    cJSON *allow_repeat_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "allow_repeat");
+
+    if (!cJSON_IsString(type_json) || !cJSON_IsString(filter_json)) {
+        return NULL;
+    }
+
+    WifiMarauderScriptSelectType select_type;
+    if (strcmp(type_json->valuestring, "ap") == 0) {
+        select_type = WifiMarauderScriptSelectTypeAp;
+    } else if (strcmp(type_json->valuestring, "station") == 0) {
+        select_type = WifiMarauderScriptSelectTypeStation;
+    } else if (strcmp(type_json->valuestring, "ssid") == 0) {
+        select_type = WifiMarauderScriptSelectTypeSsid;
+    } else {
+        return NULL;
+    }
+
+    char *filter_str = strdup(filter_json->valuestring);
+
+    WifiMarauderScriptStageSelect *stage_select = (WifiMarauderScriptStageSelect*) malloc(sizeof(WifiMarauderScriptStageSelect));
+    stage_select->type = select_type;
+    stage_select->filter = filter_str;
+    stage_select->allow_repeat = cJSON_IsBool(allow_repeat_json) ? allow_repeat_json->valueint : true;
+
+    return stage_select;
+}
 
 
 WifiMarauderScriptStageBeaconList* _wifi_marauder_script_get_stage_beacon_list(cJSON *stages) {
 WifiMarauderScriptStageBeaconList* _wifi_marauder_script_get_stage_beacon_list(cJSON *stages) {
     cJSON* stage_beaconlist = cJSON_GetObjectItem(stages, "beaconlist");
     cJSON* stage_beaconlist = cJSON_GetObjectItem(stages, "beaconlist");
@@ -127,15 +161,31 @@ void _wifi_marauder_script_load_stages(WifiMarauderScript *script, cJSON *stages
     // Scan stage
     // Scan stage
     WifiMarauderScriptStageScan *stage_scan = _wifi_marauder_script_get_stage_scan(stages);
     WifiMarauderScriptStageScan *stage_scan = _wifi_marauder_script_get_stage_scan(stages);
     if (stage_scan != NULL) {
     if (stage_scan != NULL) {
-        WifiMarauderScriptStage *stage = _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeScan, stage_scan);
-        _wifi_marauder_script_add_stage(script, stage, &prev_stage);
+        _wifi_marauder_script_add_stage(
+            script,
+            _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeScan, stage_scan),
+            &prev_stage
+        );
+    }
+
+    // Select stage
+    WifiMarauderScriptStageSelect *stage_select = _wifi_marauder_script_get_stage_select(stages);
+    if (stage_select != NULL) {
+        _wifi_marauder_script_add_stage(
+            script,
+            _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeSelect, stage_select),
+            &prev_stage
+        );
     }
     }
 
 
     // Beacon List stage
     // Beacon List stage
     WifiMarauderScriptStageBeaconList *stage_beacon_list = _wifi_marauder_script_get_stage_beacon_list(stages);
     WifiMarauderScriptStageBeaconList *stage_beacon_list = _wifi_marauder_script_get_stage_beacon_list(stages);
     if (stage_beacon_list != NULL) {
     if (stage_beacon_list != NULL) {
-        WifiMarauderScriptStage *stage = _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeBeaconList, stage_beacon_list);
-        _wifi_marauder_script_add_stage(script, stage, &prev_stage);
+        _wifi_marauder_script_add_stage(
+            script,
+            _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeBeaconList, stage_beacon_list),
+            &prev_stage
+        );
     }
     }
 }
 }
 
 
@@ -186,10 +236,7 @@ void wifi_marauder_script_free(WifiMarauderScript *script) {
                 free(current_stage->stage);
                 free(current_stage->stage);
                 break;
                 break;
             case WifiMarauderScriptStageTypeSelect:
             case WifiMarauderScriptStageTypeSelect:
-                for (int i = 0; i < ((WifiMarauderScriptStageSelect *) current_stage->stage)->filter_count; i++) {
-                    free(((WifiMarauderScriptStageSelect *) current_stage->stage)->filters[i].filter_string);
-                }
-                free(((WifiMarauderScriptStageSelect *) current_stage->stage)->filters);
+                free(((WifiMarauderScriptStageSelect *) current_stage->stage)->filter);
                 free(current_stage->stage);
                 free(current_stage->stage);
                 break;
                 break;
             case WifiMarauderScriptStageTypeSniffPmkid:
             case WifiMarauderScriptStageTypeSniffPmkid:

+ 19 - 13
applications/external/wifi_marauder_companion/script/wifi_marauder_script.h

@@ -1,3 +1,20 @@
+/*
+ * Steps to add a new stage:
+ * 
+ * wifi_marauder_script.h
+ * - Complement WifiMarauderScriptStageType enum with new stage
+ * - Create struct WifiMarauderScriptStage???? for the new stage
+ * 
+ * wifi_marauder_script.c
+ * - Create function "WifiMarauderScriptStage????* _wifi_marauder_script_get_stage_????(cJSON *stages)"
+ * - Change _wifi_marauder_script_load_stages() to load new stage
+ * - Add case to free memory in wifi_marauder_script_free()
+ * 
+ * wifi_marauder_script_executor.c
+ * - Create function "void _wifi_marauder_script_execute_????(WifiMarauderScriptStage????* stage)"
+ * - Add case in wifi_marauder_script_execute_stage()
+ */
+
 #pragma once
 #pragma once
 
 
 #include <storage/storage.h>
 #include <storage/storage.h>
@@ -21,17 +38,6 @@ typedef enum {
     WifiMarauderScriptSelectTypeSsid
     WifiMarauderScriptSelectTypeSsid
 } WifiMarauderScriptSelectType;
 } WifiMarauderScriptSelectType;
 
 
-// Filters
-typedef enum {
-    WifiMarauderScriptFilterTypeContains,
-    WifiMarauderScriptFilterTypeEqual,
-} WifiMarauderScriptFilterType;
-
-typedef struct WifiMarauderScriptSelectFilter {
-    WifiMarauderScriptFilterType type;
-    char* filter_string;
-} WifiMarauderScriptSelectFilter;
-
 // Stages
 // Stages
 typedef struct WifiMarauderScriptStage {
 typedef struct WifiMarauderScriptStage {
     WifiMarauderScriptStageType type;
     WifiMarauderScriptStageType type;
@@ -46,8 +52,8 @@ typedef struct WifiMarauderScriptStageScan {
 
 
 typedef struct WifiMarauderScriptStageSelect {
 typedef struct WifiMarauderScriptStageSelect {
     WifiMarauderScriptSelectType type;
     WifiMarauderScriptSelectType type;
-    WifiMarauderScriptSelectFilter *filters;
-    int filter_count;
+    char* filter;
+    // TODO: Implement a feature to not select the same items in the next iteration of the script
     bool allow_repeat;
     bool allow_repeat;
 } WifiMarauderScriptStageSelect;
 } WifiMarauderScriptStageSelect;
 
 

+ 17 - 2
applications/external/wifi_marauder_companion/script/wifi_marauder_script_executor.c

@@ -18,15 +18,27 @@ void _send_line_break() {
 void _wifi_marauder_script_execute_scan(WifiMarauderScriptStageScan* stage, WifiMarauderScriptWorker* worker) {
 void _wifi_marauder_script_execute_scan(WifiMarauderScriptStageScan* stage, WifiMarauderScriptWorker* worker) {
     char command[10];
     char command[10];
     if (stage->type == WifiMarauderScriptScanTypeAp) {
     if (stage->type == WifiMarauderScriptScanTypeAp) {
-        snprintf(command, sizeof(command), "scanap");
+        snprintf(command, sizeof(command), "scanap\n");
     } else {
     } else {
-        snprintf(command, sizeof(command), "scansta");
+        snprintf(command, sizeof(command), "scansta\n");
     }
     }
     wifi_marauder_uart_tx((uint8_t*)(command), strlen(command));
     wifi_marauder_uart_tx((uint8_t*)(command), strlen(command));
     _wifi_marauder_script_delay(worker, stage->timeout);
     _wifi_marauder_script_delay(worker, stage->timeout);
     _send_stop();
     _send_stop();
 }
 }
 
 
+void _wifi_marauder_script_execute_select(WifiMarauderScriptStageSelect* stage) {
+    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);
+    }
+    wifi_marauder_uart_tx((uint8_t*)(command), strlen(command));
+}
+
 void _wifi_marauder_script_execute_beacon_list(WifiMarauderScriptStageBeaconList* stage, WifiMarauderScriptWorker* worker) {
 void _wifi_marauder_script_execute_beacon_list(WifiMarauderScriptStageBeaconList* stage, WifiMarauderScriptWorker* worker) {
     char command[100];
     char command[100];
     char *ssid;
     char *ssid;
@@ -51,6 +63,9 @@ void wifi_marauder_script_execute_stage(WifiMarauderScriptStage* stage, void *co
         case WifiMarauderScriptStageTypeScan:
         case WifiMarauderScriptStageTypeScan:
             _wifi_marauder_script_execute_scan((WifiMarauderScriptStageScan*)stage_data, worker);
             _wifi_marauder_script_execute_scan((WifiMarauderScriptStageScan*)stage_data, worker);
             break;
             break;
+        case WifiMarauderScriptStageTypeSelect:
+            _wifi_marauder_script_execute_select((WifiMarauderScriptStageSelect*)stage_data);
+            break;
         case WifiMarauderScriptStageTypeBeaconList:
         case WifiMarauderScriptStageTypeBeaconList:
             _wifi_marauder_script_execute_beacon_list((WifiMarauderScriptStageBeaconList*)stage_data, worker);
             _wifi_marauder_script_execute_beacon_list((WifiMarauderScriptStageBeaconList*)stage_data, worker);
             break;
             break;

+ 2 - 2
applications/external/wifi_marauder_companion/script/wifi_marauder_script_worker.c

@@ -17,7 +17,7 @@ int32_t _wifi_marauder_script_worker_task(void* worker) {
     WifiMarauderScript *script = script_worker->script;
     WifiMarauderScript *script = script_worker->script;
     if (script != NULL) {
     if (script != NULL) {
         WifiMarauderScriptStage *current_stage = script->first_stage;
         WifiMarauderScriptStage *current_stage = script->first_stage;
-        while (current_stage != NULL) {
+        while (current_stage != NULL && script_worker->is_running) {
             script_worker->callback(current_stage, script_worker->context);
             script_worker->callback(current_stage, script_worker->context);
             current_stage = current_stage->next_stage;
             current_stage = current_stage->next_stage;
         }
         }
@@ -32,11 +32,11 @@ bool wifi_marauder_script_worker_start(WifiMarauderScriptWorker* instance, WifiM
     instance->callback = callback;
     instance->callback = callback;
     instance->script = script;
     instance->script = script;
     instance->context = context;
     instance->context = context;
+    instance->is_running = true;
     instance->worker_thread = furi_thread_alloc_ex("WifiMarauderScriptWorker", 1024, _wifi_marauder_script_worker_task, instance);
     instance->worker_thread = furi_thread_alloc_ex("WifiMarauderScriptWorker", 1024, _wifi_marauder_script_worker_task, instance);
     if (!instance->worker_thread) {
     if (!instance->worker_thread) {
         return false;
         return false;
     }
     }
-    instance->is_running = true;
     furi_thread_start(instance->worker_thread);
     furi_thread_start(instance->worker_thread);
     return true;
     return true;
 }
 }