v1.0.3 — Security hardening #93
No reviewers
Labels
No labels
area:ai
area:ci-cd
area:notifications
area:observability
area:public-pages
backlog
bug
duplicate
enhancement
help wanted
invalid
question
type:decision
type:feature
type:infra
type:maintenance
type:security
v1.0.1
v1.1.0
v1.2.0
v1.3.0
v2.0.0
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
rbrooks/WeatherBot!93
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/v1.0.3-security"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Patch release closing the security findings from the 2026-07-17 codebase audit. Behaviour-preserving where possible.
Fixes
SECRET_KEYpassed production validation (forgeable sessions). Rejected in every environment;.env.exampleships empty with generation instructions; dev uses an ephemeral key + warning. Fernet derivation left unchanged to avoid breaking stored AI keys.scrub_secrets()on all persisted notifier errors; quieted httpx request logging.configsecrets (tokens, webhook url/headers, phone numbers) were readable by any authenticated user incl. read-only. Redacted tohas_<key>in list/non-manager responses; full config only for managers.static/vendor/instead of unpkg — no third-party script trust or availability coupling.public_enabled; disabling public sharing revokes the location's NWS tokens immediately.noncegenerated/validated; logout is CSRF-protected POST (GET can't log out); media cache-key validation + path containment;excluded_event_typespersisted on create.Testing
Full suite green on the dev server (all deps): 417 passed, including new regression tests for placeholder-key rejection, credential scrubbing, per-channel secret redaction, DNS-resolution/connection-pinning SSRF, public-surface hardening, and the API bundle (nonce, logout CSRF, media validation, token revoke-on-unshare).
Reconciliation notes (cross-cutting)
POST /auth/logout(CSRF-protected) clears the session and returns the end-session URL as JSON; the frontendfetch()es it and navigates top-level — afetch()can't follow a cross-origin 303 to Authentik, so JSON hand-off is used to actually terminate SSO.urladded to the redaction set (not justheaders) since webhook URLs commonly embed a token.static/vendor/(the actualStaticFilesmount), notapp/static/.Operational follow-up
⚠️ The voip.ms API password should be rotated after this deploys — it may already be present in historical logs/DB.
Closes #45, #46, #47, #51, #59, #60, #70
🤖 Generated with Claude Code