From be87ea7d7769c1f9d0a8289ac97c2f70cf368f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Stani=C4=87?= Date: Sat, 24 Jan 2015 11:22:47 +0100 Subject: [PATCH 1/9] Update meanUser.js --- packages/users/public/controllers/meanUser.js | 97 +++++-------------- 1 file changed, 23 insertions(+), 74 deletions(-) diff --git a/packages/users/public/controllers/meanUser.js b/packages/users/public/controllers/meanUser.js index 52203b0b22..7d7acb1fb0 100644 --- a/packages/users/public/controllers/meanUser.js +++ b/packages/users/public/controllers/meanUser.js @@ -34,31 +34,14 @@ angular.module('mean.users') $scope.input.tooltipText = $scope.input.tooltipText === 'Show password' ? 'Hide password' : 'Show password'; }; + // Watch for loginfail event and update $scope.loginerror + $rootScope.$on('loginfail', function(){ + $scope.loginerror = MeanUser.loginerror; + }); + // Register the login() function $scope.login = function() { - $http.post('/login', { - email: $scope.user.email, - password: $scope.user.password - }) - .success(function(response) { - // authentication OK - $scope.loginError = 0; - $rootScope.user = response.user; - $rootScope.$emit('loggedin'); - if (response.redirect) { - if (window.location.href === response.redirect) { - //This is so an admin user will get full admin page - window.location.reload(); - } else { - window.location = response.redirect; - } - } else { - $location.url('/'); - } - }) - .error(function() { - $scope.loginerror = 'Authentication failed.'; - }); + MeanUser.login($scope.user); }; } ]) @@ -88,34 +71,16 @@ angular.module('mean.users') $scope.input.iconClassConfirmPass = $scope.input.iconClassConfirmPass === 'icon_hide_password' ? '' : 'icon_hide_password'; $scope.input.tooltipTextConfirmPass = $scope.input.tooltipTextConfirmPass === 'Show password' ? 'Hide password' : 'Show password'; }; + + // Watch for registerfail event and update error messages in $scope + $rootScope.$on('registerfail', function(){ + $scope.usernameError = MeanUser.usernameError; + $scope.registerError = MeanUser.registerError; + $scope.emailError = MeanUser.emailError; + }); - $scope.register = function() { - $scope.usernameError = null; - $scope.registerError = null; - $http.post('/register', { - email: $scope.user.email, - password: $scope.user.password, - confirmPassword: $scope.user.confirmPassword, - username: $scope.user.username, - name: $scope.user.name - }) - .success(function() { - // authentication OK - $scope.registerError = 0; - $rootScope.user = $scope.user; - Global.user = $rootScope.user; - Global.authenticated = !! $rootScope.user; - $rootScope.$emit('loggedin'); - $location.url('/'); - }) - .error(function(error) { - // Error: authentication failed - if (error === 'Username already taken') { - $scope.usernameError = error; - } else if (error === 'Email already taken') { - $scope.emailError = error; - } else $scope.registerError = error; - }); + $scope.register = function (){ + MeanUser.register($scope.user); }; } ]) @@ -142,31 +107,15 @@ angular.module('mean.users') $scope.user = {}; $scope.global = Global; $scope.global.registerForm = false; + + // Watch for resetpasswordfail event and update error messages in $scope + $rootScope.$on('resetpasswordfail', function(){ + $scope.resetpassworderror = MeanUser.resetpassworderror; + $scope.validationError = MeanUser.validationError; + }); + $scope.resetpassword = function() { - $http.post('/reset/' + $stateParams.tokenId, { - password: $scope.user.password, - confirmPassword: $scope.user.confirmPassword - }) - .success(function(response) { - $rootScope.user = response.user; - $rootScope.$emit('loggedin'); - if (response.redirect) { - if (window.location.href === response.redirect) { - //This is so an admin user will get full admin page - window.location.reload(); - } else { - window.location = response.redirect; - } - } else { - $location.url('/'); - } - }) - .error(function(error) { - if (error.msg === 'Token invalid or expired') - $scope.resetpassworderror = 'Could not update password as token is invalid or may have expired'; - else - $scope.validationError = error; - }); + MeanUser.resetpassword($scope.user); }; } ]); From 64d1db0050f46ee5cdfcefac207a4230eb56369f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Stani=C4=87?= Date: Sat, 24 Jan 2015 11:24:38 +0100 Subject: [PATCH 2/9] Update meanUser.js As per description in: https://github.com/linnovate/mean/wiki/Revamp-of-users-package --- packages/users/public/services/meanUser.js | 120 +++++++++++++++++++-- 1 file changed, 114 insertions(+), 6 deletions(-) diff --git a/packages/users/public/services/meanUser.js b/packages/users/public/services/meanUser.js index 7da8f78dd7..994647c175 100644 --- a/packages/users/public/services/meanUser.js +++ b/packages/users/public/services/meanUser.js @@ -1,10 +1,118 @@ 'use strict'; -angular.module('mean.users').factory('MeanUser', [ +angular.module('mean.users').factory('MeanUser', [ '$rootScope', '$http', '$location', '$window', '$stateParams', 'Global', + function($rootScope, $http, $location, $window, $stateParams, Global) { + var MeanUserFactory = {}; - function() { - return { - name: 'users' - }; - } + MeanUserFactory.name = 'users'; + + MeanUserFactory.loginerror = 0; + MeanUserFactory.usernameError = null; + MeanUserFactory.registerError = null; + MeanUserFactory.resetpassworderror = null; + MeanUserFactory.validationError = null; + + MeanUserFactory.login = function (user) { + // this is an ugly hack due to mean-admin needs + var destination = $location.path().indexOf('/login') === -1 ? $location.absUrl() : false; + $http.post('/login', { + email: user.email, + password: user.password, + redirect: destination + }) + .success(function(response) { + // authentication OK + MeanUserFactory.loginerror = 0; + $rootScope.user = response.user; + Global.user = response.user; + $window.user = response.user; + Global.authenticated = !! $rootScope.user; + $rootScope.$emit('loggedin'); + if (response.redirect) { + if ($window.location.href === response.redirect && response.user.roles.indexOf('admin') !== -1) { + //This is so an admin user will get full admin page, but no need to refresh if user is not admin + $window.location.reload(); + } else { + $window.location = response.redirect; + } + } else { + if (response.user.roles.indexOf('admin') !== -1) { + $window.location.reload(); + } + else { + $location.url('/'); + } + } + }) + .error(function(response) { + $location.path(response.redirect); + MeanUserFactory.loginerror = 'Authentication failed.'; + $rootScope.$emit('loginfail'); + }); + }; + + MeanUserFactory.register = function(user) { + MeanUserFactory.usernameError = null; + MeanUserFactory.registerError = null; + $http.post('/register', { + email: user.email, + password: user.password, + confirmPassword: user.confirmPassword, + username: user.username, + name: user.name + }) + .success(function() { + // authentication OK + MeanUserFactory.registerError = 0; + $rootScope.user = user; + Global.user = $rootScope.user; + $window.user = $rootScope.user; + Global.authenticated = !! $rootScope.user; + $rootScope.$emit('loggedin'); + $location.url('/'); + }) + .error(function(error) { + // Error: authentication failed + if (error === 'Username already taken') { + MeanUserFactory.usernameError = error; + } else if (error === 'Email already taken') { + MeanUserFactory.emailError = error; + } else MeanUserFactory.registerError = error; + $rootScope.$emit('registerfail'); + }); + }; + + MeanUserFactory.resetpassword = function(user) { + $http.post('/reset/' + $stateParams.tokenId, { + password: user.password, + confirmPassword: user.confirmPassword + }) + .success(function(response) { + $rootScope.user = response.user; + Global.user = response.user; + $window.user = response.user; + Global.authenticated = !! response.user; + $rootScope.$emit('loggedin'); + if (response.redirect) { + if ($window.location.href === response.redirect) { + //This is so an admin user will get full admin page + $window.location.reload(); + } else { + $window.location = response.redirect; + } + } else { + $location.url('/'); + } + }) + .error(function(error) { + if (error.msg === 'Token invalid or expired') + MeanUserFactory.resetpassworderror = 'Could not update password as token is invalid or may have expired'; + else + MeanUserFactory.validationError = error; + $rootScope.$emit('resetpasswordfail'); + }); + }; + + return MeanUserFactory; + } ]); From c5a816d02fdf2df6bef23fd894d8e8f142b1ed33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Stani=C4=87?= Date: Sat, 24 Jan 2015 11:25:32 +0100 Subject: [PATCH 3/9] Update users.js As per article https://github.com/linnovate/mean/wiki/Revamp-of-users-package --- packages/users/server/routes/users.js | 30 +++++++++++++++++++-------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/users/server/routes/users.js b/packages/users/server/routes/users.js index 8a6f0a3838..83d379b6ac 100644 --- a/packages/users/server/routes/users.js +++ b/packages/users/server/routes/users.js @@ -31,15 +31,27 @@ module.exports = function(MeanUser, app, auth, database, passport) { }); // Setting the local strategy route - app.route('/login') - .post(passport.authenticate('local', { - failureFlash: true - }), function(req, res) { - res.send({ - user: req.user, - redirect: (req.user.roles.indexOf('admin') !== -1) ? req.get('referer') : false - }); - }); + app.post('/login', function(req, res, next) { + passport.authenticate('local', { + failureFlash: true + }, function(err, user, info) { + // in case of exception + if (err) { return next(err); } + // if login fails due to wrong credentials + /*if (!user) { + //return res.redirect('/login'); + res.send({ redirect: '#!' + req.body.redirect }); + }*/ + // if login successful, execute login + req.logIn(user, function(err) { + if (err) { return next(err); } + res.send({ + user: req.user, + redirect: req.body.redirect + }); + }); + })(req, res, next); + }); // AngularJS route to get config of social buttons app.route('/get-config') From 00a6fe9d5ba12107127e5d0b7709828ac83e31ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Stani=C4=87?= Date: Tue, 27 Jan 2015 20:40:43 +0100 Subject: [PATCH 4/9] Update meanUser.js --- packages/users/public/controllers/meanUser.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/users/public/controllers/meanUser.js b/packages/users/public/controllers/meanUser.js index 7d7acb1fb0..e9c491bfe1 100644 --- a/packages/users/public/controllers/meanUser.js +++ b/packages/users/public/controllers/meanUser.js @@ -13,8 +13,8 @@ angular.module('mean.users') }); } ]) - .controller('LoginCtrl', ['$scope', '$rootScope', '$http', '$location', 'Global', - function($scope, $rootScope, $http, $location, Global) { + .controller('LoginCtrl', ['$scope', '$rootScope', '$http', '$location', 'Global', 'MeanUser', + function($scope, $rootScope, $http, $location, Global, MeanUser) { // This object will be filled by the form $scope.user = {}; $scope.global = Global; @@ -45,8 +45,8 @@ angular.module('mean.users') }; } ]) - .controller('RegisterCtrl', ['$scope', '$rootScope', '$http', '$location', 'Global', - function($scope, $rootScope, $http, $location, Global) { + .controller('RegisterCtrl', ['$scope', '$rootScope', '$http', '$location', 'Global', 'MeanUser', + function($scope, $rootScope, $http, $location, Global, MeanUser) { $scope.user = {}; $scope.global = Global; $scope.global.registerForm = true; @@ -102,8 +102,8 @@ angular.module('mean.users') }; } ]) - .controller('ResetPasswordCtrl', ['$scope', '$rootScope', '$http', '$location', '$stateParams', 'Global', - function($scope, $rootScope, $http, $location, $stateParams, Global) { + .controller('ResetPasswordCtrl', ['$scope', '$rootScope', '$http', '$location', '$stateParams', 'Global', 'MeanUser' + function($scope, $rootScope, $http, $location, $stateParams, Global, MeanUser) { $scope.user = {}; $scope.global = Global; $scope.global.registerForm = false; From 1d56d5e64859751fe25b98a424fd9e01be7dd5c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Stani=C4=87?= Date: Tue, 27 Jan 2015 20:45:53 +0100 Subject: [PATCH 5/9] Update meanUser.js --- packages/users/public/controllers/meanUser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/users/public/controllers/meanUser.js b/packages/users/public/controllers/meanUser.js index e9c491bfe1..9dbbb84bb4 100644 --- a/packages/users/public/controllers/meanUser.js +++ b/packages/users/public/controllers/meanUser.js @@ -102,7 +102,7 @@ angular.module('mean.users') }; } ]) - .controller('ResetPasswordCtrl', ['$scope', '$rootScope', '$http', '$location', '$stateParams', 'Global', 'MeanUser' + .controller('ResetPasswordCtrl', ['$scope', '$rootScope', '$http', '$location', '$stateParams', 'Global', 'MeanUser', function($scope, $rootScope, $http, $location, $stateParams, Global, MeanUser) { $scope.user = {}; $scope.global = Global; From d366309c4a55d407760932691e42bdf3f0231a89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Stani=C4=87?= Date: Tue, 27 Jan 2015 23:47:07 +0100 Subject: [PATCH 6/9] Update meanUser.js --- packages/users/public/controllers/meanUser.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/users/public/controllers/meanUser.js b/packages/users/public/controllers/meanUser.js index 9dbbb84bb4..06527db3ea 100644 --- a/packages/users/public/controllers/meanUser.js +++ b/packages/users/public/controllers/meanUser.js @@ -78,6 +78,10 @@ angular.module('mean.users') $scope.registerError = MeanUser.registerError; $scope.emailError = MeanUser.emailError; }); + + $rootScope.$on('loggedin', function(){ + $scope.registerError = MeanUser.registerError; + }); $scope.register = function (){ MeanUser.register($scope.user); From 426e396c17fcb258b03426819aa9d69c772aa16e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Stani=C4=87?= Date: Tue, 27 Jan 2015 23:54:20 +0100 Subject: [PATCH 7/9] Update meanUser.js --- packages/users/public/controllers/meanUser.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/users/public/controllers/meanUser.js b/packages/users/public/controllers/meanUser.js index 06527db3ea..4dc1f96bb4 100644 --- a/packages/users/public/controllers/meanUser.js +++ b/packages/users/public/controllers/meanUser.js @@ -58,6 +58,10 @@ angular.module('mean.users') tooltipText: 'Show password', tooltipTextConfirmPass: 'Show password' }; + + $scope.usernameError = MeanUser.usernameError; + $scope.registerError = MeanUser.registerError; + $scope.emailError = MeanUser.emailError; $scope.togglePasswordVisible = function() { $scope.input.type = $scope.input.type === 'text' ? 'password' : 'text'; From eb5e035172c96eecbddd6bdecbe1a40e43aa13f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Stani=C4=87?= Date: Tue, 27 Jan 2015 23:54:38 +0100 Subject: [PATCH 8/9] Update meanUser.js --- packages/users/public/services/meanUser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/users/public/services/meanUser.js b/packages/users/public/services/meanUser.js index 994647c175..0ecbbcbe2b 100644 --- a/packages/users/public/services/meanUser.js +++ b/packages/users/public/services/meanUser.js @@ -8,7 +8,7 @@ angular.module('mean.users').factory('MeanUser', [ '$rootScope', '$http', '$loca MeanUserFactory.loginerror = 0; MeanUserFactory.usernameError = null; - MeanUserFactory.registerError = null; + MeanUserFactory.registerError = 0; MeanUserFactory.resetpassworderror = null; MeanUserFactory.validationError = null; From fb4a6e251c255973f2e39fa783566a5f234fce6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Stani=C4=87?= Date: Wed, 28 Jan 2015 00:06:34 +0100 Subject: [PATCH 9/9] Update meanUser.js --- packages/users/public/services/meanUser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/users/public/services/meanUser.js b/packages/users/public/services/meanUser.js index 0ecbbcbe2b..4ef47efad9 100644 --- a/packages/users/public/services/meanUser.js +++ b/packages/users/public/services/meanUser.js @@ -28,7 +28,7 @@ angular.module('mean.users').factory('MeanUser', [ '$rootScope', '$http', '$loca $window.user = response.user; Global.authenticated = !! $rootScope.user; $rootScope.$emit('loggedin'); - if (response.redirect) { + if (response.redirect && angular.isDefined(response.user)) { if ($window.location.href === response.redirect && response.user.roles.indexOf('admin') !== -1) { //This is so an admin user will get full admin page, but no need to refresh if user is not admin $window.location.reload();