# IGNITE-843 Cleanup forgot password.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/7d5299e8 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/7d5299e8 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/7d5299e8 Branch: refs/heads/ignite-843 Commit: 7d5299e8cf026b2af0dd32506f5691ade6112a4e Parents: facf9b6 Author: Andrey <anovi...@gridgain.com> Authored: Mon Aug 17 15:10:29 2015 +0700 Committer: Andrey <anovi...@gridgain.com> Committed: Mon Aug 17 15:10:29 2015 +0700 ---------------------------------------------------------------------- .../src/main/js/routes/public.js | 57 +++++++++++++++++++- .../src/main/js/views/login.jade | 31 ++++++----- 2 files changed, 74 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7d5299e8/modules/control-center-web/src/main/js/routes/public.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/routes/public.js b/modules/control-center-web/src/main/js/routes/public.js index ef00f56..e29c7e6 100644 --- a/modules/control-center-web/src/main/js/routes/public.js +++ b/modules/control-center-web/src/main/js/routes/public.js @@ -112,9 +112,9 @@ router.get('/logout', function (req, res) { }); /** - * Request for password reset and send e-mail to user with reset token. + * Send e-mail to user with reset token. */ -router.post('/request_password_reset', function(req, res) { +router.post('/forgot_password', function(req, res) { var transporter = { service: config.get('smtp:service'), auth: { @@ -166,6 +166,59 @@ router.post('/request_password_reset', function(req, res) { }); }); +/** + * Change password with given token. + */ +router.post('/reset_password', function(req, res) { + db.Account.findOne({ resetPasswordToken: req.body.token }, function(err, user) { + if (!user) + return res.status(500).send('Invalid token for password reset!'); + + if (err) + return res.status(500).send(err); + + user.setPassword(req.body.password, function (err, updatedUser) { + if (err) + return res.status(500).send(err.message); + + updatedUser.resetPasswordToken = undefined; + + updatedUser.save(function (err) { + if (err) + return res.status(500).send(err.message); + + var transporter = { + service: config.get('smtp:service'), + auth: { + user: config.get('smtp:username'), + pass: config.get('smtp:password') + } + }; + + var mailer = nodemailer.createTransport(transporter); + + var mailOptions = { + from: transporter.auth.user, + to: user.email, + subject: 'Your password has been changed', + text: 'Hello,\n\n' + + 'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\n\n' + + 'Now you can login: http://' + req.headers.host + '\n\n' + + '--------------\n' + + 'Apache Ignite Web Control Center\n' + }; + + mailer.sendMail(mailOptions, function (err) { + if (err) + return res.status(503).send('Password was changed, but failed to send confirmation e-mail!<br />' + err); + + return res.status(200).send(user.email); + }); + }); + }); + }); +}); + router.get('/reset', function (req, res) { res.render('reset', {}); }); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7d5299e8/modules/control-center-web/src/main/js/views/login.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/login.jade b/modules/control-center-web/src/main/js/views/login.jade index 19979e2..90af007 100644 --- a/modules/control-center-web/src/main/js/views/login.jade +++ b/modules/control-center-web/src/main/js/views/login.jade @@ -28,7 +28,9 @@ mixin lbl(txt) p(style='padding-right: 55px') Log in or register in order to collaborate form.form-horizontal(name='loginForm' ng-init='action == "login"') .modal-body.row - .col-sm-9.col-sm-offset-1 + .col-sm-10.col-sm-offset-1 + p(ng-show='action == "forgot_password"') + | That's ok! Simply enter your email below and a reset password link will be sent to you via email. You can then follow that link and select a new password. .details-row(ng-show='action == "register"') +lbl('Full Name:') .col-sm-9 @@ -36,20 +38,25 @@ mixin lbl(txt) .details-row +lbl('Email:') .col-sm-9 - input#user_email.form-control(enter-focus-next='user_password' type='email' ng-model='user_info.email' placeholder='y...@domain.com' required on-enter='action == "request_password_reset" && loginForm.$valid && auth(action, user_info)') - .details-row(ng-show='action != "request_password_reset"') + input#user_email.form-control(enter-focus-next='user_password' type='email' ng-model='user_info.email' placeholder='y...@domain.com' required on-enter='action == "forgot_password" && loginForm.$valid && auth(action, user_info)') + .details-row(ng-show='action != "forgot_password"') +lbl('Password:') .col-sm-9 - input#user_password.form-control(enter-focus-next='user_confirm' type='password' ng-model='user_info.password' placeholder='Password' ng-required='action != "request_password_reset"' on-enter='action == "login" && loginForm.$valid && auth(action, user_info)') + input#user_password.form-control(enter-focus-next='user_confirm' type='password' ng-model='user_info.password' placeholder='Password' ng-required='action != "forgot_password"' on-enter='action == "login" && loginForm.$valid && auth(action, user_info)') .details-row(ng-if='action == "register"') +lbl('Confirm:') .col-sm-9 input#user_confirm.form-control(type='password' ng-model='user_info.confirm' match='user_info.password' placeholder='Confirm password' ng-required='action == "register"' on-enter='loginForm.$valid && auth(action, user_info)') - .modal-footer - a.labelField(ng-show='action != "request_password_reset"' ng-click='action = "request_password_reset"' on-click-focus='user_email') Forgot password? - a.labelField(ng-show='action == "request_password_reset"' ng-click='action = "login"' on-click-focus='user_email') Log In - a.labelLogin(ng-show='action == "register"' on-click-focus='user_email' ng-click='action = "login";') Log In - a.labelLogin(ng-show='action == "login"' on-click-focus='user_name' ng-click='action = "register"') Sign Up - button.btn.btn-primary(ng-show='action == "login"' ng-disabled='loginForm.$invalid' ng-click='auth(action, user_info)') Log In - button.btn.btn-primary(ng-show='action == "register"' ng-disabled='loginForm.$invalid' ng-click='auth(action, user_info)') Sign Up - button.btn.btn-primary(ng-show='action == "request_password_reset"' ng-disabled='loginForm.$invalid' ng-click='auth(action, user_info)') Reset Password + .modal-footer(ng-show='action == "register"') + a.labelField(ng-click='action = "forgot_password"' on-click-focus='user_email') Forgot password? + a.labelLogin(ng-click='action = "login";' on-click-focus='user_email') Log In + button.btn.btn-primary(ng-click='auth(action, user_info)' ng-disabled='loginForm.$invalid') Sign Up + + .modal-footer(ng-show='action == "forgot_password"') + a.labelField(ng-click='action = "login"' on-click-focus='user_email') Log In + button.btn.btn-primary(ng-click='auth(action, user_info)' ng-disabled='loginForm.$invalid') Send it to me + + .modal-footer(ng-show='action == "login"') + a.labelField(ng-click='action = "forgot_password"' on-click-focus='user_email') Forgot password? + a.labelLogin(ng-click='action = "register"' on-click-focus='user_name') Sign Up + button.btn.btn-primary(ng-click='auth(action, user_info)' ng-disabled='loginForm.$invalid') Log In \ No newline at end of file