Skip to content
This repository was archived by the owner on Apr 29, 2019. It is now read-only.

Commit 99a3c01

Browse files
MAGETWO-80194: [2.2.x] - Handle lifetime value 0 for form_key cookie #10528
1 parent 6a70864 commit 99a3c01

File tree

4 files changed

+62
-75
lines changed

4 files changed

+62
-75
lines changed

app/code/Magento/PageCache/Observer/RegisterFormKeyFromCookie.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,7 @@ private function updateCookieFormKey($formKey)
8484
->createPublicCookieMetadata();
8585
$cookieMetadata->setDomain($this->sessionConfig->getCookieDomain());
8686
$cookieMetadata->setPath($this->sessionConfig->getCookiePath());
87-
$lifetime = $this->sessionConfig->getCookieLifetime();
88-
if ($lifetime !== 0) {
89-
$cookieMetadata->setDuration($lifetime);
90-
}
87+
$cookieMetadata->setDuration($this->sessionConfig->getCookieLifetime());
9188

9289
$this->cookieFormKey->set(
9390
$formKey,

app/code/Magento/PageCache/Test/Unit/Observer/RegisterFormKeyFromCookieTest.php

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -166,74 +166,4 @@ public function testExecute()
166166

167167
$this->observer->execute($this->observerMock);
168168
}
169-
170-
public function testExecuteWithZeroLifetime()
171-
{
172-
$formKey = 'form_key';
173-
$escapedFormKey = 'escaped_form_key';
174-
$cookieDomain = 'example.com';
175-
$cookiePath = '/';
176-
$cookieLifetime = 0;
177-
178-
$cookieMetadata = $this->getMockBuilder(
179-
\Magento\Framework\Stdlib\Cookie\PublicCookieMetadata::class
180-
)
181-
->disableOriginalConstructor()
182-
->getMock();
183-
184-
$this->cookieFormKey->expects(static::any())
185-
->method('get')
186-
->willReturn($formKey);
187-
$this->cookieMetadataFactory->expects(static::once())
188-
->method('createPublicCookieMetadata')
189-
->willReturn(
190-
$cookieMetadata
191-
);
192-
193-
$this->sessionConfig->expects(static::once())
194-
->method('getCookieDomain')
195-
->willReturn(
196-
$cookieDomain
197-
);
198-
$cookieMetadata->expects(static::once())
199-
->method('setDomain')
200-
->with(
201-
$cookieDomain
202-
);
203-
$this->sessionConfig->expects(static::once())
204-
->method('getCookiePath')
205-
->willReturn(
206-
$cookiePath
207-
);
208-
$cookieMetadata->expects(static::once())
209-
->method('setPath')
210-
->with(
211-
$cookiePath
212-
);
213-
$this->sessionConfig->expects(static::once())
214-
->method('getCookieLifetime')
215-
->willReturn(
216-
$cookieLifetime
217-
);
218-
$cookieMetadata->expects(static::never())
219-
->method('setDuration');
220-
221-
$this->cookieFormKey->expects(static::once())
222-
->method('set')
223-
->with(
224-
$formKey,
225-
$cookieMetadata
226-
);
227-
228-
$this->escaper->expects(static::once())
229-
->method('escapeHtml')
230-
->with($formKey)
231-
->willReturn($escapedFormKey);
232-
233-
$this->sessionFormKey->expects(static::once())
234-
->method('set')
235-
->with($escapedFormKey);
236-
237-
$this->observer->execute($this->observerMock);
238-
}
239169
}

