From 542a48760f48e088e00f055910318ee23404d356 Mon Sep 17 00:00:00 2001 From: Georg Ringer <georg.ringer@gmail.com> Date: Mon, 11 Dec 2017 11:09:46 +0100 Subject: [PATCH] [BUGFIX] Catch InvalidPathException in BE & FE Catch invalid links in FE & BE to keep a working website. Resolves: #83283 Releases: master, 8.7 Change-Id: Id9e42dc9be896f3777210843c651f9726dc94552 Reviewed-on: https://review.typo3.org/55024 Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de> Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de> Tested-by: TYPO3com <no-reply@typo3.com> Reviewed-by: Georg Ringer <georg.ringer@gmail.com> Tested-by: Georg Ringer <georg.ringer@gmail.com> Reviewed-by: Joerg Boesche <typo3@joergboesche.de> Reviewed-by: Benni Mack <benni@typo3.org> Tested-by: Benni Mack <benni@typo3.org> --- .../Classes/Form/Element/InputLinkElement.php | 3 ++ .../ContentObject/ContentObjectRenderer.php | 10 +++++- .../ContentObjectRendererTest.php | 34 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/typo3/sysext/backend/Classes/Form/Element/InputLinkElement.php b/typo3/sysext/backend/Classes/Form/Element/InputLinkElement.php index 5dd841cbac48..db2c12d17a86 100644 --- a/typo3/sysext/backend/Classes/Form/Element/InputLinkElement.php +++ b/typo3/sysext/backend/Classes/Form/Element/InputLinkElement.php @@ -21,6 +21,7 @@ use TYPO3\CMS\Core\LinkHandling\LinkService; use TYPO3\CMS\Core\Localization\LanguageService; use TYPO3\CMS\Core\Resource\Exception\FileDoesNotExistException; use TYPO3\CMS\Core\Resource\Exception\FolderDoesNotExistException; +use TYPO3\CMS\Core\Resource\Exception\InvalidPathException; use TYPO3\CMS\Core\Resource\File; use TYPO3\CMS\Core\Resource\Folder; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -316,6 +317,8 @@ class InputLinkElement extends AbstractFormElement return $data; } catch (UnknownLinkHandlerException $e) { return $data; + } catch (InvalidPathException $e) { + return $data; } // Resolving the TypoLink parts (class, title, params) diff --git a/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php b/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php index 779fef1e31d7..804fc5453715 100644 --- a/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php +++ b/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php @@ -5255,7 +5255,15 @@ class ContentObjectRenderer // Detecting kind of link and resolve all necessary parameters $linkService = GeneralUtility::makeInstance(LinkService::class); - $linkDetails = $linkService->resolve($linkParameter); + try { + $linkDetails = $linkService->resolve($linkParameter); + } catch (Exception\InvalidPathException $exception) { + $logger = GeneralUtility::makeInstance(LogManager::class)->getLogger(__CLASS__); + $logger->warning('The link could not be generated', ['exception' => $exception]); + + return $linkText; + } + $linkDetails['typoLinkParameter'] = $linkParameter; if (isset($linkDetails['type']) && isset($GLOBALS['TYPO3_CONF_VARS']['FE']['typolinkBuilder'][$linkDetails['type']])) { /** @var AbstractTypolinkBuilder $linkBuilder */ diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php index 8155bbf7ca47..f0b7752457b3 100644 --- a/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php +++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php @@ -14,11 +14,15 @@ namespace TYPO3\CMS\Frontend\Tests\Unit\ContentObject; * The TYPO3 project - inspiring people to share! */ +use Prophecy\Argument; use Psr\Log\LoggerInterface; use TYPO3\CMS\Core\Cache\CacheManager; use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface as CacheFrontendInterface; use TYPO3\CMS\Core\Core\ApplicationContext; +use TYPO3\CMS\Core\LinkHandling\LinkService; +use TYPO3\CMS\Core\Log\Logger; use TYPO3\CMS\Core\Log\LogManager; +use TYPO3\CMS\Core\Resource\Exception\InvalidPathException; use TYPO3\CMS\Core\Resource\File; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Resource\ResourceStorage; @@ -3075,6 +3079,36 @@ class ContentObjectRendererTest extends \TYPO3\TestingFramework\Core\Unit\UnitTe $this->assertEquals($expectedResult, $this->subject->typoLink($linkText, $configuration)); } + /** + * @test + */ + public function typoLinkReturnsOnlyLinkTextIfNoLinkResolvingIsPossible() + { + $linkService = $this->prophesize(LinkService::class); + GeneralUtility::setSingletonInstance(LinkService::class, $linkService->reveal()); + $linkService->resolve('foo')->willThrow(InvalidPathException::class); + + $this->assertSame('foo', $this->subject->typoLink('foo', ['parameter' => 'foo'])); + } + + /** + * @test + */ + public function typoLinkLogsErrorIfNoLinkResolvingIsPossible() + { + $linkService = $this->prophesize(LinkService::class); + GeneralUtility::setSingletonInstance(LinkService::class, $linkService->reveal()); + $linkService->resolve('foo')->willThrow(InvalidPathException::class); + + $logManager = $this->prophesize(LogManager::class); + GeneralUtility::setSingletonInstance(LogManager::class, $logManager->reveal()); + $logger = $this->prophesize(Logger::class); + $logger->warning('The link could not be generated', Argument::any())->shouldBeCalled(); + $logManager->getLogger(Argument::any())->willReturn($logger->reveal()); + + $this->subject->typoLink('foo', ['parameter' => 'foo']); + } + /** * @test */ -- GitLab