Skip to content

Commit 35ed0fd

Browse files
author
Oleksii Korshenko
authored
Merge pull request #1798 from magento-engcom/develop-prs
Public Pull Requests #12520 Duplicate array key by @lfluvisotto #11859 [Backport 2.3-develop] CMS Page - Force validate layout update xml in production mode when saving CMS Page - Handle layout update xml validation exceptions by @adrian-martinez-interactiv4
2 parents bc6ea8c + 332fedb commit 35ed0fd

File tree

6 files changed

+128
-25
lines changed

6 files changed

+128
-25
lines changed

app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Attributes/Extend.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ public function getExtendedElement($switchAttributeCode)
142142
[
143143
'name' => "product[{$switchAttributeCode}]",
144144
'values' => $this->getOptions(),
145-
'value' => $switchAttributeCode,
146145
'class' => 'required-entry next-toinput',
147146
'no_span' => true,
148147
'disabled' => $this->isDisabledField(),

app/code/Magento/Cms/Controller/Adminhtml/Page/PostDataProcessor.php

Lines changed: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@
66
*/
77
namespace Magento\Cms\Controller\Adminhtml\Page;
88

9+
use Magento\Cms\Model\Page\DomValidationState;
10+
use Magento\Framework\App\ObjectManager;
11+
use Magento\Framework\Config\Dom\ValidationException;
12+
use Magento\Framework\Config\Dom\ValidationSchemaException;
13+
14+
/**
15+
* Class PostDataProcessor
16+
* @package Magento\Cms\Controller\Adminhtml\Page
17+
*/
918
class PostDataProcessor
1019
{
1120
/**
@@ -23,19 +32,28 @@ class PostDataProcessor
2332
*/
2433
protected $messageManager;
2534

35+
/**
36+
* @var DomValidationState
37+
*/
38+
private $validationState;
39+
2640
/**
2741
* @param \Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter
2842
* @param \Magento\Framework\Message\ManagerInterface $messageManager
2943
* @param \Magento\Framework\View\Model\Layout\Update\ValidatorFactory $validatorFactory
44+
* @param DomValidationState $validationState
3045
*/
3146
public function __construct(
3247
\Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter,
3348
\Magento\Framework\Message\ManagerInterface $messageManager,
34-
\Magento\Framework\View\Model\Layout\Update\ValidatorFactory $validatorFactory
49+
\Magento\Framework\View\Model\Layout\Update\ValidatorFactory $validatorFactory,
50+
DomValidationState $validationState = null
3551
) {
3652
$this->dateFilter = $dateFilter;
3753
$this->messageManager = $messageManager;
3854
$this->validatorFactory = $validatorFactory;
55+
$this->validationState = $validationState
56+
?: ObjectManager::getInstance()->get(DomValidationState::class);
3957
}
4058

4159
/**
@@ -61,27 +79,27 @@ public function filter($data)
6179
* Validate post data
6280
*
6381
* @param array $data
64-
* @return bool Return FALSE if someone item is invalid
82+
* @return bool Return FALSE if some item is invalid
6583
*/
6684
public function validate($data)
6785
{
68-
$errorNo = true;
6986
if (!empty($data['layout_update_xml']) || !empty($data['custom_layout_update_xml'])) {
70-
/** @var $validatorCustomLayout \Magento\Framework\View\Model\Layout\Update\Validator */
71-
$validatorCustomLayout = $this->validatorFactory->create();
72-
if (!empty($data['layout_update_xml']) && !$validatorCustomLayout->isValid($data['layout_update_xml'])) {
73-
$errorNo = false;
74-
}
75-
if (!empty($data['custom_layout_update_xml'])
76-
&& !$validatorCustomLayout->isValid($data['custom_layout_update_xml'])
77-
) {
78-
$errorNo = false;
79-
}
80-
foreach ($validatorCustomLayout->getMessages() as $message) {
81-
$this->messageManager->addError($message);
87+
/** @var $layoutXmlValidator \Magento\Framework\View\Model\Layout\Update\Validator */
88+
$layoutXmlValidator = $this->validatorFactory->create(
89+
[
90+
'validationState' => $this->validationState,
91+
]
92+
);
93+
94+
if (!$this->validateData($data, $layoutXmlValidator)) {
95+
$validatorMessages = $layoutXmlValidator->getMessages();
96+
foreach ($validatorMessages as $message) {
97+
$this->messageManager->addErrorMessage($message);
98+
}
99+
return false;
82100
}
83101
}
84-
return $errorNo;
102+
return true;
85103
}
86104

87105
/**
@@ -108,4 +126,34 @@ public function validateRequireEntry(array $data)
108126
}
109127
return $errorNo;
110128
}
129+
130+
/**
131+
* Validate data, avoid cyclomatic complexity
132+
*
133+
* @param array $data
134+
* @param \Magento\Framework\View\Model\Layout\Update\Validator $layoutXmlValidator
135+
* @return bool
136+
*/
137+
private function validateData($data, $layoutXmlValidator)
138+
{
139+
try {
140+
if (!empty($data['layout_update_xml']) && !$layoutXmlValidator->isValid($data['layout_update_xml'])) {
141+
return false;
142+
}
143+
if (!empty($data['custom_layout_update_xml']) &&
144+
!$layoutXmlValidator->isValid($data['custom_layout_update_xml'])
145+
) {
146+
return false;
147+
}
148+
} catch (ValidationException $e) {
149+
return false;
150+
} catch (ValidationSchemaException $e) {
151+
return false;
152+
} catch (\Exception $e) {
153+
$this->messageManager->addExceptionMessage($e);
154+
return false;
155+
}
156+
157+
return true;
158+
}
111159
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
/**
3+
* Application config file resolver
4+
*
5+
* Copyright © Magento, Inc. All rights reserved.
6+
* See COPYING.txt for license details.
7+
*/
8+
namespace Magento\Cms\Model\Page;
9+
10+
/**
11+
* Class DomValidationState
12+
* @package Magento\Cms\Model\Page
13+
*/
14+
class DomValidationState implements \Magento\Framework\Config\ValidationStateInterface
15+
{
16+
/**
17+
* Retrieve validation state
18+
* Used in cms page post processor to force validate layout update xml
19+
*
20+
* @return boolean
21+
*/
22+
public function isValidationRequired()
23+
{
24+
return true;
25+
}
26+
}

app/code/Magento/Downloadable/Helper/File.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,6 @@ public function getAllMineTypes()
766766
'xxyz' => 'chemical/x-xyz',
767767
'xzaz' => 'application/vnd.zzazz.deck+xml',
768768
'xzip' => 'application/zip',
769-
'xzmm' => 'application/vnd.handheld-entertainment+xml',
770-
'xodt' => 'application/x-vnd.oasis.opendocument.spreadsheet',
769+
'xzmm' => 'application/vnd.handheld-entertainment+xml'
771770
];
772771
}

lib/internal/Magento/Framework/View/Model/Layout/Update/Validator.php

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
*/
66
namespace Magento\Framework\View\Model\Layout\Update;
77

8+
use Magento\Framework\App\ObjectManager;
89
use Magento\Framework\Config\Dom\UrnResolver;
910
use Magento\Framework\Config\Dom\ValidationSchemaException;
11+
use Magento\Framework\Config\DomFactory;
12+
use Magento\Framework\Config\ValidationStateInterface;
1013

1114
/**
1215
* Validator for custom layout update
@@ -54,17 +57,24 @@ class Validator extends \Zend_Validate_Abstract
5457
protected $_xsdSchemas;
5558

5659
/**
57-
* @var \Magento\Framework\Config\DomFactory
60+
* @var DomFactory
5861
*/
5962
protected $_domConfigFactory;
6063

6164
/**
62-
* @param \Magento\Framework\Config\DomFactory $domConfigFactory
65+
* @var ValidationStateInterface
66+
*/
67+
private $validationState;
68+
69+
/**
70+
* @param DomFactory $domConfigFactory
6371
* @param \Magento\Framework\Config\Dom\UrnResolver $urnResolver
72+
* @param ValidationStateInterface $validationState
6473
*/
6574
public function __construct(
66-
\Magento\Framework\Config\DomFactory $domConfigFactory,
67-
UrnResolver $urnResolver
75+
DomFactory $domConfigFactory,
76+
UrnResolver $urnResolver,
77+
ValidationStateInterface $validationState = null
6878
) {
6979
$this->_domConfigFactory = $domConfigFactory;
7080
$this->_initMessageTemplates();
@@ -76,6 +86,8 @@ public function __construct(
7686
'urn:magento:framework:View/Layout/etc/layout_merged.xsd'
7787
),
7888
];
89+
$this->validationState = $validationState
90+
?: ObjectManager::getInstance()->get(ValidationStateInterface::class);
7991
}
8092

