GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Issues (59)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

app/sog/Dashboard/LdapAdapter.php (8 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
namespace SOG\Dashboard;
3
4
use Zend\Ldap\Attribute;
5
use Zend\Ldap\Collection;
6
use Zend\Ldap\Dn;
7
use Zend\Ldap\Exception\LdapException;
8
use Zend\Ldap\Ldap;
9
10
/**
11
 * This class provides an adapter for nicer querying just abobe the concrete Zend\Ldap implementation.
12
 *
13
 * Class LdapAdapter
14
 * @package SOG\Dashboard
15
 */
16
class LdapAdapter extends Ldap
17
{
18
    /**
19
     * @var string The algorithm used for password generation.
20
     */
21
    private $password_algorithm = Attribute::PASSWORD_HASH_SSHA;
22
23
    /**
24
     * Returns all groups (OUs) with their common names
25
     *
26
     * @param array $fields A list of fields we want to return from the search
27
     * @return bool|\Zend\Ldap\Collection
28
     * @throws LdapException
29
     */
30
    public function getGroups($fields = ['cn'])
31
    {
32
        $results = $this->search(
33
            '(objectClass=groupOfNames)',
34
            'ou=groups,o=sog-de,dc=sog',
35
            self::SEARCH_SCOPE_ONE,
36
            $fields,
37
            'cn'
38
        );
39
        return $results;
40
    }
41
42
    /**
43
     * Retrieves an alphabetically sorted list of all users, by recusively search the tree.
44
     * This will find users in ou=active and ou=inactive
45
     * Note that this search is subject (as all other searches) to the maximum results returned by the LDAP server,
46
     * it might not contain *all* users.
47
     *
48
     * @return Collection
49
     * @throws LdapException
50
     */
51
    public function getAllUsers()
52
    {
53
        $results = $this->search(
54
            'objectClass=inetOrgPerson',
55
            'ou=people,o=sog-de,dc=sog',
56
            self::SEARCH_SCOPE_SUB,
57
            ['cn', 'uid', 'mail', 'dn'],
58
            'cn'
59
        );
60
        return $results;
61
    }
62
63
    /**
64
     * Adds the DN to the given group
65
     *
66
     * @param string $dnOfUser dn of the user to add
67
     * @param string $dnOfGroup dn of the group
68
     * @param string $role A groupOfNames attribute, such as owner, pending, member (default)
69
     * @throws LdapException
70
     */
71
    public function addToGroup($dnOfUser, $dnOfGroup, $role = 'member')
72
    {
73
        $entry = $this->getEntry($dnOfGroup);
74
        Attribute::setAttribute($entry, $role, $dnOfUser, true);
0 ignored issues
show
It seems like $entry defined by $this->getEntry($dnOfGroup) on line 73 can also be of type null; however, Zend\Ldap\Attribute::setAttribute() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
75
        $this->update($dnOfGroup, $entry);
76
    }
77
78
    /**
79
     * Removes the DN from the given group
80
     *
81
     * @param string $dnOfUser dn of the user to remove
82
     * @param string $dnOfGroup dn of the group
83
     * @param string $role A groupOfNames attribute, such as owner, pending, member (default)
84
     * @throws LdapException
85
     */
86
    public function removeFromGroup($dnOfUser, $dnOfGroup, $role = 'member')
87
    {
88
        $entry = $this->getEntry($dnOfGroup);
89
        Attribute::removeFromAttribute($entry, $role, $dnOfUser);
0 ignored issues
show
It seems like $entry defined by $this->getEntry($dnOfGroup) on line 88 can also be of type null; however, Zend\Ldap\Attribute::removeFromAttribute() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
90
        $this->update($dnOfGroup, $entry);
91
    }
92
93
    /**
94
     * Checks whether the given user is member of the given group.
95
     *
96
     * @param string $dnOfUser
97
     * @param string $dnOfGroup
98
     * @return bool True if user is member of group, false otherwise
99
     * @throws LdapException
100
     */
101
    public function isMemberOfGroup($dnOfUser, $dnOfGroup)
102
    {
103
        return (
104
            $this->search(
105
                sprintf('member=%s', $dnOfUser),
106
                $dnOfGroup,
107
                self::SEARCH_SCOPE_BASE
108
            )->count() > 0);
109
    }
110
111
    /**
112
     * Retrieve the members of the given group with their requested details
113
     *
114
     * @param string $group_ou OU of the group
115
     * @param array $details Attributes to fetch
116
     * @return array The details of all owners indexed by their `uid`
117
     */
118
    public function getOwnerDetails($group_ou, $details = ['mail'])
119
    {
120
        $owners = $this->getOwners($group_ou)->toArray();
121
        // make sure to include uid, as we want to index the returned array by it
122
        $details = array_merge($details, ['uid']);
123
        $result = [];
124
        if (empty($owners) === false) {
125
            foreach ($owners[0]['owner'] as $owner) {
126
                try {
127
                    // retrieve details and add to result array
128
                    $entry = $this->getEntry($owner, $details, true);
129
                    $result[Attribute::getAttribute($entry, 'uid', 0)] = $entry;
0 ignored issues
show
It seems like $entry defined by $this->getEntry($owner, $details, true) on line 128 can also be of type null; however, Zend\Ldap\Attribute::getAttribute() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
130
                } catch (LdapException $ex) {
131
                    // it's ok.
132
                }
133
            }
134
        }
135
        return $result;
136
    }
137
138
    /**
139
     * Retrieve the members of the given group
140
     *
141
     * @param string $group_ou OU of the group
142
     * @return bool|Collection
143
     */
144
    public function getOwners($group_ou)
145
    {
146
        return $this->getMembers($group_ou, ['owner']);
147
    }
148
149
    /**
150
     * Retrieves all members for the given group CN
151
     *
152
     * @param string $group_ou The common name of the group for which we want to retrieve the members
153
     * @param array $fields A list of fields we want to return from the search
154
     * @return bool|\Zend\Ldap\Collection
155
     * @throws LdapException
156
     */
157
    public function getMembers($group_ou, $fields = ['member'])
158
    {
159
        $results = $this->search(
160
            sprintf('(&(objectClass=groupOfNames)(ou=%s))', $group_ou),
161
            'ou=groups,o=sog-de,dc=sog',
162
            self::SEARCH_SCOPE_ONE,
163
            $fields,
164
            $fields[0]
165
        );
166
        return $results;
167
    }
168
169
    /**
170
     * Attempts to retrieve the member or guest (DN) with the given mail address.
171
     *
172
     * @param string $mail The given mail address
173
     * @param string $attribute The name of the mail attribute to check
174
     * @return bool|string False if the search returned no results, the users' attributes otherwise.
175
     * @throws LdapException
176
     */
177
    public function getMemberByMail($mail, $attribute = 'mail-alternative')
178
    {
179
        $results = $this->search(
180
            sprintf('(&(objectClass=inetOrgPerson)(%s=%s))', $attribute, $mail),
181
            'ou=people,o=sog-de,dc=sog',
182
            self::SEARCH_SCOPE_SUB,
183
            ['dn', 'uid', 'cn', 'displayName', $attribute],
184
            'dn'
185
        );
186
        if ($results->count() > 0)
187
            return $results->getFirst();
188
        else
189
            return false;
190
    }
191
192
    /**
193
     * This method can be used to assign the ROLE_GROUP_ADMIN role to a user. It checks if the given DN is a owner
194
     * of any group. Further checks should be done somewhere else.
195
     *
196
     * @param string $user_dn The user DN for which we want to check
197
     * @return bool True if the given user is a owner of any group, false otherwise.
198
     * @throws LdapException
199
     */
200
    public function isOwner($user_dn)
201
    {
202
        $result = $this->getOwnedGroups($user_dn);
203
        // we don't care about specifics, we only want to know if the user is owner of any group
204
        return ($result != null && $result->count() > 0);
205
    }
206
207
    /**
208
     * Returns the groups owned by the user with the given dn
209
     *
210
     * @param string $user_dn The user DN for which we want to check
211
     * @return bool|Collection The groups owned by the user
212
     */
213
    public function getOwnedGroups($user_dn)
214
    {
215
        return $this->getMemberships($user_dn, ['cn', 'ou'], 'owner');
216
    }
217
218
    /**
219
     * Retrieves all memberships for the given DN
220
     *
221
     * @param string $user_dn The DN for which to get the memberships
222
     * @param array $fields A list of fields we want to return from the search
223
     * @param string $attribute The attribute which we use for filtering
224
     * @return bool|\Zend\Ldap\Collection
225
     * @throws LdapException
226
     */
227
    public function getMemberships($user_dn, $fields = ['cn'], $attribute = 'member')
228
    {
229
        $results = $this->search(
230
            sprintf('(&(objectClass=groupOfNames)(%s=%s))', $attribute, $user_dn),
231
            'ou=groups,o=sog-de,dc=sog',
232
            self::SEARCH_SCOPE_ONE,
233
            $fields,
234
            'cn'
235
        );
236
        return $results;
237
    }
238
239
    /**
240
     * Updates the email for the given DN.
241
     *
242
     * @param string $dn User's dn
243
     * @param string $newEmail The new email address
244
     * @throws LdapException
245
     */
246
    public function updateEmail($dn, $newEmail)
247
    {
248
        $entry = $this->getEntry($dn);
249
        Attribute::setAttribute($entry, 'mail-alternative', $newEmail);
0 ignored issues
show
It seems like $entry defined by $this->getEntry($dn) on line 248 can also be of type null; however, Zend\Ldap\Attribute::setAttribute() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
250
        $this->update($dn, $entry);
251
    }
252
253
254
    /**
255
     * Updates the password for the given DN. Only the DN him/herself can change the password.
256
     * Thus we need to bind as the DN first, update the password and then rebind to the privileged user.
257
     *
258
     * @param string $dn The DN for which to update the password
259
     * @param string $old_password The old password, we need to bind to the DN first
260
     * @param string $new_password The new password
261
     * @throws LdapException
262
     */
263
    public function updatePassword($dn, $old_password, $new_password)
264
    {
265
        try {
266
            $this->bind($dn, $old_password);
267
            $attributes = [];
268
            Attribute::setPassword($attributes, $new_password, $this->password_algorithm);
269
            $this->update($dn, $attributes);
270
        } catch (LdapException $ex) {
271
            throw $ex;
272
        } finally {
273
            // rebind to privileged user
274
            $this->bind();
275
        }
276
    }
277
278
    /**
279
     * Force a password update using the privileged user, this is used by the password reset process.
280
     *
281
     * @param string $dn
282
     * @param string $new_password
283
     * @throws LdapException
284
     */
285
    public function forceUpdatePassword($dn, $new_password)
286
    {
287
        $attributes = [];
288
        Attribute::setPassword($attributes, $new_password, $this->password_algorithm);
289
        $this->update($dn, $attributes);
290
    }
291
292
293
    /**
294
     * Adds a new object with the given parameters to the ou=inactive subtree.
295
     *
296
     * @param string $username The username of the new member
297
     * @param string $password The password in plaintext
298
     * @param string $firstName The first name of the new member
299
     * @param string $lastName The last name of the new member
300
     * @param string $mail The users' personal email address
301
     * @throws LdapException
302
     * @return array All stored attributes of the new member
303
     */
304
    public function createMember($username, $password, $firstName, $lastName, $mail)
305
    {
306
        $dn = sprintf('uid=%s,ou=inactive,ou=people,o=sog-de,dc=sog', $username);
307
        $sog_mail = sprintf('%[email protected]', $username);
308
        $sog_mail_alias = sprintf('%[email protected]', $username);
309
        $info = [];
310
311
        // core data
312
        Attribute::setAttribute($info, 'dn', $dn);
313
        Attribute::setAttribute($info, 'uid', $username);
314
        Attribute::setAttribute($info, 'cn', $firstName . " " . $lastName);
315
        Attribute::setAttribute($info, 'displayName', $firstName);
316
        Attribute::setAttribute($info, 'givenName', $firstName);
317
        Attribute::setAttribute($info, 'sn', $lastName);
318
319
        // password
320
        Attribute::setPassword($info, $password, $this->password_algorithm);
321
322
        // meta data
323
        Attribute::setAttribute($info, 'mail', $sog_mail);
324
        Attribute::setAttribute($info, 'mail-alternative', $mail);
325
        Attribute::setAttribute($info, 'mailAlias', $sog_mail_alias);
326
        Attribute::setAttribute($info, 'mailHomeDirectory', sprintf('/srv/vmail/%s', $sog_mail));
327
        Attribute::setAttribute($info, 'mailStorageDirectory', sprintf('maildir:/srv/vmail/%s/Maildir', $sog_mail));
328
        Attribute::setAttribute($info, 'mailEnabled', 'TRUE');
329
        Attribute::setAttribute($info, 'mailGidNumber', 5000);
330
        Attribute::setAttribute($info, 'mailUidNumber', 5000);
331
        Attribute::setAttribute($info, 'objectClass', [
332
            'person',
333
            'sogperson',
334
            'organizationalPerson',
335
            'inetOrgPerson',
336
            'top',
337
            'PostfixBookMailAccount',
338
            'PostfixBookMailForward'
339
        ]);
340
341
        $this->add($dn, $info);
342
        return $info;
343
    }
344
345
    /**
346
     * Create a guest user, reserved for non-members who should receive messages to a mailing list.
347
     *
348
     * @param string $name The name of the guest
349
     * @param string $mail The guests' email address
350
     * @return array The LDAP attributes for the guest
351
     * @throws LdapException If adding the DN wasn't successful
352
     */
353
    public function createGuest($name, $mail)
354
    {
355
        $username = 'guest'.$this->generateUsername($name);
356
        $dn = sprintf('uid=%s,ou=guests,ou=people,o=sog-de,dc=sog', $username);
357
        $info = [];
358
359
        // core data
360
        Attribute::setAttribute($info, 'dn', $dn);
361
        Attribute::setAttribute($info, 'uid', $username);
362
        Attribute::setAttribute($info, 'cn', "Guest ".$name);
363
        Attribute::setAttribute($info, 'displayName', "Guest ".$name);
364
        Attribute::setAttribute($info, 'sn', "Guest ".$name);
365
        Attribute::setAttribute($info, 'cn', "Guest ".$name);
366
367
        // meta data
368
        Attribute::setAttribute($info, 'mail', $mail);
369
        Attribute::setAttribute($info, 'objectClass', [
370
            'inetOrgPerson',
371
            'top'
372
        ]);
373
374
        $this->add($dn, $info);
375
        return $info;
376
    }
377
378
    /**
379
     * Generates a unique username by replacing some special characters, converting to lowercase and then
380
     * appending an optional number if the username already exists.
381
     *
382
     * @param string $name The given name for the member
383
     * @return string The generated unique UID
384
     */
385
    public function generateUsername($name)
386
    {
387
        $username = strtolower($name);
388
        // normalize special chars in username
389
        $username = str_replace(
390
            ['ä', 'ö', 'ü', 'ß', ' '],
391
            ['ae', 'oe', 'ue', 'ss', '.'],
392
            $username
393
        );
394
395
        $suffix = 2;
396
        $check = $username;
397
        while ($this->usernameExists($check) === true) {
398
            $check = $username . $suffix;
399
            $suffix++;
400
        }
401
402
        return $check;
403
    }
404
405
    /**
406
     * Checks if the given username is already taken, looks in the active and inactive subtree
407
     *
408
     * @param string $uid Does this username already exist?
409
     * @return bool True if member exists, false otherwise.
410
     */
411
    public function usernameExists($uid)
412
    {
413
        return ($this->exists(sprintf('uid=%s,ou=active,ou=people,o=sog-de,dc=sog', $uid)) ||
414
            $this->exists(sprintf('uid=%s,ou=inactive,ou=people,o=sog-de,dc=sog', $uid)) ||
415
            $this->exists(sprintf('uid=%s,ou=guests,ou=people,o=sog-de,dc=sog', $uid)));
416
    }
417
418
    /**
419
     * Allowing the given user to access the given group. This will move the entry from the `pending` to the `member`
420
     * field.
421
     *
422
     * @param string $uid The username for which to approve the membership in $group
423
     * @param string $group The group for which the membership of $user is approved, we expect the `ou` value
424
     * @throws LdapException
425
     */
426 View Code Duplication
    public function approveGroupMembership($uid, $group)
0 ignored issues
show
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...
427
    {
428
429
        $dnOfGroup = sprintf('ou=%s,ou=groups,o=sog-de,dc=sog', $group);
430
        $entry = $this->getEntry($dnOfGroup);
431
        if (is_null($entry)) {
432
            throw new LdapException($this, sprintf('Can\'t find group %s', $group));
433
        }
434
        $dnOfUser = $this->findUserDN($uid);
435
        Attribute::removeFromAttribute($entry, 'pending', $dnOfUser);
436
        Attribute::setAttribute($entry, 'member', $dnOfUser, true);
437
        $this->update($dnOfGroup, $entry);
438
    }
439
440
    /**
441
     * Returns the dn of the first user with the given uid
442
     *
443
     * @param string $uid The uid of the user
444
     * @return string dn of the first user with the given uid
445
     * @throws LdapException
446
     */
447
    public function findUserDN($uid)
448
    {
449
        // return early if we deal with a DN anyways
450
        if (Dn::checkDn($uid)) {
451
            return $uid;
452
        }
453
        $results = $this->search(
454
            sprintf('(&(objectClass=inetOrgPerson)(uid=%s))', $uid),
455
            'ou=people,o=sog-de,dc=sog',
456
            self::SEARCH_SCOPE_SUB,
457
            ['dn'],
458
            'dn'
459
        );
460
        return $results->getFirst()['dn'];
461
    }
462
463
    /**
464
     * Move a (new) inactive member to the active subtree. Being in ou=active is required for certain actions such as
465
     * accessing the Dashboard or Open Atrium.
466
     *
467
     * @param string $uid The username for the member to be activated
468
     * @throws LdapException
469
     */
470
    public function activateMember($uid)
471
    {
472
        $active = sprintf('uid=%s,ou=active,ou=people,o=sog-de,dc=sog', $uid);
473
        $inactive = sprintf('uid=%s,ou=inactive,ou=people,o=sog-de,dc=sog', $uid);
474
        $this->move($inactive, $active);
475
476
        $this->refreshPendingRequests($inactive, $active);
477
    }
478
479
    /**
480
     * For all groups, update the pending field from the inactive DN to the active DN.
481
     *
482
     * @param string $from Inactive DN
483
     * @param string $to Active DN
484
     * @throws LdapException
485
     */
486
    private function refreshPendingRequests($from, $to)
487
    {
488
        $results = $this->search(
489
            sprintf('(&(objectClass=groupOfNames)(pending=%s))', $from),
490
            'ou=groups,o=sog-de,dc=sog',
491
            self::SEARCH_SCOPE_ONE,
492
            ['ou']
493
        );
494
495
        foreach ($results as $group) {
496
            $this->dropMembershipRequest($from, Attribute::getAttribute($group, 'ou', 0));
0 ignored issues
show
It seems like $group defined by $group on line 495 can also be of type null; however, Zend\Ldap\Attribute::getAttribute() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
497
            $this->requestGroupMembership($to, Attribute::getAttribute($group, 'ou', 0));
0 ignored issues
show
It seems like $group defined by $group on line 495 can also be of type null; however, Zend\Ldap\Attribute::getAttribute() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
498
        }
499
    }
500
501
    /**
502
     * Remove a membership request for $group. This will remove the user's dn from the `pending` attribute of the $group
503
     *
504
     * @param string $uid The username of the user who has done the request
505
     * @param string $group The group for which the request shall be removed, we expect the `ou` value
506
     * @throws LdapException If group can't be found or update wasn't successful
507
     * @return boolean True, if pending contained $user and the entry has been deleted; false otherwise
508
     */
509 View Code Duplication
    public function dropMembershipRequest($uid, $group)
0 ignored issues
show
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...
510
    {
511
        $dnOfGroup = sprintf('ou=%s,ou=groups,o=sog-de,dc=sog', $group);
512
        $entry = $this->getEntry($dnOfGroup);
513
        if (is_null($entry)) {
514
            throw new LdapException($this, sprintf('Can\'t find group %s', $group));
515
        }
516
        $dnOfUser = $this->findUserDN($uid);
517
        if (!Attribute::attributeHasValue($entry, 'pending', $dnOfUser)) {
518
            return false;
519
        }
520
        Attribute::removeFromAttribute($entry, 'pending', $dnOfUser);
521
        $this->update($dnOfGroup, $entry);
522
        return true;
523
    }
524
525
    /**
526
     * Requesting access for the given user to $group. This will add an entry to the `pending` attribute of the $group
527
     *
528
     * @param string $uid The username for which to request the membership in $group
529
     * @param string $group The group for which the membership of $user is requested, we expect the `ou` value
530
     * @throws LdapException If group can't be found or update wasn't successful
531
     * @return boolean True, if pending didn't already contain $user; false otherwise (also when already a member)
532
     */
533
    public function requestGroupMembership($uid, $group)
534
    {
535
        $dnOfGroup = sprintf('ou=%s,ou=groups,o=sog-de,dc=sog', $group);
536
        $entry = $this->getEntry($dnOfGroup);
537
        if (is_null($entry)) {
538
            throw new LdapException($this, sprintf('Can\'t find group %s', $group));
539
        }
540
        $dnOfUser = $this->findUserDN($uid);
541
        if (Attribute::attributeHasValue($entry, 'member', $dnOfUser) || Attribute::attributeHasValue($entry, 'pending', $dnOfUser)) {
542
            return false;
543
        }
544
        Attribute::setAttribute($entry, 'pending', $dnOfUser, true);
545
        $this->update($dnOfGroup, $entry);
546
        return true;
547
    }
548
549
    /**
550
     * Move an active member to the inactive subtree, thus preventing him/her from logging on to certain services.
551
     *
552
     * @param string $uid The username of the member to be deactivated
553
     * @throws LdapException
554
     */
555
    public function deactivateMember($uid)
556
    {
557
        $active = sprintf('uid=%s,ou=active,ou=people,o=sog-de,dc=sog', $uid);
558
        $inactive = sprintf('uid=%s,ou=inactive,ou=people,o=sog-de,dc=sog', $uid);
559
        $this->move($active, $inactive);
560
    }
561
}
562