Changes
- Login errors no longer reveal whether a username exists, and both cases take the same amount of time.
- Failed password logins are now rate limited per client address and username (
AUTH_RATE_LIMIT_ENABLED,AUTH_RATE_LIMIT_MAX_ATTEMPTS,AUTH_RATE_LIMIT_WINDOW_SECONDS). Successful logins, token refreshes and SSO logins are not affected. - Password hashes now use bcrypt cost 12 and existing hashes are upgraded on the next successful login.
- The OAuth2 client secret and the default archive password are no longer included in the startup log.
GET /api/auth/sessionsno longer returns the stored refresh token hash.- Rejected bearer tokens now return a
WWW-Authenticateheader, and token responses are marked as non-cacheable. - OAuth2 callback sessions now use
SameSite=Lax,HttpOnlyandSecureon HTTPS, and expire after 24 hours instead of living in memory until a restart. - Fixed OAuth2/SSO login in the legacy desktop client (1.17.x): the callback page no longer leaves the login window hanging, so the client picks up its new session again. The web UI and the new desktop app keep using the validated return address.
- Fixed the server-wide download bandwidth limit (
SERVER_MAX_DOWNLOAD_BANDWIDTH_IN_KBPS) having no effect: the configured value was converted to bytes twice, and clients that did not send their own limit bypassed it entirely. The server value is now enforced as a cap that clients can only lower. - OIDC
id_tokens can be verified against the identity provider's JWKS (AUTH_OAUTH2_ISSUER_URL,AUTH_OAUTH2_JWKS_URL,AUTH_OAUTH2_VERIFY_ID_TOKEN,AUTH_OAUTH2_REQUIRE_NONCE). Disabled by default. - Access tokens can be bound to their session (
AUTH_ACCESS_TOKEN_SESSION_BINDING_ENABLED), so revoking a session also revokes its access tokens. Disabled by default. - The served Web UI can send a Content-Security-Policy (
WEB_UI_CSP_MODE). Disabled by default. - The server can now send anonymous usage reports (
ANALYTICS_ENABLED, on by default) to help prioritise work: startup and snapshot statistics, aggregated request counts, downloads, registrations, progress updates, savefile usage and sampled server errors with cleaned messages. No user names, ids, IPs, game titles or file paths are sent. The reports go to the first reachable collector fromANALYTICS_ENDPOINTS. You can turn it off withANALYTICS_ENABLED=false. - The served Web UI now always uses the newest stable release of the server's major version, so a new Web UI feature no longer waits for a server release. When GitHub cannot be reached or no matching release exists, the server keeps the build it already cached instead of switching to the
unstabledevelopment build. Pre-release builds are opt-in withWEB_UI_VERSION=unstableorWEB_UI_VERSION=early-access, and any other value pins an exact release.