AuthorizationMiddleware.coffee 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. AuthorizationManager = require("./AuthorizationManager")
  2. async = require "async"
  3. logger = require "logger-sharelatex"
  4. ObjectId = require("mongojs").ObjectId
  5. Errors = require "../Errors/Errors"
  6. AuthenticationController = require "../Authentication/AuthenticationController"
  7. TokenAccessHandler = require '../TokenAccess/TokenAccessHandler'
  8. module.exports = AuthorizationMiddleware =
  9. ensureUserCanReadMultipleProjects: (req, res, next) ->
  10. project_ids = (req.query.project_ids or "").split(",")
  11. AuthorizationMiddleware._getUserId req, (error, user_id) ->
  12. return next(error) if error?
  13. # Remove the projects we have access to. Note rejectSeries doesn't use
  14. # errors in callbacks
  15. async.rejectSeries project_ids, (project_id, cb) ->
  16. token = TokenAccessHandler.getRequestToken(req, project_id)
  17. AuthorizationManager.canUserReadProject user_id, project_id, token, (error, canRead) ->
  18. return next(error) if error?
  19. cb(canRead)
  20. , (unauthorized_project_ids) ->
  21. if unauthorized_project_ids.length > 0
  22. AuthorizationMiddleware.redirectToRestricted req, res, next
  23. else
  24. next()
  25. ensureUserCanReadProject: (req, res, next) ->
  26. AuthorizationMiddleware._getUserAndProjectId req, (error, user_id, project_id) ->
  27. return next(error) if error?
  28. token = TokenAccessHandler.getRequestToken(req, project_id)
  29. AuthorizationManager.canUserReadProject user_id, project_id, token, (error, canRead) ->
  30. return next(error) if error?
  31. if canRead
  32. logger.log {user_id, project_id}, "allowing user read access to project"
  33. next()
  34. else
  35. logger.log {user_id, project_id}, "denying user read access to project"
  36. if req.headers?['accept']?.match(/^application\/json.*$/)
  37. res.sendStatus(403)
  38. else
  39. AuthorizationMiddleware.redirectToRestricted req, res, next
  40. ensureUserCanWriteProjectSettings: (req, res, next) ->
  41. AuthorizationMiddleware._getUserAndProjectId req, (error, user_id, project_id) ->
  42. return next(error) if error?
  43. token = TokenAccessHandler.getRequestToken(req, project_id)
  44. AuthorizationManager.canUserWriteProjectSettings user_id, project_id, token, (error, canWrite) ->
  45. return next(error) if error?
  46. if canWrite
  47. logger.log {user_id, project_id}, "allowing user write access to project settings"
  48. next()
  49. else
  50. logger.log {user_id, project_id}, "denying user write access to project settings"
  51. AuthorizationMiddleware.redirectToRestricted req, res, next
  52. ensureUserCanWriteProjectContent: (req, res, next) ->
  53. AuthorizationMiddleware._getUserAndProjectId req, (error, user_id, project_id) ->
  54. return next(error) if error?
  55. token = TokenAccessHandler.getRequestToken(req, project_id)
  56. AuthorizationManager.canUserWriteProjectContent user_id, project_id, token, (error, canWrite) ->
  57. return next(error) if error?
  58. if canWrite
  59. logger.log {user_id, project_id}, "allowing user write access to project content"
  60. next()
  61. else
  62. logger.log {user_id, project_id}, "denying user write access to project settings"
  63. AuthorizationMiddleware.redirectToRestricted req, res, next
  64. ensureUserCanAdminProject: (req, res, next) ->
  65. AuthorizationMiddleware._getUserAndProjectId req, (error, user_id, project_id) ->
  66. return next(error) if error?
  67. token = TokenAccessHandler.getRequestToken(req, project_id)
  68. AuthorizationManager.canUserAdminProject user_id, project_id, token, (error, canAdmin) ->
  69. return next(error) if error?
  70. if canAdmin
  71. logger.log {user_id, project_id}, "allowing user admin access to project"
  72. next()
  73. else
  74. logger.log {user_id, project_id}, "denying user admin access to project"
  75. AuthorizationMiddleware.redirectToRestricted req, res, next
  76. ensureUserIsSiteAdmin: (req, res, next) ->
  77. AuthorizationMiddleware._getUserId req, (error, user_id) ->
  78. return next(error) if error?
  79. AuthorizationManager.isUserSiteAdmin user_id, (error, isAdmin) ->
  80. return next(error) if error?
  81. if isAdmin
  82. logger.log {user_id}, "allowing user admin access to site"
  83. next()
  84. else
  85. logger.log {user_id}, "denying user admin access to site"
  86. AuthorizationMiddleware.redirectToRestricted req, res, next
  87. _getUserAndProjectId: (req, callback = (error, user_id, project_id) ->) ->
  88. project_id = req.params?.project_id or req.params?.Project_id
  89. if !project_id?
  90. return callback(new Error("Expected project_id in request parameters"))
  91. if !ObjectId.isValid(project_id)
  92. return callback(new Errors.NotFoundError("invalid project_id: #{project_id}"))
  93. AuthorizationMiddleware._getUserId req, (error, user_id) ->
  94. return callback(error) if error?
  95. callback(null, user_id, project_id)
  96. _getUserId: (req, callback = (error, user_id) ->) ->
  97. user_id = AuthenticationController.getLoggedInUserId(req) || req?.oauth_user?._id || null
  98. return callback(null, user_id)
  99. redirectToRestricted: (req, res, next) ->
  100. # TODO: move this to throwing ForbiddenError
  101. res.redirect "/restricted?from=#{encodeURIComponent(req.url)}"
  102. restricted : (req, res, next)->
  103. if AuthenticationController.isUserLoggedIn(req)
  104. res.render 'user/restricted',
  105. title:'restricted'
  106. else
  107. from = req.query.from
  108. logger.log {from: from}, "redirecting to login"
  109. redirect_to = "/login"
  110. if from?
  111. AuthenticationController.setRedirectInSession(req, from)
  112. res.redirect redirect_to