Passed
Branch development (e0e718)
by Nils
04:45
created

adLDAPGroups   D

Complexity

Total Complexity 103

Size/Duplication

Total Lines 641
Duplicated Lines 23.4 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 0
Metric Value
dl 150
loc 641
rs 4.7047
c 0
b 0
f 0
wmc 103
lcom 1
cbo 5

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like adLDAPGroups often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use adLDAPGroups, and based on these observations, apply Extract Interface, too.

1
<?php
2
namespace adLDAP\classes;
3
use adLDAP\adLDAP;
4
/**
5
 * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY 
6
 * Version 5.0.0
7
 * 
8
 * PHP Version 5 with SSL and LDAP support
9
 * 
10
 * Written by Scott Barnett, Richard Hyland
11
 *   email: [email protected], [email protected]
12
 *   http://github.com/adldap/adLDAP
13
 * 
14
 * Copyright (c) 2006-2014 Scott Barnett, Richard Hyland
15
 * 
16
 * We'd appreciate any improvements or additions to be submitted back
17
 * to benefit the entire community :)
18
 * 
19
 * This library is free software; you can redistribute it and/or
20
 * modify it under the terms of the GNU Lesser General Public
21
 * License as published by the Free Software Foundation; either
22
 * version 2.1 of the License.
23
 * 
24
 * This library is distributed in the hope that it will be useful,
25
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
27
 * Lesser General Public License for more details.
28
 * 
29
 * @category ToolsAndUtilities
30
 * @package adLDAP
31
 * @subpackage Groups
32
 * @author Scott Barnett, Richard Hyland
33
 * @copyright (c) 2006-2014 Scott Barnett, Richard Hyland
34
 * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
35
 * @version 5.0.0
36
 * @link http://github.com/adldap/adLDAP
37
 */
