Passed
Push — main ( 280cf4...2747d9 )
by Jean-Christophe
02:02
created

AclList::addResource()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 2
c 0
b 0
f 0
nc 1
nop 1
dl 0
loc 3
ccs 3
cts 3
cp 1
crap 1
rs 10
1
<?php
2
namespace Ubiquity\security\acl\models;
3
4
use Ubiquity\security\acl\persistence\AclProviderInterface;
5
use Ubiquity\exceptions\AclException;
6
7
/**
8
 * Ubiquity\security\acl\models$AclList
9
 * This class is part of Ubiquity
10
 *
11
 * @author jc
12
 * @version 1.0.0
13
 *
14
 */
15
class AclList {
16
17
	/**
18
	 *
19
	 * @var AclElement[]
20
	 */
21
	protected $acls;
22
23
	/**
24
	 *
25
	 * @var Role[]
26
	 */
27
	protected $roles;
28
29
	/**
30
	 *
31
	 * @var \Ubiquity\security\acl\models\Resource[]
32
	 */
33
	protected $resources;
34
35
	/**
36
	 *
37
	 * @var Permission[]
38
	 */
39
	protected $permissions;
40
41
	/**
42
	 *
43
	 * @var AclProviderInterface[]
44
	 */
45
	protected $providers = [];
46
47
	protected $elementsCache = [];
48
49 11
	protected function getElementByName(string $name, array $inArray, string $type) {
50 11
		foreach ($inArray as $elm) {
51 11
			if ($elm->getName() == $name) {
52 10
				return $elm;
53
			}
54
		}
55 3
		throw new AclException("$name does not exist in $type ACL");
56
	}
57
58
	protected function elementExistByName(string $name, array $inArray): bool {
59
		foreach ($inArray as $elm) {
60
			if ($elm->getName() == $name) {
61
				return true;
62
			}
63
		}
64
		return false;
65
	}
66
67 11
	public function init() {
68 11
		$this->roles['role_@ALL'] = new Role('@ALL');
69 11
		$this->resources['res_*'] = new Resource('*');
70 11
		$this->permissions['perm_ALL'] = new Permission('ALL', 1000);
71 11
		$this->acls = [];
72 11
	}
73
74 11
	public function getRoleByName(string $name) {
75 11
		return $this->elementsCache["role_$name"] ??= $this->getElementByName($name, $this->roles, 'roles');
76
	}
77
78 5
	public function getResourceByName(string $name) {
79 5
		return $this->elementsCache["res_$name"] ??= $this->getElementByName($name, $this->resources, 'resources');
80
	}
81
82 7
	public function getPermissionByName(string $name) {
83 7
		return $this->elementsCache["perm_$name"] ??= $this->getElementByName($name, $this->permissions, 'permissions');
84
	}
85
86 3
	public function loadAcls(): array {
87 3
		foreach ($this->providers as $provider) {
88 3
			$this->acls += $provider->loadAllAcls();
89
		}
90 3
		return $this->acls;
91
	}
92
93 3
	public function loadRoles(): array {
94 3
		foreach ($this->providers as $provider) {
95 3
			$this->roles += $provider->loadAllRoles();
96
		}
97 3
		return $this->roles;
98
	}
99
100 3
	public function loadResources(): array {
101 3
		foreach ($this->providers as $provider) {
102 3
			$this->resources += $provider->loadAllResources();
103
		}
104 3
		return $this->resources;
105
	}
106
107 3
	public function loadPermissions(): array {
108 3
		foreach ($this->providers as $provider) {
109 3
			$this->permissions += $provider->loadAllPermissions();
110
		}
111 3
		return $this->permissions;
112
	}
113
114
	public function addProvider(AclProviderInterface $provider) {
115
		$this->providers[] = $provider;
116
	}
117
118
	/**
119
	 *
120
	 * @return AclElement[]
121
	 */
122 2
	public function getAcls() {
123 2
		return $this->acls;
124
	}
125
126
	/**
127
	 *
128
	 * @return Role[]
129
	 */
130 2
	public function getRoles() {
131 2
		return $this->roles;
132
	}
133
134
	/**
135
	 *
136
	 * @return \Ubiquity\security\acl\models\Resource[]
137
	 */
138 2
	public function getResources() {
139 2
		return $this->resources;
140
	}
141
142
	/**
143
	 *
144
	 * @return Permission[]
145
	 */
146 3
	public function getPermissions() {
147 3
		return $this->permissions;
148
	}
149
150
	/**
151
	 *
152
	 * @return AclProviderInterface[]
153
	 */
154
	public function getProviders() {
155
		return $this->providers;
156
	}
157
158
	/**
159
	 *
160
	 * @param AclProviderInterface[] $providers
161
	 */
162 4
	public function setProviders($providers) {
163 4
		$this->providers = $providers;
164 4
	}
165
166 4
	public function addRole(Role $role) {
167 4
		$this->roles[$role->getName()] = $role;
168 4
		$this->savePart($role);
169 4
	}
170
171 4
	public function addResource(Resource $resource) {
172 4
		$this->resources[$resource->getName()] = $resource;
173 4
		$this->savePart($resource);
174 4
	}
175
176 4
	public function addPermission(Permission $permission) {
177 4
		$this->permissions[$permission->getName()] = $permission;
178 4
		$this->savePart($permission);
179 4
	}
180
181 2
	public function setPermissionLevel(string $name, int $level) {
182 2
		$perm = $this->getPermissionByName($name);
183 1
		$perm->setLevel($level);
184 1
	}
185
186 5
	public function allow(string $roleName, string $resourceName, string $permissionName) {
187 5
		$aclElm = new AclElement();
188 5
		$aclElm->allow($this->getRoleByName($roleName), $this->getResourceByName($resourceName), $this->getPermissionByName($permissionName));
189 5
		$this->acls[] = $aclElm;
190 5
		$this->saveAclElement($aclElm);
191 5
	}
192
193 11
	public function getRolePermissionsOn(string $roleName, $resourceName = '*'): array {
194 11
		$role = $this->getRoleByName($roleName);
195 10
		$parents = $role->getParentsArray();
196 10
		$result = [];
197 10
		foreach ($this->acls as $aclElement) {
198 7
			$aclRoleName = $aclElement->getRole()->getName();
199 7
			if ($aclRoleName === '@ALL' || $aclRoleName === $roleName) {
200 7
				$aclResourceName = $aclElement->getResource()->getName();
201 7
				if ($aclResourceName === '*' || $aclResourceName === $resourceName) {
202 7
					$result[] = $aclElement;
203
				}
204
			}
205
		}
206 10
		foreach ($parents as $parentElm) {
207 2
			$result += $this->getRolePermissionsOn($parentElm, $resourceName);
208
		}
209 10
		return $result;
210
	}
211
212 11
	public function isAllowed(string $roleName, string $resourceName, string $permissionName) {
213 11
		$acls = $this->getRolePermissionsOn($roleName, $resourceName);
214 10
		if (\count($acls) > 0) {
215 7
			$permissionLevel = $this->getPermissionByName($permissionName)->getLevel();
216 6
			foreach ($acls as $aclElm) {
217 6
				$level = $aclElm->getPermission()->getLevel();
218 6
				if ($level >= $permissionLevel) {
219 6
					return true;
220
				}
221
			}
222
		}
223 8
		return false;
224
	}
225
226 5
	public function saveAclElement(AclElement $aclElement) {
227 5
		foreach ($this->providers as $provider) {
228 1
			$provider->saveAcl($aclElement);
229
		}
230 5
	}
231
232 6
	public function savePart(AbstractAclPart $aclPart) {
233 6
		foreach ($this->providers as $provider) {
234 2
			$provider->savePart($aclPart);
235
		}
236 6
	}
237
238 1
	public function saveAll() {
239 1
		foreach ($this->providers as $provider) {
240 1
			if (! $provider->isAutosave()) {
241 1
				$provider->saveAll();
242
			}
243
		}
244 1
	}
245
}
246
247