SudoModeController.coffee 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. logger = require 'logger-sharelatex'
  2. SudoModeHandler = require './SudoModeHandler'
  3. AuthenticationController = require '../Authentication/AuthenticationController'
  4. AuthenticationManager = require '../Authentication/AuthenticationManager'
  5. ObjectId = require('../../infrastructure/Mongoose').mongo.ObjectId
  6. UserGetter = require '../User/UserGetter'
  7. module.exports = SudoModeController =
  8. sudoModePrompt: (req, res, next) ->
  9. if req.externalAuthenticationSystemUsed()
  10. logger.log {userId}, "[SudoMode] using external auth, redirecting"
  11. return res.redirect('/project')
  12. userId = AuthenticationController.getLoggedInUserId(req)
  13. logger.log {userId}, "[SudoMode] rendering sudo mode password page"
  14. SudoModeHandler.isSudoModeActive userId, (err, isActive) ->
  15. if err?
  16. logger.err {err, userId}, "[SudoMode] error checking if sudo mode is active"
  17. return next(err)
  18. if isActive
  19. logger.log {userId}, "[SudoMode] sudo mode already active, redirecting"
  20. return res.redirect('/project')
  21. res.render 'sudo_mode/sudo_mode_prompt', title: 'confirm_password_to_continue'
  22. submitPassword: (req, res, next) ->
  23. userId = AuthenticationController.getLoggedInUserId(req)
  24. redir = AuthenticationController._getRedirectFromSession(req) || "/project"
  25. password = req.body.password
  26. if !password
  27. logger.log {userId}, "[SudoMode] no password supplied, failed authentication"
  28. return next(new Error('no password supplied'))
  29. logger.log {userId, redir}, "[SudoMode] checking user password"
  30. UserGetter.getUser ObjectId(userId), {email: 1}, (err, userRecord) ->
  31. if err?
  32. logger.err {err, userId}, "[SudoMode] error getting user"
  33. return next(err)
  34. if !userRecord?
  35. err = new Error('user not found')
  36. logger.err {err, userId}, "[SudoMode] user not found"
  37. return next(err)
  38. AuthenticationManager.authenticate email: userRecord.email, password, (err, user) ->
  39. if err?
  40. logger.err {err, userId}, "[SudoMode] error authenticating user"
  41. return next(err)
  42. if user?
  43. logger.log {userId}, "[SudoMode] authenticated user, activating sudo mode"
  44. SudoModeHandler.activateSudoMode userId, (err) ->
  45. if err?
  46. logger.err {err, userId}, "[SudoMode] error activating sudo mode"
  47. return next(err)
  48. return res.json {
  49. redir: redir
  50. }
  51. else
  52. logger.log {userId}, "[SudoMode] authentication failed for user"
  53. return res.json {
  54. message: {
  55. text: req.i18n.translate("invalid_password"),
  56. type: 'error'
  57. }
  58. }