Skip to content

Commit 31c2ce2

Browse files
authored
fix(session): prevent accidental deletion of legacy-named session cookie
1 parent 57ceb53 commit 31c2ce2

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

src/server/session/stateful-session-store.test.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,42 @@ describe("Stateful Session Store", async () => {
735735

736736
expect(responseCookies.delete).toHaveBeenCalledWith(LEGACY_COOKIE_NAME);
737737
});
738+
739+
it("should not delete the legacy cookie if session cookie name matches LEGACY_COOKIE_NAME", async () => {
740+
const secret = await generateSecret(32);
741+
const session: SessionData = {
742+
user: { sub: "user_123" },
743+
tokenSet: {
744+
accessToken: "at_123",
745+
refreshToken: "rt_123",
746+
expiresAt: 123456
747+
},
748+
internal: {
749+
sid: "auth0-sid",
750+
createdAt: Math.floor(Date.now() / 1000)
751+
}
752+
};
753+
const store = {
754+
get: vi.fn(),
755+
set: vi.fn(),
756+
delete: vi.fn()
757+
};
758+
759+
const requestCookies = new RequestCookies(new Headers());
760+
const responseCookies = new ResponseCookies(new Headers());
761+
762+
// Pretend the legacy cookie is already present
763+
vi.spyOn(requestCookies, "has").mockReturnValue(true);
764+
const deleteSpy = vi.spyOn(responseCookies, "delete");
765+
const sessionStore = new StatefulSessionStore({
766+
secret,
767+
store,
768+
cookieOptions: { name: LEGACY_COOKIE_NAME } // 👈 simulate legacy name
769+
});
770+
771+
await sessionStore.set(requestCookies, responseCookies, session);
772+
expect(deleteSpy).not.toHaveBeenCalled();
773+
});
738774
});
739775

740776
describe("delete", async () => {

src/server/session/stateful-session-store.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,10 @@ export class StatefulSessionStore extends AbstractSessionStore {
152152

153153
// Any existing v3 cookie can also be deleted once we have set a v4 cookie.
154154
// In stateful sessions, we do not have to worry about chunking.
155-
if (reqCookies.has(LEGACY_COOKIE_NAME)) {
155+
if (
156+
this.sessionCookieName !== LEGACY_COOKIE_NAME &&
157+
reqCookies.has(LEGACY_COOKIE_NAME)
158+
) {
156159
resCookies.delete(LEGACY_COOKIE_NAME);
157160
}
158161
}

0 commit comments

Comments
 (0)