Skip to content
This repository was archived by the owner on Apr 3, 2019. It is now read-only.

Commit 0f816cb

Browse files
rfkvladikoff
authored andcommitted
fix(security-events): Correctly handle tokenless security events in mem backend (#215) r=vladikoff,seanmonstar,philbooth
1 parent 65f6d78 commit 0f816cb

File tree

2 files changed

+33
-21
lines changed

2 files changed

+33
-21
lines changed

fxa-auth-db-server/test/backend/db_tests.js

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,6 +1585,7 @@ module.exports = function(config, DB) {
15851585

15861586
var evA = 'account.login'
15871587
var evB = 'account.create'
1588+
var evC = 'account.reset'
15881589

15891590
var sessionId1 = hex32()
15901591
var sessionId2 = hex32()
@@ -1635,38 +1636,49 @@ module.exports = function(config, DB) {
16351636
createSession(sessionId2, session2),
16361637
createSession(sessionId3, session3)
16371638
])
1639+
// Don't paralleize these, the order of them matters
1640+
// because they record timestamps in the db.
16381641
.then(function () {
1639-
return P.all([
1640-
insert(uid1, addr1, evB, sessionId1),
1641-
insert(uid1, addr1, evA, sessionId2),
1642-
insert(uid1, addr2, evA, sessionId3),
1643-
insert(uid2, addr1, evA, hex32())
1644-
])
1642+
return insert(uid1, addr1, evA, sessionId2).then(P.delay.bind(P, 1))
1643+
})
1644+
.then(function () {
1645+
return insert(uid1, addr1, evB, sessionId1).then(P.delay.bind(P, 1))
1646+
})
1647+
.then(function () {
1648+
return insert(uid1, addr1, evC).then(P.delay.bind(P, 1))
1649+
})
1650+
.then(function () {
1651+
return insert(uid1, addr2, evA, sessionId3).then(P.delay.bind(P, 1))
1652+
})
1653+
.then(function () {
1654+
return insert(uid2, addr1, evA, hex32())
16451655
})
16461656
},
16471657

16481658
testGetEvent: query(
16491659
uid1, addr1,
16501660
function (results) {
1651-
t.equal(results.length, 2, 'two events for uid and addr')
1652-
// order may differ depending on which query finishes first
1653-
var a = results[1].name === evA ? 1 : 0
1654-
var b = Number(!a)
1655-
t.equal(results[b].name, evB, 'correct event name')
1656-
t.equal(!!results[b].verified, false, 'first session is not verified yet')
1657-
t.ok(results[b].createdAt < Date.now(), 'createdAt is set')
1658-
t.equal(results[a].name, evA, 'correct event name')
1659-
t.equal(!!results[a].verified, true, 'second session is verified')
1660-
t.ok(results[a].createdAt < Date.now(), 'createdAt is set')
1661+
t.equal(results.length, 3, 'three events for uid and addr')
1662+
// The most recent event is returned first.
1663+
t.equal(results[0].name, evC, 'correct event name')
1664+
t.equal(!!results[0].verified, true, 'event without a session is already verified')
1665+
t.ok(results[0].createdAt < Date.now(), 'createdAt is set')
1666+
t.equal(results[1].name, evB, 'correct event name')
1667+
t.equal(!!results[1].verified, false, 'second session is not verified yet')
1668+
t.ok(results[1].createdAt < results[0].createdAt, 'createdAt is lower than previous event')
1669+
t.equal(results[2].name, evA, 'correct event name')
1670+
t.equal(!!results[2].verified, true, 'first session is already verified')
1671+
t.ok(results[2].createdAt < results[1].createdAt, 'createdAt is lower than previous event')
16611672
}
16621673
),
16631674

16641675
testGetEventAfterSessionVerified: function () {
16651676
return verifySession(session1.tokenVerificationId, uid1)
16661677
.then(query(uid1, addr1, function (results) {
1667-
t.equal(results.length, 2, 'two events for uid and addr')
1678+
t.equal(results.length, 3, 'three events for uid and addr')
16681679
t.equal(!!results[0].verified, true, 'first session verified')
16691680
t.equal(!!results[1].verified, true, 'second session verified')
1681+
t.equal(!!results[2].verified, true, 'third session verified')
16701682
}))
16711683
},
16721684

@@ -1691,7 +1703,7 @@ module.exports = function(config, DB) {
16911703
testGetWithIPv6: query(
16921704
uid1, '::' + addr1,
16931705
function (results) {
1694-
t.equal(results.length, 2, 'two events for ipv6 addr')
1706+
t.equal(results.length, 3, 'three events for ipv6 addr')
16951707
}
16961708
),
16971709

lib/db/mem.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ module.exports = function (log, error) {
329329

330330
// update securityEvents table
331331
(securityEvents[uid] || []).forEach(function (ev) {
332-
if (ev.tokenId.toString('hex') === tokenId) {
332+
if (ev.tokenId && ev.tokenId.toString('hex') === tokenId) {
333333
ev.verified = true
334334
}
335335
})
@@ -898,7 +898,7 @@ module.exports = function (log, error) {
898898
addr = '::' + addr
899899
}
900900

901-
var verified = (data.tokenId && !unverifiedTokens[data.tokenId.toString('hex')])
901+
var verified = !data.tokenId || !unverifiedTokens[data.tokenId.toString('hex')]
902902

903903
var event = {
904904
createdAt: Date.now(),
@@ -932,7 +932,7 @@ module.exports = function (log, error) {
932932
createdAt: ev.createdAt,
933933
verified: ev.verified
934934
}
935-
}))
935+
}).reverse())
936936
}
937937

938938
Memory.prototype.createUnblockCode = function (uid, code) {

0 commit comments

Comments
 (0)