IP parsing (line 476): use partition(':') so bare "ip/mask" lines
(no field-label prefix) are handled without IndexError; falls back to
the full string when no ':' is present before splitting on '/'.
AP-mode override comment (line 503): add one-line explanation above
the wifi_connected/ssid/ip_address clear so maintainers know why the
fields are reset while wlan0 reports as "connected".
Stale force-flag cleanup (__init__): remove a left-over
_FORCE_AP_FLAG_PATH from a prior crash on first instantiation per
process (guarded by class-level _startup_cleanup_done so the nmcli
AP-state check only runs once, not on every per-request instantiation).
Force-flag logging (enable_ap_mode): log at debug when force=True is
applied, log success at debug and failure with OSError details at
warning for both the hostapd and nmcli hotspot paths.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Both subprocess.run calls in the SSID connection lookup use fixed
arguments (no user input) or values derived from nmcli's own output —
not from user-controlled data. Add nosec B603 B607 annotations to
silence the Codacy/Bandit warnings, consistent with existing nosec
usage in the file.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- api_v3.py: replace bool(...) coercion for force with strict check —
only actual boolean True or strings "true"/"1" (case-insensitive)
pass; "false", integers, and other strings are treated as False so
the Ethernet/WiFi guards and _FORCE_AP_FLAG_PATH cannot be bypassed
by accident
- wifi_manager.py: add nosec B108 annotation to _IP_FORWARD_SAVE_PATH
to match the identical annotation already on _FORCE_AP_FLAG_PATH
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix scan API returning 500: scan_networks() returns a tuple but the
endpoint was iterating it directly; unpack with _was_cached
- Fix IP address display showing 'IP4.ADDRESS[1]:x.x.x.x': nmcli -t
output includes the field label; split on ':' before '/'
- Add force parameter to enable_ap_mode() to bypass WiFi/Ethernet
guards; expose via force JSON body field in the AP enable endpoint
- Fix daemon auto-disabling forced AP: add _FORCE_AP_FLAG_PATH flag
file written on force-enable and checked in check_and_manage_ap_mode
before auto-disabling; disable_ap_mode() clears it
- Fix wifi_connected false positive in AP mode: _get_status_nmcli()
was reporting wlan0 as 'connected' when it was running as AP;
override wifi_connected=False when _is_ap_mode_active() is True
- Fix AP verification failure on async NM activation: retry
_get_ap_status_nmcli() up to 5 times with 2s delay instead of
single immediate check
- Fix WiFi connect ignoring existing NM connections: nmcli does not
support 802-11-wireless.ssid as a column in 'connection show';
replace with NAME,TYPE list then per-connection SSID query via -g
(fixes 'netplan generate failed' error on Trixie / netplan systems)
- Fix failsafe AP re-enable blocked by Ethernet: all recovery-path
enable_ap_mode() calls in connect_to_network() now pass force=True
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>