[UPMERGE] 5.1 -> 2026.x - #3182
Merged
Merged
Conversation
Co-authored-by: dpfaffenbauer <5981845+dpfaffenbauer@users.noreply.github.com>
…haracters Co-authored-by: dpfaffenbauer <5981845+dpfaffenbauer@users.noreply.github.com>
…duplication Co-authored-by: dpfaffenbauer <5981845+dpfaffenbauer@users.noreply.github.com>
The "@" rejection tested the whole URL, so a same-host redirect carrying an "@" in its query or fragment was silently downgraded to the default. It now looks at the parsed authority only, which also makes the preceding user check meaningful instead of redundant. Backslashes and control characters are now rejected for absolute URLs as well, not just for relative ones. Beyond the "_redirect" parameter, the login form feeds "_target_path" and "_failure_path" to Symfony, which accepts any value starting with "/" or "http". Both are now run through the same allow-list, in the controller that renders the form and in a success/failure handler pair, so a target that is neither a relative path nor a same-host URL falls back to the configured default. The success handler covers the Referer as well, which the firewall uses via use_referer.
Psalm rejects calls into @internal Symfony code. The rejected failure path is now read through the public Request API, and the redirect the parent handler produced is validated as well, which also covers a failure path configured as a nested parameter.
Symfony marks Request::get() as internal as well, which Psalm rejects, so the parameter is looked up in the attribute, query and request bags instead.
FailedMessageDetails::jsonSerialize() emitted "failedAt" while every consumer - the classic grid column and the Studio MessengerFailedGrid - reads "failed_at", and the DTO itself already declares #[SerializedName(\"failed_at\")]. Because JsonSerializableNormalizer outranks ObjectNormalizer in the framework serializer, jsonSerialize() decides the payload keys and that attribute never took effect, so the column was empty for every transport. Emit "failed_at" instead, which makes the existing attribute true rather than dead code, and align the classic store field with it. The Studio grid already reads "failed_at" and needs no change.
The interface declared both failed_at and failedAt for the same value, so TypeScript accepted either spelling and could not catch the API/UI mismatch that left the "Failed At" column empty. The payload key is failed_at, so failedAt describes a field that does not exist.
Messenger: fix empty "Failed At" column by emitting the key the UI reads
Messenger: drop the redundant failedAt field from MessengerFailedMessage
Fix open redirect vulnerabilities in redirect parameter handling
Merged
[UPMERGE] 4.1 -> 5.0
[UPMERGE] 5.0 -> 5.1
# Conflicts: # src/CoreShop/Bundle/MessengerBundle/Resources/public/pimcore/js/list.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/exposeRemote.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/main.html # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/mf-manifest.json # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/mf-stats.json # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/879.6f347bc8.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/879.6f347bc8.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/async/254.73bc4fd6.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/async/375.2ec37522.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/async/450.62056a1a.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/async/460.3e0d222e.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/async/51.1d46e9ff.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/async/695.d827e311.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/async/76.31136685.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/async/79.33c522eb.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/async/808.5e763f41.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/async/920.159aa87a.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/async/__federation_expose_default_export.bfd9734e.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/async/__federation_expose_default_export.bfd9734e.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/05e1d48d6efb763898322c92b4a6a8d6/static/js/main.58e0299a.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/exposeRemote.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/main.html # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/mf-manifest.json # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/mf-stats.json # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/879.121d9e2d.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/879.121d9e2d.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/174.10c3b224.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/254.d61a4fa9.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/254.d61a4fa9.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/375.70416f83.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/375.70416f83.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/448.d1b4a9d3.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/450.b3b8ad5d.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/450.b3b8ad5d.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/460.600a3125.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/460.600a3125.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/51.ad135ad2.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/51.ad135ad2.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/536.c628657c.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/564.e3aedd6c.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/63.9e39d82e.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/695.f3951c47.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/695.f3951c47.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/696.17527f5d.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/76.9b0a4664.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/76.9b0a4664.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/79.405d9073.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/79.405d9073.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/808.7cd63ca4.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/808.7cd63ca4.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/821.3098003a.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/920.6e5f4ec4.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/920.6e5f4ec4.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/__federation_expose_default_export.2b4419d5.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/async/__federation_expose_default_export.2b4419d5.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/main.9a8dbcae.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/main.9a8dbcae.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/34e35ad89346ae6081cc5086a9a71359/static/js/remoteEntry.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/exposeRemote.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/main.html # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/mf-manifest.json # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/mf-stats.json # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/879.121d9e2d.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/879.121d9e2d.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/254.d61a4fa9.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/375.70416f83.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/450.b3b8ad5d.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/450.b3b8ad5d.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/460.600a3125.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/51.ad135ad2.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/695.f3951c47.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/76.9b0a4664.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/79.405d9073.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/808.7cd63ca4.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/920.6e5f4ec4.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/__federation_expose_default_export.2b4419d5.js # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/async/__federation_expose_default_export.2b4419d5.js.LICENSE.txt # src/CoreShop/Bundle/MessengerBundle/Resources/public/studio/a41c3d86be4a44ee48ce975351fa8971/static/js/main.8c4ebfd9.js.LICENSE.txt # src/CoreShop/Bundle/OrderBundle/Resources/public/studio/9a08a271fbb6e36e34abafcf75e5c1bb/static/js/async/450.bef1381e.js
dpfaffenbauer
force-pushed
the
upmerge/5.1_2026.x
branch
from
August 24, 2026 13:50
64e8476 to
c014fde
Compare
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Upmerge of
5.1into2026.x— the final leg of this round.Remember! The upmerge should always be merged with the
Merge pull requestbutton.Refreshed after #3181 merged, so
2026.xnow receives the whole chain:4.1→5.0→5.1→2026.x.What it carries forward
_redirectparameter, including the new login success/failure handlersfailedAtfield fromMessengerFailedMessageSecurity-relevant files, all arriving intact
ResourceBundle/Controller/RedirectUrlValidationTrait.phpvalidateRedirectUrl()implementationCoreBundle/Security/ShopUserAuthenticationSuccessHandler.phpCoreBundle/Security/ShopUserAuthenticationFailureHandler.phpCoreBundle/Resources/config/services/handler.ymlCoreBundle/Resources/config/pimcore/security.ymlFrontendBundle/Controller/{Cart,Customer,Frontend,Register,Security}Controller.php_redirectStorageListBundle/Controller/StorageListController.phpfeatures/ui/frontend/account/login.feature,Behat/Context/Ui/Frontend/LoginContext.phpAll three new classes verified present by path on the merged tree; exactly one
validateRedirectUrl()definition exists, so nothing landed twice. Both handlers appear inhandler.ymland in the firewall config.Conflicts resolved (79 files)
78 Studio build artifacts —
5.1rebuilt its Studio bundles into different content-hash directories than the ones committed on2026.x. Per convention these are never rebuilt during an upmerge, so all 22 affected bundles had their entireResources/public/studio/tree restored verbatim from2026.x.1 modify/delete:
MessengerBundle/Resources/public/pimcore/js/list.js— this is #3179's second half, the classic ExtJS store field.2026.xdeleted this file, along with all 463 classic ExtJS files, in720355156f("remove ExtJS / Classic Admin, bump Pimcore to 2026.1"). Resolved in favour of the2026.xdeletion, consistent with how the newsletter deletion is handled.That does not lose the fix on
2026.x, which was verified rather than assumed: the Studio replacementMessengerFailedGrid.tsxalready reads the corrected key (dataIndex: 'failed_at',key: 'failed_at'), and the backend on the merged tree emits'failed_at'from bothjsonSerialize()and the#[SerializedName('failed_at')]accessor. So the ExtJS half is simply not applicable here —2026.xgets the backend fix and its own Studio grid consumes it. Zero classic ExtJS files are reintroduced by this merge.Verification
Net diff against
2026.xis 15 files — #2963's set, plus #3179's backend half and #3180's one-line removal, with #3179's ExtJS half correctly absent:php -lclean on every changed PHP file;composer validatereports only the pre-existingpayum/payumwarning.Note on #2974
#2974 (parent product price /
createUnmanagedCopyhelper) was still open at rebuild time andcreateUnmanagedCopyis not present on5.1, so thecreateDataCopy()conflict it is expected to cause on2026.xdoes not arise in this round.Ordering
#3183 (merged) → #3181 (merged) → this PR. This completes the round.