From 5025c4bac6884cd7fccfac6f490f09c63a601a50 Mon Sep 17 00:00:00 2001 From: 3onyc <3onyc@x3tech.com> Date: Thu, 12 Jun 2014 16:34:10 +0200 Subject: [PATCH] Implement "Change username" feature --- public/js/controllers/settingsCtrl.js | 14 ++++++++++++++ src/controllers/auth.js | 25 +++++++++++++++++++++++++ src/routes/auth.js | 1 + views/options/settings.jade | 12 ++++++++++++ 4 files changed, 52 insertions(+) diff --git a/public/js/controllers/settingsCtrl.js b/public/js/controllers/settingsCtrl.js index 5bbb13be86..bff15f4911 100644 --- a/public/js/controllers/settingsCtrl.js +++ b/public/js/controllers/settingsCtrl.js @@ -65,6 +65,20 @@ habitrpg.controller('SettingsCtrl', $rootScope.$state.go('tasks'); } + $scope.changeUsername = function(changeUser){ + if (!changeUser.newUsername || !changeUser.password) { + return alert(window.env.t('fillAll')); + } + $http.post(API_URL + '/api/v2/user/change-username', changeUser) + .success(function(){ + alert(window.env.t('usernameSuccess')); + $scope.changeUser = {}; + }) + .error(function(data){ + alert(data); + }); + } + $scope.changePassword = function(changePass){ if (!changePass.oldPassword || !changePass.newPassword || !changePass.confirmNewPassword) { return alert(window.env.t('fillAll')); diff --git a/src/controllers/auth.js b/src/controllers/auth.js index 42cfe4da1b..50da8f6c60 100644 --- a/src/controllers/auth.js +++ b/src/controllers/auth.js @@ -195,6 +195,31 @@ api.resetPassword = function(req, res, next){ }); }; +api.changeUsername = function(req, res, next) { + var user = res.locals.user, + password = req.body.password + newUsername = req.body.newUsername; + + User.findOne({'auth.local.username': newUsername}, function(err, result) { + if (err) next(err); + + if(result) + return res.json(401, {err: "Username already taken"}); + + var salt = user.auth.local.salt, + hashed_password = utils.encryptPassword(password, salt); + + if (hashed_password !== user.auth.local.hashed_password) + return res.json(401, {err:"Incorrect password"}); + + user.auth.local.username = newUsername; + user.save(function(err, saved){ + if (err) next(err); + res.send(200); + }) + }); +} + api.changePassword = function(req, res, next) { var user = res.locals.user, oldPassword = req.body.oldPassword, diff --git a/src/routes/auth.js b/src/routes/auth.js index edc54bc81d..616f9cf7d6 100644 --- a/src/routes/auth.js +++ b/src/routes/auth.js @@ -10,6 +10,7 @@ router.post('/api/v2/user/auth/local', i18n.getUserLanguage, auth.loginLocal); router.post('/api/v2/user/auth/facebook', i18n.getUserLanguage, auth.loginFacebook); router.post('/api/v2/user/reset-password', i18n.getUserLanguage, auth.resetPassword); router.post('/api/v2/user/change-password', i18n.getUserLanguage, auth.auth, auth.changePassword); +router.post('/api/v2/user/change-username', i18n.getUserLanguage, auth.auth, auth.changeUsername); router.post('/api/v1/register', i18n.getUserLanguage, auth.registerUser); router.post('/api/v1/user/auth/local', i18n.getUserLanguage, auth.loginLocal); diff --git a/views/options/settings.jade b/views/options/settings.jade index 7aa325c224..f0fc9bbf24 100644 --- a/views/options/settings.jade +++ b/views/options/settings.jade @@ -79,6 +79,18 @@ script(type='text/ng-template', id='partials/options.settings.settings.html') input.form-control(type='text', ng-model='_couponCode', placeholder='Enter Coupon Code') button.btn.btn-primary(type='submit') Submit + div(ng-if='user.auth.local.username') + .panel.panel-default + .panel-heading + span=env.t('changeUsername') + .panel-body + form(ng-submit='changeUsername(changeUser)', ng-show='user.auth.local') + .form-group + input.form-control(type='text', placeholder=env.t('newUsername'), ng-model='changeUser.newUsername', required) + .form-group + input.form-control(type='password', placeholder=env.t('password'), ng-model='changeUser.password', required) + input.btn.btn-default(type='submit', value=env.t('submit')) + //- Why is ng-if='user.auth.local' validating for users *without* user.auth.local (facebook users)? adding .username here for extra div(ng-if='user.auth.local.username') .panel.panel-default