diff --git a/typo3/sysext/backend/Classes/Form/Element/InputLinkElement.php b/typo3/sysext/backend/Classes/Form/Element/InputLinkElement.php index 5dd841cbac486ed087bfbf66ffd4af1b84fc2cea..db2c12d17a864258146f990519ca78c4d65b3c36 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 779fef1e31d793a4c0a5fbb38c499362b87ffe78..804fc54537157828a91a2e758b2f68a9289ea9d3 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 8155bbf7ca4785165aa3edfbb941f19080fb69ba..f0b7752457b329223026bcc17e1c74026e77b21c 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 */