crunch-node/user.js

73 lines
2.1 KiB
JavaScript
Raw Normal View History

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;