Completed
Push — master ( c69f91...4d9e1d )
by Patrick
08:40
created

LDAPGroup::from_name()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 8
c 1
b 0
f 0
nc 3
nop 2
dl 0
loc 14
rs 9.2
1
<?php
2
namespace Auth;
3
4
class LDAPGroup extends Group
5
{
6
    use LDAPCachableObject;
7
8
    private $ldapObj;
9
    private $server;
10
11
    /**
12
     * Initialize a LDAPGroup object
13
     *
14
     * @SuppressWarnings("StaticAccess")
15
     */
16
    public function __construct($data)
17
    {
18
        $this->server = \LDAP\LDAPServer::getInstance();
19
        $this->initialize($data);
20
    }
21
22
    public function getGroupName()
23
    {
24
        return $this->getFieldSingleValue('cn');
25
    }
26
27
    public function getDescription()
28
    {
29
        return $this->getFieldSingleValue('description');
30
    }
31
32
    public function setDescription($name)
33
    {
34
        return $this->setField('description', $name);
35
    }
36
37
    private function getMembersField(&$fieldName = false)
38
    {
39
        $rawMembers = $this->getField('member');
40
        $fieldName  = 'member';
41
        if($rawMembers === false)
42
        {
43
            $rawMembers = $this->getField('uniqueMember');
44
            $fieldName  = 'uniqueMember';
45
        }
46
        if($rawMembers === false)
47
        {
48
            $rawMembers = $this->getField('memberUid');
49
            $fieldName  = 'memberUid';
50
        }
51
        if(!isset($rawMembers['count']))
52
        {
53
            $rawMembers['count'] = count($rawMembers);
54
        }
55
        return $rawMembers;
56
    }
57
58
    private function getIDFromDN($distinguishedName)
59
    {
60
        $split = explode(',', $distinguishedName);
61
        if(strncmp('cn=', $split[0], 3) === 0)
62
        {
63
            return substr($split[0], 3);
64
        }
65
        return substr($split[0], 4);
66
    }
67
68
    public function getMemberUids($recursive = true)
69
    {
70
        $members = array();
71
        $rawMembers = $this->getMembersField();
72
        for($i = 0; $i < $rawMembers['count']; $i++)
73
        {
74
            if($recursive && strncmp($rawMembers[$i], 'cn=', 3) === 0)
75
            {
76
                $child = new LDAPGroup($rawMembers[$i]);
77
                if($child !== false)
78
                {
79
                    $members = array_merge($members, $child->members());
80
                }
81
            }
82
            else
83
            {
84
                array_push($members, $rawMembers[$i]);
85
            }
86
        }
87
        $count = count($members);
88
        for($i = 0; $i < $count; $i++)
89
        {
90
            $members[$i] = $this->getIDFromDN($members[$i]);
91
        }
92
        return $members;
93
    }
94
95
    private function getObjectFromDN($distinguishedName)
96
    {
97
        $split = explode(',', $distinguishedName);
98
        if(strncmp('cn=', $distinguishedName, 3) === 0)
99
        {
100
            if(count($split) === 1)
101
            {
102
                return LDAPGroup::from_name($distinguishedName, $this->server);
103
            }
104
            return LDAPGroup::from_name(substr($split[0], 3), $this->server);
105
        }
106
        if(count($split) === 1)
107
        {
108
            return LDAPUser::from_name($distinguishedName, $this->server);
109
        }
110
        return LDAPUser::from_name(substr($split[0], 4), $this->server);
111
    }
112
113
    private function getMemberDetail($members)
114
    {
115
        $details = array();
116
        $count = count($members);
117
        for($i = 0; $i < $count; $i++)
118
        {
119
            $details[$i] = $this->getObjectFromDN($members[$i]);
120
        }
121
        return $details;
122
    }
123
124
    public function members($details = false, $recursive = true, $includeGroups = true)
125
    {
126
        $members = array();
127
        $rawMembers = $this->getMembersField();
128
        for($i = 0; $i < $rawMembers['count']; $i++)
129
        {
130
            if($recursive && strncmp($rawMembers[$i], 'cn=', 3) === 0)
131
            {
132
                $child = new LDAPGroup($rawMembers[$i]);
133
                if($child !== false)
134
                {
135
                    $members = array_merge($members, $child->members());
136
                }
137
            }
138
            else if($includeGroups !== false || strncmp($rawMembers[$i], 'cn=', 3) !== 0)
139
            {
140
                array_push($members, $rawMembers[$i]);
141
            }
142
        }
143
        if($details === true)
144
        {
145
            $members = $this->getMemberDetail($members);
146
        }
147
        return $members;
148
    }
149
150
    public function getNonMembers($select = false)
151
    {
152
        $data = array();
153
        $groupFilter = '(&(cn=*)(!(cn='.$this->getGroupName().'))';
154
        $userFilter = '(&(cn=*)';
155
        $members = $this->members();
156
        $count = count($members);
157
        for($i = 0; $i < $count; $i++)
158
        {
159
            $dnComps = explode(',', $members[$i]);
160
            if(strncmp($members[$i], "uid=", 4) == 0)
161
            {
162
                $userFilter .= '(!('.$dnComps[0].'))';
163
            }
164
            else
165
            {
166
                $groupFilter .= '(!('.$dnComps[0].'))';
167
            }
168
        }
169
        $userFilter .= ')';
170
        $groupFilter .= ')';
171
        $groups = $this->server->read($this->server->group_base, $groupFilter);
172
        $count = count($groups);
173
        for($i = 0; $i < $count; $i++)
174
        {
175
            if($groups[$i] === false || $groups[$i] === null)
176
            {
177
                continue;
178
            }
179
            array_push($data, new LDAPGroup($groups[$i]));
180
        }
181
        $users = $this->server->read($this->server->user_base, $userFilter, false, $select);
182
        $count = count($users);
183
        for($i = 0; $i < $count; $i++)
184
        {
185
            array_push($data, new LDAPUser($users[$i]));
186
        } 
187
        return $data;
188
    }
189
190
    public function clearMembers()
191
    {
192
        if(isset($this->ldapObj['member']))
193
        {
194
            $this->ldapObj['member'] = array();
195
        }
196
        else if(isset($this->ldapObj['uniquemember']))
197
        {
198
            $this->ldapObj['uniquemember'] = array();
199
        }
200
        else if(isset($this->ldapObj['memberuid']))
201
        {
202
            $this->ldapObj['memberuid'] = array();
203
        }
204
    }
205
206
    public function addMember($name, $isGroup = false, $flush = true)
207
    {
208
        $distinguishedName = false;
0 ignored issues
show
Unused Code introduced by
$distinguishedName is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
209
        if($isGroup)
210
        {
211
            $distinguishedName = 'cn='.$name.','.$this->server->group_base;
212
        }
213
        else
214
        {
215
            $distinguishedName = 'uid='.$name.','.$this->server->user_base;
216
        }
217
        $propName   = false;
218
        $rawMembers = $this->getMembersField($propName);
219
        if(isset($rawMembers['count']))
220
        {
221
            unset($rawMembers['count']);
222
        }
223
        if(in_array($distinguishedName, $rawMembers) || in_array($name, $rawMembers))
224
        {
225
            return true;
226
        }
227
        if($propName === 'memberUid')
228
        {
229
            if($isGroup)
230
            {
231
                throw new \Exception('Unable to add a group as a child of this group type');
232
            }
233
            array_push($rawMembers, $name);
234
        }
235
        else
236
        {
237
            array_push($rawMembers, $distinguishedName);
238
        }
239
        $tmp = strtolower($propName);
240
        $this->ldapObj->$tmp = $rawMembers;
241
        if($flush === true)
242
        {
243
            $obj = array('dn'=>$this->ldapObj->dn);
244
            $obj[$propName] = $rawMembers;
245
            return $this->server->update($obj);
246
        }
247
        else
248
        {
249
            return true;
250
        }
251
    }
252
253
    /**
254
     * @param string $name The Group Name
255
     * @param boolean|\LDAP\LDAPServer $data The server to read from
256
     */
257
    public static function from_name($name, $data = false)
258
    {
259
        if($data === false)
260
        {
261
            throw new \Exception('data must be set for LDAPGroup');
262
        }
263
        $filter = new \Data\Filter("cn eq $name");
264
        $group = $data->read($data->group_base, $filter);
0 ignored issues
show
Bug introduced by
It seems like $data is not always an object, but can also be of type boolean. Maybe add an additional type check?

If a variable is not always an object, we recommend to add an additional type check to ensure your method call is safe:

function someFunction(A $objectMaybe = null)
{
    if ($objectMaybe instanceof A) {
        $objectMaybe->doSomething();
    }
}
Loading history...
265
        if($group === false || !isset($group[0]))
266
        {
267
            return null;
268
        }
269
        return new static($group[0]);
270
    }
271
}
272
/* vim: set tabstop=4 shiftwidth=4 expandtab: */
273