Skip to content

Commit 8d97784

Browse files
committed
keep an empty class segment in remember me cookie to ease upgrades
1 parent 1684c09 commit 8d97784

File tree

3 files changed

+16
-20
lines changed

3 files changed

+16
-20
lines changed

src/Symfony/Component/Security/Http/RememberMe/RememberMeDetails.php

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -78,30 +78,22 @@ public static function fromRawCookie(string $rawCookie): self
7878
if (!str_contains($rawCookie, self::COOKIE_DELIMITER)) {
7979
$rawCookie = base64_decode($rawCookie);
8080
}
81-
$cookieParts = explode(self::COOKIE_DELIMITER, $rawCookie, 3);
8281

83-
if (isset($cookieParts[1]) && !preg_match('/^\d+$/', $cookieParts[1])) {
84-
// legacy (Symfony < 8.0) cookie format
85-
$cookieParts = explode(self::COOKIE_DELIMITER, $rawCookie, 4);
82+
$cookieParts = explode(self::COOKIE_DELIMITER, $rawCookie, 4);
8683

87-
if (4 !== \count($cookieParts)) {
88-
throw new AuthenticationException('The cookie contains invalid data.');
89-
}
84+
if (4 !== \count($cookieParts)) {
85+
throw new AuthenticationException('The cookie contains invalid data.');
86+
}
9087

91-
if (false === $cookieParts[1] = base64_decode(strtr($cookieParts[1], '-_~', '+/='), true)) {
92-
throw new AuthenticationException('The user identifier contains a character from outside the base64 alphabet.');
93-
}
88+
if (false === $cookieParts[1] = base64_decode(strtr($cookieParts[1], '-_~', '+/='), true)) {
89+
throw new AuthenticationException('The user identifier contains a character from outside the base64 alphabet.');
90+
}
9491

92+
if ('' === $cookieParts[0]) {
93+
unset($cookieParts[0]);
94+
} else {
9595
$cookieParts[0] = strtr($cookieParts[0], '.', '\\');
9696
$cookieParts[4] = false;
97-
} else {
98-
if (3 !== \count($cookieParts)) {
99-
throw new AuthenticationException('The cookie contains invalid data.');
100-
}
101-
102-
if (false === $cookieParts[0] = base64_decode(strtr($cookieParts[0], '-_~', '+/='), true)) {
103-
throw new AuthenticationException('The user identifier contains a character from outside the base64 alphabet.');
104-
}
10597
}
10698

10799
return new static(...$cookieParts);

src/Symfony/Component/Security/Http/Tests/Authenticator/RememberMeAuthenticatorTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ public static function provideSupportsData()
6969
public function testAuthenticate()
7070
{
7171
$rememberMeDetails = new RememberMeDetails('wouter', 1, 'secret');
72-
$request = Request::create('/', 'GET', [], ['_remember_me_cookie' => implode(RememberMeDetails::COOKIE_DELIMITER, \array_slice(explode(RememberMeDetails::COOKIE_DELIMITER, $rememberMeDetails->toString()), 1))]);
72+
$cookieData = explode(RememberMeDetails::COOKIE_DELIMITER, $rememberMeDetails->toString());
73+
$cookieData[0] = '';
74+
$request = Request::create('/', 'GET', [], ['_remember_me_cookie' => implode(RememberMeDetails::COOKIE_DELIMITER, $cookieData)]);
7375
$passport = $this->authenticator->authenticate($request);
7476

7577
$this->rememberMeHandler->expects($this->once())->method('consumeRememberMeCookie')->with($this->callback(fn ($arg) => $rememberMeDetails == $arg));

src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentRememberMeHandlerTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,9 @@ public function testBase64EncodedTokens()
251251
$this->tokenProvider->expects($this->once())->method('updateToken')->with('series1');
252252

253253
$rememberMeDetails = new RememberMeDetails(InMemoryUser::class, 'wouter', 360, 'series1:tokenvalue', false);
254-
$rememberMeDetails = RememberMeDetails::fromRawCookie(base64_encode(implode(RememberMeDetails::COOKIE_DELIMITER, \array_slice(explode(RememberMeDetails::COOKIE_DELIMITER, $rememberMeDetails->toString()), 1))));
254+
$cookieData = explode(RememberMeDetails::COOKIE_DELIMITER, $rememberMeDetails->toString());
255+
$cookieData[0] = '';
256+
$rememberMeDetails = RememberMeDetails::fromRawCookie(base64_encode(implode(RememberMeDetails::COOKIE_DELIMITER, $cookieData)));
255257
$this->handler->consumeRememberMeCookie($rememberMeDetails);
256258
}
257259

0 commit comments

Comments
 (0)