Allows to inject something into the default content policy. This is for
example useful when you're injecting Javascript code into a view belonging
to another controller and cannot modify its Content-Security-Policy itself.
Note that the adjustment is only applied to applications that use AppFramework
controllers.
To use this from your `app.php` use `\OC::$server->getContentSecurityPolicyManager()->addDefaultPolicy($policy)`,
$policy has to be of type `\OCP\AppFramework\Http\ContentSecurityPolicy`.
To test this add something like the following into an `app.php` of any enabled app:
```
$manager = \OC::$server->getContentSecurityPolicyManager();
$policy = new \OCP\AppFramework\Http\ContentSecurityPolicy(false);
$policy->addAllowedFrameDomain('asdf');
$policy->addAllowedScriptDomain('yolo.com');
$policy->allowInlineScript(false);
$manager->addDefaultPolicy($policy);
$policy = new \OCP\AppFramework\Http\ContentSecurityPolicy(false);
$policy->addAllowedFontDomain('yolo.com');
$manager->addDefaultPolicy($policy);
$policy = new \OCP\AppFramework\Http\ContentSecurityPolicy(false);
$policy->addAllowedFrameDomain('banana.com');
$manager->addDefaultPolicy($policy);
```
If you now open the files app the policy should be:
```
Content-Security-Policy:default-src 'none';script-src yolo.com 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src yolo.com 'self';connect-src 'self';media-src 'self';frame-src asdf banana.com 'self'
```
remotes/origin/comments-markallread-dav
parent
8b3d7d09d5
commit
809ff5ac95
@ -0,0 +1,199 @@ |
||||
<?php |
||||
/** |
||||
* @author Lukas Reschke <lukas@owncloud.com> |
||||
* |
||||
* @copyright Copyright (c) 2016, ownCloud, Inc. |
||||
* @license AGPL-3.0 |
||||
* |
||||
* This code is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License, version 3, |
||||
* as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU Affero General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public License, version 3, |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/> |
||||
* |
||||
*/ |
||||
namespace OC\Security\CSP; |
||||
|
||||
/** |
||||
* Class ContentSecurityPolicy extends the public class and adds getter and setters. |
||||
* This is necessary since we don't want to expose the setters and getters to the |
||||
* public API. |
||||
* |
||||
* @package OC\Security\CSP |
||||
*/ |
||||
class ContentSecurityPolicy extends \OCP\AppFramework\Http\ContentSecurityPolicy { |
||||
/** |
||||
* @return boolean |
||||
*/ |
||||
public function isInlineScriptAllowed() { |
||||
return $this->inlineScriptAllowed; |
||||
} |
||||
|
||||
/** |
||||
* @param boolean $inlineScriptAllowed |
||||
*/ |
||||
public function setInlineScriptAllowed($inlineScriptAllowed) { |
||||
$this->inlineScriptAllowed = $inlineScriptAllowed; |
||||
} |
||||
|
||||
/** |
||||
* @return boolean |
||||
*/ |
||||
public function isEvalScriptAllowed() { |
||||
return $this->evalScriptAllowed; |
||||
} |
||||
|
||||
/** |
||||
* @param boolean $evalScriptAllowed |
||||
*/ |
||||
public function setEvalScriptAllowed($evalScriptAllowed) { |
||||
$this->evalScriptAllowed = $evalScriptAllowed; |
||||
} |
||||
|
||||
/** |
||||
* @return array |
||||
*/ |
||||
public function getAllowedScriptDomains() { |
||||
return $this->allowedScriptDomains; |
||||
} |
||||
|
||||
/** |
||||
* @param array $allowedScriptDomains |
||||
*/ |
||||
public function setAllowedScriptDomains($allowedScriptDomains) { |
||||
$this->allowedScriptDomains = $allowedScriptDomains; |
||||
} |
||||
|
||||
/** |
||||
* @return boolean |
||||
*/ |
||||
public function isInlineStyleAllowed() { |
||||
return $this->inlineStyleAllowed; |
||||
} |
||||
|
||||
/** |
||||
* @param boolean $inlineStyleAllowed |
||||
*/ |
||||
public function setInlineStyleAllowed($inlineStyleAllowed) { |
||||
$this->inlineStyleAllowed = $inlineStyleAllowed; |
||||
} |
||||
|
||||
/** |
||||
* @return array |
||||
*/ |
||||
public function getAllowedStyleDomains() { |
||||
return $this->allowedStyleDomains; |
||||
} |
||||
|
||||
/** |
||||
* @param array $allowedStyleDomains |
||||
*/ |
||||
public function setAllowedStyleDomains($allowedStyleDomains) { |
||||
$this->allowedStyleDomains = $allowedStyleDomains; |
||||
} |
||||
|
||||
/** |
||||
* @return array |
||||
*/ |
||||
public function getAllowedImageDomains() { |
||||
return $this->allowedImageDomains; |
||||
} |
||||
|
||||
/** |
||||
* @param array $allowedImageDomains |
||||
*/ |
||||
public function setAllowedImageDomains($allowedImageDomains) { |
||||
$this->allowedImageDomains = $allowedImageDomains; |
||||
} |
||||
|
||||
/** |
||||
* @return array |
||||
*/ |
||||
public function getAllowedConnectDomains() { |
||||
return $this->allowedConnectDomains; |
||||
} |
||||
|
||||
/** |
||||
* @param array $allowedConnectDomains |
||||
*/ |
||||
public function setAllowedConnectDomains($allowedConnectDomains) { |
||||
$this->allowedConnectDomains = $allowedConnectDomains; |
||||
} |
||||
|
||||
/** |
||||
* @return array |
||||
*/ |
||||
public function getAllowedMediaDomains() { |
||||
return $this->allowedMediaDomains; |
||||
} |
||||
|
||||
/** |
||||
* @param array $allowedMediaDomains |
||||
*/ |
||||
public function setAllowedMediaDomains($allowedMediaDomains) { |
||||
$this->allowedMediaDomains = $allowedMediaDomains; |
||||
} |
||||
|
||||
/** |
||||
* @return array |
||||
*/ |
||||
public function getAllowedObjectDomains() { |
||||
return $this->allowedObjectDomains; |
||||
} |
||||
|
||||
/** |
||||
* @param array $allowedObjectDomains |
||||
*/ |
||||
public function setAllowedObjectDomains($allowedObjectDomains) { |
||||
$this->allowedObjectDomains = $allowedObjectDomains; |
||||
} |
||||
|
||||
/** |
||||
* @return array |
||||
*/ |
||||
public function getAllowedFrameDomains() { |
||||
return $this->allowedFrameDomains; |
||||
} |
||||
|
||||
/** |
||||
* @param array $allowedFrameDomains |
||||
*/ |
||||
public function setAllowedFrameDomains($allowedFrameDomains) { |
||||
$this->allowedFrameDomains = $allowedFrameDomains; |
||||
} |
||||
|
||||
/** |
||||
* @return array |
||||
*/ |
||||
public function getAllowedFontDomains() { |
||||
return $this->allowedFontDomains; |
||||
} |
||||
|
||||
/** |
||||
* @param array $allowedFontDomains |
||||
*/ |
||||
public function setAllowedFontDomains($allowedFontDomains) { |
||||
$this->allowedFontDomains = $allowedFontDomains; |
||||
} |
||||
|
||||
/** |
||||
* @return array |
||||
*/ |
||||
public function getAllowedChildSrcDomains() { |
||||
return $this->allowedChildSrcDomains; |
||||
} |
||||
|
||||
/** |
||||
* @param array $allowedChildSrcDomains |
||||
*/ |
||||
public function setAllowedChildSrcDomains($allowedChildSrcDomains) { |
||||
$this->allowedChildSrcDomains = $allowedChildSrcDomains; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,73 @@ |
||||
<?php |
||||
/** |
||||
* @author Lukas Reschke <lukas@owncloud.com> |
||||
* |
||||
* @copyright Copyright (c) 2016, ownCloud, Inc. |
||||
* @license AGPL-3.0 |
||||
* |
||||
* This code is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License, version 3, |
||||
* as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU Affero General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public License, version 3, |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/> |
||||
* |
||||
*/ |
||||
|
||||
namespace OC\Security\CSP; |
||||
|
||||
use OCP\AppFramework\Http\ContentSecurityPolicy; |
||||
use OCP\AppFramework\Http\EmptyContentSecurityPolicy; |
||||
use OCP\Security\IContentSecurityPolicyManager; |
||||
|
||||
class ContentSecurityPolicyManager implements IContentSecurityPolicyManager { |
||||
/** @var ContentSecurityPolicy[] */ |
||||
private $policies = []; |
||||
|
||||
/** {@inheritdoc} */ |
||||
public function addDefaultPolicy(EmptyContentSecurityPolicy $policy) { |
||||
$this->policies[] = $policy; |
||||
} |
||||
|
||||
/** |
||||
* Get the configured default policy. This is not in the public namespace |
||||
* as it is only supposed to be used by core itself. |
||||
* |
||||
* @return ContentSecurityPolicy |
||||
*/ |
||||
public function getDefaultPolicy() { |
||||
$defaultPolicy = new \OC\Security\CSP\ContentSecurityPolicy(); |
||||
foreach($this->policies as $policy) { |
||||
$defaultPolicy = $this->mergePolicies($defaultPolicy, $policy); |
||||
} |
||||
return $defaultPolicy; |
||||
} |
||||
|
||||
/** |
||||
* Merges the first given policy with the second one |
||||
* |
||||
* @param ContentSecurityPolicy $defaultPolicy |
||||
* @param EmptyContentSecurityPolicy $originalPolicy |
||||
* @return ContentSecurityPolicy |
||||
*/ |
||||
public function mergePolicies(ContentSecurityPolicy $defaultPolicy, |
||||
EmptyContentSecurityPolicy $originalPolicy) { |
||||
foreach((object)(array)$originalPolicy as $name => $value) { |
||||
$setter = 'set'.ucfirst($name); |
||||
if(is_array($value)) { |
||||
$getter = 'get'.ucfirst($name); |
||||
$currentValues = is_array($defaultPolicy->$getter()) ? $defaultPolicy->$getter() : []; |
||||
$defaultPolicy->$setter(array_values(array_unique(array_merge($currentValues, $value)))); |
||||
} elseif (is_bool($value)) { |
||||
$defaultPolicy->$setter($value); |
||||
} |
||||
} |
||||
|
||||
return $defaultPolicy; |
||||
} |
||||
} |
||||
@ -0,0 +1,50 @@ |
||||
<?php |
||||
/** |
||||
* @author Lukas Reschke <lukas@owncloud.com> |
||||
* |
||||
* @copyright Copyright (c) 2016, ownCloud, Inc. |
||||
* @license AGPL-3.0 |
||||
* |
||||
* This code is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License, version 3, |
||||
* as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU Affero General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public License, version 3, |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/> |
||||
* |
||||
*/ |
||||
|
||||
namespace OCP\Security; |
||||
use OCP\AppFramework\Http\EmptyContentSecurityPolicy; |
||||
|
||||
/** |
||||
* Used for Content Security Policy manipulations |
||||
* |
||||
* @package OCP\Security |
||||
* @since 9.0.0 |
||||
*/ |
||||
interface IContentSecurityPolicyManager { |
||||
/** |
||||
* Allows to inject something into the default content policy. This is for |
||||
* example useful when you're injecting Javascript code into a view belonging |
||||
* to another controller and cannot modify its Content-Security-Policy itself. |
||||
* Note that the adjustment is only applied to applications that use AppFramework |
||||
* controllers. |
||||
* |
||||
* To use this from your `app.php` use `\OC::$server->getContentSecurityPolicyManager()->addDefaultPolicy($policy)`, |
||||
* $policy has to be of type `\OCP\AppFramework\Http\ContentSecurityPolicy`. |
||||
* |
||||
* WARNING: Using this API incorrectly may make the instance more insecure. |
||||
* Do think twice before adding whitelisting resources. Please do also note |
||||
* that it is not possible to use the `disallowXYZ` functions. |
||||
* |
||||
* @param EmptyContentSecurityPolicy $policy |
||||
* @since 9.0.0 |
||||
*/ |
||||
public function addDefaultPolicy(EmptyContentSecurityPolicy $policy); |
||||
} |
||||
@ -0,0 +1,430 @@ |
||||
<?php |
||||
/** |
||||
* Copyright (c) 2015 Lukas Reschke lukas@owncloud.com |
||||
* This file is licensed under the Affero General Public License version 3 or |
||||
* later. |
||||
* See the COPYING-README file. |
||||
*/ |
||||
|
||||
|
||||
namespace OC\AppFramework\Http; |
||||
|
||||
use OCP\AppFramework\Http; |
||||
use OCP\AppFramework\Http\EmptyContentSecurityPolicy; |
||||
|
||||
/** |
||||
* Class ContentSecurityPolicyTest |
||||
* |
||||
* @package OC\AppFramework\Http |
||||
*/ |
||||
class EmptyContentSecurityPolicyTest extends \Test\TestCase { |
||||
|
||||
/** @var EmptyContentSecurityPolicy */ |
||||
private $contentSecurityPolicy; |
||||
|
||||
public function setUp() { |
||||
parent::setUp(); |
||||
$this->contentSecurityPolicy = new EmptyContentSecurityPolicy(); |
||||
} |
||||
|
||||
public function testGetPolicyDefault() { |
||||
$defaultPolicy = "default-src 'none'"; |
||||
$this->assertSame($defaultPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyScriptDomainValid() { |
||||
$expectedPolicy = "default-src 'none';script-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyScriptDomainValidMultiple() { |
||||
$expectedPolicy = "default-src 'none';script-src www.owncloud.com www.owncloud.org"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowScriptDomain() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowScriptDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowScriptDomainMultiple() { |
||||
$expectedPolicy = "default-src 'none';script-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowScriptDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowScriptDomainMultipleStacked() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowScriptDomain('www.owncloud.org')->disallowScriptDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyScriptAllowInline() { |
||||
$expectedPolicy = "default-src 'none';script-src 'unsafe-inline'"; |
||||
|
||||
$this->contentSecurityPolicy->allowInlineScript(true); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyScriptAllowInlineWithDomain() { |
||||
$expectedPolicy = "default-src 'none';script-src www.owncloud.com 'unsafe-inline'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->allowInlineScript(true); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyScriptAllowInlineAndEval() { |
||||
$expectedPolicy = "default-src 'none';script-src 'unsafe-inline' 'unsafe-eval'"; |
||||
|
||||
$this->contentSecurityPolicy->allowInlineScript(true); |
||||
$this->contentSecurityPolicy->allowEvalScript(true); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyStyleDomainValid() { |
||||
$expectedPolicy = "default-src 'none';style-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyStyleDomainValidMultiple() { |
||||
$expectedPolicy = "default-src 'none';style-src www.owncloud.com www.owncloud.org"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowStyleDomain() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowStyleDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowStyleDomainMultiple() { |
||||
$expectedPolicy = "default-src 'none';style-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowStyleDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowStyleDomainMultipleStacked() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowStyleDomain('www.owncloud.org')->disallowStyleDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyStyleAllowInline() { |
||||
$expectedPolicy = "default-src 'none';style-src 'unsafe-inline'"; |
||||
|
||||
$this->contentSecurityPolicy->allowInlineStyle(true); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyStyleAllowInlineWithDomain() { |
||||
$expectedPolicy = "default-src 'none';style-src www.owncloud.com 'unsafe-inline'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->allowInlineStyle(true); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyStyleDisallowInline() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->allowInlineStyle(false); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyImageDomainValid() { |
||||
$expectedPolicy = "default-src 'none';img-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyImageDomainValidMultiple() { |
||||
$expectedPolicy = "default-src 'none';img-src www.owncloud.com www.owncloud.org"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowImageDomain() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowImageDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowImageDomainMultiple() { |
||||
$expectedPolicy = "default-src 'none';img-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowImageDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowImageDomainMultipleStakes() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowImageDomain('www.owncloud.org')->disallowImageDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyFontDomainValid() { |
||||
$expectedPolicy = "default-src 'none';font-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyFontDomainValidMultiple() { |
||||
$expectedPolicy = "default-src 'none';font-src www.owncloud.com www.owncloud.org"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowFontDomain() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowFontDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowFontDomainMultiple() { |
||||
$expectedPolicy = "default-src 'none';font-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowFontDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowFontDomainMultipleStakes() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowFontDomain('www.owncloud.org')->disallowFontDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyConnectDomainValid() { |
||||
$expectedPolicy = "default-src 'none';connect-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyConnectDomainValidMultiple() { |
||||
$expectedPolicy = "default-src 'none';connect-src www.owncloud.com www.owncloud.org"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowConnectDomain() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowConnectDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowConnectDomainMultiple() { |
||||
$expectedPolicy = "default-src 'none';connect-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowConnectDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowConnectDomainMultipleStakes() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowConnectDomain('www.owncloud.org')->disallowConnectDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyMediaDomainValid() { |
||||
$expectedPolicy = "default-src 'none';media-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyMediaDomainValidMultiple() { |
||||
$expectedPolicy = "default-src 'none';media-src www.owncloud.com www.owncloud.org"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowMediaDomain() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowMediaDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowMediaDomainMultiple() { |
||||
$expectedPolicy = "default-src 'none';media-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowMediaDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowMediaDomainMultipleStakes() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowMediaDomain('www.owncloud.org')->disallowMediaDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyObjectDomainValid() { |
||||
$expectedPolicy = "default-src 'none';object-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyObjectDomainValidMultiple() { |
||||
$expectedPolicy = "default-src 'none';object-src www.owncloud.com www.owncloud.org"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowObjectDomain() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowObjectDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowObjectDomainMultiple() { |
||||
$expectedPolicy = "default-src 'none';object-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowObjectDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowObjectDomainMultipleStakes() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowObjectDomain('www.owncloud.org')->disallowObjectDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetAllowedFrameDomain() { |
||||
$expectedPolicy = "default-src 'none';frame-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyFrameDomainValidMultiple() { |
||||
$expectedPolicy = "default-src 'none';frame-src www.owncloud.com www.owncloud.org"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowFrameDomain() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowFrameDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowFrameDomainMultiple() { |
||||
$expectedPolicy = "default-src 'none';frame-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowFrameDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowFrameDomainMultipleStakes() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowFrameDomain('www.owncloud.org')->disallowFrameDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetAllowedChildSrcDomain() { |
||||
$expectedPolicy = "default-src 'none';child-src child.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedChildSrcDomain('child.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyChildSrcValidMultiple() { |
||||
$expectedPolicy = "default-src 'none';child-src child.owncloud.com child.owncloud.org"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedChildSrcDomain('child.owncloud.com'); |
||||
$this->contentSecurityPolicy->addAllowedChildSrcDomain('child.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowChildSrcDomain() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedChildSrcDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowChildSrcDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowChildSrcDomainMultiple() { |
||||
$expectedPolicy = "default-src 'none';child-src www.owncloud.com"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedChildSrcDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowChildSrcDomain('www.owncloud.org'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
|
||||
public function testGetPolicyDisallowChildSrcDomainMultipleStakes() { |
||||
$expectedPolicy = "default-src 'none'"; |
||||
|
||||
$this->contentSecurityPolicy->addAllowedChildSrcDomain('www.owncloud.com'); |
||||
$this->contentSecurityPolicy->disallowChildSrcDomain('www.owncloud.org')->disallowChildSrcDomain('www.owncloud.com'); |
||||
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); |
||||
} |
||||
} |
||||
@ -0,0 +1,66 @@ |
||||
<?php |
||||
/** |
||||
* @author Lukas Reschke <lukas@owncloud.com> |
||||
* |
||||
* @copyright Copyright (c) 2016, ownCloud, Inc. |
||||
* @license AGPL-3.0 |
||||
* |
||||
* This code is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License, version 3, |
||||
* as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU Affero General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public License, version 3, |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/> |
||||
* |
||||
*/ |
||||
|
||||
use OC\Security\CSP\ContentSecurityPolicyManager; |
||||
|
||||
class ContentSecurityPolicyManagerTest extends \Test\TestCase { |
||||
/** @var ContentSecurityPolicyManager */ |
||||
private $contentSecurityPolicyManager; |
||||
|
||||
public function setUp() { |
||||
parent::setUp(); |
||||
$this->contentSecurityPolicyManager = new ContentSecurityPolicyManager(); |
||||
} |
||||
|
||||
public function testAddDefaultPolicy() { |
||||
$this->contentSecurityPolicyManager->addDefaultPolicy(new \OCP\AppFramework\Http\ContentSecurityPolicy()); |
||||
} |
||||
|
||||
public function testGetDefaultPolicyWithPolicies() { |
||||
$policy = new \OCP\AppFramework\Http\ContentSecurityPolicy(); |
||||
$policy->addAllowedFontDomain('mydomain.com'); |
||||
$policy->addAllowedImageDomain('anotherdomain.de'); |
||||
$this->contentSecurityPolicyManager->addDefaultPolicy($policy); |
||||
$policy = new \OCP\AppFramework\Http\ContentSecurityPolicy(); |
||||
$policy->addAllowedFontDomain('example.com'); |
||||
$policy->addAllowedImageDomain('example.org'); |
||||
$policy->allowInlineScript(true); |
||||
$this->contentSecurityPolicyManager->addDefaultPolicy($policy); |
||||
$policy = new \OCP\AppFramework\Http\EmptyContentSecurityPolicy(); |
||||
$policy->addAllowedChildSrcDomain('childdomain'); |
||||
$policy->addAllowedFontDomain('anotherFontDomain'); |
||||
$this->contentSecurityPolicyManager->addDefaultPolicy($policy); |
||||
|
||||
$expected = new \OC\Security\CSP\ContentSecurityPolicy(); |
||||
$expected->allowInlineScript(true); |
||||
$expected->addAllowedFontDomain('mydomain.com'); |
||||
$expected->addAllowedFontDomain('example.com'); |
||||
$expected->addAllowedFontDomain('anotherFontDomain'); |
||||
$expected->addAllowedImageDomain('anotherdomain.de'); |
||||
$expected->addAllowedImageDomain('example.org'); |
||||
$expected->addAllowedChildSrcDomain('childdomain'); |
||||
$expectedStringPolicy = 'default-src \'none\';script-src \'self\' \'unsafe-inline\' \'unsafe-eval\';style-src \'self\' \'unsafe-inline\';img-src \'self\' data: blob: anotherdomain.de example.org;font-src \'self\' mydomain.com example.com anotherFontDomain;connect-src \'self\';media-src \'self\';child-src childdomain'; |
||||
|
||||
$this->assertEquals($expected, $this->contentSecurityPolicyManager->getDefaultPolicy()); |
||||
$this->assertSame($expectedStringPolicy, $this->contentSecurityPolicyManager->getDefaultPolicy()->buildPolicy()); |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue