aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornanalelfe <nargiza.nosirova@mail.utoronto.ca>2016-07-23 11:27:52 +0000
committernanalelfe <nargiza.nosirova@mail.utoronto.ca>2016-07-23 11:27:52 +0000
commit41dca46235c15578aab159074c99c904597c5fb2 (patch)
tree9930c2c013812620c25c17ac3fe6d2f48c6e4318
parent29e3a33a09be459a16248cbe6eabfccd8f9f4406 (diff)
Created admins collection. Added admin authentication.
-rw-r--r--app.js1
-rw-r--r--config/passport.js31
-rw-r--r--node_simple.js98
-rw-r--r--routes/index.js24
-rw-r--r--routes/user.js1
-rw-r--r--views/partials/header.hbs10
6 files changed, 150 insertions, 15 deletions
diff --git a/app.js b/app.js
index 4f398a9..5d09142 100644
--- a/app.js
+++ b/app.js
@@ -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>