Skip to content

Commit 29b84ee

Browse files
Merge MAGETWO-95386 into 2.1.16-bugfixes-311018
2 parents cfe65bd + e567e29 commit 29b84ee

File tree

4 files changed

+74
-6
lines changed

4 files changed

+74
-6
lines changed

app/code/Magento/Theme/Model/Design/Backend/Exceptions.php

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
namespace Magento\Theme\Model\Design\Backend;
77

88
use Magento\Config\Model\Config\Backend\Serialized\ArraySerialized;
9+
use Magento\Framework\App\ObjectManager;
10+
use Magento\Framework\Unserialize\SecureUnserializer;
911

1012
class Exceptions extends ArraySerialized
1113
{
@@ -16,6 +18,11 @@ class Exceptions extends ArraySerialized
1618
*/
1719
protected $_design = null;
1820

21+
/**
22+
* @var SecureUnserializer
23+
*/
24+
private $secureUnserializer;
25+
1926
/**
2027
* Initialize dependencies
2128
*
@@ -26,6 +33,7 @@ class Exceptions extends ArraySerialized
2633
* @param \Magento\Framework\View\DesignInterface $design
2734
* @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
2835
* @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
36+
* @param SecureUnserializer|null $secureUnserializer
2937
* @param array $data
3038
*/
3139
public function __construct(
@@ -36,9 +44,12 @@ public function __construct(
3644
\Magento\Framework\View\DesignInterface $design,
3745
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
3846
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
47+
SecureUnserializer $secureUnserializer = null,
3948
array $data = []
4049
) {
4150
$this->_design = $design;
51+
$this->secureUnserializer = $secureUnserializer ?:
52+
ObjectManager::getInstance()->create(SecureUnserializer::class);
4253
parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data);
4354
}
4455

@@ -155,6 +166,26 @@ public function afterLoad()
155166
*/
156167
public function getValue()
157168
{
158-
return $this->getData('value') ?: [];
169+
return $this->validateValue($this->getData('value')) ?: [];
170+
}
171+
172+
/**
173+
* Validate config on appropriate value
174+
*
175+
* @param string $value
176+
* @return bool
177+
*/
178+
private function validateValue($value)
179+
{
180+
try {
181+
if (is_string($value)) {
182+
$this->secureUnserializer->unserialize($value);
183+
}
184+
} catch (\InvalidArgumentException $e) {
185+
$this->_logger->critical($e->getMessage());
186+
$value = false;
187+
}
188+
189+
return $value;
159190
}
160191
}

lib/internal/Magento/Framework/Unserialize/SecureUnserializer.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ public function unserialize($string)
2626
throw new \InvalidArgumentException('Data contains serialized object and cannot be unserialized');
2727
}
2828

29-
return unserialize($string);
29+
try {
30+
return unserialize($string);
31+
} catch (\Exception $e) {
32+
return false;
33+
}
3034
}
3135
}

lib/internal/Magento/Framework/View/DesignExceptions.php

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
*/
66
namespace Magento\Framework\View;
77

8+
use Magento\Framework\App\ObjectManager;
9+
use Magento\Framework\Unserialize\SecureUnserializer;
10+
use Psr\Log\LoggerInterface;
11+
812
/**
913
* Class DesignExceptions
1014
*/
@@ -31,19 +35,36 @@ class DesignExceptions
3135
*/
3236
protected $scopeType;
3337

38+
/**
39+
* @var SecureUnserializer
40+
*/
41+
private $secureUnserializer;
42+
43+
/**
44+
* @var LoggerInterface
45+
*/
46+
private $logger;
47+
3448
/**
3549
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
3650
* @param string $exceptionConfigPath
3751
* @param string $scopeType
52+
* @param SecureUnserializer|null $secureUnserializer
53+
* @param LoggerInterface|null $logger
3854
*/
3955
public function __construct(
4056
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
4157
$exceptionConfigPath,
42-
$scopeType
58+
$scopeType,
59+
SecureUnserializer $secureUnserializer = null,
60+
LoggerInterface $logger = null
4361
) {
4462
$this->scopeConfig = $scopeConfig;
4563
$this->exceptionConfigPath = $exceptionConfigPath;
4664
$this->scopeType = $scopeType;
65+
$this->secureUnserializer = $secureUnserializer ?:
66+
ObjectManager::getInstance()->create(SecureUnserializer::class);
67+
$this->logger = $logger ?: ObjectManager::getInstance()->create(LoggerInterface::class);
4768
}
4869

4970
/**
@@ -65,12 +86,20 @@ public function getThemeByRequest(\Magento\Framework\App\Request\Http $request)
6586
if (!$expressions) {
6687
return false;
6788
}
68-
$expressions = unserialize($expressions);
89+
90+
try {
91+
$expressions = $this->secureUnserializer->unserialize($expressions);
92+
} catch (\InvalidArgumentException $e) {
93+
$this->logger->critical($e->getMessage());
94+
return false;
95+
}
96+
6997
foreach ($expressions as $rule) {
7098
if (preg_match($rule['regexp'], $userAgent)) {
7199
return $rule['value'];
72100
}
73101
}
102+
74103
return false;
75104
}
76105
}

lib/internal/Magento/Framework/View/Test/Unit/DesignExceptionsTest.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
namespace Magento\Framework\View\Test\Unit;
88

99
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
10+
use Magento\Framework\Unserialize\SecureUnserializer;
1011

1112
class DesignExceptionsTest extends \PHPUnit_Framework_TestCase
1213
{
@@ -28,18 +29,21 @@ class DesignExceptionsTest extends \PHPUnit_Framework_TestCase
2829
/** @var string */
2930
protected $scopeType = 'scope_type';
3031

32+
private $secureUnserializer;
33+
3134
protected function setUp()
3235
{
3336
$this->scopeConfigMock = $this->getMock('Magento\Framework\App\Config\ScopeConfigInterface');
3437
$this->requestMock = $this->getMock('Magento\Framework\App\Request\Http', [], [], '', false);
35-
3638
$this->objectManagerHelper = new ObjectManagerHelper($this);
39+
$this->secureUnserializer = $this->objectManagerHelper->getObject(SecureUnserializer::class);
3740
$this->designExceptions = $this->objectManagerHelper->getObject(
3841
'Magento\Framework\View\DesignExceptions',
3942
[
4043
'scopeConfig' => $this->scopeConfigMock,
4144
'exceptionConfigPath' => $this->exceptionConfigPath,
42-
'scopeType' => $this->scopeType
45+
'scopeType' => $this->scopeType,
46+
'secureUnserializer' => $this->secureUnserializer,
4347
]
4448
);
4549
}

0 commit comments

Comments
 (0)