Completed
Push — master ( cf8ae9...c2ec78 )
by Adam
02:36 queued 14s
created

Permission   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 5

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 11
lcom 0
cbo 5
dl 0
loc 62
rs 10
c 1
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
C __construct() 0 36 7
A checkAndAddRole() 0 13 4
1
<?php
2
/**
3
 * Permission.php
4
 *
5
 * @copyright      More in license.md
6
 * @license        http://www.ipublikuj.eu
7
 * @author         Adam Kadlec http://www.ipublikuj.eu
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;
20
use Nette\Reflection;
21
use Nette\Security as NS;
22
use Nette\Utils;
23
24
use IPub;
25
use IPub\Permissions\Access;
26
use IPub\Permissions\Entities;
27
use IPub\Permissions\Exceptions;
28
use IPub\Permissions\Providers;
29
30
/**
31
 * Nette user permission
32
 *
33
 * @package        iPublikuj:Permissions!
34
 * @subpackage     Security
35
 *
36
 * @author         Adam Kadlec <[email protected]>
37
 */
38
class Permission extends NS\Permission implements NS\IAuthorizator
39
{
40
	/**
41
	 * @param Providers\IRolesProvider $rolesProvider
42
	 * @param Providers\IResourcesProvider $resourcesProvider
43
	 */
44
	public function __construct(
45
		Providers\IRolesProvider $rolesProvider,
46
		Providers\IResourcesProvider $resourcesProvider
47
	) {
48
		// Get all available resources
49
		$resources = $resourcesProvider->findAll();
50
51
		foreach ($resources as $resource) {
52
			$resourceParent = $resource->getParent();
53
54
			// Assign resource to application permission checker
55
			$this->addResource($resource->getResourceId(), $resourceParent ? $resourceParent->getResourceId() : NULL);
56
		}
57
58
		// Get all available roles
59
		$roles = $rolesProvider->findAll();
60
61
		// Register all available roles
62
		foreach ($roles as $role) {
63
			$this->checkAndAddRole($role);
64
65
			// Allow all privileges for administrator
66
			if ($role->isAdministrator()) {
67
				$this->allow($role->getRoleId(), self::ALL, self::ALL);
68
69
			// For others apply setup privileges
70
			} else {
71
				foreach ($role->getPermissions() as $permission) {
72
					$resource = $permission->getResource();
73
					$resource = $resource ? $resource->getResourceId() : NS\IAuthorizator::ALL;
74
75
					$this->allow($role->getRoleId(), $resource, $permission->getPrivilege(), $permission->getAssertion());
76
				}
77
			}
78
		}
79
	}
80
81
	/**
82
	 * @param Entities\IRole $role
83
	 *
84
	 * @return void
85
	 */
86
	private function checkAndAddRole(Entities\IRole $role)
87
	{
88
		$roleParent = $role->getParent();
89
90
		if ($roleParent) {
91
			$this->checkAndAddRole($roleParent);
92
		}
93
94
		// Assign role to application permission checker
95
		if (!$this->hasRole($role->getRoleId())) {
96
			$this->addRole($role->getRoleId(), $roleParent ? $roleParent->getRoleId() : NULL);
97
		}
98
	}
99
}
100