PasswordResetController.coffee 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. PasswordResetHandler = require("./PasswordResetHandler")
  2. RateLimiter = require("../../infrastructure/RateLimiter")
  3. AuthenticationController = require("../Authentication/AuthenticationController")
  4. AuthenticationManager = require("../Authentication/AuthenticationManager")
  5. UserGetter = require("../User/UserGetter")
  6. UserUpdater = require("../User/UserUpdater")
  7. UserSessionsManager = require("../User/UserSessionsManager")
  8. logger = require "logger-sharelatex"
  9. module.exports =
  10. renderRequestResetForm: (req, res)->
  11. logger.log "rendering request reset form"
  12. res.render "user/passwordReset",
  13. title:"reset_password"
  14. requestReset: (req, res)->
  15. email = req.body.email.trim().toLowerCase()
  16. opts =
  17. endpointName: "password_reset_rate_limit"
  18. timeInterval: 60
  19. subjectName: req.ip
  20. throttle: 6
  21. RateLimiter.addCount opts, (err, canContinue)->
  22. if !canContinue
  23. return res.send 429, { message: req.i18n.translate("rate_limit_hit_wait")}
  24. PasswordResetHandler.generateAndEmailResetToken email, (err, exists)->
  25. if err?
  26. res.send 500, {message:err?.message}
  27. else
  28. res.send 200, {message: {text: req.i18n.translate("if_registered_email_sent")}}
  29. renderSetPasswordForm: (req, res)->
  30. if req.query.passwordResetToken?
  31. req.session.resetToken = req.query.passwordResetToken
  32. return res.redirect('/user/password/set')
  33. if !req.session.resetToken?
  34. return res.redirect('/user/password/reset')
  35. res.render "user/setPassword",
  36. title:"set_password"
  37. passwordResetToken: req.session.resetToken
  38. setNewUserPassword: (req, res, next)->
  39. {passwordResetToken, password} = req.body
  40. if !password? or password.length == 0 or !passwordResetToken? or passwordResetToken.length == 0 or AuthenticationManager.validatePassword(password?.trim())?
  41. return res.sendStatus 400
  42. delete req.session.resetToken
  43. PasswordResetHandler.setNewUserPassword passwordResetToken?.trim(), password?.trim(), (err, found, user_id) ->
  44. if err and err.name and err.name == "NotFoundError"
  45. res.status(404).send("NotFoundError")
  46. else if err and err.name and err.name == "NotInV2Error"
  47. res.status(403).send("NotInV2Error")
  48. else if err and err.name and err.name == "SLInV2Error"
  49. res.status(403).send("SLInV2Error")
  50. else if err and err.statusCode and err.statusCode == 500
  51. res.status(500)
  52. else if err and !err.statusCode
  53. res.status(500)
  54. else if found
  55. return res.sendStatus 200 if !user_id? # will not exist for v1-only users
  56. UserSessionsManager.revokeAllUserSessions {_id: user_id}, [], (err) ->
  57. return next(err) if err?
  58. UserUpdater.removeReconfirmFlag user_id, (err) ->
  59. return next(err) if err?
  60. if req.body.login_after
  61. UserGetter.getUser user_id, {email: 1}, (err, user) ->
  62. return next(err) if err?
  63. AuthenticationController.afterLoginSessionSetup req, user, (err) ->
  64. if err?
  65. logger.err {err, email: user.email}, "Error setting up session after setting password"
  66. return next(err)
  67. res.json {redir: AuthenticationController._getRedirectFromSession(req) || "/project"}
  68. else
  69. res.sendStatus 200
  70. else
  71. res.sendStatus 404