Skip to content

Commit fd23e7c

Browse files
author
Volodymyr Kublytskyi
authored
MAGETWO-83287: #11825: Generate new FormKey and replace for oldRequestParams Wishlist #12038
2 parents f54c811 + 39bcf64 commit fd23e7c

File tree

3 files changed

+161
-0
lines changed

3 files changed

+161
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Customer\Model\Plugin;
8+
9+
use Magento\Customer\Model\Session;
10+
use Magento\Framework\Data\Form\FormKey as DataFormKey;
11+
use Magento\PageCache\Observer\FlushFormKey;
12+
13+
class CustomerFlushFormKey
14+
{
15+
/**
16+
* @var Session
17+
*/
18+
private $session;
19+
20+
/**
21+
* @var DataFormKey
22+
*/
23+
private $dataFormKey;
24+
25+
/**
26+
* Initialize dependencies.
27+
*
28+
* @param Session $session
29+
* @param DataFormKey $dataFormKey
30+
*/
31+
public function __construct(Session $session, DataFormKey $dataFormKey)
32+
{
33+
$this->session = $session;
34+
$this->dataFormKey = $dataFormKey;
35+
}
36+
37+
/**
38+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
39+
* @param FlushFormKey $subject
40+
* @param callable $proceed
41+
* @param $args
42+
*/
43+
public function aroundExecute(FlushFormKey $subject, callable $proceed, ...$args)
44+
{
45+
$currentFormKey = $this->dataFormKey->getFormKey();
46+
$proceed(...$args);
47+
$beforeParams = $this->session->getBeforeRequestParams();
48+
if ($beforeParams['form_key'] == $currentFormKey) {
49+
$beforeParams['form_key'] = $this->dataFormKey->getFormKey();
50+
$this->session->setBeforeRequestParams($beforeParams);
51+
}
52+
}
53+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Customer\Test\Unit\Model\Plugin;
7+
8+
use Magento\Customer\Model\Plugin\CustomerFlushFormKey;
9+
use Magento\Customer\Model\Session;
10+
use Magento\Framework\App\PageCache\FormKey as CookieFormKey;
11+
use Magento\Framework\Data\Form\FormKey as DataFormKey;
12+
use Magento\Framework\Event\Observer;
13+
use Magento\PageCache\Observer\FlushFormKey;
14+
use PHPUnit\Framework\TestCase;
15+
use PHPUnit_Framework_MockObject_MockObject as MockObject;
16+
17+
class CustomerFlushFormKeyTest extends TestCase
18+
{
19+
/**
20+
* @var CookieFormKey | MockObject
21+
*/
22+
private $cookieFormKey;
23+
24+
/**
25+
* @var Session | MockObject
26+
*/
27+
private $customerSession;
28+
29+
/**
30+
* @var DataFormKey | MockObject
31+
*/
32+
private $dataFormKey;
33+
34+
protected function setUp()
35+
{
36+
37+
/** @var CookieFormKey | MockObject */
38+
$this->cookieFormKey = $this->getMockBuilder(CookieFormKey::class)
39+
->disableOriginalConstructor()
40+
->getMock();
41+
42+
/** @var DataFormKey | MockObject */
43+
$this->dataFormKey = $this->getMockBuilder(DataFormKey::class)
44+
->disableOriginalConstructor()
45+
->getMock();
46+
47+
/** @var Session | MockObject */
48+
$this->customerSession = $this->getMockBuilder(Session::class)
49+
->disableOriginalConstructor()
50+
->setMethods(['getBeforeRequestParams', 'setBeforeRequestParams'])
51+
->getMock();
52+
}
53+
54+
/**
55+
* @dataProvider aroundFlushFormKeyProvider
56+
* @param $beforeFormKey
57+
* @param $currentFormKey
58+
* @param $getFormKeyTimes
59+
* @param $setBeforeParamsTimes
60+
*/
61+
public function testAroundFlushFormKey(
62+
$beforeFormKey,
63+
$currentFormKey,
64+
$getFormKeyTimes,
65+
$setBeforeParamsTimes
66+
) {
67+
$observerDto = new Observer();
68+
$observer = new FlushFormKey($this->cookieFormKey, $this->dataFormKey);
69+
$plugin = new CustomerFlushFormKey($this->customerSession, $this->dataFormKey);
70+
71+
$beforeParams['form_key'] = $beforeFormKey;
72+
73+
$this->dataFormKey->expects($this->exactly($getFormKeyTimes))
74+
->method('getFormKey')
75+
->willReturn($currentFormKey);
76+
77+
$this->customerSession->expects($this->once())
78+
->method('getBeforeRequestParams')
79+
->willReturn($beforeParams);
80+
81+
$this->customerSession->expects($this->exactly($setBeforeParamsTimes))
82+
->method('setBeforeRequestParams')
83+
->with($beforeParams);
84+
85+
$proceed = function ($observerDto) use ($observer) {
86+
return $observer->execute($observerDto);
87+
};
88+
89+
$plugin->aroundExecute($observer, $proceed, $observerDto);
90+
}
91+
92+
/**
93+
* Data provider for testAroundFlushFormKey
94+
*
95+
* @return array
96+
*/
97+
public function aroundFlushFormKeyProvider()
98+
{
99+
return [
100+
['form_key_value', 'form_key_value', 2, 1],
101+
['form_old_key_value', 'form_key_value', 1, 0],
102+
[null, 'form_key_value', 1, 0]
103+
];
104+
}
105+
}

app/code/Magento/Customer/etc/di.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,9 @@
323323
<type name="Magento\Framework\App\Action\AbstractAction">
324324
<plugin name="customerNotification" type="Magento\Customer\Model\Plugin\CustomerNotification"/>
325325
</type>
326+
<type name="Magento\PageCache\Observer\FlushFormKey">
327+
<plugin name="customerFlushFormKey" type="Magento\Customer\Model\Plugin\CustomerFlushFormKey"/>
328+
</type>
326329
<type name="Magento\Customer\Model\Customer\NotificationStorage">
327330
<arguments>
328331
<argument name="cache" xsi:type="object">Magento\Customer\Model\Cache\Type\Notification</argument>

0 commit comments

Comments
 (0)