v1.6.0 — Security hardening + i18n + custom toast logo
v1.6.0 — Major release
🔒 Security hardening (full pass)
- IDOR fix —
UserOwnershipFilterenforces per-user authorization on all/users/{id}/*routes. Previously any authenticated user could access/modify any other user's data by swapping the route ID. Users are strongly encouraged to update. - Profile card — returns 404 for unknown users, GUID validation, no more empty profile materialization on anonymous reads
- Custom badge / imported profile sanitization — length caps, range clamps, enum validation
- Webhook URL validator — blocks SSRF (loopback, RFC1918, link-local, ULA, cloud metadata)
- Client-side XSS — escaped user-controlled strings in shell.js + sidebar.js
- Input bounds — completionPercent clamped to [0,100], rejects NaN/Infinity
- Middleware buffer cap — 5 MiB on response buffering
- Rate limiting — 60/min per user, 30/min per IP (anonymous), prestige 1/hour, recompute 1/5min
- Audit log username redaction — admin opt-in to store UserId only, never write usernames to disk
- SECURITY.md — documents CSRF mitigation rationale (Jellyfin's header-token auth structurally prevents it)
Thanks to @xdnewlun1 (Techno Cricket, CCDC) for responsible disclosure of the IDOR + related findings.
🎨 Custom toast logo
Admins can upload an SVG in Feature Controls to replace the default Xbox logo in unlock toasts. Useful for custom server branding.
- XML-parsing SvgSanitizer (XXE-safe via
DtdProcessing.Prohibit) - Blocks
<script>,<iframe>,<foreignObject>,<use>,<embed>,<object> - Blocks
on*event handlers,javascript:anddata:text/htmlURIs - 100 KB cap, base64 storage
(SvgSanitizer pattern adopted from PR #8 — much better than my regex approach.)
🌍 Internationalization (8 languages)
- English, Français, Español, Deutsch, Italiano, Português, 中文, 日本語
- ~220 UI keys per language
- Admin page translated
- Badge titles + descriptions for the first ~50 most-common badges localized (Getting Started, Binge, Films, Series, Streaks, Weekend, Night Owl, etc.)
- Remaining badges fall back to English — community contributions welcome via PR
- Hot-swap on language change (no page reload)
- Per-user preference + admin server default