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 (' + data.email + ') 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 @@
-
+
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
-
- var reset_link = nconf.get('url') + 'reset/' + reset_code;
-
- 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
- });
-
- 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
- });
+ if(err) {
+ return callback(err);
}
+
+ if(!uid) {
+ return callback(new Error('invalid-email'));
+ } else if(parseInt(uid, 10) !== socket.uid) {
+ return callback(new Error('invalid-user'));
+ }
+
+ // 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
+
+ var reset_link = nconf.get('url') + 'reset/' + reset_code;
+
+ 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);
});
}
});