-
Notify Bridge 0.2.1
StableRelease / release (push) Successful in 1m27sreleased this
2026-04-22 02:35:38 +03:00 | 109 commits to master since this releasev0.2.1 (2026-04-22)
Security-focused release on top of v0.2.0. Hardens the restore/backup flow,
CSRF/SSRF surfaces, JWT revocation on role change, and template-context
leakage; adds a new per-tracking-config quiet hours feature with
app-level IANA timezone support; plus a handful of performance fixes.Features
- Per-tracking-config quiet hours with app-level IANA timezone — new
Timezoneapp setting (defaults toUTC) and aQuiet Hourssection on the Immich tracking-config form. HH:MM windows (including overnight, e.g.22:00–07:00) are interpreted in the configured timezone and suppress all notifications for that tracker. (6c3dd67)
Security
- Signed & verified pending-restore bundles — SHA256 stored in
AppSettingand checked on startup apply; files outsidedata_dirare refused and permissions tightened to0600. (56993d2) - Same-origin check on
POST /api/backup/apply-restart— Bearer-in-localStorage was CSRF-reachable from any XSS'd admin tab; require matchingOrigin/Referer. (56993d2) - JWT
token_versionbumps on demotion — role/username change and admin password reset now bumptoken_versionso already-issued tokens lose admin. Last-admin TOCTOU guarded byCOUNT+ post-commit recheck that rolls back on race. (56993d2) - SSRF guard extended to
ImmichClient.__init__and theexternal_domainsetter — admin-mutable URLs were bypassing the check that webhook / Slack / Discord paths already used. Devscripts/restart-backend.shnow setsNOTIFY_BRIDGE_ALLOW_PRIVATE_URLS=1so homelab Immich instances still work. (56993d2) - Redact & cap Immich error bodies (~120 chars) before they flow into
ActionExecution.error/EventLog.details(both UI-visible). (56993d2) - Deny-list sensitive keys (
api_key,token,secret,password,authorization,cookie, …) in template-context merges so a rogue template cannot exfiltrate provider creds via{{ api_key }}. (56993d2) - Cap user-controlled Immich search params —
query≤ 256,person_ids≤ 50,size≤ 100 — so a Telegram listener cannot DoS upstream. (56993d2) - Stream upload reads with a running byte counter +
Content-Lengthprecheck instead of buffering the full body and then rejecting. (56993d2) - Log Telegram
parse_modefallbacks instead of swallowing silently — template escape bugs now surface in server logs. (56993d2) - Rollback partial imports on pending-restore failure (error recorded on a fresh session). (56993d2)
Performance
- Fix N+1 in
_refresh_telegram_chat_titles— singleINquery instead ofsession.getper chat. (56993d2) - Parallelize album & shared-link fetches in
test_dispatchviaasyncio.gather, and per-receiver Telegram test sends in the notifier with a semaphore of 5. (56993d2) - Early-exit
collect_scheduled_assets(limit=0)so the periodic-summary test path skips the full per-album filter/sample (was O(album_assets)). (56993d2) - Explicit
CREATE INDEX IF NOT EXISTSforevent_log(user_id/action_id/provider_id) so the first boot after upgrade isn't left unindexed for the dashboard query. (56993d2) - Add
AbortControllertimeout (120s) tofetchAuthso uploads/downloads don't hang indefinitely. (56993d2)
All Commits
Changelog
645331dchore: release v0.2.1
6c3dd67feat(tracking): per-config quiet hours with app-level IANA timezone
56993d2fix(security,perf): harden restore, CSRF, token_version + perf passDownloads
- Per-tracking-config quiet hours with app-level IANA timezone — new