PasswordResetController.coffee 3.5 KB

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