Bug Fixes
- Fix session cookie generation — Random salt could include characters outside 0-9A-Za-z,
producing invalid session cookies (#622) - Fix PHP 8.1+ exceptions during wizard upgrade — Idempotent ALTER TABLE ADD statements
threw uncaught mysqli_sql_exception on duplicate columns, causing HTTP 500 (#613) - Fix user cannot confirm conflicts (#618)
- Fix determineServerUrl() when invoked from CLI (#620)
- Fix French translations — Encoding and wording corrections (#619)
- Fix fresh install missing default config — After wizard install, only
WEBCAL_PROGRAM_VERSION was inserted into webcal_config, leaving 161 defaults missing and
causing PHP 8.2+ undefined variable warnings on nearly every page - Fix SQLite config validation — config.php required db_host and db_login to be non-empty,
but SQLite databases don't use host or login credentials - Fix undefined globals on login page after fresh install — $REMEMBER_LAST_LOGIN and
$SERVER_TIMEZONE could be undefined, outputting warnings before headers and breaking
redirects - Fix event creation redirect failure — Undefined $dberror and $old_percent in
edit_entry_handler.php output warnings before header('Location: ...'), silently breaking
the redirect
CI/CD & Testing
- Add PHPStan static analysis — Level 0 analysis with baseline covering root PHP files,
includes/, and wizard/ - Add multi-PHP-version CI matrix — PHPUnit and install tests run across PHP 8.1, 8.2, 8.3,
and 8.4 - Add Selenium wizard installer tests — Automated install and upgrade tests for MySQL,
PostgreSQL, and SQLite with post-install smoke tests (login + event creation) - Add upgrade test fixtures — Schema fixtures for v1.9.10 and v1.9.12 across all DB
backends - Gate release workflow on all test suites — Release only proceeds when syntax, PHPUnit,
install, and wizard tests all pass - Capture screenshots on Selenium test failure — Uploaded as CI artifacts for debugging
Tooling
- Fix bump_version.sh — Now updates all 17 version references including
wizard/WizardState.php, and runs composer update --lock automatically - Fix compile_test.sh — Now checks for composer.lock drift and returns nonzero exit code on
errors