PasswordResetHandler.coffee 2.9 KB

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