mirror of
https://github.com/TriliumNext/Notes.git
synced 2025-07-29 11:02:28 +08:00
feat(server): renew session when "Remember me" is off
This commit is contained in:
parent
f8ded7b171
commit
244a162e42
@ -82,6 +82,24 @@ describe("Login Route test", () => {
|
|||||||
expect(expiry).toStrictEqual(new Date(session!.cookie.expires!));
|
expect(expiry).toStrictEqual(new Date(session!.cookie.expires!));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("doesn't renew the session on subsequent requests", async () => {
|
||||||
|
const { expiry: originalExpiry } = await getSessionFromCookie(setCookieHeader);
|
||||||
|
|
||||||
|
// Simulate user waiting half the period before the session expires.
|
||||||
|
vi.setSystemTime(originalExpiry!.getTime() - (originalExpiry!.getTime() - Date.now()) / 2);
|
||||||
|
|
||||||
|
// Make a request to renew the session.
|
||||||
|
await supertest(app)
|
||||||
|
.get("/")
|
||||||
|
.set("Cookie", setCookieHeader)
|
||||||
|
.expect(200);
|
||||||
|
|
||||||
|
// Check the session is still valid and has not been renewed.
|
||||||
|
const { session, expiry } = await getSessionFromCookie(setCookieHeader);
|
||||||
|
expect(session).toBeTruthy();
|
||||||
|
expect(expiry!.getTime()).toStrictEqual(originalExpiry!.getTime());
|
||||||
|
});
|
||||||
|
|
||||||
it("cleans up expired sessions", async () => {
|
it("cleans up expired sessions", async () => {
|
||||||
let { session, expiry } = await getSessionFromCookie(setCookieHeader);
|
let { session, expiry } = await getSessionFromCookie(setCookieHeader);
|
||||||
expect(session).toBeTruthy();
|
expect(session).toBeTruthy();
|
||||||
@ -123,6 +141,24 @@ describe("Login Route test", () => {
|
|||||||
expect(expiry?.getTime()).toBeLessThanOrEqual(expectedExpirationDate.getTime());
|
expect(expiry?.getTime()).toBeLessThanOrEqual(expectedExpirationDate.getTime());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("renews the session on subsequent requests", async () => {
|
||||||
|
const { expiry: originalExpiry } = await getSessionFromCookie(setCookieHeader);
|
||||||
|
|
||||||
|
// Simulate user waiting half the period before the session expires.
|
||||||
|
vi.setSystemTime(originalExpiry!.getTime() - (originalExpiry!.getTime() - Date.now()) / 2);
|
||||||
|
|
||||||
|
// Make a request to renew the session.
|
||||||
|
await supertest(app)
|
||||||
|
.get("/")
|
||||||
|
.set("Cookie", setCookieHeader)
|
||||||
|
.expect(200);
|
||||||
|
|
||||||
|
// Check the session is still valid and has been renewed.
|
||||||
|
const { session, expiry } = await getSessionFromCookie(setCookieHeader);
|
||||||
|
expect(session).toBeTruthy();
|
||||||
|
expect(expiry!.getTime()).toBeGreaterThan(originalExpiry!.getTime());
|
||||||
|
});
|
||||||
|
|
||||||
it("cleans up expired sessions", async () => {
|
it("cleans up expired sessions", async () => {
|
||||||
let { session, expiry } = await getSessionFromCookie(setCookieHeader);
|
let { session, expiry } = await getSessionFromCookie(setCookieHeader);
|
||||||
expect(session).toBeTruthy();
|
expect(session).toBeTruthy();
|
||||||
|
@ -55,6 +55,23 @@ export class SQLiteSessionStore extends Store {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
touch(sid: string, session: session.SessionData, callback?: (err?: any) => void): void {
|
||||||
|
// For now it's only for session cookies ("Remember me" unchecked).
|
||||||
|
if (session.cookie?.expires) {
|
||||||
|
callback?.();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const expires = Date.now() + 3600000; // fallback to 1 hour
|
||||||
|
sql.execute(/*sql*/`UPDATE sessions SET expires = ? WHERE id = ?`, [expires, sid]);
|
||||||
|
callback?.();
|
||||||
|
} catch (e) {
|
||||||
|
log.error(e);
|
||||||
|
callback?.(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a session ID, returns the expiry date of the session.
|
* Given a session ID, returns the expiry date of the session.
|
||||||
*
|
*
|
||||||
@ -79,6 +96,7 @@ const sessionParser: express.RequestHandler = session({
|
|||||||
secret: sessionSecret,
|
secret: sessionSecret,
|
||||||
resave: false, // true forces the session to be saved back to the session store, even if the session was never modified during the request.
|
resave: false, // true forces the session to be saved back to the session store, even if the session was never modified during the request.
|
||||||
saveUninitialized: false, // true forces a session that is "uninitialized" to be saved to the store. A session is uninitialized when it is new but not modified.
|
saveUninitialized: false, // true forces a session that is "uninitialized" to be saved to the store. A session is uninitialized when it is new but not modified.
|
||||||
|
rolling: true, // forces the session to be saved back to the session store, resetting the expiration date.
|
||||||
cookie: {
|
cookie: {
|
||||||
path: "/",
|
path: "/",
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user