userauthjs
Version:
Node module for management of user/group privileges and sessions
165 lines (157 loc) • 5.26 kB
JavaScript
var bcrypt = require('bcrypt')
var User = require('./models/user')
var Usergroup = require('./models/usergroup')
var Privilege = require('./models/privilege')
exports.add = function(username, password, email, next) {
User.findOne({ username: username }, function (err, existingUser) {
if (err) { return next(err) }
if (existingUser) { return next(null, false) }
var user = new User({
username: username,
email: email
})
Usergroup.findOne({ groupname: 'user' }, function (err, usergroup) {
if (err) { return next(err) }
if (!usergroup) { return next(null, false) }
user.usergroups = [ usergroup._id ]
bcrypt.hash(password, 10, function (err, hash) {
if (err) { return next(err) }
if (!hash) { return next(null, false) }
user.password = hash
user.save(function (err, user) {
if (err) { return next(err) }
if (!user) { return next(null, false) }
if (process.env.USERAUTH_LOG) { console.log('User added: ' + user.username) }
next(null, user)
})
})
})
})
}
exports.remove = function(username, password, next) {
User.findOne({ username: username })
.select('password')
.exec(function(err, user) {
if (err) { return next(err) }
if (!user) { return next(null, false) }
if (!user.password || !password) { return next(null,false) }
bcrypt.compare(password, user.password, function(err, valid) {
if (err) { return next(err) }
if (!valid) { return next(null, false) }
user.remove(function(err, user) {
if (err) { return next(err) }
if (!user) { return next(null, false) }
if (process.env.USERAUTH_LOG) { console.log('User removed: ' + user.username) }
next(null, user)
})
})
})
}
exports.rename = function(username, newusername, next) {
User.findOne({ username: username }, function(err, user) {
if (err) { return next(err) }
if (!user) { return next(null, false) }
User.findOne({username:newusername}, function(err, anotheruser) {
if (err) { return next(err) }
if (anotheruser) {
return next(null, false)
} else {
user.username = newusername
user.save(function(err, user) {
if (err) { return next(err) }
if (!user) { return next(null, false) }
if (process.env.USERAUTH_LOG) { console.log('User renamed: from \'' + username + '\' to \'' + newusername + '\'') }
next(null, user)
})
}
})
})
}
/**
* Change user password
*/
exports.changePassword = function(username, password, newpassword, next) {
User.findOne({ username: username })
.select('password')
.exec(function(err, user) {
if (err) { return next(err) }
if (!user || user === undefined) { return next(null, false) }
bcrypt.compare(password, user.password, function(err, valid) {
if (err) { return next(err) }
if (!valid) { return next(null, false) }
bcrypt.hash(newpassword, 10, function (err, hash) {
if (err) { return next(err) }
user.password = hash
user.save(function (err, user) {
if (err) { return next(err) }
if (!user) { return next(null, false) }
if (process.env.USERAUTH_LOG) { console.log('User added: ' + user.username) }
next(null, user)
})
})
})
})
}
/**
* Change user email address.
* This function should only get called from within an active session.
*/
exports.changeEmail = function(username, password, newemail, next) {
User.findOne({ username: username })
.select('password')
.exec(function(err, user) {
if (err) { return next(err) }
if (!user || user === undefined) { return next(null, false) }
bcrypt.compare(password, user.password, function(err, valid) {
if (err) { return next(err) }
if (!valid) { return next(null, false) }
if (!newemail) {return next(null, false) }
user.email = newemail
user.save(function (err, user) {
if (err) { return next(err) }
if (!user) { return next(null, false) }
User.findById(user._id)
.select('email')
.exec(function(err, user) {
if (err) { return next(err) }
if (!user) { return next(null, false) }
if (process.env.USERAUTH_LOG) { console.log('User added: ' + user.username) }
next(null, user)
})
})
})
})
}
/**
* Reset user password by entering username or email
*/
exports.resetPassword = function(usernameOrEmail, next) {
User.findOne( { $or:[{ username: usernameOrEmail }, { email: usernameOrEmail }] }, function(err, user) {
if (err) { return next(err) }
if (!user) { return next(null, false) }
var userinfo = {}
userinfo.username = user.username
userinfo.email = user.email
var password = generatePassword(10)
bcrypt.hash(password, 10, function (err, hash) {
if (err) { return next(err) }
if (!hash) { return next(null, false) }
user.password = hash
user.save(function(err, user) {
if (err) { return next(err) }
if (!user) { return next(null, false) }
userinfo.password = password
if (process.env.USERAUTH_LOG) { console.log('Password reset for user: ' + user.username) }
return next(null, userinfo)
})
})
})
}
var generatePassword = function(passwordLength) {
var _sym = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVQXYZ1234567890'
var password = ''
for (var i=0; i < passwordLength; i++) {
password += _sym[parseInt(Math.random() * (_sym.length))]
}
return password
}