PasswordResetController.coffee 3.0 KB

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