SudoModeController.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /* eslint-disable
  2. max-len,
  3. no-unused-vars,
  4. no-use-before-define,
  5. */
  6. // TODO: This file was created by bulk-decaffeinate.
  7. // Fix any style issues and re-enable lint.
  8. /*
  9. * decaffeinate suggestions:
  10. * DS102: Remove unnecessary code created because of implicit returns
  11. * DS207: Consider shorter variations of null checks
  12. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  13. */
  14. let SudoModeController
  15. const logger = require('logger-sharelatex')
  16. const SudoModeHandler = require('./SudoModeHandler')
  17. const AuthenticationController = require('../Authentication/AuthenticationController')
  18. const { ObjectId } = require('../../infrastructure/Mongoose').mongo
  19. const UserGetter = require('../User/UserGetter')
  20. const Settings = require('settings-sharelatex')
  21. module.exports = SudoModeController = {
  22. sudoModePrompt(req, res, next) {
  23. if (req.externalAuthenticationSystemUsed() && Settings.overleaf == null) {
  24. logger.log({ userId }, '[SudoMode] using external auth, redirecting')
  25. return res.redirect('/project')
  26. }
  27. var userId = AuthenticationController.getLoggedInUserId(req)
  28. logger.log({ userId }, '[SudoMode] rendering sudo mode password page')
  29. return SudoModeHandler.isSudoModeActive(userId, function(err, isActive) {
  30. if (err != null) {
  31. logger.err(
  32. { err, userId },
  33. '[SudoMode] error checking if sudo mode is active'
  34. )
  35. return next(err)
  36. }
  37. if (isActive) {
  38. logger.log(
  39. { userId },
  40. '[SudoMode] sudo mode already active, redirecting'
  41. )
  42. return res.redirect('/project')
  43. }
  44. return res.render('sudo_mode/sudo_mode_prompt', {
  45. title: 'confirm_password_to_continue'
  46. })
  47. })
  48. },
  49. submitPassword(req, res, next) {
  50. const userId = AuthenticationController.getLoggedInUserId(req)
  51. const redir =
  52. AuthenticationController._getRedirectFromSession(req) || '/project'
  53. const { password } = req.body
  54. if (!password) {
  55. logger.log(
  56. { userId },
  57. '[SudoMode] no password supplied, failed authentication'
  58. )
  59. return next(new Error('no password supplied'))
  60. }
  61. logger.log({ userId, redir }, '[SudoMode] checking user password')
  62. return UserGetter.getUser(ObjectId(userId), { email: 1 }, function(
  63. err,
  64. userRecord
  65. ) {
  66. if (err != null) {
  67. logger.err({ err, userId }, '[SudoMode] error getting user')
  68. return next(err)
  69. }
  70. if (userRecord == null) {
  71. err = new Error('user not found')
  72. logger.err({ err, userId }, '[SudoMode] user not found')
  73. return next(err)
  74. }
  75. return SudoModeHandler.authenticate(userRecord.email, password, function(
  76. err,
  77. user
  78. ) {
  79. if (err != null) {
  80. logger.err({ err, userId }, '[SudoMode] error authenticating user')
  81. return next(err)
  82. }
  83. if (user != null) {
  84. logger.log(
  85. { userId },
  86. '[SudoMode] authenticated user, activating sudo mode'
  87. )
  88. return SudoModeHandler.activateSudoMode(userId, function(err) {
  89. if (err != null) {
  90. logger.err(
  91. { err, userId },
  92. '[SudoMode] error activating sudo mode'
  93. )
  94. return next(err)
  95. }
  96. return res.json({
  97. redir
  98. })
  99. })
  100. } else {
  101. logger.log({ userId }, '[SudoMode] authentication failed for user')
  102. return res.json({
  103. message: {
  104. text: req.i18n.translate('invalid_password'),
  105. type: 'error'
  106. }
  107. })
  108. }
  109. })
  110. })
  111. }
  112. }