var crypto = require('crypto'); var schemas = require("./schemas.js"); var _ = require("lodash"); var User = function(data) { this.data = data; } User.prototype.data = {} User.prototype.get = function (name) { return this.data[name]; } User.prototype.set = function (name, value) { this.data[name] = value; } User.prototype.sanitize = function (data) { data = data || {}; schema = schemas.user; return _.pick(_.defaults(data, schema), _.keys(schema)); } User.prototype.save = function (callback) { var self = this; this.data = this.sanitize(this.data); db.collection("users").update({username:username},this.data, callback(err, count)); } // Function to look up a user document by the users username User.getByUsername = function (username, callback) { // console.log("Getting user document for: "+username); db.collection("users").findOne({username:username}, function(err, doc) { callback(null, new User(doc)); }); } // Function to verify authentication via a username and password. // Requires internal hashing function. User.verify = function (username, password, callback) { console.log("Verifying user: "+username); db.collection("users").findOne({username: username}, function(err, doc) { if (err || !doc) { console.log("Username "+username+" does not exist"); console.log(err); callback(err, null); } else { // console.log("Username "+username+" exists"); // console.log(username + "'s salt is " + doc.salt); var hash = hashPassword(password, doc.salt); console.log(username+" is logging in with a hashed password of "+hash); db.collection("users").findOne({username: username, password: hash}, function(err, doc) { callback(err, doc); }); } }); } // Helper functions, internal to model hashPassword = function(password, salt) { var hash = crypto.createHash('sha256'); hash.update(password); hash.update(salt); return hash.digest('hex'); } module.exports = User;