Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/.eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ module.exports = {
"element": false,
"by": false,
"exports": false,
"afterEach": false
"afterEach": false,
"beforeEach": false
},
"rules": {
"indent": [
Expand Down
2 changes: 0 additions & 2 deletions src/.private/.htpasswd

This file was deleted.

98 changes: 65 additions & 33 deletions src/config/passport.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,23 @@
'use strict';

var config = require('./database');
var mysql = require('mysql2');

// load all the things we need
var LocalStrategy = require('passport-local').Strategy;

// load up the user model
var USER = require('../model/user');
var User = new USER();
var Utils = require('../controller/utils');
var Authentication = require('../controller/auth');

var mysql = require('mysql2');
var config = require('../test/lib/utils/config');
var creds = config.credentials.database;
var creds = config;
var connection = mysql.createConnection(creds);
connection.connect();

var Utils = require('../controller/utils');
var Authentication = require('../controller/auth');
var auth = new Authentication(connection);
var utils = new Utils(connection);
var User = new USER(connection);

// expose this function to our app using module.exports
module.exports = function(passport) {
// used to serialize the user for the session
passport.serializeUser(function(user, done) {
Expand Down Expand Up @@ -48,40 +47,73 @@ module.exports = function(passport) {
});

passport.use('local-login', new LocalStrategy({
// by default, local strategy uses username and password, we will override with email
usernameField : 'username',
passwordField : 'password',
passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, username, password, done) { // callback with username and password from our form
// find a user whose email is the same as the forms email
// we are checking to see if the user trying to login already exists
passReqToCallback : true
}, function(req, username, password, done) {
User.findUser(username, function(err, user) {
// if there are any errors, return the error before anything else
if (err)
return done(err);
if (err) return done(null, false, req.flash('loginMessage',
'Fatal Error: ' + err.message));

// if no user is found, return the message
if (!user)
return done(null, false, req.flash('loginMessage',
'Invalid username. Please try again.')); // req.flash is the way to set flashdata using connect-flash
'Invalid username. Please try again.'));

// if the user is found but the password is wrong
if (!User.validPassword(username, password))
return done(null, false, req.flash('loginMessage',
'Invalid password. Please try again.')); // create the loginMessage and save it to session as flashdata

utils.getMemberId(user, function(err, id) {
User.validPassword(username, password, function(err, isValid) {
if (err) return done(null, false, req.flash('loginMessage',
'Fatal Database Error: ' + err.message));
auth.logIn(id, function(err) {
if (err) return done(null, false, req.flash('loginMessage',
'Account locked due to user "' + user + '" not logging ' +
'out properly.\nPlease contact the system administrator ' +
'for help.'));
return done(null, user);
});
'Fatal Error: ' + err.message));
else {
if (!isValid) {
return done(null, false, req.flash('loginMessage',
'Invalid password. Please try again.'));
} else {
utils.getMemberId(username, function(err, id) {
if (err) return done(null, false, req.flash('loginMessage',
'Fatal Database Error: ' + err.message));
auth.logIn(id, function(err) {
if (err) return done(null, false, req.flash('loginMessage',
'Account locked due to user "' + username + '" not logging ' +
'out properly.\nPlease contact the system administrator ' +
'for help.'));
return done(null, username);
});
});
}
}
});
});
}));

passport.use('local-signup', new LocalStrategy({
usernameField : 'username',
passwordField : 'password',
passReqToCallback : true
}, function(req, username, password, done) {
User.findUser(username, function(err, result) {
if (err) return done(null, false, req.flash('signupMessage',
'Fatal Error: ' + err.message));
else if (result) return done(null, false, req.flash('signupMessage',
'User with username "' + username + '" already exists.'));
else {
var options = {
fname: req.body.f_name,
lname: req.body.l_name,
email: req.body.email,
username: username,
password: password
};
auth.signUp(options, function(err, result) {
if (err) return done(null, false, req.flash('signupMessage',
'Fatal Database Error: ' + err.message));
else if (result) {
return done(null, result, req.flash('signupMessage',
'User "' + username + '" has been registered. Please contact the system administrator to get roles assigned.'));
} else {
err = new Error('Sign up failure. Please contact the system administrator for more help.');
return done(null, false, req.flash('signupMessage', err.message));
}
});
}
});
}));
};
29 changes: 29 additions & 0 deletions src/controller/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,42 @@

var assert = require('assert');

var User = require('../model/user');
var Utils = require('./utils');

var Authentication = function(connection) {
this.conn = connection;
this.user = new User(this.conn);
this.utils = new Utils(this.conn);
};

/**
* Sign up a user
* @param {Object} options
* @param {Function} cb
*/
Authentication.prototype.signUp = function(options, cb) {
assert(typeof options === 'object');
assert(typeof cb === 'function');

options.email = options.email || null;

var self = this;

this.conn.query('insert into faculty_member (`fm_Lname`, `fm_Fname`, ' +
'`fm_Email`, `fm_Username`) VALUES (?, ?, ?, ?)', [options.lname,
options.fname, options.email, options.username], function(err, result) {
if (err) return cb(err);
if (result && result.affectedRows === 1) {
self.user.createUser(options.username, options.password, cb);
} else {
err = new Error('Failed to create user with id "' + options.username
+ '"');
return cb(err);
}
});
};

/**
* Login as a member
* @param {Number} memberId
Expand Down
58 changes: 58 additions & 0 deletions src/controller/member.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
'use strict';

var assert = require('assert');

var Review = require('./review');
var User = require('../model/user');
var Utils = require('./utils');

var Member = function(connection) {
this.conn = connection;
this.user = new User(this.conn);
this.utils = new Utils(this.conn);
this.review = new Review(this.conn);
};

/**
* Remove a member from the system
* @param {String} adminId
* @param {String} memberId
* @param {Function} cb
*/
Member.prototype.removeMember = function(adminId, memberId, cb) {
assert(typeof adminId === 'number');
assert(typeof memberId === 'number');
assert(typeof cb === 'function');

var self = this;

this.utils.getSelectedRole(adminId, function(err, role) {
if (err) return cb (err);
if (role === 'Admin') {
self.utils.getMemberUsername(memberId, function(err, username) {
if (err) return cb(err);
if (username) {
self.conn.query('delete from faculty_member where fm_Id=?',
[memberId], function(err, result) {
if (err) return cb(err);
if (result && result.affectedRows === 1) {
self.user.removeUser(username, cb);
} else {
err = new Error('No member with id ' +
memberId + ' was found to be removed');
return cb(err);
}
});
} else {
err = new Error('Member ' + memberId + ' does not exist');
return cb(err);
}
});
} else {
err = new Error('Member ' + adminId + ' does not have access to remove a member');
return cb(err);
}
});
};

module.exports = Member;
Loading