Issues (195)

includes/Pages/Statistics/StatsUsers.php (1 issue)

Severity
1
<?php
2
/******************************************************************************
3
 * Wikipedia Account Creation Assistance tool                                 *
4
 *                                                                            *
5
 * All code in this file is released into the public domain by the ACC        *
6
 * Development Team. Please see team.json for a list of contributors.         *
7
 ******************************************************************************/
8
9
namespace Waca\Pages\Statistics;
10
11
use PDO;
12
use Waca\DataObjects\Domain;
13
use Waca\DataObjects\EmailTemplate;
14
use Waca\DataObjects\Log;
15
use Waca\DataObjects\User;
16
use Waca\Exceptions\ApplicationLogicException;
17
use Waca\Helpers\LogHelper;
18
use Waca\Helpers\OAuthUserHelper;
19
use Waca\Helpers\SearchHelpers\LogSearchHelper;
20
use Waca\IdentificationVerifier;
21
use Waca\Pages\PageUserManagement;
22
use Waca\Tasks\InternalPageBase;
23
use Waca\WebRequest;
24
25
class StatsUsers extends InternalPageBase
26
{
27
    public function main()
28
    {
29
        $this->setHtmlTitle('Users :: Statistics');
30
31
        $database = $this->getDatabase();
32
33
        $query = <<<SQL
34
SELECT
35
    u.id
36
    , u.username
37
    , CASE WHEN ru.role IS NOT NULL THEN 'Yes' ELSE 'No' END tooluser
38
    , CASE WHEN ra.role IS NOT NULL THEN 'Yes' ELSE 'No' END tooladmin
39
    , CASE WHEN rc.role IS NOT NULL THEN 'Yes' ELSE 'No' END checkuser
40
    , CASE WHEN rr.role IS NOT NULL THEN 'Yes' ELSE 'No' END toolroot
41
FROM user u
42
    LEFT JOIN userrole ru ON ru.user = u.id AND ru.role = 'user'
43
    LEFT JOIN userrole ra ON ra.user = u.id AND ra.role = 'admin'
44
    LEFT JOIN userrole rc ON rc.user = u.id AND rc.role = 'checkuser'
45
    LEFT JOIN userrole rr ON rr.user = u.id AND rr.role = 'toolRoot'
46
WHERE u.status = 'Active'
47
SQL;
48
49
        $users = $database->query($query)->fetchAll(PDO::FETCH_ASSOC);
50
        $this->assign('users', $users);
51
52
        $this->assign('statsPageTitle', 'Account Creation Tool users');
53
        $this->setTemplate("statistics/users.tpl");
54
    }
55
56
    /**
57
     * Entry point for the detail action.
58
     *
59
     * @throws ApplicationLogicException
60
     */
61
    protected function detail()
62
    {
63
        $userId = WebRequest::getInt('user');
64
        if ($userId === null) {
65
            throw new ApplicationLogicException("User not found");
66
        }
67
68
        $database = $this->getDatabase();
69
70
        $user = User::getById($userId, $database);
71
        if ($user == false) {
0 ignored issues
show
The condition $user == false is always false.
Loading history...
72
            throw new ApplicationLogicException('User not found');
73
        }
74
75
76
        $activitySummary = $database->prepare(<<<SQL
77
SELECT COALESCE(closes.mail_desc, log.action) AS action, COUNT(*) AS count
78
FROM log
79
INNER JOIN user ON log.user = user.id
80
LEFT JOIN closes ON log.action = closes.closes
81
WHERE user.username = :username
82
GROUP BY action;
83
SQL
84
        );
85
        $activitySummary->execute(array(":username" => $user->getUsername()));
86
        $activitySummaryData = $activitySummary->fetchAll(PDO::FETCH_ASSOC);
87
88
        $this->assign("user", $user);
89
        $this->assign("activity", $activitySummaryData);
90
91
        $usersCreatedQuery = $database->prepare(<<<SQL
92
SELECT log.timestamp time, request.name name, request.id id
93
FROM log
94
INNER JOIN request ON (request.id = log.objectid AND log.objecttype = 'Request')
95
INNER JOIN user ON log.user = user.id
96
LEFT JOIN emailtemplate ON concat('Closed ', emailtemplate.id) = log.action
97
WHERE user.username = :username
98
    AND log.action LIKE 'Closed %'
99
    AND (emailtemplate.defaultaction = :created OR log.action = 'Closed custom-y')
100
ORDER BY log.timestamp;
101
SQL
102
        );
103
        $usersCreatedQuery->execute(array(":username" => $user->getUsername(), ':created' => EmailTemplate::ACTION_CREATED));
104
        $usersCreated = $usersCreatedQuery->fetchAll(PDO::FETCH_ASSOC);
105
        $this->assign("created", $usersCreated);
106
107
        $usersNotCreatedQuery = $database->prepare(<<<SQL
108
SELECT log.timestamp time, request.name name, request.id id
109
FROM log
110
JOIN request ON request.id = log.objectid AND log.objecttype = 'Request'
111
JOIN user ON log.user = user.id
112
LEFT JOIN emailtemplate ON concat('Closed ', emailtemplate.id) = log.action
113
WHERE user.username = :username
114
    AND log.action LIKE 'Closed %'
115
    AND (emailtemplate.defaultaction = :created OR log.action = 'Closed custom-n' OR log.action = 'Closed 0')
116
ORDER BY log.timestamp;
117
SQL
118
        );
119
        $usersNotCreatedQuery->execute(array(":username" => $user->getUsername(), ':created' => EmailTemplate::ACTION_NOT_CREATED));
120
        $usersNotCreated = $usersNotCreatedQuery->fetchAll(PDO::FETCH_ASSOC);
121
        $this->assign("notcreated", $usersNotCreated);
122
123
        /** @var Log[] $logs */
124
        $logs = LogSearchHelper::get($database)
125
            ->byObjectType('User')
126
            ->byObjectId($user->getId())
127
            ->getRecordCount($logCount)
128
            ->fetch();
129
130
        if ($logCount === 0) {
131
            $this->assign('accountlog', array());
132
        }
133
        else {
134
            list($users, $logData) = LogHelper::prepareLogsForTemplate($logs, $database, $this->getSiteConfiguration());
135
136
            $this->assign("accountlog", $logData);
137
            $this->assign("users", $users);
138
        }
139
140
        $currentUser = User::getCurrent($database);
141
        $this->assign('canApprove', $this->barrierTest('approve', $currentUser, PageUserManagement::class));
142
        $this->assign('canDecline', $this->barrierTest('decline', $currentUser, PageUserManagement::class));
143
        $this->assign('canRename', $this->barrierTest('rename', $currentUser, PageUserManagement::class));
144
        $this->assign('canEditUser', $this->barrierTest('editUser', $currentUser, PageUserManagement::class));
145
        $this->assign('canSuspend', $this->barrierTest('suspend', $currentUser, PageUserManagement::class));
146
        $this->assign('canEditRoles', $this->barrierTest('editRoles', $currentUser, PageUserManagement::class));
147
148
        $oauth = new OAuthUserHelper($user, $database, $this->getOAuthProtocolHelper(), $this->getSiteConfiguration());
149
        $this->assign('oauth', $oauth);
150
151
        if ($user->getForceIdentified() === null) {
152
            $idVerifier = new IdentificationVerifier($this->getHttpHelper(), $this->getSiteConfiguration(), $this->getDatabase());
153
            $this->assign('identificationStatus', $idVerifier->isUserIdentified($user->getOnWikiName()) ? 'detected' : 'missing');
154
        }
155
        else {
156
            $this->assign('identificationStatus', $user->getForceIdentified() == 1 ? 'forced-on' : 'forced-off');
157
        }
158
159
        if ($oauth->isFullyLinked()) {
160
            $this->assign('identity', $oauth->getIdentity(true));
161
            $this->assign('identityExpired', $oauth->identityExpired());
162
        }
163
164
        $this->assign('statsPageTitle', 'Account Creation Tool users');
165
166
        // FIXME: domains!
167
        /** @var Domain $domain */
168
        $domain = Domain::getById(1, $this->getDatabase());
169
        $this->assign('mediawikiScriptPath', $domain->getWikiArticlePath());
170
171
        $this->setHtmlTitle('{$user->getUsername()|escape} :: Users :: Statistics');
172
        $this->setTemplate("statistics/userdetail.tpl");
173
    }
174
}
175