|
|
@@ -0,0 +1,58 @@
|
|
|
+UserLocator = require "../User/UserLocator"
|
|
|
+Settings = require "settings-sharelatex"
|
|
|
+logger = require 'logger-sharelatex'
|
|
|
+SudoModeHandler = require './SudoModeHandler'
|
|
|
+AuthenticationController = require '../Authentication/AuthenticationController'
|
|
|
+AuthenticationManager = require '../Authentication/AuthenticationManager'
|
|
|
+ObjectId = require('../../infrastructure/Mongoose').mongo.ObjectId
|
|
|
+UserGetter = require '../User/UserGetter'
|
|
|
+
|
|
|
+
|
|
|
+module.exports = SudoModeController =
|
|
|
+
|
|
|
+ sudoModePrompt: (req, res, next) ->
|
|
|
+ userId = AuthenticationController.getLoggedInUserId(req)
|
|
|
+ logger.log {userId}, "[SudoMode] rendering sudo mode password page"
|
|
|
+ SudoModeHandler.isSudoModeActive userId, (err, isActive) ->
|
|
|
+ if err?
|
|
|
+ logger.err {err, userId}, "[SudoMode] error checking if sudo mode is active"
|
|
|
+ return next(err)
|
|
|
+ if isActive
|
|
|
+ logger.log {userId}, "[SudoMode] sudo mode already active, redirecting"
|
|
|
+ return res.redirect('/project')
|
|
|
+ res.render 'sudo_mode/sudo_mode_prompt', title: 'confirm_your_password'
|
|
|
+
|
|
|
+ submitPassword: (req, res, next) ->
|
|
|
+ userId = AuthenticationController.getLoggedInUserId(req)
|
|
|
+ redir = AuthenticationController._getRedirectFromSession(req) || "/project"
|
|
|
+ password = req.body.password
|
|
|
+ if !password
|
|
|
+ logger.log {userId}, "[SudoMode] no password supplied, failed authentication"
|
|
|
+ return next(new Error('no password supplied'))
|
|
|
+ logger.log {userId, redir}, "[SudoMode] checking user password"
|
|
|
+ UserGetter.getUser ObjectId(userId), {email: 1}, (err, userRecord) ->
|
|
|
+ if err?
|
|
|
+ logger.err {err, userId}, "[SudoMode] error getting user"
|
|
|
+ return next(err)
|
|
|
+ AuthenticationManager.authenticate email: userRecord.email, password, (err, user) ->
|
|
|
+ if err?
|
|
|
+ logger.err {err, userId}, "[SudoMode] error authenticating user"
|
|
|
+ return next(err)
|
|
|
+ if user?
|
|
|
+ logger.log {userId}, "[SudoMode] authenticated user, activating sudo mode"
|
|
|
+ SudoModeHandler.activateSudoMode userId, (err) ->
|
|
|
+ if err?
|
|
|
+ logger.err {err, userId}, "[SudoMode] error activating sudo mode"
|
|
|
+ return next(err)
|
|
|
+ return res.json {
|
|
|
+ redir: redir
|
|
|
+ }
|
|
|
+ else
|
|
|
+ logger.log {userId}, "[SudoMode] authentication failed for user"
|
|
|
+ return res.json {
|
|
|
+ message: {
|
|
|
+ text: req.i18n.translate("invalid_password"),
|
|
|
+ type: 'error'
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|