Skip to content

Commit bcad898

Browse files
committed
Fix issue where "resave: false" may not save altered sessions
1 parent a640281 commit bcad898

4 files changed

Lines changed: 35 additions & 14 deletions

File tree

HISTORY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
unreleased
22
==========
33

4+
* Fix issue where `resave: false` may not save altered sessions
45
* Use `safe-buffer` for improved Buffer API
56
* Use `Set-Cookie` as cookie header name for compatibility
6-
* deps: crc@3.5.0
77
* deps: depd@~1.1.2
88
- perf: remove argument reassignment
99

index.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
var Buffer = require('safe-buffer').Buffer
1717
var cookie = require('cookie');
18-
var crc = require('crc').crc32;
18+
var crypto = require('crypto')
1919
var debug = require('debug')('express-session');
2020
var deprecate = require('depd')('express-session');
2121
var onHeaders = require('on-headers')
@@ -578,14 +578,21 @@ function getcookie(req, name, secrets) {
578578
*/
579579

580580
function hash(sess) {
581-
return crc(JSON.stringify(sess, function (key, val) {
581+
// serialize
582+
var str = JSON.stringify(sess, function (key, val) {
582583
// ignore sess.cookie property
583584
if (this === sess && key === 'cookie') {
584585
return
585586
}
586587

587588
return val
588-
}))
589+
})
590+
591+
// hash
592+
return crypto
593+
.createHash('sha1')
594+
.update(str, 'utf8')
595+
.digest('hex')
589596
}
590597

591598
/**

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
"dependencies": {
1313
"cookie": "0.3.1",
1414
"cookie-signature": "1.0.6",
15-
"crc": "3.5.0",
1615
"debug": "2.6.9",
1716
"depd": "~1.1.2",
1817
"on-headers": "~1.0.1",

test/session.js

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,22 +1038,37 @@ describe('session()', function(){
10381038

10391039
it('should still save modified session', function (done) {
10401040
var store = new session.MemoryStore()
1041-
var server = createServer({ store: store, resave: false }, function (req, res) {
1042-
req.session.count = req.session.count || 0
1043-
req.session.count++
1044-
res.end()
1041+
var server = createServer({ resave: false, store: store }, function (req, res) {
1042+
if (req.method === 'PUT') {
1043+
req.session.token = req.url.substr(1)
1044+
}
1045+
res.end('token=' + (req.session.token || ''))
10451046
})
10461047

10471048
request(server)
1048-
.get('/')
1049+
.put('/w6RHhwaA')
1050+
.expect(200)
10491051
.expect(shouldSetSessionInStore(store))
1050-
.expect(200, function (err, res) {
1052+
.expect('token=w6RHhwaA')
1053+
.end(function (err, res) {
10511054
if (err) return done(err)
1055+
var sess = cookie(res)
10521056
request(server)
10531057
.get('/')
1054-
.set('Cookie', cookie(res))
1055-
.expect(shouldSetSessionInStore(store))
1056-
.expect(200, done)
1058+
.set('Cookie', sess)
1059+
.expect(200)
1060+
.expect(shouldNotSetSessionInStore(store))
1061+
.expect('token=w6RHhwaA')
1062+
.end(function (err) {
1063+
if (err) return done(err)
1064+
request(server)
1065+
.put('/zfQ3rzM3')
1066+
.set('Cookie', sess)
1067+
.expect(200)
1068+
.expect(shouldSetSessionInStore(store))
1069+
.expect('token=zfQ3rzM3')
1070+
.end(done)
1071+
})
10571072
})
10581073
})
10591074

0 commit comments

Comments
 (0)