UserRegistrationHandler.coffee 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. User = require("../../models/User").User
  2. UserCreator = require("./UserCreator")
  3. UserGetter = require("./UserGetter")
  4. AuthenticationManager = require("../Authentication/AuthenticationManager")
  5. NewsLetterManager = require("../Newsletter/NewsletterManager")
  6. async = require("async")
  7. logger = require("logger-sharelatex")
  8. crypto = require("crypto")
  9. EmailHandler = require("../Email/EmailHandler")
  10. OneTimeTokenHandler = require "../Security/OneTimeTokenHandler"
  11. Analytics = require "../Analytics/AnalyticsManager"
  12. settings = require "settings-sharelatex"
  13. EmailHelper = require("../Helpers/EmailHelper")
  14. module.exports = UserRegistrationHandler =
  15. _registrationRequestIsValid : (body, callback)->
  16. invalidEmail = AuthenticationManager.validateEmail(body.email or '')
  17. invalidPassword = AuthenticationManager.validatePassword(body.password or '')
  18. if invalidEmail? or invalidPassword?
  19. return false
  20. else
  21. return true
  22. _createNewUserIfRequired: (user, userDetails, callback)->
  23. if !user?
  24. userDetails.holdingAccount = false
  25. UserCreator.createNewUser {holdingAccount:false, email:userDetails.email, first_name:userDetails.first_name, last_name:userDetails.last_name}, callback
  26. else
  27. callback null, user
  28. registerNewUser: (userDetails, callback)->
  29. self = @
  30. requestIsValid = @_registrationRequestIsValid userDetails
  31. if !requestIsValid
  32. return callback(new Error("request is not valid"))
  33. userDetails.email = EmailHelper.parseEmail(userDetails.email)
  34. UserGetter.getUserByAnyEmail userDetails.email, (err, user) =>
  35. if err?
  36. return callback err
  37. if user?.holdingAccount == false
  38. return callback(new Error("EmailAlreadyRegistered"), user)
  39. self._createNewUserIfRequired user, userDetails, (err, user)->
  40. if err?
  41. return callback(err)
  42. async.series [
  43. (cb)-> User.update {_id: user._id}, {"$set":{holdingAccount:false}}, cb
  44. (cb)-> AuthenticationManager.setUserPassword user._id, userDetails.password, cb
  45. (cb)->
  46. if userDetails.subscribeToNewsletter == "true"
  47. NewsLetterManager.subscribe user, ->
  48. cb() #this can be slow, just fire it off
  49. ], (err)->
  50. logger.log user: user, "registered"
  51. Analytics.recordEvent user._id, "user-registered"
  52. callback(err, user)
  53. registerNewUserAndSendActivationEmail: (email, callback = (error, user, setNewPasswordUrl) ->) ->
  54. logger.log {email}, "registering new user"
  55. UserRegistrationHandler.registerNewUser {
  56. email: email
  57. password: crypto.randomBytes(32).toString("hex")
  58. }, (err, user)->
  59. if err? and err?.message != "EmailAlreadyRegistered"
  60. return callback(err)
  61. if err?.message == "EmailAlreadyRegistered"
  62. logger.log {email}, "user already exists, resending welcome email"
  63. ONE_WEEK = 7 * 24 * 60 * 60 # seconds
  64. OneTimeTokenHandler.getNewToken 'password', user._id, { expiresIn: ONE_WEEK }, (err, token)->
  65. return callback(err) if err?
  66. setNewPasswordUrl = "#{settings.siteUrl}/user/activate?token=#{token}&user_id=#{user._id}"
  67. EmailHandler.sendEmail "registered", {
  68. to: user.email
  69. setNewPasswordUrl: setNewPasswordUrl
  70. }, () ->
  71. callback null, user, setNewPasswordUrl