Skip to content

Commit 73a2819

Browse files
Merge pull request #8596 from magento-cia/cia-2.4.7-beta3-develop-bugfix-10162023
Cia 2.4.7 beta3 develop bugfix 10162023
2 parents a978ecc + e7215c0 commit 73a2819

File tree

2 files changed

+65
-20
lines changed
  • app/code/Magento/Config

2 files changed

+65
-20
lines changed

app/code/Magento/Config/Block/System/Config/Form/Field/File.php

100644100755
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
*
1010
* @author Magento Core Team <[email protected]>
1111
*/
12+
declare(strict_types=1);
13+
1214
namespace Magento\Config\Block\System\Config\Form\Field;
1315

1416
class File extends \Magento\Framework\Data\Form\Element\File
@@ -35,7 +37,7 @@ protected function _getDeleteCheckbox()
3537
$html = '';
3638
if ((string)$this->getValue()) {
3739
$label = __('Delete File');
38-
$html .= '<div>' . $this->getValue() . ' ';
40+
$html .= '<div>' . $this->_escaper->escapeHtml($this->getValue()) . ' ';
3941
$html .= '<input type="checkbox" name="' .
4042
parent::getName() .
4143
'[delete]" value="1" class="checkbox" id="' .

app/code/Magento/Config/Test/Unit/Block/System/Config/Form/Field/FileTest.php

Lines changed: 62 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,49 +8,85 @@
88
namespace Magento\Config\Test\Unit\Block\System\Config\Form\Field;
99

1010
use Magento\Config\Block\System\Config\Form\Field\File;
11+
use Magento\Framework\Data\Form\Element\Factory;
12+
use Magento\Framework\Data\Form\Element\CollectionFactory;
1113
use Magento\Framework\DataObject;
1214
use Magento\Framework\Escaper;
1315
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
16+
use PHPUnit\Framework\MockObject\MockObject;
1417
use PHPUnit\Framework\TestCase;
1518

1619
/**
1720
* Tests for \Magento\Framework\Data\Form\Field\File
1821
*/
1922
class FileTest extends TestCase
2023
{
24+
/**
25+
* XSS value
26+
*/
27+
private const XSS_FILE_NAME_TEST = '<img src=x onerror=alert(1)>.crt';
28+
29+
/**
30+
* Input name
31+
*/
32+
private const INPUT_NAME_TEST = 'test_name';
33+
2134
/**
2235
* @var File
2336
*/
2437
protected $file;
2538

39+
/**
40+
* @var Factory|MockObject
41+
*/
42+
private $factoryMock;
43+
44+
/**
45+
* @var CollectionFactory|MockObject
46+
*/
47+
private $factoryCollectionMock;
48+
49+
/**
50+
* @var Escaper|MockObject
51+
*/
52+
private $escaperMock;
53+
2654
/**
2755
* @var array
2856
*/
29-
protected $testData;
57+
protected array $testData = [
58+
'before_element_html' => 'test_before_element_html',
59+
'html_id' => 'test_id',
60+
'name' => 'test_name',
61+
'value' => 'test_value',
62+
'title' => 'test_title',
63+
'disabled' => true,
64+
'after_element_js' => 'test_after_element_js',
65+
'after_element_html' => 'test_after_element_html',
66+
'html_id_prefix' => 'test_id_prefix_',
67+
'html_id_suffix' => '_test_id_suffix',
68+
];
3069

3170
protected function setUp(): void
3271
{
3372
$objectManager = new ObjectManager($this);
3473

35-
$this->testData = [
36-
'before_element_html' => 'test_before_element_html',
37-
'html_id' => 'test_id',
38-
'name' => 'test_name',
39-
'value' => 'test_value',
40-
'title' => 'test_title',
41-
'disabled' => true,
42-
'after_element_js' => 'test_after_element_js',
43-
'after_element_html' => 'test_after_element_html',
44-
'html_id_prefix' => 'test_id_prefix_',
45-
'html_id_suffix' => '_test_id_suffix',
46-
];
47-
74+
$this->factoryMock = $this->getMockBuilder(Factory::class)
75+
->disableOriginalConstructor()
76+
->getMock();
77+
$this->factoryCollectionMock = $this->getMockBuilder(CollectionFactory::class)
78+
->disableOriginalConstructor()
79+
->getMock();
80+
$this->escaperMock = $this->getMockBuilder(Escaper::class)
81+
->disableOriginalConstructor()
82+
->getMock();
4883
$this->file = $objectManager->getObject(
4984
File::class,
5085
[
51-
'_escaper' => $objectManager->getObject(Escaper::class),
86+
'factoryElement' => $this->factoryMock,
87+
'factoryCollection' => $this->factoryCollectionMock,
88+
'_escaper' => $this->escaperMock,
5289
'data' => $this->testData,
53-
5490
]
5591
);
5692

@@ -60,13 +96,20 @@ protected function setUp(): void
6096
$this->file->setForm($formMock);
6197
}
6298

63-
public function testGetElementHtml()
99+
public function testGetElementHtml(): void
64100
{
65-
$html = $this->file->getElementHtml();
66-
67101
$expectedHtmlId = $this->testData['html_id_prefix']
68102
. $this->testData['html_id']
69103
. $this->testData['html_id_suffix'];
104+
$this->escaperMock->expects($this->any())->method('escapeHtml')->willReturnMap(
105+
[
106+
[$expectedHtmlId, null, $expectedHtmlId],
107+
[self::XSS_FILE_NAME_TEST, null, self::XSS_FILE_NAME_TEST],
108+
[self::INPUT_NAME_TEST, null, self::INPUT_NAME_TEST],
109+
]
110+
);
111+
112+
$html = $this->file->getElementHtml();
70113

71114
$this->assertStringContainsString('<label class="addbefore" for="' . $expectedHtmlId . '"', $html);
72115
$this->assertStringContainsString($this->testData['before_element_html'], $html);

0 commit comments

Comments
 (0)