Merge pull request #1603 from mozilla/phil/issue-1426

refactor(server): eliminate duplicate calls to user-agent parser
This commit is contained in:
Sean McArthur 2016-12-28 10:19:50 -08:00 коммит произвёл GitHub
Родитель 6fc0c50389 4ac625c7f6
Коммит 6e25283e97
3 изменённых файлов: 105 добавлений и 23 удалений

Просмотреть файл

@ -276,14 +276,19 @@ module.exports = function (
if (! account.emailVerified) {
return getGeoData(ip)
.then(function (geoData) {
mailer.sendVerifyCode(account, account.emailCode, userAgent.call({
mailer.sendVerifyCode(account, account.emailCode, {
service: form.service || query.service,
redirectTo: form.redirectTo,
resume: form.resume,
acceptLanguage: request.app.acceptLanguage,
ip: ip,
location: geoData.location
}, request.headers['user-agent'], log))
location: geoData.location,
uaBrowser: sessionToken.uaBrowser,
uaBrowserVersion: sessionToken.uaBrowserVersion,
uaOS: sessionToken.uaOS,
uaOSVersion: sessionToken.uaOSVersion,
uaDeviceType: sessionToken.uaDeviceType
})
.then(function () {
// only create reminder if sendVerifyCode succeeds
verificationReminder.create({
@ -825,14 +830,19 @@ module.exports = function (
return getGeoData(ip)
.then(
function (geoData) {
return mailer.sendVerifyCode(emailRecord, emailCode, userAgent.call({
return mailer.sendVerifyCode(emailRecord, emailCode, {
service: service,
redirectTo: redirectTo,
resume: resume,
acceptLanguage: request.app.acceptLanguage,
ip: ip,
location: geoData.location
}, request.headers['user-agent'], log))
location: geoData.location,
uaBrowser: sessionToken.uaBrowser,
uaBrowserVersion: sessionToken.uaBrowserVersion,
uaOS: sessionToken.uaOS,
uaOSVersion: sessionToken.uaOSVersion,
uaDeviceType: sessionToken.uaDeviceType
})
}
)
.then(() => request.emitMetricsEvent('email.verification.sent'))
@ -855,12 +865,17 @@ module.exports = function (
function (geoData) {
mailer.sendNewDeviceLoginNotification(
emailRecord.email,
userAgent.call({
{
acceptLanguage: request.app.acceptLanguage,
ip: ip,
location: geoData.location,
timeZone: geoData.timeZone
}, request.headers['user-agent'], log)
timeZone: geoData.timeZone,
uaBrowser: sessionToken.uaBrowser,
uaBrowserVersion: sessionToken.uaBrowserVersion,
uaOS: sessionToken.uaOS,
uaOSVersion: sessionToken.uaOSVersion,
uaDeviceType: sessionToken.uaDeviceType
}
)
}
)
@ -881,15 +896,20 @@ module.exports = function (
return mailer.sendVerifyLoginEmail(
emailRecord,
tokenVerificationId,
userAgent.call({
{
acceptLanguage: request.app.acceptLanguage,
ip: ip,
location: geoData.location,
redirectTo: redirectTo,
resume: resume,
service: service,
timeZone: geoData.timeZone
}, request.headers['user-agent'], log)
timeZone: geoData.timeZone,
uaBrowser: sessionToken.uaBrowser,
uaBrowserVersion: sessionToken.uaBrowserVersion,
uaOS: sessionToken.uaOS,
uaOSVersion: sessionToken.uaOSVersion,
uaDeviceType: sessionToken.uaDeviceType
}
)
}
)
@ -1557,13 +1577,18 @@ module.exports = function (
mailer,
sessionToken,
code,
userAgent.call({
{
service: service,
timestamp: Date.now(),
redirectTo: request.payload.redirectTo,
resume: request.payload.resume,
acceptLanguage: request.app.acceptLanguage
}, request.headers['user-agent'], log)
acceptLanguage: request.app.acceptLanguage,
uaBrowser: sessionToken.uaBrowser,
uaBrowserVersion: sessionToken.uaBrowserVersion,
uaOS: sessionToken.uaOS,
uaOSVersion: sessionToken.uaOSVersion,
uaDeviceType: sessionToken.uaDeviceType
}
))
.then(() => request.emitMetricsEvent(`email.${event}.resent`))
.done(

Просмотреть файл

@ -245,7 +245,11 @@ describe('/recovery_email/resend_code', () => {
uid: uuid.v4('binary').toString('hex'),
email: TEST_EMAIL,
emailVerified: false,
tokenVerified: false
tokenVerified: false,
uaBrowser: 'Firefox',
uaBrowserVersion: 52,
uaOS: 'Mac OS X',
uaOSVersion: '10.10'
},
query: {},
payload: {
@ -260,6 +264,14 @@ describe('/recovery_email/resend_code', () => {
return runTest(route, mockRequest, response => {
assert.equal(mockLog.flowEvent.callCount, 1, 'log.flowEvent called once')
assert.equal(mockLog.flowEvent.args[0][0], 'email.verification.resent')
assert.equal(mockMailer.sendVerifyCode.callCount, 1)
const args = mockMailer.sendVerifyCode.args[0]
assert.equal(args[2].uaBrowser, 'Firefox')
assert.equal(args[2].uaBrowserVersion, '52')
assert.equal(args[2].uaOS, 'Mac OS X')
assert.equal(args[2].uaOSVersion, '10.10')
assert.strictEqual(args[2].uaDeviceType, undefined)
})
})
@ -271,7 +283,12 @@ describe('/recovery_email/resend_code', () => {
uid: uuid.v4('binary').toString('hex'),
email: TEST_EMAIL,
emailVerified: true,
tokenVerified: false
tokenVerified: false,
uaBrowser: 'Firefox',
uaBrowserVersion: '50',
uaOS: 'Android',
uaOSVersion: '6',
uaDeviceType: 'tablet'
},
query: {},
payload: {
@ -286,6 +303,14 @@ describe('/recovery_email/resend_code', () => {
return runTest(route, mockRequest, response => {
assert.equal(mockLog.flowEvent.callCount, 1, 'log.flowEvent called once')
assert.equal(mockLog.flowEvent.args[0][0], 'email.confirmation.resent')
assert.equal(mockMailer.sendVerifyLoginEmail.callCount, 1)
const args = mockMailer.sendVerifyLoginEmail.args[0]
assert.equal(args[2].uaBrowser, 'Firefox')
assert.equal(args[2].uaBrowserVersion, '50')
assert.equal(args[2].uaOS, 'Android')
assert.equal(args[2].uaOSVersion, '6')
assert.strictEqual(args[2].uaDeviceType, 'tablet')
})
})
@ -744,6 +769,10 @@ describe('/account/create', function () {
emailVerified: false,
keyFetchTokenId: keyFetchTokenId,
sessionTokenId: sessionTokenId,
uaBrowser: 'Firefox',
uaBrowserVersion: 52,
uaOS: 'Mac OS X',
uaOSVersion: '10.10',
uid: uid,
wrapWrapKb: 'wibble'
}, {
@ -827,8 +856,14 @@ describe('/account/create', function () {
assert.equal(securityEvent.ipAddr, clientAddress)
assert.equal(mockMailer.sendVerifyCode.callCount, 1, 'mailer.sendVerifyCode was called')
assert.equal(mockMailer.sendVerifyCode.getCall(0).args[2].location.city, 'Mountain View')
assert.equal(mockMailer.sendVerifyCode.getCall(0).args[2].location.country, 'United States')
args = mockMailer.sendVerifyCode.args[0]
assert.equal(args[2].location.city, 'Mountain View')
assert.equal(args[2].location.country, 'United States')
assert.equal(args[2].uaBrowser, 'Firefox')
assert.equal(args[2].uaBrowserVersion, '52')
assert.equal(args[2].uaOS, 'Mac OS X')
assert.equal(args[2].uaOSVersion, '10.10')
assert.strictEqual(args[2].uaDeviceType, undefined)
})
})
})
@ -926,6 +961,11 @@ describe('/account/login', function () {
emailVerified: true,
keyFetchTokenId: keyFetchTokenId,
sessionTokenId: sessionTokenId,
uaBrowser: 'Firefox',
uaBrowserVersion: 50,
uaOS: 'Android',
uaOSVersion: '6',
uaDeviceType: 'mobile',
uid: uid
})
var mockMailer = mocks.mockMailer()
@ -1022,9 +1062,16 @@ describe('/account/login', function () {
assert.deepEqual(args[0], 'account.signed', 'argument was event name')
assert.equal(mockMailer.sendVerifyLoginEmail.callCount, 1, 'mailer.sendVerifyLoginEmail was called')
assert.equal(mockMailer.sendVerifyLoginEmail.getCall(0).args[2].location.city, 'Mountain View')
assert.equal(mockMailer.sendVerifyLoginEmail.getCall(0).args[2].location.country, 'United States')
assert.equal(mockMailer.sendVerifyLoginEmail.getCall(0).args[2].timeZone, 'America/Los_Angeles')
args = mockMailer.sendVerifyLoginEmail.args[0]
assert.equal(args[2].location.city, 'Mountain View')
assert.equal(args[2].location.country, 'United States')
assert.equal(args[2].timeZone, 'America/Los_Angeles')
assert.equal(args[2].uaBrowser, 'Firefox')
assert.equal(args[2].uaBrowserVersion, '50')
assert.equal(args[2].uaOS, 'Android')
assert.equal(args[2].uaOSVersion, '6')
assert.equal(args[2].uaDeviceType, 'mobile')
assert.equal(mockMailer.sendNewDeviceLoginNotification.callCount, 0, 'mailer.sendNewDeviceLoginNotification was not called')
assert.ok(!response.verified, 'response indicates account is not verified')
assert.equal(response.verificationMethod, 'email', 'verificationMethod is email')

Просмотреть файл

@ -162,6 +162,11 @@ function mockDB (data, errors) {
tokenId: data.sessionTokenId,
tokenVerificationId: data.tokenVerificationId,
tokenVerified: ! data.tokenVerificationId,
uaBrowser: data.uaBrowser,
uaBrowserVersion: data.uaBrowserVersion,
uaOS: data.uaOS,
uaOSVersion: data.uaOSVersion,
uaDeviceType: data.uaDeviceType,
uid: data.uid
})
}),
@ -200,7 +205,12 @@ function mockDB (data, errors) {
}),
sessionTokenWithVerificationStatus: sinon.spy(() => {
return P.resolve({
tokenVerified: true
tokenVerified: true,
uaBrowser: data.uaBrowser,
uaBrowserVersion: data.uaBrowserVersion,
uaOS: data.uaOS,
uaOSVersion: data.uaOSVersion,
uaDeviceType: data.uaDeviceType
})
}),
verifyTokens: sinon.spy(() => {