UserMembershipAuthorization.coffee 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. AuthenticationController = require('../Authentication/AuthenticationController')
  2. AuthorizationMiddleware = require('../Authorization/AuthorizationMiddleware')
  3. UserMembershipHandler = require('./UserMembershipHandler')
  4. EntityConfigs = require('./UserMembershipEntityConfigs')
  5. Errors = require('../Errors/Errors')
  6. logger = require("logger-sharelatex")
  7. settings = require 'settings-sharelatex'
  8. request = require 'request'
  9. module.exports = UserMembershipAuthorization =
  10. requireTeamMetricsAccess: (req, res, next) ->
  11. requireAccessToEntity('team', req.params.id, req, res, next, 'groupMetrics')
  12. requireGroupManagementAccess: (req, res, next) ->
  13. requireAccessToEntity('group', req.params.id, req, res, next, 'groupManagement')
  14. requireGroupMetricsAccess: (req, res, next) ->
  15. requireAccessToEntity('group', req.params.id, req, res, next, 'groupMetrics')
  16. requireGroupManagersManagementAccess: (req, res, next) ->
  17. requireAccessToEntity('groupManagers', req.params.id, req, res, next, 'groupManagement')
  18. requireInstitutionMetricsAccess: (req, res, next) ->
  19. requireAccessToEntity('institution', req.params.id, req, res, next, 'institutionMetrics')
  20. requireInstitutionManagementAccess: (req, res, next) ->
  21. requireAccessToEntity('institution', req.params.id, req, res, next, 'institutionManagement')
  22. requirePublisherMetricsAccess: (req, res, next) ->
  23. requireAccessToEntity('publisher', req.params.id, req, res, next, 'publisherMetrics')
  24. requirePublisherManagementAccess: (req, res, next) ->
  25. requireAccessToEntity('publisher', req.params.id, req, res, next, 'publisherManagement')
  26. requireTemplateMetricsAccess: (req, res, next) ->
  27. templateId = req.params.id
  28. request {
  29. baseUrl: settings.apis.v1.url
  30. url: "/api/v2/templates/#{templateId}"
  31. method: 'GET'
  32. auth:
  33. user: settings.apis.v1.user
  34. pass: settings.apis.v1.pass
  35. sendImmediately: true
  36. }, (error, response, body) =>
  37. if response.statusCode == 404
  38. return next(new Errors.NotFoundError())
  39. if response.statusCode != 200
  40. logger.err { templateId }, "[TemplateMetrics] Couldn't fetch template data from v1"
  41. return next(new Error("Couldn't fetch template data from v1"))
  42. return next(error) if error?
  43. try
  44. body = JSON.parse(body)
  45. catch error
  46. return next(error)
  47. req.template =
  48. id: body.id
  49. title: body.title
  50. if body?.brand?.slug
  51. req.params.id = body.brand.slug
  52. UserMembershipAuthorization.requirePublisherMetricsAccess(req, res, next)
  53. else
  54. AuthorizationMiddleware.ensureUserIsSiteAdmin(req, res, next)
  55. requireGraphAccess: (req, res, next) ->
  56. req.params.id = req.query.resource_id
  57. if req.query.resource_type == 'template'
  58. return UserMembershipAuthorization.requireTemplateMetricsAccess(req, res, next)
  59. else if req.query.resource_type == 'institution'
  60. return UserMembershipAuthorization.requireInstitutionMetricsAccess(req, res, next)
  61. else if req.query.resource_type == 'group'
  62. return UserMembershipAuthorization.requireGroupMetricsAccess(req, res, next)
  63. else if req.query.resource_type == 'team'
  64. return UserMembershipAuthorization.requireTeamMetricsAccess(req, res, next)
  65. requireAccessToEntity(req.query.resource_type, req.query.resource_id, req, res, next)
  66. requireEntityCreationAccess: (req, res, next) ->
  67. loggedInUser = AuthenticationController.getSessionUser(req)
  68. unless loggedInUser and hasEntityCreationAccess(loggedInUser)
  69. return AuthorizationMiddleware.redirectToRestricted req, res, next
  70. next()
  71. requireAccessToEntity = (entityName, entityId, req, res, next, requiredStaffAccess=null) ->
  72. loggedInUser = AuthenticationController.getSessionUser(req)
  73. unless loggedInUser
  74. return AuthorizationMiddleware.redirectToRestricted req, res, next
  75. getEntity entityName, entityId, loggedInUser, requiredStaffAccess, (error, entity, entityConfig, entityExists) ->
  76. return next(error) if error?
  77. if entity?
  78. req.entity = entity
  79. req.entityConfig = entityConfig
  80. return next()
  81. if entityExists # user doesn't have access to entity
  82. return AuthorizationMiddleware.redirectToRestricted(req, res, next)
  83. if hasEntityCreationAccess(loggedInUser) and entityConfig.canCreate
  84. # entity doesn't exists, admin can create it
  85. return res.redirect "/entities/#{entityName}/create/#{entityId}"
  86. next(new Errors.NotFoundError())
  87. getEntity = (entityName, entityId, user, requiredStaffAccess, callback = (error, entity, entityConfig, entityExists)->) ->
  88. entityConfig = EntityConfigs[entityName]
  89. unless entityConfig
  90. return callback(new Errors.NotFoundError("No such entity: #{entityName}"))
  91. UserMembershipHandler.getEntity entityId, entityConfig, user, requiredStaffAccess, (error, entity)->
  92. return callback(error) if error?
  93. return callback(null, entity, entityConfig, true) if entity?
  94. # no access to entity. Check if entity exists
  95. UserMembershipHandler.getEntityWithoutAuthorizationCheck entityId, entityConfig, (error, entity)->
  96. return callback(error) if error?
  97. callback(null, null, entityConfig, entity?)
  98. hasEntityCreationAccess = (user) ->
  99. user.isAdmin or
  100. user.staffAccess?['institutionManagement'] or
  101. user.staffAccess?['publisherManagement']