UserRegistrationHandler.coffee 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. sanitize = require('sanitizer')
  2. User = require("../../models/User").User
  3. UserCreator = require("./UserCreator")
  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. module.exports = UserRegistrationHandler =
  14. validateEmail : (email) ->
  15. re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\ ".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA -Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  16. return re.test(email)
  17. hasZeroLengths : (props) ->
  18. hasZeroLength = false
  19. props.forEach (prop) ->
  20. if prop.length == 0
  21. hasZeroLength = true
  22. return hasZeroLength
  23. _registrationRequestIsValid : (body, callback)->
  24. email = sanitize.escape(body.email).trim().toLowerCase()
  25. password = body.password
  26. username = email.match(/^[^@]*/)
  27. if @hasZeroLengths([password, email])
  28. return false
  29. else if !@validateEmail(email)
  30. return false
  31. else
  32. return true
  33. _createNewUserIfRequired: (user, userDetails, callback)->
  34. if !user?
  35. userDetails.holdingAccount = false
  36. UserCreator.createNewUser {holdingAccount:false, email:userDetails.email, first_name:userDetails.first_name, last_name:userDetails.last_name}, callback
  37. else
  38. callback null, user
  39. registerNewUser: (userDetails, callback)->
  40. self = @
  41. requestIsValid = @_registrationRequestIsValid userDetails
  42. if !requestIsValid
  43. return callback(new Error("request is not valid"))
  44. userDetails.email = userDetails.email?.trim()?.toLowerCase()
  45. User.findOne email:userDetails.email, (err, user)->
  46. if err?
  47. return callback err
  48. if user?.holdingAccount == false
  49. return callback(new Error("EmailAlreadyRegistered"), user)
  50. self._createNewUserIfRequired user, userDetails, (err, user)->
  51. if err?
  52. return callback(err)
  53. async.series [
  54. (cb)-> User.update {_id: user._id}, {"$set":{holdingAccount:false}}, cb
  55. (cb)-> AuthenticationManager.setUserPassword user._id, userDetails.password, cb
  56. (cb)->
  57. NewsLetterManager.subscribe user, ->
  58. cb() #this can be slow, just fire it off
  59. ], (err)->
  60. logger.log user: user, "registered"
  61. Analytics.recordEvent user._id, "user-registered"
  62. callback(err, user)
  63. registerNewUserAndSendActivationEmail: (email, callback = (error, user, setNewPasswordUrl) ->) ->
  64. logger.log {email}, "registering new user"
  65. UserRegistrationHandler.registerNewUser {
  66. email: email
  67. password: crypto.randomBytes(32).toString("hex")
  68. }, (err, user)->
  69. if err? and err?.message != "EmailAlreadyRegistered"
  70. return callback(err)
  71. if err?.message == "EmailAlreadyRegistered"
  72. logger.log {email}, "user already exists, resending welcome email"
  73. ONE_WEEK = 7 * 24 * 60 * 60 # seconds
  74. OneTimeTokenHandler.getNewToken user._id, { expiresIn: ONE_WEEK }, (err, token)->
  75. return callback(err) if err?
  76. setNewPasswordUrl = "#{settings.siteUrl}/user/activate?token=#{token}&user_id=#{user._id}"
  77. EmailHandler.sendEmail "registered", {
  78. to: user.email
  79. setNewPasswordUrl: setNewPasswordUrl
  80. }, () ->
  81. callback null, user, setNewPasswordUrl