From 2eeec22868ad3a4fc14d37007856349491bc7c54 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 29 Jan 2024 18:14:49 +0530 Subject: [PATCH] fix: Cookies.set does not stringify JSON (#8807) * fix: cookie setting * chore: remove debug statement * chore: add specs to test stringify --- app/javascript/dashboard/store/utils/api.js | 2 +- app/javascript/sdk/cookieHelpers.js | 7 +++++++ .../sdk/specs/cookieHelpers.spec.js | 20 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/app/javascript/dashboard/store/utils/api.js b/app/javascript/dashboard/store/utils/api.js index 79e8bc6c3..1da4c6643 100644 --- a/app/javascript/dashboard/store/utils/api.js +++ b/app/javascript/dashboard/store/utils/api.js @@ -27,7 +27,7 @@ export const getHeaderExpiry = response => export const setAuthCredentials = response => { const expiryDate = getHeaderExpiry(response); - Cookies.set('cw_d_session_info', response.headers, { + Cookies.set('cw_d_session_info', JSON.stringify(response.headers), { expires: differenceInDays(expiryDate, new Date()), }); setUser(response.data.data, expiryDate); diff --git a/app/javascript/sdk/cookieHelpers.js b/app/javascript/sdk/cookieHelpers.js index 64a7afbf7..286e01317 100644 --- a/app/javascript/sdk/cookieHelpers.js +++ b/app/javascript/sdk/cookieHelpers.js @@ -34,5 +34,12 @@ export const setCookieWithDomain = ( domain: baseDomain, }; + // if type of value is object, stringify it + // this is because js-cookies 3.0 removed builtin json support + // ref: https://github.com/js-cookie/js-cookie/releases/tag/v3.0.0 + if (typeof value === 'object') { + value = JSON.stringify(value); + } + Cookies.set(name, value, cookieOptions); }; diff --git a/app/javascript/sdk/specs/cookieHelpers.spec.js b/app/javascript/sdk/specs/cookieHelpers.spec.js index 7da09315f..6ede978fc 100644 --- a/app/javascript/sdk/specs/cookieHelpers.spec.js +++ b/app/javascript/sdk/specs/cookieHelpers.spec.js @@ -107,6 +107,26 @@ describe('setCookieWithDomain', () => { ); }); + it('should stringify the cookie value when setting', () => { + setCookieWithDomain( + 'myCookie', + { value: 'cookieValue' }, + { + baseDomain: 'example.com', + } + ); + + expect(Cookies.set).toHaveBeenCalledWith( + 'myCookie', + JSON.stringify({ value: 'cookieValue' }), + expect.objectContaining({ + expires: 365, + sameSite: 'Lax', + domain: 'example.com', + }) + ); + }); + it('should set a cookie with custom expiration, sameSite attribute, and specific base domain', () => { setCookieWithDomain('myCookie', 'cookieValue', { expires: 7,