AuthorizationMiddlewear.coffee 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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 = AuthorizationMiddlewear =
  9. ensureUserCanReadMultipleProjects: (req, res, next) ->
  10. project_ids = (req.query.project_ids or "").split(",")
  11. AuthorizationMiddlewear._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. AuthorizationMiddlewear.redirectToRestricted req, res, next
  23. else
  24. next()
  25. ensureUserCanReadProject: (req, res, next) ->
  26. AuthorizationMiddlewear._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. AuthorizationMiddlewear.redirectToRestricted req, res, next
  37. ensureUserCanWriteProjectSettings: (req, res, next) ->
  38. AuthorizationMiddlewear._getUserAndProjectId req, (error, user_id, project_id) ->
  39. return next(error) if error?
  40. token = TokenAccessHandler.getRequestToken(req, project_id)
  41. AuthorizationManager.canUserWriteProjectSettings user_id, project_id, token, (error, canWrite) ->
  42. return next(error) if error?
  43. if canWrite
  44. logger.log {user_id, project_id}, "allowing user write access to project settings"
  45. next()
  46. else
  47. logger.log {user_id, project_id}, "denying user write access to project settings"
  48. AuthorizationMiddlewear.redirectToRestricted req, res, next
  49. ensureUserCanWriteProjectContent: (req, res, next) ->
  50. AuthorizationMiddlewear._getUserAndProjectId req, (error, user_id, project_id) ->
  51. return next(error) if error?
  52. token = TokenAccessHandler.getRequestToken(req, project_id)
  53. AuthorizationManager.canUserWriteProjectContent user_id, project_id, token, (error, canWrite) ->
  54. return next(error) if error?
  55. if canWrite
  56. logger.log {user_id, project_id}, "allowing user write access to project content"
  57. next()
  58. else
  59. logger.log {user_id, project_id}, "denying user write access to project settings"
  60. AuthorizationMiddlewear.redirectToRestricted req, res, next
  61. ensureUserCanAdminProject: (req, res, next) ->
  62. AuthorizationMiddlewear._getUserAndProjectId req, (error, user_id, project_id) ->
  63. return next(error) if error?
  64. token = TokenAccessHandler.getRequestToken(req, project_id)
  65. AuthorizationManager.canUserAdminProject user_id, project_id, token, (error, canAdmin) ->
  66. return next(error) if error?
  67. if canAdmin
  68. logger.log {user_id, project_id}, "allowing user admin access to project"
  69. next()
  70. else
  71. logger.log {user_id, project_id}, "denying user admin access to project"
  72. AuthorizationMiddlewear.redirectToRestricted req, res, next
  73. ensureUserIsSiteAdmin: (req, res, next) ->
  74. AuthorizationMiddlewear._getUserId req, (error, user_id) ->
  75. return next(error) if error?
  76. AuthorizationManager.isUserSiteAdmin user_id, (error, isAdmin) ->
  77. return next(error) if error?
  78. if isAdmin
  79. logger.log {user_id}, "allowing user admin access to site"
  80. next()
  81. else
  82. logger.log {user_id}, "denying user admin access to site"
  83. AuthorizationMiddlewear.redirectToRestricted req, res, next
  84. _getUserAndProjectId: (req, callback = (error, user_id, project_id) ->) ->
  85. project_id = req.params?.project_id or req.params?.Project_id
  86. if !project_id?
  87. return callback(new Error("Expected project_id in request parameters"))
  88. if !ObjectId.isValid(project_id)
  89. return callback(new Errors.NotFoundError("invalid project_id: #{project_id}"))
  90. AuthorizationMiddlewear._getUserId req, (error, user_id) ->
  91. return callback(error) if error?
  92. callback(null, user_id, project_id)
  93. _getUserId: (req, callback = (error, user_id) ->) ->
  94. user_id = AuthenticationController.getLoggedInUserId(req)
  95. return callback(null, user_id)
  96. redirectToRestricted: (req, res, next) ->
  97. res.redirect "/restricted?from=#{encodeURIComponent(req.url)}"
  98. restricted : (req, res, next)->
  99. if AuthenticationController.isUserLoggedIn(req)
  100. res.render 'user/restricted',
  101. title:'restricted'
  102. else
  103. from = req.query.from
  104. logger.log {from: from}, "redirecting to login"
  105. redirect_to = "/login"
  106. if from?
  107. AuthenticationController._setRedirectInSession(req, from)
  108. res.redirect redirect_to