38
require_once(dirname(__FILE__).'/../adLDAP.php');
39
require_once(dirname(__FILE__).'/../collections/adLDAPGroupCollection.php');
40
41
/**
42
* GROUP FUNCTIONS
43
*/
44
class adLDAPGroups {
45
    /**
46
     * The current adLDAP connection via dependency injection
47
     * 
48
     * @var adLDAP
49
     */
50
    protected $adldap;
51
    
52
    public function __construct(adLDAP $adldap) {
53
        $this->adldap = $adldap;
54
    }
55
    
56
    /**
57
     * Add a group to a group
58
     * 
59
     * @param string $parent The parent group name
60
     * @param string $child The child group name
61
     * @return bool
62
     */
63
    public function addGroup($parent, $child) {
64
65
        // Find the parent group's dn
66
        $parentGroup = $this->ginfo($parent, array("cn"));
67
        if ($parentGroup[0]["dn"] === NULL) {
68
            return false; 
69
        }
70
        $parentDn = $parentGroup[0]["dn"];
71
        
72
        // Find the child group's dn
73
        $childGroup = $this->info($child, array("cn"));
74
        if ($childGroup[0]["dn"] === NULL) { 
75
            return false; 
76
        } 
77
        $childDn = $childGroup[0]["dn"];
78
                
79
        $add = array();
80
        $add["member"] = $childDn;
81
        
82
        $result = @ldap_mod_add($this->adldap->getLdapConnection(), $parentDn, $add);
83
        if ($result === false) { 
84
            return false; 
85
        }
86
        return true;
87
    }
88
    
89
    /**
90
     * Add a user to a group
91
     * 
92
     * @param string $group The group to add the user to
93
     * @param string $user The user to add to the group
94
     * @param bool $isGUID Is the username passed a GUID or a samAccountName
95
     * @return bool
96
     */
97
    public function addUser($group, $user, $isGUID = false) {
98
        // Adding a user is a bit fiddly, we need to get the full DN of the user
99
        // and add it using the full DN of the group
100
        
101
        // Find the user's dn
102
        $userDn = $this->adldap->user()->dn($user, $isGUID);
103
        if ($userDn === false) { 
104
            return false; 
105
        }
106
        
107
        // Find the group's dn
108
        $groupInfo = $this->info($group, array("cn"));
109
        if ($groupInfo[0]["dn"] === NULL) { 
110
            return false; 
111
        }
112
        $groupDn = $groupInfo[0]["dn"];
113
        
114
        $add = array();
115
        $add["member"] = $userDn;
116
        
117
        $result = @ldap_mod_add($this->adldap->getLdapConnection(), $groupDn, $add);
118
        if ($result === false) { 
119
            return false; 
120
        }
121
        return true;
122
    }
123
    
124
    /**
125
     * Add a contact to a group
126
     * 
127
     * @param string $group The group to add the contact to
128
     * @param string $contactDn The DN of the contact to add
129
     * @return bool
130
     */
131
    public function addContact($group, $contactDn)
132
    {
133
        // To add a contact we take the contact's DN
134
        // and add it using the full DN of the group
135
        
136
        // Find the group's dn
137
        $groupInfo = $this->info($group, array("cn"));
138
        if ($groupInfo[0]["dn"] === NULL) { 
139
            return false; 
140
        }
141
        $groupDn = $groupInfo[0]["dn"];
142
        
143
        $add = array();
144
        $add["member"] = $contactDn;
145
        
146
        $result = @ldap_mod_add($this->adldap->getLdapConnection(), $groupDn, $add);
147
        if ($result === false) { 
148
            return false; 
149
        }
150
        return true;
151
    }
152
153
    /**
154
     * Create a group
155
     * 
156
     * @param array $attributes Default attributes of the group
157
     * @return string|boolean
158
     */
159
    public function create($attributes) {
160
        if (!is_array($attributes)) { return "Attributes must be an array"; }
161
        if (!array_key_exists("group_name", $attributes)) { return "Missing compulsory field [group_name]"; }
162
        if (!array_key_exists("container", $attributes)) { return "Missing compulsory field [container]"; }
163
        if (!array_key_exists("description", $attributes)) { return "Missing compulsory field [description]"; }
164
        if (!is_array($attributes["container"])) { return "Container attribute must be an array."; }
165
        $attributes["container"] = array_reverse($attributes["container"]);
166
167
        //$member_array = array();
168
        //$member_array[0] = "cn=user1,cn=Users,dc=yourdomain,dc=com";
169
        //$member_array[1] = "cn=administrator,cn=Users,dc=yourdomain,dc=com";
170
        
171
        $add = array();
172
        $add["cn"] = $attributes["group_name"];
173
        $add["samaccountname"] = $attributes["group_name"];
174
        $add["objectClass"] = "Group";
175
        $add["description"] = $attributes["description"];
176
        //$add["member"] = $member_array; UNTESTED
177
178
        $container = "OU=".implode(",OU=", $attributes["container"]);
179
        $result = ldap_add($this->adldap->getLdapConnection(), "CN=".$add["cn"].", ".$container.",".$this->adldap->getBaseDn(), $add);
180
        if ($result !== true) { 
181
            return false; 
182
        }
183
        return true;
184
    }
185
    
186
    /**
187
     * Delete a group account 
188
     * 
189
     * @param string $group The group to delete (please be careful here!) 
190
     * 
191
     * @return string|boolean 
192
     */
193
    public function delete($group) {
194
        if (!$this->adldap->getLdapBind()) { return false; }
195
        if ($group === null) { return "Missing compulsory field [group]"; }
196
        
197
        $groupInfo = $this->info($group, array("*"));
198
        $dn = $groupInfo[0]['distinguishedname'][0]; 
199
        $result = $this->adldap->folder()->delete($dn); 
200
        if ($result !== true) { 
201
            return false; 
202
        } 
203
    return true;   
204
    }
205
206
    /**
207
     * Rename group with new group
208
     * @param $group
209
     * @param $newName
210
     * @param $container
211
     *
212
     * @return bool
213
     */
214
    public function rename($group, $newName, $container) {
215
        $info = $this->info($group);
216
        if ($info[0]["dn"] === NULL) {
217
            return false;
218
        } else {
219
            $groupDN = $info[0]["dn"];
220
        }
221
        $newRDN = 'CN='.$newName;
222
223
        // Determine the container
224
        $container = array_reverse($container);
225
        $container = "OU=".implode(", OU=", $container);
226
227
        // Do the update
228
        $result = @ldap_rename($this->adldap->getLdapConnection(), $groupDN, $newRDN, $container.', '.$this->adldap->getBaseDn(), true);
229
        if ($result === false) {
230
            return false;
231
        }
232
        return true;
233
    }
234
235
    /**
236
     * Remove a group from a group
237
     * 
238
     * @param string $parent The parent group name
239
     * @param string $child The child group name
240
     * @return bool
241
     */
242
    public function removeGroup($parent, $child) {
243
    
244
        // Find the parent dn
245
        $parentGroup = $this->info($parent, array("cn"));
246
        if ($parentGroup[0]["dn"] === NULL) { 
247
            return false; 
248
        }
249
        $parentDn = $parentGroup[0]["dn"];
250
        
251
        // Find the child dn
252
        $childGroup = $this->info($child, array("cn"));
253
        if ($childGroup[0]["dn"] === NULL) { 
254
            return false; 
255
        }
256
        $childDn = $childGroup[0]["dn"];
257
        
258
        $del = array();
259
        $del["member"] = $childDn;
260
        
261
        $result = @ldap_mod_del($this->adldap->getLdapConnection(), $parentDn, $del);
262
        if ($result === false) { 
263
            return false; 
264
        }
265
        return true;
266
    }
267
    
268
    /**
269
     * Remove a user from a group
270
     * 
271
     * @param string $group The group to remove a user from
272
     * @param string $user The AD user to remove from the group
273
     * @param bool $isGUID Is the username passed a GUID or a samAccountName
274
     * @return bool
275
     */
276
    public function removeUser($group, $user, $isGUID = false) {
277
    
278
        // Find the parent dn
279
        $groupInfo = $this->info($group, array("cn"));
280
        if ($groupInfo[0]["dn"] === NULL) {  
281
            return false; 
282
        }
283
        $groupDn = $groupInfo[0]["dn"];
284
        
285
        // Find the users dn
286
        $userDn = $this->adldap->user()->dn($user, $isGUID);
287
        if ($userDn === false) {
288
            return false; 
289
        }
290
291
        $del = array();
292
        $del["member"] = $userDn;
293
        
294
        $result = @ldap_mod_del($this->adldap->getLdapConnection(), $groupDn, $del);
295
        if ($result === false) {
296
            return false; 
297
        }
298
        return true;
299
    }
300
    
301
    /**
302
     * Remove a contact from a group
303
     * 
304
     * @param string $group The group to remove a user from
305
     * @param string $contactDn The DN of a contact to remove from the group
306
     * @return bool
307
     */
308
    public function removeContact($group, $contactDn) {
309
    
310
        // Find the parent dn
311
        $groupInfo = $this->info($group, array("cn"));
312
        if ($groupInfo[0]["dn"] === NULL) { 
313
            return false; 
314
        }
315
        $groupDn = $groupInfo[0]["dn"];
316
    
317
        $del = array();
318
        $del["member"] = $contactDn;
319
        
320
        $result = @ldap_mod_del($this->adldap->getLdapConnection(), $groupDn, $del);
321
        if ($result === false) { 
322
            return false; 
323
        }
324
        return true;
325
    }
326
    
327
    /**
328
     * Return a list of groups in a group
329
     * 
330
     * @param string $group The group to query
331
     * @param bool $recursive Recursively get groups
332
     * @return array
333
     */
334
    public function inGroup($group, $recursive = NULL) {
335
        if (!$this->adldap->getLdapBind()) { return false; }
336
        if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } // Use the default option if they haven't set it 
337
        
338
        // Search the directory for the members of a group
339
        $info = $this->info($group, array("member", "cn"));
340
        $groups = $info[0]["member"];
341
        if (!is_array($groups)) {
342
            return false;   
343
        }
344
 
345
        $groupArray = array();
346
347
        for ($i = 0; $i < $groups["count"]; $i++) { 
348
                $filter = "(&(objectCategory=group)(distinguishedName=".$this->adldap->utilities()->ldapSlashes($groups[$i])."))";
349
                $fields = array("samaccountname", "distinguishedname", "objectClass");
350
                $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
351
                $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
352
353
                // not a person, look for a group  
354
                if ($entries['count'] == 0 && $recursive === true) {  
355
                $filter = "(&(objectCategory=group)(distinguishedName=".$this->adldap->utilities()->ldapSlashes($groups[$i])."))";  
356
                $fields = array("distinguishedname");  
357
                $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);  
358
                $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);  
359
                if (!isset($entries[0]['distinguishedname'][0])) {
360
                    continue;  
361
                }
362
                $subGroups = $this->inGroup($entries[0]['distinguishedname'][0], $recursive);  
363
                if (is_array($subGroups)) {
364
                    $groupArray = array_merge($groupArray, $subGroups); 
365
                    $groupArray = array_unique($groupArray);  
366
                }
367
                continue;  
368
                } 
