AuthManager   A
last analyzed

Complexity

Total Complexity 16

Size/Duplication

Total Lines 73
Duplicated Lines 0 %

Test Coverage

Coverage 63.64%

Importance

Changes 10
Bugs 1 Features 1
Metric Value
eloc 29
c 10
b 1
f 1
dl 0
loc 73
ccs 21
cts 33
cp 0.6364
rs 10
wmc 16

6 Methods

Rating   Name   Duplication   Size   Complexity  
A persistAssignments() 0 3 1
A __construct() 0 8 2
B applyUserAssignments() 0 21 8
A checkAccess() 0 8 3
A saveAssignments() 0 2 1
A getAllChildren() 0 3 1
1
<?php
2
/**
3
 * RBAC implementation for HiPanel
4
 *
5
 * @link      https://github.com/hiqdev/hipanel-rbac
6
 * @package   hipanel-rbac
7
 * @license   BSD-3-Clause
8
 * @copyright Copyright (c) 2016-2020, HiQDev (http://hiqdev.com/)
9
 */
10
11
namespace hipanel\rbac;
12
13
use hiqdev\yii\compat\yii;
14
use yii\base\Configurable;
15
use yii\rbac\RuleFactory;
0 ignored issues
show
Bug introduced by
The type yii\rbac\RuleFactory was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
16
17
/**
18
 * HiPanel AuthManager.
19
 *
20
 * @author Andrii Vasyliev <[email protected]>
21
 */
22
class AuthManager extends \yii\rbac\PhpManager implements Configurable
23
{
24
    use SetterTrait;
25
26
    public $itemFile       = __DIR__ . '/files/items.php';
27
    public $ruleFile       = __DIR__ . '/files/rules.php';
28
    public $assignmentFile = __DIR__ . '/files/assignments.php';
29
30 31
    public function __construct(array $config = [])
31
    {
32 31
        if (yii::is2()) {
33 31
            parent::__construct($config);
34 31
            parent::init();
35
        } else {
36
            $dir = __DIR__ . '/files';
37
            parent::__construct($dir, new RuleFactory());
0 ignored issues
show
Unused Code introduced by
The call to yii\base\BaseObject::__construct() has too many arguments starting with new yii\rbac\RuleFactory(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

37
            parent::/** @scrutinizer ignore-call */ 
38
                    __construct($dir, new RuleFactory());

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
Bug introduced by
$dir of type string is incompatible with the type array expected by parameter $config of yii\base\BaseObject::__construct(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

37
            parent::__construct(/** @scrutinizer ignore-type */ $dir, new RuleFactory());
Loading history...
38
        }
39 31
    }
40
41
    /**
42
     * We don't keep all the assignments, only persistent.
43
     * @see persistAssignments
44
     */
45 31
    protected function saveAssignments()
46
    {
47 31
    }
48
49
    /**
50
     * Does real assignments saving.
51
     * The idea is to split persistent assignments from session only.
52
     */
53
    public function persistAssignments()
54
    {
55
        parent::saveAssignments();
56
    }
57
58 30
    public function checkAccess($userId, $permission, $params = [])
59
    {
60 30
        if (empty($this->getAssignments($userId))) {
61 2
            $this->applyUserAssignments($userId);
62
        }
63
64 30
        return parent::checkAccess($userId, $permission, $params)
65 30
            && !parent::checkAccess($userId, "deny:$permission", $params);
66
    }
67
68 2
    public function applyUserAssignments($userId)
69
    {
70 2
        $roles = '';
71
72 2
        if (isset(yii::getApp()->user)) {
73
            $user = yii::getApp()->user->identity;
74
            if ((!$user || $user->id !== $userId) && $userId) {
0 ignored issues
show
Bug introduced by
Accessing id on the interface yii\web\IdentityInterface suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
75
                $user = call_user_func([yii::getApp()->user->identityClass, 'findIdentity'], $userId);
76
            }
77
            if (isset($user->roles)) {
78
                $roles = $user->roles;
79
            }
80
        }
81
82 2
        if (empty($userId)) {
83 2
            $userId = '';
84 2
            $roles = 'role:unauthorized';
85
        }
86
87 2
        if ($roles) {
88 2
            $this->setAssignments($roles, $userId);
89
        }
90 2
    }
91
92
    public function getAllChildren(): array
93
    {
94
        return $this->children;
95
    }
96
}
97