From 83b8ca2cdf5d465f3cc7d7e6a4e92123eb9f8017 Mon Sep 17 00:00:00 2001
From: Benni Mack <benni@typo3.org>
Date: Thu, 7 Jul 2022 23:36:59 +0200
Subject: [PATCH] [BUGFIX] Re-apply stdWrap for typolink.parameter values
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Due to a regression in TYPO3 v11.5.11, using typolink.parameter
with stdWrap might also return more than just the URL.

This change reverts this behavior by overlaying the decoded
typolink string with the original decoded typolink string.

Resolves: #97869
Related: #90404
Related: #80896
Releases: main, 11.5
Change-Id: I22010983886a8da8a339aa6376d36303f3b729b2
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/75046
Tested-by: core-ci <typo3@b13.com>
Tested-by: Felix Nagel
Tested-by: Stefan Bürk <stefan@buerk.tech>
Tested-by: Oliver Bartsch <bo@cedev.de>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Felix Nagel
Reviewed-by: Stefan Bürk <stefan@buerk.tech>
Reviewed-by: Oliver Bartsch <bo@cedev.de>
Reviewed-by: Benni Mack <benni@typo3.org>
---
 .../frontend/Classes/Typolink/LinkFactory.php |  6 ++++-
 .../ContentObjectRendererTest.php             | 27 +++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/typo3/sysext/frontend/Classes/Typolink/LinkFactory.php b/typo3/sysext/frontend/Classes/Typolink/LinkFactory.php
index cb3a53b43594..8bb1361bd3a9 100644
--- a/typo3/sysext/frontend/Classes/Typolink/LinkFactory.php
+++ b/typo3/sysext/frontend/Classes/Typolink/LinkFactory.php
@@ -58,7 +58,11 @@ class LinkFactory implements LoggerAwareInterface
         if (isset($linkConfiguration['parameter.'])) {
             // Evaluate "parameter." stdWrap but keep additional information (like target, class and title)
             $linkParameterParts = $this->typoLinkCodecService->decode($linkConfiguration['parameter'] ?? '');
-            $linkParameterParts['url'] = $contentObjectRenderer->stdWrap($linkParameterParts['url'], $linkConfiguration['parameter.']);
+            $modifiedLinkParameterString = $contentObjectRenderer->stdWrap($linkParameterParts['url'], $linkConfiguration['parameter.']);
+            // As the stdWrap result might contain target etc. as well again (".field = header_link")
+            // the result is then taken from the stdWrap and overridden if the value is not empty.
+            $modifiedLinkParameterParts = $this->typoLinkCodecService->decode($modifiedLinkParameterString);
+            $linkParameterParts = array_replace($linkParameterParts, array_filter($modifiedLinkParameterParts, 'trim'));
             $linkParameter = $this->typoLinkCodecService->encode($linkParameterParts);
         } else {
             $linkParameter = trim((string)($linkConfiguration['parameter'] ?? ''));
diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php
index d29bef5df5bf..b11afa82ec3a 100644
--- a/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php
@@ -2657,6 +2657,33 @@ class ContentObjectRendererTest extends UnitTestCase
                 ],
                 '<a href="http://typo3.com" class="url-class">TYPO3</a>',
             ],
+            'Link url using stdWrap with class attribute in parameter and overridden target' => [
+                'TYPO3',
+                [
+                    'parameter' => 'http://typo3.org default-target url-class',
+                    'parameter.' => [
+                        'cObject' => 'TEXT',
+                        'cObject.' => [
+                            'value' => 'http://typo3.com new-target different-url-class',
+                        ],
+                    ],
+                ],
+                '<a href="http://typo3.com" target="new-target" rel="noreferrer" class="different-url-class">TYPO3</a>',
+            ],
+            'Link url using stdWrap with class attribute in parameter and overridden target and returnLast' => [
+                'TYPO3',
+                [
+                    'parameter' => 'http://typo3.org default-target url-class',
+                    'parameter.' => [
+                        'cObject' => 'TEXT',
+                        'cObject.' => [
+                            'value' => 'http://typo3.com new-target different-url-class',
+                        ],
+                    ],
+                    'returnLast' => 'url',
+                ],
+                'http://typo3.com',
+            ],
         ];
     }
 
-- 
GitLab