From 1d39b08195fcc061ab8cf089374dbac60aeff5a5 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Mon, 8 Jul 2013 12:10:21 -0400 Subject: [PATCH] password change, closes #66 --- public/css/style.less | 1 - public/src/forum/accountedit.js | 63 +++++++++++++++++++++++++++++++- public/templates/accountedit.tpl | 17 ++++----- src/login.js | 2 +- src/user.js | 45 +++++++++++++++++++++++ src/websockets.js | 8 ++++ 6 files changed, 124 insertions(+), 12 deletions(-) diff --git a/public/css/style.less b/public/css/style.less index 2b7f64c5d6..b24337c26b 100644 --- a/public/css/style.less +++ b/public/css/style.less @@ -204,7 +204,6 @@ footer.footer { .user-profile-picture { width:128px; - height:128px; margin-bottom:10px; } diff --git a/public/src/forum/accountedit.js b/public/src/forum/accountedit.js index f4f97b2629..5899ac81b9 100644 --- a/public/src/forum/accountedit.js +++ b/public/src/forum/accountedit.js @@ -219,5 +219,66 @@ $(document).ready(function() { $('#uploadForm').submit(); }); - + (function handlePasswordChange() { + var currentPassword = $('#inputCurrentPassword'); + var password_notify = $('#password-notify'); + var password_confirm_notify = $('#password-confirm-notify'); + var password = $('#inputNewPassword'); + var password_confirm = $('#inputNewPasswordAgain'); + var passwordvalid = false; + var passwordsmatch = false; + + + function onPasswordChanged() { + passwordvalid = utils.isPasswordValid(password.val()); + if (password.val().length < 6) { + password_notify.html('Password too short'); + password_notify.attr('class', 'label label-important'); + } else if(!passwordvalid) { + password_notify.html('Invalid password'); + password_notify.attr('class', 'label label-important'); + } else { + password_notify.html('OK!'); + password_notify.attr('class', 'label label-success'); + } + + onPasswordConfirmChanged(); + } + + function onPasswordConfirmChanged() { + if(password.val() !== password_confirm.val()) { + password_confirm_notify.html('Passwords must match!'); + password_confirm_notify.attr('class', 'label label-important'); + passwordsmatch = false; + } else { + password_confirm_notify.html('OK!'); + password_confirm_notify.attr('class', 'label label-success'); + passwordsmatch = true; + } + } + + password.on('keyup', onPasswordChanged); + password_confirm.on('keyup', onPasswordConfirmChanged); + + $('#changePasswordBtn').on('click', function() { + if(passwordvalid && passwordsmatch && currentPassword.val()) { + socket.emit('api:user.changePassword', { + 'currentPassword': currentPassword.val(), + 'newPassword': password.val() + }); + } + return false; + }); + + socket.on('api:user.changePassword', function(data) { + currentPassword.val(''); + password.val(''); + password_confirm.val(''); + password_notify.html(''); + password_confirm_notify.html(''); + passwordsmatch = false; + passwordvalid = false; + }); + + }()); }); \ No newline at end of file diff --git a/public/templates/accountedit.tpl b/public/templates/accountedit.tpl index 7f39a8cd3b..e96b9b6d44 100644 --- a/public/templates/accountedit.tpl +++ b/public/templates/accountedit.tpl @@ -80,7 +80,7 @@ -
+
@@ -133,38 +133,37 @@
-
-
-
+
- +
- +
- +
- + - +
+
diff --git a/src/login.js b/src/login.js index 56be3a7b2c..6d676bdb29 100644 --- a/src/login.js +++ b/src/login.js @@ -34,7 +34,7 @@ var user = require('./user.js'), return; } - if (res === true) { + if (res) { next({ status: "ok", user: { diff --git a/src/user.js b/src/user.js index 2f7bdec5f4..b5a488ef15 100644 --- a/src/user.js +++ b/src/user.js @@ -201,6 +201,51 @@ var utils = require('./../public/src/utils.js'), callback({}); } + User.changePassword = function(socket, uid, data, callback) { + if(!utils.isPasswordValid(data.newPassword)) { + socket.emit('event:alert', { + title: 'Error', + message: 'Invalid password!', + type: 'error', + timeout: 2000 + }); + callback(false); + return; + } + + User.getUserField(uid, 'password', function(user_password) { + bcrypt.compare(data.currentPassword, user_password, function(err, res) { + if(err) { + console.log(err); + callback(false); + return; + } + + if (res) { + User.hashPassword(data.newPassword, function(hash) { + User.setUserField(uid, 'password', hash); + + socket.emit('event:alert', { + title: 'Success', + message: 'Your password is updated!', + type: 'success', + timeout: 2000 + }); + callback(true); + }); + } else { + socket.emit('event:alert', { + title: 'Warning', + message: 'Your current password is not correct!', + type: 'warning', + timeout: 2000 + }); + callback(false); + } + }); + }); + } + User.setUserField = function(uid, field, value) { RDB.hset('user:' + uid, field, value); } diff --git a/src/websockets.js b/src/websockets.js index 757bf2c9e3..981b8e77c0 100644 --- a/src/websockets.js +++ b/src/websockets.js @@ -190,6 +190,14 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), user.get_online_users(socket, data); }); + socket.on('api:user.changePassword', function(data) { + user.changePassword(socket, uid, data, function(success) { + if(success) { + socket.emit('api:user.changePassword'); + } + }); + }); + socket.on('api:topics.post', function(data) { topics.post(socket, uid, data.title, data.content, data.category_id); });