From 2b7a616e0328d8966e826399786bf2b726da2193 Mon Sep 17 00:00:00 2001 From: Sean Dolbec Date: Sat, 22 Aug 2026 17:08:08 -0400 Subject: [PATCH] fix: wire frontend scan buttons to Flask runtime event handlers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The frontend emits start_quick_scan / start_complete_scan / start_dragnet_scan but the Flask runtime only handled a generic 'start_scan' — so the Quick Scan / Complete+PDF / Dragnet buttons were dead on the primary webshell. Adds handlers for all three names routed through a shared _start_scan_core. Also fixes start_scan_task rejecting the runtime_store kwarg that build_scan_task_deps passes (TypeError killed every scan at launch). Verified live: UI click now runs nmap -sn + vulners deep pass, CVEs are detected and recorded. --- nmapui/app_scan_runtime.py | 2 ++ nmapui/handlers/scan_jobs.py | 34 +++++++++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/nmapui/app_scan_runtime.py b/nmapui/app_scan_runtime.py index 89291660..26faacec 100644 --- a/nmapui/app_scan_runtime.py +++ b/nmapui/app_scan_runtime.py @@ -24,6 +24,7 @@ def start_scan_task( logger, settings_state, vulners_script, + runtime_store=None, ): return start_scan_task_impl( sid=sid, @@ -31,6 +32,7 @@ def start_scan_task( broadcaster=broadcaster, emit_to_client=emit_to_client, get_client_state=get_client_state, + runtime_store=runtime_store, ensure_job_not_cancelled=ensure_job_not_cancelled, idle_state_manager=idle_state_manager, update_job_progress=update_job_progress, diff --git a/nmapui/handlers/scan_jobs.py b/nmapui/handlers/scan_jobs.py index e0527ddf..aa377278 100644 --- a/nmapui/handlers/scan_jobs.py +++ b/nmapui/handlers/scan_jobs.py @@ -15,13 +15,16 @@ def register_scan_job_handlers(socketio, deps): generate_report_task = deps["generate_report_task"] generate_pdf_from_saved_task = deps.get("generate_pdf_from_saved_task") - @socketio.on("start_scan") - @require_socket_auth() - def start_scan(data): + def _start_scan_core(data, extra=None): + payload = dict(extra or {}) if isinstance(data, dict): - target = data.get("target", "") + payload.update(data) else: - target = str(data) if data else "" + payload["target"] = str(data) if data else "" + target = payload.get("target", "") + + if not isinstance(target, str): + target = str(target) is_valid, error_msg = validate_target(target) if not is_valid: @@ -51,6 +54,27 @@ def start_scan(data): emit_job_status(request.sid, "scan") socketio.start_background_task(start_scan_task, request.sid, target) + # Legacy event names emitted by the frontend buttons (quick/complete/dragnet). + @socketio.on("start_quick_scan") + @require_socket_auth() + def start_quick_scan(data): + _start_scan_core(data) + + @socketio.on("start_complete_scan") + @require_socket_auth() + def start_complete_scan(data): + _start_scan_core(data) + + @socketio.on("start_dragnet_scan") + @require_socket_auth() + def start_dragnet_scan(data): + _start_scan_core(data) + + @socketio.on("start_scan") + @require_socket_auth() + def start_scan(data): + _start_scan_core(data) + @socketio.on("generate_report") @require_socket_auth() def generate_report_event(data):