PasswordResetHandler.coffee 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. settings = require("settings-sharelatex")
  2. async = require("async")
  3. UserGetter = require("../User/UserGetter")
  4. OneTimeTokenHandler = require("../Security/OneTimeTokenHandler")
  5. EmailHandler = require("../Email/EmailHandler")
  6. AuthenticationManager = require("../Authentication/AuthenticationManager")
  7. logger = require("logger-sharelatex")
  8. V1Api = require("../V1/V1Api")
  9. module.exports = PasswordResetHandler =
  10. generateAndEmailResetToken:(email, callback = (error, exists) ->)->
  11. PasswordResetHandler._getPasswordResetData email, (error, exists, data) ->
  12. if error? or !exists
  13. return callback(error, exists)
  14. OneTimeTokenHandler.getNewToken 'password', data, (err, token)->
  15. if err then return callback(err)
  16. emailOptions =
  17. to : email
  18. setNewPasswordUrl : "#{settings.siteUrl}/user/password/set?passwordResetToken=#{token}&email=#{encodeURIComponent(email)}"
  19. EmailHandler.sendEmail "passwordResetRequested", emailOptions, (error) ->
  20. return callback(error) if error?
  21. callback null, true
  22. setNewUserPassword: (token, password, callback = (error, found, user_id) ->)->
  23. OneTimeTokenHandler.getValueFromTokenAndExpire 'password', token, (err, data)->
  24. if err then return callback(err)
  25. if !data?
  26. return callback null, false, null
  27. if typeof data == "string"
  28. # Backwards compatible with old format.
  29. # Tokens expire after 1h, so this can be removed soon after deploy.
  30. # Possibly we should keep this until we do an onsite release too.
  31. data = { user_id: data }
  32. if data.user_id?
  33. AuthenticationManager.setUserPassword data.user_id, password, (err, reset) ->
  34. if err then return callback(err)
  35. callback null, reset, data.user_id
  36. else if data.v1_user_id?
  37. AuthenticationManager.setUserPasswordInV1 data.v1_user_id, password, (error, reset) ->
  38. return callback(error) if error?
  39. UserGetter.getUser { 'overleaf.id': data.v1_user_id }, {_id:1}, (error, user) ->
  40. return callback(error) if error?
  41. callback null, reset, user?._id
  42. _getPasswordResetData: (email, callback = (error, exists, data) ->) ->
  43. if settings.overleaf?
  44. # Overleaf v2
  45. V1Api.request {
  46. url: "/api/v1/sharelatex/user_emails"
  47. qs:
  48. email: email
  49. expectedStatusCodes: [404]
  50. }, (error, response, body) ->
  51. return callback(error) if error?
  52. if response.statusCode == 404
  53. return callback null, false
  54. else
  55. return callback null, true, { v1_user_id: body.user_id }
  56. else
  57. # ShareLaTeX
  58. UserGetter.getUserByMainEmail email, (err, user)->
  59. if err then return callback(err)
  60. if !user? or user.holdingAccount or user.overleaf?
  61. logger.err email:email, "user could not be found for password reset"
  62. return callback(null, false)
  63. return callback null, true, { user_id: user._id }