Skip to content

Commit dede5aa

Browse files
MAGETWO-83288: [Backport 2.1] #11825: Generate new FormKey and replace for oldRequestParams Wishlist #12041
2 parents bfd3bf6 + c6326ec commit dede5aa

File tree

3 files changed

+164
-0
lines changed

3 files changed

+164
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Customer\Model\Plugin;
7+
8+
use Magento\Customer\Model\Session;
9+
use Magento\Framework\Data\Form\FormKey as DataFormKey;
10+
use \Magento\Framework\Event\Observer;
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+
* @param FlushFormKey $subject
39+
* @param callable $proceed
40+
* @param Observer $observer
41+
* @return void
42+
*
43+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
44+
*/
45+
public function aroundExecute(FlushFormKey $subject, callable $proceed, Observer $observer)
46+
{
47+
$currentFormKey = $this->dataFormKey->getFormKey();
48+
$proceed($observer);
49+
$beforeParams = $this->session->getBeforeRequestParams();
50+
if ($beforeParams['form_key'] == $currentFormKey) {
51+
$beforeParams['form_key'] = $this->dataFormKey->getFormKey();
52+
$this->session->setBeforeRequestParams($beforeParams);
53+
}
54+
}
55+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 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 as 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+
/**
56+
* @dataProvider aroundFlushFormKeyProvider
57+
* @param $beforeFormKey
58+
* @param $currentFormKey
59+
* @param $getFormKeyTimes
60+
* @param $setBeforeParamsTimes
61+
*/
62+
public function testAroundFlushFormKey(
63+
$beforeFormKey,
64+
$currentFormKey,
65+
$getFormKeyTimes,
66+
$setBeforeParamsTimes
67+
) {
68+
$observerDto = new Observer();
69+
$observer = new FlushFormKey($this->cookieFormKey, $this->dataFormKey);
70+
$plugin = new CustomerFlushFormKey($this->customerSession, $this->dataFormKey);
71+
72+
$beforeParams['form_key'] = $beforeFormKey;
73+
74+
$this->dataFormKey->expects($this->exactly($getFormKeyTimes))
75+
->method('getFormKey')
76+
->willReturn($currentFormKey);
77+
78+
$this->customerSession->expects($this->once())
79+
->method('getBeforeRequestParams')
80+
->willReturn($beforeParams);
81+
82+
$this->customerSession->expects($this->exactly($setBeforeParamsTimes))
83+
->method('setBeforeRequestParams')
84+
->with($beforeParams);
85+
86+
$proceed = function ($observerDto) use ($observer) {
87+
return $observer->execute($observerDto);
88+
};
89+
90+
$plugin->aroundExecute($observer, $proceed, $observerDto);
91+
}
92+
93+
/**
94+
* Data provider for testAroundFlushFormKey
95+
*
96+
* @return array
97+
*/
98+
public function aroundFlushFormKeyProvider()
99+
{
100+
return [
101+
'valid form key' => ['form_key_value', 'form_key_value', 2, 1],
102+
'corrupted form key' => ['form_old_key_value', 'form_key_value', 1, 0],
103+
'missed form key' => [null, 'form_key_value', 1, 0]
104+
];
105+
}
106+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,9 @@
313313
<type name="Magento\Framework\App\Action\AbstractAction">
314314
<plugin name="customerNotification" type="Magento\Customer\Model\Plugin\CustomerNotification"/>
315315
</type>
316+
<type name="Magento\PageCache\Observer\FlushFormKey">
317+
<plugin name="customerFlushFormKey" type="Magento\Customer\Model\Plugin\CustomerFlushFormKey"/>
318+
</type>
316319
<type name="Magento\Customer\Model\Customer\NotificationStorage">
317320
<arguments>
318321
<argument name="cache" xsi:type="object">Magento\Customer\Model\Cache\Type\Notification</argument>

0 commit comments

Comments
 (0)