Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion lib/private/AppFramework/App.php
Original file line number Diff line number Diff line change
Expand Up @@ -151,14 +151,17 @@ public static function main(string $controllerName, string $methodName, DIContai
if ($value['expireDate'] instanceof \DateTime) {
$expireDate = $value['expireDate']->getTimestamp();
}
$sameSite = $value['sameSite'] ?? 'Lax';

$io->setCookie(
$name,
$value['value'],
$expireDate,
$container->getServer()->getWebRoot(),
null,
$container->getServer()->getRequest()->getServerProtocol() === 'https',
true
true,
$sameSite
);
}

Expand Down
16 changes: 14 additions & 2 deletions lib/private/AppFramework/Http/Output.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,20 @@ public function getHttpResponseCode() {
* @param bool $secure
* @param bool $httpOnly
*/
public function setCookie($name, $value, $expire, $path, $domain, $secure, $httpOnly) {
public function setCookie($name, $value, $expire, $path, $domain, $secure, $httpOnly, $sameSite = 'Lax') {
$path = $this->webRoot ? : '/';
setcookie($name, $value, $expire, $path, $domain, $secure, $httpOnly);

if (PHP_VERSION_ID < 70300) {
setcookie($name, $value, $expire, $path, $domain, $secure, $httpOnly);
} else {
setcookie($name, $value, [
'expires' => $expire,
'path' => $path,
'domain' => $domain,
'secure' => $secure,
'httponly' => $httpOnly,
'samesite' => $sameSite
]);
}
}
}
3 changes: 2 additions & 1 deletion lib/public/AppFramework/Http/IOutput.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ public function setHttpResponseCode($code);
* @param string $domain
* @param bool $secure
* @param bool $httpOnly
* @param string $sameSite (added in 20)
* @since 8.1.0
*/
public function setCookie($name, $value, $expire, $path, $domain, $secure, $httpOnly);
public function setCookie($name, $value, $expire, $path, $domain, $secure, $httpOnly, $sameSite = 'Lax');
}
5 changes: 3 additions & 2 deletions lib/public/AppFramework/Http/Response.php
Original file line number Diff line number Diff line change
Expand Up @@ -133,11 +133,12 @@ public function cacheFor(int $cacheSeconds, bool $public = false) {
* @param \DateTime|null $expireDate Date on that the cookie should expire, if set
* to null cookie will be considered as session
* cookie.
* @param string $sameSite The samesite value of the cookie. Defaults to Lax. Other possibilities are Strict or None
* @return $this
* @since 8.0.0
*/
public function addCookie($name, $value, \DateTime $expireDate = null) {
$this->cookies[$name] = ['value' => $value, 'expireDate' => $expireDate];
public function addCookie($name, $value, \DateTime $expireDate = null, $sameSite = 'Lax') {
$this->cookies[$name] = ['value' => $value, 'expireDate' => $expireDate, 'sameSite' => $sameSite];
return $this;
}

Expand Down
19 changes: 13 additions & 6 deletions tests/lib/AppFramework/Http/ResponseTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,12 @@ public function testAddCookie() {
'foo' => [
'value' => 'bar',
'expireDate' => null,
'sameSite' => 'Lax',
],
'bar' => [
'value' => 'foo',
'expireDate' => new \DateTime('1970-01-01')
'expireDate' => new \DateTime('1970-01-01'),
'sameSite' => 'Lax',
]
];
$this->assertEquals($expectedResponse, $this->childResponse->getCookies());
Expand Down Expand Up @@ -143,7 +145,8 @@ public function testInvalidateCookie() {
$expected = [
'foo' => [
'value' => 'expired',
'expireDate' => new \DateTime('1971-01-01')
'expireDate' => new \DateTime('1971-01-01'),
'sameSite' => 'Lax',
]
];

Expand All @@ -159,11 +162,13 @@ public function testInvalidateCookies() {
$expected = [
'foo' => [
'value' => 'bar',
'expireDate' => null
'expireDate' => null,
'sameSite' => 'Lax',
],
'bar' => [
'value' => 'foo',
'expireDate' => null
'expireDate' => null,
'sameSite' => 'Lax',
]
];
$cookies = $this->childResponse->getCookies();
Expand All @@ -173,11 +178,13 @@ public function testInvalidateCookies() {
$expected = [
'foo' => [
'value' => 'expired',
'expireDate' => new \DateTime('1971-01-01')
'expireDate' => new \DateTime('1971-01-01'),
'sameSite' => 'Lax',
],
'bar' => [
'value' => 'expired',
'expireDate' => new \DateTime('1971-01-01')
'expireDate' => new \DateTime('1971-01-01'),
'sameSite' => 'Lax',
]
];

Expand Down