create-admin.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. const Settings = require('@overleaf/settings')
  2. const { db, waitForDb } = require('../../../app/src/infrastructure/mongodb')
  3. const UserRegistrationHandler = require('../../../app/src/Features/User/UserRegistrationHandler')
  4. const OneTimeTokenHandler = require('../../../app/src/Features/Security/OneTimeTokenHandler')
  5. async function main() {
  6. await waitForDb()
  7. const email = (process.argv.slice(2).pop() || '').replace(/^--email=/, '')
  8. if (!email) {
  9. console.error(`Usage: node ${__filename} --email=joe@example.com`)
  10. process.exit(1)
  11. }
  12. await new Promise((resolve, reject) => {
  13. UserRegistrationHandler.registerNewUser(
  14. {
  15. email,
  16. password: require('crypto').randomBytes(32).toString('hex'),
  17. },
  18. (error, user) => {
  19. if (error && error.message !== 'EmailAlreadyRegistered') {
  20. return reject(error)
  21. }
  22. db.users.updateOne(
  23. { _id: user._id },
  24. { $set: { isAdmin: true } },
  25. error => {
  26. if (error) {
  27. return reject(error)
  28. }
  29. const ONE_WEEK = 7 * 24 * 60 * 60 // seconds
  30. OneTimeTokenHandler.getNewToken(
  31. 'password',
  32. {
  33. expiresIn: ONE_WEEK,
  34. email: user.email,
  35. user_id: user._id.toString(),
  36. },
  37. (err, token) => {
  38. if (err) {
  39. return reject(err)
  40. }
  41. console.log('')
  42. console.log(`\
  43. Successfully created ${email} as an admin user.
  44. Please visit the following URL to set a password for ${email} and log in:
  45. ${Settings.siteUrl}/user/password/set?passwordResetToken=${token}
  46. \
  47. `)
  48. resolve()
  49. }
  50. )
  51. }
  52. )
  53. }
  54. )
  55. })
  56. }
  57. main()
  58. .then(() => {
  59. console.error('Done.')
  60. process.exit(0)
  61. })
  62. .catch(err => {
  63. console.error(err)
  64. process.exit(1)
  65. })