Passed
Push — master ( 3c190c...2857c2 )
by Robbie
03:26
created

LDAPMigrateExistingMembersTask   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 67
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 67
rs 10
c 0
b 0
f 0
wmc 7

2 Methods

Rating   Name   Duplication   Size   Complexity  
B run() 0 37 5
A log() 0 4 2
1
<?php
2
3
namespace SilverStripe\LDAP\Tasks;
4
5
use SilverStripe\Control\Director;
6
use SilverStripe\Control\HTTPRequest;
7
use SilverStripe\Core\Convert;
8
use SilverStripe\Dev\BuildTask;
9
use SilverStripe\LDAP\Services\LDAPService;
10
use SilverStripe\Security\Member;
11
12
/**
13
 * Class LDAPMigrateExistingMembersTask
14
 *
15
 * Migrate existing Member records in SilverStripe into "LDAP Members"
16
 * by matching existing emails with ones that exist in AD.
17
 */
18
class LDAPMigrateExistingMembersTask extends BuildTask
19
{
20
    /**
21
     * {@inheritDoc}
22
     * @var string
23
     */
24
    private static $segment = 'LDAPMigrateExistingMembersTask';
0 ignored issues
show
Unused Code introduced by
The property $segment is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
25
26
    /**
27
     * @var array
28
     */
29
    private static $dependencies = [
0 ignored issues
show
Unused Code introduced by
The property $dependencies is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
30
        'ldapService' => '%$' . LDAPService::class,
31
    ];
32
33
    /**
34
     * {@inheritDoc}
35
     * @param HTTPRequest $request
36
     */
37
    public function run($request)
38
    {
39
        $users = $this->ldapService->getUsers(['objectguid', 'mail']);
0 ignored issues
show
Bug Best Practice introduced by
The property ldapService does not exist on SilverStripe\LDAP\Tasks\...rateExistingMembersTask. Did you maybe forget to declare it?
Loading history...
40
        $start = time();
41
        $count = 0;
42
43
        foreach ($users as $user) {
44
            // Empty mail attribute for the user, nothing we can do. Skip!
45
            if (empty($user['mail'])) {
46
                continue;
47
            }
48
49
            $member = Member::get()->where(
50
                sprintf('"Email" = \'%s\' AND "GUID" IS NULL', Convert::raw2sql($user['mail']))
0 ignored issues
show
Bug introduced by
It seems like SilverStripe\Core\Convert::raw2sql($user['mail']) can also be of type array; however, parameter $args of sprintf() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

50
                sprintf('"Email" = \'%s\' AND "GUID" IS NULL', /** @scrutinizer ignore-type */ Convert::raw2sql($user['mail']))
Loading history...
51
            )->first();
52
53
            if (!($member && $member->exists())) {
54
                continue;
55
            }
56
57
            // Member was found, migrate them by setting the GUID field
58
            $member->GUID = $user['objectguid'];
59
            $member->write();
60
61
            $count++;
62
63
            $this->log(sprintf(
64
                'Migrated Member %s (ID: %s, Email: %s)',
65
                $member->getName(),
66
                $member->ID,
67
                $member->Email
68
            ));
69
        }
70
71
        $end = time() - $start;
72
73
        $this->log(sprintf('Done. Migrated %s Member records. Duration: %s seconds', $count, round($end, 0)));
74
    }
75
76
    /**
77
     * Sends a message, formatted either for the CLI or browser
78
     *
79
     * @param string $message
80
     */
81
    protected function log($message)
82
    {
83
        $message = sprintf('[%s] ', date('Y-m-d H:i:s')) . $message;
84
        echo Director::is_cli() ? ($message . PHP_EOL) : ($message . '<br>');
85
    }
86
}
87