From 9d8d296e102d9240896e5eafc747f72e33929af1 Mon Sep 17 00:00:00 2001
From: Thomas Hohn <thomas@hohn.dk>
Date: Mon, 20 Feb 2023 10:42:10 +0100
Subject: [PATCH] [BUGFIX] Fix PHP 8 warning in LinkValidatorController
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The variable $row['url_response']['errorParams'] should always contain
a value. Either the actual error message array or an empty array to
avoid a PHP 8 warning.
The corresponding getErrorMessage methods now have a guard clause to
check if the array is empty to avoid further propagated warnings.
In TYPO3 v13 that signature of the getErrorMessage should be changed to
be array.

The array $errorParams is always initialized to an empty array instead
of null. IN TYPO3 v13 the default value of $errorParams should be []
instead of null.

Resolves: #99988
Releases: main, 11.5
Change-Id: I0f7e10f45e0f5ec7e80b79d705b38fda9a3f1410
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/78812
Tested-by: core-ci <typo3@b13.com>
Reviewed-by: Stefan Bürk <stefan@buerk.tech>
Tested-by: Stefan Bürk <stefan@buerk.tech>
---
 .../sysext/linkvalidator/Classes/LinkAnalyzer.php  |  2 +-
 .../Classes/Linktype/AbstractLinktype.php          |  1 +
 .../Classes/Linktype/ExternalLinktype.php          |  4 ++++
 .../Classes/Linktype/FileLinktype.php              |  1 +
 .../Classes/Linktype/InternalLinktype.php          |  9 +++++++--
 .../Classes/Linktype/LinktypeInterface.php         |  2 ++
 .../Classes/Repository/BrokenLinkRepository.php    | 14 +++++++++++---
 7 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/typo3/sysext/linkvalidator/Classes/LinkAnalyzer.php b/typo3/sysext/linkvalidator/Classes/LinkAnalyzer.php
index 548e786bd34b..6378c1a6c849 100644
--- a/typo3/sysext/linkvalidator/Classes/LinkAnalyzer.php
+++ b/typo3/sysext/linkvalidator/Classes/LinkAnalyzer.php
@@ -244,7 +244,7 @@ class LinkAnalyzer
 
                 // Broken link found
                 if (!$checkUrl) {
-                    $this->brokenLinkRepository->addBrokenLink($record, false, $hookObj->getErrorParams());
+                    $this->brokenLinkRepository->addBrokenLink($record, false, $hookObj->getErrorParams() ?: []);
                     $this->brokenLinkCounts[$table]++;
                 }
             }
diff --git a/typo3/sysext/linkvalidator/Classes/Linktype/AbstractLinktype.php b/typo3/sysext/linkvalidator/Classes/Linktype/AbstractLinktype.php
index 845222860d83..78f4d945b6d2 100644
--- a/typo3/sysext/linkvalidator/Classes/Linktype/AbstractLinktype.php
+++ b/typo3/sysext/linkvalidator/Classes/Linktype/AbstractLinktype.php
@@ -70,6 +70,7 @@ abstract class AbstractLinktype implements LinktypeInterface
      * Get the value of the private property errorParams
      *
      * @return array All parameters needed for the rendering of the error message
