PasswordResetHandler.coffee 3.0 KB

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