Completed
Push — master ( 1bbe3a...a1970e )
by Oleg
08:32
created

FileAcl::rolePerms()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php /** MicroFileACL */
2
3
namespace Micro\Auth\Drivers;
4
5
use Micro\Db\IConnection;
6
use Micro\Mvc\Models\Query;
7
8
/**
9
 * File ACL class file.
10
 *
11
 * ACL security with files.
12
 *
13
 * @author Oleg Lunegov <[email protected]>
14
 * @link https://github.com/linpax/microphp-framework
15
 * @copyright Copyright (c) 2013 Oleg Lunegov
16
 * @license https://github.com/linpax/microphp-framework/blob/master/LICENSE
17
 * @package Micro
18
 * @subpackage Auth\Drivers
19
 * @version 1.0
20
 * @since 1.0
21
 */
22
class FileAcl extends Acl
23
{
24
    /** @var array $roles configured roles */
25
    protected $roles;
26
    /** @var array $perms configured perms */
27
    protected $perms;
28
    /** @var array $rolePermsCompare compare of permissions in roles */
29
    protected $rolePermsCompare;
30
31
32
    /**
33
     * Configured ACL with files
34
     *
35
     * @access public
36
     *
37
     * @param IConnection $db
38
     * @param array $params configuration array
39
     *
40
     * @result void
41
     */
42
    public function __construct(IConnection $db, array $params = [])
43
    {
44
        parent::__construct($db, $params);
45
46
        $roles = !empty($params['roles']) ? $params['roles'] : [];
47
        $this->roles = !empty($roles['roles']) ? $roles['roles'] : [];
48
        $this->perms = !empty($roles['perms']) ? $roles['perms'] : [];
49
        $this->rolePermsCompare = !empty($roles['role_perms']) ? $roles['role_perms'] : [];
50
    }
51
52
    /**
53
     * Check user access to permission
54
     *
55
     * @access public
56
     *
57
     * @param integer $userId user id
58
     * @param string $permission checked permission
59
     * @param array $data not used, added for compatible!
60
     *
61
     * @return bool
62
     * @throws \Micro\Base\Exception
63
     */
64
    public function check($userId, $permission, array $data = [])
65
    {
66
        $permissionId = in_array($permission, $this->perms, true);
67
        /** @var array $assigned */
68
        $assigned = $this->assigned($userId);
69
        if (!$assigned) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $assigned of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
70
            return false;
71
        }
72
73
        foreach ($assigned AS $assign) {
74
            if ($assign['perm'] && $assign['perm'] === $permissionId) {
75
                return true;
76
            } elseif ($assign['role'] && in_array($permissionId, $this->rolePerms($assign['role']), true)) {
77
                return true;
78
            }
79
        }
80
81
        return false;
82
    }
83
84
    /**
85
     * Get assigned elements
86
     *
87
     * @access public
88
     *
89
     * @param integer $userId user ID
90
     *
91
     * @return mixed
92
     * @throws \Micro\Base\Exception
93
     */
94 View Code Duplication
    public function assigned($userId)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
95
    {
96
        $query = new Query($this->db);
97
        $query->select = '*';
98
        $query->table = 'acl_user';
99
        $query->addWhere('`user`='.$userId);
100
        $query->single = false;
101
102
        return $query->run();
103
    }
104
105
    /**
106
     * Get permissions in role
107
     *
108
     * @access private
109
     *
110
     * @param integer $role role name
111
     *
112
     * @return array
113
     */
114
    protected function rolePerms($role)
115
    {
116
        return $this->rolePermsCompare[$role];
117
    }
118
}
119