Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Disable premium content #3974

Merged
merged 4 commits into from
Sep 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions creator-node/compose/env/base.env
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,6 @@ reconfigSPIdBlacklistString=

entityManagerAddress=0x5b9b42d6e4B2e4Bf8d42Eba32D46918e10899B66
entityManagerReplicaSetEnabled=true

# Premium content
premiumContentEnabled=true
2 changes: 1 addition & 1 deletion creator-node/scripts/run-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ if [ "${debug}" ]; then
UNIT_TIMEOUT=0
INTEGRATION_TIMEOUT=0
else
UNIT_TIMEOUT=2000
UNIT_TIMEOUT=5000
sddioulde marked this conversation as resolved.
Show resolved Hide resolved
INTEGRATION_TIMEOUT=30000
fi

Expand Down
6 changes: 6 additions & 0 deletions creator-node/src/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,12 @@ const config = convict({
env: 'entityManagerReplicaSetEnabled',
default: false
},
premiumContentEnabled: {
doc: 'whether or not to enable premium content',
format: Boolean,
env: 'premiumContentEnabled',
default: false
},

/** sync / snapback configs */

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import { premiumContentMiddleware } from './premiumContentMiddleware'
import assert from 'assert'
import { resFactory, loggerFactory } from '../../../test/lib/reqMock'
import { Request, Response } from 'express'
import Logger from 'bunyan'
import { Redis } from 'ioredis'
import { PremiumContentAccessError } from '../../premiumContent/types'
import { StubPremiumContentAccessChecker } from '../../premiumContent/stubPremiumContentAccessChecker'
import config from '../../config'
import proxyquire from 'proxyquire' // eslint-disable-line node/no-unpublished-import

describe('Test premium content middleware', function () {
describe('Test premium content middleware', () => {
let premiumContentMiddlewareProxy: any
let app: any
let serviceRegistry: any
let libs: any
Expand All @@ -18,7 +20,7 @@ describe('Test premium content middleware', function () {
let mockRes: any
let premiumContentAccessChecker: StubPremiumContentAccessChecker

beforeEach(function () {
beforeEach(() => {
libs = {
ethContracts: {
ServiceProviderFactoryClient: {
Expand Down Expand Up @@ -46,109 +48,136 @@ describe('Test premium content middleware', function () {
mockRes = resFactory()
})

it('returns bad request when missing the CID param', async () => {
let nextCalled = false
await premiumContentMiddleware(
{ ...mockReq, params: { CID: null } } as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
describe('when premium content is enabled', () => {
beforeEach(() => {
config.set('premiumContentEnabled', true)
premiumContentMiddlewareProxy = proxyquire('./premiumContentMiddleware', {
'./../../config': config
})
})

it('returns bad request when missing the CID param', async () => {
let nextCalled = false
await premiumContentMiddlewareProxy.premiumContentMiddleware(
{ ...mockReq, params: { CID: null } } as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
}
)
assert.deepStrictEqual(mockRes.statusCode, 400)
assert.deepStrictEqual(nextCalled, false)
})

it('returns unauthorized when it fails because of missing headers', async () => {
premiumContentAccessChecker.accessCheckReturnsWith = {
doesUserHaveAccess: false,
trackId: 1,
isPremium: true,
error: PremiumContentAccessError.MISSING_HEADERS
}
)
assert.deepStrictEqual(mockRes.statusCode, 400)
assert.deepStrictEqual(nextCalled, false)
})
let nextCalled = false
await premiumContentMiddlewareProxy.premiumContentMiddleware(
mockReq as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
}
)
assert.deepStrictEqual(mockRes.statusCode, 401)
assert.deepStrictEqual(nextCalled, false)
})

it('returns unauthorized when it fails because of missing headers', async () => {
premiumContentAccessChecker.accessCheckReturnsWith = {
doesUserHaveAccess: false,
trackId: 1,
isPremium: true,
error: PremiumContentAccessError.MISSING_HEADERS
}
let nextCalled = false
await premiumContentMiddleware(
mockReq as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
it('returns forbidden when it fails because of invalid discovery node', async () => {
premiumContentAccessChecker.accessCheckReturnsWith = {
doesUserHaveAccess: false,
trackId: 1,
isPremium: true,
error: PremiumContentAccessError.INVALID_DISCOVERY_NODE
}
)
assert.deepStrictEqual(mockRes.statusCode, 401)
assert.deepStrictEqual(nextCalled, false)
})
let nextCalled = false
await premiumContentMiddlewareProxy.premiumContentMiddleware(
mockReq as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
}
)
assert.deepStrictEqual(mockRes.statusCode, 403)
assert.deepStrictEqual(nextCalled, false)
})

it('returns forbidden when it fails because of invalid discovery node', async () => {
premiumContentAccessChecker.accessCheckReturnsWith = {
doesUserHaveAccess: false,
trackId: 1,
isPremium: true,
error: PremiumContentAccessError.INVALID_DISCOVERY_NODE
}
let nextCalled = false
await premiumContentMiddleware(
mockReq as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
it('returns forbidden when it fails because of failed verification match', async () => {
premiumContentAccessChecker.accessCheckReturnsWith = {
doesUserHaveAccess: false,
trackId: 1,
isPremium: true,
error: PremiumContentAccessError.FAILED_MATCH
}
)
assert.deepStrictEqual(mockRes.statusCode, 403)
assert.deepStrictEqual(nextCalled, false)
})
let nextCalled = false
await premiumContentMiddlewareProxy.premiumContentMiddleware(
mockReq as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
}
)
assert.deepStrictEqual(mockRes.statusCode, 403)
assert.deepStrictEqual(nextCalled, false)
})

it('returns forbidden when it fails because of failed verification match', async () => {
premiumContentAccessChecker.accessCheckReturnsWith = {
doesUserHaveAccess: false,
trackId: 1,
isPremium: true,
error: PremiumContentAccessError.FAILED_MATCH
}
let nextCalled = false
await premiumContentMiddleware(
mockReq as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
it('passes and moves to the next middleware when all checks are fine and content is NOT premium', async () => {
premiumContentAccessChecker.accessCheckReturnsWith = {
doesUserHaveAccess: true,
trackId: null,
isPremium: false,
error: null
}
)
assert.deepStrictEqual(mockRes.statusCode, 403)
assert.deepStrictEqual(nextCalled, false)
})
let nextCalled = false
await premiumContentMiddlewareProxy.premiumContentMiddleware(
mockReq as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
}
)
assert.deepStrictEqual(nextCalled, true)
})

it('passes and moves to the next middleware when all checks are fine and content is NOT premium', async () => {
premiumContentAccessChecker.accessCheckReturnsWith = {
doesUserHaveAccess: true,
trackId: null,
isPremium: false,
error: null
}
let nextCalled = false
await premiumContentMiddleware(
mockReq as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
it('passes and moves to the next middleware when all checks are fine and content IS premium', async () => {
premiumContentAccessChecker.accessCheckReturnsWith = {
doesUserHaveAccess: true,
trackId: 1,
isPremium: true,
error: null
}
)
assert.deepStrictEqual(nextCalled, true)
let nextCalled = false
await premiumContentMiddlewareProxy.premiumContentMiddleware(
mockReq as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
}
)
assert.deepStrictEqual(nextCalled, true)
})
})

it('passes and moves to the next middleware when all checks are fine and content IS premium', async () => {
premiumContentAccessChecker.accessCheckReturnsWith = {
doesUserHaveAccess: true,
trackId: 1,
isPremium: true,
error: null
}
let nextCalled = false
await premiumContentMiddleware(
mockReq as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
}
)
assert.deepStrictEqual(nextCalled, true)
describe('when premium content is disabled', () => {
it('moves on to the next middleware', async () => {
config.set('premiumContentEnabled', false)
premiumContentMiddlewareProxy = proxyquire('./premiumContentMiddleware', {
'./../../config': config
})
let nextCalled = false
await premiumContentMiddlewareProxy.premiumContentMiddleware(
mockReq as unknown as Request,
mockRes as unknown as Response,
() => {
nextCalled = true
}
)
assert.deepStrictEqual(nextCalled, true)
})
})
})
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { NextFunction, Request, Response } from 'express'
import { PremiumContentAccessError } from '../../premiumContent/types'
import type Logger from 'bunyan'
import { PremiumContentAccessChecker } from '../../premiumContent/premiumContentAccessChecker'
import config from '../../config'

/**
* Middleware to validate requests to get premium content.
Expand All @@ -28,16 +29,20 @@ export const premiumContentMiddleware = async (
res: Response,
next: NextFunction
) => {
try {
const cid = req.params?.CID
if (!cid) {
return sendResponse(
req,
res,
errorResponseBadRequest(`Invalid request, no CID provided.`)
)
}
const cid = req.params?.CID
if (!cid) {
return sendResponse(
req,
res,
errorResponseBadRequest(`Invalid request, no CID provided.`)
)
}

if (!config.get('premiumContentEnabled')) {
return next()
}

try {
const premiumContentHeaders = req.headers['x-premium-content'] as string
const serviceRegistry = req.app.get('serviceRegistry')
const { premiumContentAccessChecker, libs, redis } = serviceRegistry
Expand All @@ -63,8 +68,7 @@ export const premiumContentMiddleware = async (
trackId,
isPremium
}
next()
return
return next()
}

switch (error) {
Expand Down