lib/internal/Magento/Framework/Stdlib/Cookie/PhpCookieManager.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,9 @@ private function computeExpirationTime(array $metadataArray)
237237
) {
238238
$expireTime = $metadataArray[PhpCookieManager::KEY_EXPIRE_TIME];
239239
} else {
240-
if (isset($metadataArray[CookieMetadata::KEY_DURATION])) {
240+
if (isset($metadataArray[CookieMetadata::KEY_DURATION])
241+
&& $metadataArray[CookieMetadata::KEY_DURATION] !== PhpCookieManager::EXPIRE_AT_END_OF_SESSION_TIME
242+
) {
241243
$expireTime = $metadataArray[CookieMetadata::KEY_DURATION] + time();
242244
} else {
243245
$expireTime = PhpCookieManager::EXPIRE_AT_END_OF_SESSION_TIME;

lib/internal/Magento/Framework/Stdlib/Test/Unit/Cookie/PhpCookieManagerTest.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class PhpCookieManagerTest extends \PHPUnit\Framework\TestCase
3636
const PUBLIC_COOKIE_NAME_DEFAULT_VALUES = 'public_cookie_name_default_values';
3737
const PUBLIC_COOKIE_NAME_SOME_FIELDS_SET = 'public_cookie_name_some_fields_set';
3838
const MAX_COOKIE_SIZE_TEST_NAME = 'max_cookie_size_test_name';
39+
const PUBLIC_COOKIE_ZERO_DURATION = 'public_cookie_zero_duration';
3940
const MAX_NUM_COOKIE_TEST_NAME = 'max_num_cookie_test_name';
4041
const DELETE_COOKIE_NAME = 'delete_cookie_name';
4142
const DELETE_COOKIE_NAME_NO_METADATA = 'delete_cookie_name_no_metadata';
@@ -66,6 +67,7 @@ class PhpCookieManagerTest extends \PHPUnit\Framework\TestCase
6667
self::PUBLIC_COOKIE_NAME_DEFAULT_VALUES => 'self::assertPublicCookieWithDefaultValues',
6768
self::PUBLIC_COOKIE_NAME_SOME_FIELDS_SET => 'self::assertPublicCookieWithSomeFieldSet',
6869
self::MAX_COOKIE_SIZE_TEST_NAME => 'self::assertCookieSize',
70+
self::PUBLIC_COOKIE_ZERO_DURATION => 'self::assertZeroDuration',
6971
];
7072

7173
/**
@@ -405,6 +407,38 @@ public function testSetPublicCookieDefaultValues()
405407
$this->assertTrue(self::$isSetCookieInvoked);
406408
}
407409

410+
public function testSetPublicCookieZeroDuration()
411+
{
412+
/** @var PublicCookieMetadata $publicCookieMetadata */
413+
$publicCookieMetadata = $this->objectManager->getObject(
414+
\Magento\Framework\Stdlib\Cookie\PublicCookieMetadata::class,
415+
[
416+
'metadata' => [
417+
'domain' => null,
418+
'path' => null,
419+
'secure' => false,
420+
'http_only' => false,
421+
'duration' => 0,
422+
],
423+
]
424+
);
425+
426+
$this->scopeMock->expects($this->once())
427+
->method('getPublicCookieMetadata')
428+
->with($publicCookieMetadata)
429+
->will(
430+
$this->returnValue($publicCookieMetadata)
431+
);
432+
433+
$this->cookieManager->setPublicCookie(
434+
self::PUBLIC_COOKIE_ZERO_DURATION,
435+
'cookie_value',
436+
$publicCookieMetadata
437+
);
438+
439+
$this->assertTrue(self::$isSetCookieInvoked);
440+
}
441+
408442
public function testSetPublicCookieSomeFieldsSet()
409443
{
410444
self::$isSetCookieInvoked = false;
@@ -839,6 +873,30 @@ private static function assertCookieSize(
839873
self::assertEquals('', $path);
840874
}
841875

876+
/**
877+
* Assert cookie set with zero duration
878+
*
879+
* Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
880+
* @SuppressWarnings(PHPMD.UnusedPrivateMethod)
881+
*/
882+
private static function assertZeroDuration(
883+
$name,
884+
$value,
885+
$expiry,
886+
$path,
887+
$domain,
888+
$secure,
889+
$httpOnly
890+
) {
891+
self::assertEquals(self::PUBLIC_COOKIE_ZERO_DURATION, $name);
892+
self::assertEquals(self::COOKIE_VALUE, $value);
893+
self::assertEquals(self::COOKIE_EXPIRE_END_OF_SESSION, $expiry);
894+
self::assertFalse($secure);
895+
self::assertFalse($httpOnly);
896+
self::assertEquals('', $domain);
897+
self::assertEquals('', $path);
898+
}
899+
842900
protected function stubGetCookie($get, $default, $return)
843901
{
844902
$this->readerMock->expects($this->atLeastOnce())

0 commit comments

Comments
 (0)