| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- /* eslint-disable
- handle-callback-err,
- max-len,
- no-return-assign,
- no-unused-vars,
- */
- // TODO: This file was created by bulk-decaffeinate.
- // Fix any style issues and re-enable lint.
- /*
- * decaffeinate suggestions:
- * DS102: Remove unnecessary code created because of implicit returns
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
- */
- const sinon = require('sinon')
- const chai = require('chai')
- const { expect } = require('chai')
- const modulePath =
- '../../../../app/src/Features/UserMembership/UserMembershipAuthorization.js'
- const SandboxedModule = require('sandboxed-module')
- const MockRequest = require('../helpers/MockRequest')
- const EntityConfigs = require('../../../../app/src/Features/UserMembership/UserMembershipEntityConfigs')
- const Errors = require('../../../../app/src/Features/Errors/Errors')
- describe('UserMembershipAuthorization', function() {
- beforeEach(function() {
- this.req = new MockRequest()
- this.req.params.id = 'mock-entity-id'
- this.user = { _id: 'mock-user-id' }
- this.subscription = { _id: 'mock-subscription-id' }
- this.AuthenticationController = {
- getSessionUser: sinon.stub().returns(this.user)
- }
- this.UserMembershipHandler = {
- getEntity: sinon.stub().yields(null, this.subscription),
- getEntityWithoutAuthorizationCheck: sinon
- .stub()
- .yields(null, this.subscription)
- }
- this.AuthorizationMiddleware = {
- redirectToRestricted: sinon.stub().yields(),
- ensureUserIsSiteAdmin: sinon.stub().yields()
- }
- return (this.UserMembershipAuthorization = SandboxedModule.require(
- modulePath,
- {
- requires: {
- '../Authentication/AuthenticationController': this
- .AuthenticationController,
- '../Authorization/AuthorizationMiddleware': this
- .AuthorizationMiddleware,
- './UserMembershipHandler': this.UserMembershipHandler,
- './EntityConfigs': EntityConfigs,
- '../Errors/Errors': Errors,
- request: (this.request = sinon.stub().yields(null, null, {})),
- 'logger-sharelatex': {
- log() {},
- err() {}
- }
- }
- }
- ))
- })
- describe('requireAccessToEntity', function() {
- it('get entity', function(done) {
- return this.UserMembershipAuthorization.requireGroupMetricsAccess(
- this.req,
- null,
- error => {
- expect(error).to.not.exist
- sinon.assert.calledWithMatch(
- this.UserMembershipHandler.getEntity,
- this.req.params.id,
- { modelName: 'Subscription' },
- this.user
- )
- expect(this.req.entity).to.equal(this.subscription)
- expect(this.req.entityConfig).to.exist
- return done()
- }
- )
- })
- it('handle entity not found as non-admin', function(done) {
- this.UserMembershipHandler.getEntity.yields(null, null)
- this.UserMembershipHandler.getEntityWithoutAuthorizationCheck.yields(
- null,
- null
- )
- return this.UserMembershipAuthorization.requireGroupMetricsAccess(
- this.req,
- null,
- error => {
- expect(error).to.exist
- expect(error).to.be.instanceof(Error)
- expect(error.constructor.name).to.equal('NotFoundError')
- sinon.assert.called(this.UserMembershipHandler.getEntity)
- expect(this.req.entity).to.not.exist
- return done()
- }
- )
- })
- it('handle entity not found an admin can create', function(done) {
- this.user.isAdmin = true
- this.UserMembershipHandler.getEntity.yields(null, null)
- this.UserMembershipHandler.getEntityWithoutAuthorizationCheck.yields(
- null,
- null
- )
- return this.UserMembershipAuthorization.requirePublisherMetricsAccess(
- this.req,
- {
- redirect: path => {
- expect(path).to.exist
- expect(path).to.match(/create/)
- return done()
- }
- }
- )
- })
- it('handle entity not found a non-admin can create', function(done) {
- this.user.staffAccess = { institutionManagement: true }
- this.UserMembershipHandler.getEntity.yields(null, null)
- this.UserMembershipHandler.getEntityWithoutAuthorizationCheck.yields(
- null,
- null
- )
- return this.UserMembershipAuthorization.requirePublisherMetricsAccess(
- this.req,
- {
- redirect: path => {
- expect(path).to.exist
- expect(path).to.match(/create/)
- return done()
- }
- }
- )
- })
- it('handle entity not found an admin cannot create', function(done) {
- this.user.isAdmin = true
- this.UserMembershipHandler.getEntity.yields(null, null)
- this.UserMembershipHandler.getEntityWithoutAuthorizationCheck.yields(
- null,
- null
- )
- return this.UserMembershipAuthorization.requireGroupMetricsAccess(
- this.req,
- null,
- error => {
- expect(error).to.exist
- expect(error).to.be.instanceof(Error)
- expect(error.constructor.name).to.equal('NotFoundError')
- return done()
- }
- )
- })
- it('handle entity no access', function(done) {
- this.UserMembershipHandler.getEntity.yields(null, null)
- return this.UserMembershipAuthorization.requireGroupMetricsAccess(
- this.req,
- null,
- error => {
- sinon.assert.called(this.AuthorizationMiddleware.redirectToRestricted)
- return done()
- }
- )
- })
- it('handle anonymous user', function(done) {
- this.AuthenticationController.getSessionUser.returns(null)
- return this.UserMembershipAuthorization.requireGroupMetricsAccess(
- this.req,
- null,
- error => {
- expect(error).to.not.exist
- sinon.assert.called(this.AuthorizationMiddleware.redirectToRestricted)
- sinon.assert.notCalled(this.UserMembershipHandler.getEntity)
- expect(this.req.entity).to.not.exist
- return done()
- }
- )
- })
- return it('checks user is staff if required', function(done) {
- return this.UserMembershipAuthorization.requireInstitutionManagementStaffAccess(
- this.req,
- null,
- error => {
- expect(error).to.not.exist
- sinon.assert.called(this.AuthorizationMiddleware.redirectToRestricted)
- sinon.assert.notCalled(this.UserMembershipHandler.getEntity)
- expect(this.req.entity).to.not.exist
- return done()
- }
- )
- })
- })
- return describe('requireEntityAccess', function() {
- it('handle team access', function(done) {
- return this.UserMembershipAuthorization.requireTeamMetricsAccess(
- this.req,
- null,
- error => {
- expect(error).to.not.exist
- sinon.assert.calledWithMatch(
- this.UserMembershipHandler.getEntity,
- this.req.params.id,
- { fields: { primaryKey: 'overleaf.id' } }
- )
- return done()
- }
- )
- })
- it('handle group access', function(done) {
- return this.UserMembershipAuthorization.requireGroupMetricsAccess(
- this.req,
- null,
- error => {
- expect(error).to.not.exist
- sinon.assert.calledWithMatch(
- this.UserMembershipHandler.getEntity,
- this.req.params.id,
- { translations: { title: 'group_account' } }
- )
- return done()
- }
- )
- })
- it('handle group managers access', function(done) {
- return this.UserMembershipAuthorization.requireGroupManagersManagementAccess(
- this.req,
- null,
- error => {
- expect(error).to.not.exist
- sinon.assert.calledWithMatch(
- this.UserMembershipHandler.getEntity,
- this.req.params.id,
- { translations: { subtitle: 'managers_management' } }
- )
- return done()
- }
- )
- })
- it('handle institution access', function(done) {
- return this.UserMembershipAuthorization.requireInstitutionMetricsAccess(
- this.req,
- null,
- error => {
- expect(error).to.not.exist
- sinon.assert.calledWithMatch(
- this.UserMembershipHandler.getEntity,
- this.req.params.id,
- { modelName: 'Institution' }
- )
- return done()
- }
- )
- })
- it('handle template with brand access', function(done) {
- const templateData = {
- id: 123,
- title: 'Template Title',
- brand: { slug: 'brand-slug' }
- }
- this.request.yields(
- null,
- { statusCode: 200 },
- JSON.stringify(templateData)
- )
- return this.UserMembershipAuthorization.requireTemplateMetricsAccess(
- this.req,
- null,
- error => {
- expect(error).to.not.exist
- sinon.assert.calledWithMatch(
- this.UserMembershipHandler.getEntity,
- 'brand-slug',
- { modelName: 'Publisher' }
- )
- return done()
- }
- )
- })
- it('handle template without brand access', function(done) {
- const templateData = {
- id: 123,
- title: 'Template Title',
- brand: null
- }
- this.request.yields(
- null,
- { statusCode: 200 },
- JSON.stringify(templateData)
- )
- return this.UserMembershipAuthorization.requireTemplateMetricsAccess(
- this.req,
- null,
- error => {
- expect(error).to.not.exist
- sinon.assert.notCalled(this.UserMembershipHandler.getEntity)
- sinon.assert.calledOnce(
- this.AuthorizationMiddleware.ensureUserIsSiteAdmin
- )
- return done()
- }
- )
- })
- return it('handle graph access', function(done) {
- this.req.query.resource_id = 'mock-resource-id'
- this.req.query.resource_type = 'institution'
- const middleware = this.UserMembershipAuthorization.requireGraphAccess
- return middleware(this.req, null, error => {
- expect(error).to.not.exist
- sinon.assert.calledWithMatch(
- this.UserMembershipHandler.getEntity,
- this.req.query.resource_id,
- { modelName: 'Institution' }
- )
- return done()
- })
- })
- })
- })
|