From 8f927109064dad65cfa22088c101e3a27640d193 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Mon, 24 Jun 2013 11:14:03 -0400 Subject: [PATCH] moved login code from user.js to login.js --- src/login.js | 145 +++++++++++++++++++++++++++++++++++ src/routes/authentication.js | 13 ++-- 2 files changed, 152 insertions(+), 6 deletions(-) create mode 100644 src/login.js diff --git a/src/login.js b/src/login.js new file mode 100644 index 0000000000..1bc0be823a --- /dev/null +++ b/src/login.js @@ -0,0 +1,145 @@ + +var user = require('./user.js'), + bcrypt = require('bcrypt'), + RDB = require('./redis.js'); + +(function(Login){ + + Login.loginViaLocal = function(username, password, next) { + + if (!username || !password) { + return next({ + status: 'error', + message: 'invalid-user' + }); + } else { + RDB.get('username:' + username + ':uid', function(err, uid) { + RDB.handle(err); + + if (uid == null) { + return next({ + status: 'error', + message: 'invalid-user' + }); + } + + user.getUserField(uid, 'password', function(user_password) { + bcrypt.compare(password, user_password, function(err, res) { + if (res === true) { + next({ + status: "ok", + user: { + uid: uid + } + }); + } else { + next({ + status: 'error', + message: 'invalid-password' + }); + } + }); + }); + }); + } + } + + Login.loginViaTwitter = function(twid, handle, callback) { + user.get_uid_by_twitter_id(twid, function(uid) { + if (uid !== null) { + // Existing User + callback(null, { + uid: uid + }); + } else { + // New User + user.create(handle, null, null, function(err, uid) { + if (err !== null) { + callback(err); + } else { + // Save twitter-specific information to the user + user.setUserField(uid, 'twid', twid); + RDB.hset('twid:uid', twid, uid); + callback(null, { + uid: uid + }); + } + }); + } + }); + } + + Login.loginViaGoogle = function(gplusid, handle, email, callback) { + user.get_uid_by_google_id(gplusid, function(uid) { + if (uid !== null) { + // Existing User + callback(null, { + uid: uid + }); + } else { + // New User + var success = function(uid) { + // Save google-specific information to the user + user.setUserField(uid, 'gplusid', gplusid); + RDB.hset('gplusid:uid', gplusid, uid); + callback(null, { + uid: uid + }); + } + + user.get_uid_by_email(email, function(uid) { + if (!uid) { + user.create(handle, null, email, function(err, uid) { + if (err !== null) { + callback(err); + } else success(uid); + }); + } else success(uid); // Existing account -- merge + }); + } + }); + } + + Login.loginViaFacebook = function(fbid, name, email, callback) { + user.get_uid_by_fbid(fbid, function(uid) { + if (uid !== null) { + // Existing User + callback(null, { + uid: uid + }); + } else { + // New User + var success = function(uid) { + // Save facebook-specific information to the user + user.setUserField(uid, 'fbid', fbid); + RDB.hset('fbid:uid', fbid, uid); + callback(null, { + uid: uid + }); + } + + user.get_uid_by_email(email, function(uid) { + if (!uid) { + user.create(name, null, email, function(err, uid) { + if (err !== null) { + callback(err); + } else success(uid); + }); + } else success(uid); // Existing account -- merge + }); + } + }); + } + + Login.logout = function(sessionID, callback) { + user.get_uid_by_session(sessionID, function(uid) { + if (uid) { + RDB.del('sess:' + sessionID + ':uid'); + RDB.del('uid:' + uid + ':session'); + callback(true); + } else callback(false); + }); + } + +}(exports)); + diff --git a/src/routes/authentication.js b/src/routes/authentication.js index 96fcbef865..3098b81cc8 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -6,10 +6,11 @@ passportFacebook = require('passport-facebook').Strategy, login_strategies = [], - user_module = require('./../user.js'); + user_module = require('./../user.js'), + login_module = require('./../login.js'); passport.use(new passportLocal(function(user, password, next) { - user_module.loginViaLocal(user, password, function(login) { + login_module.loginViaLocal(user, password, function(login) { if (login.status === 'ok') next(null, login.user); else next(null, false, login); }); @@ -21,7 +22,7 @@ consumerSecret: global.config['social:twitter:secret'], callbackURL: config.url + 'auth/twitter/callback' }, function(token, tokenSecret, profile, done) { - user_module.loginViaTwitter(profile.id, profile.username, function(err, user) { + login_module.loginViaTwitter(profile.id, profile.username, function(err, user) { if (err) { return done(err); } done(null, user); }); @@ -36,7 +37,7 @@ clientSecret: global.config['social:google:secret'], callbackURL: config.url + 'auth/google/callback' }, function(accessToken, refreshToken, profile, done) { - user_module.loginViaGoogle(profile.id, profile.displayName, profile.emails[0].value, function(err, user) { + login_module.loginViaGoogle(profile.id, profile.displayName, profile.emails[0].value, function(err, user) { if (err) { return done(err); } done(null, user); }); @@ -51,7 +52,7 @@ clientSecret: global.config['social:facebook:secret'], callbackURL: config.url + 'auth/facebook/callback' }, function(accessToken, refreshToken, profile, done) { - user_module.loginViaFacebook(profile.id, profile.displayName, profile.emails[0].value, function(err, user) { + login_module.loginViaFacebook(profile.id, profile.displayName, profile.emails[0].value, function(err, user) { if (err) { return done(err); } done(null, user); }); @@ -84,7 +85,7 @@ app.get('/logout', function(req, res) { console.log('info: [Auth] Session ' + req.sessionID + ' logout (uid: ' + global.uid + ')'); - user_module.logout(req.sessionID, function(logout) { + login_module.logout(req.sessionID, function(logout) { req.logout(); res.send(app.build_header(res) + templates['logout'] + templates['footer']); });