diff --git a/Neos.Media.Browser/Classes/Controller/AssetController.php b/Neos.Media.Browser/Classes/Controller/AssetController.php index a4ee773a8ca..0446964cd1f 100644 --- a/Neos.Media.Browser/Classes/Controller/AssetController.php +++ b/Neos.Media.Browser/Classes/Controller/AssetController.php @@ -14,6 +14,7 @@ use Doctrine\Common\Persistence\Proxy as DoctrineProxy; use Doctrine\ORM\EntityNotFoundException; +use enshrined\svgSanitize\Sanitizer; use Neos\Error\Messages\Error; use Neos\Error\Messages\Message; use Neos\Flow\Annotations as Flow; @@ -35,6 +36,7 @@ use Neos\Media\Domain\Model\AssetCollection; use Neos\Media\Domain\Model\AssetInterface; use Neos\Media\Domain\Model\AssetSource\AssetNotFoundExceptionInterface; +use Neos\Media\Domain\Model\AssetSource\AssetProxy\AssetProxyInterface; use Neos\Media\Domain\Model\AssetSource\AssetProxyRepositoryInterface; use Neos\Media\Domain\Model\AssetSource\AssetSourceConnectionExceptionInterface; use Neos\Media\Domain\Model\AssetSource\AssetSourceInterface; @@ -372,7 +374,8 @@ public function showAction(string $assetSourceIdentifier, string $assetProxyIden $this->view->assignMultiple([ 'assetProxy' => $assetProxy, - 'assetCollections' => $this->assetCollectionRepository->findAll() + 'assetCollections' => $this->assetCollectionRepository->findAll(), + 'assetContainsMaliciousContent' => $this->checkForMaliciousContent($assetProxy) ]); } catch (AssetNotFoundExceptionInterface | AssetSourceConnectionExceptionInterface $e) { $this->view->assign('connectionError', $e); @@ -425,6 +428,7 @@ public function editAction(string $assetSourceIdentifier, string $assetProxyIden 'assetCollections' => $this->assetCollectionRepository->findAll(), 'contentPreview' => $contentPreview, 'assetSource' => $assetSource, + 'assetContainsMaliciousContent' => $this->checkForMaliciousContent($assetProxy), 'canShowVariants' => ($assetProxy instanceof NeosAssetProxy) && ($assetProxy->getAsset() instanceof VariantSupportInterface) ]); } catch (AssetNotFoundExceptionInterface | AssetSourceConnectionExceptionInterface $e) { @@ -1024,4 +1028,25 @@ private function forwardWithConstraints(string $actionName, string $controllerNa } $this->forward($actionName, $controllerName, null, $arguments); } + + private function checkForMaliciousContent(AssetProxyInterface $assetProxy): bool + { + if ($assetProxy->getMediaType() == 'image/svg+xml') { + // @todo: Simplify again when https://github.com/darylldoyle/svg-sanitizer/pull/90 is merged and released. + $previousXmlErrorHandling = libxml_use_internal_errors(true); + $sanitizer = new Sanitizer(); + + $resource = stream_get_contents($assetProxy->getImportStream()); + + $sanitizer->sanitize($resource); + libxml_clear_errors(); + libxml_use_internal_errors($previousXmlErrorHandling); + $issues = $sanitizer->getXmlIssues(); + if ($issues && count($issues) > 0) { + return true; + } + } + + return false; + } } diff --git a/Neos.Media.Browser/Resources/Private/Partials/ContentDefaultPreview.html b/Neos.Media.Browser/Resources/Private/Partials/ContentDefaultPreview.html index f32baac89dd..3f0963cdf42 100644 --- a/Neos.Media.Browser/Resources/Private/Partials/ContentDefaultPreview.html +++ b/Neos.Media.Browser/Resources/Private/Partials/ContentDefaultPreview.html @@ -1,7 +1,14 @@ {namespace m=Neos\Media\ViewHelpers} {namespace neos=Neos\Neos\ViewHelpers}
diff --git a/Neos.Media.Browser/Resources/Private/Templates/Asset/Edit.html b/Neos.Media.Browser/Resources/Private/Templates/Asset/Edit.html index f40c47e7df1..06ec12fa5d7 100644 --- a/Neos.Media.Browser/Resources/Private/Templates/Asset/Edit.html +++ b/Neos.Media.Browser/Resources/Private/Templates/Asset/Edit.html @@ -78,7 +78,19 @@