Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d71c404

Browse files
committed
bug #38869 [SecurityBundle] inject only compatible token storage implementations for usage tracking (xabbuh)
This PR was merged into the 4.4 branch. Discussion ---------- [SecurityBundle] inject only compatible token storage implementations for usage tracking | Q | A | ------------- | --- | Branch? | 4.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | Fix #36720 | License | MIT | Doc PR | Commits ------- d915e44 inject only compatible token storage implementations for usage tracking
2 parents 8ef1826 + d915e44 commit d71c404

File tree

2 files changed

+95
-2
lines changed

2 files changed

+95
-2
lines changed

src/Symfony/Bundle/SecurityBundle/DependencyInjection/Compiler/RegisterTokenUsageTrackingPass.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,12 @@ public function process(ContainerBuilder $container)
4545
$container->setAlias('security.token_storage', 'security.untracked_token_storage')->setPublic(true);
4646
$container->getDefinition('security.untracked_token_storage')->addTag('kernel.reset', ['method' => 'reset']);
4747
} elseif ($container->hasDefinition('security.context_listener')) {
48-
$container->getDefinition('security.context_listener')
49-
->setArgument(6, [new Reference('security.token_storage'), 'enableUsageTracking']);
48+
$tokenStorageClass = $container->getParameterBag()->resolveValue($container->findDefinition('security.token_storage')->getClass());
49+
50+
if (method_exists($tokenStorageClass, 'enableUsageTracking')) {
51+
$container->getDefinition('security.context_listener')
52+
->setArgument(6, [new Reference('security.token_storage'), 'enableUsageTracking']);
53+
}
5054
}
5155
}
5256
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
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\Bundle\SecurityBundle\Tests\DependencyInjection\Compiler;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Bundle\SecurityBundle\DependencyInjection\Compiler\RegisterTokenUsageTrackingPass;
16+
use Symfony\Component\DependencyInjection\Alias;
17+
use Symfony\Component\DependencyInjection\ContainerBuilder;
18+
use Symfony\Component\DependencyInjection\ContainerInterface;
19+
use Symfony\Component\DependencyInjection\Reference;
20+
use Symfony\Component\HttpFoundation\Session\Session;
21+
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
22+
use Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage;
23+
use Symfony\Component\Security\Http\Firewall\ContextListener;
24+
25+
class RegisterTokenUsageTrackingPassTest extends TestCase
26+
{
27+
public function testTokenStorageIsUntrackedIfSessionIsMissing()
28+
{
29+
$container = new ContainerBuilder();
30+
$container->register('security.untracked_token_storage', TokenStorage::class);
31+
32+
$compilerPass = new RegisterTokenUsageTrackingPass();
33+
$compilerPass->process($container);
34+
35+
$this->assertTrue($container->hasAlias('security.token_storage'));
36+
$this->assertEquals(new Alias('security.untracked_token_storage', true), $container->getAlias('security.token_storage'));
37+
}
38+
39+
public function testContextListenerIsNotModifiedIfTokenStorageDoesNotSupportUsageTracking()
40+
{
41+
$container = new ContainerBuilder();
42+
43+
$container->setParameter('security.token_storage.class', TokenStorage::class);
44+
$container->register('session', Session::class);
45+
$container->register('security.context_listener', ContextListener::class)
46+
->setArguments([
47+
new Reference('security.untracked_token_storage'),
48+
[],
49+
'main',
50+
new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE),
51+
new Reference('event_dispatcher', ContainerInterface::NULL_ON_INVALID_REFERENCE),
52+
new Reference('security.authentication.trust_resolver'),
53+
]);
54+
$container->register('security.token_storage', '%security.token_storage.class%');
55+
$container->register('security.untracked_token_storage', TokenStorage::class);
56+
57+
$compilerPass = new RegisterTokenUsageTrackingPass();
58+
$compilerPass->process($container);
59+
60+
$this->assertCount(6, $container->getDefinition('security.context_listener')->getArguments());
61+
}
62+
63+
public function testContextListenerEnablesUsageTrackingIfSupportedByTokenStorage()
64+
{
65+
$container = new ContainerBuilder();
66+
67+
$container->setParameter('security.token_storage.class', UsageTrackingTokenStorage::class);
68+
$container->register('session', Session::class);
69+
$container->register('security.context_listener', ContextListener::class)
70+
->setArguments([
71+
new Reference('security.untracked_token_storage'),
72+
[],
73+
'main',
74+
new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE),
75+
new Reference('event_dispatcher', ContainerInterface::NULL_ON_INVALID_REFERENCE),
76+
new Reference('security.authentication.trust_resolver'),
77+
]);
78+
$container->register('security.token_storage', '%security.token_storage.class%');
79+
$container->register('security.untracked_token_storage', TokenStorage::class);
80+
81+
$compilerPass = new RegisterTokenUsageTrackingPass();
82+
$compilerPass->process($container);
83+
84+
$contextListener = $container->getDefinition('security.context_listener');
85+
86+
$this->assertCount(7, $container->getDefinition('security.context_listener')->getArguments());
87+
$this->assertEquals([new Reference('security.token_storage'), 'enableUsageTracking'], $contextListener->getArgument(6));
88+
}
89+
}

0 commit comments

Comments
 (0)