178 lines
7.8 KiB
PHP
Executable File
178 lines
7.8 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\Csp\Model;
|
|
|
|
use Magento\Csp\Api\PolicyCollectorInterface;
|
|
use Magento\Csp\Model\Policy\FetchPolicy;
|
|
use Magento\Csp\Model\Policy\FlagPolicy;
|
|
use Magento\Csp\Model\Policy\PluginTypesPolicy;
|
|
use Magento\Csp\Model\Policy\SandboxPolicy;
|
|
use Magento\TestFramework\Helper\Bootstrap;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* Test that composite collector properly calls other collectors and merges results.
|
|
*/
|
|
class CompositePolicyCollectorTest extends TestCase
|
|
{
|
|
/**
|
|
* Create mock collectors that will populate policies.
|
|
*
|
|
* @return PolicyCollectorInterface[]
|
|
*/
|
|
private function createMockCollectors(): array
|
|
{
|
|
$mockCollector1 = $this->getMockForAbstractClass(PolicyCollectorInterface::class);
|
|
$mockCollector1->method('collect')
|
|
->willReturnCallback(
|
|
function (array $prevPolicies) {
|
|
return array_merge(
|
|
$prevPolicies,
|
|
[
|
|
new FetchPolicy(
|
|
'script-src',
|
|
false,
|
|
['https://magento.com'],
|
|
['https'],
|
|
true,
|
|
false,
|
|
true,
|
|
['569403695046645'],
|
|
['B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8=' => 'sha256'],
|
|
false,
|
|
true
|
|
),
|
|
new FetchPolicy('script-src', false, ['https://devdocs.magento.com']),
|
|
new FlagPolicy('upgrade-insecure-requests'),
|
|
new PluginTypesPolicy(['application/x-shockwave-flash']),
|
|
new SandboxPolicy(false, true, false, true, false, true, false, true, false, true, false)
|
|
]
|
|
);
|
|
}
|
|
);
|
|
$mockCollector2 = $this->getMockForAbstractClass(PolicyCollectorInterface::class);
|
|
$mockCollector2->method('collect')
|
|
->willReturnCallback(
|
|
function (array $prevPolicies) {
|
|
return array_merge(
|
|
$prevPolicies,
|
|
[
|
|
new FetchPolicy(
|
|
'script-src',
|
|
true,
|
|
['http://magento.com'],
|
|
['http'],
|
|
false,
|
|
false,
|
|
false,
|
|
['5694036950466451'],
|
|
['B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF7=' => 'sha256'],
|
|
true,
|
|
false
|
|
),
|
|
new FetchPolicy('default-src', false, [], [], true),
|
|
new FlagPolicy('upgrade-insecure-requests'),
|
|
new PluginTypesPolicy(['application/x-java-applet']),
|
|
new SandboxPolicy(true, false, true, false, true, false, true, false, true, false, false)
|
|
]
|
|
);
|
|
}
|
|
);
|
|
|
|
return [$mockCollector1, $mockCollector2];
|
|
}
|
|
|
|
/**
|
|
* Test collect method.
|
|
*
|
|
* Supply fake collectors, check results.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testCollect(): void
|
|
{
|
|
/** @var CompositePolicyCollector $collector */
|
|
$collector = Bootstrap::getObjectManager()->create(
|
|
CompositePolicyCollector::class,
|
|
['collectors' => $this->createMockCollectors()]
|
|
);
|
|
|
|
$collected = $collector->collect([]);
|
|
/** @var FetchPolicy[]|FlagPolicy[]|PluginTypesPolicy[]|SandboxPolicy[] $policies */
|
|
$policies = [];
|
|
/** @var \Magento\Csp\Api\Data\PolicyInterface $policy */
|
|
foreach ($collected as $policy) {
|
|
$policies[$policy->getId()] = $policy;
|
|
}
|
|
//Comparing resulting policies
|
|
$this->assertArrayHasKey('script-src', $policies);
|
|
$this->assertTrue($policies['script-src']->isNoneAllowed());
|
|
$this->assertTrue($policies['script-src']->isSelfAllowed());
|
|
$this->assertFalse($policies['script-src']->isInlineAllowed());
|
|
$this->assertTrue($policies['script-src']->isEvalAllowed());
|
|
$this->assertTrue($policies['script-src']->isDynamicAllowed());
|
|
$this->assertTrue($policies['script-src']->areEventHandlersAllowed());
|
|
$foundHosts = $policies['script-src']->getHostSources();
|
|
$hosts = ['http://magento.com', 'https://magento.com', 'https://devdocs.magento.com'];
|
|
sort($foundHosts);
|
|
sort($hosts);
|
|
$this->assertEquals($hosts, $foundHosts);
|
|
$foundSchemes = $policies['script-src']->getSchemeSources();
|
|
$schemes = ['https', 'http'];
|
|
sort($foundSchemes);
|
|
sort($schemes);
|
|
$this->assertEquals($schemes, $foundSchemes);
|
|
$foundNonceValues = $policies['script-src']->getNonceValues();
|
|
$nonceValues = ['5694036950466451', '569403695046645'];
|
|
sort($foundNonceValues);
|
|
sort($nonceValues);
|
|
$this->assertEquals($nonceValues, $foundNonceValues);
|
|
$foundHashes = $policies['script-src']->getHashes();
|
|
$hashes = [
|
|
'B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF7=' => 'sha256',
|
|
'B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8=' => 'sha256'
|
|
];
|
|
$this->assertEquals($hashes, $foundHashes);
|
|
|
|
$this->assertArrayHasKey('default-src', $policies);
|
|
$this->assertFalse($policies['default-src']->isNoneAllowed());
|
|
$this->assertTrue($policies['default-src']->isSelfAllowed());
|
|
$this->assertFalse($policies['default-src']->isInlineAllowed());
|
|
$this->assertFalse($policies['default-src']->isEvalAllowed());
|
|
$this->assertFalse($policies['default-src']->isDynamicAllowed());
|
|
$this->assertFalse($policies['default-src']->areEventHandlersAllowed());
|
|
$this->assertEmpty($policies['default-src']->getHashes());
|
|
$this->assertEmpty($policies['default-src']->getNonceValues());
|
|
$this->assertEmpty($policies['default-src']->getHostSources());
|
|
$this->assertEmpty($policies['default-src']->getSchemeSources());
|
|
|
|
$this->assertArrayHasKey('upgrade-insecure-requests', $policies);
|
|
$this->assertInstanceOf(FlagPolicy::class, $policies['upgrade-insecure-requests']);
|
|
|
|
$this->assertArrayHasKey('plugin-types', $policies);
|
|
$types = ['application/x-java-applet', 'application/x-shockwave-flash'];
|
|
$foundTypes = $policies['plugin-types']->getTypes();
|
|
sort($types);
|
|
sort($foundTypes);
|
|
$this->assertEquals($types, $foundTypes);
|
|
|
|
$this->assertArrayHasKey('sandbox', $policies);
|
|
$this->assertTrue($policies['sandbox']->isFormAllowed());
|
|
$this->assertTrue($policies['sandbox']->isModalsAllowed());
|
|
$this->assertTrue($policies['sandbox']->isOrientationLockAllowed());
|
|
$this->assertTrue($policies['sandbox']->isPointerLockAllowed());
|
|
$this->assertTrue($policies['sandbox']->isPopupsAllowed());
|
|
$this->assertTrue($policies['sandbox']->isPopupsToEscapeSandboxAllowed());
|
|
$this->assertTrue($policies['sandbox']->isScriptsAllowed());
|
|
$this->assertFalse($policies['sandbox']->isTopNavigationByUserActivationAllowed());
|
|
$this->assertTrue($policies['sandbox']->isTopNavigationAllowed());
|
|
$this->assertTrue($policies['sandbox']->isSameOriginAllowed());
|
|
$this->assertTrue($policies['sandbox']->isPresentationAllowed());
|
|
}
|
|
}
|