Issues (186)

includes/Pages/PageQueueManagement.php (8 issues)

1
<?php
2
/******************************************************************************
3
 * Wikipedia Account Creation Assistance tool                                 *
4
 * ACC Development Team. Please see team.json for a list of contributors.     *
5
 *                                                                            *
6
 * This is free and unencumbered software released into the public domain.    *
7
 * Please see LICENSE.md for the full licencing statement.                    *
8
 ******************************************************************************/
9
10
namespace Waca\Pages;
11
12
use Waca\DataObjects\RequestQueue;
13
use Waca\DataObjects\User;
14
use Waca\Helpers\Logger;
15
use Waca\Helpers\RequestQueueHelper;
16
use Waca\SessionAlert;
17
use Waca\Tasks\InternalPageBase;
18
use Waca\WebRequest;
19
20
class PageQueueManagement extends InternalPageBase
21
{
22
    /** @var RequestQueueHelper */
23
    private $helper;
24
25
    public function __construct()
26
    {
27
        $this->helper = new RequestQueueHelper();
28
    }
29
30
    protected function main()
31
    {
32
        $this->setHtmlTitle('Request Queue Management');
33
34
        $database = $this->getDatabase();
35
        $queues = RequestQueue::getAllQueues($database);
36
37
        $this->assign('queues', $queues);
38
39
        $user = User::getCurrent($database);
40
        $this->assign('canCreate', $this->barrierTest('create', $user));
41
        $this->assign('canEdit', $this->barrierTest('edit', $user));
42
43
        $this->setTemplate('queue-management/main.tpl');
44
    }
45
46
    protected function create()
47
    {
48
        if (WebRequest::wasPosted()) {
49
            $this->validateCSRFToken();
50
            $database = $this->getDatabase();
51
52
            $queue = new RequestQueue();
53
54
            $queue->setDatabase($database);
55
            $queue->setDomain(1); // FIXME: domain
56
57
            $queue->setHeader(WebRequest::postString('header'));
0 ignored issues
show
It seems like Waca\WebRequest::postString('header') can also be of type null; however, parameter $header of Waca\DataObjects\RequestQueue::setHeader() 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

57
            $queue->setHeader(/** @scrutinizer ignore-type */ WebRequest::postString('header'));
Loading history...
58
            $queue->setDisplayName(WebRequest::postString('displayName'));
0 ignored issues
show
It seems like Waca\WebRequest::postString('displayName') can also be of type null; however, parameter $displayName of Waca\DataObjects\RequestQueue::setDisplayName() 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

58
            $queue->setDisplayName(/** @scrutinizer ignore-type */ WebRequest::postString('displayName'));
Loading history...
59
            $queue->setApiName(WebRequest::postString('apiName'));
0 ignored issues
show
It seems like Waca\WebRequest::postString('apiName') can also be of type null; however, parameter $apiName of Waca\DataObjects\RequestQueue::setApiName() 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

59
            $queue->setApiName(/** @scrutinizer ignore-type */ WebRequest::postString('apiName'));
Loading history...
60
            $queue->setEnabled(WebRequest::postBoolean('enabled'));
61
            $queue->setDefault(WebRequest::postBoolean('default') && WebRequest::postBoolean('enabled'));
62
            $queue->setDefaultAntispoof(WebRequest::postBoolean('antispoof') && WebRequest::postBoolean('enabled'));
63
            $queue->setDefaultTitleBlacklist(WebRequest::postBoolean('titleblacklist') && WebRequest::postBoolean('enabled'));
64
            $queue->setHelp(WebRequest::postString('help'));
65
            $queue->setLogName(WebRequest::postString('logName'));
0 ignored issues
show
It seems like Waca\WebRequest::postString('logName') can also be of type null; however, parameter $logName of Waca\DataObjects\RequestQueue::setLogName() 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

65
            $queue->setLogName(/** @scrutinizer ignore-type */ WebRequest::postString('logName'));
Loading history...
Deprecated Code introduced by
The function Waca\DataObjects\RequestQueue::setLogName() has been deprecated. ( Ignorable by Annotation )

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

65
            /** @scrutinizer ignore-deprecated */ $queue->setLogName(WebRequest::postString('logName'));
Loading history...
66
67
            $proceed = true;
68
69
            if (RequestQueue::getByApiName($database, $queue->getApiName(), 1) !== false) {
70
                // FIXME: domain
71
                SessionAlert::error("The chosen API name is already in use. Please choose another.");
72
                $proceed = false;
73
            }
74
75
            if (preg_match('/^[A-Za-z][a-zA-Z0-9_-]*$/', $queue->getApiName()) !== 1) {
76
                SessionAlert::error("The chosen API name contains invalid characters");
77
                $proceed = false;
78
            }
79
80
            if (RequestQueue::getByDisplayName($database, $queue->getDisplayName(), 1) !== false) {
81
                // FIXME: domain
82
                SessionAlert::error("The chosen target display name is already in use. Please choose another.");
83
                $proceed = false;
84
            }
85
86
            if (RequestQueue::getByHeader($database, $queue->getHeader(), 1) !== false) {
87
                // FIXME: domain
88
                SessionAlert::error("The chosen header is already in use. Please choose another.");
89
                $proceed = false;
90
            }
91
92
            if ($proceed) {
93
                $queue->save();
94
                Logger::requestQueueCreated($database, $queue);
95
                $this->redirect('queueManagement');
96
            }
97
            else {
98
                $this->populateFromObject($queue);
99
100
                $this->assign('createMode', true);
101
                $this->setTemplate('queue-management/edit.tpl');
102
            }
103
        }
104
        else {
105
            $this->assign('header', null);
106
            $this->assign('displayName', null);
107
            $this->assign('apiName', null);
108
            $this->assign('enabled', false);
109
            $this->assign('antispoof', false);
110
            $this->assign('isTarget', false);
111
            $this->assign('titleblacklist', false);
112
            $this->assign('default', false);
113
            $this->assign('help', null);
114
            $this->assign('logName', null);
115
116
            $this->assignCSRFToken();
117
            $this->assign('createMode', true);
118
            $this->setTemplate('queue-management/edit.tpl');
119
        }
120
    }
121
122
    protected function edit()
123
    {
124
        $database = $this->getDatabase();
125
126
        $id = WebRequest::getInt('queue');
127
        if ($id === null) {
128
            $this->redirect('queueManagement');
129
130
            return;
131
        }
132
133
        /** @var RequestQueue $queue */
134
        $queue = RequestQueue::getById($id, $database);
135
136
        if (WebRequest::wasPosted()) {
137
            $this->validateCSRFToken();
138
139
            $this->helper->configureDefaults(
140
                $queue,
141
                WebRequest::postBoolean('enabled'),
142
                WebRequest::postBoolean('default'),
143
                WebRequest::postBoolean('antispoof'),
144
                WebRequest::postBoolean('titleblacklist'),
145
                $this->helper->isEmailTemplateTarget($queue, $this->getDatabase()) || $this->helper->isRequestFormTarget($queue, $this->getDatabase()));
146
147
            $queue->setHeader(WebRequest::postString('header'));
0 ignored issues
show
It seems like Waca\WebRequest::postString('header') can also be of type null; however, parameter $header of Waca\DataObjects\RequestQueue::setHeader() 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

147
            $queue->setHeader(/** @scrutinizer ignore-type */ WebRequest::postString('header'));
Loading history...
148
            $queue->setDisplayName(WebRequest::postString('displayName'));
0 ignored issues
show
It seems like Waca\WebRequest::postString('displayName') can also be of type null; however, parameter $displayName of Waca\DataObjects\RequestQueue::setDisplayName() 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

148
            $queue->setDisplayName(/** @scrutinizer ignore-type */ WebRequest::postString('displayName'));
Loading history...
149
            $queue->setHelp(WebRequest::postString('help'));
150
151
            $proceed = true;
152
153
            $foundRequestQueue = RequestQueue::getByDisplayName($database, $queue->getDisplayName(), 1);
154
            if ($foundRequestQueue !== false && $foundRequestQueue->getId() !== $queue->getId()) {
155
                // FIXME: domain
156
                SessionAlert::error("The chosen target display name is already in use. Please choose another.");
157
                $proceed = false;
158
            }
159
160
            $foundRequestQueue = RequestQueue::getByHeader($database, $queue->getHeader(), 1);
161
            if ($foundRequestQueue !== false && $foundRequestQueue->getId() !== $queue->getId()) {
162
                // FIXME: domain
163
                SessionAlert::error("The chosen header is already in use. Please choose another.");
164
                $proceed = false;
165
            }
166
167
            if ($proceed) {
168
                Logger::requestQueueEdited($database, $queue);
169
                $queue->save();
170
                $this->redirect('queueManagement');
171
            }
172
            else {
173
                $this->populateFromObject($queue);
174
175
                $this->assign('createMode', false);
176
                $this->setTemplate('queue-management/edit.tpl');
177
            }
178
        }
179
        else {
180
            $this->populateFromObject($queue);
181
182
            $this->assign('createMode', false);
183
            $this->setTemplate('queue-management/edit.tpl');
184
        }
185
    }
186
187
    /**
188
     * @param RequestQueue $queue
189
     */
190
    protected function populateFromObject(RequestQueue $queue): void
191
    {
192
        $this->assignCSRFToken();
193
194
        $this->assign('header', $queue->getHeader());
195
        $this->assign('displayName', $queue->getDisplayName());
196
        $this->assign('apiName', $queue->getApiName());
197
        $this->assign('enabled', $queue->isEnabled());
198
        $this->assign('default', $queue->isDefault());
199
        $this->assign('antispoof', $queue->isDefaultAntispoof());
200
        $this->assign('titleblacklist', $queue->isDefaultTitleBlacklist());
201
        $this->assign('help', $queue->getHelp());
202
        $this->assign('logName', $queue->getLogName());
0 ignored issues
show
Deprecated Code introduced by
The function Waca\DataObjects\RequestQueue::getLogName() has been deprecated. ( Ignorable by Annotation )

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

202
        $this->assign('logName', /** @scrutinizer ignore-deprecated */ $queue->getLogName());
Loading history...
203
204
        $isQueueTarget = $this->helper->isEmailTemplateTarget($queue, $this->getDatabase());
205
        $isFormTarget = $this->helper->isRequestFormTarget($queue, $this->getDatabase());
206
        $this->assign('isTarget', $isQueueTarget);
207
        $this->assign('isFormTarget', $isFormTarget);
208
    }
209
}