UserEmailsConfirmationHandler.coffee 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. EmailHelper = require "../Helpers/EmailHelper"
  2. EmailHandler = require "../Email/EmailHandler"
  3. OneTimeTokenHandler = require "../Security/OneTimeTokenHandler"
  4. settings = require 'settings-sharelatex'
  5. Errors = require "../Errors/Errors"
  6. logger = require "logger-sharelatex"
  7. UserUpdater = require "./UserUpdater"
  8. UserGetter = require "./UserGetter"
  9. ONE_YEAR_IN_S = 365 * 24 * 60 * 60
  10. module.exports = UserEmailsConfirmationHandler =
  11. sendConfirmationEmail: (user_id, email, emailTemplate, callback = (error) ->) ->
  12. if arguments.length == 3
  13. callback = emailTemplate
  14. emailTemplate = 'confirmEmail'
  15. # when force-migrating accounts to v2 from v1, we don't want to send confirmation messages -
  16. # setting this env var allows us to turn this behaviour off
  17. return callback(null) if process.env['SHARELATEX_NO_CONFIRMATION_MESSAGES']?
  18. email = EmailHelper.parseEmail(email)
  19. return callback(new Error('invalid email')) if !email?
  20. data = {user_id, email}
  21. OneTimeTokenHandler.getNewToken 'email_confirmation', data, {expiresIn: ONE_YEAR_IN_S}, (err, token)->
  22. return callback(err) if err?
  23. emailOptions =
  24. to: email
  25. confirmEmailUrl: "#{settings.siteUrl}/user/emails/confirm?token=#{token}"
  26. sendingUser_id: user_id
  27. EmailHandler.sendEmail emailTemplate, emailOptions, callback
  28. confirmEmailFromToken: (token, callback = (error) ->) ->
  29. logger.log {token_start: token.slice(0,8)}, 'confirming email from token'
  30. OneTimeTokenHandler.getValueFromTokenAndExpire 'email_confirmation', token, (error, data) ->
  31. return callback(error) if error?
  32. if !data?
  33. return callback(new Errors.NotFoundError('no token found'))
  34. {user_id, email} = data
  35. logger.log {data, user_id, email, token_start: token.slice(0,8)}, 'found data for email confirmation'
  36. if !user_id? or email != EmailHelper.parseEmail(email)
  37. return callback(new Errors.NotFoundError('invalid data'))
  38. UserGetter.getUser user_id, {}, (error, user) ->
  39. return callback(error) if error?
  40. unless user?._id
  41. return callback(new Errors.NotFoundError('user not found'))
  42. UserUpdater.confirmEmail user_id, email, callback