369
                $groupArray[] = $entries[0]['distinguishedname'][0];
370
        }
371
        return $groupArray;
372
    }
373
    
374
    /**
375
     * Return a list of members in a group
376
     * 
377
     * @param string $group The group to query
378
     * @param bool $recursive Recursively get group members
379
     * @return array
380
     */
381
    public function members($group, $recursive = NULL) {
382
        if (!$this->adldap->getLdapBind()) { return false; }
383
        if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } // Use the default option if they haven't set it 
384
        // Search the directory for the members of a group
385
        $info = $this->info($group, array("member", "cn"));
386
        if (isset($info[0]["member"])) {
387
            $users = $info[0]["member"];
388
            if (!is_array($users)) {
389
                return false;   
390
            }
391
        } else {
392
            return false;
393
        }
394
 
395
        $userArray = array();
396
397
        for ($i = 0; $i < $users["count"]; $i++) { 
398
                $filter = "(&(objectCategory=person)(distinguishedName=".$this->adldap->utilities()->ldapSlashes($users[$i])."))";
399
                $fields = array("samaccountname", "distinguishedname", "objectClass");
400
                $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
401
                $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
402
403
                // not a person, look for a group  
404
                if ($entries['count'] == 0 && $recursive === true) {  
405
                $filter = "(&(objectCategory=group)(distinguishedName=".$this->adldap->utilities()->ldapSlashes($users[$i])."))";  
406
                $fields = array("samaccountname");  
407
                $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);  
408
                $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);  
409
                if (!isset($entries[0]['samaccountname'][0])) {
410
                    continue;  
411
                }
412
                $subUsers = $this->members($entries[0]['samaccountname'][0], $recursive);  
413
                if (is_array($subUsers)) {
414
                    $userArray = array_merge($userArray, $subUsers); 
415
                    $userArray = array_unique($userArray);  
416
                }
417
                continue;  
418
                } else if ($entries['count'] == 0) {   
419
                continue; 
420
                } 
421
422
                if ((!isset($entries[0]['samaccountname'][0]) || $entries[0]['samaccountname'][0] === NULL) && $entries[0]['distinguishedname'][0] !== NULL) {
423
                    $userArray[] = $entries[0]['distinguishedname'][0];
424
                } else if ($entries[0]['samaccountname'][0] !== NULL) {
425
                $userArray[] = $entries[0]['samaccountname'][0];
426
                }
427
        }
428
        return $userArray;
429
    }
430
    
431
    /**
432
     * Group Information.  Returns an array of raw information about a group.
433
     * The group name is case sensitive
434
     * 
435
     * @param string $groupName The group name to retrieve info about
436
     * @param array $fields Fields to retrieve
437
     * @return array
438
     */
439
    public function info($groupName, $fields = NULL) {
440
        if ($groupName === NULL) { return false; }
441
        if (!$this->adldap->getLdapBind()) { return false; }
442
        
443
        if (stristr($groupName, '+')) {
444
            $groupName = stripslashes($groupName);   
445
        }
446
        
447
        $filter = "(&(objectCategory=group)(name=".$this->adldap->utilities()->ldapSlashes($groupName)."))";
448
        if ($fields === NULL) { 
449
            $fields = array("member", "memberof", "cn", "description", "distinguishedname", "objectcategory", "samaccountname"); 
450
        }
451
        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
452
        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
453
454
        // Windows 2003: Returns up to 1500 values (Windows 2000 only 1000 is not supported).
455
        if (isset($entries[0]['member;range=0-1499']) && $entries[0]['member;range=0-1499']['count'] == 1500) {
456
            $entries[0]['member']['count'] = "0";
457
            $rangestep = 1499; // Step site
458
            $rangelow  = 0; // Initial low range
459
            $rangehigh = $rangelow + $rangestep; // Initial high range
460
            // do until array_keys($members[0])[0] ends with a '*', e. g. member;range=1499-*. It indicates end of the range
461
            do {
462
                $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, array("member;range=".$rangelow."-".$rangehigh));
463
                $members = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
464
                $memberrange = array_keys($members[0]);
465
                $membercount = $members[0][$memberrange[0]]['count'];
466
                // Copy range entries to member
467
                for ($i = 0; $i <= $membercount - 1; $i++) {
468
                    $entries[0]['member'][] = $members[0][$memberrange[0]][$i];
469
                }
470
                $entries[0]['member']['count'] += $membercount;
471
                $rangelow  += $rangestep + 1;
472
                $rangehigh += $rangestep + 1;
473
            } while (substr($memberrange[0], -1) != '*');
474
        }
