From 83c3be60dd72095b90ddd696964ed1dcedc13871 Mon Sep 17 00:00:00 2001
From: Francois Suter <sutfra@gmail.com>
Date: Fri, 17 Jan 2020 11:21:03 +0100
Subject: [PATCH] [BUGFIX] Respect cross-site error content source

In a multi-site setup, it should be possible to refer to a page
from site A as an error page from site B.

Resolves: #90135
Releases: master, 9.5
Change-Id: Ic3e4669e6279f58fe4953f8253d6329f1d137cd3
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/62955
Tested-by: Susanne Moog <look@susi.dev>
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Susanne Moog <look@susi.dev>
Reviewed-by: Oliver Bartsch <bo@cedev.de>
Reviewed-by: Benni Mack <benni@typo3.org>
---
 .../PageContentErrorHandler.php                | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/typo3/sysext/core/Classes/Error/PageErrorHandler/PageContentErrorHandler.php b/typo3/sysext/core/Classes/Error/PageErrorHandler/PageContentErrorHandler.php
index 7935b5905472..3bf2e8739dbd 100644
--- a/typo3/sysext/core/Classes/Error/PageErrorHandler/PageContentErrorHandler.php
+++ b/typo3/sysext/core/Classes/Error/PageErrorHandler/PageContentErrorHandler.php
@@ -105,12 +105,22 @@ class PageContentErrorHandler implements PageErrorHandlerInterface
             return $urlParams['url'];
         }
 
-        $site = $request->getAttribute('site', null);
+        // Get the site related to the configured error page
+        $site = GeneralUtility::makeInstance(SiteFinder::class)->getSiteByPageId((int)$urlParams['pageuid']);
+        // Fall back to current request for the site
         if (!$site instanceof Site) {
-            $site = GeneralUtility::makeInstance(SiteFinder::class)->getSiteByPageId((int)$urlParams['pageuid']);
+            $site = $request->getAttribute('site', null);
         }
-        $language = $request->getAttribute('language', null);
-        if (!$language instanceof SiteLanguage || !$language->isEnabled()) {
+        /** @var SiteLanguage $requestLanguage */
+        $requestLanguage = $request->getAttribute('language', null);
+        // Try to get the current request language from the site that was found above
+        if ($requestLanguage instanceof SiteLanguage) {
+            try {
+                $language = $site->getLanguageById($requestLanguage->getLanguageId());
+            } catch (\InvalidArgumentException $e) {
+                $language = $site->getDefaultLanguage();
+            }
+        } else {
             $language = $site->getDefaultLanguage();
         }
 
-- 
GitLab