From 570cd615c4912edcefa017377ae8caaa43d1d37c Mon Sep 17 00:00:00 2001 From: UTkarsh Date: Sun, 19 Feb 2017 17:33:02 +0530 Subject: [PATCH 1/2] Implement user login --- app.js | 21 +----- config.js | 2 +- db.js | 1 + package.json | 1 + passport_config.js | 94 +++++++++++++++++++++++++ routes/index.js | 6 +- views/login.html | 169 +++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 273 insertions(+), 21 deletions(-) create mode 100644 passport_config.js create mode 100644 views/login.html diff --git a/app.js b/app.js index 8dbe221..9b33ec5 100644 --- a/app.js +++ b/app.js @@ -68,26 +68,9 @@ async.series([function createDatabaseDirectory(next) { } next(); }, function setupPassport(next) { + //Configure passport + require(__dirname + '/passport_config.js')(app, passport); - passport.use(new Strategy( - function(username, password, cb) { - app.db.users.findOne({username: username}, function(err, user) { - if (err) { return cb(err); } - if (!user) { return cb(null, false, {message:"Invalid credentials"}); } - if (user.password != password) { return cb(null, false, {message:"Invalid credentials"}); } - return cb(null, user); - }); - })); - - // Configure Passport persistence. - passport.serializeUser(function(user, cb) { - var sessionUser = user; - cb(null, sessionUser); - }); - - passport.deserializeUser(function(user, cb) { - cb(null, user); - }); next(); }, function setupEverythingElse(next) { // middleware to use in the app diff --git a/config.js b/config.js index b542a0c..8296c33 100644 --- a/config.js +++ b/config.js @@ -93,7 +93,7 @@ function Config(app) { function (cb) { app.db.users.findOne({username:'admin'}, function (err, item) { if(!item) - app.db.users.insert({username:'admin',password:'admin'}); + app.db.admins.insert({username:'admin',password:'admin'}); }); cb(); diff --git a/db.js b/db.js index 50ecf44..1d50176 100644 --- a/db.js +++ b/db.js @@ -6,4 +6,5 @@ module.exports = function(app) { app.db.playlists = new Datastore({ filename: app.get('configDir') + '/dbs/playlists.db', autoload: true }); app.db.settings = new Datastore({ filename: app.get('configDir') + '/dbs/settings.db', autoload: true }); app.db.users = new Datastore({ filename: app.get('configDir') + '/dbs/users.db', autoload: true }); + app.db.admins = new Datastore({ filename: app.get('configDir') + '/dbs/admins.db', autoload: true }); }; diff --git a/package.json b/package.json index d04f06f..b604f7d 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "song-search": "^0.1.0", "soundcloud-resolver": "*", "swig": "*", + "validator": "^6.2.1", "youtube-playlist-info": "^0.1.0", "ytdl-core": "*" }, diff --git a/passport_config.js b/passport_config.js new file mode 100644 index 0000000..520133f --- /dev/null +++ b/passport_config.js @@ -0,0 +1,94 @@ +// Configuration file for passportJS + +var LocalStrategy = require('passport-local').Strategy; +var validate = require('validator'); + +module.exports = function(app, passport){ + + // Specify a local strategy for passport normal user login + passport.use('user-login', new LocalStrategy( + function(username, password, cb){ + + // Validate user data + var error = 0; + username = validate.trim(username); + username = username.toLowerCase(); + error += validate.isEmpty(username); + error += validate.isEmpty(password); + + if (!error) { + app.db.users.findOne({username: username}, function(err, user) { + if (err) { return cb(err); } + if (!user) { return cb(null, false, {message:"Invalid credentials"}); } + if (user.password != password) { return cb(null, false, {message:"Invalid credentials"}); } + return cb(null, user); + }); + + } + else + return cb(null, false); + } + )); + + // Specify a local strategy for passport normal user signup + passport.use('user-signup', new LocalStrategy( + function(username, password, cb){ + + // Validate user data + var error = 0; + username = validate.trim(username); + username = username.toLowerCase(); + error += validate.isEmpty(username); + error += validate.isEmpty(password); + + if (!error) { + app.db.users.findOne({username: username}, function(err, user) { + if (err) { + return cb(err); + } + if (user) { + return cb(null, false, {message:"User already registered"}); + } + else{ + app.db.users.insert({username: username, password:password}); + } + }); + }else + return cb(null, false); + } + )); + + // Specify a local strategy for passport admin login + passport.use('admin-login', new LocalStrategy( + function(username, password, cb){ + + // Validate user data + var error = 0; + username = validate.trim(username); + username = username.toLowerCase(); + error += validate.isEmpty(username); + error += validate.isEmpty(password); + + if (!error) { + app.db.admins.findOne({username: username}, function(err, user) { + if (err) { return cb(err); } + if (!user) { return cb(null, false, {message:"Invalid credentials"}); } + if (user.password != password) { return cb(null, false, {message:"Invalid credentials"}); } + return cb(null, user); + }); + + } + else + return cb(null, false); + } + )); + + // Specify serialize and deserialize methods for passport + passport.serializeUser(function(user, cb){ + var sessionUser = user; + cb(null, sessionUser); + }); + passport.deserializeUser(function(user, cb){ + cb(null, user); + }); +}; diff --git a/routes/index.js b/routes/index.js index 579c2ad..d1b5b5e 100644 --- a/routes/index.js +++ b/routes/index.js @@ -34,7 +34,11 @@ exports.createRoutes = function(app_ref) { //adds login facility app.get('/admin',function (req,res) { res.render('admin',{ msg:req.flash('error'), log: req.user? true : false});}); //auth using passport - app.post('/admin', passport.authenticate('local', { failureRedirect: '/admin', failureFlash: true }), function(req, res) { + app.post('/admin', passport.authenticate('admin-login', { failureRedirect: '/admin', failureFlash: true }), function(req, res) { + res.redirect('/'); + }); + app.get('/login', function (req,res) { res.render('login',{ msg:req.flash('error'), log: req.user? true : false});}); + app.post('/login', passport.authenticate('user-login', { failureRedirect: '/login', failureFlash: true }), function(req, res) { res.redirect('/'); }); app.post('/logout', function(req, res) { diff --git a/views/login.html b/views/login.html new file mode 100644 index 0000000..170bf60 --- /dev/null +++ b/views/login.html @@ -0,0 +1,169 @@ + + + + + + User Login + + + + +
+

Login

+ {% if msg %} +
+

{{msg}}

+
+ {% endif %} +
+ + {% if log %} + +
+
+ + + From 4f84f9b7af899f8a96209f06e3de39b4e22fd5e4 Mon Sep 17 00:00:00 2001 From: UTkarsh Date: Sat, 4 Mar 2017 21:07:27 +0530 Subject: [PATCH 2/2] Users must be different from admins --- passport_config.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/passport_config.js b/passport_config.js index 520133f..6303cb5 100644 --- a/passport_config.js +++ b/passport_config.js @@ -50,7 +50,18 @@ module.exports = function(app, passport){ return cb(null, false, {message:"User already registered"}); } else{ - app.db.users.insert({username: username, password:password}); + // Must not be the same as admins + app.db.admins.findOne({username: username}, function(err, user) { + if (err) { + return cb(err); + } + if (user) { + return cb(null, false, {message:"User already registered"}); + } + else{ + app.db.users.insert({username: username, password:password}); + } + }); } }); }else