@prairielearn/session 1.3.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/README.md +0 -17
- package/dist/before-end.test.js +2 -2
- package/dist/before-end.test.js.map +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js +30 -19
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +35 -82
- package/dist/index.test.js.map +1 -1
- package/dist/session.d.ts +1 -0
- package/dist/session.js +17 -9
- package/dist/session.js.map +1 -1
- package/dist/session.test.js +0 -8
- package/dist/session.test.js.map +1 -1
- package/package.json +3 -2
- package/src/before-end.test.ts +1 -1
- package/src/index.test.ts +27 -80
- package/src/index.ts +44 -26
- package/src/session.test.ts +1 -12
- package/src/session.ts +20 -10
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -35,20 +35,3 @@ createSessionMiddleware({
|
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
If a request is received with a `legacy_session` or an `ancient_session` cookie, the session will be loaded from the store and then persisted as a new cookie named `session`. For all other requests, the session will be loaded from and persisted to the `session` cookie.
|
|
38
|
-
|
|
39
|
-
### Controlling when cookies are set
|
|
40
|
-
|
|
41
|
-
You can pass a `canSetCookie` function to `createSessionMiddleware` to provide control over when session cookies will be returned to the client.
|
|
42
|
-
|
|
43
|
-
```ts
|
|
44
|
-
createSessionMiddleware({
|
|
45
|
-
canSetCookie: (req) => {
|
|
46
|
-
return req.hostname === 'us.prairielearn.com';
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
This can be useful to enforce that a session cookie is only ever set from a root domain and not subdomains.
|
|
52
|
-
|
|
53
|
-
- If a request is received that does not have a valid session cookie, a temporary session will be created at `req.session`, but it won't be persisted since the client won't know about the session ID.
|
|
54
|
-
- If a request is received that already has a valid session cookie, modifications to the session will be persisted, but the cookie itself won't be updated.
|
package/dist/before-end.test.js
CHANGED
|
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const express_1 = __importDefault(require("express"));
|
|
7
7
|
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
8
8
|
const chai_1 = require("chai");
|
|
9
|
+
const express_test_utils_1 = require("@prairielearn/express-test-utils");
|
|
9
10
|
const before_end_1 = require("./before-end");
|
|
10
|
-
const test_utils_1 = require("./test-utils");
|
|
11
11
|
describe('beforeEnd', () => {
|
|
12
12
|
it('handles errors correctly', async () => {
|
|
13
13
|
const app = (0, express_1.default)();
|
|
@@ -23,7 +23,7 @@ describe('beforeEnd', () => {
|
|
|
23
23
|
error = err;
|
|
24
24
|
next();
|
|
25
25
|
});
|
|
26
|
-
await (0,
|
|
26
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
27
27
|
const res = await (0, node_fetch_1.default)(url);
|
|
28
28
|
chai_1.assert.equal(res.status, 200);
|
|
29
29
|
chai_1.assert.equal(error?.message, 'oops');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"before-end.test.js","sourceRoot":"","sources":["../src/before-end.test.ts"],"names":[],"mappings":";;;;;AAAA,sDAAkF;AAClF,4DAA+B;AAC/B,+BAA8B;
|
|
1
|
+
{"version":3,"file":"before-end.test.js","sourceRoot":"","sources":["../src/before-end.test.ts"],"names":[],"mappings":";;;;;AAAA,sDAAkF;AAClF,4DAA+B;AAC/B,+BAA8B;AAC9B,yEAA8D;AAE9D,6CAAyC;AAEzC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC1B,IAAA,sBAAS,EAAC,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;gBAC9B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YAEH,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAEjD,IAAI,KAAK,GAAiB,IAAI,CAAC;QAC/B,GAAG,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,IAAa,EAAE,IAAc,EAAE,IAAkB,EAAE,EAAE;YACtE,KAAK,GAAG,GAAG,CAAC;YACZ,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;QAEH,MAAM,IAAA,+BAAU,EAAC,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YACtC,MAAM,GAAG,GAAG,MAAM,IAAA,oBAAK,EAAC,GAAG,CAAC,CAAC;YAE7B,aAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC9B,aAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Request } from 'express';
|
|
2
1
|
import { SessionStore } from './store';
|
|
3
2
|
import { type CookieSecure } from './cookie';
|
|
4
3
|
import { type Session } from './session';
|
|
@@ -12,7 +11,6 @@ declare global {
|
|
|
12
11
|
export interface SessionOptions {
|
|
13
12
|
secret: string | string[];
|
|
14
13
|
store: SessionStore;
|
|
15
|
-
canSetCookie?: (req: Request) => boolean;
|
|
16
14
|
cookie?: {
|
|
17
15
|
/**
|
|
18
16
|
* If multiple names are provided, the first one is used as the primary
|
package/dist/index.js
CHANGED
|
@@ -25,7 +25,6 @@ function createSessionMiddleware(options) {
|
|
|
25
25
|
req.session = await (0, session_1.loadSession)(sessionId, req, store, cookieMaxAge);
|
|
26
26
|
const originalHash = (0, session_1.hashSession)(req.session);
|
|
27
27
|
const originalExpirationDate = req.session.getExpirationDate();
|
|
28
|
-
const canSetCookie = options.canSetCookie?.(req) ?? true;
|
|
29
28
|
(0, on_headers_1.default)(res, () => {
|
|
30
29
|
if (!req.session) {
|
|
31
30
|
if (cookieSessionId) {
|
|
@@ -50,7 +49,7 @@ function createSessionMiddleware(options) {
|
|
|
50
49
|
const needsRotation = sessionCookie?.name && sessionCookie?.name !== primaryCookieName;
|
|
51
50
|
const isNewSession = !cookieSessionId || cookieSessionId !== req.session.id;
|
|
52
51
|
const didExpirationChange = originalExpirationDate.getTime() !== req.session.getExpirationDate().getTime();
|
|
53
|
-
if (
|
|
52
|
+
if (isNewSession || didExpirationChange || needsRotation) {
|
|
54
53
|
const signedSessionId = signSessionId(req.session.id, secrets[0]);
|
|
55
54
|
res.cookie(primaryCookieName, signedSessionId, {
|
|
56
55
|
secure: secureCookie,
|
|
@@ -61,28 +60,45 @@ function createSessionMiddleware(options) {
|
|
|
61
60
|
});
|
|
62
61
|
}
|
|
63
62
|
});
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
let sessionPersisted = false;
|
|
64
|
+
async function persistSession(req) {
|
|
65
|
+
if (!req.session || sessionPersisted) {
|
|
66
66
|
// There is no session to do anything with.
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
|
-
|
|
69
|
+
sessionPersisted = true;
|
|
70
|
+
// If this is a new session, we would have already persisted it to the
|
|
71
|
+
// store, so we don't need to take that into consideration here.
|
|
72
|
+
//
|
|
73
|
+
// If the hash of the session data changed, we'll unconditionally persist
|
|
74
|
+
// the updated data to the store. However, if the hash didn't change, we
|
|
75
|
+
// only want to persist it if the expiration changed *and* if we can set
|
|
76
|
+
// a cookie to reflect the updated expiration date.
|
|
70
77
|
const hashChanged = (0, session_1.hashSession)(req.session) !== originalHash;
|
|
71
|
-
const
|
|
72
|
-
if (
|
|
73
|
-
(canSetCookie && (!isExistingSession || didExpirationChange))) {
|
|
74
|
-
// Only update the expiration date in the store if we were actually
|
|
75
|
-
// able to update the cookie too.
|
|
76
|
-
const expirationDate = canSetCookie
|
|
77
|
-
? req.session.getExpirationDate()
|
|
78
|
-
: originalExpirationDate;
|
|
78
|
+
const expirationChanged = originalExpirationDate.getTime() !== req.session.getExpirationDate().getTime();
|
|
79
|
+
if (hashChanged || expirationChanged) {
|
|
79
80
|
await store.set(req.session.id, req.session,
|
|
80
81
|
// Cookies only support second-level resolution. To ensure consistency
|
|
81
82
|
// between the cookie and the store, truncate the expiration date to
|
|
82
83
|
// the nearest second.
|
|
83
|
-
truncateExpirationDate(
|
|
84
|
+
(0, session_1.truncateExpirationDate)(req.session.getExpirationDate()));
|
|
84
85
|
}
|
|
86
|
+
}
|
|
87
|
+
// We'll attempt to persist the session at the end of the request. This
|
|
88
|
+
// hacky strategy is borrowed from `express-session`.
|
|
89
|
+
(0, before_end_1.beforeEnd)(res, next, async () => {
|
|
90
|
+
await persistSession(req);
|
|
85
91
|
});
|
|
92
|
+
// We'll also attempt to persist the session before performing a redirect.
|
|
93
|
+
// This is necessary because browsers and `fetch()` implementations aren't
|
|
94
|
+
// required to wait for a response body to be received before following a
|
|
95
|
+
// redirect. So, we need to make sure that the session is persisted before
|
|
96
|
+
// we send the redirect response. This way, the subsequent GET will be able
|
|
97
|
+
// to load the latest session data.
|
|
98
|
+
const originalRedirect = res.redirect;
|
|
99
|
+
res.redirect = function redirect(...args) {
|
|
100
|
+
persistSession(req).then(() => originalRedirect.apply(res, args), (err) => next(err));
|
|
101
|
+
};
|
|
86
102
|
next();
|
|
87
103
|
});
|
|
88
104
|
}
|
|
@@ -99,9 +115,4 @@ function getCookieNames(cookieName) {
|
|
|
99
115
|
function signSessionId(sessionId, secret) {
|
|
100
116
|
return cookie_signature_1.default.sign(sessionId, secret);
|
|
101
117
|
}
|
|
102
|
-
function truncateExpirationDate(date) {
|
|
103
|
-
const time = date.getTime();
|
|
104
|
-
const truncatedTime = Math.floor(time / 1000) * 1000;
|
|
105
|
-
return new Date(truncatedTime);
|
|
106
|
-
}
|
|
107
118
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AACA,4DAAmC;AACnC,wEAAyC;AACzC,kFAAiD;AAGjD,6CAAyC;AACzC,qCAKkB;AAClB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.test.js
CHANGED
|
@@ -9,16 +9,16 @@ const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
|
9
9
|
const fetch_cookie_1 = __importDefault(require("fetch-cookie"));
|
|
10
10
|
const set_cookie_parser_1 = require("set-cookie-parser");
|
|
11
11
|
const express_async_handler_1 = __importDefault(require("express-async-handler"));
|
|
12
|
+
const express_test_utils_1 = require("@prairielearn/express-test-utils");
|
|
12
13
|
const index_1 = require("./index");
|
|
13
14
|
const memory_store_1 = require("./memory-store");
|
|
14
|
-
const test_utils_1 = require("./test-utils");
|
|
15
15
|
const TEST_SECRET = 'test-secret';
|
|
16
16
|
describe('session middleware', () => {
|
|
17
17
|
it('sets a session cookie', async () => {
|
|
18
18
|
const app = (0, express_1.default)();
|
|
19
19
|
app.use((0, index_1.createSessionMiddleware)({ secret: TEST_SECRET, store: new memory_store_1.MemoryStore() }));
|
|
20
20
|
app.get('/', (_req, res) => res.sendStatus(200));
|
|
21
|
-
await (0,
|
|
21
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
22
22
|
const res = await (0, node_fetch_1.default)(url);
|
|
23
23
|
chai_1.assert.equal(res.status, 200);
|
|
24
24
|
const header = res.headers.get('set-cookie');
|
|
@@ -42,7 +42,7 @@ describe('session middleware', () => {
|
|
|
42
42
|
},
|
|
43
43
|
}));
|
|
44
44
|
app.get('/', (_req, res) => res.sendStatus(200));
|
|
45
|
-
await (0,
|
|
45
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
46
46
|
const res = await (0, node_fetch_1.default)(url);
|
|
47
47
|
chai_1.assert.equal(res.status, 200);
|
|
48
48
|
const header = res.headers.get('set-cookie');
|
|
@@ -66,7 +66,7 @@ describe('session middleware', () => {
|
|
|
66
66
|
},
|
|
67
67
|
}));
|
|
68
68
|
app.get('/', (_req, res) => res.sendStatus(200));
|
|
69
|
-
await (0,
|
|
69
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
70
70
|
const res = await (0, node_fetch_1.default)(url, {
|
|
71
71
|
headers: {
|
|
72
72
|
'X-Forwarded-Proto': 'https',
|
|
@@ -92,7 +92,7 @@ describe('session middleware', () => {
|
|
|
92
92
|
},
|
|
93
93
|
}));
|
|
94
94
|
app.get('/', (_req, res) => res.sendStatus(200));
|
|
95
|
-
await (0,
|
|
95
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
96
96
|
const res = await (0, node_fetch_1.default)(url, {
|
|
97
97
|
headers: {
|
|
98
98
|
'X-Forwarded-Proto': 'http',
|
|
@@ -114,7 +114,7 @@ describe('session middleware', () => {
|
|
|
114
114
|
},
|
|
115
115
|
}));
|
|
116
116
|
app.get('/', (_req, res) => res.sendStatus(200));
|
|
117
|
-
await (0,
|
|
117
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
118
118
|
const res = await (0, node_fetch_1.default)(url, {
|
|
119
119
|
headers: {
|
|
120
120
|
'X-Forwarded-Proto': 'https',
|
|
@@ -140,7 +140,7 @@ describe('session middleware', () => {
|
|
|
140
140
|
},
|
|
141
141
|
}));
|
|
142
142
|
app.get('/', (_req, res) => res.sendStatus(200));
|
|
143
|
-
await (0,
|
|
143
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
144
144
|
const res = await (0, node_fetch_1.default)(url, {
|
|
145
145
|
headers: {
|
|
146
146
|
'X-Forwarded-Proto': 'http',
|
|
@@ -166,7 +166,7 @@ describe('session middleware', () => {
|
|
|
166
166
|
},
|
|
167
167
|
}));
|
|
168
168
|
app.get('/', (_req, res) => res.sendStatus(200));
|
|
169
|
-
await (0,
|
|
169
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
170
170
|
const insecureRes = await (0, node_fetch_1.default)(url, {
|
|
171
171
|
headers: {
|
|
172
172
|
'X-Forwarded-Host': 'subdomain.example.com',
|
|
@@ -206,7 +206,7 @@ describe('session middleware', () => {
|
|
|
206
206
|
req.session.count += 1;
|
|
207
207
|
res.send(req.session.count.toString());
|
|
208
208
|
});
|
|
209
|
-
await (0,
|
|
209
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
210
210
|
const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
|
|
211
211
|
let res = await fetchWithCookies(url);
|
|
212
212
|
chai_1.assert.equal(res.status, 200);
|
|
@@ -229,7 +229,7 @@ describe('session middleware', () => {
|
|
|
229
229
|
app.get('/', (req, res) => {
|
|
230
230
|
res.send(req.session.test ?? 'NO VALUE');
|
|
231
231
|
});
|
|
232
|
-
await (0,
|
|
232
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
233
233
|
const res = await (0, fetch_cookie_1.default)(node_fetch_1.default)(url, {
|
|
234
234
|
method: 'POST',
|
|
235
235
|
});
|
|
@@ -250,7 +250,7 @@ describe('session middleware', () => {
|
|
|
250
250
|
await req.session.destroy();
|
|
251
251
|
res.sendStatus(200);
|
|
252
252
|
}));
|
|
253
|
-
await (0,
|
|
253
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
254
254
|
const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
|
|
255
255
|
// Generate a new session.
|
|
256
256
|
await fetchWithCookies(url);
|
|
@@ -284,7 +284,7 @@ describe('session middleware', () => {
|
|
|
284
284
|
req.session.regenerated = true;
|
|
285
285
|
res.sendStatus(200);
|
|
286
286
|
}));
|
|
287
|
-
await (0,
|
|
287
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
288
288
|
const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
|
|
289
289
|
// Generate a new session.
|
|
290
290
|
let res = await fetchWithCookies(url);
|
|
@@ -321,7 +321,7 @@ describe('session middleware', () => {
|
|
|
321
321
|
secret: TEST_SECRET,
|
|
322
322
|
}));
|
|
323
323
|
app.get('/', (req, res) => res.send(req.session.id));
|
|
324
|
-
await (0,
|
|
324
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
325
325
|
const cookieJar = new fetch_cookie_1.default.toughCookie.CookieJar();
|
|
326
326
|
const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default, cookieJar);
|
|
327
327
|
// Generate a new session.
|
|
@@ -350,7 +350,7 @@ describe('session middleware', () => {
|
|
|
350
350
|
secret: TEST_SECRET,
|
|
351
351
|
}));
|
|
352
352
|
app.get('/', (_req, res) => res.sendStatus(200));
|
|
353
|
-
await (0,
|
|
353
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
354
354
|
const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
|
|
355
355
|
// Generate a new session.
|
|
356
356
|
let res = await fetchWithCookies(url);
|
|
@@ -363,70 +363,6 @@ describe('session middleware', () => {
|
|
|
363
363
|
chai_1.assert.isNull(header);
|
|
364
364
|
});
|
|
365
365
|
});
|
|
366
|
-
it('does not set the cookie if it is not supposed to', async () => {
|
|
367
|
-
const store = new memory_store_1.MemoryStore();
|
|
368
|
-
const app = (0, express_1.default)();
|
|
369
|
-
app.enable('trust proxy');
|
|
370
|
-
app.use((0, index_1.createSessionMiddleware)({
|
|
371
|
-
store,
|
|
372
|
-
secret: TEST_SECRET,
|
|
373
|
-
canSetCookie: (req) => req.hostname === 'example.com',
|
|
374
|
-
}));
|
|
375
|
-
app.get('/', (req, res) => {
|
|
376
|
-
req.session.count ??= 0;
|
|
377
|
-
req.session.count += 1;
|
|
378
|
-
res.send(req.session.id);
|
|
379
|
-
});
|
|
380
|
-
await (0, test_utils_1.withServer)(app, async ({ url }) => {
|
|
381
|
-
const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
|
|
382
|
-
// Fetch from a subdomain.
|
|
383
|
-
let res = await fetchWithCookies(url, {
|
|
384
|
-
headers: {
|
|
385
|
-
'X-Forwarded-Host': 'subdomain.example.com',
|
|
386
|
-
},
|
|
387
|
-
});
|
|
388
|
-
chai_1.assert.equal(res.status, 200);
|
|
389
|
-
// There should not be a cookie.
|
|
390
|
-
chai_1.assert.isNull(res.headers.get('set-cookie'));
|
|
391
|
-
// Since the cookie wasn't set, the session should not have been persisted
|
|
392
|
-
// to the store.
|
|
393
|
-
const originalSessionId = await res.text();
|
|
394
|
-
chai_1.assert.isNull(await store.get(originalSessionId));
|
|
395
|
-
// Now fetch from the correct domain.
|
|
396
|
-
res = await fetchWithCookies(url, {
|
|
397
|
-
headers: {
|
|
398
|
-
'X-Forwarded-Host': 'example.com',
|
|
399
|
-
},
|
|
400
|
-
});
|
|
401
|
-
chai_1.assert.equal(res.status, 200);
|
|
402
|
-
// There should be a cookie for this request.
|
|
403
|
-
const header = res.headers.get('set-cookie');
|
|
404
|
-
chai_1.assert.isNotNull(header);
|
|
405
|
-
const cookies = (0, set_cookie_parser_1.parse)(header ?? '');
|
|
406
|
-
chai_1.assert.equal(cookies.length, 1);
|
|
407
|
-
chai_1.assert.equal(cookies[0].name, 'session');
|
|
408
|
-
// The session should have been persisted.
|
|
409
|
-
const newSessionId = await res.text();
|
|
410
|
-
let session = await store.get(newSessionId);
|
|
411
|
-
chai_1.assert.isNotNull(session);
|
|
412
|
-
chai_1.assert.equal(session?.data.count, 1);
|
|
413
|
-
// Now, fetch from the subdomain again. This time, the session should
|
|
414
|
-
// work as normal.
|
|
415
|
-
res = await fetchWithCookies(url, {
|
|
416
|
-
headers: {
|
|
417
|
-
'X-Forwarded-Host': 'subdomain.example.com',
|
|
418
|
-
},
|
|
419
|
-
});
|
|
420
|
-
chai_1.assert.equal(res.status, 200);
|
|
421
|
-
chai_1.assert.equal(await res.text(), newSessionId);
|
|
422
|
-
// Ensure that there was still no Set-Cookie header.
|
|
423
|
-
chai_1.assert.isNull(res.headers.get('set-cookie'));
|
|
424
|
-
// Ensure that the session was persisted.
|
|
425
|
-
session = await store.get(newSessionId);
|
|
426
|
-
chai_1.assert.isNotNull(session);
|
|
427
|
-
chai_1.assert.equal(session?.data.count, 2);
|
|
428
|
-
});
|
|
429
|
-
});
|
|
430
366
|
it('extends the expiration date of the cookie', async () => {
|
|
431
367
|
const store = new memory_store_1.MemoryStore();
|
|
432
368
|
const app = (0, express_1.default)();
|
|
@@ -442,7 +378,7 @@ describe('session middleware', () => {
|
|
|
442
378
|
req.session.setExpiration(Date.now() + 10000);
|
|
443
379
|
res.sendStatus(200);
|
|
444
380
|
});
|
|
445
|
-
await (0,
|
|
381
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
446
382
|
const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
|
|
447
383
|
// Generate a new session.
|
|
448
384
|
let res = await fetchWithCookies(url);
|
|
@@ -495,7 +431,7 @@ describe('session middleware', () => {
|
|
|
495
431
|
secret: TEST_SECRET,
|
|
496
432
|
}));
|
|
497
433
|
app.get('/', (_req, res) => res.sendStatus(200));
|
|
498
|
-
await (0,
|
|
434
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
499
435
|
const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
|
|
500
436
|
// Generate a new session.
|
|
501
437
|
let res = await fetchWithCookies(url);
|
|
@@ -533,13 +469,13 @@ describe('session middleware', () => {
|
|
|
533
469
|
}));
|
|
534
470
|
app.get('/', (req, res) => res.send(req.session.id.toString()));
|
|
535
471
|
let legacySessionId = null;
|
|
536
|
-
await (0,
|
|
472
|
+
await (0, express_test_utils_1.withServer)(legacyApp, async ({ url }) => {
|
|
537
473
|
// Generate a legacy session.
|
|
538
474
|
const res = await fetchWithCookies(url);
|
|
539
475
|
chai_1.assert.equal(res.status, 200);
|
|
540
476
|
legacySessionId = await res.text();
|
|
541
477
|
});
|
|
542
|
-
await (0,
|
|
478
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
543
479
|
const res = await fetchWithCookies(url);
|
|
544
480
|
chai_1.assert.equal(res.status, 200);
|
|
545
481
|
const newSessionId = await res.text();
|
|
@@ -553,5 +489,22 @@ describe('session middleware', () => {
|
|
|
553
489
|
chai_1.assert.equal(newSessionId, legacySessionId);
|
|
554
490
|
});
|
|
555
491
|
});
|
|
492
|
+
it('persists the session immediately after creation', async () => {
|
|
493
|
+
const store = new memory_store_1.MemoryStore();
|
|
494
|
+
const app = (0, express_1.default)();
|
|
495
|
+
app.use((0, index_1.createSessionMiddleware)({
|
|
496
|
+
store,
|
|
497
|
+
secret: TEST_SECRET,
|
|
498
|
+
}));
|
|
499
|
+
app.get('/', (0, express_async_handler_1.default)(async (req, res) => {
|
|
500
|
+
const persistedSession = await store.get(req.session.id);
|
|
501
|
+
res.status(persistedSession == null ? 500 : 200).send();
|
|
502
|
+
}));
|
|
503
|
+
await (0, express_test_utils_1.withServer)(app, async ({ url }) => {
|
|
504
|
+
const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
|
|
505
|
+
const res = await fetchWithCookies(url);
|
|
506
|
+
chai_1.assert.equal(res.status, 200);
|
|
507
|
+
});
|
|
508
|
+
});
|
|
556
509
|
});
|
|
557
510
|
//# sourceMappingURL=index.test.js.map
|
package/dist/index.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts
CHANGED
|
@@ -12,3 +12,4 @@ export declare function generateSessionId(): Promise<string>;
|
|
|
12
12
|
export declare function loadSession(sessionId: string, req: Request, store: SessionStore, maxAge: number): Promise<Session>;
|
|
13
13
|
export declare function makeSession(sessionId: string, req: Request, store: SessionStore, expirationDate: Date | null, maxAge: number): Session;
|
|
14
14
|
export declare function hashSession(session: Session): string;
|
|
15
|
+
export declare function truncateExpirationDate(date: Date): Date;
|
package/dist/session.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.hashSession = exports.makeSession = exports.loadSession = exports.generateSessionId = void 0;
|
|
6
|
+
exports.truncateExpirationDate = exports.hashSession = exports.makeSession = exports.loadSession = exports.generateSessionId = void 0;
|
|
7
7
|
const uid_safe_1 = __importDefault(require("uid-safe"));
|
|
8
8
|
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
9
9
|
async function generateSessionId() {
|
|
@@ -14,6 +14,15 @@ async function loadSession(sessionId, req, store, maxAge) {
|
|
|
14
14
|
const sessionStoreData = await store.get(sessionId);
|
|
15
15
|
const expiresAt = sessionStoreData?.expiresAt ?? null;
|
|
16
16
|
const session = makeSession(sessionId, req, store, expiresAt, maxAge);
|
|
17
|
+
if (sessionStoreData == null) {
|
|
18
|
+
// Immediately persis the new session to the store so that it's assigned
|
|
19
|
+
// an ID and available to query later on in the same request.
|
|
20
|
+
await store.set(sessionId, session,
|
|
21
|
+
// Cookies only support second-level resolution. To ensure consistency
|
|
22
|
+
// between the cookie and the store, truncate the expiration date to
|
|
23
|
+
// the nearest second.
|
|
24
|
+
truncateExpirationDate(session.getExpirationDate()));
|
|
25
|
+
}
|
|
17
26
|
// Copy session data into the session object.
|
|
18
27
|
if (sessionStoreData != null) {
|
|
19
28
|
const { data } = sessionStoreData;
|
|
@@ -56,14 +65,7 @@ function makeSession(sessionId, req, store, expirationDate, maxAge) {
|
|
|
56
65
|
}
|
|
57
66
|
exports.makeSession = makeSession;
|
|
58
67
|
function hashSession(session) {
|
|
59
|
-
const str = JSON.stringify(session
|
|
60
|
-
// ignore cookie property on the root object
|
|
61
|
-
if (this === session && key === 'cookie') {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
return val;
|
|
65
|
-
});
|
|
66
|
-
// hash
|
|
68
|
+
const str = JSON.stringify(session);
|
|
67
69
|
return node_crypto_1.default.createHash('sha1').update(str, 'utf8').digest('hex');
|
|
68
70
|
}
|
|
69
71
|
exports.hashSession = hashSession;
|
|
@@ -75,4 +77,10 @@ function defineStaticProperty(obj, name, fn) {
|
|
|
75
77
|
value: fn,
|
|
76
78
|
});
|
|
77
79
|
}
|
|
80
|
+
function truncateExpirationDate(date) {
|
|
81
|
+
const time = date.getTime();
|
|
82
|
+
const truncatedTime = Math.floor(time / 1000) * 1000;
|
|
83
|
+
return new Date(truncatedTime);
|
|
84
|
+
}
|
|
85
|
+
exports.truncateExpirationDate = truncateExpirationDate;
|
|
78
86
|
//# sourceMappingURL=session.js.map
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":";;;;;;AACA,wDAA2B;AAC3B,8DAAiC;AAa1B,KAAK,UAAU,iBAAiB;IACrC,OAAO,MAAM,IAAA,kBAAG,EAAC,EAAE,CAAC,CAAC;AACvB,CAAC;AAFD,8CAEC;AAEM,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,GAAY,EACZ,KAAmB,EACnB,MAAc;IAEd,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,gBAAgB,EAAE,SAAS,IAAI,IAAI,CAAC;IAEtD,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAEtE,6CAA6C;IAC7C,IAAI,gBAAgB,IAAI,IAAI,EAAE;QAC5B,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;YACvB,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE;gBACtB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;aAC5B;SACF;KACF;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
package/dist/session.test.js
CHANGED
|
@@ -80,13 +80,5 @@ describe('session', () => {
|
|
|
80
80
|
chai_1.assert.isNull(await store.get('123'));
|
|
81
81
|
});
|
|
82
82
|
});
|
|
83
|
-
describe('hashSession', () => {
|
|
84
|
-
it('ignores the cookie property', () => {
|
|
85
|
-
const hash1 = (0, session_1.hashSession)({ id: '123' });
|
|
86
|
-
const hash2 = (0, session_1.hashSession)({ id: '123', cookie: { foo: 'bar' } });
|
|
87
|
-
chai_1.assert.equal(hash1, hash2);
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
it('has cookie property', () => { });
|
|
91
83
|
});
|
|
92
84
|
//# sourceMappingURL=session.test.js.map
|
package/dist/session.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.test.js","sourceRoot":"","sources":["../src/session.test.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAE9B,iDAA6C;AAC7C,
|
|
1
|
+
{"version":3,"file":"session.test.js","sourceRoot":"","sources":["../src/session.test.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAE9B,iDAA6C;AAC7C,uCAAqD;AAErD,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,uBAAuB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC,CAAC;AAEvE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,KAAK,GAAG,IAAI,0BAAW,EAAE,CAAC;YAEhC,MAAM,GAAG,GAAG,EAAS,CAAC;YACtB,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAW,EAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;YAEtE,aAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,KAAK,GAAG,IAAI,0BAAW,EAAE,CAAC;YAChC,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,uBAAuB,CAAC,CAAC;YAEhE,MAAM,GAAG,GAAG,EAAS,CAAC;YACtB,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAW,EAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;YAEtE,aAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAChC,aAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,KAAK,GAAG,IAAI,0BAAW,EAAE,CAAC;YAChC,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,uBAAuB,CAAC,CAAC;YAE3E,MAAM,GAAG,GAAG,EAAS,CAAC;YACtB,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAW,EAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;YAEtE,aAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAChC,aAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,KAAK,GAAG,IAAI,0BAAW,EAAE,CAAC;YAEhC,MAAM,GAAG,GAAG,EAAS,CAAC;YACtB,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,uBAAuB,EAAE,eAAe,CAAC,CAAC;YAEzF,aAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAEhC,MAAM,UAAU,GAAG,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;YACxC,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC;YAE9C,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC;YACrB,CAAC,CAAC,CAAC;YAEH,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,OAAO,CAAC,OAAO,GAAG,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;YAEH,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,OAAO,CAAC,UAAU,GAAG,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,aAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACrC,aAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YAC/C,aAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,KAAK,GAAG,IAAI,0BAAW,EAAE,CAAC;YAEhC,MAAM,GAAG,GAAG,EAAS,CAAC;YACtB,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,uBAAuB,EAAE,eAAe,CAAC,CAAC;YAEzF,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,OAAO,CAAC,OAAO,GAAG,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;YAClC,MAAM,KAAK,GAAG,IAAI,0BAAW,EAAE,CAAC;YAEhC,MAAM,GAAG,GAAG,EAAS,CAAC;YACtB,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,uBAAuB,EAAE,eAAe,CAAC,CAAC;YACzF,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;YAEtB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAExB,aAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,aAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,KAAK,GAAG,IAAI,0BAAW,EAAE,CAAC;YAEhC,MAAM,GAAG,GAAG,EAAS,CAAC;YACtB,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,uBAAuB,EAAE,eAAe,CAAC,CAAC;YACzF,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;YAEtB,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAE3B,aAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtC,aAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACvC,aAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/session",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"test": "nyc --reporter=html --reporter=text mocha --no-config --require ts-node/register --watch-files src/ src/**/*.test.ts"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
+
"@types/express": "^4.17.20",
|
|
16
17
|
"cookie": "^0.5.0",
|
|
17
18
|
"cookie-signature": "^1.2.1",
|
|
18
19
|
"express-async-handler": "^1.2.0",
|
|
@@ -21,11 +22,11 @@
|
|
|
21
22
|
"uid-safe": "^2.1.5"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
25
|
+
"@prairielearn/express-test-utils": "^1.0.0",
|
|
24
26
|
"@prairielearn/tsconfig": "^0.0.0",
|
|
25
27
|
"@types/chai": "^4.3.9",
|
|
26
28
|
"@types/cookie": "^0.5.3",
|
|
27
29
|
"@types/cookie-signature": "^1.1.1",
|
|
28
|
-
"@types/express": "^4.17.20",
|
|
29
30
|
"@types/node": "^18.18.8",
|
|
30
31
|
"@types/node-fetch": "^2.6.8",
|
|
31
32
|
"@types/on-headers": "^1.0.2",
|
package/src/before-end.test.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import express, { type Request, type Response, type NextFunction } from 'express';
|
|
2
2
|
import fetch from 'node-fetch';
|
|
3
3
|
import { assert } from 'chai';
|
|
4
|
+
import { withServer } from '@prairielearn/express-test-utils';
|
|
4
5
|
|
|
5
6
|
import { beforeEnd } from './before-end';
|
|
6
|
-
import { withServer } from './test-utils';
|
|
7
7
|
|
|
8
8
|
describe('beforeEnd', () => {
|
|
9
9
|
it('handles errors correctly', async () => {
|
package/src/index.test.ts
CHANGED
|
@@ -4,10 +4,10 @@ import fetch from 'node-fetch';
|
|
|
4
4
|
import fetchCookie from 'fetch-cookie';
|
|
5
5
|
import { parse as parseSetCookie } from 'set-cookie-parser';
|
|
6
6
|
import asyncHandler from 'express-async-handler';
|
|
7
|
+
import { withServer } from '@prairielearn/express-test-utils';
|
|
7
8
|
|
|
8
9
|
import { createSessionMiddleware } from './index';
|
|
9
10
|
import { MemoryStore } from './memory-store';
|
|
10
|
-
import { withServer } from './test-utils';
|
|
11
11
|
|
|
12
12
|
const TEST_SECRET = 'test-secret';
|
|
13
13
|
|
|
@@ -449,85 +449,6 @@ describe('session middleware', () => {
|
|
|
449
449
|
});
|
|
450
450
|
});
|
|
451
451
|
|
|
452
|
-
it('does not set the cookie if it is not supposed to', async () => {
|
|
453
|
-
const store = new MemoryStore();
|
|
454
|
-
|
|
455
|
-
const app = express();
|
|
456
|
-
app.enable('trust proxy');
|
|
457
|
-
app.use(
|
|
458
|
-
createSessionMiddleware({
|
|
459
|
-
store,
|
|
460
|
-
secret: TEST_SECRET,
|
|
461
|
-
canSetCookie: (req) => req.hostname === 'example.com',
|
|
462
|
-
}),
|
|
463
|
-
);
|
|
464
|
-
app.get('/', (req, res) => {
|
|
465
|
-
req.session.count ??= 0;
|
|
466
|
-
req.session.count += 1;
|
|
467
|
-
|
|
468
|
-
res.send(req.session.id);
|
|
469
|
-
});
|
|
470
|
-
|
|
471
|
-
await withServer(app, async ({ url }) => {
|
|
472
|
-
const fetchWithCookies = fetchCookie(fetch);
|
|
473
|
-
|
|
474
|
-
// Fetch from a subdomain.
|
|
475
|
-
let res = await fetchWithCookies(url, {
|
|
476
|
-
headers: {
|
|
477
|
-
'X-Forwarded-Host': 'subdomain.example.com',
|
|
478
|
-
},
|
|
479
|
-
});
|
|
480
|
-
assert.equal(res.status, 200);
|
|
481
|
-
|
|
482
|
-
// There should not be a cookie.
|
|
483
|
-
assert.isNull(res.headers.get('set-cookie'));
|
|
484
|
-
|
|
485
|
-
// Since the cookie wasn't set, the session should not have been persisted
|
|
486
|
-
// to the store.
|
|
487
|
-
const originalSessionId = await res.text();
|
|
488
|
-
assert.isNull(await store.get(originalSessionId));
|
|
489
|
-
|
|
490
|
-
// Now fetch from the correct domain.
|
|
491
|
-
res = await fetchWithCookies(url, {
|
|
492
|
-
headers: {
|
|
493
|
-
'X-Forwarded-Host': 'example.com',
|
|
494
|
-
},
|
|
495
|
-
});
|
|
496
|
-
assert.equal(res.status, 200);
|
|
497
|
-
|
|
498
|
-
// There should be a cookie for this request.
|
|
499
|
-
const header = res.headers.get('set-cookie');
|
|
500
|
-
assert.isNotNull(header);
|
|
501
|
-
const cookies = parseSetCookie(header ?? '');
|
|
502
|
-
assert.equal(cookies.length, 1);
|
|
503
|
-
assert.equal(cookies[0].name, 'session');
|
|
504
|
-
|
|
505
|
-
// The session should have been persisted.
|
|
506
|
-
const newSessionId = await res.text();
|
|
507
|
-
let session = await store.get(newSessionId);
|
|
508
|
-
assert.isNotNull(session);
|
|
509
|
-
assert.equal(session?.data.count, 1);
|
|
510
|
-
|
|
511
|
-
// Now, fetch from the subdomain again. This time, the session should
|
|
512
|
-
// work as normal.
|
|
513
|
-
res = await fetchWithCookies(url, {
|
|
514
|
-
headers: {
|
|
515
|
-
'X-Forwarded-Host': 'subdomain.example.com',
|
|
516
|
-
},
|
|
517
|
-
});
|
|
518
|
-
assert.equal(res.status, 200);
|
|
519
|
-
assert.equal(await res.text(), newSessionId);
|
|
520
|
-
|
|
521
|
-
// Ensure that there was still no Set-Cookie header.
|
|
522
|
-
assert.isNull(res.headers.get('set-cookie'));
|
|
523
|
-
|
|
524
|
-
// Ensure that the session was persisted.
|
|
525
|
-
session = await store.get(newSessionId);
|
|
526
|
-
assert.isNotNull(session);
|
|
527
|
-
assert.equal(session?.data.count, 2);
|
|
528
|
-
});
|
|
529
|
-
});
|
|
530
|
-
|
|
531
452
|
it('extends the expiration date of the cookie', async () => {
|
|
532
453
|
const store = new MemoryStore();
|
|
533
454
|
|
|
@@ -690,4 +611,30 @@ describe('session middleware', () => {
|
|
|
690
611
|
assert.equal(newSessionId, legacySessionId);
|
|
691
612
|
});
|
|
692
613
|
});
|
|
614
|
+
|
|
615
|
+
it('persists the session immediately after creation', async () => {
|
|
616
|
+
const store = new MemoryStore();
|
|
617
|
+
|
|
618
|
+
const app = express();
|
|
619
|
+
app.use(
|
|
620
|
+
createSessionMiddleware({
|
|
621
|
+
store,
|
|
622
|
+
secret: TEST_SECRET,
|
|
623
|
+
}),
|
|
624
|
+
);
|
|
625
|
+
app.get(
|
|
626
|
+
'/',
|
|
627
|
+
asyncHandler(async (req, res) => {
|
|
628
|
+
const persistedSession = await store.get(req.session.id);
|
|
629
|
+
res.status(persistedSession == null ? 500 : 200).send();
|
|
630
|
+
}),
|
|
631
|
+
);
|
|
632
|
+
|
|
633
|
+
await withServer(app, async ({ url }) => {
|
|
634
|
+
const fetchWithCookies = fetchCookie(fetch);
|
|
635
|
+
|
|
636
|
+
const res = await fetchWithCookies(url);
|
|
637
|
+
assert.equal(res.status, 200);
|
|
638
|
+
});
|
|
639
|
+
});
|
|
693
640
|
});
|
package/src/index.ts
CHANGED
|
@@ -11,7 +11,13 @@ import {
|
|
|
11
11
|
getSessionCookie,
|
|
12
12
|
getSessionIdFromCookie,
|
|
13
13
|
} from './cookie';
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
type Session,
|
|
16
|
+
generateSessionId,
|
|
17
|
+
loadSession,
|
|
18
|
+
hashSession,
|
|
19
|
+
truncateExpirationDate,
|
|
20
|
+
} from './session';
|
|
15
21
|
|
|
16
22
|
declare global {
|
|
17
23
|
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
@@ -25,7 +31,6 @@ declare global {
|
|
|
25
31
|
export interface SessionOptions {
|
|
26
32
|
secret: string | string[];
|
|
27
33
|
store: SessionStore;
|
|
28
|
-
canSetCookie?: (req: Request) => boolean;
|
|
29
34
|
cookie?: {
|
|
30
35
|
/**
|
|
31
36
|
* If multiple names are provided, the first one is used as the primary
|
|
@@ -67,8 +72,6 @@ export function createSessionMiddleware(options: SessionOptions) {
|
|
|
67
72
|
const originalHash = hashSession(req.session);
|
|
68
73
|
const originalExpirationDate = req.session.getExpirationDate();
|
|
69
74
|
|
|
70
|
-
const canSetCookie = options.canSetCookie?.(req) ?? true;
|
|
71
|
-
|
|
72
75
|
onHeaders(res, () => {
|
|
73
76
|
if (!req.session) {
|
|
74
77
|
if (cookieSessionId) {
|
|
@@ -97,7 +100,7 @@ export function createSessionMiddleware(options: SessionOptions) {
|
|
|
97
100
|
const isNewSession = !cookieSessionId || cookieSessionId !== req.session.id;
|
|
98
101
|
const didExpirationChange =
|
|
99
102
|
originalExpirationDate.getTime() !== req.session.getExpirationDate().getTime();
|
|
100
|
-
if (
|
|
103
|
+
if (isNewSession || didExpirationChange || needsRotation) {
|
|
101
104
|
const signedSessionId = signSessionId(req.session.id, secrets[0]);
|
|
102
105
|
res.cookie(primaryCookieName, signedSessionId, {
|
|
103
106
|
secure: secureCookie,
|
|
@@ -109,37 +112,58 @@ export function createSessionMiddleware(options: SessionOptions) {
|
|
|
109
112
|
}
|
|
110
113
|
});
|
|
111
114
|
|
|
112
|
-
|
|
113
|
-
|
|
115
|
+
let sessionPersisted = false;
|
|
116
|
+
|
|
117
|
+
async function persistSession(req: Request) {
|
|
118
|
+
if (!req.session || sessionPersisted) {
|
|
114
119
|
// There is no session to do anything with.
|
|
115
120
|
return;
|
|
116
121
|
}
|
|
117
122
|
|
|
118
|
-
|
|
123
|
+
sessionPersisted = true;
|
|
124
|
+
|
|
125
|
+
// If this is a new session, we would have already persisted it to the
|
|
126
|
+
// store, so we don't need to take that into consideration here.
|
|
127
|
+
//
|
|
128
|
+
// If the hash of the session data changed, we'll unconditionally persist
|
|
129
|
+
// the updated data to the store. However, if the hash didn't change, we
|
|
130
|
+
// only want to persist it if the expiration changed *and* if we can set
|
|
131
|
+
// a cookie to reflect the updated expiration date.
|
|
119
132
|
const hashChanged = hashSession(req.session) !== originalHash;
|
|
120
|
-
const
|
|
133
|
+
const expirationChanged =
|
|
121
134
|
originalExpirationDate.getTime() !== req.session.getExpirationDate().getTime();
|
|
122
|
-
if (
|
|
123
|
-
(hashChanged && isExistingSession) ||
|
|
124
|
-
(canSetCookie && (!isExistingSession || didExpirationChange))
|
|
125
|
-
) {
|
|
126
|
-
// Only update the expiration date in the store if we were actually
|
|
127
|
-
// able to update the cookie too.
|
|
128
|
-
const expirationDate = canSetCookie
|
|
129
|
-
? req.session.getExpirationDate()
|
|
130
|
-
: originalExpirationDate;
|
|
131
|
-
|
|
135
|
+
if (hashChanged || expirationChanged) {
|
|
132
136
|
await store.set(
|
|
133
137
|
req.session.id,
|
|
134
138
|
req.session,
|
|
135
139
|
// Cookies only support second-level resolution. To ensure consistency
|
|
136
140
|
// between the cookie and the store, truncate the expiration date to
|
|
137
141
|
// the nearest second.
|
|
138
|
-
truncateExpirationDate(
|
|
142
|
+
truncateExpirationDate(req.session.getExpirationDate()),
|
|
139
143
|
);
|
|
140
144
|
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// We'll attempt to persist the session at the end of the request. This
|
|
148
|
+
// hacky strategy is borrowed from `express-session`.
|
|
149
|
+
beforeEnd(res, next, async () => {
|
|
150
|
+
await persistSession(req);
|
|
141
151
|
});
|
|
142
152
|
|
|
153
|
+
// We'll also attempt to persist the session before performing a redirect.
|
|
154
|
+
// This is necessary because browsers and `fetch()` implementations aren't
|
|
155
|
+
// required to wait for a response body to be received before following a
|
|
156
|
+
// redirect. So, we need to make sure that the session is persisted before
|
|
157
|
+
// we send the redirect response. This way, the subsequent GET will be able
|
|
158
|
+
// to load the latest session data.
|
|
159
|
+
const originalRedirect = res.redirect as any;
|
|
160
|
+
res.redirect = function redirect(...args: any[]) {
|
|
161
|
+
persistSession(req).then(
|
|
162
|
+
() => originalRedirect.apply(res, args),
|
|
163
|
+
(err) => next(err),
|
|
164
|
+
);
|
|
165
|
+
};
|
|
166
|
+
|
|
143
167
|
next();
|
|
144
168
|
});
|
|
145
169
|
}
|
|
@@ -159,9 +183,3 @@ function getCookieNames(cookieName: string | string[] | undefined): string[] {
|
|
|
159
183
|
function signSessionId(sessionId: string, secret: string): string {
|
|
160
184
|
return signature.sign(sessionId, secret);
|
|
161
185
|
}
|
|
162
|
-
|
|
163
|
-
function truncateExpirationDate(date: Date) {
|
|
164
|
-
const time = date.getTime();
|
|
165
|
-
const truncatedTime = Math.floor(time / 1000) * 1000;
|
|
166
|
-
return new Date(truncatedTime);
|
|
167
|
-
}
|
package/src/session.test.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { assert } from 'chai';
|
|
2
2
|
|
|
3
3
|
import { MemoryStore } from './memory-store';
|
|
4
|
-
import {
|
|
4
|
+
import { loadSession, makeSession } from './session';
|
|
5
5
|
|
|
6
6
|
const SESSION_MAX_AGE = 10000;
|
|
7
7
|
const SESSION_EXPIRATION_DATE = new Date(Date.now() + SESSION_MAX_AGE);
|
|
@@ -108,15 +108,4 @@ describe('session', () => {
|
|
|
108
108
|
assert.isNull(await store.get('123'));
|
|
109
109
|
});
|
|
110
110
|
});
|
|
111
|
-
|
|
112
|
-
describe('hashSession', () => {
|
|
113
|
-
it('ignores the cookie property', () => {
|
|
114
|
-
const hash1 = hashSession({ id: '123' } as any);
|
|
115
|
-
const hash2 = hashSession({ id: '123', cookie: { foo: 'bar' } } as any);
|
|
116
|
-
|
|
117
|
-
assert.equal(hash1, hash2);
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('has cookie property', () => {});
|
|
122
111
|
});
|
package/src/session.ts
CHANGED
|
@@ -28,6 +28,19 @@ export async function loadSession(
|
|
|
28
28
|
|
|
29
29
|
const session = makeSession(sessionId, req, store, expiresAt, maxAge);
|
|
30
30
|
|
|
31
|
+
if (sessionStoreData == null) {
|
|
32
|
+
// Immediately persis the new session to the store so that it's assigned
|
|
33
|
+
// an ID and available to query later on in the same request.
|
|
34
|
+
await store.set(
|
|
35
|
+
sessionId,
|
|
36
|
+
session,
|
|
37
|
+
// Cookies only support second-level resolution. To ensure consistency
|
|
38
|
+
// between the cookie and the store, truncate the expiration date to
|
|
39
|
+
// the nearest second.
|
|
40
|
+
truncateExpirationDate(session.getExpirationDate()),
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
31
44
|
// Copy session data into the session object.
|
|
32
45
|
if (sessionStoreData != null) {
|
|
33
46
|
const { data } = sessionStoreData;
|
|
@@ -83,16 +96,7 @@ export function makeSession(
|
|
|
83
96
|
}
|
|
84
97
|
|
|
85
98
|
export function hashSession(session: Session): string {
|
|
86
|
-
const str = JSON.stringify(session
|
|
87
|
-
// ignore cookie property on the root object
|
|
88
|
-
if (this === session && key === 'cookie') {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return val;
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
// hash
|
|
99
|
+
const str = JSON.stringify(session);
|
|
96
100
|
return crypto.createHash('sha1').update(str, 'utf8').digest('hex');
|
|
97
101
|
}
|
|
98
102
|
|
|
@@ -104,3 +108,9 @@ function defineStaticProperty<T>(obj: object, name: string, fn: T) {
|
|
|
104
108
|
value: fn,
|
|
105
109
|
});
|
|
106
110
|
}
|
|
111
|
+
|
|
112
|
+
export function truncateExpirationDate(date: Date) {
|
|
113
|
+
const time = date.getTime();
|
|
114
|
+
const truncatedTime = Math.floor(time / 1000) * 1000;
|
|
115
|
+
return new Date(truncatedTime);
|
|
116
|
+
}
|