@@ -8,8 +8,18 @@ local pcall = pcall
8
8
local it = it
9
9
10
10
11
- local function extract_session_cookie (cookie_name , cookies )
12
- local session_cookie = ngx .re .match (cookies , cookie_name .. " =([\\ w-]+);" )
11
+ local function extract_cookie (cookie_name , cookies )
12
+ local session_cookie
13
+ if type (cookies ) == " table" then
14
+ for _ , v in ipairs (cookies ) do
15
+ session_cookie = ngx .re .match (v , cookie_name .. " =([\\ w-]+);" )
16
+ if session_cookie then
17
+ return session_cookie [1 ]
18
+ end
19
+ end
20
+ return " "
21
+ end
22
+ session_cookie = ngx .re .match (cookies , cookie_name .. " =([\\ w-]+);" )
13
23
return session_cookie and session_cookie [1 ] or " "
14
24
end
15
25
@@ -18,11 +28,14 @@ describe("Session", function()
18
28
local configuration = {}
19
29
20
30
describe (" instance methods behave as expected" , function ()
21
- local cookie_name = " session_cookie"
22
- local test_key = " test_key"
23
- local data = " test_data"
24
- local test_subject = " test_subject"
25
- local test_audience = " test_audience"
31
+ local cookie_name = " session_cookie"
32
+ local remember_cookie_name = " remember_cookie"
33
+ local test_key = " test_key"
34
+ local data = " test_data"
35
+ local test_subject = " test_subject"
36
+ local test_audience = " test_audience"
37
+ local lout_subject = " lout_subject"
38
+ local lout_audience = " lout_audience"
26
39
27
40
local function test_session_set_get (s )
28
41
assert .is_nil (
@@ -52,7 +65,7 @@ describe("Session", function()
52
65
assert .is_not_nil (s .meta .data_size )
53
66
assert (s .meta .data_size > 0 )
54
67
55
- local session_cookie = extract_session_cookie (cookie_name , cookies [" Set-Cookie" ])
68
+ local session_cookie = extract_cookie (cookie_name , cookies [" Set-Cookie" ])
56
69
return session_cookie
57
70
end
58
71
@@ -76,6 +89,17 @@ describe("Session", function()
76
89
assert .equals (data , s :get (test_key ))
77
90
end
78
91
92
+ local function test_session_get_property (s )
93
+ assert .equals (43 , # s :get_property (" id" ))
94
+ assert .equals (32 , # s :get_property (" nonce" ))
95
+ assert .equals (test_audience , s :get_property (" audience" ))
96
+ assert .equals (test_subject , s :get_property (" subject" ))
97
+ assert .match .is_number (s :get_property (" timeout" ))
98
+ assert .match .is_number (s :get_property (" idling-timeout" ))
99
+ assert .match .is_number (s :get_property (" rolling-timeout" ))
100
+ assert .match .is_number (s :get_property (" absolute-timeout" ))
101
+ end
102
+
79
103
local function test_session_touch (s )
80
104
local ok , err = s :touch ()
81
105
assert .is_true (ok )
@@ -97,7 +121,7 @@ describe("Session", function()
97
121
assert .is_false (ok )
98
122
assert .matches (" unable to get session data" , err )
99
123
100
- local session_cookie = extract_session_cookie (cookie_name , cookies [" Set-Cookie" ]) -- empty
124
+ local session_cookie = extract_cookie (cookie_name , cookies [" Set-Cookie" ]) -- empty
101
125
102
126
session .__set_ngx_var ({
103
127
[" cookie_" .. cookie_name ] = session_cookie
@@ -120,13 +144,15 @@ describe("Session", function()
120
144
test_session_set_get (s )
121
145
session_cookie = test_session_save (s , cookies )
122
146
test_session_close_open (s , session_cookie )
147
+ test_session_get_property (s )
123
148
test_session_touch (s )
124
149
test_session_destroy_open (s )
125
150
end
126
151
127
152
before_each (function ()
128
153
configuration = {
129
- cookie_name = cookie_name
154
+ cookie_name = cookie_name ,
155
+ remember_cookie_name = remember_cookie_name
130
156
}
131
157
end )
132
158
@@ -158,6 +184,164 @@ describe("Session", function()
158
184
159
185
assert .equals (configuration .ikm , s .meta .ikm )
160
186
end )
187
+
188
+ it (" logout individual audience and subject" , function ()
189
+ local cookies = {}
190
+ session .__set_ngx_header (cookies )
191
+ session .init (configuration )
192
+
193
+ configuration .audience = test_audience
194
+ configuration .subject = test_subject
195
+ local s1 = session .new (configuration )
196
+ assert .is_not_nil (s1 )
197
+ test_session_save (s1 , cookies )
198
+ local session_cookie = extract_cookie (cookie_name , cookies [" Set-Cookie" ])
199
+ session .__set_ngx_var ({
200
+ [" cookie_" .. cookie_name ] = session_cookie
201
+ })
202
+ assert .is_not_nil (session_cookie )
203
+ assert .is_not_equal (" " , session_cookie )
204
+ assert .match (s1 :get_audience (), configuration .audience )
205
+
206
+ configuration .audience = lout_audience
207
+ configuration .subject = lout_subject
208
+ local s2 = session .open (configuration )
209
+ assert .is_not_nil (s2 )
210
+ test_session_save (s2 , cookies )
211
+ session_cookie = extract_cookie (cookie_name , cookies [" Set-Cookie" ])
212
+ session .__set_ngx_var ({
213
+ [" cookie_" .. cookie_name ] = session_cookie
214
+ })
215
+ assert .is_not_nil (session_cookie )
216
+ assert .is_not_equal (" " , session_cookie )
217
+ assert .equals (configuration .audience , s2 :get_audience ())
218
+
219
+ s2 :logout ()
220
+ assert .equals (s1 .state , " open" )
221
+ assert .equals (s2 .state , " closed" )
222
+ session_cookie = extract_cookie (cookie_name , cookies [" Set-Cookie" ])
223
+ session .__set_ngx_var ({
224
+ [" cookie_" .. cookie_name ] = session_cookie
225
+ })
226
+ assert .is_not_nil (session_cookie )
227
+ assert .is_not_equal (" " , session_cookie )
228
+
229
+ s1 :logout ()
230
+ assert .equals (s1 .state , " closed" )
231
+ session_cookie = extract_cookie (cookie_name , cookies [" Set-Cookie" ])
232
+ assert .is_not_nil (session_cookie )
233
+ assert .equals (" " , session_cookie )
234
+ end )
235
+
236
+ it (" set_remember=true produces remember cookie, get_remember returns expected values" , function ()
237
+ local cookies = {}
238
+ session .__set_ngx_header (cookies )
239
+ session .init (configuration )
240
+
241
+ local s = session .new ()
242
+ assert .is_not_nil (s )
243
+ assert .is_false (s :get_remember ())
244
+ s :save ()
245
+ assert .equals (s .state , " open" )
246
+ local session_cookie = extract_cookie (cookie_name , cookies [" Set-Cookie" ])
247
+ local remember_cookie = extract_cookie (remember_cookie_name , cookies [" Set-Cookie" ])
248
+ assert .is_not_nil (remember_cookie )
249
+ assert .equals (" " , remember_cookie )
250
+
251
+ session .__set_ngx_var ({
252
+ [" cookie_" .. cookie_name ] = session_cookie ,
253
+ [" cookie_" .. remember_cookie_name ] = remember_cookie ,
254
+ })
255
+ s :set_remember (true )
256
+ assert .is_true (s :get_remember ())
257
+ s :save ()
258
+ assert .equals (s .state , " open" )
259
+ remember_cookie = extract_cookie (remember_cookie_name , cookies [" Set-Cookie" ])
260
+ assert .is_not_nil (remember_cookie )
261
+ assert .is_not_equal (remember_cookie , " " )
262
+ end )
263
+
264
+ describe (" with custom cookie attribute" , function ()
265
+ it (" Domain" , function ()
266
+ configuration .cookie_domain = " example.org"
267
+ session .init (configuration )
268
+
269
+ local s = session .new ()
270
+ assert .is_not_nil (s )
271
+ test_session (s )
272
+ assert .matches (" Domain=example.org" , s .cookie_flags )
273
+ end )
274
+
275
+ it (" Path" , function ()
276
+ configuration .cookie_path = " /test"
277
+ session .init (configuration )
278
+
279
+ local s = session .new ()
280
+ assert .is_not_nil (s )
281
+ test_session (s )
282
+ assert .matches (" Path=/test" , s .cookie_flags )
283
+ end )
284
+
285
+ it (" SameSite" , function ()
286
+ configuration .cookie_same_site = " Default"
287
+ session .init (configuration )
288
+
289
+ local s = session .new ()
290
+ assert .is_not_nil (s )
291
+ test_session (s )
292
+ assert .matches (" SameSite=Default" , s .cookie_flags )
293
+ end )
294
+
295
+ it (" HttpOnly" , function ()
296
+ configuration .cookie_http_only = false
297
+ session .init (configuration )
298
+
299
+ local s = session .new ()
300
+ assert .is_not_nil (s )
301
+ test_session (s )
302
+ assert .does_not .match (" HttpOnly" , s .cookie_flags )
303
+ end )
304
+
305
+ it (" Secure" , function ()
306
+ configuration .cookie_secure = true
307
+ session .init (configuration )
308
+
309
+ local s = session .new ()
310
+ assert .is_not_nil (s )
311
+ test_session (s )
312
+ assert .matches (" Secure" , s .cookie_flags )
313
+ end )
314
+
315
+ it (" Priority" , function ()
316
+ configuration .cookie_priority = " High"
317
+ session .init (configuration )
318
+
319
+ local s = session .new ()
320
+ assert .is_not_nil (s )
321
+ test_session (s )
322
+ assert .matches (" Priority=High" , s .cookie_flags )
323
+ end )
324
+
325
+ it (" Partitioned" , function ()
326
+ configuration .cookie_partitioned = true
327
+ session .init (configuration )
328
+
329
+ local s = session .new ()
330
+ assert .is_not_nil (s )
331
+ test_session (s )
332
+ assert .matches (" Partitioned" , s .cookie_flags )
333
+ end )
334
+
335
+ it (" SameParty" , function ()
336
+ configuration .cookie_same_party = true
337
+ session .init (configuration )
338
+
339
+ local s = session .new ()
340
+ assert .is_not_nil (s )
341
+ test_session (s )
342
+ assert .matches (" SameParty" , s .cookie_flags )
343
+ end )
344
+ end )
161
345
end )
162
346
163
347
describe (" Fields validation" , function ()
@@ -207,6 +391,15 @@ describe("Session", function()
207
391
assert .is_false (ok )
208
392
assert .matches (" invalid ikm size" , err )
209
393
end )
394
+
395
+ it (" SameParty and SameSite=strict fails to instantiate session" , function ()
396
+ configuration .cookie_same_party = true
397
+ configuration .cookie_same_site = " Strict"
398
+
399
+ local ok , err = pcall (session .new , configuration )
400
+ assert .is_false (ok )
401
+ assert .matches (" SameParty session cookies cannot use SameSite=Strict" , err )
402
+ end )
210
403
end )
211
404
end )
212
405
end )
0 commit comments