Skip to content

Commit 5c781fc

Browse files
committed
Merge branch '6.4' into 7.0
* 6.4: [Messenger] Fix using negative delay [Validator] Add missing italian translation [Validator] Fix using known option names as field names [SecurityBundle] Prevent to login/logout without a request context Suppress warnings from is_executable
2 parents 466107f + 97d4fb6 commit 5c781fc

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

Security.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ public function getFirewallConfig(Request $request): ?FirewallConfig
8484
public function login(UserInterface $user, string $authenticatorName = null, string $firewallName = null, array $badges = []): ?Response
8585
{
8686
$request = $this->container->get('request_stack')->getCurrentRequest();
87+
if (null === $request) {
88+
throw new LogicException('Unable to login without a request context.');
89+
}
90+
8791
$firewallName ??= $this->getFirewallConfig($request)?->getName();
8892

8993
if (!$firewallName) {
@@ -108,15 +112,18 @@ public function login(UserInterface $user, string $authenticatorName = null, str
108112
*/
109113
public function logout(bool $validateCsrfToken = true): ?Response
110114
{
115+
$request = $this->container->get('request_stack')->getMainRequest();
116+
if (null === $request) {
117+
throw new LogicException('Unable to logout without a request context.');
118+
}
119+
111120
/** @var TokenStorageInterface $tokenStorage */
112121
$tokenStorage = $this->container->get('security.token_storage');
113122

114123
if (!($token = $tokenStorage->getToken()) || !$token->getUser()) {
115124
throw new LogicException('Unable to logout as there is no logged-in user.');
116125
}
117126

118-
$request = $this->container->get('request_stack')->getMainRequest();
119-
120127
if (!$firewallConfig = $this->container->get('security.firewall.map')->getFirewallConfig($request)) {
121128
throw new LogicException('Unable to logout as the request is not behind a firewall.');
122129
}

Tests/SecurityTest.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,28 @@ public function testLoginWithoutAuthenticatorThrows()
252252
$security->login($user);
253253
}
254254

255+
public function testLoginWithoutRequestContext()
256+
{
257+
$requestStack = new RequestStack();
258+
$user = $this->createMock(UserInterface::class);
259+
260+
$container = $this->createMock(ContainerInterface::class);
261+
$container
262+
->expects($this->atLeastOnce())
263+
->method('get')
264+
->willReturnMap([
265+
['request_stack', $requestStack],
266+
])
267+
;
268+
269+
$security = new Security($container, ['main' => null]);
270+
271+
$this->expectException(\LogicException::class);
272+
$this->expectExceptionMessage('Unable to login without a request context.');
273+
274+
$security->login($user);
275+
}
276+
255277
public function testLogout()
256278
{
257279
$request = new Request();
@@ -458,6 +480,27 @@ public function testLogoutWithValidCsrf()
458480
$this->assertEquals('a custom response', $response->getContent());
459481
}
460482

483+
public function testLogoutWithoutRequestContext()
484+
{
485+
$requestStack = new RequestStack();
486+
487+
$container = $this->createMock(ContainerInterface::class);
488+
$container
489+
->expects($this->atLeastOnce())
490+
->method('get')
491+
->willReturnMap([
492+
['request_stack', $requestStack],
493+
])
494+
;
495+
496+
$security = new Security($container, ['main' => null]);
497+
498+
$this->expectException(\LogicException::class);
499+
$this->expectExceptionMessage('Unable to logout without a request context.');
500+
501+
$security->logout();
502+
}
503+
461504
private function createContainer(string $serviceId, object $serviceObject): ContainerInterface
462505
{
463506
return new ServiceLocator([$serviceId => fn () => $serviceObject]);

0 commit comments

Comments
 (0)