Add `filter channel remove <#name|psk|public>` to drop one channel instead
of clearing all. Matched by the resolved key, so any equivalent spec works.
Decode logic shared between add and remove via decodeChannelKey().
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Hashtag channels key off the first 16 bytes of SHA256("#name") (same as
MeshCore clients), so `filter channel #selftest` derives the key directly
instead of needing a pasted PSK.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Keys are never displayed (filter list shows counts only), so persist the
decoded GroupChannel directly instead of the original PSK string. Removes
the 272-byte filter_channel_psk[] buffer and the base64/hex round-trip;
config file is now a versioned binary blob.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
A 16/32-byte key is 32/64 hex chars while base64 PSKs are 24/44 chars, so
all-hex-and-32/64-long disambiguates cleanly. Widen the stored-PSK buffer to
fit a 64-char hex key.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Guard data[len]=0 against an over-long crafted payload (OOB store), and
match keywords against the whole folded message so a blocked word can't be
hidden in the self-declared sender name. Also drop the unguarded ctype.h.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Demote to a Configuration subsection with a "(When ... compiled in)"
heading, matching the GPS/Sensors/Bridge sections, and drop the
explicit build-flag callout.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Folds look-alike codepoints (fullwidth, math alphanumerics, circled/
squared letters, regional indicators, Cyrillic/Greek homoglyphs,
accented Latin) to plain ASCII and strips zero-width/combining marks
before matching keywords and sender names.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Adds a MESH_DEBUG line on each dropped message, plus "filter stats"
and "filter stats reset" commands to view/clear the filtered counter.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Lets a repeater decrypt channels it holds the key for (incl. the
built-in public channel) and drop messages matching blocked keywords
or sender names before forwarding. Configured via new "filter" CLI
commands and persisted to /channel_filter.
Co-Authored-By: Claude Opus 4.8 <[email protected]>