UserRegistrationHandler.coffee 3.4 KB

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