|
|
@@ -0,0 +1,108 @@
|
|
|
+const { expect } = require('chai')
|
|
|
+const sinon = require('sinon')
|
|
|
+const modulePath = '../../../../app/src/infrastructure/HttpPermissionsPolicy.js'
|
|
|
+const SandboxedModule = require('sandboxed-module')
|
|
|
+const HttpPermissionsPolicyMiddleware = require('../../../../app/src/infrastructure/HttpPermissionsPolicy')
|
|
|
+const MockRequest = require('../helpers/MockRequest')
|
|
|
+const MockResponse = require('../helpers/MockResponse')
|
|
|
+
|
|
|
+describe('HttpPermissionsPolicy', function () {
|
|
|
+ this.beforeEach(function () {
|
|
|
+ this.next = sinon.stub()
|
|
|
+ this.HttpPermissionsPolicy = SandboxedModule.require(modulePath, {})
|
|
|
+ this.path = '/foo/bar'
|
|
|
+ this.req = new MockRequest()
|
|
|
+ return (this.res = new MockResponse())
|
|
|
+ })
|
|
|
+
|
|
|
+ describe('when a single blocked policy element is provided', function () {
|
|
|
+ it('returns a valid header string', function () {
|
|
|
+ const policy = {
|
|
|
+ blocked: ['accelerometer'],
|
|
|
+ }
|
|
|
+ const httpPermissionsMiddleware = new HttpPermissionsPolicyMiddleware(
|
|
|
+ policy
|
|
|
+ )
|
|
|
+ return expect(httpPermissionsMiddleware.policy).to.equal(
|
|
|
+ 'accelerometer=()'
|
|
|
+ )
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ describe('when a single allowed policy element is provided', function () {
|
|
|
+ it('returns a valid header string', function () {
|
|
|
+ const policy = {
|
|
|
+ allowed: { camera: 'self' },
|
|
|
+ }
|
|
|
+ const httpPermissionsMiddleware = new HttpPermissionsPolicyMiddleware(
|
|
|
+ policy
|
|
|
+ )
|
|
|
+ return expect(httpPermissionsMiddleware.policy).to.equal('camera=(self)')
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ describe('when a full policy is provided', function () {
|
|
|
+ it('returns a valid header string', function () {
|
|
|
+ const policy = {
|
|
|
+ blocked: ['usb', 'hid'],
|
|
|
+ allowed: { camera: 'self https://example.com', fullscreen: 'self' },
|
|
|
+ }
|
|
|
+ const httpPermissionsMiddleware = new HttpPermissionsPolicyMiddleware(
|
|
|
+ policy
|
|
|
+ )
|
|
|
+ return expect(httpPermissionsMiddleware.policy).to.equal(
|
|
|
+ 'usb=(), hid=(), camera=(self https://example.com), fullscreen=(self)'
|
|
|
+ )
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ describe('when a conflicting policy is provided', function () {
|
|
|
+ it('returns an error', function () {
|
|
|
+ const policy = {
|
|
|
+ blocked: ['usb'],
|
|
|
+ allowed: { usb: 'self' },
|
|
|
+ }
|
|
|
+ return expect(() => new HttpPermissionsPolicyMiddleware(policy)).to.throw(
|
|
|
+ 'Invalid Permissions-Policy header configuration'
|
|
|
+ )
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ describe('when the allowlist contains an incomplete directive', function () {
|
|
|
+ it('returns an error', function () {
|
|
|
+ const policy = {
|
|
|
+ blocked: ['usb'],
|
|
|
+ allowed: { camera: '' },
|
|
|
+ }
|
|
|
+ return expect(() => new HttpPermissionsPolicyMiddleware(policy)).to.throw(
|
|
|
+ 'Invalid Permissions-Policy header configuration'
|
|
|
+ )
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ describe('when an empty denylist is provided', function () {
|
|
|
+ it('returns a valid header string ', function () {
|
|
|
+ const policy = {
|
|
|
+ allowed: { camera: 'self' },
|
|
|
+ blocked: [],
|
|
|
+ }
|
|
|
+ const httpPermissionsMiddleware = new HttpPermissionsPolicyMiddleware(
|
|
|
+ policy
|
|
|
+ )
|
|
|
+ return expect(httpPermissionsMiddleware.policy).to.equal('camera=(self)')
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ describe('when an empty allowlist is provided', function () {
|
|
|
+ it('returns a valid header string ', function () {
|
|
|
+ const policy = {
|
|
|
+ allowed: {},
|
|
|
+ blocked: ['usb'],
|
|
|
+ }
|
|
|
+ const httpPermissionsMiddleware = new HttpPermissionsPolicyMiddleware(
|
|
|
+ policy
|
|
|
+ )
|
|
|
+ return expect(httpPermissionsMiddleware.policy).to.equal('usb=()')
|
|
|
+ })
|
|
|
+ })
|
|
|
+})
|