Security hardening.
- The JSON API's POST endpoints (save, rollback, copy to theme, copy theme,
settings) now require a CSRF token, sent by the editor as a
csrfform field and anX-CSRF-Tokenheader. Requests without a valid token are rejected with HTTP 403. - The editor page no longer shows the content of a non-
.phtmlfile that lives inside aview/directory. The extension is checked before the file is read, andFileEditor::readFile()now enforces it as well. - Path validation in
FileBrowsernow rejects absolute paths before trimming slashes (previously/etc/passwdbecameetc/passwdand the check never fired), and resolves both sides of the under-root check withrealpath()so symlinked roots such as macOS/private/varcompare correctly. - The Create disk backup before overwriting setting is now honoured: it sets the default state of the save dialog's checkbox instead of being stored and ignored.
- The per-user save rate limit is persisted in user settings, so it is enforced across requests and PHP-FPM workers rather than within a single process.
- Removed the stale
activeThemeview variable and attribute left over from the old active-theme concept. - Fixed the integration test suite: settings mocks now return the real defaults, and macOS temp paths are resolved before comparison.