|
@@ -2,48 +2,96 @@ var passport = require('passport');
|
|
var GitHubStrategy = require('passport-github').Strategy;
|
|
var GitHubStrategy = require('passport-github').Strategy;
|
|
var LocalStrategy = require('passport-local').Strategy;
|
|
var LocalStrategy = require('passport-local').Strategy;
|
|
var r = require('../db');
|
|
var r = require('../db');
|
|
|
|
+var bcrypt = require('bcryptjs');
|
|
|
|
|
|
passport.serializeUser(function (user, done) {
|
|
passport.serializeUser(function (user, done) {
|
|
- console.log(user, 555);
|
|
|
|
return done(null, user.id);
|
|
return done(null, user.id);
|
|
});
|
|
});
|
|
|
|
|
|
passport.deserializeUser(function (id, done) {
|
|
passport.deserializeUser(function (id, done) {
|
|
- console.log(id, 444);
|
|
|
|
r
|
|
r
|
|
.table('users')
|
|
.table('users')
|
|
.get(id)
|
|
.get(id)
|
|
.run(r.conn)
|
|
.run(r.conn)
|
|
.then(function (user) {
|
|
.then(function (user) {
|
|
|
|
+ delete user.password;
|
|
done(null, user);
|
|
done(null, user);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
var loginCallbackHandler = function (objectMapper, type) {
|
|
var loginCallbackHandler = function (objectMapper, type) {
|
|
- return function (accessToken, refreshToken, profile, done) {
|
|
|
|
- if (accessToken !== null) {
|
|
|
|
|
|
+ return function (arg1, arg2, arg3, arg4) {
|
|
|
|
+ /*
|
|
|
|
+ * If the type is github
|
|
|
|
+ * arg1 is the accessToken
|
|
|
|
+ * arg2 is the refresh token
|
|
|
|
+ * arg3 is profile object
|
|
|
|
+ * arg4 is done callback
|
|
|
|
+ *
|
|
|
|
+ * if the type is local
|
|
|
|
+ * arg1 is username
|
|
|
|
+ * arg2 is password
|
|
|
|
+ * arg3 is done callback
|
|
|
|
+ * */
|
|
|
|
+ var username, done;
|
|
|
|
+ if (type === "github") {
|
|
|
|
+ username = arg3.username;
|
|
|
|
+ done = arg4;
|
|
|
|
+ } else {
|
|
|
|
+ username = arg1;
|
|
|
|
+ done = arg3;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (arg1 !== null) {
|
|
r
|
|
r
|
|
.table('users')
|
|
.table('users')
|
|
- .getAll(profile.username, { index: 'login' })
|
|
|
|
- .filter({ type: type })
|
|
|
|
|
|
+ .getAll(username.toLowerCase(), { index: 'usernameL' })
|
|
.run(r.conn)
|
|
.run(r.conn)
|
|
.then(function (cursor) {
|
|
.then(function (cursor) {
|
|
return cursor.toArray()
|
|
return cursor.toArray()
|
|
.then(function (users) {
|
|
.then(function (users) {
|
|
if (users.length > 0) {
|
|
if (users.length > 0) {
|
|
- return done(null, users[0]);
|
|
|
|
|
|
+ var userType = users[0].type;
|
|
|
|
+ if (userType === "github" && type === userType) {
|
|
|
|
+ return done(null, users[0]);
|
|
|
|
+ } else if (userType === "local" && userType === type) {
|
|
|
|
+ var hash = users[0].password;
|
|
|
|
+ console.log("Checking password...");
|
|
|
|
+ bcrypt.compare(arg2, hash, function(err, isMatch) {
|
|
|
|
+ if (err || isMatch === false) {
|
|
|
|
+ //Incorrect password/error occured
|
|
|
|
+ //TODO Throw error
|
|
|
|
+ } else {
|
|
|
|
+ var user = users[0];
|
|
|
|
+ delete user.password;
|
|
|
|
+ return done(null, user);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ } else {
|
|
|
|
+ // If this gets called, a user tried to sign in with a GitHub account even though a normal account with that username already exists, or the other way around
|
|
|
|
+ if (userType === "local") {
|
|
|
|
+ return done(null, false, {message: "This account has been registered via email, not via GitHub."});
|
|
|
|
+ } else {
|
|
|
|
+ return done(null, false, {message: "This account has been registered via GitHub, not via email."});
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else if (type === "github") {
|
|
|
|
+ return r.table('users')
|
|
|
|
+ .insert(objectMapper(arg3))
|
|
|
|
+ .run(r.conn)
|
|
|
|
+ .then(function (response) {
|
|
|
|
+ return r.table('users')
|
|
|
|
+ .get(response.generated_keys[0])
|
|
|
|
+ .run(r.conn);
|
|
|
|
+ })
|
|
|
|
+ .then(function (newUser) {
|
|
|
|
+ done(null, newUser);
|
|
|
|
+ });
|
|
|
|
+ } else {
|
|
|
|
+ console.log("User not found");
|
|
|
|
+ done(null, false, {message: 'Account not found.'});
|
|
|
|
+ // TODO Say account not found
|
|
}
|
|
}
|
|
- return r.table('users')
|
|
|
|
- .insert(objectMapper(profile))
|
|
|
|
- .run(r.conn)
|
|
|
|
- .then(function (response) {
|
|
|
|
- return r.table('users')
|
|
|
|
- .get(response.generated_keys[0])
|
|
|
|
- .run(r.conn);
|
|
|
|
- })
|
|
|
|
- .then(function (newUser) {
|
|
|
|
- done(null, newUser);
|
|
|
|
- });
|
|
|
|
});
|
|
});
|
|
})
|
|
})
|
|
.catch(function (err) {
|
|
.catch(function (err) {
|
|
@@ -62,10 +110,10 @@ passport.use(new GitHubStrategy({
|
|
},
|
|
},
|
|
loginCallbackHandler(function (profile) {
|
|
loginCallbackHandler(function (profile) {
|
|
return {
|
|
return {
|
|
- 'login': profile.username,
|
|
|
|
- 'name': profile.displayName || null,
|
|
|
|
- 'url': profile.profileUrl,
|
|
|
|
- 'avatarUrl': profile._json.avatar_url,
|
|
|
|
|
|
+ 'username': profile.username,
|
|
|
|
+ 'usernameL': profile.username.toLowerCase(),
|
|
|
|
+ 'name': profile.displayName || undefined,
|
|
|
|
+ 'email': 'email',
|
|
'type': 'github'
|
|
'type': 'github'
|
|
};
|
|
};
|
|
}, 'github')
|
|
}, 'github')
|
|
@@ -73,26 +121,11 @@ passport.use(new GitHubStrategy({
|
|
|
|
|
|
// Local
|
|
// Local
|
|
passport.use(new LocalStrategy(
|
|
passport.use(new LocalStrategy(
|
|
- function(username, password, done) {
|
|
|
|
- /*User.findOne({ username: username }, function (err, user) {
|
|
|
|
- if (err) { return done(err); }
|
|
|
|
- if (!user) {
|
|
|
|
- return done(null, false, { message: 'Incorrect username.' });
|
|
|
|
- }
|
|
|
|
- if (!user.validPassword(password)) {
|
|
|
|
- return done(null, false, { message: 'Incorrect password.' });
|
|
|
|
- }
|
|
|
|
- return done(null, user);
|
|
|
|
- });*/
|
|
|
|
- //TODO Check password
|
|
|
|
- // This is checking if passord is valid and all
|
|
|
|
- console.log(username, password);
|
|
|
|
- return done(null, {id: "potatoe", login: "Kris", name: "Kristian", url: "no", avatarUrl: "no", type: "local"});
|
|
|
|
- }
|
|
|
|
|
|
+ {},
|
|
|
|
+ loginCallbackHandler(undefined, 'local')
|
|
));
|
|
));
|
|
|
|
|
|
passport.checkIfLoggedIn = function (req, res, next) {
|
|
passport.checkIfLoggedIn = function (req, res, next) {
|
|
- console.log(req.user, 666);
|
|
|
|
if (req.user) {
|
|
if (req.user) {
|
|
return next();
|
|
return next();
|
|
}
|
|
}
|