From 31d353ab0e2f78661751368c8cfff9afb925e210 Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli <barisusakli@gmail.com> Date: Thu, 16 Jan 2014 21:19:29 -0500 Subject: [PATCH] more fixes --- public/src/forum/reset.js | 35 ++++-------- public/src/forum/reset_code.js | 29 +++++----- public/templates/reset_code.tpl | 2 +- src/socket.io/topics.js | 2 +- src/socket.io/user.js | 6 +-- src/topics.js | 2 +- src/user.js | 96 +++++++++++++-------------------- 7 files changed, 69 insertions(+), 103 deletions(-) diff --git a/public/src/forum/reset.js b/public/src/forum/reset.js index 095f3d8557..810b39077d 100644 --- a/public/src/forum/reset.js +++ b/public/src/forum/reset.js @@ -10,6 +10,17 @@ define(function() { if (inputEl.value.length > 0 && inputEl.value.indexOf('@') !== -1) { socket.emit('user.reset.send', { email: inputEl.value + }, function(err, data) { + if(err) { + return app.alertError(err.message); + } + + var submitEl = document.getElementById('reset'); + + jQuery('#error').hide(); + jQuery('#success').show(); + jQuery('#success p').html('An email has been dispatched to "' + data.email + '" with instructions on setting a new password.'); + inputEl.value = ''; }); } else { jQuery('#success').hide(); @@ -17,30 +28,6 @@ define(function() { errorTextEl.innerHTML = 'Please enter a valid email'; } }; - - ajaxify.register_events(['user.send_reset']); - - socket.on('user.send_reset', function(data) { - var submitEl = document.getElementById('reset'); - - if (data.status === 'ok') { - jQuery('#error').hide(); - jQuery('#success').show(); - jQuery('#success p').html('An email has been dispatched to "' + data.email + '" with instructions on setting a new password.'); - inputEl.value = ''; - } else { - jQuery('#success').hide(); - jQuery(errorEl).show(); - switch (data.message) { - case 'invalid-email': - errorTextEl.innerHTML = 'The email you put in (<span>' + data.email + '</span>) is not registered with us. Please try again.'; - break; - case 'send-failed': - errorTextEl.innerHTML = 'There was a problem sending the reset code. Please try again later.'; - break; - } - } - }); }; return ResetPassword; diff --git a/public/src/forum/reset_code.js b/public/src/forum/reset_code.js index 7eb6c718a4..ccb9e5c5a6 100644 --- a/public/src/forum/reset_code.js +++ b/public/src/forum/reset_code.js @@ -24,6 +24,14 @@ define(function() { socket.emit('user.reset.commit', { code: reset_code, password: password.value + }, function(err) { + if(err) { + return app.alert(err.message); + } + + $('#error').hide(); + $('#notice').hide(); + $('#success').show(); }); } }, false); @@ -31,26 +39,19 @@ define(function() { // Enable the form if the code is valid socket.emit('user.reset.valid', { code: reset_code - }); - + }, function(err, data) { + if(err) { + return app.alertError(err.message); + } - ajaxify.register_events(['user.reset.valid', 'user.reset.commit']); - socket.on('user.reset.valid', function(data) { - if ( !! data.valid) resetEl.disabled = false; - else { + if ( !! data.valid) { + resetEl.disabled = false; + } else { var formEl = document.getElementById('reset-form'); // Show error message $('#error').show(); formEl.parentNode.removeChild(formEl); } - }) - - socket.on('user.reset.commit', function(data) { - if (data.status === 'ok') { - $('#error').hide(); - $('#notice').hide(); - $('#success').show(); - } }); }; diff --git a/public/templates/reset_code.tpl b/public/templates/reset_code.tpl index 6931f6c346..c3590746d4 100644 --- a/public/templates/reset_code.tpl +++ b/public/templates/reset_code.tpl @@ -30,7 +30,7 @@ <input class="form-control input-lg" type="password" placeholder="A new password" id="password" /><br /> <label for="repeat">[[reset_password:repeat_password]]</label> <input class="form-control input-lg" type="password" placeholder="The same password" id="repeat" /><br /> - <button class="btn btn-primary btn-lg btn-block" id="reset" type="submit" disabled>[[reset_password:reset_password]]</button> + <button class="btn btn-primary btn-lg btn-block" id="reset" type="submit">[[reset_password:reset_password]]</button> </form> </div> <input type="hidden" template-variable="reset_code" value="{reset_code}" /> diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index d8eb132a0c..d79bb1b8a6 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -77,7 +77,7 @@ SocketTopics.markAllRead = function(socket, data, callback) { return callback(err); } - index.server.sockets.in('uid_' + socket.uid).emit('event:unread.updateCount', 0); + index.server.sockets.in('uid_' + socket.uid).emit('event:unread.updateCount', null, 0); callback(null); }); diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 0888f57eed..81df38e33a 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -24,19 +24,19 @@ SocketUser.reset = {}; SocketUser.reset.send = function(socket, data, callback) { if(data && data.email) { - user.reset.send(socket, data.email); + user.reset.send(socket, data.email, callback); } }; SocketUser.reset.valid = function(socket, data, callback) { if(data && data.code) { - user.reset.validate(socket, data.code); + user.reset.validate(socket, data.code, callback); } }; SocketUser.reset.commit = function(socket, data, callback) { if(data && data.code && data.password) { - user.reset.commit(socket, data.code, data.password); + user.reset.commit(socket, data.code, data.password, callback); } }; diff --git a/src/topics.js b/src/topics.js index f648dbeb17..bbe0115535 100644 --- a/src/topics.js +++ b/src/topics.js @@ -624,7 +624,7 @@ var async = require('async'), async.each(uids, function(uid, next) { Topics.getUnreadTids(uid, 0, 19, function(err, tids) { - websockets.in('uid_' + uid).emit('event:unread.updateCount', tids.length); + websockets.in('uid_' + uid).emit('event:unread.updateCount', null, tids.length); next(); }); }, function(err) { diff --git a/src/user.js b/src/user.js index 09155e17f7..6683de6d3a 100644 --- a/src/user.js +++ b/src/user.js @@ -770,92 +770,72 @@ var bcrypt = require('bcrypt'), User.reset = { validate: function(socket, code, callback) { - if (typeof callback !== 'function') { - callback = null; - } - db.getObjectField('reset:uid', code, function(err, uid) { if (err) { - return callback(false); + return callback(err); } if (uid !== null) { db.getObjectField('reset:expiry', code, function(err, expiry) { if (err) { - return callback(false); + return callback(err); } if (expiry >= +Date.now() / 1000 | 0) { - if (!callback) { - socket.emit('user:reset.valid', { - valid: true - }); - } else { - callback(true); - } + callback(null, true); } else { // Expired, delete from db db.deleteObjectField('reset:uid', code); db.deleteObjectField('reset:expiry', code); - if (!callback) { - socket.emit('user:reset.valid', { - valid: false - }); - } else { - callback(false); - } + callback(null, false); } }); } else { - if (!callback) { - socket.emit('user:reset.valid', { - valid: false - }); - } else { - callback(false); - } + callback(null, false); } }); }, - send: function(socket, email) { + send: function(socket, email, callback) { User.getUidByEmail(email, function(err, uid) { - if (uid !== null) { - // Generate a new reset code - var reset_code = utils.generateUUID(); - db.setObjectField('reset:uid', reset_code, uid); - db.setObjectField('reset:expiry', reset_code, (60 * 60) + new Date() / 1000 | 0); // Active for one hour + if(err) { + return callback(err); + } - var reset_link = nconf.get('url') + 'reset/' + reset_code; + if(!uid) { + return callback(new Error('invalid-email')); + } else if(parseInt(uid, 10) !== socket.uid) { + return callback(new Error('invalid-user')); + } - Emailer.send('reset', uid, { - 'site_title': (meta.config['title'] || 'NodeBB'), - 'reset_link': reset_link, + // Generate a new reset code + var reset_code = utils.generateUUID(); + db.setObjectField('reset:uid', reset_code, uid); + db.setObjectField('reset:expiry', reset_code, (60 * 60) + new Date() / 1000 | 0); // Active for one hour - subject: 'Password Reset Requested - ' + (meta.config['title'] || 'NodeBB') + '!', - template: 'reset', - uid: uid - }); + var reset_link = nconf.get('url') + 'reset/' + reset_code; - socket.emit('user.send_reset', { - status: "ok", - message: "code-sent", - email: email - }); - } else { - socket.emit('user.send_reset', { - status: "error", - message: "invalid-email", - email: email - }); - } + Emailer.send('reset', uid, { + 'site_title': (meta.config['title'] || 'NodeBB'), + 'reset_link': reset_link, + + subject: 'Password Reset Requested - ' + (meta.config['title'] || 'NodeBB') + '!', + template: 'reset', + uid: uid + }); + + callback(null); }); }, - commit: function(socket, code, password) { - this.validate(socket, code, function(validated) { + commit: function(socket, code, password, callback) { + this.validate(socket, code, function(err, validated) { + if(err) { + return callback(err); + } + if (validated) { db.getObjectField('reset:uid', code, function(err, uid) { if (err) { - return; + return callback(err); } User.hashPassword(password, function(err, hash) { @@ -866,9 +846,7 @@ var bcrypt = require('bcrypt'), db.deleteObjectField('reset:uid', code); db.deleteObjectField('reset:expiry', code); - socket.emit('user:reset.commit', { - status: 'ok' - }); + callback(null); }); } });