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

Skip to content

Commit 519eb1c

Browse files
committed
Do not pass the value to the NativeSessionStorage constructor if its value is auto. In addition, resolve this auto value immediately when the SessionListener event is called.
1 parent 9765b5a commit 519eb1c

File tree

4 files changed

+25
-6
lines changed

4 files changed

+25
-6
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -935,15 +935,19 @@ private function registerSessionConfiguration(array $config, ContainerBuilder $c
935935
}
936936
}
937937

938+
$nativeStorageDefaultOptions = $options;
939+
938940
if ('auto' === ($options['cookie_secure'] ?? null)) {
939941
$locator = $container->getDefinition('session_listener')->getArgument(0);
940942
$locator->setValues($locator->getValues() + [
941943
'session_storage' => new Reference('session.storage', ContainerInterface::IGNORE_ON_INVALID_REFERENCE),
942944
'request_stack' => new Reference('request_stack'),
943945
]);
946+
unset($nativeStorageDefaultOptions['cookie_secure']);
944947
}
945948

946949
$container->setParameter('session.storage.options', $options);
950+
$container->setParameter('session.storage.native.default_options', $nativeStorageDefaultOptions);
947951

948952
// session handler (the internal callback registered with PHP session management)
949953
if (null === $config['handler_id']) {

src/Symfony/Bundle/FrameworkBundle/Resources/config/session.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
</service>
2626

2727
<service id="session.storage.native" class="Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage">
28-
<argument>%session.storage.options%</argument>
28+
<argument>%session.storage.native.default_options%</argument>
2929
<argument type="service" id="session.handler" />
3030
<argument type="service" id="session.storage.metadata_bag" />
3131
</service>

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,6 +1537,12 @@ public function testSessionCookieSecureAuto()
15371537
{
15381538
$container = $this->createContainerFromFile('session_cookie_secure_auto');
15391539

1540+
$options = $container->getParameter('session.storage.options');
1541+
$this->assertEquals('auto', $options['cookie_secure']);
1542+
1543+
$options = $container->getParameter('session.storage.native.default_options');
1544+
$this->assertNotContains('cookie_secure', $options, 'Should not pass "cookie_secure" to NativeSessionStorage constructor if its value is "auto"');
1545+
15401546
$expected = ['session', 'initialized_session', 'session_storage', 'request_stack'];
15411547
$this->assertEquals($expected, array_keys($container->getDefinition('session_listener')->getArgument(0)->getValues()));
15421548
}

src/Symfony/Component/HttpKernel/EventListener/SessionListener.php

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Psr\Container\ContainerInterface;
1515
use Symfony\Component\HttpFoundation\Session\SessionInterface;
1616
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
17+
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
1718

1819
/**
1920
* Sets the session in the request.
@@ -33,18 +34,26 @@ public function __construct(ContainerInterface $container)
3334
$this->container = $container;
3435
}
3536

36-
protected function getSession(): ?SessionInterface
37+
public function onKernelRequest(GetResponseEvent $event)
3738
{
38-
if (!$this->container->has('session')) {
39-
return null;
39+
parent::onKernelRequest($event);
40+
41+
if (!$event->isMasterRequest() || !$this->container->has('session')) {
42+
return;
4043
}
4144

4245
if ($this->container->has('session_storage')
4346
&& ($storage = $this->container->get('session_storage')) instanceof NativeSessionStorage
4447
&& ($masterRequest = $this->container->get('request_stack')->getMasterRequest())
45-
&& $masterRequest->isSecure()
4648
) {
47-
$storage->setOptions(['cookie_secure' => true]);
49+
$storage->setOptions(['cookie_secure' => $masterRequest->isSecure()]);
50+
}
51+
}
52+
53+
protected function getSession(): ?SessionInterface
54+
{
55+
if (!$this->container->has('session')) {
56+
return null;
4857
}
4958

5059
return $this->container->get('session');

0 commit comments

Comments
 (0)