diff --git a/src/Symfony/Component/Security/Http/Authenticator/RememberMeAuthenticator.php b/src/Symfony/Component/Security/Http/Authenticator/RememberMeAuthenticator.php index f5aa016ad1..61ad2aa2ee 100644 --- a/src/Symfony/Component/Security/Http/Authenticator/RememberMeAuthenticator.php +++ b/src/Symfony/Component/Security/Http/Authenticator/RememberMeAuthenticator.php @@ -19,7 +19,6 @@ use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Http\Authenticator\Passport\PassportInterface; use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport; -use Symfony\Component\Security\Http\RememberMe\AbstractRememberMeServices; use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface; /** @@ -57,13 +56,12 @@ class RememberMeAuthenticator implements InteractiveAuthenticatorInterface return false; } - if (($cookie = $request->attributes->get(AbstractRememberMeServices::COOKIE_ATTR_NAME)) && null === $cookie->getValue()) { + $token = $this->rememberMeServices->autoLogin($request); + if (null === $token) { return false; } - if (isset($this->options['name']) && !$request->cookies->has($this->options['name'])) { - return false; - } + $request->attributes->set('_remember_me_token', $token); // the `null` return value indicates that this authenticator supports lazy firewalls return null; @@ -71,7 +69,10 @@ class RememberMeAuthenticator implements InteractiveAuthenticatorInterface public function authenticate(Request $request): PassportInterface { - $token = $this->rememberMeServices->autoLogin($request); + $token = $request->attributes->get('_remember_me_token'); + if (null === $token) { + throw new \LogicException('No remember me token is set.'); + } return new SelfValidatingPassport($token->getUser()); } diff --git a/src/Symfony/Component/Security/Http/Tests/Authenticator/RememberMeAuthenticatorTest.php b/src/Symfony/Component/Security/Http/Tests/Authenticator/RememberMeAuthenticatorTest.php index d95e681281..0ad757efe1 100644 --- a/src/Symfony/Component/Security/Http/Tests/Authenticator/RememberMeAuthenticatorTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Authenticator/RememberMeAuthenticatorTest.php @@ -12,14 +12,12 @@ namespace Symfony\Component\Security\Http\Tests\Authenticator; use PHPUnit\Framework\TestCase; -use Symfony\Component\HttpFoundation\Cookie; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\User\User; use Symfony\Component\Security\Http\Authenticator\RememberMeAuthenticator; -use Symfony\Component\Security\Http\RememberMe\AbstractRememberMeServices; use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface; class RememberMeAuthenticatorTest extends TestCase @@ -37,8 +35,6 @@ class RememberMeAuthenticatorTest extends TestCase 'name' => '_remember_me_cookie', ]); $this->request = new Request(); - $this->request->cookies->set('_remember_me_cookie', $val = $this->generateCookieValue()); - $this->request->attributes->set(AbstractRememberMeServices::COOKIE_ATTR_NAME, new Cookie('_remember_me_cookie', $val)); } public function testSupportsTokenStorageWithToken() @@ -48,39 +44,34 @@ class RememberMeAuthenticatorTest extends TestCase $this->assertFalse($this->authenticator->supports($this->request)); } - public function testSupportsRequestWithoutAttribute() + /** + * @dataProvider provideSupportsData + */ + public function testSupports($autoLoginResult, $support) { - $this->request->attributes->remove(AbstractRememberMeServices::COOKIE_ATTR_NAME); + $this->rememberMeServices->expects($this->once())->method('autoLogin')->with($this->request)->willReturn($autoLoginResult); - $this->assertNull($this->authenticator->supports($this->request)); + $this->assertSame($support, $this->authenticator->supports($this->request)); } - public function testSupportsRequestWithoutCookie() + public function provideSupportsData() { - $this->request->cookies->remove('_remember_me_cookie'); - - $this->assertFalse($this->authenticator->supports($this->request)); - } - - public function testSupports() - { - $this->assertNull($this->authenticator->supports($this->request)); + yield [null, false]; + yield [$this->createMock(TokenInterface::class), null]; } public function testAuthenticate() { - $this->rememberMeServices->expects($this->once()) - ->method('autoLogin') - ->with($this->request) - ->willReturn(new RememberMeToken($user = new User('wouter', 'test'), 'main', 'secret')); - + $this->request->attributes->set('_remember_me_token', new RememberMeToken($user = new User('wouter', 'test'), 'main', 'secret')); $passport = $this->authenticator->authenticate($this->request); $this->assertSame($user, $passport->getUser()); } - private function generateCookieValue() + public function testAuthenticateWithoutToken() { - return base64_encode(implode(AbstractRememberMeServices::COOKIE_DELIMITER, ['part1', 'part2'])); + $this->expectException(\LogicException::class); + + $this->authenticator->authenticate($this->request); } } diff --git a/src/Symfony/Component/Yaml/Inline.php b/src/Symfony/Component/Yaml/Inline.php index 867232d33a..00e6843e55 100644 --- a/src/Symfony/Component/Yaml/Inline.php +++ b/src/Symfony/Component/Yaml/Inline.php @@ -161,7 +161,7 @@ class Inline return 'false'; case ctype_digit($value): return \is_string($value) ? "'$value'" : (int) $value; - case is_numeric($value) && false === strpos($value, "\n"): + case is_numeric($value) && false === strpos($value, "\f") && false === strpos($value, "\n") && false === strpos($value, "\r") && false === strpos($value, "\t") && false === strpos($value, "\v"): $locale = setlocale(LC_NUMERIC, 0); if (false !== $locale) { setlocale(LC_NUMERIC, 'C'); diff --git a/src/Symfony/Component/Yaml/Tests/InlineTest.php b/src/Symfony/Component/Yaml/Tests/InlineTest.php index b5bdb2daf9..4db159708c 100644 --- a/src/Symfony/Component/Yaml/Tests/InlineTest.php +++ b/src/Symfony/Component/Yaml/Tests/InlineTest.php @@ -506,6 +506,14 @@ class InlineTest extends TestCase ['[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', ['foo', '@foo.baz', ['%foo%' => 'foo is %foo%', 'bar' => '%foo%'], true, '@service_container']], ['{ foo: { bar: { 1: 2, baz: 3 } } }', ['foo' => ['bar' => [1 => 2, 'baz' => 3]]]], + + // numeric strings with trailing whitespaces + ["'0123 '", '0123 '], + ['"0123\f"', "0123\f"], + ['"0123\n"', "0123\n"], + ['"0123\r"', "0123\r"], + ['"0123\t"', "0123\t"], + ['"0123\v"', "0123\v"], ]; }