Security:
- [High] Server-side archive create (
POST /api/resources/archive) now resolves the full destination path for writes via symlink-scoped mutation resolution, closing arbitrary host file overwrite through an in-scope symlink leaf (GHSA-jg32-ppcc-ph62) reporter @manus-use - [Moderate]
GET /api/media/subtitlesno longer follows symlink external subtitle sidecars beside the video file, and public share requests resolve sidecar paths under the share prefix before read (GHSA-hfvf-2639-p2mq) reporter @manus-use - [Moderate] Directory motion-preview now resolves symlinked children within the caller's scope, closing the incomplete GHSA-g2q5 remediation path through
getDirectoryPreview(GHSA-2546-vf4j-vh9v) reporter @manus-use - [Moderate] RealPathCache entries for affected index paths are invalidated after symlink-scoped mutations so stale resolved paths cannot bypass containment on subsequent create, write, delete, or move operations.
- [Moderate] File watcher, download, view, upload, copy, and WebDAV now enforce per-path access rules on symlink-resolved targets, so DENY rules and scope boundaries cannot be bypassed via a link inside an allowed folder (GHSA-823x-gh7f-grmf) reporters @ch4rlesexe @manus-use @zohuyhieuzo03 @c3p31113
New Features:
- feat(cache): add server.cacheDirMaxSizeMB to cap the preview cache size (#3314)
- Square image previews: avoid the full-resolution crop copy in imaging.Fill (#3340)
Bug Fixes:
- fix(http): Unix socket hardening — default
http.socketFileModeis0660; the socket is created under a restrictive umask and thenchmod/chownapply your configured mode; on filesystem sockets, forwarded headers requirehttp.unixSocketTrustedUIDsand/orhttp.unixSocketTrustedGIDs, withhttp.unixSocketTrustAllLocalPeers: trueas an explicit opt-in for pre-#3309 trust-all behavior (startup warning) (#3309) - fix(users): save the prompt close button and new file templates when editing a user (#3342) (#3323)
- fix(upload): serialize directory creation before uploading files (#3321)
- fix(preview): open RAW, HEIC and rendered documents in the viewer when previews are disabled (#3313)
- fix(users): keep requested profile values when creating a user
- fix advanced user toggle duplicate (#3353) (#3324)
- fix(upload): don't pause while the server saves, and make the stall timeout a setting (#3346)
- fix(preview): respect EXIF orientation on embedded JPEG thumbnails (#3358)
- fix(picker): open the parent folder on a single click (#3355)
- fix(users): show password-change requirement in edit preferences (#3354)
- fix(sidebar): keep source selector stationary during horizontal tree scrolling (#3368)
- fix(http): restore Unix socket reverse-proxy behavior after #3309 hardening (#3365)
- fix(share): file checksum generation on public shares uses
GET /public/api/resources?checksum=…with the share hash and session cookie; anonymous visitors receive 401 and no longer see the checksum section in the file info dialog (#3360)
Upgrade notes (Unix socket listeners):
- If you listen on a filesystem
http.socketwithhttp.trustProxyHeaders: true, sethttp.unixSocketTrustedUIDsand/orhttp.unixSocketTrustedGIDsto the UID/GID(s) from Linux peer credentials (SO_PEERCRED) that may setX-Forwarded-*. A GID allowlist trusts every peer with that GID (for example when the proxy and FileBrowser share a group), not only one process. If you relied on empty allowlists before, sethttp.unixSocketTrustAllLocalPeers: true(a warning is logged). - Default
http.socketFileModeis0660; use optionalhttp.socketGroupwhen the proxy runs as another user in the same group.
All Changes
- fix(preview): open RAW, HEIC and rendered documents in the viewer when previews are disabled by @FandacqkaCorp in #3313
- feat(cache): add server.cacheDirMaxSizeMB to cap the preview cache size by @FandacqkaCorp in #3314
- fix(upload): serialize directory creation before uploading files by @tanetakumi in #3321
- Square image previews: avoid the full-resolution crop copy in imaging.Fill by @chatziko in #3340
- fix(i18n):Update Chinese translations for UI elements by @tigertall in #3330
- i18n: fix and improve Italian translation (it.json) by @Geekice1 in #3332
- i18n(cz): fix Czech translations by @Hromad-a in #3333
- Update fr.json by @Xyleme-git in #3343
- fix(users): keep requested profile values when creating a user by @gtsteffaniak in #3349
- updated changelog v2.1.5 by @gtsteffaniak in #3350
- fix(upload): don't pause while the server saves, and make the stall timeout a setting by @FandacqkaCorp in #3346
- fix advanced user toggle duplicate by @gtsteffaniak in #3353
- fix(users): show password-change requirement in edit preferences by @xunguangzlj-cloud in #3354
- fix(picker): open the parent folder on a single click by @xunguangzlj-cloud in #3355
- fix(preview): respect EXIF orientation on embedded JPEG thumbnails by @danielroizen in #3358
- fix(http): restore Unix socket reverse-proxy behavior after #3309 by @gtsteffaniak in #3365
- fix(sidebar): keep source selector stationary during horizontal tree scrolling by @vladderic in #3368
- update frontend deps v2.1.5 by @Kurami32 in #3378
- fix(i18n): improve French translations by @A-d-r-i in #3356
- add more cache invalidaton for realpath by @gtsteffaniak in #3381
- fix subtitles GHSA-hfvf-2639-p2mq by @gtsteffaniak in #3382
- fix GHSA-2546-vf4j-vh9v symlink previews by @gtsteffaniak in #3383
- fix GHSA-jg32-ppcc-ph62 archive extraction symlink gap by @gtsteffaniak in #3384
- Fix GHSA-823x-gh7f-grmf by @gtsteffaniak in #3385
- Fix checksum authenticated users on shares by @gtsteffaniak in #3386
- updated dependencies by @gtsteffaniak in #3387
- address coderabbit blocker comments by @gtsteffaniak in #3390
- Fix generation counters by @gtsteffaniak in #3391
- Beta/v2.1.5 by @gtsteffaniak in #3389
New Contributors
- @tanetakumi made their first contribution in #3321
- @chatziko made their first contribution in #3340
- @tigertall made their first contribution in #3330
- @Geekice1 made their first contribution in #3332
- @Hromad-a made their first contribution in #3333
- @Xyleme-git made their first contribution in #3343
- @xunguangzlj-cloud made their first contribution in #3354
- @danielroizen made their first contribution in #3358
- @vladderic made their first contribution in #3368
- @A-d-r-i made their first contribution in #3356
Full Changelog: v2.1.4-beta...v2.1.5-beta