Passed
Push — main ( 148098...cc0eef )
by Jean-Christophe
02:21
created

AclManager::existAclIn()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 2
dl 0
loc 2
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
namespace Ubiquity\security\acl;
3
4
use Ubiquity\cache\CacheManager;
5
use Ubiquity\cache\ClassUtils;
6
use Ubiquity\exceptions\AclException;
7
use Ubiquity\security\acl\cache\AclControllerParser;
8
use Ubiquity\security\acl\cache\PermissionsMap;
9
use Ubiquity\security\acl\models\AbstractAclPart;
10
use Ubiquity\security\acl\models\AclElement;
11
use Ubiquity\security\acl\models\AclList;
12
use Ubiquity\security\acl\models\Permission;
13
use Ubiquity\security\acl\models\Resource;
14
use Ubiquity\security\acl\models\Role;
15
use Ubiquity\security\acl\persistence\AclCacheProvider;
16
17
/**
18
 * Ubiquity\security\acl$AclManager
19
 * This class is part of Ubiquity
20
 *
21
 * @author jc
22
 * @version 1.0.0
23
 *
24
 */
25
class AclManager {
26
27
	/**
28
	 *
29
	 * @var AclList
30
	 */
31
	protected static $aclList;
32
33
	/**
34
	 *
35
	 * @var PermissionsMap
36
	 */
37
	protected static $permissionMap;
38
39
	protected static $providersPersistence;
40
41
	/**
42
	 * Create AclList with default roles and resources.
43
	 */
44 22
	public static function start(): void {
45 22
		self::$aclList = new AclList();
46 22
		self::$aclList->init();
47 22
	}
48
	
49
	/**
50
	 * Start the Acls with AclCacheProvider (for attributes or annotations).
51
	 */
52 6
	public static function startWithCacheProvider(): void {
53 6
		self::start();
54 6
		self::initFromProviders([new AclCacheProvider()]);
55 6
	}
56
57
	/**
58
	 * Check whether the Acl service is started.
59
	 *
60
	 * @return bool
61
	 */
62 2
	public static function isStarted(): bool {
63 2
		return self::$aclList !== NULL && (self::$aclList instanceof AclList);
64
	}
65
66
	/**
67
	 * Load acls, roles, resources and permissions from providers.
68
	 *
69
	 * @param AclProviderInterface[] $providers
70
	 */
71 11
	public static function initFromProviders(?array $providers = []): void {
72 11
		self::$aclList->setProviders($providers);
73 11
		if (\count($providers) > 0) {
74 10
			self::$aclList->loadAcls();
75 10
			self::$aclList->loadRoles();
76 10
			self::$aclList->loadResources();
77 10
			self::$aclList->loadPermissions();
78
		}
79 11
	}
80
81
	/**
82
	 *
83
	 * @param array|string $selectedProviders
84
	 */
85 3
	public static function reloadFromSelectedProviders($selectedProviders = '*') {
86 3
		$sProviders = self::$aclList->getProviders();
87 3
		self::$aclList->clear();
88 3
		$providers = [];
89 3
		foreach ($sProviders as $prov) {
90 3
			if ($selectedProviders === '*' || (\is_array($selectedProviders) && \array_search(\get_class($prov), $selectedProviders) !== false)) {
91 3
				$providers[] = $prov;
92
			}
93
		}
94 3
		self::initFromProviders($providers);
95 3
		self::$aclList->setProviders($sProviders);
96 3
	}
97
98 8
	public static function addRole(string $name, ?array $parents = []) {
99 8
		self::$aclList->addRole(new Role($name, $parents));
100 8
	}
101
102 1
	public static function addRoles(array $nameParents) {
103 1
		foreach ($nameParents as $name => $parents) {
104 1
			self::$aclList->addRole(new Role($name, $parents));
105
		}
106 1
	}
107
108 7
	public static function addResource(string $name, ?string $value = null) {
109 7
		self::$aclList->addResource(new Resource($name, $value));
110 7
	}
111
112 1
	public static function addResources(array $nameValue) {
113 1
		foreach ($nameValue as $name => $value) {
114 1
			self::$aclList->addResource(new Resource($name, $value));
115
		}
116 1
	}
117
118 9
	public static function addPermission(string $name, int $level = 0) {
119 9
		self::$aclList->addPermission(new Permission($name, $level));
120 9
	}
121
122 1
	public static function addPermissions(array $nameLevel) {
123 1
		foreach ($nameLevel as $name => $level) {
124 1
			self::$aclList->addPermission(new Permission($name, $level));
125
		}
126 1
	}
127
128 3
	public static function setPermissionLevel(string $name, int $level) {
129 3
		self::$aclList->setPermissionLevel($name, $level);
130 2
	}
131
132 8
	public static function getRoles() {
133 8
		return self::$aclList->getRoles();
134
	}
135
136 7
	public static function getResources() {
137 7
		return self::$aclList->getResources();
138
	}
139
140
	/**
141
	 *
142
	 * @return \Ubiquity\security\acl\models\AclList
143
	 */
144 3
	public static function getAclList() {
145 3
		return AclManager::$aclList;
146
	}
147
148 11
	public static function getPermissions() {
149 11
		return self::$aclList->getPermissions();
150
	}
151
152 6
	public static function getAcls() {
153 6
		return self::$aclList->getAcls();
154
	}
155
156
	/**
157
	 * Allow role to access to resource with the permission.
158
	 *
159
	 * @param string $role
160
	 * @param string $resource
161
	 * @param string $permission
162
	 */
163 10
	public static function allow(string $role, ?string $resource = '*', ?string $permission = 'ALL') {
164 10
		self::$aclList->allow($role, $resource ?? '*', $permission ?? 'ALL');
165 10
	}
166
167
	/**
168
	 * Add role, resource and permission and allow this role to access to resource with the permission.
169
	 *
170
	 * @param string $role
171
	 * @param string $resource
172
	 * @param string $permission
173
	 */
174 3
	public static function addAndAllow(string $role, ?string $resource = '*', ?string $permission = 'ALL') {
175 3
		self::$aclList->addAndAllow($role, $resource ?? '*', $permission ?? 'ALL');
176 3
	}
177
178
	/**
179
	 * Check if access to resource is allowed for role with the permission.
180
	 *
181
	 * @param string $role
182
	 * @param string $resource
183
	 * @param string $permission
184
	 * @return bool
185
	 */
186 20
	public static function isAllowed(string $role, ?string $resource = '*', ?string $permission = 'ALL'): bool {
187 20
		return self::$aclList->isAllowed($role, $resource ?? '*', $permission ?? 'ALL');
188
	}
189
190
	/**
191
	 * Save all acls,roles, resources and permissions for AclProviders with no autoSave.
192
	 */
193 4
	public static function saveAll() {
194 4
		self::$aclList->saveAll();
195 4
	}
196
197
	/**
198
	 *
199
	 * @param string $role
200
	 */
201 2
	public static function removeRole(string $role) {
202 2
		self::$aclList->removeRole($role);
203 2
	}
204
205
	/**
206
	 *
207
	 * @param string $permission
208
	 */
209 2
	public static function removePermission(string $permission) {
210 2
		self::$aclList->removePermission($permission);
211 2
	}
212
213
	/**
214
	 *
215
	 * @param string $resource
216
	 */
217
	public static function removeResource(string $resource) {
218
		self::$aclList->removeResource($resource);
219
	}
220
221
	/**
222
	 *
223
	 * @param string $role
224
	 * @param string $resource
225
	 * @param string $permission
226
	 */
227 2
	public static function removeAcl(string $role, string $resource, string $permission = null) {
228 2
		self::$aclList->removeAcl($role, $resource, $permission);
229 2
	}
230
231
	/**
232
	 * Initialize acls cache with controllers annotations.
233
	 * Do not execute at runtime
234
	 *
235
	 * @param array $config
236
	 * @throws \Ubiquity\exceptions\AclException
237
	 */
238 2
	public static function initCache(&$config) {
239 2
		if(!self::isStarted()){
240
			self::start();
241
			self::initFromProviders([
242
				new AclCacheProvider()
243
			]);
244
		}
245 2
		self::filterProviders(AclCacheProvider::class);
246 2
		self::reloadFromSelectedProviders([]);
247 2
		self::registerAnnotations();
248 2
		$files = \Ubiquity\cache\CacheManager::getControllersFiles($config, true);
249 2
		$parser = new AclControllerParser();
250 2
		$parser->init();
251 2
		foreach ($files as $file) {
252 2
			if (\is_file($file)) {
253 2
				$controller = ClassUtils::getClassFullNameFromFile($file);
254
				try {
255 2
					$parser->parse($controller);
256
				} catch (\Exception $e) {
257
					if ($e instanceof AclException) {
258
						throw $e;
259
					}
260
				}
261
			}
262
		}
263 2
		$parser->save();
264 2
		self::removefilterProviders();
265 2
		self::reloadFromSelectedProviders();
266 2
	}
267
268 2
	protected static function registerAnnotations() {
269 2
		CacheManager::getAnnotationsEngineInstance()->registerAcls();
270 2
	}
271
272
	/**
273
	 *
274
	 * @return \Ubiquity\security\acl\cache\PermissionsMap
275
	 */
276 1
	public static function getPermissionMap() {
277 1
		if (! isset(self::$permissionMap)) {
278 1
			self::$permissionMap = new PermissionsMap();
279 1
			self::$permissionMap->load();
280
		}
281 1
		return self::$permissionMap;
282
	}
283
284
	/**
285
	 *
286
	 * @param string $controller
287
	 * @param string $action
288
	 * @param string $resource
289
	 * @param string $permission
290
	 */
291 1
	public static function associate(string $controller, string $action, string $resource, string $permission = 'ALL') {
292 1
		self::$aclList->getResourceByName($resource);
293 1
		self::$aclList->getPermissionByName($permission);
294 1
		self::$permissionMap->addAction($controller, $action, $resource, $permission);
295 1
	}
296
297
	/**
298
	 *
299
	 * @param AbstractAclPart $part
300
	 * @param string $providerClass
301
	 * @return boolean
302
	 */
303 2
	public static function existPartIn(AbstractAclPart $part, string $providerClass) {
304 2
		return self::$aclList->existPartIn($part, $providerClass);
305
	}
306
307
	/**
308
	 *
309
	 * @param AclElement $elm
310
	 * @param string $providerClass
311
	 * @return boolean
312
	 */
313 2
	public static function existAclIn(AclElement $elm, string $providerClass) {
314 2
		return self::$aclList->existAclIn($elm, $providerClass);
315
	}
316
317
	/**
318
	 *
319
	 * @param string $providerClass
320
	 * @return \Ubiquity\security\acl\persistence\AclProviderInterface|NULL
321
	 */
322 2
	public static function getProvider(string $providerClass) {
323 2
		return self::$aclList->getProvider($providerClass);
324
	}
325
326
	public static function getModelClassesSwap(): array {
327
		$result = [];
328
		$aclList = self::getAclList();
329
		if (isset($aclList)) {
330
			foreach ($aclList->getProviders() as $prov) {
331
				$result += $prov->getModelClassesSwap();
332
			}
333
		}
334
		return $result;
335
	}
336
337 2
	public static function filterProviders(string $providerClass) {
338 2
		$providers = self::$aclList->getProviders();
339 2
		$filter = [];
340 2
		foreach ($providers as $prov) {
341 2
			if ($prov instanceof $providerClass) {
342 2
				$filter[] = $prov;
343
			}
344
		}
345 2
		self::$aclList->setProviders($filter);
346 2
		self::$providersPersistence = $providers;
347 2
	}
348
349 2
	public static function removefilterProviders() {
350 2
		self::$aclList->setProviders(self::$providersPersistence);
351 2
	}
352
}
353
354