UserRegistrationHandler.coffee 3.2 KB

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