Skip to content

Commit 76e160e

Browse files
Merge pull request #3399 from magento-qwerty/2.1.16-bugfixes-311018
Fixed issues: - MAGETWO-95386: Fixed incorrect design expretions functional - MAGETWO-94340: Fixed incorrect return-order flow
2 parents 4a043b3 + 2fd88a8 commit 76e160e

File tree

5 files changed

+104
-10
lines changed

5 files changed

+104
-10
lines changed

app/code/Magento/Sales/Controller/AbstractController/Reorder.php

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
namespace Magento\Sales\Controller\AbstractController;
88

99
use Magento\Framework\App\Action;
10+
use Magento\Framework\App\ObjectManager;
11+
use Magento\Framework\Data\Form\FormKey\Validator;
1012
use Magento\Framework\Registry;
13+
use Magento\Framework\Exception\NotFoundException;
14+
use Magento\Framework\Controller\ResultFactory;
1115

1216
abstract class Reorder extends Action\Action
1317
{
@@ -21,18 +25,26 @@ abstract class Reorder extends Action\Action
2125
*/
2226
protected $_coreRegistry;
2327

28+
/**
29+
* @var Validator
30+
*/
31+
private $formKeyValidator;
32+
2433
/**
2534
* @param Action\Context $context
2635
* @param OrderLoaderInterface $orderLoader
2736
* @param Registry $registry
37+
* @param Validator|null $formKeyValidator
2838
*/
2939
public function __construct(
3040
Action\Context $context,
3141
OrderLoaderInterface $orderLoader,
32-
Registry $registry
42+
Registry $registry,
43+
Validator $formKeyValidator = null
3344
) {
3445
$this->orderLoader = $orderLoader;
3546
$this->_coreRegistry = $registry;
47+
$this->formKeyValidator = $formKeyValidator ?: ObjectManager::getInstance()->create(Validator::class);
3648
parent::__construct($context);
3749
}
3850

@@ -43,6 +55,20 @@ public function __construct(
4355
*/
4456
public function execute()
4557
{
58+
if ($this->getRequest()->isPost()) {
59+
if (!$this->formKeyValidator->validate($this->getRequest())) {
60+
$this->messageManager->addErrorMessage(__('Invalid Form Key. Please refresh the page.'));
61+
62+
/** @var \Magento\Framework\Controller\Result\Redirect $redirect */
63+
$redirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
64+
$redirect->setPath('*/*/history');
65+
66+
return $redirect;
67+
}
68+
} else {
69+
throw new NotFoundException(__('Page not found.'));
70+
}
71+
4672
$result = $this->orderLoader->load($this->_request);
4773
if ($result instanceof \Magento\Framework\Controller\ResultInterface) {
4874
return $result;
@@ -52,13 +78,13 @@ public function execute()
5278
$resultRedirect = $this->resultRedirectFactory->create();
5379

5480
/* @var $cart \Magento\Checkout\Model\Cart */
55-
$cart = $this->_objectManager->get('Magento\Checkout\Model\Cart');
81+
$cart = $this->_objectManager->get(\Magento\Checkout\Model\Cart::class);
5682
$items = $order->getItemsCollection();
5783
foreach ($items as $item) {
5884
try {
5985
$cart->addOrderItem($item);
6086
} catch (\Magento\Framework\Exception\LocalizedException $e) {
61-
if ($this->_objectManager->get('Magento\Checkout\Model\Session')->getUseNotice(true)) {
87+
if ($this->_objectManager->get(\Magento\Checkout\Model\Session::class)->getUseNotice(true)) {
6288
$this->messageManager->addNotice($e->getMessage());
6389
} else {
6490
$this->messageManager->addError($e->getMessage());

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

Lines changed: 33 additions & 2 deletions
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
*
@@ -27,6 +34,7 @@ class Exceptions extends ArraySerialized
2734
* @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
2835
* @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
2936
* @param array $data
37+
* @param SecureUnserializer|null $secureUnserializer
3038
*/
3139
public function __construct(
3240
\Magento\Framework\Model\Context $context,
@@ -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,
39-
array $data = []
47+
array $data = [],
48+
SecureUnserializer $secureUnserializer = null
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)