diff --git a/Plugin/Controller/Adminhtml/Wysiwyg/DirectivePlugin.php b/Plugin/Controller/Adminhtml/Wysiwyg/DirectivePlugin.php index c599946..d567451 100644 --- a/Plugin/Controller/Adminhtml/Wysiwyg/DirectivePlugin.php +++ b/Plugin/Controller/Adminhtml/Wysiwyg/DirectivePlugin.php @@ -8,10 +8,14 @@ use Magento\Cms\Controller\Adminhtml\Wysiwyg\Directive; use Magento\Cms\Model\Template\Filter; +use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\App\Filesystem\DirectoryResolver; use Magento\Framework\Controller\Result\Raw; use Magento\Framework\Controller\Result\RawFactory; use Magento\Framework\Exception\LocalizedException; -use Magento\Framework\Url\DecoderInterface;use MagestyApps\WebImages\Helper\ImageHelper; +use Magento\Framework\Filesystem; +use Magento\Framework\Url\DecoderInterface; +use MagestyApps\WebImages\Helper\ImageHelper; class DirectivePlugin { @@ -35,23 +39,39 @@ class DirectivePlugin */ private $imageHelper; + /** + * @var Filesystem + */ + private $filesystem; + + /** + * @var DirectoryResolver + */ + private $directoryResolver; + /** * DirectivePlugin constructor. * @param DecoderInterface $urlDecoder * @param Filter $filter * @param RawFactory $resultRawFactory * @param ImageHelper $imageHelper + * @param Filesystem $filesystem + * @param DirectoryResolver $directoryResolver */ public function __construct( DecoderInterface $urlDecoder, Filter $filter, RawFactory $resultRawFactory, - ImageHelper $imageHelper + ImageHelper $imageHelper, + Filesystem $filesystem, + DirectoryResolver $directoryResolver ) { $this->urlDecoder = $urlDecoder; $this->filter = $filter; $this->resultRawFactory = $resultRawFactory; $this->imageHelper = $imageHelper; + $this->filesystem = $filesystem; + $this->directoryResolver = $directoryResolver; } /** @@ -67,19 +87,29 @@ public function aroundExecute(Directive $subject, callable $proceed) $directive = $subject->getRequest()->getParam('___directive'); $directive = $this->urlDecoder->decode($directive); $imagePath = $this->filter->filter($directive); + $imagePath = str_replace('\\', '/', $imagePath); if (!$this->imageHelper->isVectorImage($imagePath)) { throw new LocalizedException(__('This is not a vector image')); } + $urlPath = $this->filesystem->getUri(DirectoryList::MEDIA); + $relativeFilePath = str_replace(rtrim($urlPath, '/') . '/', '', $imagePath); + $mediaDirectory = $this->filesystem->getDirectoryRead(DirectoryList::MEDIA); + $absolutePath = $mediaDirectory->getAbsolutePath($relativeFilePath); + + if (!$this->directoryResolver->validatePath($absolutePath, DirectoryList::MEDIA)) { + throw new LocalizedException(__('Invalid Path')); + } + /** @var Raw $resultRaw */ $resultRaw = $this->resultRawFactory->create(); $resultRaw->setHeader('Content-Type', 'image/svg+xml'); - $resultRaw->setContents(file_get_contents($imagePath)); + $resultRaw->setContents($mediaDirectory->readFile($relativeFilePath)); return $resultRaw; } catch (\Exception $e) { return $proceed(); } } -} +} \ No newline at end of file