Commit Graph
735 Commits
Author SHA1 Message Date
sebingel 0aa4536983 makes PIHOLEAPI report a failed TLS certificate check as such
With "Verify SSL" working, the login request checks the Pi-hole
certificate when that setting is on. In a live test with the setting on
and Pi-hole behind a reverse proxy with an untrusted certificate, the
login failed with "Connection error during Pi-hole auth. Check
PIHOLEAPI_URL and PIHOLEAPI_PASSWORD", although URL and password were
right. requests.exceptions.SSLError is a subclass of ConnectionError, so
the certificate error fell into that branch.

Changes:
- pihole_api_auth() catches requests.exceptions.SSLError before
  ConnectionError (server/plugins/pihole_api_scan/pihole_api_scan.py) and
  logs: "TLS certificate check failed during Pi-hole auth: <error>. Turn
  off PIHOLEAPI_VERIFY_SSL if Pi-hole uses a self-signed certificate."
- test/plugins/test_pihole_api_scan_verify_ssl.py: _login_failure() runs
  pihole_api_auth() with a failing login request.
  test_certificate_error_points_to_verify_ssl_setting checks the new
  message (fails without this change);
  test_plain_connection_error_still_points_to_url_and_password checks
  that other connection errors keep the old one.

Impact:
A user who turns on "Verify SSL" while Pi-hole uses a self-signed or
otherwise untrusted certificate gets a log line that names the cause and
the setting. Other connection errors are reported as before.
2026-11-01 09:33:41 +00:00
sebingel 71efcd0ba0 fixes PIHOLEAPI's ignored VERIFY_SSL setting and checks setting keys
main() read the setting 'PIHOLEAPI_SSL_VERIFY', but config.json defines
the function VERIFY_SSL, so the real key is PIHOLEAPI_VERIFY_SSL.
get_setting_value() returns "" for a key nobody defined, so every Pi-hole
API request got verify="": certificate checks were always off and the
InsecureRequestWarning was suppressed, even when a user had turned on
"Verify SSL". The login request sends the Pi-hole web password to
api/auth. The plugin README and docs/PIHOLE_GUIDE.md used the wrong name
too. test_plugin_conventions.py did not catch it: it only looks at
get_setting_value("X") or <literal>, and this line had no fallback.

Changes:
- test/plugins/test_plugin_conventions.py: new
  test_own_setting_keys_exist_in_config. Every literal
  get_setting_value('<PREFIX>_X') in a plugin's scripts must name a
  setting its own config.json defines; core settings and other plugins'
  keys are not checked. Before the fix it fails for exactly one of the 54
  plugins: pihole_api_scan.py, get_setting_value('PIHOLEAPI_SSL_VERIFY').
- New test/plugins/test_pihole_api_scan_verify_ssl.py: runs main() with
  VERIFY_SSL true and false and checks the verify= value that reaches
  requests.post() for api/auth. Only the HTTP call is mocked. It fails
  before the fix (verify=None).
- server/plugins/pihole_api_scan/pihole_api_scan.py: main() reads
  PIHOLEAPI_VERIFY_SSL.
- server/plugins/pihole_api_scan/README.md and docs/PIHOLE_GUIDE.md name
  the setting PIHOLEAPI_VERIFY_SSL.
- docs/PLUGINS_DEV.md, Conventions Checklist: read a setting under the
  exact key config.json defines; names the new check.

Impact:
"Verify SSL" now works. The default stays false, so default installs
behave as before. A user who turned it on while Pi-hole uses a
self-signed certificate will now see the login fail, as the setting
description says ("Disable if you are using a self-signed certificate").
Live check against Pi-hole v6.8 behind a proxy with an untrusted
certificate: with "Verify SSL" on the fixed code refused to log in, the
old code logged in and imported 33 entries.
2026-11-01 09:32:55 +00:00
jokob-sk eeb7d070b4 BE: review fixes 2026-10-27 18:00:20 +11:00
jokob-sk 96f63ecc54 BE: review fixes 2026-10-27 15:06:30 +11:00
jokob-sk 03c8cace8a BE+FE: hardening 2026-10-27 14:19:55 +11:00
jokob-sk 32eeb327c2 NMAPDEV defalts fix #1852 2026-10-23 12:48:16 +11:00
Jokob @NetAlertX 8fe3b49507 Merge pull request #1860 from netalertx/main
sync
2026-10-23 10:24:47 +09:00
Jokob @NetAlertX f669502028 Merge pull request #1858 from mauricio-camayo/fix/sync-hub-node-name
Sync + WIFICANARY: attribute synced detections to their node
2026-10-23 10:21:22 +09:00
Jokob @NetAlertX 212e0d3a6d Merge pull request #1859 from netalertx/main
sync
2026-10-23 10:05:51 +09:00
Mauricio CamayoandClaude Opus 5.5 c263e939fd Address review: docstrings for execute_plugin and new WIFICANARY tests
execute_plugin's leading description comment becomes a docstring, as it
was touched by this PR; the two new check_trusted_aps tests get
docstrings instead of leading comments.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PzCQWQVz9b2UzqLiGp2mPM
2026-10-22 12:29:12 -05:00
Mauricio CamayoandClaude Opus 5.5 ca4e92c32d Sync + WIFICANARY: attribute synced detections to their node
Fixes found running WIFICANARY on a WiFi satellite node that pushes its
detections to a hub with no WiFi of its own.

