task: #3610501 Pre-1.0.0-alpha11 hardening: anonymous page-cache safety, task-signal guard, client https allowlist, and missing tests
Audit-driven pre-1.0.0-alpha11 hardening. One MR, each item with a test.
Security and correctness
- Anonymous page cache serves a stale step. The dispatcher's step/comment pages set render max-age 0, which the dynamic page cache honors but core's internal page cache ignores, so an anonymous bearer-link visitor (the route's main audience) could be served a stale step: the #3609153 bug's other half. Adds
no_cachetoorchestra_interaction.stepand.comment. - Task signal route: guarded-outcome bypass + uncaught 500.
InteractionTaskController::signal()resumed any URL outcome, neither refusing a guarded outcome (the operation twin already does) nor catching theInvalidArgumentExceptiona deconfigured outcome raises. Mirrors the operation controller. - CommentForm (the embedded decision for every review interaction) resumed without catching that same exception. Caught.
- ContextMessages rendered an admin-configured label through
Markupwithout escaping. Escaped before token replacement. - Client https was form-only. A config import could downgrade the OAuth credential channel to http. Adds a
settings.phporchestra_client.allow_http_hostsallowlist (OR-ed with loopback) in a sharedHttpsPolicy, re-checked at request time in the token provider and client so an import cannot bypass the form.
Tests
Client https + the new allowlist; stored-card cleanup on run end (a privacy path that was untested); interaction config-schema strict-save; the task-signal and CommentForm guards.
Docs and translation
Drop the retired HandlerUrlInterface, document ReviewInteractionBase, fix em-dashes, complete the French translations touched by recent features.
Full orchestra kernel suite (137 files) green locally; phpcs/cspell clean; phpstan adds no new errors.