Skip to content

Commit f8f5379

Browse files
committed
Merge branch '7.4' into 8.0
* 7.4: deprecate passing an associative array to GroupSequence [Uid] Add `MockUuidFactory` for deterministic UUID generation in tests deprecate extending RememberMeDetails using legacy constructor signature [Notifier][LOX24] Add Lox24 webhook request parser support [WebProfilerBundle] Upgrade mermaid to v11.12.0 [MonologBridge] Deprecate `NotFoundActivationStrategy` Simplify ConsoleFormatterTest deprecate implicit constraint option names in YAML/XML mapping files [Security] Fix preload warning in `AuthorizationChecker` [Notifier] Add support for building SmsEvent by dlr_code and RemoteEvent for other LOX24 webhook event types allow protocols to be passed as a string Fix merge fix high deps tests
2 parents a827842 + 6764b99 commit f8f5379

File tree

2 files changed

+243
-0
lines changed

2 files changed

+243
-0
lines changed

CHANGELOG.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,31 @@ CHANGELOG
1515
7.4
1616
---
1717

18+
* Deprecate extending the `RememberMeDetails` class with a constructor expecting the user FQCN
19+
20+
Before:
21+
22+
```php
23+
class CustomRememberMeDetails extends RememberMeDetails
24+
{
25+
public function __construct(string $userFqcn, string $userIdentifier, int $expires, string $value)
26+
{
27+
parent::__construct($userFqcn, $userIdentifier, $expires, $value);
28+
}
29+
}
30+
```
31+
32+
After:
33+
34+
```php
35+
class CustomRememberMeDetails extends RememberMeDetails
36+
{
37+
public function __construct(string $userIdentifier, int $expires, string $value)
38+
{
39+
parent::__construct($userIdentifier, $expires, $value);
40+
}
41+
}
42+
```
1843
* Add support for union types with `#[CurrentUser]`
1944
* Deprecate callable firewall listeners, extend `AbstractListener` or implement `FirewallListenerInterface` instead
2045
* Deprecate `AbstractListener::__invoke`
Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Security\Http\Tests\RememberMe;
13+
14+
use PHPUnit\Framework\Attributes\Group;
15+
use PHPUnit\Framework\Attributes\IgnoreDeprecations;
16+
use PHPUnit\Framework\TestCase;
17+
use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentToken;
18+
use Symfony\Component\Security\Core\User\InMemoryUser;
19+
use Symfony\Component\Security\Http\RememberMe\RememberMeDetails;
20+
21+
class RememberMeDetailsTest extends TestCase
22+
{
23+
public function testFromRawCookie()
24+
{
25+
$rememberMeDetails = RememberMeDetails::fromRawCookie(self::getRememberMeCookieValue());
26+
27+
$this->assertSame(RememberMeDetails::class, $rememberMeDetails::class);
28+
$this->assertSame('wouter', $rememberMeDetails->getUserIdentifier());
29+
$this->assertSame(360, $rememberMeDetails->getExpires());
30+
$this->assertSame('series1:token_value', $rememberMeDetails->getValue());
31+
}
32+
33+
public function testFromRawCookieChildClassWithNewConstructorSignature()
34+
{
35+
$rememberMeDetails = RememberMeDetailsChild::fromRawCookie(self::getRememberMeCookieValue());
36+
37+
$this->assertSame(RememberMeDetailsChild::class, $rememberMeDetails::class);
38+
$this->assertSame('wouter', $rememberMeDetails->getUserIdentifier());
39+
$this->assertSame(360, $rememberMeDetails->getExpires());
40+
$this->assertSame('series1:token_value', $rememberMeDetails->getValue());
41+
}
42+
43+
#[Group('legacy')]
44+
#[IgnoreDeprecations]
45+
public function testFromRawCookieChildClassWithLegacyConstructorSignature()
46+
{
47+
$this->expectUserDeprecationMessage(\sprintf('Since symfony/security-http 7.4: Extending the "%s" class and overriding the constructor with four required arguments is deprecated. Change the constructor signature to __construct(string $userIdentifier, int $expires, string $value).', RememberMeDetails::class));
48+
49+
$rememberMeDetails = RememberMeDetailsChildLegacyConstructorSignature::fromRawCookie(self::getRememberMeCookieValue());
50+
51+
$this->assertSame(RememberMeDetailsChildLegacyConstructorSignature::class, $rememberMeDetails::class);
52+
$this->assertSame('wouter', $rememberMeDetails->getUserIdentifier());
53+
$this->assertSame(360, $rememberMeDetails->getExpires());
54+
$this->assertSame('series1:token_value', $rememberMeDetails->getValue());
55+
}
56+
57+
public function testFromRawCookieChildClassWithoutConstructor()
58+
{
59+
$rememberMeDetails = RememberMeDetailsChildWithoutConstructor::fromRawCookie(self::getRememberMeCookieValue());
60+
61+
$this->assertSame(RememberMeDetailsChildWithoutConstructor::class, $rememberMeDetails::class);
62+
$this->assertSame('wouter', $rememberMeDetails->getUserIdentifier());
63+
$this->assertSame(360, $rememberMeDetails->getExpires());
64+
$this->assertSame('series1:token_value', $rememberMeDetails->getValue());
65+
}
66+
67+
#[Group('legacy')]
68+
#[IgnoreDeprecations]
69+
public function testFromLegacyRawCookie()
70+
{
71+
$rememberMeDetails = RememberMeDetails::fromRawCookie(self::getLegacyRememberMeCookieValue());
72+
73+
$this->assertSame(RememberMeDetails::class, $rememberMeDetails::class);
74+
$this->assertSame(InMemoryUser::class, $rememberMeDetails->getUserFqcn());
75+
$this->assertSame('wouter', $rememberMeDetails->getUserIdentifier());
76+
$this->assertSame(360, $rememberMeDetails->getExpires());
77+
$this->assertSame('series1:token_value', $rememberMeDetails->getValue());
78+
}
79+
80+
#[Group('legacy')]
81+
#[IgnoreDeprecations]
82+
public function testFromLegacyRawCookieChildClassWithNewConstructorSignature()
83+
{
84+
$rememberMeDetails = RememberMeDetailsChild::fromRawCookie(self::getLegacyRememberMeCookieValue());
85+
86+
$this->assertSame(RememberMeDetailsChild::class, $rememberMeDetails::class);
87+
$this->assertSame('', $rememberMeDetails->getUserFqcn());
88+
$this->assertSame('wouter', $rememberMeDetails->getUserIdentifier());
89+
$this->assertSame(360, $rememberMeDetails->getExpires());
90+
$this->assertSame('series1:token_value', $rememberMeDetails->getValue());
91+
}
92+
93+
#[Group('legacy')]
94+
#[IgnoreDeprecations]
95+
public function testFromLegacyRawCookieChildClassWithLegacyConstructorSignature()
96+
{
97+
$this->expectUserDeprecationMessage(\sprintf('Since symfony/security-http 7.4: Extending the "%s" class and overriding the constructor with four required arguments is deprecated. Change the constructor signature to __construct(string $userIdentifier, int $expires, string $value).', RememberMeDetails::class));
98+
99+
$rememberMeDetails = RememberMeDetailsChildLegacyConstructorSignature::fromRawCookie(self::getLegacyRememberMeCookieValue());
100+
101+
$this->assertSame(RememberMeDetailsChildLegacyConstructorSignature::class, $rememberMeDetails::class);
102+
$this->assertSame(InMemoryUser::class, $rememberMeDetails->getUserFqcn());
103+
$this->assertSame('wouter', $rememberMeDetails->getUserIdentifier());
104+
$this->assertSame(360, $rememberMeDetails->getExpires());
105+
$this->assertSame('series1:token_value', $rememberMeDetails->getValue());
106+
}
107+
108+
#[Group('legacy')]
109+
#[IgnoreDeprecations]
110+
public function testFromLegacyRawCookieChildClassWithoutConstructor()
111+
{
112+
$rememberMeDetails = RememberMeDetailsChildWithoutConstructor::fromRawCookie(self::getLegacyRememberMeCookieValue());
113+
114+
$this->assertSame(RememberMeDetailsChildWithoutConstructor::class, $rememberMeDetails::class);
115+
$this->assertSame(InMemoryUser::class, $rememberMeDetails->getUserFqcn());
116+
$this->assertSame('wouter', $rememberMeDetails->getUserIdentifier());
117+
$this->assertSame(360, $rememberMeDetails->getExpires());
118+
$this->assertSame('series1:token_value', $rememberMeDetails->getValue());
119+
}
120+
121+
public function testFromPersistentToken()
122+
{
123+
if (method_exists(PersistentToken::class, 'getClass')) {
124+
$token = new PersistentToken(InMemoryUser::class, 'wouter', 'series1', 'token_value', new \DateTimeImmutable(), false);
125+
} else {
126+
$token = new PersistentToken('wouter', 'series1', 'token_value', new \DateTimeImmutable());
127+
}
128+
129+
$rememberMeDetails = RememberMeDetails::fromPersistentToken($token, 360);
130+
131+
$this->assertSame(RememberMeDetails::class, $rememberMeDetails::class);
132+
$this->assertSame('wouter', $rememberMeDetails->getUserIdentifier());
133+
$this->assertSame(360, $rememberMeDetails->getExpires());
134+
$this->assertSame('series1:token_value', $rememberMeDetails->getValue());
135+
}
136+
137+
public function testFromPersistentTokenChildClassWithNewConstructorSignature()
138+
{
139+
if (method_exists(PersistentToken::class, 'getClass')) {
140+
$token = new PersistentToken(InMemoryUser::class, 'wouter', 'series1', 'token_value', new \DateTimeImmutable(), false);
141+
} else {
142+
$token = new PersistentToken('wouter', 'series1', 'token_value', new \DateTimeImmutable());
143+
}
144+
145+
$rememberMeDetails = RememberMeDetailsChild::fromPersistentToken($token, 360);
146+
147+
$this->assertSame(RememberMeDetailsChild::class, $rememberMeDetails::class);
148+
$this->assertSame('wouter', $rememberMeDetails->getUserIdentifier());
149+
$this->assertSame(360, $rememberMeDetails->getExpires());
150+
$this->assertSame('series1:token_value', $rememberMeDetails->getValue());
151+
}
152+
153+
#[Group('legacy')]
154+
#[IgnoreDeprecations]
155+
public function testFromPersistentTokenChildClassWithLegacyConstructorSignature()
156+
{
157+
$this->expectUserDeprecationMessage(\sprintf('Since symfony/security-http 7.4: Extending the "%s" class and overriding the constructor with four required arguments is deprecated. Change the constructor signature to __construct(string $userIdentifier, int $expires, string $value).', RememberMeDetails::class));
158+
159+
if (method_exists(PersistentToken::class, 'getClass')) {
160+
$token = new PersistentToken(InMemoryUser::class, 'wouter', 'series1', 'token_value', new \DateTimeImmutable(), false);
161+
} else {
162+
$token = new PersistentToken('wouter', 'series1', 'token_value', new \DateTimeImmutable());
163+
}
164+
165+
$rememberMeDetails = RememberMeDetailsChildLegacyConstructorSignature::fromPersistentToken($token, 360);
166+
167+
$this->assertSame(RememberMeDetailsChildLegacyConstructorSignature::class, $rememberMeDetails::class);
168+
$this->assertSame('wouter', $rememberMeDetails->getUserIdentifier());
169+
$this->assertSame(360, $rememberMeDetails->getExpires());
170+
$this->assertSame('series1:token_value', $rememberMeDetails->getValue());
171+
}
172+
173+
public function testFromPersistentTokenChildClassWithoutConstructor()
174+
{
175+
if (method_exists(PersistentToken::class, 'getClass')) {
176+
$token = new PersistentToken(InMemoryUser::class, 'wouter', 'series1', 'token_value', new \DateTimeImmutable(), false);
177+
} else {
178+
$token = new PersistentToken('wouter', 'series1', 'token_value', new \DateTimeImmutable());
179+
}
180+
181+
$rememberMeDetails = RememberMeDetailsChildWithoutConstructor::fromPersistentToken($token, 360);
182+
183+
$this->assertSame(RememberMeDetailsChildWithoutConstructor::class, $rememberMeDetails::class);
184+
$this->assertSame('wouter', $rememberMeDetails->getUserIdentifier());
185+
$this->assertSame(360, $rememberMeDetails->getExpires());
186+
$this->assertSame('series1:token_value', $rememberMeDetails->getValue());
187+
}
188+
189+
private static function getRememberMeCookieValue(): string
190+
{
191+
return base64_encode((new RememberMeDetails('wouter', 360, 'series1:token_value'))->toString());
192+
}
193+
194+
private static function getLegacyRememberMeCookieValue(): string
195+
{
196+
return base64_encode((new RememberMeDetails(InMemoryUser::class, 'wouter', 360, 'series1:token_value', false))->toString());
197+
}
198+
}
199+
200+
class RememberMeDetailsChild extends RememberMeDetails
201+
{
202+
public function __construct(string $userIdentifier, int $expires, string $value)
203+
{
204+
parent::__construct($userIdentifier, $expires, $value);
205+
}
206+
}
207+
208+
class RememberMeDetailsChildLegacyConstructorSignature extends RememberMeDetails
209+
{
210+
public function __construct(string $userFqcn, string $userIdentifier, int $expires, string $value)
211+
{
212+
parent::__construct($userFqcn, $userIdentifier, $expires, $value);
213+
}
214+
}
215+
216+
class RememberMeDetailsChildWithoutConstructor extends RememberMeDetails
217+
{
218+
}

0 commit comments

Comments
 (0)