CreateAndDestroyUsers.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /* eslint-disable
  2. no-undef,
  3. no-unused-vars,
  4. */
  5. // TODO: This file was created by bulk-decaffeinate.
  6. // Fix any style issues and re-enable lint.
  7. /*
  8. * decaffeinate suggestions:
  9. * DS102: Remove unnecessary code created because of implicit returns
  10. * DS207: Consider shorter variations of null checks
  11. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  12. */
  13. module.exports = function (grunt) {
  14. grunt.registerTask(
  15. 'user:create-admin',
  16. 'Create a user with the given email address and make them an admin. Update in place if the user already exists. Usage: grunt user:create-admin --email joe@example.com',
  17. function () {
  18. const done = this.async()
  19. const email = grunt.option('email')
  20. if (email == null) {
  21. console.error('Usage: grunt user:create-admin --email=joe@example.com')
  22. process.exit(1)
  23. }
  24. const settings = require('settings-sharelatex')
  25. const mongodb = require('../web/app/src/infrastructure/mongodb')
  26. const UserRegistrationHandler = require('../web/app/src/Features/User/UserRegistrationHandler')
  27. const OneTimeTokenHandler = require('../web/app/src/Features/Security/OneTimeTokenHandler')
  28. return mongodb.waitForDb().then(() =>
  29. UserRegistrationHandler.registerNewUser(
  30. {
  31. email,
  32. password: require('crypto').randomBytes(32).toString('hex'),
  33. },
  34. function (error, user) {
  35. if (
  36. error != null &&
  37. (error != null ? error.message : undefined) !==
  38. 'EmailAlreadyRegistered'
  39. ) {
  40. throw error
  41. }
  42. user.isAdmin = true
  43. return user.save(function (error) {
  44. if (error != null) {
  45. throw error
  46. }
  47. const ONE_WEEK = 7 * 24 * 60 * 60 // seconds
  48. return OneTimeTokenHandler.getNewToken(
  49. 'password',
  50. {
  51. expiresIn: ONE_WEEK,
  52. email: user.email,
  53. user_id: user._id.toString(),
  54. },
  55. function (err, token) {
  56. if (err != null) {
  57. return next(err)
  58. }
  59. console.log('')
  60. console.log(`\
  61. Successfully created ${email} as an admin user.
  62. Please visit the following URL to set a password for ${email} and log in:
  63. ${settings.siteUrl}/user/password/set?passwordResetToken=${token}
  64. \
  65. `)
  66. return done()
  67. }
  68. )
  69. })
  70. }
  71. )
  72. )
  73. }
  74. )
  75. return grunt.registerTask(
  76. 'user:delete',
  77. 'deletes a user and all their data, Usage: grunt user:delete --email joe@example.com',
  78. function () {
  79. const done = this.async()
  80. const email = grunt.option('email')
  81. if (email == null) {
  82. console.error('Usage: grunt user:delete --email=joe@example.com')
  83. process.exit(1)
  84. }
  85. const settings = require('settings-sharelatex')
  86. const mongodb = require('../web/app/src/infrastructure/mongodb')
  87. const UserGetter = require('../web/app/src/Features/User/UserGetter')
  88. const UserDeleter = require('../web/app/src/Features/User/UserDeleter')
  89. return mongodb.waitForDb().then(() =>
  90. UserGetter.getUser({ email }, function (error, user) {
  91. if (error != null) {
  92. throw error
  93. }
  94. if (user == null) {
  95. console.log(
  96. `user ${email} not in database, potentially already deleted`
  97. )
  98. return done()
  99. }
  100. return UserDeleter.deleteUser(user._id, function (err) {
  101. if (err != null) {
  102. throw err
  103. }
  104. return done()
  105. })
  106. })
  107. )
  108. }
  109. )
  110. }