diff options
| author | nanalelfe <nargiza.nosirova@mail.utoronto.ca> | 2016-07-23 11:27:52 +0000 |
|---|---|---|
| committer | nanalelfe <nargiza.nosirova@mail.utoronto.ca> | 2016-07-23 11:27:52 +0000 |
| commit | 41dca46235c15578aab159074c99c904597c5fb2 (patch) | |
| tree | 9930c2c013812620c25c17ac3fe6d2f48c6e4318 | |
| parent | 29e3a33a09be459a16248cbe6eabfccd8f9f4406 (diff) | |
Created admins collection. Added admin authentication.
| -rw-r--r-- | app.js | 1 | ||||
| -rw-r--r-- | config/passport.js | 31 | ||||
| -rw-r--r-- | node_simple.js | 98 | ||||
| -rw-r--r-- | routes/index.js | 24 | ||||
| -rw-r--r-- | routes/user.js | 1 | ||||
| -rw-r--r-- | views/partials/header.hbs | 10 |
6 files changed, 150 insertions, 15 deletions
@@ -55,7 +55,6 @@ app.use(function(req, res, next) { res.locals.login = req.isAuthenticated(); // global variable res.locals.session = req.session; res.locals.user = req.user; - console.log(res.locals.user); next(); }); diff --git a/config/passport.js b/config/passport.js index 19acd7f..27f835f 100644 --- a/config/passport.js +++ b/config/passport.js @@ -3,7 +3,9 @@ var dbFile = require("../node_simple.js"); var LocalStrategy = require('passport-local').Strategy; var bcrypt = require('bcrypt-nodejs'); -var encryptPassword = function (password) { +var exports = module.exports = {}; + +var encryptPassword = exports.encryptPassword = function (password) { return bcrypt.hashSync(password, bcrypt.genSaltSync(5), null); } @@ -20,6 +22,7 @@ passport.deserializeUser(function(user, done) { }); + // fields - [email, user_name, f_name, l_name, uni, department, password, phone_num] passport.use('local_signup', new LocalStrategy({ @@ -73,27 +76,41 @@ passport.use('local_signin', new LocalStrategy({ passwordField: 'password', passReqToCallback: true }, function (req, usrname, password, done) { - dbFile.retrieveUser(usrname, function (success, error, user, message) { if (!success && error) { return done(message); } - else if (!success && !error) { - console.log(message); - return done(null, false, {message: message}); + else if (!success && !error) { // Username is undefined + //return done(null, false, {message: message}); + // ADMIN + dbFile.adminExists(usrname, function (error, exists, data, message) { + if (error) { + return done(message); + } else if (!error && !exists){ + return done(null, false, {message: 'Username does not exist.'}); + } else { + console.log("data: " + data); + if (comparePassword(password, data.password)) { + return done(null, data); + } else { + return done(null, false, {message: 'Password incorrect.'}); + } + } + }); } else { - console.log(user[0]); + dbFile.retrievePassword(usrname, function(success, hash_pwd, message) { if (!success) { return done(message); } else { console.log(hash_pwd); + console.log("compare password: " + comparePassword(password, hash_pwd)); if (comparePassword(password, hash_pwd)) { - return done(null, user[0]); + return done(null, user); } else { return done(null, false, {message: 'Password incorrect.'}); } diff --git a/node_simple.js b/node_simple.js index 16c84ed..2c57d69 100644 --- a/node_simple.js +++ b/node_simple.js @@ -59,6 +59,17 @@ // |"askjdfklajsdf..........."|"asdf@asdf.com |"asdfasd"|(some hasehd thing) | // |..........| +/* + +NEW COLLECTIONS: + +- sessions: stores user session - no need to keep track +- admins: stores admin name, username and password only. The logins collection will be reserved for user logins. + + */ + + + var exports = module.exports = {}; const debug_mode = false; @@ -291,7 +302,8 @@ exports.retrieveUser = function (username, callback) { } else if (result.length) { - callback(true, false, result, "User retrieved"); + console.log("retreive User: " + result[0]); + callback(true, false, result[0], "User retrieved"); } else { @@ -303,19 +315,24 @@ exports.retrieveUser = function (username, callback) { } /* - Returns the hashed password given the username. Assume username exists. + Returns the hashed password given the username. Assume username exists. Used for both admins and users. + retrievePassword(String, boolean, function()) */ exports.retrievePassword = function (username, callback) { + mongoFactory.getConnection(uri).then(function (db) { - db.collection('logins').find({user_name: username}).toArray(function(err, result) { + var collection = db.collection('logins'); + + collection.find({user_name: username}).toArray(function(err, result) { if (err) { // callback(success, password, message) callback(false, null, "Error : Could not retrieve password."); } else { + console.log("NODE SIMPLE result[0]: " + result); var pwd = result[0].password; //result is an array callback(true, pwd, "Password retrieved"); } @@ -836,6 +853,81 @@ exports.get_exam_byID = function (id) { }; +/****************************** ADMINS *********************************/ + +/* + * Adds an admin to the admins collection. + * Params: admin_data = {fname: firstname, lname: lastname, username: username, password: password} + * Callback: callback(success, error, message) => callback(boolean, boolean, String) + */ + +exports.addAdmin = function (admin_data, callback) { + console.log('addAdmin, admin_data: ' + admin_data.fname); + + console.log("inside addAdmin"); + + // Check if the admin username already exists. If it does, then we don't add the admin_data and return a message. + exports.adminExists( admin_data.username , function (error, exists, data, message) { + console.log("adminExists: " + message); + if (!exists && !error) { + mongoFactory.getConnection(uri).then(function (db) { + + var admins = db.collection('admins'); + + admins.insertOne( admin_data, function (err) { + if (err) { + callback(false, true, message); + db.close(); + } + else { + callback(true, false, "Admin added."); + db.close(); + } + }); + + }).catch(function (err) { + callbackUser(false, true, "Unable to connect."); + }) + } else { + callback(error, exists, message); + } + }); + +}; + + +/* + * Equivalent of function find_user, but for admins. Calls back true if admin with a + * given username exists. If true, also returns the admin 'object'. + * Callback: callback(error, exists, message) + */ +exports.adminExists = function (username, callback) { + // make a connection + console.log("inside adminExists"); + mongoFactory.getConnection(uri).then(function (db) { + + var admins = db.collection('admins'); + admins.find( { username: username } ).toArray(function (err, result) { + if (err) { + callback(true, false, null, "Error: could not retrieve admin in adminExists()."); + } else if (result.length) { + callback(false, true, result[0], "Admin with given username exists"); + } else { + callback(false, false, null, "Admin with given username does not exist"); + } + }); + }) + .catch(function (err) { + callback(true, false, "Error: could not connect to the database."); + }) +}; + + + + + + + /* * userObj = {fs: fs, ls: ls, email: email, username: username, pass_hash: pass_hash, univ: univ, dept: dept} * diff --git a/routes/index.js b/routes/index.js index ac8e9a8..e89856f 100644 --- a/routes/index.js +++ b/routes/index.js @@ -2,11 +2,17 @@ var dbFile = require("../node_simple.js"); var express = require('express'); var router = express.Router(); +// Remove later +var passport_file = require('../config/passport.js'); +var bcrypt = require('bcrypt-nodejs'); + /* Render/GET homepage. */ router.get('/', function(req, res, next) { + addFirstAdmin(); res.render('index'); req.session.errors = null; req.session.success = null; + }); /* Render/GET about page */ @@ -130,6 +136,24 @@ router.post('/add_solutions/submit', function (req, res) { /**** Helpers ****/ +function addFirstAdmin() { + console.log("Inside addFirstAdmin()"); + //admin_data = {fname: firstname, lname: lastname, username: username, password: password} + var password = 'lamptable'; + var hash_pwd = passport_file.encryptPassword(password); + console.log("Admin hashed: " + hash_pwd); + var admin_data = { + fname: 'Admin', + lname: 'Admin', + username: 'admin', + password: hash_pwd + }; + + dbFile.addAdmin(admin_data, function (success, error, message) { + console.log("admin message: " + message); + }); +} + function getExamsForCourseCode(courseCode) { dbFile.get_all_exams(courseCode, function (exams) { if (exams.length == 0){ diff --git a/routes/user.js b/routes/user.js index 014a7d2..6167713 100644 --- a/routes/user.js +++ b/routes/user.js @@ -81,7 +81,6 @@ router.post('/signin', loggedOut, function(req, res, next) { req.session.success = false; res.redirect('/signin'); } else { - console.log("GOT SUCCESS"); passport.authenticate('local_signin', { successRedirect: '/user/user_profile', failureRedirect: '/user/signin', diff --git a/views/partials/header.hbs b/views/partials/header.hbs index c9a6e4b..e404787 100644 --- a/views/partials/header.hbs +++ b/views/partials/header.hbs @@ -37,13 +37,17 @@ </ul> </li> {{# if login }} - <li><a href="/user/user_profile">Profile Page</a></li> + {{# if user.email }} + <li><a href="/user/user_profile">Profile Page</a></li> + {{else}} + <li><a href="/admin">Admin Panel</a></li> + {{/if}} {{ else }} <li><a href="/user/signin" >Sign In</a></li> {{/if}} - <li><a href="/admin">Admin Panel</a></li> + <!--<li><a href="#" data-toggle="modal" data-target=".registration-window">Sign up</a></li>--> - {{# if login}} + {{# if login }} <li><a href="/user/logout">Logout</a> </li> {{ else }} <li><a href="/user/signup" >Sign up</a></li> |