8193
/**
@@ -122,7 +134,13 @@ public function isValid($value, $schema = self::LAYOUT_SCHEMA_PAGE_HANDLE, $isSe
122134
try {
123135
//wrap XML value in the "layout" and "handle" tags to make it validatable
124136
$value = '<layout xmlns:xsi="' . self::XML_NAMESPACE_XSI . '">' . $value . '</layout>';
125-
$this->_domConfigFactory->createDom(['xml' => $value, 'schemaFile' => $this->_xsdSchemas[$schema]]);
137+
$this->_domConfigFactory->createDom(
138+
[
139+
'xml' => $value,
140+
'schemaFile' => $this->_xsdSchemas[$schema],
141+
'validationState' => $this->validationState,
142+
]
143+
);
126144

127145
if ($isSecurityCheck) {
128146
$value = new \Magento\Framework\Simplexml\Element($value);

lib/internal/Magento/Framework/View/Test/Unit/Model/Layout/Update/ValidatorTest.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ class ValidatorTest extends \PHPUnit\Framework\TestCase
3030
*/
3131
private $urnResolver;
3232

33+
/**
34+
* @var \Magento\Framework\Config\ValidationStateInterface|\PHPUnit_Framework_MockObject_MockObject
35+
*/
36+
private $validationState;
37+
3338
protected function setUp()
3439
{
3540
$this->_objectHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
@@ -39,10 +44,17 @@ protected function setUp()
3944
$this->urnResolver = $this->getMockBuilder(
4045
\Magento\Framework\Config\Dom\UrnResolver::class
4146
)->disableOriginalConstructor()->getMock();
47+
$this->validationState = $this->getMockBuilder(
48+
\Magento\Framework\Config\ValidationStateInterface::class
49+
)->disableOriginalConstructor()->getMock();
4250

4351
$this->model = $this->_objectHelper->getObject(
4452
\Magento\Framework\View\Model\Layout\Update\Validator::class,
45-
['domConfigFactory' => $this->domConfigFactory, 'urnResolver' => $this->urnResolver]
53+
[
54+
'domConfigFactory' => $this->domConfigFactory,
55+
'urnResolver' => $this->urnResolver,
56+
'validationState' => $this->validationState,
57+
]
4658
);
4759
}
4860

@@ -56,6 +68,7 @@ protected function _createValidator($layoutUpdate)
5668
'xml' => '<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' .
5769
trim($layoutUpdate) . '</layout>',
5870
'schemaFile' => $this->urnResolver->getRealPath('urn:magento:framework:View/Layout/etc/page_layout.xsd'),
71+
'validationState' => $this->validationState,
5972
];
6073

6174
$this->domConfigFactory->expects(

0 commit comments

Comments
 (0)