+     * @todo change return type to array in TYPO3 v13
      */
     public function getErrorParams()
     {
diff --git a/typo3/sysext/linkvalidator/Classes/Linktype/ExternalLinktype.php b/typo3/sysext/linkvalidator/Classes/Linktype/ExternalLinktype.php
index dba7457613f1..a6b02614e10a 100644
--- a/typo3/sysext/linkvalidator/Classes/Linktype/ExternalLinktype.php
+++ b/typo3/sysext/linkvalidator/Classes/Linktype/ExternalLinktype.php
@@ -252,11 +252,15 @@ class ExternalLinktype extends AbstractLinktype
      *
      * @param array $errorParams All parameters needed for the rendering of the error message
      * @return string Validation error message
+     * @todo change input parameter type to array in TYPO3 v13
      */
     public function getErrorMessage($errorParams)
     {
         $lang = $this->getLanguageService();
         $errorType = $errorParams['errorType'] ?? '';
+        if ($errorType === '') {
+            return $lang->getLL('list.report.noinformation');
+        }
         switch ($errorType) {
             case self::ERROR_TYPE_HTTP_STATUS_CODE:
                 switch ($errorParams['errno'] ?? 0) {
diff --git a/typo3/sysext/linkvalidator/Classes/Linktype/FileLinktype.php b/typo3/sysext/linkvalidator/Classes/Linktype/FileLinktype.php
index cbeb51bd5cc9..aeb376024937 100644
--- a/typo3/sysext/linkvalidator/Classes/Linktype/FileLinktype.php
+++ b/typo3/sysext/linkvalidator/Classes/Linktype/FileLinktype.php
@@ -66,6 +66,7 @@ class FileLinktype extends AbstractLinktype
      *
      * @param array $errorParams All parameters needed for the rendering of the error message
      * @return string Validation error message
+     * @todo change input parameter type to array in TYPO3 v13
      */
     public function getErrorMessage($errorParams)
     {
diff --git a/typo3/sysext/linkvalidator/Classes/Linktype/InternalLinktype.php b/typo3/sysext/linkvalidator/Classes/Linktype/InternalLinktype.php
index c2df790ddde6..90423e81ae86 100644
--- a/typo3/sysext/linkvalidator/Classes/Linktype/InternalLinktype.php
+++ b/typo3/sysext/linkvalidator/Classes/Linktype/InternalLinktype.php
@@ -229,13 +229,18 @@ class InternalLinktype extends AbstractLinktype
      *
      * @param array $errorParams All parameters needed for the rendering of the error message
      * @return string Validation error message
+     * @todo change input parameter type to array in TYPO3 v13
      */
     public function getErrorMessage($errorParams)
     {
+        $lang = $this->getLanguageService();
+        $errorType = $errorParams['errorType'] ?? '';
+        if ($errorType === '') {
+            return $lang->sL('LLL:EXT:linkvalidator/Resources/Private/Language/Module/locallang.xlf:list.report.noinformation');
+        }
+
         $errorPage = null;
         $errorContent = null;
-        $lang = $this->getLanguageService();
-        $errorType = $errorParams['errorType'];
         if (is_array($errorParams['page'] ?? false)) {
             switch ($errorType['page']) {
                 case self::DELETED:
diff --git a/typo3/sysext/linkvalidator/Classes/Linktype/LinktypeInterface.php b/typo3/sysext/linkvalidator/Classes/Linktype/LinktypeInterface.php
index 3c3a322d2d56..fe3b77c1fc1e 100644
--- a/typo3/sysext/linkvalidator/Classes/Linktype/LinktypeInterface.php
+++ b/typo3/sysext/linkvalidator/Classes/Linktype/LinktypeInterface.php
@@ -52,6 +52,7 @@ interface LinktypeInterface
      * Get the value of the private property errorParams.
      *
      * @return array All parameters needed for the rendering of the error message
+     * @todo change return type to array in TYPO3 v13
      */
     public function getErrorParams();
 
@@ -60,6 +61,7 @@ interface LinktypeInterface
      *
      * @param array $row Broken link record
      * @return string Parsed broken url
+     * @todo change input parameter type to array in TYPO3 v13
      */
     public function getBrokenUrl($row);
 
diff --git a/typo3/sysext/linkvalidator/Classes/Repository/BrokenLinkRepository.php b/typo3/sysext/linkvalidator/Classes/Repository/BrokenLinkRepository.php
index 7507303c3948..e1dcdb929ec7 100644
--- a/typo3/sysext/linkvalidator/Classes/Repository/BrokenLinkRepository.php
+++ b/typo3/sysext/linkvalidator/Classes/Repository/BrokenLinkRepository.php
@@ -317,12 +317,20 @@ class BrokenLinkRepository
         return $results;
     }
 
+    /**
+     * Add broken link to table tx_linkvalidator_link
+     *
+     * @param array $record
+     * @param bool $isValid
+     * @param array|null $errorParams
+     * @throws \InvalidArgumentException
+     * @throws \UnexpectedValueException
+     * @todo Make default value of $errorParams [] instead of null and add strict typing in v13
+     */
     public function addBrokenLink($record, bool $isValid, array $errorParams = null): void
     {
         $response = ['valid' => $isValid];
-        if ($errorParams) {
-            $response['errorParams'] = $errorParams;
-        }
+        $response['errorParams'] = $errorParams ?? [];
         $record['url_response'] = json_encode($response);
         GeneralUtility::makeInstance(ConnectionPool::class)
             ->getConnectionForTable(self::TABLE)
-- 
GitLab