# Changelog ## Changes 11/05/2026 (v3.42.0) `release(v3.42.0): harden administrator OIDC discovery testing` **Security hardening** - Limited administrator-supplied OIDC provider URLs to HTTP and HTTPS without embedded credentials, query parameters, or fragments, preventing use of other PHP stream wrappers. - OIDC discovery responses are now capped at 1 MiB with limited redirects, and failure responses no longer expose raw PHP fetch errors, failed destination URLs, or samples from returned JSON. - Discovery URL handling now recognizes only the exact `/.well-known/openid-configuration` path suffix instead of matching that text anywhere in the URL. **Documentation** - Documented that the administrator-only discovery test intentionally sends an outbound request from the FileRise server and supports HTTP, HTTPS, local, container-network, and private-network OIDC providers. **Upgrade notes** - Existing HTTP and private-network OIDC providers remain supported. Provider URLs containing URL credentials, query parameters, or fragments must be replaced with the provider's standard issuer URL. - No account, OIDC identity binding, file, permission, storage, Docker volume, or configuration migration is required. --- ## Changes 11/04/2026 (v3.41.0) `release(v3.41.0): enforce portal-detail authorization` **Security** - The authenticated Pro portal-detail endpoint now requires either administrator access or effective upload/download access to the requested portal's configured folder under both the portal policy and folder ACL. - A user assigned only to another portal can no longer retrieve the target portal's client email, internal folder, form defaults, source, or upload policy by supplying its slug. **Documentation** - Clarified that portal authentication does not grant access to every portal on the instance. Non-admin users must have usable folder access for the specific requested portal. **Upgrade notes** - Existing administrators, dedicated portal accounts, manually managed users, and group members retain portal access when their target-folder ACL matches the portal's enabled upload or download capability. - No account, portal, ACL, file, storage, Docker volume, or configuration migration is required. --- ## Changes 11/03/2026 (v3.40.0) `release(v3.40.0): bind file shares to file identity` **Security** - Individual-file share links are now bound to a random file-instance identity stored in file metadata. Deleting a shared file and later creating a different file at the same folder and name no longer transfers the old share link to the replacement. - Share redemption fails closed when the original file identity is missing or no longer matches. New share links also require both the file and its metadata to exist. **Fixed** - WebDAV content updates now preserve additional file metadata, including the file-share identity, so a legitimate in-place edit does not invalidate an existing share link. **Upgrade notes** - Existing individual-file share links created before v3.40.0 do not contain a file identity and will return 404 after upgrading. Recreate any file-share links that must remain active. - Folder-share links are unaffected. No account, file, folder, permission, encryption-key, or configuration migration is required. --- ## Changes 11/02/2026 (v3.39.0) `release(v3.39.0): clarify Edit and owner-only permissions` **Changed** - Renamed the English account-permission label from **Bypass Ownership** to **Bypass Owner-Only Checks** and added help text explaining its scope. The stored `bypassOwnership` setting and its authorization behavior are unchanged. **Documentation** - Explicitly documented that Folder Edit authorizes changing existing file contents regardless of uploader, including WebDAV `PUT`, while preserving the original uploader metadata. - Clarified that creating a file requires Upload, regular upload collisions retain separate ownership protection, and the bypass flag applies only to operations with an independent owner check. - Added this permission-model distinction to the security-reporting policy and beside the WebDAV overwrite gate to reduce false-positive ownership-bypass reports. **Upgrade notes** - No account, file, folder, permission, encryption-key, or configuration migration is required. - Existing account flags and folder ACLs retain their current behavior. - This release does not broaden WebDAV access or change authorization decisions. --- ## Changes 10/21/2026 (v3.38.0) `release(v3.38.0): refresh Docker PHP security packages` **Security** - Docker security rebuild for the upstream PHP2Shell vulnerabilities, CVE-2026-109618 and CVE-2026-109619. Ubuntu 24.04 fixes both in PHP package revision `8.3.6-0ubuntu0.24.04.13`; rebuilt images must contain that revision or a later fixed revision. See [USN-8948-1](https://ubuntu.com/security/notices/USN-8948-1). - Disabled PHP's unused session upload-progress feature as defense in depth. FileRise's browser progress indicators and resumable uploads use their own tracking and remain supported. This setting does not replace the PHP runtime update. **Documentation** - Added PHP runtime update and package-verification guidance for Docker and manual installations, including Ubuntu's backported security fixes. **Upgrade notes** - Docker: pull the v3.38.0 image and recreate the container with the same volumes, configuration, and persistent tokens key. Restarting an existing container or replacing application files alone does not update PHP. - Manual installs: update the server's PHP runtime separately to a patched release, such as PHP 8.3.36 or a vendor package containing both fixes. Ubuntu's patched runtime can still report `8.3.6`; check the complete package revision. - No account, file, folder, permission, encryption-key, or configuration migration is required. --- ## Changes 10/18/2026 (v3.37.0) `release(v3.37.0): enforce document editing boundaries` **Fixed** - The browser editor and WebDAV now honor the folder Edit capability consistently with ONLYOFFICE, allowing authorized content edits regardless of uploader while preserving the original uploader metadata. - ONLYOFFICE no longer opens documents inside encrypted folders, and save callbacks issued before encryption are rejected once folder encryption begins. **Documentation** - Clarified that Edit controls file-content changes, while Bypass Ownership applies only to operations with a separate ownership restriction. - Clarified how an open ONLYOFFICE session behaves when its folder becomes encrypted. **Upgrade notes** - No account, file, folder, permission, encryption-key, or configuration migration is required. - Existing upload-collision ownership protection is unchanged. --- ## Changes 10/15/2026 (v3.36.0) `release(v3.36.0): enforce the WebDAV storage boundary` **Fixed** - WebDAV COPY and MOVE destinations now reject encoded path traversal and any resolved path outside the configured uploads root. **Upgrade notes** - No account, file, folder, permission, encryption-key, or configuration migration is required. - Ordinary WebDAV clients and reverse-proxy subpath deployments require no changes. --- ## Changes 10/10/2026 (v3.35.0) `release(v3.35.0): harden shared resumable uploads` **Fixed** - Resumable uploads through public upload-enabled folder shares now validate server-measured chunk and completed-file sizes before storage and account daily quota from measured bytes. - Shared resumable uploads now use a server-signed page scope, pin their initial file metadata, and reject conflicting chunk retries. - Updated phpseclib to the patched 3.0.57 security release. **Upgrade notes** - No account, file, folder, permission, encryption-key, or configuration migration is required. - Existing upload-enabled share links automatically use the corrected size, quota, and resumable-session enforcement. --- ## Changes 10/05/2026 (v3.34.0) `release(v3.34.0): enforce folder-creation destination ACLs` **Fixed** - Folder creation now treats the submitted folder name as one leaf and authorizes nested placement through the explicit parent folder. **Upgrade notes** - No account, file, folder, permission, encryption-key, or configuration migration is required. - Custom API clients must send nested locations through `parent` and a single leaf name through `folderName`, matching the browser, MCP, and WebDAV creation contract. --- ## Changes 09/30/2026 (v3.33.0) `release(v3.33.0): harden share passwords and Windows storage boundaries` **Fixed** - File creation and upload paths now reject NTFS alternate-stream syntax before extension and reserved-name policy checks. - Password-protected file and folder shares now limit repeated verification attempts and return a retry interval when the limit is reached. **Security and deployment** - Clarified the exclusive-writer requirement for FileRise data directories and the supported Linux manual-server environment. **Upgrade notes** - No account, file, permission, encryption-key, or configuration migration is required. - New filenames containing a colon are rejected; existing files are not renamed or deleted. --- ## Changes 09/29/2026 (v3.32.0) `release(v3.32.0): harden archive and first-run security boundaries` **Fixed** - 7-Zip archive downloads now treat selected file names literally, preserving folder ACL and own-file boundaries for names containing wildcard characters. - Initial administrator creation now consumes first-run setup atomically, so overlapping requests cannot replace the account that completed setup. - Container startup now rejects unsafe persisted path state before privileged permission changes and process launch. **Upgrade notes** - No account, file, permission, encryption-key, or configuration migration is required. --- ## Changes 09/21/2026 (v3.31.0) `release(v3.31.0): align session roles and correct WebDAV subpath destinations` **Fixed** - Established browser sessions now follow the current local account role on subsequent requests. - Legacy session permission flags remain consistent with the current account role. - WebDAV MOVE and COPY now handle public Destination URLs behind reverse proxies that strip a configured subpath (#122), while preserving root and retained-prefix deployments. **Upgrade notes** - No account, file, encryption-key, or persistent-token migration is required. Existing users remain signed in with their current permissions. - OIDC role synchronization still occurs at login; the existing Allow demote setting and its default are unchanged. - Manual upgrades that retain a customized `config/config.php` must merge the updated session-bootstrap and authentication-cleanup blocks while preserving their installation settings. --- ## Changes 09/19/2026 (v3.30.0) `release(v3.30.0): refine proxy address handling and local storage path checks` **Fixed** - Client address resolution now follows the configured trusted proxy chain for forwarded requests. - Direct connections and supported single-address proxy headers retain their normal behavior. - Local file listings and download path checks consistently respect the selected storage root, including linked paths. **Upgrade notes** - No account, storage, encryption-key, or configuration-file migration is required. - Links resolving within a local storage root, including a linked root directory, remain supported. Links resolving outside that root are no longer available through file listings or download path resolution. - Multi-proxy deployments should list each trusted proxy hop in `FR_TRUSTED_PROXIES`; unlisted intermediaries become the attributed client address. - Custom single-IP headers must contain one valid address. Malformed forwarded chains fall back to the immediate peer when the client cannot be established safely. - Existing rate-limit entries and external fail2ban bans retain their current expiry and are not reset by this update. --- ## Changes 09/17/2026 (v3.29.0) `release(v3.29.0): align ONLYOFFICE permissions and correct File Request picker handling` **Fixed** - ONLYOFFICE document access and editing permissions are now evaluated against the selected storage source. - ONLYOFFICE save callbacks now check edit permissions in the document's storage source. - File Request file and folder buttons now open only their intended picker once per activation, removing duplicate picker calls associated with the reported Safari selection issue (#118). - Keyboard activation of File Request picker buttons no longer also triggers the surrounding dropzone's file picker. **Upgrade notes** - No account, ACL, document, storage, Docker volume, or configuration migration is required. - Authorized document editing and the signed download URLs used by the ONLYOFFICE Document Server retain their existing behavior. --- ## Changes 09/16/2026 (v3.28.0) `release(v3.28.0): refine WebDAV request handling` **Fixed** - Improved consistency of WebDAV request handling across client configurations. --- ## Changes 08/25/2026 (v3.27.0) `release(v3.27.0): harden authentication, authorization, and rendering` **Fixed** - The ONLYOFFICE editor-configuration endpoint now requires an authenticated FileRise session before evaluating folder permissions or creating signed document capabilities. - Unauthenticated requests can no longer fall back to the ACLs of a local account named `anonymous`. - Existing authenticated ONLYOFFICE users and the sessionless, short-lived signed download URLs used by the Document Server retain their existing behavior. - Portal form submissions now require upload authorization for the selected portal's configured folder before a submission is stored or an automation event is emitted. - Authenticated users can no longer change the submitted portal slug to create records in portals outside their folder ACLs. - Portal entry listings now enforce per-file uploader ownership when the signed-in user has `read_own` rather than full read access. - Portal counts, pagination, and complete-file arrays are now calculated after the ownership filter, preventing other users' filenames, sizes, and modification times from being disclosed. - Storage-originated folder names are now HTML-encoded in the shallow folder strip and FileRise Pro's **Storage → Top Folders** view before template rendering. - Existing folder names, navigation targets, storage enumeration, disk-usage snapshots, and FileRise's Content Security Policy remain unchanged. **Upgrade notes** - No account, ACL, file, folder, ONLYOFFICE, Docker volume, storage, or configuration migration is required. - Existing portal users, administrators, and group members with upload access to a portal folder retain their current intake-form workflow. - Portal users with full read access retain complete listings; `read_own` users now see only files attributed to their account in folder metadata. - Existing folder names containing Unicode, punctuation, or HTML-significant characters continue to display and navigate normally; those characters are treated as text rather than markup. --- ## Changes 08/07/2026 (v3.26.1) `release(v3.26.1): enforce file-only copy operations` **Fixed** - Same-source `copyFiles` operations now explicitly require each selected object to be a file before invoking the active storage adapter, matching the existing move, delete, and cross-source copy invariants. - Directory names submitted to file-copy operations are refused consistently instead of relying on adapter-specific copy behavior. - File-delete type-refusal messages no longer contain doubled trailing punctuation. **Upgrade notes** - No account, ACL, file, folder, metadata, Pro license, Docker volume, storage source, or configuration migration is required. - Normal file copies retain their existing behavior. Directory copies continue through the dedicated folder-copy workflow. --- ## Changes 08/06/2026 (v3.26.0) `release(v3.26.0): harden persistent authentication and Pro storage rendering` **Fixed** - File and folder metadata shown in FileRise Pro's **Storage → Top Files** table is now HTML-encoded before rendering, preventing uploaded file names from being interpreted as markup in an administrator's browser. - Existing file names, disk-usage snapshots, storage sources, deletion controls, Pro bundle installation, and FileRise's Content Security Policy remain unchanged. - Successful self-service password changes and administrator password resets now revoke every remember-me token belonging to the affected account. - Remember-me tokens belonging to other accounts and the password-changing user's current authenticated session remain unchanged. **Upgrade notes** - No account, ACL, file, folder, metadata, Pro license, Docker volume, storage, or configuration migration is required. - Existing names containing Unicode, punctuation, or HTML-significant characters continue to display and operate normally; the characters are displayed as text instead of being interpreted as HTML. - Upgrading alone does not expire remember-me tokens or sign out existing users. Remembered devices are asked to sign in again only after that account's password is subsequently changed or reset. --- ## Changes 08/01/2026 (v3.25.0) `release(v3.25.0): authorization and archive containment hardening` **Fixed** - The administrator-controlled account `Read-only` flag is now enforced as a hard ceiling over folder ownership, direct ACLs, inherited ACLs, and Pro group grants. - Read-only accounts can no longer create, upload, overwrite, rename, move, copy, delete, extract, or otherwise edit files through direct API requests. - Same-source folder moves, WebDAV writes, ONLYOFFICE edits, portal-user uploads, and background transfer paths now apply the same account restriction. - Existing view, download, ownership, and separately authorized sharing behavior remains available to read-only accounts. - Archive extraction now retains the original private workspace as its immutable containment boundary, preventing extracted links or redirected paths from redefining the trusted source root. - File-only move and delete operations now reject directories before mutation, preventing file-level permissions from relocating protected folder trees or moving them to Trash. - Upload folder paths now use one validated logical representation from authorization through storage, and invalid paths fail closed instead of falling back to the storage root. - Folder and resumable uploads now authorize the effective relative destination and its nearest existing folder before creating directories, writing files, or disclosing existing-file details. - Trash restoration now treats stored records as untrusted, rejects unsafe original folders and names, and resolves every destination inside the active upload root before creating directories or moving data. **Upgrade notes** - No account, ACL, folder, storage, Docker volume, or configuration migration is required. - Existing writable accounts retain their current behavior and ACLs. - Accounts already marked `Read-only` will begin enforcing the documented view/download-only restriction across direct API and WebDAV access immediately after upgrade. - Disabling `Read-only` later restores the account's existing folder and group permissions because the update does not rewrite ACL records. - Existing ZIP, 7z, and RAR workflows require no configuration or data migration; ordinary archive extraction behavior remains unchanged. - Existing file operations require no migration; integrations that move or delete directories must use the corresponding folder endpoints and folder-level authorization. - Existing browser, folder, resumable, shared, and portal upload workflows require no migration. API clients should pass the logical folder value and rely on the HTTP transport to encode it rather than embedding an additional percent-encoding layer in multipart or JSON values. - Existing valid Trash records restore normally and require no migration; malformed or tampered records remain in Trash and are refused. - The Pro bundle directory, users volume, license storage, activation behavior, and `bootstrap_pro.php` loading path are unchanged. --- ## Changes 07/26/2026 (v3.24.0) `release(v3.24.0): require authentication for portal details` **Fixed** - The FileRise Pro portal-detail endpoint now requires an authenticated session before returning internal folder, client-contact, form, or upload-policy metadata. - The deliberately public portal metadata endpoint remains available for anonymous portal-login branding and continues returning only its curated public fields. - Existing administrators and dedicated non-admin portal users retain access after signing in. **Upgrade notes** - No configuration, portal, account, Docker volume, or stored-data migration is required. - Integrations that directly requested `/api/pro/portals/get.php` without an authenticated FileRise session must use `/api/pro/portals/publicMeta.php` for public branding fields or authenticate before requesting full portal details. --- ## Changes 07/25/2026 (v3.23.1) `release(v3.23.1): correct PHP coding-standard violations` **Fixed** - Corrected PHP coding-standard formatting in the TOTP attempt limiter and OIDC authentication flow so the release quality checks complete successfully. - No application behavior, configuration, storage, authentication policy, or upgrade procedure changed from v3.23.0. --- ## Changes 07/25/2026 (v3.23.0) `release(v3.23.0): authentication and authorization hardening` **Commit message** ```text release(v3.23.0): authentication and authorization hardening - security(auth): harden TOTP verification and account settings - security(oidc): bind accounts by immutable provider identity - security(files): enforce upload, callback, and path boundaries ``` **Fixed** - TOTP verification now enforces persistent account-wide and source-wide attempt budgets across all pending-login verification paths, and the alternate auth handler now resolves the shared TOTP verifier correctly, so changing sessions or client addresses cannot reset the second-factor limit. - Successfully accepted TOTP time steps are now claimed atomically per account and authenticator secret, preventing the same still-valid code from completing authentication more than once. - Successful TOTP verification clears the account budget without counting ordinary successful logins against shared-network failure limits. - TOTP enrollment now remains pending until a valid code confirms the new authenticator, and enrollment, disablement, and recovery-code rotation require a recent full authentication. - OIDC logins now bind the validated issuer-and-subject identity to a local account, ignore unverified email for naming, and cannot attach a mutable username claim to an existing local account. - Upload and rename validation now rejects trailing-dot filenames across regular, resumable, shared, and WebDAV write paths so filesystem or web-server normalization cannot bypass blocked executable names. - Logical folder paths now reject raw or encoded `.` and `..` segments before ACL evaluation or storage access; local writes use boundary-aware containment before directory creation, and WebDAV operations cannot escape the configured source root. - ZIP, 7z, and RAR extraction now occurs in a private temporary workspace on the same local storage volume, and validated regular files are placed atomically only through real in-root destination directories; pre-existing destination symlinks can no longer redirect extraction or cleanup outside the storage root. - ONLYOFFICE save callbacks now require a valid HS256 JWT from the configured Document Server; omitting the callback JWT no longer falls back to trusting the unsigned request body. - Cross-parent folder renames now enforce destination move rights and matching ownership boundaries, preventing a folder owner from moving their tree into another user's folder or the admin-controlled root. **Upgrade notes** - **Breaking security change for existing OIDC deployments:** OIDC identities created before v3.23.0 do not have an issuer/subject binding and cannot continue matching an existing local account automatically. - **ONLYOFFICE callback security change:** Before upgrading, ensure the Document Server has outgoing/outbox JWTs enabled and uses the same secret configured in FileRise. Correctly configured deployments require no data migration. - Older or misconfigured Document Servers that omit callback JWTs will be unable to save until their outgoing JWT configuration is corrected. `ONLYOFFICE_ALLOW_UNSIGNED_CALLBACKS=1` is available only as a temporary, explicitly unsafe recovery measure; remove it immediately after confirming a signed document save. - After five failed TOTP submissions, that account waits up to 15 minutes before another verification attempt. - Sessions whose full authentication is more than five minutes old must sign in again before changing TOTP security settings; remember-me restoration alone does not satisfy this check. - Existing non-OIDC users, TOTP secrets, sessions, Docker volumes, and deployment configuration require no migration. - Before upgrading an OIDC deployment, verify a working local administrator login and back up the `users` directory. - On the first OIDC login for an existing account, FileRise presents a one-time guided link prompt for that account's local password and, when configured, TOTP. This confirmation works even when ordinary form login is disabled. - New OIDC identities whose proposed username does not collide with an existing local account continue to auto-provision normally when OIDC auto-provisioning is enabled; they are bound to the validated issuer and subject immediately and do not receive the guided link prompt. - OIDC-only users without a known local password require an administrator-assisted password reset or account migration. Complete this preparation before upgrading any deployment whose only administrator uses OIDC. - See `docs/wiki/oidc sso.md` under **Upgrading existing OIDC accounts to v3.23.0** for the complete migration procedure. --- ## Changes 07/13/2026 (v3.22.0) `release(v3.22.0): generate unique keys for pristine manual installs` **Fixed** - Pristine manual installs now generate and persist a unique persistent-tokens key instead of beginning with the published legacy fallback. - Existing environment keys, persisted key files, Docker source hints, and installations with existing state retain their current key behavior for upgrade compatibility. - Concurrent first requests coordinate key creation so every worker uses the same persisted key, and Docker now stops with an actionable error if a pristine key cannot be persisted. **Upgrade notes** - Existing legacy installs are not rotated automatically; the Admin Panel warning and controlled rotation workflow remain available. - Back up `metadata/persistent_tokens.key` with the rest of the metadata directory. --- ## Changes 07/05/2026 (v3.21.0) `release(v3.21.0): authentication and public config hardening` **Commit message** ```text release(v3.21.0): authentication and public config hardening - security(auth): enforce disabled login methods server-side - security(auth): add source-wide failed-login throttling - security(config): sanitize public footer branding HTML server-side ``` **Fixed** - **Login method policy hardening** - Form login, Basic Auth login, and OIDC login now enforce the configured disabled-login-method flags on the server. - Direct requests to disabled login endpoints now return `403 Forbidden` before credential validation or OIDC flow setup. - **Login throttling hardening** - Login throttling now keeps the existing per-source-and-username limit and also applies a source-wide failed-attempt limit. - Rotating usernames from the same source no longer grants unlimited fresh login-attempt budgets. - **Public branding config hardening** - Public site configuration now sanitizes footer branding HTML server-side before returning it to clients. - Existing safe footer text, inline formatting, and safe links are preserved. **Upgrade notes** - Deployments that intentionally disabled a login method in the Admin Panel must now re-enable it before direct API use of that method will work. - Deployments behind reverse proxies should verify trusted proxy/IP header settings so login throttling uses the real client IP instead of the proxy address. - Footer branding now permits safe text, inline formatting, and safe links; unsupported active or embedded HTML is stripped. --- ## Changes 07/03/2026 (v3.20.0) `release(v3.20.0): file preview hardening` **Commit message** ```text release(v3.20.0): file preview hardening - security(file): require authentication before snippet preview access ``` **Fixed** - **File preview hardening** - File snippet previews now require an authenticated session before any ACL, path, or file-content handling. - Unauthenticated snippet requests now return `401 Unauthorized`. --- ## Changes 06/26/2026 (v3.19.0) `release(v3.19.0): folder creation hardening` **Commit message** ```text release(v3.19.0): folder creation hardening - security(folder): reject traversal segments before directory creation ``` **Fixed** - **Folder creation hardening** - Folder creation now rejects `.` and `..` path segments before creating directories. - Local folder creation now verifies the parent path stays inside the configured upload root before directory creation. - Existing valid child-folder and root-relative nested folder creation behavior is preserved. --- ## Changes 06/23/2026 (v3.18.0) `release(v3.18.0): file operation hardening` **Commit message** ```text release(v3.18.0): file operation hardening - security(upload): reject shared-upload filename collisions and require edit authority for replacements - security(metadata): use collision-resistant folder metadata filenames ``` **Fixed** - **Upload overwrite hardening** - Public shared-folder and portal uploads are now create-only when the destination filename already exists. - Authenticated uploads now require edit authority plus ownership, folder ownership, admin, or bypass ownership before replacing an existing file. - Upload collision errors preserve the original file content and return an explicit conflict/permission response. - **Folder metadata isolation hardening** - Folder metadata filenames now preserve distinct logical folder paths instead of flattening separators and spaces into the same name. - Ownership and `read_own` checks now resolve metadata from the same isolated path used by uploads, file operations, WebDAV, and background transfer handling. - Simple non-colliding folder metadata filenames remain compatible; existing metadata for collision-prone folders is copied into the isolated filename on first access. --- ## Changes 06/20/2026 (v3.17.0) `release(v3.17.0): phpseclib dependency security update` **Commit message** ```text release(v3.17.0): phpseclib dependency security update - deps(composer): upgrade phpseclib/phpseclib to 3.0.55 ``` **Changed** - **Dependency security maintenance** - Updated `phpseclib/phpseclib` to `3.0.55` in Composer dependencies and the locked dependency set. --- ## Changes 06/16/2026 (v3.16.0) `release(v3.16.0): security hardening` **Commit message** ```text release(v3.16.0): security hardening - security(auth): require trusted proxy source validation for proxy-header login - security(webdav): block password-only WebDAV login for TOTP-enabled accounts - security(extract): apply blocked upload filename policy before archive extraction - security(setup): keep first-run setup closed after initial admin creation - security(auth): resolve remember-me admin status from the current user role - security(upload): reject encoded path separators before upload writes ``` **Fixed** - **Proxy-header login hardening** - Proxy-header login now accepts the configured identity header only from sources listed in `FR_TRUSTED_PROXIES`. - If you already use proxy-header login, set `FR_TRUSTED_PROXIES` to the reverse proxy IP or CIDR before upgrading; otherwise FileRise will ignore the identity header and users will not be auto-authenticated. - **WebDAV MFA hardening** - WebDAV no longer accepts password-only Basic authentication for accounts that have TOTP enabled. - Users who need WebDAV access should use an account without TOTP until a separate app-password flow is available. - **Archive extraction hardening** - Archive extraction now applies the blocked upload filename policy before files are written to disk. - Mixed archives can still extract allowed files while blocked file types are skipped and reported as warnings. - **First-run setup hardening** - FileRise now writes a setup-complete marker after initial admin creation and also creates it automatically for existing installs with users. - If `users.txt` later becomes empty, first-run setup remains closed and requires out-of-band recovery. - **Remember-me role hardening** - Remember-me auto-login now resolves admin status from the current user record instead of trusting role data stored with the token. - Rotated and newly issued remember-me tokens no longer store the admin flag. - **Upload filename hardening** - Upload handling now rejects encoded path separators before resolving the destination path. - Normal filenames and allowed folder upload paths continue to work. --- ## Changes 06/11/2026 (v3.15.0) `release(v3.15.0): shared-folder boundary hardening` **Commit message** ```text release(v3.15.0): shared-folder boundary hardening - security(shares): keep shared-folder subpaths inside the original shared folder boundary ``` **Fixed** - **Shared-folder boundary hardening** - Tightened public shared-folder subpath handling so listing, direct file download, upload targets, and ZIP creation remain inside the originally shared folder. - Existing normal files, subfolders, and in-bound shared-folder content remain supported. --- ## Changes 06/03/2026 (v3.14.0) `release(v3.14.0): request validation hardening and symfony/yaml dependency update` **Commit message** ```text release(v3.14.0): request validation hardening and symfony/yaml dependency update - security(csrf): enforce request-token checks on additional file and admin POST actions - deps(composer): upgrade symfony/yaml to 8.0.12 ``` **Fixed** - **Request validation hardening** - Added server-side CSRF enforcement to file creation and file share-link creation. - Added CSRF enforcement to admin OIDC discovery and ClamAV self-test POST actions. - Existing web UI flows continue to send the required CSRF token for these actions. **Changed** - **Dependency security maintenance** - Updated `symfony/yaml` to `8.0.12` in Composer dev dependencies and the locked dependency set. --- ## Changes 05/07/2026 (v3.13.0) `release(v3.13.0): DOMPurify and phpseclib dependency updates` **Commit message** ```text release(v3.13.0): DOMPurify and phpseclib dependency updates - deps(frontend): upgrade bundled DOMPurify from 3.3.1 to 3.4.2 - deps(composer): upgrade phpseclib/phpseclib to 3.0.52 ``` **Changed** - **Dependency security maintenance** - Updated bundled DOMPurify from `3.3.1` to `3.4.2` and pointed the app shell at the new vendored path. - Updated `phpseclib/phpseclib` to `3.0.52` in Composer dependencies and the locked dependency set. --- ## Changes 04/29/2026 (v3.12.0) `release(v3.12.0): TOTP setup flow hardening` **Commit message** ```text release(v3.12.0): TOTP setup flow hardening - auth(totp): tighten setup QR access to fully authenticated profile sessions - auth(totp): avoid reusing existing TOTP enrollment data during setup ``` **Fixed** - **TOTP setup flow hardening** - Tightened TOTP setup so enrollment QR generation is only available from a fully authenticated profile session. - Accounts that already have TOTP configured are no longer offered a setup QR for the existing enrollment. - Existing TOTP sign-in, recovery-code, disable, and first-time setup flows remain supported. **Changed** - **Authenticator re-enrollment behavior** - Users who need to enroll a replacement authenticator should disable TOTP and enable it again to generate a fresh enrollment. --- ## Changes 04/16/2026 (v3.11.2) `release(v3.11.2): phpseclib security dependency update` **Commit message** ```text release(v3.11.2): phpseclib security dependency update - deps(composer): upgrade phpseclib/phpseclib to 3.0.51 to pick up the latest upstream security fix ``` **Changed** - **Dependency security maintenance** - Updated `phpseclib/phpseclib` to `3.0.51` in Composer dependencies to pick up the current upstream security fix in the locked dependency set. - This release addresses the upstream advisory covering variable-time HMAC comparison in `SSH2::get_binary_packet()`. --- ## Changes 03/24/2026 (v3.11.1) `release(v3.11.1): shared-hosting worker fallback and deleted-user session invalidation (closes #110)` **Commit message** ```text release(v3.11.1): shared-hosting worker fallback and deleted-user session invalidation (closes #110) - transfer(shared-hosting): fall back from shell_exec to exec or foreground workers so move/copy/zip jobs stay usable on restrictive hosts (#110) - compat(shell): degrade ClamAV, archive, and admin diagnostics paths cleanly when PHP command execution is unavailable - auth(delete-user): invalidate deleted-account sessions and revoke remember-me tokens so removed users cannot regain access on subsequent requests ``` **Fixed** - **Shared-hosting transfer compatibility** - Fixed a case where move/copy jobs could fail with `500` on hosts that disable `proc_open()` / `shell_exec()` and similar process-launch functions, leaving folder operations unusable. - FileRise now falls back to safer worker-launch paths and foreground execution where appropriate so transfer and ZIP workflows remain usable on more restrictive shared-hosting environments. - **Deleted-account session invalidation** - Fixed a case where a deleted account could continue using an already-established session until the PHP session expired or the web service was restarted. - Deleted users can no longer regain access through remember-me restoration, and user deletion now revokes stored remember-me tokens for that account. **Changed** - **Shell-dependent feature degradation** - Shell-backed features now report clearer host limitations when PHP command execution is unavailable instead of failing with less actionable worker or command errors. - ClamAV diagnostics, archive operations, and related admin/runtime checks now degrade more cleanly on locked-down hosts. --- ## Changes 03/20/2026 (v3.11.0) `release(v3.11.0): snippet ownership enforcement and phpseclib security update` **Commit message** ```text release(v3.11.0): snippet ownership enforcement and phpseclib security update - file(snippet): enforce per-file read_own ownership checks before returning hover-preview snippet content - file(snippet): align snippet access with the existing single-file read authorization helper path - deps(composer): upgrade phpseclib/phpseclib to 3.0.50 to pick up the latest upstream security patch ``` **Fixed** - **Snippet access control for own-only folders** - The file snippet / hover-preview endpoint now enforces the same per-file ownership check already used by other single-file read paths when access comes only from `read_own`. - Users with own-only visibility can no longer retrieve snippet content from files uploaded by other users in the same folder. **Changed** - **Dependency security maintenance** - Updated `phpseclib/phpseclib` to `3.0.50` in Composer dependencies to pick up the current upstream security fix in the locked dependency set. --- ## Changes 03/16/2026 (v3.10.0) `release(v3.10.0): resumable upload hardening and ONLYOFFICE callback authorization tightening` **Commit message** ```text release(v3.10.0): resumable upload hardening and ONLYOFFICE callback authorization tightening - upload(resumable): stop deriving temporary chunk directories from raw client identifiers and switch to hashed internal temp-folder names - upload(cleanup): require authenticated upload access for resumable temp-folder removal and keep recursive cleanup bounded to the intended staging root - upload(compat): preserve normal resumable upload flow while making temp-path resolution consistent across probe, write, and cleanup paths - onlyoffice(callback): issue save callbacks only for editable sessions, bind callbacks to the authorized actor/file, and stop trusting body-supplied editor identities - onlyoffice(origin): restrict callback fetch URLs to the configured Document Server origin while keeping callback JWT validation compatible with existing deployments ``` **Changed** - **Resumable temp-folder naming** - Resumable upload staging now maps client identifiers to hashed internal temp-folder names instead of using raw identifier values directly in filesystem paths. - The same temp-folder mapping is now used consistently for chunk probe, chunk staging, and resumable cleanup operations. **Fixed** - **Resumable cleanup guardrails** - Tightened resumable temp-folder cleanup so recursive deletion stays bounded to the expected staging area. - The resumable cleanup endpoint now requires an authenticated session with upload permission for the target folder before removing chunk temp data. - **ONLYOFFICE save authorization** - View-only ONLYOFFICE sessions no longer receive save-capable callback URLs. - ONLYOFFICE save callbacks are now bound to the authorized actor and file, and no longer trust body-supplied editor identities. - Save fetches are restricted to the configured ONLYOFFICE Document Server origin before FileRise downloads updated content and writes it back to disk. --- ## Changes 03/15/2026 (v3.9.4) `release(v3.9.4): preserve legacy compatibility path while keeping post-rotation key-file preference` **Commit message** ```text release(v3.9.4): preserve legacy compatibility path while keeping post-rotation key-file preference - crypto(compat): keep legacy default-key fallback behavior for existing installs with encrypted state and no explicit key - crypto(resolve): continue preferring metadata/persistent_tokens.key after rotation so follow-up requests stop drifting back to the legacy fallback - docs(changelog): clarify that legacy installs remain supported while the post-rotation request-consistency fix stays in place ``` **Changed** - **Legacy compatibility path** - Clarified that existing installs without an explicit `PERSISTENT_TOKENS_KEY` still retain the historical legacy fallback behavior for encrypted state compatibility. - The legacy fallback remains resolver-driven in `config.php`, while rotated installs continue preferring `metadata/persistent_tokens.key` for post-rotation consistency. **Fixed** - **Release note accuracy** - Clarified the persistent-token key compatibility story so the legacy-install behavior and the post-rotation fix are documented together. --- ## Changes 03/15/2026 (v3.9.3) `release(v3.9.3): legacy fallback worker-env fix after persistent-token key rotation` **Commit message** ```text release(v3.9.3): legacy fallback worker-env fix after persistent-token key rotation - crypto(startup): stop exporting the legacy fallback key as a process-wide env value on compatibility-path installs - crypto(resolve): prefer the persisted key file over legacy_default source hints once a rotation has written metadata/persistent_tokens.key - admin(ui): eliminate post-rotation getConfig/siteConfig failures caused by workers still decrypting with the inherited legacy fallback ``` **Fixed** - **Post-rotation request consistency** - Fixed a case where some Apache workers could keep using the legacy fallback persistent-token key immediately after an in-app rotation, causing transient `getConfig.php` / `siteConfig.php` `500` responses until a refresh or restart. - Compatibility-path installs no longer export the legacy fallback key as a worker-wide env value, and the key resolver now prefers the persisted key file once rotation has written `metadata/persistent_tokens.key`. --- ## Changes 03/15/2026 (v3.9.2) `release(v3.9.2): admin config decrypt retry after persistent-token key transitions` **Commit message** ```text release(v3.9.2): admin config decrypt retry after persistent-token key transitions - admin(config): retry adminConfig.json reads once before surfacing decrypt errors after key changes - admin(ui): avoid transient getConfig failures on the first Admin Panel open after key transitions ``` **Fixed** - **Admin Panel first-open stability after key changes** - Fixed a transient `getConfig.php` failure where the first Admin Panel open after a persistent-token key transition could return `Failed to decrypt configuration.` even though a manual refresh succeeded. - `AdminModel::getConfig()` now rereads `adminConfig.json` once and retries decryption before surfacing a real decrypt error. --- ## Changes 03/15/2026 (v3.9.1) `release(v3.9.1): post-rotation bootstrap fix and startup script cleanup` **Commit message** ```text release(v3.9.1): post-rotation bootstrap fix and startup script cleanup - admin(startup): tolerate transient adminConfig decrypt fallback during persistent-token key rotation bootstrap - docker(startup): split persistent-token key file export assignment to satisfy shellcheck ``` **Fixed** - **Post-rotation bootstrap stability** - Fixed a bootstrap path that could white-page the app if `adminConfig.json` was re-read during a persistent-token key rotation transition and decryption temporarily returned a non-string value. - The startup config path now falls back safely instead of fataling during `json_decode(...)`. **Changed** - **Startup script shell hygiene** - Adjusted the persistent-token key file load/export sequence in `start.sh` so CI shell linting passes without changing runtime behavior. --- ## Changes 03/14/2026 (v3.9.0) `release(v3.9.0): persistent-token key lifecycle updates and admin rotation workflow` **Commit message** ```text release(v3.9.0): persistent-token key lifecycle updates and admin rotation workflow - docker(startup): remove baked persistent-token key defaults and auto-generate a unique key for pristine installs - admin(ui): warn when the instance is still using a legacy or placeholder persistent-token key and expose guided rotation for compatible installs - admin(crypto): add persistent-token key rotation that re-encrypts stored secrets and expires remember-me sessions - docs(docker): refresh docker run / compose guidance so metadata-backed generated keys are documented as the default path ``` **Added** - **Admin rotation workflow for persistent-token keys** - Added an admin-only rotation action that generates a new persistent-token key, re-encrypts stored secret-bearing data, writes `metadata/persistent_tokens.key`, and intentionally expires remember-me sessions. - Added an admin warning card with rotation guidance for instances still using a legacy or placeholder persistent-token key. **Changed** - **Docker startup behavior** - Pristine Docker installs now auto-generate and persist a unique persistent-token key in `metadata/persistent_tokens.key`. - Existing installs without an explicit key continue on the legacy compatibility path until the operator rotates them. - **Docker examples and env reference** - Updated `docker run`, compose, and env-reference guidance so `PERSISTENT_TOKENS_KEY` is optional by default and no published placeholder value is documented. **Fixed** - **Persistent-token key lifecycle** - Existing installs can now move off the legacy compatibility key without losing admin config, user-permissions, stored TOTP secrets, or source credentials. - Remember-me sessions are explicitly expired during rotation instead of being left in a mixed-key state. **Security** - **Install defaults** - The runtime image no longer ships a baked-in persistent-token key default. - New Docker installs now start with instance-unique key material by default as long as `metadata/` is persistent. --- ## Changes 03/12/2026 (v3.8.0) `release(v3.8.0): share-link admin guards and centralized safe-upload policy` **Commit message** ```text release(v3.8.0): share-link admin guards and centralized safe-upload policy - shares(security): require authenticated admin + CSRF for file share link listing and deletion - uploads(policy): add centralized safe-upload policy with strict default and code-friendly admin override - webdav(policy): enforce the shared write-name policy for WebDAV file and folder creation paths - admin(ui): expose safe upload policy in Admin Panel and persist the normalized config value - admin(fix): guard partial config updates that omit oidc payloads ``` **Added** - **Centralized safe-upload policy** - Added `src/FileRise/Support/UploadNamePolicy.php` to centralize write-path filename policy decisions. - Added admin-configurable policy modes: - `strict` (default) - `code_friendly` **Changed** - **File share admin endpoints** - `getShareLinks.php` now requires an authenticated admin session. - `deleteShareLink.php` now requires an authenticated admin session and a valid CSRF token. - Updated the generated OpenAPI spec to reflect the authenticated share-link route behavior. - **Write-path filename enforcement** - Normal uploads, file create/save flows, selected folder write paths, and WebDAV now use the shared write-name policy instead of relying only on the generic filename regex. - Added an Admin Panel control under upload settings so operators can switch between `strict` and `code_friendly` behavior. **Fixed** - **Partial admin config saves** - Fixed admin config updates failing when the submitted payload omits the `oidc` object during narrower settings changes. - **WebDAV folder-name validation** - WebDAV folder creation now rejects invalid path-like names such as empty names, `.` / `..`, and names containing path separators. **Security** - **Safe-upload defaults** - New write operations default to `strict` mode. - `.htaccess`, `.user.ini`, and `web.config` remain blocked in all policy modes. - **Share-link guard consistency** - File share-link listing and deletion now use the same authenticated admin expectations as the rest of the admin share management surface. --- ## Changes 03/08/2026 (v3.7.0) **Demo videos** - [FileRise Pro AI Chat: Organize Files By Type](https://youtu.be/zoM7LudY934) - [FileRise Pro AI Chat: Extract Invoice Fields to JSON and CSV](https://youtu.be/HhY__X695KM) `release(v3.7.0): AI chat admin workspace, public share/portal copilots, PDF previews, and WebDAV read-stream hardening` **Commit message** ```text release(v3.7.0): AI chat admin workspace, public share/portal copilots, PDF previews, and WebDAV read-stream hardening - pro(ai): add core AI API wrappers, admin AI workspace hooks, and public share/portal copilot integration seams - files(pdf): add opt-in local PDF thumbnails and inline PDF preview support - mcp(core): extend scoped operation catalog for AI file/folder actions and metadata discovery - automation(core): expose AI watched-rule and approval actions through ProAutomationApiService - storage(webdav): switch remote reads to curl-backed streaming with low-speed timeout handling - security: keep public AI explicitly opt-in per share/portal and preserve scoped public guards ``` **Added** - **Core AI API surface for Pro integration** - Added AI endpoint wrappers under: - `/api/pro/ai/chat.php` - `/api/pro/ai/config/{get,save,public}.php` - `/api/pro/ai/share/chat.php` - `/api/pro/ai/portal/chat.php` - `/api/pro/ai/agents/{list,save,delete}.php` - `/api/pro/ai/recipes/{list,save,delete}.php` - `/api/pro/ai/jobs/queue.php` - **Automation AI workflow endpoints** - Added endpoint wrappers under: - `/api/pro/automation/ai-rules/{list,save,delete}.php` - `/api/pro/automation/approvals/{list,decide}.php` - `/api/pro/automation/agent/inbound.php` - `/api/pro/automation/jobs/output.php` - **Admin AI workspace UI** - Added the in-app AI chat/admin shell and AI-specific admin controls in: - `public/js/aiChat.js` - `public/js/adminAutomation.js` **Changed** - **Public share + portal AI UX** - Shared-folder and portal public views now expose scoped AI copilot entrypoints, prompt examples, and dedicated styling for public AI interactions. - Share and portal admin/settings flows now support per-link or per-portal AI enablement controls. - **PDF preview support** - Gallery cards and desktop hover previews can now show rasterized first-page thumbnails for local PDF files. - Added a Core admin toggle under `Appearance, UI & Indexing` so PDF thumbnails remain opt-in and can be disabled to restore the old icon/no-preview behavior. - PDF files can now open inline in the existing file preview modal when the feature is enabled. - **Core MCP operation seam for AI** - Extended `src/FileRise/Domain/McpCoreOpsService.php` with additional scoped operations used by AI flows: - `read_file` - `create_file` - `create_folder` - `copy_files` - `rename_file` - Added operation metadata/catalog helpers so AI/admin surfaces can describe allowed operations without duplicating rules. - **Automation API service coverage** - Extended `src/FileRise/Domain/ProAutomationApiService.php` to expose AI watched-rule and approval actions through the existing core service seam. - **Share/portal metadata** - Shared-folder and portal records now carry `aiEnabled` metadata so public AI can be explicitly enabled or disabled per surface. - **Runtime image** - Updated `Dockerfile` for the AI-enabled runtime prerequisites used by this release branch, including `poppler-utils` for local PDF thumbnailing and AI document workflows. **Fixed** - **Public AI share default regression** - Fixed newly created shares defaulting to `aiEnabled=0` when older or hidden UI paths omitted the field. - The share modal now only sends `aiEnabled` when the control is visible, preserving backward-compatible defaults. - **Public AI config endpoint guard** - Fixed `/api/pro/ai/config/public.php` using the authenticated AI guard instead of the public guard, which could block unauthenticated share/portal pages from loading AI availability correctly. - **PDF preview regressions** - Fixed authenticated PDF inline viewing so PDFs no longer download instead of rendering in the preview modal. - Fixed the PDF thumbnail toggle save path and disabled-state behavior so the old outside-the-modal PDF behavior is restored when the toggle is off. - **WebDAV source streaming** - Updated the WebDAV adapter read path to use the curl-backed read stream helper with clearer low-speed timeout handling and better read-stream failure reporting. **Security** - **Scoped public AI enforcement** - Public share and portal AI routes stay bounded to the current share/portal scope, reuse existing access checks, and continue sending `Cache-Control: no-store` plus `X-Content-Type-Options: nosniff`. - **External provider disclosure** - Admin AI Settings and the in-app AI Chat now warn when enabled providers are external, so operators are explicitly reminded that prompts and visible file excerpts may leave the instance. - **Admin/API guard consistency** - New authenticated AI and automation wrappers use centralized bootstrap/guard helpers instead of duplicating auth/admin/CSRF logic across endpoints. **Docs** - Added wiki coverage for Pro AI chat/admin features and linked it in the docs sidebar. --- ## Changes 03/05/2026 (v3.6.1) `release(v3.6.1): iPad hover preview pointer compatibility + configurable hover delay (refs #105)` **Commit message** ```text release(v3.6.1): iPad hover preview pointer compatibility + configurable hover delay (refs #105) - file-list(ux): add per-user hover preview delay setting in User Panel (0-2500ms, default 180ms) - file-list(fix): allow hover preview on hybrid pointer devices (iPadOS + Magic Keyboard/trackpad) while keeping touch-only devices disabled - i18n: add hover delay label/help strings ``` **Changed** - **File-list hover preview UX** - Added per-user hover preview delay control in User Panel -> Display (`0`-`2500` ms, default `180` ms). **Fixed** - **Hover preview device-compatibility regression** - Fixed hover preview being incorrectly disabled on iPadOS pointer setups (for example Magic Keyboard/trackpad) by allowing hover-capable hybrid pointer devices while keeping touch-only devices disabled. --- ## Changes 03/02/2026 (v3.6.0) `release(v3.6.0): Gateway Shares v2 + Automation APIs, MCP core seam, and runtime hardening` **Commit message** ```text release(v3.6.0): Gateway Shares v2 + Automation APIs, MCP core seam, and runtime hardening - pro(api): add managed gateway + MCP service/user/job endpoints and Automation wrappers via Domain services - mcp(core): add McpOpsContext + McpCoreOpsService seam with ACL-scoped operations and fast-list paging/cache path - api(refactor): centralize Pro endpoint guards/emit helpers and move gateway/automation orchestration into src/FileRise/Domain - runtime/security: add gnupg to Docker runtime image for managed rclone signature verification support - style/docs: targeted PSR-12 cleanup in new core seam files and docs refresh for Gateway Shares + Automation ``` **Added** - **Gateway Shares v2 + MCP API surface (Core integration for Pro)** - Added managed runtime endpoints: - `/api/pro/gateways/managed/status.php` - `/api/pro/gateways/managed/action.php` - `/api/pro/gateways/managed/rcloneInstall.php` - `/api/pro/gateways/managed/rcloneCheck.php` - `/api/pro/gateways/managed/rcloneUpload.php` - Added MCP service/user/job endpoints: - `/api/pro/gateways/mcp/service/{status,action}.php` - `/api/pro/gateways/mcp/users/{list,save,delete}.php` - `/api/pro/gateways/jobs/{cleanup,autotag}.php` - **Automation API surface (Core integration for Pro)** - Added endpoint wrappers under: - `/api/pro/automation/webhooks/*` - `/api/pro/automation/jobs/*` - `/api/pro/automation/worker/*` - `/api/pro/automation/scans/*` - `/api/pro/automation/security/*` - `/api/pro/automation/metrics.php` - **Core service seam for Pro orchestration** - Added: - `src/FileRise/Domain/ProGatewayApiService.php` - `src/FileRise/Domain/ProAutomationApiService.php` - `src/FileRise/Domain/McpOpsContext.php` - `src/FileRise/Domain/McpCoreOpsService.php` - Added shared helpers: - `public/api/pro/_common.php` - `public/api/pro/gateways/_common.php` - `public/api/pro/automation/_common.php` **Changed** - **Gateway admin UX** - Gateway Shares now includes Shares/MCP tabs with managed status/actions, logs, rclone install/update/upload controls, and job queue actions. - MCP tab now includes `AI Integration Templates` with copy/download snippets for OpenAI, Claude, Gemini, and direct curl testing. - **Runtime image prerequisites** - Added `gnupg` to `Dockerfile` package install list to support managed rclone signature verification in container deployments. - **Version hint alignment** - Updated admin latest Pro bundle UI hint to `v1.9.0`. **Fixed** - **Core bootstrap/order and API guard regressions** - Fixed Pro API bootstrap ordering edge cases around `PROJECT_ROOT`/shared guard bootstrap usage. - **Gateway admin runtime regressions** - Fixed managed gateway admin UI helper scope issues (`setManagedStatus`/`setManagedLog`). - **Style/lint** - Applied targeted PSR-12 declaration/brace/EOF fixes in newly added Core seam files. **Docs** - Updated admin/wiki docs for Gateway Shares v2 + Automation coverage. --- ## Changes 02/19/2026 (v3.5.1) `release(v3.5.1): authenticated Link File deep links + shared file request mode` **Commit message** ```text release(v3.5.1): authenticated Link File deep links + shared file request mode - files(core): add internal authenticated file links (create/resolve token endpoints + ACL-checked deep-link open) - ui(files): add Link File in row context menu + toolbar single-selection action with copy-link modal - boot/auth: preserve fileLink return URL through login/OIDC, resolve link post-auth, focus/highlight linked file - shares: add upload-only File Request mode for shared folders with hide-listing support and dedicated drop-zone UI - shared-upload: add per-link validation/rate limits/quota tracking + safer relative-path handling for chunked uploads - admin: improve shared links listing with file-request grouping and created-by/source metadata ``` **Added** - **Authenticated internal file deep links (Core)** - Added new API endpoints: - `/api/file/createAuthFileLink.php` - `/api/file/resolveAuthFileLink.php` - Added internal token persistence/lookup for file links in `FileModel`. - Added new frontend link module: - `public/js/fileLink.js` - **Shared folder file-request experience** - Added upload-only (“drop”) mode support with hide-listing behavior. - Added dedicated upload UI for drop mode: - `public/js/sharedDropView.js` - Added share options for upload constraints: - max file size - allowed file types - daily file-count limit - daily total-size limit - preserve-folder-structure toggle **Changed** - **File actions/UI** - Added `Link File` action to: - file row context menu - file toolbar (enabled only for exactly one selected file). - **Auth/deep-link boot flow** - `main.js` now preserves `?fileLink=` return URL through login/OIDC and resolves it after auth. - Linked file navigation now opens the target folder and selects/highlights the file row. - **Folder share modal + public share page** - Share modal now supports both classic folder share and upload-only file request creation. - Public shared-folder view switches between browse mode and drop mode assets/layout. - **Admin shared-link management** - Shared links list now distinguishes folder shares vs file requests and surfaces source/creator context. --- ## Changes 02/16/2026 (v3.5.0) `release(v3.5.0): async transfer jobs + Transfer Center UX, service-layer API refactors, and folder UI consistency fixes` **Commit message** ```text release(v3.5.0): async transfer jobs + Transfer Center UX, service-layer API refactors, and folder UI consistency fixes - transfers: add async job manager + worker + start/status/list/cancel endpoints for file/folder copy/move - ui: replace legacy transfer popups with Transfer Center multi-job progress + cancel flow for move operations - api/refactor: move admin/pro endpoint logic into Domain services (sources/audit/gateways/portals/metadata/encryption) - acl: fix worker-side admin permission parity to prevent false "manage rights required on source" errors - folders: align tree/list context menus for encrypt/decrypt and route folder crypto progress through Transfer Center - dual-pane/gallery: fix folder row pane targeting and long filename grid overflow in gallery view ``` **Added** - **Async transfer job infrastructure (Core)** - Added transfer job manager + worker orchestration for long-running file/folder copy/move. - Added transfer job endpoints: - `/api/file/transferJobStart.php` - `/api/file/transferJobStatus.php` - `/api/file/transferJobList.php` - `/api/file/transferJobCancel.php` - Added frontend transfer runner module: - `public/js/transferJobs.js` - **Domain service layer for API refactors** - Added service classes for source access/admin, audit policy, portal submissions/meta, gateway test, metadata read, disk usage scan launch, and folder encryption orchestration. **Changed** - **Transfer UX** - Main copy/move flows now use async jobs with Transfer Center progress cards (bottom-right), including move cancel support. - Move modal flow now closes promptly when the transfer starts instead of waiting until completion. - **Folder encryption UX** - Folder encrypt/decrypt progress now renders in the same Transfer Center UI instead of the legacy crypto modal/pill. - File-list folder context menus now expose Encrypt/Decrypt actions (when caps allow), matching tree context menus. - **Controller/API structure** - Refactored selected admin/pro endpoints into thin wrappers backed by domain services while keeping endpoint compatibility. - **File-list behavior** - Improved dual-pane state sync and destination refresh after cross-source folder moves. - Gallery cards now preserve configured column count with long filenames (wrapping + constrained grid tracks). **Fixed** - **False ACL failure in cross-source folder moves** - Fixed worker-side admin parity so admin users no longer hit erroneous `Forbidden: manage rights required on source` during async folder moves. - **Dual-pane folder navigation regression** - Fixed inline folder-row click handling to resolve pane context correctly (no undefined pane reference / click dead-ends). - **Post-move stale folder row state** - Fixed cases where moved folders briefly appeared with stale `0 items` and were not immediately navigable until refresh. --- ## Changes 02/15/2026 (v3.4.1) `release(v3.4.1): PHPCS PSR-12 inline-control cleanup for storage adapters/config` **Commit message** ```text release(v3.4.1): PHPCS PSR-12 inline-control cleanup for storage adapters/config - style(psr12): replace inline control structures with block form in WebDavAdapter - style(psr12): replace inline control structures with block form in SourcesConfig - ci: keep phpcs --standard=phpcs.xml src/FileRise clean ``` **Changed** - **PSR-12 style cleanup (no behavior change)** - Refactored inline one-line control structures into block form in: - `src/FileRise/Storage/WebDavAdapter.php` - `src/FileRise/Storage/SourcesConfig.php` - Reformatted one long conditional in `SourcesConfig` for readability/line-length consistency. **Fixed** - **CI lint failures** - Resolved PHPCS errors (`Inline control structures are not allowed`) reported in GitHub Actions for `WebDavAdapter` and `SourcesConfig`. - `phpcs --standard=phpcs.xml src/FileRise` now passes for this scope. --- ## Changes 02/15/2026 (v3.4.0) `release(v3.4.0): Core Sources (Local + WebDAV), Pro Gateway Shares admin/API, pretheme CSP cleanup, and pagination fix (closes #104)` **Commit message** ```text release(v3.4.0): Core Sources (Local + WebDAV), Pro Gateway Shares admin/API, pretheme CSP cleanup, and pagination fix (closes #104) - sources(core): add SourcesConfig + core WebDAV adapter (Local + WebDAV without Pro) - sources(api/ui): migrate /api/pro/sources/* to SourcesConfig and expose capability metadata (allowedTypes/proExtended) - admin: add per-source delete-permanently toggle + trash-off badges/hints - pro: add Gateway Shares admin section + /api/pro/gateways/{list,save,test,delete} - ui: fix pagination getting stuck on page 2 in table/gallery (pane state sync) - frontend/security: move pretheme to external js/pretheme.js and remove inline CSP hash requirement - licensing: attempt yearly-plan instance auto-bind on license save with clearer autoBind responses ``` **Added** - **Core Sources support (without Pro)** - Added `SourcesConfig` to provide a unified source config layer for Core + Pro. - Core now supports **Local** and **WebDAV** source types directly. - Added capability metadata in sources responses: `available`, `proExtended`, `allowedTypes`, `coreTypes`, `proTypes`. - **Core WebDAV adapter** - Added `WebDavAdapter` in core storage layer and wired it through `StorageFactory`. - Added legacy shims: `src/lib/SourcesConfig.php`, `src/lib/WebDavAdapter.php`. - **Pro Gateway Shares API surface (Core integration for Pro)** - Added admin API endpoints: - `/api/pro/gateways/list.php` - `/api/pro/gateways/save.php` - `/api/pro/gateways/test.php` - `/api/pro/gateways/delete.php` - Added admin UI section for Gateway Shares (SFTP/S3/MCP) with snippet preview/copy + validation output. - **Pre-theme bootstrap script** - Added `public/js/pretheme.js` to apply theme before full app load and reduce first-paint flash. **Changed** - **Sources APIs now run through `SourcesConfig`** - `/api/pro/sources/{list,save,select,delete,test,visible}` migrated from direct `ProSources` checks to `SourcesConfig`. - Source endpoints no longer hard-fail with `Pro is not active` for Core-supported source workflows. - **Source-aware delete/trash behavior** - Added per-source `disableTrash` support end-to-end (API/UI/storage metadata). - `FileModel` now respects source trash mode and returns clearer errors when Trash directory creation fails. - Recycle Bin node is hidden for sources with trash disabled. - **Admin + i18n updates** - Updated source wording/hints for the delete-permanently toggle and trash behavior. - Added gateway-share translation keys and UI strings. - **CSP / bootstrap flow** - Replaced inline pre-theme script with external `js/pretheme.js`. - Updated `.htaccess` CSP baseline to remove inline script hash requirement. - Added rewrite rule to serve `/index.html` via `index.php` for consistent bootstrapping. - **License save flow** - Admin license save now attempts automatic Instance-ID bind for yearly plans and returns `autoBind` result details. **Fixed** - **Pagination stuck on page 2 (Issue #104)** - Fixed pane-local pagination state sync for both table and gallery views so Prev/Next works reliably after page changes. - **Dual-pane activation guard** - Prevented pane activation click handling when dual-pane mode is disabled. - **OnlyOffice CSP helper text** - Updated generated Apache/Nginx CSP helper examples to remove obsolete inline script hash guidance. **Docs** - Added/updated documentation for: - Sources onboarding and admin notes - Core/Pro source behavior - Pro Gateway Shares --- ## Changes 02/10/2026 (v3.3.3) `release(v3.3.3): fix OnlyOffice local sourceId handling + improve Pro bundle download reliability (Cloudflare UA + ZIP sanity checks)` **Commit message** ```text release(v3.3.3): fix OnlyOffice local sourceId handling + improve Pro bundle download reliability - onlyoffice: treat sourceId=local as valid when Sources are disabled (non-Pro + legacy Pro bundles) - admin: make Pro bundle remote download more reliable (browser UA + Accept headers) - admin: detect HTML/CF challenge responses and return clearer install guidance + httpCode ``` **Fixed** - **OnlyOffice “Invalid source” on non-Pro installs** - `sourceId=local` is now accepted even when Pro Sources are not available/enabled. - Prevents OnlyOffice open failures on core-only installs and legacy Pro bundles that don’t provide ProSources. **Changed** - **Pro bundle “Download latest” installer is more resilient** - Remote download requests now send a browser-like **User-Agent** and **Accept** headers (reduces Cloudflare/bot-block false negatives). - When the remote response is HTML (common “Just a moment…” / challenge page), FileRise now: - detects the mismatch (ZIP signature must start with `PK`) - returns a clear error suggesting **Manual upload** of the Pro ZIP - includes `httpCode` in the JSON response for troubleshooting - Stream fallback now captures non-200 bodies (`ignore_errors=true`) to improve diagnostics. --- ## Changes 02/09/2026 (v3.3.2) `release(v3.3.2): PSR-4 backend migration + legacy shims` `chore(psr4): PSR-4 backend migration + legacy shims (WIP, no release)` **Commit message** ```text release(v3.3.2): PSR-4 backend migration + legacy shims - backend: migrate core PHP to Composer PSR-4 (FileRise\\) under src/FileRise/ - entrypoints: update API/WebDAV/CLI/tests to use namespaced controllers/models (no shim includes) - compat: restore legacy src/controllers + src/models + src/lib shims (optional FR_SHIM_WARN logging) - api: canonical endpoints now live under /api/admin/* and /api/profile/*; legacy /api/*.php shims kept - openapi: generate spec from the PSR-4 OpenAPI directory - php: fix PHP 8.2+ nullable type deprecation in AuthModel::getClientIp() - ci: harden release/changelog workflows (safe version parsing + enable workflow_run trigger) ``` **Highlights** - Backend is now PSR-4 namespaced and Composer-autoloaded (`FileRise\\...`) with legacy shims kept for compatibility. - API endpoints are organized by scope (admin/profile/public) while preserving legacy URLs. **Changed** - **PSR-4 backend layout** - Introduced `FileRise\\` namespace with code moved under `src/FileRise/` (Domain, Controllers, Storage, Support, WebDAV). - `config/config.php` now loads `vendor/autoload.php` when present (logs a warning if missing). - **Entrypoints updated** - Public API endpoints, WebDAV (`public/webdav.php`), CLI scripts, and tests now instantiate namespaced controllers/models directly. - **OpenAPI generation** - OpenAPI generator updated to scan the PSR-4 OpenAPI directory. - Bump version **Compatibility** - **Legacy backend shims remain** - `src/controllers/*`, `src/models/*`, `src/lib/*`, `src/webdav/*` forward to PSR-4 classes via `class_alias`. - Optional dev-only shim usage tracking via `FR_SHIM_WARN=1` (logs which shims were used per request). - **Legacy API endpoint shims** - Old `/api/*.php` routes forward to canonical endpoints under `/api/admin/*` and `/api/profile/*`. **CI** - ShellCheck: `scripts/gen-openapi.sh` is POSIX-clean (no `pipefail`, no quote-expansion warnings). - PHPCS job runs on PHP 8.4 (current `swagger-php` dev dependency tree requires PHP >= 8.4). - ci: harden release/changelog workflows (safe version parsing + enable workflow_run trigger) **Fixed** - **PHP deprecation warning** - `AuthModel::getClientIp()` now uses an explicit nullable type for the `$server` arg. --- ## Changes 02/01/2026 (v3.3.1) `release(v3.3.1): fix non-Pro sourceId validation for move+copy & update SECURITY policy wording` **Commit message** ```text release(v3.3.1): fix non-Pro sourceId validation for move+copy & update SECURITY policy wording - sources: only validate sourceId+destSourceId when Sources are enabled (prevents non-Pro move+copy failures) - docs(security): clarify supported versions policy wording and contact formatting - scripts: bump manual-sync helper version string to v3.3.1 ``` **Fixed** - **Non‑Pro move/copy “Invalid source id” bug** - `FileController` and `FolderController` now only parse/validate `sourceId` / `destSourceId` when Sources are enabled. - When Sources are disabled (Core-only installs), move/copy requests no longer fail due to stray/empty sourceId fields. **Changed** - **SECURITY.md** - Updated wording to “latest minor release line only” and simplified version support table. - Normalized security contact URLs/emails and clarified the “upgrade to latest” guidance. - Added acknowledgement mention for `@ByteTyson` alongside earlier disclosures. - **scripts/manual-sync.sh** - Updated helper comment/version string to v3.3.1. --- ## Changes 01/31/2026 (v3.3.0) `release(v3.3.0): security hardening (tag color sanitization + restrict direct uploads access)` **Security** - Hardened tag color handling to prevent HTML/CSS injection: - Tag colors are now sanitized server-side on save and on read. - Allowed formats: `#RGB` / `#RRGGBB` and simple named colors. - Invalid values fall back to a safe default. - Docker default now blocks direct `/uploads/*` access: - File data should be accessed via authenticated API/download flows (and share links where applicable). - Added a constrained public endpoint for profile pictures / portal logos: - `GET /api/public/profilePic.php?file=` - Locked to `UPLOAD_DIR/profile_pics/` with realpath boundary checks - Image-only MIME allowlist + `X-Content-Type-Options: nosniff` **Changed** - **Behavior change (security, Docker default):** Direct requests to `/uploads/...` are no longer served. - If you intentionally need a public file host, use share links or a separate explicitly-public directory/vhost. - Tag APIs now accept optional `sourceId` and sanitize tags end-to-end for Sources. **Docs/OpenAPI** - OpenAPI updated to reflect: - tag objects (`{name,color}`) - `sourceId` parameters for tag endpoints - profile picture URLs served via `/api/public/profilePic.php` --- ## Changes 01/30/2026 (v3.2.4) `release(v3.2.4): OIDC group-claim mapping + extra scopes (Authentik & Keycloak-friendly) + sponsor list update` **Commit message** ```text release(v3.2.4): OIDC group-claim mapping + extra scopes (Authentik & Keycloak-friendly) + sponsor list update - OIDC: add configurable group claim + extra scopes (Admin + env overrides) - OIDC: extract group tags from both userinfo and ID token, supports dot-path claims (e.g. realm_access.roles) - Admin: surface effective & locked groupClaim + extraScopes values and include them in OIDC debug snapshot - Docs OpenAPI: document new OIDC config fields - Admin: add new Pro supporter name to thanks list ``` **Added** - **OIDC: configurable group claim name** - Admin setting: `oidc.groupClaim` (default behavior remains `groups`) - Env override: `FR_OIDC_GROUP_CLAIM` (locks Admin field when set) - Supports **dot-path claims** (example: `realm_access.roles`) - **OIDC: extra scopes** - Admin setting: `oidc.extraScopes` (space/comma separated) - Env override: `FR_OIDC_EXTRA_SCOPES` (locks Admin field when set) - Effective scopes become: `openid profile email` + your extras - **OIDC debug snapshot improvements** - `/api/admin/oidcDebugInfo.php` now shows: - `groupClaim` + source (`env|config|default`) - `extraScopes` + source (`env|config|none`) - final `scopes[]` list **Changed** - **Group mapping reads both claim sets** - Group tags are extracted from: - Userinfo response, and - ID Token payload (when available from the OIDC library) - This improves compatibility with IdPs that only place groups/roles in one of those. **Fixed** - Group mapping reliability with IdPs like Authentik/Keycloak where: - groups are not under the default `groups` claim, and/or - groups require requesting an additional scope. **Security / Hardening** - `groupClaim` and `extraScopes` inputs are sanitized on save (control chars stripped + length capped). - No user-controlled HTML is introduced; config values are escaped in the Admin UI. - No secrets are logged or echoed back. --- ## Changes 01/29/2026 (v3.2.3) `release(v3.2.3): resumable upload UX fixes + stale chunk cleanup + folder re-upload conflict handling (closes #100, closes #101, closes #102)` **Commit message** ```text release(v3.2.3): resumable upload UX fixes + stale chunk cleanup + folder re-upload conflict handling (closes #100, closes #101, closes #102) - uploads: fix resumable resume banner layout for long filenames + improve dismiss behavior - uploads: add preflight check existing files flow for folder uploads (resume+skip+overwrite) - cleanup: add resumable TTL (Admin + env) + background sweeps + admin CLI cleanup tools - folders: allow deleting empty folders by cleaning resumable temp dirs first - docs: update OpenAPI (uploads config, checkExisting endpoint, cleanup endpoint) ``` **Fixed** - **#100:** Resumable resume banner **Dismiss** button is now reliably visible even with very long filenames. - Wrapped banner content and forced safe word wrapping so long names don’t push the button off-screen. - **#101:** You can now delete a folder that only contains unfinished resumable chunks (refresh → dismiss → folder looked empty but wouldn’t delete). - Folder delete now cleans `resumable_*` temp dirs for that folder before the “is empty” check. - **#102:** Re-uploading a folder after an interruption no longer blindly re-uploads files that already exist. - New “Existing files detected” modal lets users choose: **Resume** (skip same-size), **Skip existing**, or **Overwrite**. **Added** - **Upload preflight endpoint:** `POST /api/upload/checkExisting.php` - Checks a list of relative paths and reports which already exist (and whether size matches). - Supports `sourceId` when Sources is enabled. - **Resumable cleanup controls** - Admin setting: **Resumable cleanup age (hours)** (`uploads.resumableTtlHours`, default 6h) - Admin action: **Run cleanup now** (`POST /api/admin/resumableCleanup.php`) - CLI tool: `src/cli/resumable_cleanup.php` (supports `--all`, `--source`, `--respect-interval`) **Changed** - **Resumable drafts banner UX** - Banner copy now explains how to resume and that Dismiss clears partial uploads + temp files. - Dismiss now attempts cleanup via `removeChunks` for all pending identifiers in the current folder. - **Resumable temp management** - Tracks folders with pending resumable temp dirs via a small index (`resumable_pending.json`) - Performs periodic TTL-based sweeps (rate-limited) to remove stale temp folders automatically. - **Admin config / siteConfig** - `uploads.resumableTtlHours` is now included in config payloads. - **OpenAPI** - Docs updated for uploads config, `checkExisting`, and admin cleanup endpoints. --- ## Changes 01/28/2026 (v3.2.2) `release(v3.2.2): update OpenAPI spec to match shipped endpoints` - OpenAPI spec (openapi.json.dist) updated to reflect current behavior - Archive downloads are queued jobs (JSON response) and support format: zip|7z - downloadZipFile now documents “archive stream” (not zip-only wording) - Extract endpoint docs now reflect ZIP/7Z/RAR support - File share supports view=1 landing page + inline=1 for safe types - Shared folder APIs documented for path= (subfolders) + new shared folder zip download endpoint - New thumbnail endpoint documented (/api/file/thumbnail.php) - OpenAPI info.version bumped to 3.2.2 --- ## Changes 01/28/2026 (v3.2.0 & v3.2.1) `release(v3.2.1): fix asset stamper to stamp src/ templates + APP_QVER placeholders` - stamp-assets: include src/ alongside public/ for stamping - stamp-assets: replace {{APP_QVER}} in HTML/CSS/PHP templates and validate no placeholders remain `release(v3.2.0): share pages revamp + portals browse/download-all + Pro branding upgrades` **Commit message** ```text release(v3.2.0): share pages revamp + portals browse/download-all + Pro branding upgrades - shares: modern Dropbox-like share UI (file + folder), safe inline previews, and optional subfolder access - portals: subfolder browsing + pagination, list/gallery toggle, download-all zip, resumable uploads, submission IDs - branding (Pro): meta description + favicons + theme colors + login/app backgrounds + share/portal branding - security: sanitize footer HTML; tighten shared uploads with per-share upload token; validate share/portal paths ``` **Added** - **Shares (Core)** - **Folder shares** can optionally **include subfolders** (`allowSubfolders`) when creating the link. - Shared folder browsing supports `path=` for subfolder navigation (when enabled). - New public endpoint: **`GET /api/folder/downloadSharedFolder.php`** to download a shared folder (or subfolder) as a ZIP **(local storage only)**. - Shared downloads support `inline=1` for safe types (images/video/audio/pdf) and **never inline SVG**. - **Share UI revamp (Core)** - New modern share layout + styles in `public/css/share.css` (folder + file share views). - Shared folder now supports: - **Download all** - **List/Gallery toggle** - **Search within the shared folder** - **Breadcrumbs** when subfolder browsing is enabled - Optional XHR upload progress UI for shared-folder uploads - File shares now generate a link that defaults to a landing page (`&view=1`) with metadata + preview. - **Portals (Pro)** - New API: **`GET /api/pro/portals/listEntries.php`** (folders + files, pagination, optional “all files” mode). - Portal UI now supports: - **Subfolder browsing** (optional, per portal) using `?path=...` - **Breadcrumbs + pagination** - **List/Gallery toggle** - **Download all** (queues a ZIP via `/api/file/downloadZip.php`) - **Resumable uploads** for portals (with standard upload fallback) - Optional **Submission ID** tracking + show in thank-you screen - **5 New preset templates** - **Branding upgrades (Pro)** - Admin branding now supports: - **Meta description** - **Favicons** (SVG/PNG/ICO), **Apple touch icon**, **Safari pinned mask icon + color** - **Theme color** (light/dark) for browser UI - **Login background** (light/dark) and **App background** (light/dark) - Optional **login tagline** - New `public/js/shareBranding.js` applies Pro branding to share pages (logo, accents, footer, icons, theme-color). - New `public/index.php` can serve `index.html` with branding meta/favicons applied (via `.htaccess` DirectoryIndex). **Changed** - **Shared folder data model** - Shared folder listing now returns a unified `entries[]` array (folders + files), plus `shareRoot`, `path`, and `allowSubfolders`. - Shared file download supports `path=subfolder/file.ext` (with subfolder gating). - **Shared uploads hardening** - Shared-folder upload POST now supports `pass` + `path` and includes a per-share **`share_upload_token`** guard (HMAC) to reduce abuse. - **Portal uploads enforcement** - Portal uploads are enforced server-side: - Must stay within the portal’s configured folder - Subfolder uploads are blocked unless the portal enables them - Portal sourceId must match (when configured) - **Portals admin UX** - Adds portal theme presets (new industries), per-portal theme override fields, and portal logo field. - Adds “portal user” controls (optional per-portal user + password, preset modes). - **Branding plumbing** - `main.js` now applies branding meta + icons + theme color + backgrounds, and **sanitizes footer HTML** before injecting. **Fixed** - Shared folder password form and file share password form now use the unified share UI and preserve `path` when prompting. - `downloadZip` now supports passing an explicit `sourceId` (local sources) by running inside a source context. - Various base-path issues resolved for share/portal JS/CSS includes by using `withBase()` and versioned assets. **Security** - Share and portal subpaths are normalized/validated (no `..`, invalid segments). - Shared downloads: SVG/SVGZ are always attachment-only (defense in depth). - Footer branding HTML is sanitized (allowlist) before inserting into DOM. **Notes** - `downloadSharedFolder.php` only supports **local** storage; remote adapters return a clear error. - Portals “download all” depends on ZIP being enabled for the account + server having the needed tooling for ZIP/7z where applicable. --- ## Changes 01/24/2026 (v3.1.7) `release(v3.1.7): fix table header select-all checkbox + Pro bundle install progress UI (closes #99)` **Commit message** ```text release(v3.1.7): fix table header select-all checkbox + Pro bundle install progress UI (closes #99) - file list fix header select-all checkbox robust click handling + sync state - file list preserve file selections when table re-renders after folder strip loads - admin show transfer progress for Pro bundle upload/download install actions Closes #99 ``` **Fixed** - **#99:** The checkbox left of the **Name** column now correctly toggles “select all” in table view. - Uses a stable selector (`.select-all` + `data-select-all`) and robust click handling (checkbox + header cell click). - Keeps the header checkbox state synced (checked/indeterminate) as individual rows change. - Excludes folder rows from file “select all” so only file rows are toggled. **Changed** - **Selection preservation on table refresh** - When subfolders are loaded and the table view re-renders (inline folders above files), existing file selections are preserved. - **Pro bundle install UX** - Admin “Upload Pro bundle” and “Download latest Pro bundle” actions now use the existing transfer progress UI (minimizable card) and surface success/failure cleanly. --- ## Changes 01/24/2026 (v3.1.5 & v3.1.6) `release(v3.1.6): CodeQL fix for error handling (strip HTML safely in fileActions)` `release(v3.1.5): Pro Sources adds OneDrive + Dropbox + source-aware UX fixes` **Commit message** ```text release(v3.1.5): Pro Sources adds OneDrive + Dropbox + source-aware UX fixes - Pro v1.6.0 adds OneDrive + Dropbox storage adapters/sources - core wire onedrive/dropbox adapters in StorageFactory and extend remote-indexing skip list - UI make previews/downloads/editor source-aware + add loading/busy feedback for create/delete/preview - ACL support group grants per source (grantsBySource) incl. Group ACL modal source selector - misc harden adapter error reporting + fix trash auto-purge + portal doc title ``` **Added** - **Pro v1.6.0 Sources:** **OneDrive** + **Dropbox** adapters (new source types). - **Admin → Sources UI** fields and setup hints for OneDrive + Dropbox: - OneDrive: client id/secret/refresh token, tenant, driveId/siteId, optional root path - Dropbox: app key/secret/refresh token, optional root path + business team fields - **Group ACL per source** - Group data supports `grantsBySource` to scope group folder grants to a specific source - Group ACL modal now includes a **Source selector** so you can edit grants per source - **UX feedback** - Busy/disabled states for **Create folder** and **Create file** - Preview overlays show a **loading indicator** and “preview not available” error state - Delete flow integrates with transfer progress UI (shows totals + completion status) **Changed** - **Source-aware file list metadata** - File list responses now include `sourceId` - Each file entry includes `sourceId` so frontend can build correct URLs - **Preview/Download URLs now include `sourceId`** - Preview, snippet fetch, gallery thumbnails, queued downloads, and file menu actions now pass the correct source id - **Editor improvements** - Editor accepts `sourceId` + `sizeBytes` hint, shows a loading pill, supports aborting previous loads, and adds a “Saving…” state - Remote sources skip size probing that relies on Range/HEAD when not reliable - **Remote source performance guards** - Treats `ftp/sftp/webdav/smb/gdrive/onedrive/dropbox` as “slow remote sources” and skips folder stats/peek probes for them - **FileController hardening** - `saveFile` is source-aware (supports `sourceId`, blocks disabled sources for non-admins, blocks read-only sources) - `downloadFile` ensures session is active; streaming uses `set_time_limit(0)` and improved adapter error detail messages - Range openReadStream now only applies offset/length when a Range is actually requested - **S3 hints** - Sources hint text expanded to call out common S3-compatible providers (Wasabi/MinIO/B2/Spaces/R2) - **Portals** - `portal_doc_title` changed to just `{title}` (lets the portal title stand alone) **Fixed** - **Trash auto-purge** now correctly handles API responses that return `{ items: [...] }` instead of a raw array. - **Folder tree init order:** load folder tree after the source selector finishes initializing (prevents race conditions on boot). - **Group grants visibility** and save paths now keep `grantsBySource` intact when admin saves groups. - **Preview stability on Sources** - Prevents “wrong source” previews/downloads when panes/sources differ or when file metadata lacks a direct sourceId. **Notes** - OneDrive/Dropbox are **Pro Sources** (requires Pro bundle v1.6.0+). - Some remote sources don’t support “Trash” semantics; behavior remains backend-dependent (Drive already notes permanent deletes). - For best results, keep OneDrive/Dropbox root paths scoped (optional) so listings remain snappy. --- ## Changes 01/20/2026 (v3.1.4) `release(v3.1.4): restore resumable upload resume checks (testChunks) + wording polish (fixes #93)` ```text release(v3.1.4): restore resumable upload resume checks (testChunks) + wording polish (fixes #93) - uploads: re-enable Resumable.js testChunks so interrupted uploads can resume - admin: tweak Instance ID / renewal copy to “12-month updates” wording Fixes #93 ``` **Fixed** - Resumable uploads resume again (fixes #93) - Re-enabled testChunks in Resumable.js so the uploader checks which chunks already exist and continues where it left off after an interrupted upload. **Changed** - Admin Pro license UI wording - Updated copy to say “12-month updates plans” and “Renew 12-month updates” (clarifies it’s not a forced yearly subscription). --- ## Changes 01/20/2026 (v3.1.3) `release(v3.1.3): document VIRUS_SCAN_EXCLUDE_DIRS for ClamAV upload scanning` `release(v3.1.3): ClamAV exclude paths (Admin + env) for upload scanning (answers #94)` **Commit message** ```text release(v3.1.3): ClamAV exclude paths (Admin + env) for upload scanning (answers #94) - add VIRUS_SCAN_EXCLUDE_DIRS (env) + Admin setting to exclude upload paths from ClamAV scanning - support comma/newline-separated exclude paths relative to the source root - allow per-source excludes via `sourceId:/path` prefixes (Pro Sources) - apply excludes in UploadModel scan flow (local + shared-folder uploads) and lock Admin field when env is set ``` **Added** - **ClamAV exclude paths setting** - Admin setting: **Exclude upload paths** (`clamav.excludeDirs`) - Env override: `VIRUS_SCAN_EXCLUDE_DIRS` (locks the Admin field when set) - Input format: comma or newline-separated paths **relative to the source root** - Examples: `snapshot`, `tmp` - Pro Sources: prefix with a source id: `s3:/snapshot`, `gdrive:/tmp` **Changed** - **Upload virus scan now checks excludes before running ClamAV** - Exclude rules are normalized (trim, normalize slashes, strip leading/trailing `/`) - Rules can optionally target a specific source id; otherwise they apply to the active source - **Shared-folder uploads pass folder context into the scan** - Shared uploads now reuse the same exclude logic by providing the destination folder key. **Notes** - Excludes match against the *destination folder path* (relative to the source root). Keep patterns simple (short paths) for predictable behavior. - If `VIRUS_SCAN_EXCLUDE_DIRS` is set, it is treated as the source of truth and the Admin field is read-only. --- ## Changes 01/20/2026 (v3.1.2) `release(v3.1.2): configurable ignore rules for indexing/tree + admin UX polish (fixes #91, refs #92)` **Commit message** ```text release(v3.1.2): configurable ignore rules for indexing/tree + admin UX polish (fixes #91, refs #92) - add ignoreRegex setting (admin config) with env override FR_IGNORE_REGEX to hide folders from tree/counts/indexing - add snapshot preset helper for common NAS snapshot paths (fixes #91) - unify ignore logic via FS::shouldIgnoreEntry across folder counts, tree listing, and disk usage scans - admin: improve settings search UX (clear button) + smoother section header styling - UI: polish header dock collapse/expand icon animations (landing/lift + reduced-motion support) Fixes #91 Refs #92 Co-authored-by: nikp123 ``` **Added** - **Indexing ignore rules (regex)**: - Admin setting: **Ignore paths (regex)** (`ignoreRegex`) — one pattern per line. - Env override: `FR_IGNORE_REGEX` (locks the field when set). - Built-in “quick add” button for a common snapshot preset: `(^|/)(@?snapshots?)(/|$)` (helps with NAS snapshot dirs). - **Centralized ignore helper**: - `FS::shouldIgnoreEntry($name, $parentRel)` applies built-in ignores plus optional regex patterns. **Changed** - **Folder tree / listing / counts now share ignore logic**: - Replaced scattered ignore arrays with `FS::shouldIgnoreEntry(...)` in folder enumeration paths. - **Disk usage scan now filters earlier**: - Uses a `RecursiveCallbackFilterIterator` so ignored entries are skipped before deeper traversal. - **Admin Panel UX**: - Settings search now includes a dedicated clear (X) button that appears only when a query exists. - Section headers now render via a `.section-header-inner` wrapper for cleaner layout/hover/active styles. - Audit table area now caps height and scrolls to avoid huge modal growth. - **Header dock polish**: - Adds “lift” and “land” animations for header dock icon buttons during card collapse/expand. - Respects `prefers-reduced-motion`. **Fixed** - **#91:** Snapshot folders (e.g., `snapshot`, `@snapshots`) can now be excluded cleanly from the tree, counts, indexing, and disk usage views via ignore rules. - Prevents “stuck landing” icon states by cleaning up animation classes/inline vars on `animationend`. **Notes** - Ignore rules are applied frequently during tree/list/count operations. Keep patterns simple to avoid expensive regexes. - Invalid regex lines are ignored safely (and won’t crash listing/indexing). --- ## Changes 01/17/2026 (v3.1.1) `release(v3.1.1): OIDC env overrides + configurable resumable chunk size + clearer startup logs (closes #86, closes #87, closes #90)` **Commit message** ```text release(v3.1.1): OIDC env overrides + configurable resumable chunk size + clearer startup logs (closes #86, closes #87, closes #90) - config: allow env overrides for OIDC knobs (auto-create, group claim, admin group, Pro group prefix) - uploads: add configurable Resumable.js chunk size (Admin + siteConfig) and honor it in upload.js - uploads: improve relative-path folder uploads and remote staging/cleanup for non-local sources - admin: add settings search + smoother section open/close animations - admin: restrict Pro license actions to the registered/primary admin user - remote storage: add FR_REMOTE_DIR_MARKER to preserve empty dirs; skip Trash on Google Drive sources - UX: clearer “FileRise startup complete” log line + better long-running delete/restore/loading feedback Closes #86 Closes #87 Closes #90 ``` **Added** - **OIDC env overrides** (in addition to config defaults): `FR_OIDC_AUTO_CREATE`, `FR_OIDC_GROUP_CLAIM`, `FR_OIDC_ADMIN_GROUP`, `FR_OIDC_PRO_GROUP_PREFIX`. - **Upload tuning (Admin):** “Resumable chunk size (MB)” (0.5–100 MB). Exported via siteConfig so the frontend can size chunks dynamically. - **Remote folder marker:** `FR_REMOTE_DIR_MARKER` (default: `.filerise_keep`) to preserve empty remote folders (S3-style prefix backends). - **Admin settings search:** quick filter for sections/settings in the Admin panel UI. **Changed** - **Resumable uploads honor configured chunk size** (used by file picker + drag/drop when Resumable is available). - **Upload handling for folder paths**: - validates and sanitizes `resumableRelativePath` / `relativePath` - supports subfolder uploads more consistently - remote sources stage chunks in meta root (`uploadtmp/`) and push via adapter, then cleanup temp folders - **Admin Pro license visibility/actions** are restricted to the **primary/registered admin** (first admin in `users.txt` order). - **Remote deletes / Trash behavior**: - Google Drive sources skip Trash (deletes are permanent) - remote folder “empty checks” ignore the marker file - **Docker startup log clarity**: - `start.sh` prints a “startup complete” line and clarifies that further output is Apache logs. **Fixed** - **#86:** OIDC behavior is now controllable via environment variables (no code/config edits required). - **#87:** Resumable chunk size is now configurable to fit proxy limits (e.g., tunnels/CDNs). - **#90:** Clearer startup output + better guidance for collecting logs. - **UI responsiveness / long operations** - “Deleting…” busy states for file/folder delete confirmations and Trash restore/delete actions - “Still loading…” toast for slow remote listings, with a fallback if a folder no longer exists **Notes** - `FR_REMOTE_DIR_MARKER` is best-effort and primarily intended for remote backends that treat directories as prefixes (e.g., S3). - Google Drive sources do not support Trash semantics in the adapter; the UI notes this and deletes are permanent. - Some Admin Panel strings still fall back to English; translations will continue to improve over time. --- ## Changes 01/16/2026 (v3.1.0) `release(v3.1.0): default language + portal i18n + ffmpeg path config (closes #88, closes #89)` **Commit message** ```text release(v3.1.0): default language + portal i18n + ffmpeg path config (closes #88, closes #89) - Admin: add “Default language” setting (used when a user has not chosen a language yet) - Admin: add optional FFmpeg binary path setting (env FR_FFMPEG_PATH overrides / locks) - Thumbnails: resolve ffmpeg path from env first, then admin config, then PATH - Portals: add language selector + apply defaultLanguage from siteConfig on first run - Portals: fix button styling (accent-aware) + refresh button color (fixes #88) - i18n: split locales into separate files and add Polish/Russian/Japanese; refresh German strings (fixes #89) - UI: replace hardcoded upload/login alerts/toasts with i18n keys for better translation coverage Closes #88 Closes #89 ``` **Added** - **Admin setting: Default language** - New `display.defaultLanguage` config surfaced in Admin → Header/File List/Language section. - Used automatically when a user has not chosen a language yet. - **Admin setting: FFmpeg binary path (optional)** - New `ffmpegPath` config for video thumbnail generation. - `FR_FFMPEG_PATH` remains the source of truth when set (admin field becomes read-only). - **New locales shipped** - **Polish (pl)**, **Russian (ru)**, **Japanese (ja)**, plus **Simplified Chinese (zh-CN)** locale file. - **Portal language selector** - Added a language dropdown to both **portal.html** and **portal-login.html**. **Changed** - **FFmpeg resolution order for thumbnails** - `FR_FFMPEG_PATH` → admin `ffmpegPath` → fallback to `ffmpeg` from PATH (and standard locations). - This keeps the Docker image lean while still supporting thumbnails when ffmpeg exists on the host/container. - **Portals now inherit default language** - If `localStorage.language` is missing, portals fetch `/api/siteConfig.php` and apply `display.defaultLanguage`. - **Translations architecture** - Locales are now maintained in dedicated files under `public/js/i18n/locales/` lazy load instead of a giant embedded map. - Added missing i18n keys for upload flows and admin/pro toasts to reduce English-only strings. **Fixed** - **Portal button styling / colors** (fixes #88) - Portal buttons now use accent-aware classes (`portal-btn-primary` / `portal-btn-outline`) and render correctly across themes. - **German translation gaps** (fixes #89) - German strings were refreshed and missing UI keys were added/normalized. - **More consistent i18n coverage** - Upload-related toasts and some boot/login alerts now use translation keys instead of hardcoded English. **Notes** - There are still parts of the Admin Panel and some edge UI strings that may fall back to English. This release fixes the reported German issues and adds new locales, but translation coverage will continue to improve over time. - If you want video thumbnails in Docker without bundling ffmpeg, mount a host ffmpeg binary or install it in your own derived image and set `FR_FFMPEG_PATH` (or set the path in Admin). --- ## Changes 01/15/2026 (v3.0.2) `release(v3.0.2): ffmpeg-backed video thumbnails (Docker) + new thumbnail API (closes #79)` **Commit message** ```text release(v3.0.2): ffmpeg-backed video thumbnails (Docker) + new thumbnail API (closes #79) - Docker: ship ffmpeg so video thumbnails work out-of-the-box in container installs - add /api/file/thumbnail.php endpoint to generate + cache JPEG thumbnails for video files - UI: use ffmpeg-backed thumbnails for hover previews + gallery cards (fallback to movie icon) - harden query param parsing for file endpoints (avoid array/querystring edge cases) - docs: add FFmpeg + archive tools to THIRD_PARTY notices Closes #79 ``` **Added** - **Video thumbnail API endpoint:** `GET /api/file/thumbnail.php?folder=...&file=...` Returns a cached **JPEG** thumbnail for supported video files. - **Server-side thumbnail generator** (local sources only): - Uses `ffmpeg` to extract a frame and writes it into a meta-root cache (`thumb_cache/`). - Cache key includes file path + mtime + size + thumb dimensions for stable reuse. - Optional env tuning: - `FR_FFMPEG_PATH` (override ffmpeg path) - `FR_VIDEO_THUMB_MAX_W`, `FR_VIDEO_THUMB_MAX_H` (thumbnail max size) - **Docker image now installs `ffmpeg`** so thumbnails work in Docker/Unraid without extra setup. **Changed** - **Hover preview video thumbs** now use the thumbnail API instead of `