function changePassword(email, newPassword, callback) {
var crypto = require('crypto');
var Connection = require('tedious').Connection;
var Request = require('tedious').Request;
var TYPES = require('tedious').TYPES
var connection = new Connection({
userName: 'the username',
password: 'the password',
server: 'the server',
options: {
database: 'the db name',
// encrypt: true para Windows Azure, habilitar esto
}
});
/**
* hashPassword
*
* Esta función genera un hash de una contraseña usando el algoritmo HMAC SHA256.
*
* @password {[string]} contraseña a hashear
* @salt {[string]} salt a utilizar en el proceso de hash
* @callback {[function]} callback a invocar después de hashear la contraseña
*/
function hashPassword(password, salt, callback) {
var iterations = 1000;
var passwordHashLength = 32;
crypto.pbkdf2(password, salt, iterations, passwordHashLength, function (err, hashed) {
if (err) {
return callback(err);
}
var result = Buffer.concat([Buffer.from([0], 1), salt, Buffer.from(hashed, 'binary')]);
var resultBase64 = result.toString('base64');
callback(null, resultBase64);
});
}
connection.on('debug', function(text) {
// si tiene problemas de conexión, descomente esto para obtener información más detallada
//console.log(text);
}).on('errorMessage', function(text) {
// esto mostrará cualquier error al conectarse a la base de datos SQL o con las sentencias SQL
console.log(JSON.stringify(text));
});
connection.on('connect', function (err) {
if (err) {
return callback(err);
}
updateMembershipUser(email, newPassword, function(err, wasUpdated) {
if (err) {
return callback(err); // esto devolverá un 500
}
callback(null, wasUpdated);
});
});
function findUserId(email, callback) {
var findUserIdFromEmail =
'SELECT UserProfile.UserId FROM ' +
'UserProfile INNER JOIN webpages_Membership ' +
'ON UserProfile.UserId = webpages_Membership.UserId ' +
'WHERE UserName = @Email';
var findUserIdFromEmailQuery = new Request(findUserIdFromEmail, function (err, rowCount, rows) {
if (err) {
return callback(err);
}
// No se encontró ningún registro con ese correo electrónico
if (rowCount < 1) {
return callback(null, null);
}
var userId = rows[0][0].value;
callback(null, userId);
});
findUserIdFromEmailQuery.addParameter('Email', TYPES.VarChar, email);
connection.execSql(findUserIdFromEmailQuery);
}
function updateMembershipUser(email, newPassword, callback) {
findUserId(email, function (err, userId) {
if (err) {
return callback(err);
}
if (userId === null) {
return callback();
}
var salt = crypto.randomBytes(16);
var updateMembership =
'UPDATE webpages_Membership '+
'SET Password=@NewPassword, PasswordChangedDate=GETDATE() '+
'WHERE UserId=@UserId';
var updateMembershipQuery = new Request(updateMembership, function (err, rowCount) {
if (err) {
return callback(err);
}
if (rowCount < 1) {
return callback();
}
callback(null, rowCount > 0);
});
hashPassword(newPassword, salt, function (err, hashedPassword) {
if (err) {
return callback(err);
}
updateMembershipQuery.addParameter('NewPassword', TYPES.VarChar, hashedPassword);
updateMembershipQuery.addParameter('UserId', TYPES.VarChar, userId);
connection.execSql(updateMembershipQuery);
});
});
}
}