From efe04c12d3066cf959f238dc2ff2dcb0375a81aa Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 3 Jun 2014 18:39:54 -0400 Subject: [PATCH] closes #1635 if email isnt confirmed, show a warning in account/edit and let users resend confirm email --- public/language/en_GB/notifications.json | 4 ++-- public/src/forum/account/edit.js | 12 ++++++++++++ src/controllers/accounts.js | 2 ++ src/controllers/api.js | 1 + src/socket.io/user.js | 17 +++++++++++++++++ src/user/profile.js | 13 +++++++++---- 6 files changed, 43 insertions(+), 6 deletions(-) diff --git a/public/language/en_GB/notifications.json b/public/language/en_GB/notifications.json index c37595a009..e630f0e801 100644 --- a/public/language/en_GB/notifications.json +++ b/public/language/en_GB/notifications.json @@ -21,6 +21,6 @@ "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", "email-confirm-error": "An error occurred...", - "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired." - + "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", + "email-confirm-sent": "Confirmation email sent." } diff --git a/public/src/forum/account/edit.js b/public/src/forum/account/edit.js index c8e1fe18c0..01bea0c39d 100644 --- a/public/src/forum/account/edit.js +++ b/public/src/forum/account/edit.js @@ -24,6 +24,7 @@ define('forum/account/edit', ['forum/account/header', 'uploader'], function(head handleImageChange(); handleImageUpload(); + handleEmailConfirm(); handlePasswordChange(); updateSignature(); updateImages(); @@ -138,6 +139,17 @@ define('forum/account/edit', ['forum/account/header', 'uploader'], function(head }); } + function handleEmailConfirm() { + $('#confirm-email').on('click', function() { + socket.emit('user.emailConfirm', {}, function(err) { + if (err) { + return app.alertError(err.message); + } + app.alertSuccess('[[notifications:email-confirm-sent]]'); + }); + }); + } + function handlePasswordChange() { var currentPassword = $('#inputCurrentPassword'); var password_notify = $('#password-notify'); diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 163e4d41cc..e96aacd3d2 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -110,6 +110,8 @@ function getUserDataByUserSlug(userslug, callerUID, callback) { userData.theirid = userData.uid; userData.isSelf = parseInt(callerUID, 10) === parseInt(userData.uid, 10); userData.disableSignatures = meta.config.disableSignatures !== undefined && parseInt(meta.config.disableSignatures, 10) === 1; + userData['email:confirmed'] = !!parseInt(userData['email:confirmed'], 10); + userData.followingCount = results.followStats.followingCount; userData.followerCount = results.followStats.followerCount; diff --git a/src/controllers/api.js b/src/controllers/api.js index 91accc05f0..d83cdab13d 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -41,6 +41,7 @@ apiController.getConfig = function(req, res, next) { config.environment = process.env.NODE_ENV; config.isLoggedIn = !!req.user; config['cache-buster'] = meta.config['cache-buster'] || ''; + config.requireEmailConfirmation = parseInt(meta.config.requireEmailConfirmation, 10) === 1; config.version = pkg.version; if (!req.user) { diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 1d84193b64..4747c24d2f 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -24,6 +24,23 @@ SocketUser.emailExists = function(socket, data, callback) { } }; +SocketUser.emailConfirm = function(socket, data, callback) { + if (socket.uid && parseInt(meta.config.requireEmailConfirmation, 10) === 1) { + user.getUserField(socket.uid, 'email', function(err, email) { + if (err) { + return callback(err); + } + + if (!email) { + return; + } + + user.email.verify(socket.uid, email); + callback(); + }); + } +}; + SocketUser.increaseViewCount = function(socket, uid, callback) { if (uid) { if (socket.uid !== parseInt(uid, 10)) { diff --git a/src/user/profile.js b/src/user/profile.js index 02540f2a8e..4ac2a5729b 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -40,7 +40,6 @@ module.exports = function(User) { } next(!available ? new Error('[[error:email-taken]]') : null); - }); }); } @@ -102,9 +101,7 @@ module.exports = function(User) { } } - User.setUserField(uid, field, data[field]); - - next(); + User.setUserField(uid, field, data[field], next); } }; @@ -136,9 +133,17 @@ module.exports = function(User) { function(next) { User.setUserField(uid, 'email', newEmail, next); }, + function(next) { + if (parseInt(meta.config.requireEmailConfirmation, 10) === 1) { + User.email.verify(uid, newEmail); + } + User.setUserField(uid, 'email:confirmed', 0, next); + }, function(next) { if (userData.picture !== userData.uploadedpicture) { User.setUserField(uid, 'picture', gravatarpicture, next); + } else { + next(); } }, ], callback);