AuthorizationMiddlewear.coffee 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. AuthorizationManager = require("./AuthorizationManager")
  2. async = require "async"
  3. logger = require "logger-sharelatex"
  4. ObjectId = require("mongojs").ObjectId
  5. Errors = require "../Errors/Errors"
  6. module.exports = AuthorizationMiddlewear =
  7. ensureUserCanReadMultipleProjects: (req, res, next) ->
  8. project_ids = (req.query.project_ids or "").split(",")
  9. AuthorizationMiddlewear._getUserId req, (error, user_id) ->
  10. return next(error) if error?
  11. # Remove the projects we have access to. Note rejectSeries doesn't use
  12. # errors in callbacks
  13. async.rejectSeries project_ids, (project_id, cb) ->
  14. AuthorizationManager.canUserReadProject user_id, project_id, (error, canRead) ->
  15. return next(error) if error?
  16. cb(canRead)
  17. , (unauthorized_project_ids) ->
  18. if unauthorized_project_ids.length > 0
  19. AuthorizationMiddlewear.redirectToRestricted req, res, next
  20. else
  21. next()
  22. ensureUserCanReadProject: (req, res, next) ->
  23. AuthorizationMiddlewear._getUserAndProjectId req, (error, user_id, project_id) ->
  24. return next(error) if error?
  25. AuthorizationManager.canUserReadProject user_id, project_id, (error, canRead) ->
  26. return next(error) if error?
  27. if canRead
  28. logger.log {user_id, project_id}, "allowing user read access to project"
  29. next()
  30. else
  31. logger.log {user_id, project_id}, "denying user read access to project"
  32. AuthorizationMiddlewear.redirectToRestricted req, res, next
  33. ensureUserCanWriteProjectSettings: (req, res, next) ->
  34. AuthorizationMiddlewear._getUserAndProjectId req, (error, user_id, project_id) ->
  35. return next(error) if error?
  36. AuthorizationManager.canUserWriteProjectSettings user_id, project_id, (error, canWrite) ->
  37. return next(error) if error?
  38. if canWrite
  39. logger.log {user_id, project_id}, "allowing user write access to project settings"
  40. next()
  41. else
  42. logger.log {user_id, project_id}, "denying user write access to project settings"
  43. AuthorizationMiddlewear.redirectToRestricted req, res, next
  44. ensureUserCanWriteProjectContent: (req, res, next) ->
  45. AuthorizationMiddlewear._getUserAndProjectId req, (error, user_id, project_id) ->
  46. return next(error) if error?
  47. AuthorizationManager.canUserWriteProjectContent user_id, project_id, (error, canWrite) ->
  48. return next(error) if error?
  49. if canWrite
  50. logger.log {user_id, project_id}, "allowing user write access to project content"
  51. next()
  52. else
  53. logger.log {user_id, project_id}, "denying user write access to project settings"
  54. AuthorizationMiddlewear.redirectToRestricted req, res, next
  55. ensureUserCanAdminProject: (req, res, next) ->
  56. AuthorizationMiddlewear._getUserAndProjectId req, (error, user_id, project_id) ->
  57. return next(error) if error?
  58. AuthorizationManager.canUserAdminProject user_id, project_id, (error, canAdmin) ->
  59. return next(error) if error?
  60. if canAdmin
  61. logger.log {user_id, project_id}, "allowing user admin access to project"
  62. next()
  63. else
  64. logger.log {user_id, project_id}, "denying user admin access to project"
  65. AuthorizationMiddlewear.redirectToRestricted req, res, next
  66. ensureUserIsSiteAdmin: (req, res, next) ->
  67. AuthorizationMiddlewear._getUserId req, (error, user_id) ->
  68. return next(error) if error?
  69. AuthorizationManager.isUserSiteAdmin user_id, (error, isAdmin) ->
  70. return next(error) if error?
  71. if isAdmin
  72. logger.log {user_id}, "allowing user admin access to site"
  73. next()
  74. else
  75. logger.log {user_id}, "denying user admin access to site"
  76. AuthorizationMiddlewear.redirectToRestricted req, res, next
  77. _getUserAndProjectId: (req, callback = (error, user_id, project_id) ->) ->
  78. project_id = req.params?.project_id or req.params?.Project_id
  79. if !project_id?
  80. return callback(new Error("Expected project_id in request parameters"))
  81. if !ObjectId.isValid(project_id)
  82. return callback(new Errors.NotFoundError("invalid project_id: #{project_id}"))
  83. AuthorizationMiddlewear._getUserId req, (error, user_id) ->
  84. return callback(error) if error?
  85. callback(null, user_id, project_id)
  86. _getUserId: (req, callback = (error, user_id) ->) ->
  87. if req.session?.user?._id?
  88. user_id = req.session.user._id
  89. else
  90. user_id = null
  91. callback null, user_id
  92. redirectToRestricted: (req, res, next) ->
  93. res.redirect "/restricted"
  94. restricted : (req, res, next)->
  95. if req.session.user?
  96. res.render 'user/restricted',
  97. title:'restricted'
  98. else
  99. logger.log "user not logged in and trying to access #{req.url}, being redirected to login"
  100. res.redirect '/register'