mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-18 16:46:17 +00:00
When a speaker resolves the firmware-hardcoded content.api.bose.io through the operator's own DNS instead of AfterTouch, TuneIn/BMX content requests escape AfterTouch and fail (CURL 60, or a dead-cloud 404), so the speaker reports INVALID_SOURCE. The existing dns_sanity check only probes AfterTouch's own answering side over loopback, so it passes even when no speaker uses AfterTouch as its resolver. This adds a speaker-side, on-demand check. dns_speaker_usage: - pkg/discovery/dns.go tracks distinct non-loopback clients that query an intercepted Bose hostname (interceptClients set, populated in recordQuery, exposed via InterceptClientIPs()). Loopback is excluded so dns_sanity's own probes don't register. - The check lists each unconfirmed speaker as an info finding with a "Test DNS path" quick-fix. It never emits a standing warning, so it does not false-positive after a restart (the querier set is in-memory and starts empty). Active probe (the "Test DNS path" quick-fix; also POST /setup/health/dns-path-probe): - Sends a /speaker notification carrying a per-probe nonce as the app_key. To accept it the speaker must resolve audionotification.api.bosecm.com (intercepted) and call back GET /v1/auth with that nonce; the callback arriving is direct proof the speaker resolves Bose hosts through AfterTouch. - HandleSpeakerAuth returns 403 for a matching nonce so the speaker refuses the notification (silent, no audio, confirmed on hardware); any other key still gets 200 so real TTS is untouched. Reuses resolveTTSHost for SSRF-safe targeting; the nonce is never logged. Registered without refresh so the probe result stays visible in the Health tab. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>