Completed
Branch master (220ce5)
by De Cramer
16:11
created

AdminGroups::hasPermission()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 17
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 10.1554

Importance

Changes 0
Metric Value
dl 0
loc 17
ccs 3
cts 11
cp 0.2727
rs 9.2
c 0
b 0
f 0
cc 4
eloc 10
nc 4
nop 2
crap 10.1554
1
<?php
2
3
namespace eXpansion\Framework\AdminGroups\Helpers;
4
5
use eXpansion\Framework\AdminGroups\Exceptions\UnknownGroupException;
6
use eXpansion\Framework\AdminGroups\Services\AdminGroupConfiguration;
7
use eXpansion\Framework\Core\Model\UserGroups\Group;
8
use eXpansion\Framework\Core\Plugins\UserGroups\Factory;
9
use eXpansion\Framework\Core\Storage\Data\Player;
10
11
/**
12
 * Class AdminGroupConfiguration
13
 *
14
 * @package eXpansion\Bundle\AdminGroupConfiguration\Helpers;
15
 * @author oliver de Cramer <[email protected]>
16
 */
17
class AdminGroups
18
{
19
    /** @var  AdminGroupConfiguration */
20
    protected $adminGroupConfiguration;
21
22
    /** @var  Factory */
23
    protected $userGroupFactory;
24
25
    /**
26
     * GroupsPlugin constructor.
27
     *
28
     * @param AdminGroupConfiguration $adminGroupConfiguration
29
     * @param Factory $userGroupFactory
30
     */
31 6
    public function __construct(
32
        AdminGroupConfiguration $adminGroupConfiguration,
33
        Factory $userGroupFactory
34
    ) {
35 6
        $this->adminGroupConfiguration = $adminGroupConfiguration;
36 6
        $this->userGroupFactory = $userGroupFactory;
37 6
    }
38
39
    /**
40
     * Get list of all user groups.
41
     * Can be useful for creating group based GUI widgets.
42
     *
43
     * @return Group[]
44
     */
45 1
    public function getUserGroups()
46
    {
47 1
        $groups = [];
48 1
        foreach ($this->adminGroupConfiguration->getGroups() as $groupName) {
49 1
            $groups[] = $this->getUserGroup("$groupName");
50 1
        }
51
52 1
        return $groups;
53
    }
54
55
    /**
56
     * Get the group in which a user is.
57
     * This is useful for gui actions.
58
     *
59
     * @param string $login
60
     *
61
     * @return Group
62
     */
63 1
    public function getLoginUserGroups($login)
64
    {
65 1
        $groupName = $this->adminGroupConfiguration->getLoginGroupName($login);
66 1
        if (empty($groupName)) {
67 1
            $groupName = 'guest';
68 1
        }
69
70 1
        return $this->getUserGroup("$groupName");
71
    }
72
73
    /**
74
     * Get (or create a new) admin user group
75
     *
76
     * @param string $groupName
77
     *
78
     * @return Group
79
     */
80 2
    protected function getUserGroup($groupName)
81
    {
82 2
        $groupName = "admin:$groupName";
83
84 2
        $group = $this->userGroupFactory->getGroup($groupName);
85 2
        if (!$group) {
86 2
            $this->userGroupFactory->create($groupName);
87 2
            $group = $this->userGroupFactory->getGroup($groupName);
0 ignored issues
show
Bug introduced by
Are you sure the assignment to $group is correct as $this->userGroupFactory->getGroup($groupName) (which targets eXpansion\Framework\Core...ups\Factory::getGroup()) seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
88 2
        }
89
90 2
        return $group;
91
    }
92
93
    /**
94
     * Checks if a login or player has a certain permission or not.
95
     *
96
     * @param string|Group|Player $login Login of the player to check for permission.
0 ignored issues
show
Bug introduced by
There is no parameter named $login. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
97
     * @param string $permission The permission to check for.
98
     *
99
     * @return bool
100
     */
101 3
    public function hasPermission($recipient, $permission)
102
    {
103
104 3
        if ($recipient instanceof Group) {
105
            $check = true;
106
            foreach ($recipient->getLogins() as $login) {
107
                if ($this->hasLoginPermission($login, $permission) === false) {
108
                    $check = false;
109
                    echo "$login false";
110
                }
111
            }
112
113
            return $check;
114
        } else {
115 3
            return $this->hasLoginPermission($recipient, $permission);
116
        }
117
    }
118
119 3
    protected function hasLoginPermission($login, $permission)
120
    {
121 3
        if ($login instanceof Player) {
122
            $login = $login->getLogin();
123
        }
124
125 3
        return $this->adminGroupConfiguration->hasPermission($login, $permission);
126
    }
127
128
129
    /**
130
     * Check if a group has a certain permission or not.
131
     *
132
     * @param string $groupName The name of the group to check permissions for.
133
     * @param string $permission The permission to check for.
134
     *
135
     * @return bool
136
     * @throws UnknownGroupException Thrown when group isn't an admin group.
137
     */
138 2
    public function hasGroupPermission($groupName, $permission)
139
    {
140
141 2
        if (strpos($groupName, 'admin:') === 0) {
142 1
            $groupName = str_replace("admin:", '', $groupName);
143 1
        }
144
145 2
        $logins = $this->adminGroupConfiguration->getGroupLogins($groupName);
146
147 2
        if (!empty($logins)) {
148 1
            return $this->hasPermission($logins[0], $permission);
149
        }
150
151 2
        if (is_null($logins)) {
152 2
            throw new UnknownGroupException("'$groupName' admin group does not exist.");
153
        }
154
155 1
        return false;
156
    }
157
158
    /**
159
     * @param string $groupName
160
     * @return string
161
     */
162
    public function getGroupLabel($groupName)
163
    {
164
        if (strpos($groupName, 'admin:') === 0) {
165
            $groupName = str_replace("admin:", '', $groupName);
166
        }
167
168
        return $this->adminGroupConfiguration->getGroupLabel($groupName);
169
170
    }
171
172
    /**
173
     * gets if the player is admin
174
     *
175
     * @param string $login
176
     * @return bool
177
     */
178
    public function isAdmin($login)
179
    {
180
        return ($this->getLoginUserGroups($login)->getName() !== "admin:guest") ? true : false;
181
    }
182
183
}
184