UserMembershipAuthorization.coffee 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. requireAccessToEntity('publisher', body.brand.slug, req, res, next)
  45. requireGraphAccess: (req, res, next) ->
  46. if req.query.resource_type == 'template'
  47. # templates are a special case; can't use requireaccesstoentity directly
  48. req.params.id = req.query.resource_id
  49. return UserMembershipAuthorization.requireTemplateAccess(req, res, next)
  50. requireAccessToEntity(
  51. req.query.resource_type, req.query.resource_id, req, res, next
  52. )
  53. requireAccessToEntity = (entityName, entityId, req, res, next) ->
  54. loggedInUser = AuthenticationController.getSessionUser(req)
  55. unless loggedInUser
  56. return AuthorizationMiddlewear.redirectToRestricted req, res, next
  57. getEntity entityName, entityId, loggedInUser, (error, entity, entityConfig) ->
  58. return next(error) if error?
  59. unless entity?
  60. return AuthorizationMiddlewear.redirectToRestricted(req, res, next)
  61. req.entity = entity
  62. req.entityConfig = entityConfig
  63. next()
  64. getEntity = (entityName, entityId, userId, callback = (error, entity, entityConfig)->) ->
  65. entityConfig = EntityConfigs[entityName]
  66. unless entityConfig
  67. return callback(new Errors.NotFoundError("No such entity: #{entityName}"))
  68. UserMembershipHandler.getEntity entityId, entityConfig, userId, (error, entity)->
  69. return callback(error) if error?
  70. callback(null, entity, entityConfig)