Permission::checkAndAddRole()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 13
ccs 6
cts 6
cp 1
rs 9.8333
c 0
b 0
f 0
cc 4
nc 4
nop 1
crap 4
1
<?php
2
/**
3
 * Permission.php
4
 *
5
 * @copyright      More in license.md
6
 * @license        https://www.ipublikuj.eu
7
 * @author         Adam Kadlec <[email protected]>
8
 * @package        iPublikuj:Permissions!
9
 * @subpackage     Security
10
 * @since          1.0.0
11
 *
12
 * @date           10.10.14
13
 */
14
15
declare(strict_types = 1);
16
17
namespace IPub\Permissions\Security;
18
19
use Nette\Security as NS;
20
21
use IPub\Permissions\Entities;
22
use IPub\Permissions\Providers;
23
24
/**
25
 * Nette user permission
26
 *
27
 * @package        iPublikuj:Permissions!
28
 * @subpackage     Security
29
 *
30
 * @author         Adam Kadlec <[email protected]>
31
 */
32 1
class Permission extends NS\Permission implements NS\IAuthorizator
33
{
34
	/**
35
	 * @param Providers\IRolesProvider $rolesProvider
36
	 * @param Providers\IResourcesProvider $resourcesProvider
37
	 */
38
	public function __construct(
39
		Providers\IRolesProvider $rolesProvider,
40
		Providers\IResourcesProvider $resourcesProvider
41
	) {
42
		// Get all available resources
43 1
		$resources = $resourcesProvider->findAll();
44
45 1
		foreach ($resources as $resource) {
46 1
			$resourceParent = $resource->getParent();
47
48
			// Assign resource to application permission checker
49 1
			$this->addResource($resource->getResourceId(), $resourceParent ? $resourceParent->getResourceId() : NULL);
50
		}
51
52
		// Get all available roles
53 1
		$roles = $rolesProvider->findAll();
54
55
		// Register all available roles
56 1
		foreach ($roles as $role) {
57 1
			$this->checkAndAddRole($role);
58
59
			// Allow all privileges for administrator
60 1
			if ($role->isAdministrator()) {
61 1
				$this->allow($role->getRoleId(), self::ALL, self::ALL);
62
63
			// For others apply setup privileges
64
			} else {
65 1
				foreach ($role->getPermissions() as $permission) {
66 1
					$resource = $permission->getResource();
67 1
					$resource = $resource ? $resource->getResourceId() : NS\IAuthorizator::ALL;
68
69 1
					$this->allow($role->getRoleId(), $resource, $permission->getPrivilege(), $permission->getAssertion());
70
				}
71
			}
72
		}
73 1
	}
74
75
	/**
76
	 * @param Entities\IRole $role
77
	 *
78
	 * @return void
79
	 */
80
	private function checkAndAddRole(Entities\IRole $role) : void
81
	{
82 1
		$roleParent = $role->getParent();
83
84 1
		if ($roleParent) {
85 1
			$this->checkAndAddRole($roleParent);
86
		}
87
88
		// Assign role to application permission checker
89 1
		if (!$this->hasRole($role->getRoleId())) {
90 1
			$this->addRole($role->getRoleId(), $roleParent ? $roleParent->getRoleId() : NULL);
91
		}
92 1
	}
93
}
94