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);
 					});
 				}
 			});