@@ -161,3 +161,169 @@ tap.test('does not support an empty key array', async t => {
161161
162162 await t . rejects ( ( ) => fastify . after ( ) )
163163} )
164+
165+ tap . test ( 'signing works with only a string key array' , function ( t ) {
166+ const fastify = Fastify ( { logger : false } )
167+
168+ const key1 = Buffer . alloc ( sodium . crypto_secretbox_KEYBYTES )
169+ sodium . randombytes_buf ( key1 )
170+
171+ const key2 = Buffer . alloc ( sodium . crypto_secretbox_KEYBYTES )
172+ sodium . randombytes_buf ( key2 )
173+
174+ fastify . register ( fastifySecureSession , {
175+ key : [ key1 . toString ( 'base64' ) , key2 . toString ( 'base64' ) ]
176+ } )
177+
178+ fastify . post ( '/' , ( request , reply ) => {
179+ request . session . set ( 'data' , request . body )
180+ reply . setCookie ( 'my-session' , JSON . stringify ( request . body ) , {
181+ httpOnly : true ,
182+ secure : true ,
183+ maxAge : 3600 ,
184+ signed : true ,
185+ path : '/'
186+ } )
187+ reply . send ( 'session set' )
188+ } )
189+
190+ fastify . get ( '/secure-session' , ( request , reply ) => {
191+ const data = request . session . get ( 'data' )
192+ if ( ! data ) {
193+ reply . code ( 404 ) . send ( )
194+ return
195+ }
196+ reply . send ( data )
197+ } )
198+
199+ fastify . get ( '/cookie-signed' , ( request , reply ) => {
200+ const data = request . unsignCookie ( request . cookies [ 'my-session' ] )
201+ if ( ! data . valid ) {
202+ reply . code ( 404 ) . send ( )
203+ return
204+ }
205+ reply . send ( data . value )
206+ } )
207+
208+ t . teardown ( fastify . close . bind ( fastify ) )
209+ t . plan ( 7 )
210+
211+ fastify . inject ( {
212+ method : 'POST' ,
213+ url : '/' ,
214+ payload : {
215+ some : 'data'
216+ }
217+ } , ( error , response ) => {
218+ t . error ( error )
219+ t . equal ( response . statusCode , 200 )
220+ t . ok ( response . headers [ 'set-cookie' ] )
221+
222+ const cookieHeader = response . headers [ 'set-cookie' ] . join ( ';' )
223+
224+ fastify . inject ( {
225+ method : 'GET' ,
226+ url : '/secure-session' ,
227+ headers : {
228+ cookie : cookieHeader
229+ }
230+ } , ( error , response ) => {
231+ t . error ( error )
232+ t . same ( JSON . parse ( response . payload ) , { some : 'data' } )
233+
234+ fastify . inject ( {
235+ method : 'GET' ,
236+ url : '/cookie-signed' ,
237+ headers : {
238+ cookie : cookieHeader
239+ }
240+ } , ( error , response ) => {
241+ t . error ( error )
242+ t . same ( JSON . parse ( response . payload ) , { some : 'data' } )
243+ } )
244+ } )
245+ } )
246+ } )
247+
248+ tap . test ( 'signing works with only a buffer key array' , function ( t ) {
249+ const fastify = Fastify ( { logger : false } )
250+
251+ const key1 = Buffer . alloc ( sodium . crypto_secretbox_KEYBYTES )
252+ sodium . randombytes_buf ( key1 )
253+
254+ const key2 = Buffer . alloc ( sodium . crypto_secretbox_KEYBYTES )
255+ sodium . randombytes_buf ( key2 )
256+
257+ fastify . register ( fastifySecureSession , {
258+ key : [ key1 , key2 ]
259+ } )
260+
261+ fastify . post ( '/' , ( request , reply ) => {
262+ request . session . set ( 'data' , request . body )
263+ reply . setCookie ( 'my-session' , JSON . stringify ( request . body ) , {
264+ httpOnly : true ,
265+ secure : true ,
266+ maxAge : 3600 ,
267+ signed : true ,
268+ path : '/'
269+ } )
270+ reply . send ( 'session set' )
271+ } )
272+
273+ fastify . get ( '/secure-session' , ( request , reply ) => {
274+ const data = request . session . get ( 'data' )
275+ if ( ! data ) {
276+ reply . code ( 404 ) . send ( )
277+ return
278+ }
279+ reply . send ( data )
280+ } )
281+
282+ fastify . get ( '/cookie-signed' , ( request , reply ) => {
283+ const data = request . unsignCookie ( request . cookies [ 'my-session' ] )
284+ if ( ! data . valid ) {
285+ reply . code ( 404 ) . send ( )
286+ return
287+ }
288+ reply . send ( data . value )
289+ } )
290+
291+ t . teardown ( fastify . close . bind ( fastify ) )
292+ t . plan ( 7 )
293+
294+ fastify . inject ( {
295+ method : 'POST' ,
296+ url : '/' ,
297+ payload : {
298+ some : 'data'
299+ }
300+ } , ( error , response ) => {
301+ t . error ( error )
302+ t . equal ( response . statusCode , 200 )
303+ t . ok ( response . headers [ 'set-cookie' ] )
304+
305+ const cookieHeader = response . headers [ 'set-cookie' ] . join ( ';' )
306+
307+ fastify . inject ( {
308+ method : 'GET' ,
309+ url : '/secure-session' ,
310+ headers : {
311+ cookie : cookieHeader
312+ }
313+ } , ( error , response ) => {
314+ t . error ( error )
315+ t . same ( JSON . parse ( response . payload ) , { some : 'data' } )
316+
317+ fastify . inject ( {
318+ method : 'GET' ,
319+ url : '/cookie-signed' ,
320+ headers : {
321+ cookie : cookieHeader
322+ }
323+ } , ( error , response ) => {
324+ t . error ( error )
325+ t . same ( JSON . parse ( response . payload ) , { some : 'data' } )
326+ } )
327+ } )
328+ } )
329+ } )
0 commit comments