UserRegistrationHandler.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. const { User } = require('../../models/User')
  2. const UserCreator = require('./UserCreator')
  3. const UserGetter = require('./UserGetter')
  4. const AuthenticationManager = require('../Authentication/AuthenticationManager')
  5. const NewsletterManager = require('../Newsletter/NewsletterManager')
  6. const async = require('async')
  7. const logger = require('logger-sharelatex')
  8. const crypto = require('crypto')
  9. const EmailHandler = require('../Email/EmailHandler')
  10. const OneTimeTokenHandler = require('../Security/OneTimeTokenHandler')
  11. const Analytics = require('../Analytics/AnalyticsManager')
  12. const settings = require('settings-sharelatex')
  13. const EmailHelper = require('../Helpers/EmailHelper')
  14. const UserRegistrationHandler = {
  15. _registrationRequestIsValid(body, callback) {
  16. const invalidEmail = AuthenticationManager.validateEmail(body.email || '')
  17. const invalidPassword = AuthenticationManager.validatePassword(
  18. body.password || '',
  19. body.email
  20. )
  21. if (invalidEmail != null || invalidPassword != null) {
  22. return false
  23. } else {
  24. return true
  25. }
  26. },
  27. _createNewUserIfRequired(user, userDetails, callback) {
  28. if (user == null) {
  29. userDetails.holdingAccount = false
  30. UserCreator.createNewUser(
  31. {
  32. holdingAccount: false,
  33. email: userDetails.email,
  34. first_name: userDetails.first_name,
  35. last_name: userDetails.last_name
  36. },
  37. {},
  38. callback
  39. )
  40. } else {
  41. callback(null, user)
  42. }
  43. },
  44. registerNewUser(userDetails, callback) {
  45. const self = this
  46. const requestIsValid = this._registrationRequestIsValid(userDetails)
  47. if (!requestIsValid) {
  48. return callback(new Error('request is not valid'))
  49. }
  50. userDetails.email = EmailHelper.parseEmail(userDetails.email)
  51. UserGetter.getUserByAnyEmail(userDetails.email, (err, user) => {
  52. if (err != null) {
  53. return callback(err)
  54. }
  55. if ((user != null ? user.holdingAccount : undefined) === false) {
  56. return callback(new Error('EmailAlreadyRegistered'), user)
  57. }
  58. self._createNewUserIfRequired(user, userDetails, (err, user) => {
  59. if (err != null) {
  60. return callback(err)
  61. }
  62. async.series(
  63. [
  64. cb =>
  65. User.updateOne(
  66. { _id: user._id },
  67. { $set: { holdingAccount: false } },
  68. cb
  69. ),
  70. cb =>
  71. AuthenticationManager.setUserPassword(
  72. user,
  73. userDetails.password,
  74. cb
  75. ),
  76. cb => {
  77. if (userDetails.subscribeToNewsletter === 'true') {
  78. NewsletterManager.subscribe(user, err => {
  79. if (err != null) {
  80. logger.warn(
  81. { err, user },
  82. 'Failed to subscribe user to newsletter'
  83. )
  84. }
  85. })
  86. }
  87. cb()
  88. } // this can be slow, just fire it off
  89. ],
  90. err => {
  91. Analytics.recordEvent(user._id, 'user-registered')
  92. callback(err, user)
  93. }
  94. )
  95. })
  96. })
  97. },
  98. registerNewUserAndSendActivationEmail(email, callback) {
  99. UserRegistrationHandler.registerNewUser(
  100. {
  101. email,
  102. password: crypto.randomBytes(32).toString('hex')
  103. },
  104. (err, user) => {
  105. if (
  106. err != null &&
  107. (err != null ? err.message : undefined) !== 'EmailAlreadyRegistered'
  108. ) {
  109. return callback(err)
  110. }
  111. if (
  112. (err != null ? err.message : undefined) === 'EmailAlreadyRegistered'
  113. ) {
  114. logger.log({ email }, 'user already exists, resending welcome email')
  115. }
  116. const ONE_WEEK = 7 * 24 * 60 * 60 // seconds
  117. OneTimeTokenHandler.getNewToken(
  118. 'password',
  119. { user_id: user._id.toString(), email },
  120. { expiresIn: ONE_WEEK },
  121. (err, token) => {
  122. if (err != null) {
  123. return callback(err)
  124. }
  125. const setNewPasswordUrl = `${settings.siteUrl}/user/activate?token=${token}&user_id=${user._id}`
  126. EmailHandler.sendEmail(
  127. 'registered',
  128. {
  129. to: user.email,
  130. setNewPasswordUrl
  131. },
  132. err => {
  133. if (err != null) {
  134. logger.warn({ err }, 'failed to send activation email')
  135. }
  136. }
  137. )
  138. callback(null, user, setNewPasswordUrl)
  139. }
  140. )
  141. }
  142. )
  143. }
  144. }
  145. module.exports = UserRegistrationHandler