From 59e5864703ce8c31e9f005bab1b03e08ad38e631 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Mart=C3=ADnez?= Date: Mon, 30 Oct 2017 04:21:24 +0100 Subject: [PATCH 1/2] CMS Page - Force validate layout update xml, even in production mode, when saving CMS Page --- .../Adminhtml/Page/PostDataProcessor.php | 20 +++++++++++-- .../Cms/Model/Page/DomValidationState.php | 26 +++++++++++++++++ .../View/Model/Layout/Update/Validator.php | 28 +++++++++++++++---- 3 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 app/code/Magento/Cms/Model/Page/DomValidationState.php diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/PostDataProcessor.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/PostDataProcessor.php index 7fd1ee6020937..4873572456500 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/PostDataProcessor.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/PostDataProcessor.php @@ -6,6 +6,9 @@ */ namespace Magento\Cms\Controller\Adminhtml\Page; +use Magento\Cms\Model\Page\DomValidationState; +use Magento\Framework\App\ObjectManager; + class PostDataProcessor { /** @@ -23,19 +26,28 @@ class PostDataProcessor */ protected $messageManager; + /** + * @var DomValidationState + */ + private $validationState; + /** * @param \Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter * @param \Magento\Framework\Message\ManagerInterface $messageManager * @param \Magento\Framework\View\Model\Layout\Update\ValidatorFactory $validatorFactory + * @param DomValidationState $validationState */ public function __construct( \Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter, \Magento\Framework\Message\ManagerInterface $messageManager, - \Magento\Framework\View\Model\Layout\Update\ValidatorFactory $validatorFactory + \Magento\Framework\View\Model\Layout\Update\ValidatorFactory $validatorFactory, + DomValidationState $validationState = null ) { $this->dateFilter = $dateFilter; $this->messageManager = $messageManager; $this->validatorFactory = $validatorFactory; + $this->validationState = $validationState + ?: ObjectManager::getInstance()->get(DomValidationState::class); } /** @@ -68,7 +80,11 @@ public function validate($data) $errorNo = true; if (!empty($data['layout_update_xml']) || !empty($data['custom_layout_update_xml'])) { /** @var $validatorCustomLayout \Magento\Framework\View\Model\Layout\Update\Validator */ - $validatorCustomLayout = $this->validatorFactory->create(); + $validatorCustomLayout = $this->validatorFactory->create( + [ + 'validationState' => $this->validationState, + ] + ); if (!empty($data['layout_update_xml']) && !$validatorCustomLayout->isValid($data['layout_update_xml'])) { $errorNo = false; } diff --git a/app/code/Magento/Cms/Model/Page/DomValidationState.php b/app/code/Magento/Cms/Model/Page/DomValidationState.php new file mode 100644 index 0000000000000..b08ab6342fc5d --- /dev/null +++ b/app/code/Magento/Cms/Model/Page/DomValidationState.php @@ -0,0 +1,26 @@ +_domConfigFactory = $domConfigFactory; $this->_initMessageTemplates(); @@ -76,6 +86,8 @@ public function __construct( 'urn:magento:framework:View/Layout/etc/layout_merged.xsd' ), ]; + $this->validationState = $validationState + ?: ObjectManager::getInstance()->get(ValidationStateInterface::class); } /** @@ -122,7 +134,13 @@ public function isValid($value, $schema = self::LAYOUT_SCHEMA_PAGE_HANDLE, $isSe try { //wrap XML value in the "layout" and "handle" tags to make it validatable $value = '' . $value . ''; - $this->_domConfigFactory->createDom(['xml' => $value, 'schemaFile' => $this->_xsdSchemas[$schema]]); + $this->_domConfigFactory->createDom( + [ + 'xml' => $value, + 'schemaFile' => $this->_xsdSchemas[$schema], + 'validationState' => $this->validationState, + ] + ); if ($isSecurityCheck) { $value = new \Magento\Framework\Simplexml\Element($value); From 460acf33ef5ca3b38f451cfb04a06b5a9138caac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Mart=C3=ADnez?= Date: Mon, 30 Oct 2017 12:06:19 +0100 Subject: [PATCH 2/2] Update Magento/Framework/View/Test/Unit/Model/Layout/Update/ValidatorTest.php tests --- .../Unit/Model/Layout/Update/ValidatorTest.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Model/Layout/Update/ValidatorTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Model/Layout/Update/ValidatorTest.php index 5cc524103f9a2..873f66b4bf9c0 100644 --- a/lib/internal/Magento/Framework/View/Test/Unit/Model/Layout/Update/ValidatorTest.php +++ b/lib/internal/Magento/Framework/View/Test/Unit/Model/Layout/Update/ValidatorTest.php @@ -30,6 +30,11 @@ class ValidatorTest extends \PHPUnit\Framework\TestCase */ private $urnResolver; + /** + * @var \Magento\Framework\Config\ValidationStateInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $validationState; + protected function setUp() { $this->_objectHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -39,10 +44,17 @@ protected function setUp() $this->urnResolver = $this->getMockBuilder( \Magento\Framework\Config\Dom\UrnResolver::class )->disableOriginalConstructor()->getMock(); + $this->validationState = $this->getMockBuilder( + \Magento\Framework\Config\ValidationStateInterface::class + )->disableOriginalConstructor()->getMock(); $this->model = $this->_objectHelper->getObject( \Magento\Framework\View\Model\Layout\Update\Validator::class, - ['domConfigFactory' => $this->domConfigFactory, 'urnResolver' => $this->urnResolver] + [ + 'domConfigFactory' => $this->domConfigFactory, + 'urnResolver' => $this->urnResolver, + 'validationState' => $this->validationState, + ] ); } @@ -56,6 +68,7 @@ protected function _createValidator($layoutUpdate) 'xml' => '' . trim($layoutUpdate) . '', 'schemaFile' => $this->urnResolver->getRealPath('urn:magento:framework:View/Layout/etc/page_layout.xsd'), + 'validationState' => $this->validationState, ]; $this->domConfigFactory->expects(