From a18537b065499bd3b8f5c508f8b1f7458d884305 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Thu, 20 Nov 2014 15:54:15 -0800 Subject: [PATCH] Added the ability to assign a user an iOS UDID, and login with it. --- app/schemas/models/user.coffee | 1 + server/routes/auth.coffee | 9 +++++++- server/users/User.coffee | 2 +- test/server/functional/auth.spec.coffee | 28 +++++++++++++++++++++++-- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/app/schemas/models/user.coffee b/app/schemas/models/user.coffee index ee41c436a..dfda2f298 100644 --- a/app/schemas/models/user.coffee +++ b/app/schemas/models/user.coffee @@ -50,6 +50,7 @@ visa = c.shortString _.extend UserSchema.properties, email: c.shortString({title: 'Email', format: 'email'}) + iosUDID: c.shortString({format: 'hidden'}) firstName: c.shortString({title: 'First Name'}) lastName: c.shortString({title: 'Last Name'}) gender: {type: 'string', 'enum': ['male', 'female']} diff --git a/server/routes/auth.coffee b/server/routes/auth.coffee index b21954958..caf21074a 100644 --- a/server/routes/auth.coffee +++ b/server/routes/auth.coffee @@ -15,7 +15,14 @@ module.exports.setup = (app) -> authentication.use(new LocalStrategy( (username, password, done) -> - User.findOne({emailLower: username.toLowerCase()}).exec((err, user) -> + + # kind of a hacky way to make it possible for iPads to 'log in' with their unique device id + if username.length is 40 and '@' not in username # must be a UDID + q = { iosUDID: username } + else + q = { emailLower: username.toLowerCase() } + + User.findOne(q).exec((err, user) -> return done(err) if err return done(null, false, {message: 'not found', property: 'email'}) if not user passwordReset = (user.get('passwordReset') or '').toLowerCase() diff --git a/server/users/User.coffee b/server/users/User.coffee index c6a98dcf2..c9054fcab 100644 --- a/server/users/User.coffee +++ b/server/users/User.coffee @@ -200,7 +200,7 @@ UserSchema.statics.editableProperties = [ 'firstName', 'lastName', 'gender', 'facebookID', 'gplusID', 'emails', 'testGroupNumber', 'music', 'hourOfCode', 'hourOfCodeComplete', 'preferredLanguage', 'wizard', 'aceConfig', 'autocastDelay', 'lastLevel', 'jobProfile', 'savedEmployerFilterAlerts', - 'heroConfig' + 'heroConfig', 'iosUDID' ] UserSchema.plugin plugins.NamedPlugin diff --git a/test/server/functional/auth.spec.coffee b/test/server/functional/auth.spec.coffee index aa502f7d6..a46b72b9d 100644 --- a/test/server/functional/auth.spec.coffee +++ b/test/server/functional/auth.spec.coffee @@ -15,7 +15,31 @@ describe '/auth/whoami', -> describe '/auth/login', -> - it 'clears Users first', (done) -> + it 'clears Users', (done) -> + clearModels [User], (err) -> + throw err if err + request.get getURL('/auth/whoami'), -> + throw err if err + done() + + it 'allows logging in by iosUDID', (done) -> + req = request.post(getURL('/db/user'), + (error, response) -> + expect(response).toBeDefined() + expect(response.statusCode).toBe(200) + req = request.post(urlLogin, (error, response) -> + expect(response.statusCode).toBe(200) + done() + ) + form = req.form() + form.append('username', '0123456789012345678901234567890123456789') + form.append('password', '12345') + ) + form = req.form() + form.append('iosUDID', '0123456789012345678901234567890123456789') + form.append('password', '12345') + + it 'clears Users', (done) -> clearModels [User], (err) -> throw err if err request.get getURL('/auth/whoami'), -> @@ -84,7 +108,7 @@ describe '/auth/reset', -> form = req.form() form.append('username', 'scott@gmail.com') - it 'can\'t reset an unknow user', (done) -> + it 'can\'t reset an unknown user', (done) -> req = request.post(urlReset, (error, response) -> expect(response).toBeDefined() expect(response.statusCode).toBe(404)