Skip to content

Commit 0859c7d

Browse files
author
Bohdan Korablov
committed
MAGETWO-54243: [Github] Directive values are not quote-escaped #3860
1 parent c2fd296 commit 0859c7d

File tree

3 files changed

+32
-8
lines changed

3 files changed

+32
-8
lines changed

app/code/Magento/Widget/Controller/Adminhtml/Widget/LoadOptions.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ public function execute()
2525
try {
2626
$this->_view->loadLayout();
2727
if ($paramsJson = $this->getRequest()->getParam('widget')) {
28-
$request = $this->_objectManager->get('Magento\Framework\Json\Helper\Data')->jsonDecode($paramsJson);
28+
$request = $this->_objectManager->get(\Magento\Framework\Json\Helper\Data::class)
29+
->jsonDecode($paramsJson);
2930
if (is_array($request)) {
3031
$optionsBlock = $this->_view->getLayout()->getBlock('wysiwyg_widget.options');
3132
if (isset($request['widget_type'])) {
@@ -45,7 +46,7 @@ public function execute()
4546
} catch (\Magento\Framework\Exception\LocalizedException $e) {
4647
$result = ['error' => true, 'message' => $e->getMessage()];
4748
$this->getResponse()->representJson(
48-
$this->_objectManager->get('Magento\Framework\Json\Helper\Data')->jsonEncode($result)
49+
$this->_objectManager->get(\Magento\Framework\Json\Helper\Data::class)->jsonEncode($result)
4950
);
5051
}
5152
}
@@ -57,7 +58,7 @@ public function execute()
5758
private function getConditionsHelper()
5859
{
5960
if (!$this->conditionsHelper) {
60-
$this->conditionsHelper = ObjectManager::getInstance()->get('\Magento\Widget\Helper\Conditions');
61+
$this->conditionsHelper = ObjectManager::getInstance()->get(\Magento\Widget\Helper\Conditions::class);
6162
}
6263

6364
return $this->conditionsHelper;

app/code/Magento/Widget/Model/Widget.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ public function getWidgetDeclaration($type, $params = [], $asIs = true)
314314
}
315315
}
316316
if ($value) {
317-
$directive .= sprintf(' %s="%s"', $name, htmlspecialchars($value));
317+
$directive .= sprintf(' %s="%s"', $name, $this->escaper->escapeQuote($value));
318318
}
319319
}
320320

app/code/Magento/Widget/Test/Unit/Model/WidgetTest.php

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ class WidgetTest extends \PHPUnit_Framework_TestCase
1515
*/
1616
protected $dataStorageMock;
1717

18+
/**
19+
* @var \Magento\Framework\Escaper|\PHPUnit_Framework_MockObject_MockObject
20+
*/
21+
private $escaperMock;
22+
1823
/**
1924
* @var \Magento\Widget\Model\Widget
2025
*/
@@ -27,17 +32,24 @@ class WidgetTest extends \PHPUnit_Framework_TestCase
2732

2833
protected function setUp()
2934
{
30-
$this->dataStorageMock = $this->getMockBuilder('Magento\Widget\Model\Config\Data')
35+
$this->dataStorageMock = $this->getMockBuilder(\Magento\Widget\Model\Config\Data::class)
3136
->disableOriginalConstructor()
3237
->getMock();
33-
$this->conditionsHelper = $this->getMockBuilder('\Magento\Widget\Helper\Conditions')
38+
$this->conditionsHelper = $this->getMockBuilder(\Magento\Widget\Helper\Conditions::class)
3439
->setMethods(['encode'])
3540
->disableOriginalConstructor()
3641
->getMock();
42+
$this->escaperMock = $this->getMockBuilder(\Magento\Framework\Escaper::class)
43+
->disableOriginalConstructor()
44+
->getMock();
3745
$objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
3846
$this->widget = $objectManagerHelper->getObject(
39-
'Magento\Widget\Model\Widget',
40-
['dataStorage' => $this->dataStorageMock, 'conditionsHelper' => $this->conditionsHelper]
47+
\Magento\Widget\Model\Widget::class,
48+
[
49+
'dataStorage' => $this->dataStorageMock,
50+
'conditionsHelper' => $this->conditionsHelper,
51+
'escaper' => $this->escaperMock,
52+
]
4153
);
4254
}
4355

@@ -160,6 +172,17 @@ public function testGetWidgetDeclaration()
160172

161173
$this->conditionsHelper->expects($this->once())->method('encode')->with($conditions)
162174
->willReturn('encoded-conditions-string');
175+
$this->escaperMock->expects($this->atLeastOnce())
176+
->method('escapeQuote')
177+
->willReturnMap([
178+
['my "widget"', false, 'my "widget"'],
179+
['1', false, '1'],
180+
['5', false, '5'],
181+
['10', false, '10'],
182+
['product/widget/content/grid.phtml', false, 'product/widget/content/grid.phtml'],
183+
['encoded-conditions-string', false, 'encoded-conditions-string'],
184+
]);
185+
163186
$result = $this->widget->getWidgetDeclaration('Magento\CatalogWidget\Block\Product\ProductsList', $params);
164187
$this->assertContains('{{widget type="Magento\CatalogWidget\Block\Product\ProductsList"', $result);
165188
$this->assertContains('title="my "widget""', $result);

0 commit comments

Comments
 (0)