UserMembershipAuthorization.coffee 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. AuthenticationController = require('../Authentication/AuthenticationController')
  2. AuthorizationMiddlewear = require('../Authorization/AuthorizationMiddlewear')
  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. requireTeamAccess: (req, res, next) ->
  11. requireAccessToEntity('team', req.params.id, req, res, next)
  12. requireGroupAccess: (req, res, next) ->
  13. requireAccessToEntity('group', req.params.id, req, res, next)
  14. requireGroupManagersAccess: (req, res, next) ->
  15. requireAccessToEntity('groupManagers', req.params.id, req, res, next)
  16. requireInstitutionAccess: (req, res, next) ->
  17. requireAccessToEntity('institution', req.params.id, req, res, next)
  18. requirePublisherAccess: (req, res, next) ->
  19. requireAccessToEntity('publisher', req.params.id, req, res, next)
  20. requireTemplateAccess: (req, res, next) ->
  21. templateId = req.params.id
  22. request {
  23. baseUrl: settings.apis.v1.url
  24. url: "/api/v2/templates/#{templateId}"
  25. method: 'GET'
  26. auth:
  27. user: settings.apis.v1.user
  28. pass: settings.apis.v1.pass
  29. sendImmediately: true
  30. }, (error, response, body) =>
  31. if response.statusCode == 404
  32. return next(new Errors.NotFoundError())
  33. if response.statusCode != 200
  34. logger.err { templateId }, "[TemplateMetrics] Couldn't fetch template data from v1"
  35. return next(new Error("Couldn't fetch template data from v1"))
  36. return next(error) if error?
  37. try
  38. body = JSON.parse(body)
  39. catch error
  40. return next(error)
  41. req.template =
  42. id: body.id
  43. title: body.title
  44. if body?.brand?.slug
  45. requireAccessToEntity('publisher', body.brand.slug, req, res, next)
  46. else
  47. AuthorizationMiddlewear.ensureUserIsSiteAdmin(req, res, next)
  48. requireGraphAccess: (req, res, next) ->
  49. if req.query.resource_type == 'template'
  50. # templates are a special case; can't use requireaccesstoentity directly
  51. req.params.id = req.query.resource_id
  52. return UserMembershipAuthorization.requireTemplateAccess(req, res, next)
  53. requireAccessToEntity(
  54. req.query.resource_type, req.query.resource_id, req, res, next
  55. )
  56. requireAccessToEntity = (entityName, entityId, req, res, next) ->
  57. loggedInUser = AuthenticationController.getSessionUser(req)
  58. unless loggedInUser
  59. return AuthorizationMiddlewear.redirectToRestricted req, res, next
  60. getEntity entityName, entityId, loggedInUser, (error, entity, entityConfig, entityExists) ->
  61. return next(error) if error?
  62. if entity?
  63. req.entity = entity
  64. req.entityConfig = entityConfig
  65. return next()
  66. if entityExists # user doesn't have access to entity
  67. return AuthorizationMiddlewear.redirectToRestricted(req, res, next)
  68. if loggedInUser.isAdmin and entityConfig.canCreate
  69. # entity doesn't exists, admin can create it
  70. return res.redirect "/entities/#{entityName}/create/#{entityId}"
  71. next(new Errors.NotFoundError())
  72. getEntity = (entityName, entityId, user, callback = (error, entity, entityConfig, entityExists)->) ->
  73. entityConfig = EntityConfigs[entityName]
  74. unless entityConfig
  75. return callback(new Errors.NotFoundError("No such entity: #{entityName}"))
  76. UserMembershipHandler.getEntity entityId, entityConfig, user, (error, entity)->
  77. return callback(error) if error?
  78. return callback(null, entity, entityConfig, true) if entity?
  79. # no access to entity. Check if entity exists
  80. UserMembershipHandler.getEntityWithoutAuthorizationCheck entityId, entityConfig, (error, entity)->
  81. return callback(error) if error?
  82. callback(null, null, entityConfig, entity?)