⚠️ Breaking Changes
-
Queue.executeAllowedCommandsis now required whendebug=falsefor any deployment that runsQueue.Executejobs (#485). With the key unset or empty in production, every Execute job is rejected beforeexec()is invoked. Migration — add toconfig/app.php(orapp_local.php):'Queue' => [ 'executeAllowedCommands' => [ 'bin/cake', // '/usr/bin/php', ], ],
In dev (
debug=true) the allow-list is ignored, so local environments are unaffected. Seeconfig/app.example.phpanddocs/sections/tasks/execute.md. -
ExecuteTask now escapes the
commandand eachparamsentry per token viaescapeshellarg()instead ofescapeshellcmd()(#485). Each value is wrapped as a single shell argument, which closes argument-injection paths but means callers that previously packed multiple tokens into a single entry must split them across the array. Migration:// before ['command' => 'bin/cake importer run', 'params' => ['--limit 10']] // after ['command' => 'bin/cake', 'params' => ['importer', 'run', '--limit', '10']]
See
docs/sections/upgrading.mdfor the full note.
Fixes
EmailTask::run()now restrictsunserialize()to the configured Message subclass viaallowed_classes, closing a gadget-chain risk on legacy raw-serialized settings (#484). Modern array-path callers usingEmailTask::serialize()are unaffected.- Pagination element now uses
escapeTitleinstead of the broaderescapeso URL/class/title attributes stay HTML-escaped while the title text can still carry icon markup (#483).
Full Changelog: 8.12.0...8.13.0