475
        return $entries;
476
    }
477
    
478
    /**
479
     * Group Information.  Returns an collection
480
     * The group name is case sensitive
481
     * 
482
     * @param string $groupName The group name to retrieve info about
483
     * @param array $fields Fields to retrieve
484
     * @return \adLDAP\collections\adLDAPGroupCollection
485
     */
486
    public function infoCollection($groupName, $fields = NULL) {
487
        if ($groupName === NULL) { return false; }
488
        if (!$this->adldap->getLdapBind()) { return false; }
489
        
490
        $info = $this->info($groupName, $fields);
491
        if ($info !== false) {
492
            $collection = new \adLDAP\collections\adLDAPGroupCollection($info, $this->adldap);
493
            return $collection;
494
        }
495
        return false;
496
    }
497
    
498
    /**
499
     * Return a complete list of "groups in groups"
500
     * 
501
     * @param string $group The group to get the list from
502
     * @return array
503
     */
504
    public function recursiveGroups($group) {
505
        if ($group === NULL) { return false; }
506
507
        $stack = array(); 
508
        $processed = array(); 
509
        $retGroups = array(); 
510
     
511
        array_push($stack, $group); // Initial Group to Start with 
512
        while (count($stack) > 0) {
513
            $parent = array_pop($stack);
514
            array_push($processed, $parent);
515
            
516
            $info = $this->info($parent, array("memberof"));
517
            
518
            if (isset($info[0]["memberof"]) && is_array($info[0]["memberof"])) {
519
                $groups = $info[0]["memberof"]; 
520
                if ($groups) {
521
                    $groupNames = $this->adldap->utilities()->niceNames($groups);  
522
                    $retGroups = array_merge($retGroups, $groupNames); //final groups to return
523
                    foreach ($groupNames as $id => $groupName) { 
524
                        if (!in_array($groupName, $processed)) {
525
                            array_push($stack, $groupName);
526
                        }
527
                    }
528
                }
529
            }
530
        }
531
        return $retGroups;
532
    }
533
    
534
    /**
535
     * Returns a complete list of the groups in AD based on a SAM Account Type  
536
     * 
537
     * @param string $sAMAaccountType The account type to return
538
     * @param bool $includeDescription Whether to return a description
539
     * @param string $search Search parameters
540
     * @param bool $sorted Whether to sort the results
541
     * @return array
542
     */
543
    public function search($sAMAaccountType = adLDAP::ADLDAP_SECURITY_GLOBAL_GROUP, $includeDescription = false, $search = "*", $sorted = true) {
544
        if (!$this->adldap->getLdapBind()) { return false; }
545
        
546
        $filter = '(&(objectCategory=group)';
547
        if ($sAMAaccountType !== null) {
548
            $filter .= '(samaccounttype='.$sAMAaccountType.')';
549
        }
550
        $filter .= '(cn='.$search.'))';
551
        // Perform the search and grab all their details
552
        $fields = array("samaccountname", "description");
553
        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
554
        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
555
556
        $groupsArray = array();        
557
        for ($i = 0; $i < $entries["count"]; $i++) {
558
            if ($includeDescription && strlen($entries[$i]["description"][0]) > 0) {
559
                $groupsArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["description"][0];
560
            } else if ($includeDescription) {
561
                $groupsArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["samaccountname"][0];
562
            } else {
563
                array_push($groupsArray, $entries[$i]["samaccountname"][0]);
564
            }
565
        }
566
        if ($sorted) { 
567
            asort($groupsArray); 
568
        }
569
        return $groupsArray;
570
    }
