15
15
use Psr \Log \LoggerInterface ;
16
16
use Symfony \Component \DependencyInjection \Container ;
17
17
use Symfony \Component \DependencyInjection \ServiceLocator ;
18
+ use Symfony \Component \HttpFoundation \Cookie ;
18
19
use Symfony \Component \HttpFoundation \Request ;
19
20
use Symfony \Component \HttpFoundation \RequestStack ;
20
21
use Symfony \Component \HttpFoundation \Response ;
33
34
34
35
class SessionListenerTest extends TestCase
35
36
{
37
+ /**
38
+ * @dataProvider provideSessionOptions
39
+ * @runInSeparateProcess
40
+ */
41
+ public function testSessionCookieOptions (array $ phpSessionOptions , array $ sessionOptions , array $ expectedSessionOptions )
42
+ {
43
+ $ session = $ this ->getMockBuilder (Session::class)->disableOriginalConstructor ()->getMock ();
44
+ $ session ->expects ($ this ->exactly (2 ))->method ('getUsageIndex ' )->will ($ this ->onConsecutiveCalls (0 , 1 ));
45
+ $ session ->expects ($ this ->exactly (1 ))->method ('getId ' )->willReturn ('123456 ' );
46
+ $ session ->expects ($ this ->exactly (1 ))->method ('getName ' )->willReturn ('PHPSESSID ' );
47
+ $ session ->expects ($ this ->exactly (1 ))->method ('save ' );
48
+ $ session ->expects ($ this ->exactly (1 ))->method ('isStarted ' )->willReturn (true );
49
+
50
+ if (isset ($ phpSessionOptions ['samesite ' ])) {
51
+ ini_set ('session.cookie_samesite ' , $ phpSessionOptions ['samesite ' ]);
52
+ }
53
+ session_set_cookie_params (0 , $ phpSessionOptions ['path ' ] ?? null , $ phpSessionOptions ['domain ' ] ?? null , $ phpSessionOptions ['secure ' ] ?? null , $ phpSessionOptions ['httponly ' ] ?? null );
54
+
55
+ $ container = new Container ();
56
+ $ container ->set ('initialized_session ' , $ session );
57
+
58
+ $ listener = new SessionListener ($ container , false , $ sessionOptions );
59
+ $ kernel = $ this ->getMockBuilder (HttpKernelInterface::class)->disableOriginalConstructor ()->getMock ();
60
+
61
+ $ request = new Request ();
62
+ $ listener ->onKernelRequest (new RequestEvent ($ kernel , $ request , HttpKernelInterface::MAIN_REQUEST ));
63
+
64
+ $ response = new Response ();
65
+ $ listener ->onKernelResponse (new ResponseEvent ($ kernel , new Request (), HttpKernelInterface::MAIN_REQUEST , $ response ));
66
+
67
+ $ cookies = $ response ->headers ->getCookies ();
68
+ $ this ->assertSame ('PHPSESSID ' , $ cookies [0 ]->getName ());
69
+ $ this ->assertSame ('123456 ' , $ cookies [0 ]->getValue ());
70
+ $ this ->assertSame ($ expectedSessionOptions ['cookie_path ' ], $ cookies [0 ]->getPath ());
71
+ $ this ->assertSame ($ expectedSessionOptions ['cookie_domain ' ], $ cookies [0 ]->getDomain ());
72
+ $ this ->assertSame ($ expectedSessionOptions ['cookie_secure ' ], $ cookies [0 ]->isSecure ());
73
+ $ this ->assertSame ($ expectedSessionOptions ['cookie_httponly ' ], $ cookies [0 ]->isHttpOnly ());
74
+ $ this ->assertSame ($ expectedSessionOptions ['cookie_samesite ' ], $ cookies [0 ]->getSameSite ());
75
+ }
76
+
77
+ public function provideSessionOptions (): \Generator
78
+ {
79
+ if (\PHP_VERSION_ID > 70300 ) {
80
+ yield 'set_samesite_by_php ' => [
81
+ 'phpSessionOptions ' => ['samesite ' => Cookie::SAMESITE_STRICT ],
82
+ 'sessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_domain ' => '' , 'cookie_secure ' => true , 'cookie_httponly ' => true ],
83
+ 'expectedSessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_domain ' => '' , 'cookie_secure ' => true , 'cookie_httponly ' => true , 'cookie_samesite ' => Cookie::SAMESITE_STRICT ],
84
+ ];
85
+ }
86
+
87
+ yield 'set_cookie_path_by_php ' => [
88
+ 'phpSessionOptions ' => ['path ' => '/prod/ ' ],
89
+ 'sessionOptions ' => ['cookie_domain ' => '' , 'cookie_secure ' => true , 'cookie_httponly ' => true , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
90
+ 'expectedSessionOptions ' => ['cookie_path ' => '/prod/ ' , 'cookie_domain ' => '' , 'cookie_secure ' => true , 'cookie_httponly ' => true , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
91
+ ];
92
+
93
+ yield 'set_cookie_secure_by_php ' => [
94
+ 'phpSessionOptions ' => ['secure ' => true ],
95
+ 'sessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_domain ' => '' , 'cookie_httponly ' => true , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
96
+ 'expectedSessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_domain ' => '' , 'cookie_secure ' => true , 'cookie_httponly ' => true , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
97
+ ];
98
+
99
+ yield 'set_cookiesecure_auto_by_symfony_false_by_php ' => [
100
+ 'phpSessionOptions ' => ['secure ' => false ],
101
+ 'sessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_httponly ' => 'auto ' , 'cookie_secure ' => 'auto ' , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
102
+ 'expectedSessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_domain ' => '' , 'cookie_secure ' => false , 'cookie_httponly ' => true , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
103
+ ];
104
+
105
+ yield 'set_cookiesecure_auto_by_symfony_true_by_php ' => [
106
+ 'phpSessionOptions ' => ['secure ' => true ],
107
+ 'sessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_httponly ' => 'auto ' , 'cookie_secure ' => 'auto ' , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
108
+ 'expectedSessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_domain ' => '' , 'cookie_secure ' => true , 'cookie_httponly ' => true , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
109
+ ];
110
+
111
+ yield 'set_cookie_httponly_by_php ' => [
112
+ 'phpSessionOptions ' => ['httponly ' => true ],
113
+ 'sessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_domain ' => '' , 'cookie_secure ' => true , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
114
+ 'expectedSessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_domain ' => '' , 'cookie_secure ' => true , 'cookie_httponly ' => true , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
115
+ ];
116
+
117
+ yield 'set_cookie_domain_by_php ' => [
118
+ 'phpSessionOptions ' => ['domain ' => 'test.symfony ' ],
119
+ 'sessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_httponly ' => true , 'cookie_secure ' => true , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
120
+ 'expectedSessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_domain ' => 'test.symfony ' , 'cookie_secure ' => true , 'cookie_httponly ' => true , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
121
+ ];
122
+
123
+ yield 'set_samesite_by_symfony ' => [
124
+ 'phpSessionOptions ' => ['samesite ' => Cookie::SAMESITE_STRICT ],
125
+ 'sessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_httponly ' => true , 'cookie_secure ' => true , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
126
+ 'expectedSessionOptions ' => ['cookie_path ' => '/test/ ' , 'cookie_domain ' => '' , 'cookie_secure ' => true , 'cookie_httponly ' => true , 'cookie_samesite ' => Cookie::SAMESITE_LAX ],
127
+ ];
128
+ }
129
+
36
130
public function testOnlyTriggeredOnMainRequest ()
37
131
{
38
132
$ listener = $ this ->getMockForAbstractClass (AbstractSessionListener::class);
@@ -160,10 +254,10 @@ public function testSessionSaveAndResponseHasSessionCookie()
160
254
$ kernel = $ this ->getMockBuilder (HttpKernelInterface::class)->disableOriginalConstructor ()->getMock ();
161
255
162
256
$ request = new Request ();
163
- $ listener ->onKernelRequest (new RequestEvent ($ kernel , $ request , HttpKernelInterface::MASTER_REQUEST ));
257
+ $ listener ->onKernelRequest (new RequestEvent ($ kernel , $ request , HttpKernelInterface::MAIN_REQUEST ));
164
258
165
259
$ response = new Response ();
166
- $ listener ->onKernelResponse (new ResponseEvent ($ kernel , new Request (), HttpKernelInterface::MASTER_REQUEST , $ response ));
260
+ $ listener ->onKernelResponse (new ResponseEvent ($ kernel , new Request (), HttpKernelInterface::MAIN_REQUEST , $ response ));
167
261
168
262
$ cookies = $ response ->headers ->getCookies ();
169
263
$ this ->assertSame ('PHPSESSID ' , $ cookies [0 ]->getName ());
0 commit comments