Issues (70)

src/Tasks/LDAPMigrateExistingMembersTask.php (3 issues)

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" by matching existing emails
16
 * with ones that exist in a LDAP database for a given DN.
17
 */
18
class LDAPMigrateExistingMembersTask extends BuildTask
19
{
20
    /**
21
     * {@inheritDoc}
22
     * @var string
23
     */
24
    private static $segment = 'LDAPMigrateExistingMembersTask';
0 ignored issues
show
The private property $segment is not used, and could be removed.
Loading history...
25
26
    /**
27
     * @var array
28
     */
29
    private static $dependencies = [
0 ignored issues
show
The private property $dependencies is not used, and could be removed.
Loading history...
30
        'ldapService' => '%$' . LDAPService::class,
31
    ];
32
33
    /**
34
     * @var LDAPService
35
     */
36
    public $ldapService;
37
38
    /**
39
     * @return string
40
     */
41
    public function getTitle()
42
    {
43
        return _t(__CLASS__ . '.TITLE', 'Migrate existing members in SilverStripe into LDAP members');
44
    }
45
46
    /**
47
     * {@inheritDoc}
48
     * @param HTTPRequest $request
49
     */
50
    public function run($request)
51
    {
52
        $users = $this->ldapService->getUsers(['objectguid', 'mail']);
53
        $start = time();
54
        $count = 0;
55
56
        foreach ($users as $user) {
57
            // Empty mail attribute for the user, nothing we can do. Skip!
58
            if (empty($user['mail'])) {
59
                continue;
60
            }
61
62
            $member = Member::get()->where(
63
                sprintf('"Email" = \'%s\' AND "GUID" IS NULL', Convert::raw2sql($user['mail']))
0 ignored issues
show
It seems like SilverStripe\Core\Convert::raw2sql($user['mail']) can also be of type array and 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

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