Synced plugin objects were stored with syncHubNodeName = "decoded"
instead of the node's name. plugin.py took filename.split(".")[2], but by
the time the hub processes the file decode_and_rename_files() has renamed
it to last_result.<PREFIX>.decoded.<NodeName>.<N>.log, so index 2 is the
literal marker. The parsing now lives in
utils.plugin_utils.get_sync_hub_node_name(), next to the function that
produces these names; it keeps node names that contain dots and returns
"" for local result files.

WIFICANARY's absent_baseline_clone was evaluated per trusted_aps entry,
so with a main AP + range extender pair, a weak clone seen while only the
main AP was in range also raised absent_baseline_clone through the
extender's entry, on top of the correct evil_twin. The baseline now
counts as present if any trusted radio for that SSID is visible;
single-entry behaviour is unchanged.

Leaving WIFICANARY_IFACE blank is how such a hub ingests the node's
detections (core processes the synced files after the plugin runs), but
it logged an unconditional "not set - nothing to scan" every cycle. It is
now a verbose "hub-only mode" message, and the node + hub setup is
documented in the setting description and the plugin README.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PzCQWQVz9b2UzqLiGp2mPM
2026-10-22 12:09:53 -05:00
Jonas Friedmann 68aaeaf527 BE+TESTS: relative MCP SSE endpoint path #1854
The SSE endpoint event advertised the absolute path /mcp/messages, which drops the /server prefix when clients connect through the bundled nginx proxy on port 20211. Clients then POST to /mcp/messages, nginx serves it as a static file and returns 404, so MCP clients can't connect via the proxy. A relative path resolves against whichever SSE URL the client used, so it works both directly and behind the prefix.
2026-10-21 13:07:34 +02:00
jokob-sk 10eea5603e BE: down notifications offset issue #1851 2026-10-19 19:11:30 +11:00
jokob-sk fbb42fbc61 BE: down notifications offset issue #1851 2026-10-19 19:10:30 +11:00
jokob-sk e8c214dda9 PLG: INTERNET plugin fix #1845 2026-10-18 10:25:23 +11:00
jokob-sk 02557f0db5 PLG: INTERNET plugin fix #1845 2026-10-18 10:01:18 +11:00
jokob-sk 19f6148a92 BE+FE: prevent ghost notifications #1841 2026-10-12 20:32:45 +11:00
jokob-sk fb1596cf94 BE+DOCS: skills + less verbose logging #1840 2026-10-12 09:42:55 +11:00
jokob-sk c25fd5f6af DOS+BE: skill updates + multi ip handling #1831 2026-10-10 08:45:53 +11:00
Jokob @NetAlertX 77bce19345 Merge pull request #1838 from netalertx/main
sync
2026-10-09 09:59:36 +11:00
jokob-sk 1b106cbc32 Review fixes 2026-10-09 09:59:14 +11:00
jokob-sk f37f2c7df7 BE+FE: Plugins -> Sources DevDetails tab 2026-10-09 09:18:04 +11:00
Alexander Shevchenko 94164829ff docs(unifi): describe import and test helper functions 2026-10-06 11:38:38 +02:00
Alexander Shevchenko 6b76b8c8ea fix(unifi): import wireless SSIDs into device scans
Read essid instead of the UniFi network name, exclude wired clients, and map the plugin result to scanSSID. Label the imported value as SSID.
2026-10-06 10:36:25 +02:00
jokob-sk 145f3778d0 FE+BE: save icon + columns SOT refactor 2026-10-03 13:23:55 +10:00
jokob-sk 067a6a15ef FE+BE: review fixes #1828 #1826 2026-10-02 23:05:02 +10:00
jokob-sk af79016ac8 PLG: FREEBOX presence L3 fix #1828 2026-10-02 22:44:11 +10:00
jokob-sk 06d9ae9613 BE: Fix: NIC-Covered Parent Devices Miss Connected/Down Reconnected Events #1821 2026-10-01 07:41:17 +10:00
jokob-sk fbbdefb898 BE: Fix: NIC-Covered Parent Devices Miss Connected/Down Reconnected Events #1821 2026-09-30 22:01:04 +10:00
jokob-sk 5ac9c53142 BE: Fix: NIC-Covered Parent Devices Miss Connected/Down Reconnected Events #1821 2026-09-30 21:49:00 +10:00
jokob-sk b18fc0688a BE: Fix: NIC-Covered Parent Devices Miss Connected/Down Reconnected Events #1821 2026-09-30 21:33:33 +10:00
jokob-sk 4f7448b3c9 BE: NICs presence fixes orphan disconnect events for parent #1821 2026-09-30 07:53:07 +10:00
jokob-sk 0d60071d49 BE+FE: System info -> Performance section 2026-09-28 21:32:16 +10:00
jokob-sk 4aa2a0dddb BE+FE: System info -> Performance section 2026-09-28 14:40:11 +10:00
jokob-sk f0a833ccc8 BE: docstrings 2026-09-28 07:44:29 +10:00
jokob-sk c5081ba4c1 PLG: MQTT sanitization of input #1816 2026-09-28 07:38:33 +10:00
jokob-sk fa5c62c9c3 BE: Stats Logging for Down Devices corrected #1818 2026-09-28 07:27:06 +10:00
jokob-sk 6d5760405b PLG: MQTT refactor 2026-09-28 07:03:55 +10:00
jokob-sk 81b28cb15e PLG: MQTT add devVLan devSSID #1816 2026-09-27 09:25:58 +10:00
jokob-sk 2cb637485d FE+LANG: Add Alert Events, Can Sleep and Static IP as selectable Device columns #1815 2026-09-27 08:54:00 +10:00
jokob-sk 6d7517eb8a DOCS+PLG: skill updates, PIHOLEMON corrected source 2026-09-26 10:06:37 +10:00
jokob-sk 127e2c92ee DOCS+PLG: skill updates, ADGUARDIMP more accurate presence determination #1813 2026-09-26 09:41:20 +10:00
jokob-sk 28eced2a25 DOCS: skill updates, WIFICANARY updates 2026-09-26 08:58:46 +10:00
jokob-sk 591b1fadbe Merge branch 'next_release' of github.com:netalertx/NetAlertX into next_release 2026-09-26 07:49:26 +10:00
jokob-sk c04213eb23 PLG: FREEBOX and FRITZBOX didn't respect SET_ALWAYS due to non-matching plugin name in config #1812 2026-09-26 07:49:11 +10:00
Jokob @NetAlertX d838376e9e Merge pull request #1809 from mauricio-camayo/add-wificanary-plugin
Add WIFICANARY plugin - passive WiFi rogue-AP detection
2026-09-25 14:19:37 +10:00
Mauricio CamayoandClaude Sonnet 5 41efcbc971 Address jokob-sk review: dedupe rogue detections, add iw to remaining Dockerfiles
check_trusted_aps() evaluated a rogue AP once per trusted_aps entry sharing
its SSID, so the documented main-AP+extender pattern (same SSID, two
entries) produced duplicate (bssid, motor) rows for a real clone - a
problem once next_release's per-plugin identity-hash dedup guard lands in
main, since it drops a plugin's entire batch on any internal duplicate.
Fixed by deduping once in main() after collecting from all check_*
functions. Also added iw + its setcap to Dockerfile.debian and
.devcontainer/Dockerfile, which the original PR missed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011meLPKCzVpdZyAUfv5U6mm
2026-09-24 20:10:12 -05:00
jokob-sk 087241274a Merge branch 'next_release' of github.com:netalertx/NetAlertX into next_release 2026-09-25 08:32:18 +10:00
jokob-sk f30d27db13 BE: plugin input improvements 2026-09-25 08:32:03 +10:00
Mauricio CamayoandClaude Sonnet 5 f7a0c5861e Address CodeRabbit review: extender false-positive + stale README section
- check_trusted_aps() was evaluating every AP sharing a protected SSID
  against every trusted entry for that SSID, not just its own. A main AP
  requiring a stricter accepted security set (e.g. wpa3-only) than a
  separately-trusted extender (e.g. wpa2) caused the extender to be
  flagged as evil_twin/absent_baseline_clone - it was being judged
  against the main AP's accepted set instead of its own. Fixed by
  excluding, from each trusted entry's evaluation, any BSSID that has its
  own separate trusted entry for the same SSID.
- README's "iw isn't in the published image yet" section was already
  stale within the same PR - this branch's own Dockerfile change adds
  iw + setcap, so the image ships it. Replaced with one sentence.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-24 15:01:16 -05:00