PasswordResetController.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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. const Settings = require('settings-sharelatex')
  10. module.exports = {
  11. renderRequestResetForm(req, res) {
  12. logger.log('rendering request reset form')
  13. res.render('user/passwordReset', { title: 'reset_password' })
  14. },
  15. requestReset(req, res, next) {
  16. const email = req.body.email.trim().toLowerCase()
  17. const opts = {
  18. endpointName: 'password_reset_rate_limit',
  19. timeInterval: 60,
  20. subjectName: req.ip,
  21. throttle: 6
  22. }
  23. RateLimiter.addCount(opts, function(err, canContinue) {
  24. if (err != null) {
  25. return next(err)
  26. }
  27. if (!canContinue) {
  28. return res.send(429, {
  29. message: req.i18n.translate('rate_limit_hit_wait')
  30. })
  31. }
  32. PasswordResetHandler.generateAndEmailResetToken(email, function(
  33. err,
  34. status
  35. ) {
  36. if (err != null) {
  37. res.send(500, {
  38. message: err.message
  39. })
  40. } else if (status === 'primary') {
  41. res.send(200, {
  42. message: { text: req.i18n.translate('password_reset_email_sent') }
  43. })
  44. } else if (status === 'secondary') {
  45. res.send(404, {
  46. message: req.i18n.translate('secondary_email_password_reset')
  47. })
  48. } else if (status === 'sharelatex') {
  49. res.send(404, {
  50. message: `<a href="${
  51. Settings.accountMerge.sharelatexHost
  52. }/user/password/reset">${req.i18n.translate('reset_from_sl')}</a>`
  53. })
  54. } else {
  55. res.send(404, {
  56. message: req.i18n.translate('cant_find_email')
  57. })
  58. }
  59. })
  60. })
  61. },
  62. renderSetPasswordForm(req, res) {
  63. if (req.query.passwordResetToken != null) {
  64. req.session.resetToken = req.query.passwordResetToken
  65. return res.redirect('/user/password/set')
  66. }
  67. if (req.session.resetToken == null) {
  68. return res.redirect('/user/password/reset')
  69. }
  70. res.render('user/setPassword', {
  71. title: 'set_password',
  72. passwordResetToken: req.session.resetToken
  73. })
  74. },
  75. setNewUserPassword(req, res, next) {
  76. const { passwordResetToken, password } = req.body
  77. if (
  78. !password ||
  79. !passwordResetToken ||
  80. AuthenticationManager.validatePassword(password.trim()) != null
  81. ) {
  82. return res.sendStatus(400)
  83. }
  84. delete req.session.resetToken
  85. PasswordResetHandler.setNewUserPassword(
  86. passwordResetToken.trim(),
  87. password.trim(),
  88. function(err, found, userId) {
  89. if (err && err.name && err.name === 'NotFoundError') {
  90. res.status(404).send('NotFoundError')
  91. } else if (err && err.name && err.name === 'NotInV2Error') {
  92. res.status(403).send('NotInV2Error')
  93. } else if (err && err.name && err.name === 'SLInV2Error') {
  94. res.status(403).send('SLInV2Error')
  95. } else if (err && err.statusCode && err.statusCode === 500) {
  96. res.status(500)
  97. } else if (err && !err.statusCode) {
  98. res.status(500)
  99. } else if (found) {
  100. if (userId == null) {
  101. return res.sendStatus(200)
  102. } // will not exist for v1-only users
  103. UserSessionsManager.revokeAllUserSessions(
  104. { _id: userId },
  105. [],
  106. function(err) {
  107. if (err != null) {
  108. return next(err)
  109. }
  110. UserUpdater.removeReconfirmFlag(userId, function(err) {
  111. if (err != null) {
  112. return next(err)
  113. }
  114. if (req.body.login_after) {
  115. UserGetter.getUser(userId, { email: 1 }, function(err, user) {
  116. if (err != null) {
  117. return next(err)
  118. }
  119. AuthenticationController.afterLoginSessionSetup(
  120. req,
  121. user,
  122. function(err) {
  123. if (err != null) {
  124. logger.warn(
  125. { err, email: user.email },
  126. 'Error setting up session after setting password'
  127. )
  128. return next(err)
  129. }
  130. res.json({
  131. redir:
  132. AuthenticationController._getRedirectFromSession(
  133. req
  134. ) || '/project'
  135. })
  136. }
  137. )
  138. })
  139. } else {
  140. res.sendStatus(200)
  141. }
  142. })
  143. }
  144. )
  145. } else {
  146. res.sendStatus(404)
  147. }
  148. }
  149. )
  150. }
  151. }