Passed
Push — master ( cd7372...773ce9 )
by Roeland
08:46
created

FeaturePolicyManager::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 2
rs 10
c 1
b 0
f 0
1
<?php
2
declare(strict_types=1);
3
/**
4
 * @copyright Copyright (c) 2019, Roeland Jago Douma <[email protected]>
5
 *
6
 * @author Roeland Jago Douma <[email protected]>
7
 *
8
 * @license GNU AGPL version 3 or any later version
9
 *
10
 * This program is free software: you can redistribute it and/or modify
11
 * it under the terms of the GNU Affero General Public License as
12
 * published by the Free Software Foundation, either version 3 of the
13
 * License, or (at your option) any later version.
14
 *
15
 * This program is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 * GNU Affero General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU Affero General Public License
21
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
 *
23
 */
24
25
namespace OC\Security\FeaturePolicy;
26
27
use OCP\AppFramework\Http\EmptyFeaturePolicy;
28
use OCP\EventDispatcher\IEventDispatcher;
29
use OCP\Security\FeaturePolicy\AddFeaturePolicyEvent;
30
31
class FeaturePolicyManager {
32
	/** @var EmptyFeaturePolicy[] */
33
	private $policies = [];
34
35
	/** @var IEventDispatcher */
36
	private $dispatcher;
37
38
	public function __construct(IEventDispatcher $dispatcher) {
39
		$this->dispatcher = $dispatcher;
40
	}
41
42
	public function addDefaultPolicy(EmptyFeaturePolicy $policy): void {
43
		$this->policies[] = $policy;
44
	}
45
46
	public function getDefaultPolicy(): FeaturePolicy {
47
		$event = new AddFeaturePolicyEvent($this);
48
		$this->dispatcher->dispatch(AddFeaturePolicyEvent::class, $event);
49
50
		$defaultPolicy = new FeaturePolicy();
51
		foreach ($this->policies as $policy) {
52
			$defaultPolicy = $this->mergePolicies($defaultPolicy, $policy);
53
		}
54
		return $defaultPolicy;
55
	}
56
57
	/**
58
	 * Merges the first given policy with the second one
59
	 *
60
	 */
61
	public function mergePolicies(FeaturePolicy $defaultPolicy,
62
								  EmptyFeaturePolicy $originalPolicy): FeaturePolicy {
63
		foreach ((object)(array)$originalPolicy as $name => $value) {
64
			$setter = 'set' . ucfirst($name);
65
			if (\is_array($value)) {
66
				$getter = 'get' . ucfirst($name);
67
				$currentValues = \is_array($defaultPolicy->$getter()) ? $defaultPolicy->$getter() : [];
68
				$defaultPolicy->$setter(\array_values(\array_unique(\array_merge($currentValues, $value))));
69
			} elseif (\is_bool($value)) {
70
				$defaultPolicy->$setter($value);
71
			}
72
		}
73
74
		return $defaultPolicy;
75
	}
76
}
77