mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2024-11-15 03:18:26 +00:00
Fix cookie expiry time calculation on 32bit systems.
strtotime() misbehaves on 32bit systems when the resulting timestamp would overflow an integer. Use a DateTime to workaround this issue. Fixes #3868
This commit is contained in:
parent
027cfe9496
commit
3aa189eb3a
2 changed files with 29 additions and 4 deletions
|
@ -387,20 +387,20 @@ class CookieComponent extends Component {
|
||||||
* @return integer Unix timestamp
|
* @return integer Unix timestamp
|
||||||
*/
|
*/
|
||||||
protected function _expire($expires = null) {
|
protected function _expire($expires = null) {
|
||||||
$now = time();
|
|
||||||
if (is_null($expires)) {
|
if (is_null($expires)) {
|
||||||
return $this->_expires;
|
return $this->_expires;
|
||||||
}
|
}
|
||||||
$this->_reset = $this->_expires;
|
$this->_reset = $this->_expires;
|
||||||
|
|
||||||
if (!$expires) {
|
if (!$expires) {
|
||||||
return $this->_expires = 0;
|
return $this->_expires = 0;
|
||||||
}
|
}
|
||||||
|
$now = new DateTime();
|
||||||
|
|
||||||
if (is_int($expires) || is_numeric($expires)) {
|
if (is_int($expires) || is_numeric($expires)) {
|
||||||
return $this->_expires = $now + intval($expires);
|
return $this->_expires = $now->format('U') + intval($expires);
|
||||||
}
|
}
|
||||||
return $this->_expires = strtotime($expires, $now);
|
$now->modify($expires);
|
||||||
|
return $this->_expires = $now->format('U');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -201,6 +201,31 @@ class CookieComponentTest extends CakeTestCase {
|
||||||
$this->assertEquals('value', $result);
|
$this->assertEquals('value', $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test write with distant future cookies
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testWriteFarFuture() {
|
||||||
|
$this->Cookie->write('Testing', 'value', false, '+90 years');
|
||||||
|
$future = new DateTime('now');
|
||||||
|
$future->modify('+90 years');
|
||||||
|
|
||||||
|
$expected = array(
|
||||||
|
'name' => $this->Cookie->name . '[Testing]',
|
||||||
|
'value' => 'value',
|
||||||
|
'path' => '/',
|
||||||
|
'domain' => '',
|
||||||
|
'secure' => false,
|
||||||
|
'httpOnly' => false);
|
||||||
|
$result = $this->Controller->response->cookie($this->Cookie->name . '[Testing]');
|
||||||
|
|
||||||
|
$this->assertEquals($future->format('U'), $result['expire'], '', 3);
|
||||||
|
unset($result['expire']);
|
||||||
|
|
||||||
|
$this->assertEquals($expected, $result);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* test write with httpOnly cookies
|
* test write with httpOnly cookies
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue