PasswordResetController.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. const PasswordResetHandler = require('./PasswordResetHandler')
  2. const RateLimiter = require('../../infrastructure/RateLimiter')
  3. const AuthenticationController = require('../Authentication/AuthenticationController')
  4. const AuthenticationManager = require('../Authentication/AuthenticationManager')
  5. const UserGetter = require('../User/UserGetter')
  6. const UserUpdater = require('../User/UserUpdater')
  7. const UserSessionsManager = require('../User/UserSessionsManager')
  8. const logger = require('logger-sharelatex')
  9. module.exports = {
  10. renderRequestResetForm(req, res) {
  11. res.render('user/passwordReset', { title: 'reset_password' })
  12. },
  13. requestReset(req, res, next) {
  14. const email = req.body.email.trim().toLowerCase()
  15. const opts = {
  16. endpointName: 'password_reset_rate_limit',
  17. timeInterval: 60,
  18. subjectName: req.ip,
  19. throttle: 6
  20. }
  21. RateLimiter.addCount(opts, (err, canContinue) => {
  22. if (err != null) {
  23. res.send(500, { message: err.message })
  24. }
  25. if (!canContinue) {
  26. return res.send(429, {
  27. message: req.i18n.translate('rate_limit_hit_wait')
  28. })
  29. }
  30. PasswordResetHandler.generateAndEmailResetToken(email, (err, status) => {
  31. if (err != null) {
  32. logger.warn(
  33. { err },
  34. 'failed to generate and email password reset token'
  35. )
  36. res.send(500, { message: err.message })
  37. } else if (status === 'primary') {
  38. res.send(200, {
  39. message: { text: req.i18n.translate('password_reset_email_sent') }
  40. })
  41. } else if (status === 'secondary') {
  42. res.send(404, {
  43. message: req.i18n.translate('secondary_email_password_reset')
  44. })
  45. } else {
  46. res.send(404, {
  47. message: req.i18n.translate('cant_find_email')
  48. })
  49. }
  50. })
  51. })
  52. },
  53. renderSetPasswordForm(req, res) {
  54. if (req.query.passwordResetToken != null) {
  55. req.session.resetToken = req.query.passwordResetToken
  56. return res.redirect('/user/password/set')
  57. }
  58. if (req.session.resetToken == null) {
  59. return res.redirect('/user/password/reset')
  60. }
  61. res.render('user/setPassword', {
  62. title: 'set_password',
  63. passwordResetToken: req.session.resetToken
  64. })
  65. },
  66. setNewUserPassword(req, res, next) {
  67. let { passwordResetToken, password } = req.body
  68. if (!passwordResetToken || !password) {
  69. return res.sendStatus(400)
  70. }
  71. passwordResetToken = passwordResetToken.trim()
  72. if (AuthenticationManager.validatePassword(password) != null) {
  73. return res.sendStatus(400)
  74. }
  75. delete req.session.resetToken
  76. PasswordResetHandler.setNewUserPassword(
  77. passwordResetToken,
  78. password,
  79. (err, found, userId) => {
  80. if ((err && err.name === 'NotFoundError') || !found) {
  81. return res.status(404).send('NotFoundError')
  82. } else if (err) {
  83. return res.status(500)
  84. }
  85. UserSessionsManager.revokeAllUserSessions({ _id: userId }, [], err => {
  86. if (err != null) {
  87. return next(err)
  88. }
  89. UserUpdater.removeReconfirmFlag(userId, err => {
  90. if (err != null) {
  91. return next(err)
  92. }
  93. if (!req.body.login_after) {
  94. return res.sendStatus(200)
  95. }
  96. UserGetter.getUser(userId, { email: 1 }, (err, user) => {
  97. if (err != null) {
  98. return next(err)
  99. }
  100. AuthenticationController.afterLoginSessionSetup(
  101. req,
  102. user,
  103. err => {
  104. if (err != null) {
  105. logger.err(
  106. { err, email: user.email },
  107. 'Error setting up session after setting password'
  108. )
  109. return next(err)
  110. }
  111. res.json({
  112. redir:
  113. AuthenticationController._getRedirectFromSession(req) ||
  114. '/project'
  115. })
  116. }
  117. )
  118. })
  119. })
  120. })
  121. }
  122. )
  123. }
  124. }