571
572
    /**
573
     * Obtain the group's distinguished name based on their groupid
574
     *
575
     *
576
     * @param string $groupname The groupname
577
     * @return string
578
     */
579
    public function dn($groupname) {
580
        $group = $this->info($groupname, array("cn"));
581
        if ($group[0]["dn"] === NULL) {
582
            return false;
583
        }
584
        $groupDn = $group[0]["dn"];
585
        return $groupDn;
586
    }
587
588
    /**
589
     * Returns a complete list of all groups in AD
590
     * 
591
     * @param bool $includeDescription Whether to return a description
592
     * @param string $search Search parameters
593
     * @param bool $sorted Whether to sort the results
594
     * @return array
595
     */
596
    public function all($includeDescription = false, $search = "*", $sorted = true) {
597
        $groupsArray = $this->search(null, $includeDescription, $search, $sorted);
598
        return $groupsArray;
599
    }
600
    
601
    /**
602
     * Returns a complete list of security groups in AD
603
     * 
604
     * @param bool $includeDescription Whether to return a description
605
     * @param string $search Search parameters
606
     * @param bool $sorted Whether to sort the results
607
     * @return array
608
     */
609
    public function allSecurity($includeDescription = false, $search = "*", $sorted = true) {
610
        $groupsArray = $this->search(adLDAP::ADLDAP_SECURITY_GLOBAL_GROUP, $includeDescription, $search, $sorted);
611
        return $groupsArray;
612
    }
613
    
614
    /**
615
     * Returns a complete list of distribution lists in AD
616
     * 
617
     * @param bool $includeDescription Whether to return a description
618
     * @param string $search Search parameters
619
     * @param bool $sorted Whether to sort the results
620
     * @return array
621
     */
622
    public function allDistribution($includeDescription = false, $search = "*", $sorted = true) {
623
        $groupsArray = $this->search(adLDAP::ADLDAP_DISTRIBUTION_GROUP, $includeDescription, $search, $sorted);
624
        return $groupsArray;
625
    }
626
    
627
    /**
628
     * Coping with AD not returning the primary group
629
     * http://support.microsoft.com/?kbid=321360 
630
     * 
631
     * This is a re-write based on code submitted by Bruce which prevents the 
632
     * need to search each security group to find the true primary group
633
     * 
634
     * @param string $gid Group ID
635
     * @param string $usersid User's Object SID
636
     * @return mixed
637
     */
638
    public function getPrimaryGroup($gid, $usersid) {
639
        if ($gid === NULL || $usersid === NULL) { return false; }
640
        $sr = false;
641
642
        $gsid = substr_replace($usersid, pack('V', $gid), strlen($usersid) - 4, 4);
643
        $filter = '(objectsid='.$this->adldap->utilities()->getTextSID($gsid).')';
644
        $fields = array("samaccountname", "distinguishedname");
645
        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
646
        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
647
648
        if (isset($entries[0]['distinguishedname'][0])) {
649
            return $entries[0]['distinguishedname'][0];
650
        }
651
        return false;
652
        }
653
     
654
        /**
655
         * Coping with AD not returning the primary group
656
         * http://support.microsoft.com/?kbid=321360 
657
         * 
658
         * For some reason it's not possible to search on primarygrouptoken=XXX
659
         * If someone can show otherwise, I'd like to know about it :)
660
         * this way is resource intensive and generally a pain in the @#%^
661
         * 
662
         * @deprecated deprecated since version 3.1, see get get_primary_group
663
         * @param string $gid Group ID
664
         * @return string
665
         */
666
    public function cn($gid) {    
667
        if ($gid === NULL) { return false; }
668
        $sr = false;
669
        $r = '';
670
        
671
        $filter = "(&(objectCategory=group)(samaccounttype=".adLDAP::ADLDAP_SECURITY_GLOBAL_GROUP."))";
672
        $fields = array("primarygrouptoken", "samaccountname", "distinguishedname");
673
        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
674
        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
675
        
676
        for ($i = 0; $i < $entries["count"]; $i++) {
677
            if ($entries[$i]["primarygrouptoken"][0] == $gid) {
678
                $r = $entries[$i]["distinguishedname"][0];
679
                $i = $entries["count"];
680
            }
681
        }
682
        return $r;
683
    }
684
}
685
?>
686