Failed Conditions
Pull Request — newinternal-releasecandidate (#544)
by Simon
13:56 queued 04:02
created

PageCloseRequest::processClose()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 46
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 24
c 2
b 0
f 0
dl 0
loc 46
rs 9.2248
cc 5
nc 5
nop 0
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\RequestAction;
10
11
use Exception;
12
use Waca\DataObjects\EmailTemplate;
13
use Waca\DataObjects\Request;
14
use Waca\DataObjects\User;
15
use Waca\Exceptions\ApplicationLogicException;
16
use Waca\Helpers\Logger;
17
use Waca\Helpers\RequestEmailHelper;
18
use Waca\PdoDatabase;
19
use Waca\SessionAlert;
20
use Waca\WebRequest;
21
22
class PageCloseRequest extends RequestActionBase
23
{
24
    protected function main()
25
    {
26
        $this->processClose();
27
    }
28
29
    /**
30
     * Main function for this page, when no specific actions are called.
31
     * @throws ApplicationLogicException
32
     */
33
    final protected function processClose()
34
    {
35
        $this->checkPosted();
36
        $database = $this->getDatabase();
37
38
        $currentUser = User::getCurrent($database);
39
        $template = $this->getTemplate($database);
40
        $request = $this->getRequest($database);
41
        $request->setUpdateVersion(WebRequest::postInt('updateversion'));
42
43
        if ($request->getStatus() === 'Closed') {
44
            throw new ApplicationLogicException('Request is already closed');
45
        }
46
47
        if ($this->confirmEmailAlreadySent($request, $template)) {
48
            return;
49
        }
50
51
        if ($this->confirmReserveOverride($request, $template, $currentUser, $database)) {
52
            return;
53
        }
54
55
        if ($this->confirmAccountCreated($request, $template)) {
56
            return;
57
        }
58
59
        // I think we're good here...
60
        $request->setStatus('Closed');
61
        $request->setReserved(null);
62
63
        Logger::closeRequest($database, $request, $template->getId(), null);
64
65
        $request->save();
66
67
        $this->processWelcome($template->getDefaultAction());
68
69
        // Perform the notifications and stuff *after* we've successfully saved, since the save can throw an OLE and
70
        // be rolled back.
71
72
        $this->getNotificationHelper()->requestClosed($request, $template->getName());
73
        $sanitisedTemplateName = htmlentities($template->getName(), ENT_COMPAT, 'UTF-8');
74
        SessionAlert::success("Request {$request->getId()} has been closed as {$sanitisedTemplateName}");
75
76
        $this->sendMail($request, $template->getText(), $currentUser, false);
77
78
        $this->redirect();
79
    }
80
81
    /**
82
     * @param PdoDatabase $database
83
     *
84
     * @return EmailTemplate
85
     * @throws ApplicationLogicException
86
     */
87
    protected function getTemplate(PdoDatabase $database)
88
    {
89
        $templateId = WebRequest::postInt('template');
90
        if ($templateId === null) {
91
            throw new ApplicationLogicException('No template specified');
92
        }
93
94
        /** @var EmailTemplate $template */
95
        $template = EmailTemplate::getById($templateId, $database);
96
        if ($template === false || !$template->getActive()) {
97
            throw new ApplicationLogicException('Invalid or inactive template specified');
98
        }
99
100
        return $template;
101
    }
102
103
    /**
104
     * @param Request       $request
105
     * @param EmailTemplate $template
106
     *
107
     * @return bool
108
     */
109
    protected function confirmEmailAlreadySent(Request $request, EmailTemplate $template)
110
    {
111
        if ($this->checkEmailAlreadySent($request)) {
112
            $this->showConfirmation($request, $template, 'close-confirmations/email-sent.tpl');
113
114
            return true;
115
        }
116
117
        return false;
118
    }
119
120
    protected function checkEmailAlreadySent(Request $request)
121
    {
122
        if ($request->getEmailSent() && !WebRequest::postBoolean('emailSentOverride')) {
123
            return true;
124
        }
125
126
        return false;
127
    }
128
129
    protected function checkReserveOverride(Request $request, User $currentUser)
130
    {
131
        $reservationId = $request->getReserved();
132
133
        if ($reservationId !== 0 && $reservationId !== null) {
134
            if (!WebRequest::postBoolean('reserveOverride')) {
135
                if ($currentUser->getId() !== $reservationId) {
136
                    return true;
137
                }
138
            }
139
        }
140
141
        return false;
142
    }
143
144
    /**
145
     * @param Request       $request
146
     * @param EmailTemplate $template
147
     * @param User          $currentUser
148
     * @param PdoDatabase   $database
149
     *
150
     * @return bool
151
     */
152
    protected function confirmReserveOverride(
153
        Request $request,
154
        EmailTemplate $template,
155
        User $currentUser,
156
        PdoDatabase $database
157
    ) {
158
        if ($this->checkReserveOverride($request, $currentUser)) {
159
            $this->assign('reserveUser', User::getById($request->getReserved(), $database)->getUsername());
160
            $this->showConfirmation($request, $template, 'close-confirmations/reserve-override.tpl');
161
162
            return true;
163
        }
164
165
        return false;
166
    }
167
168
    /**
169
     * @param Request       $request
170
     * @param EmailTemplate $template
171
     *
172
     * @return bool
173
     * @throws \Waca\Exceptions\CurlException
174
     */
175
    protected function confirmAccountCreated(Request $request, EmailTemplate $template)
176
    {
177
        if ($this->checkAccountCreated($request, $template)) {
178
            $this->showConfirmation($request, $template, 'close-confirmations/account-created.tpl');
179
180
            return true;
181
        }
182
183
        return false;
184
    }
185
186
    protected function checkAccountCreated(Request $request, EmailTemplate $template)
187
    {
188
        if ($template->getDefaultAction() === EmailTemplate::CREATED && !WebRequest::postBoolean('createOverride')) {
189
            $parameters = array(
190
                'action'  => 'query',
191
                'list'    => 'users',
192
                'format'  => 'php',
193
                'ususers' => $request->getName(),
194
            );
195
196
            $content = $this->getHttpHelper()->get($this->getSiteConfiguration()->getMediawikiWebServiceEndpoint(),
197
                $parameters);
198
199
            $apiResult = unserialize($content);
200
            $exists = !isset($apiResult['query']['users']['0']['missing']);
201
202
            if (!$exists) {
203
                return true;
204
            }
205
        }
206
207
        return false;
208
    }
209
210
    /**
211
     * @param Request $request
212
     * @param string  $mailText
213
     * @param User    $currentUser
214
     * @param boolean $ccMailingList
215
     */
216
    protected function sendMail(Request $request, $mailText, User $currentUser, $ccMailingList)
217
    {
218
        $requestEmailHelper = new RequestEmailHelper($this->getEmailHelper());
219
        $requestEmailHelper->sendMail($request, $mailText, $currentUser, $ccMailingList);
220
    }
221
222
    /**
223
     * @param Request       $request
224
     * @param EmailTemplate $template
225
     * @param string        $templateName
226
     *
227
     * @throws Exception
228
     * @return void
229
     */
230
    protected function showConfirmation(Request $request, EmailTemplate $template, $templateName)
231
    {
232
        $this->assignCSRFToken();
233
234
        $this->assign('request', $request->getId());
235
        $this->assign('template', $template->getId());
236
237
        $this->assign('updateversion', $request->getUpdateVersion());
238
239
        $this->assign('emailSentOverride', WebRequest::postBoolean('emailSentOverride') ? 'true' : 'false');
240
        $this->assign('reserveOverride', WebRequest::postBoolean('reserveOverride') ? 'true' : 'false');
241
        $this->assign('createOverride', WebRequest::postBoolean('createOverride') ? 'true' : 'false');
242
243
        $this->setTemplate($templateName);
244
    }
245
246
    /**
247
     * @param string $action
248
     *
249
     * @throws ApplicationLogicException
250
     */
251
    final protected function processWelcome(string $action): void
252
    {
253
        $database = $this->getDatabase();
254
        $currentUser = User::getCurrent($database);
255
256
        if ($action !== EmailTemplate::CREATED) {
257
            return;
258
        }
259
260
        if ($currentUser->getWelcomeTemplate() === null) {
0 ignored issues
show
introduced by
The condition $currentUser->getWelcomeTemplate() === null is always false.
Loading history...
261
            return;
262
        }
263
264
        if (WebRequest::postBoolean('skipAutoWelcome')) {
265
            return;
266
        }
267
268
        $this->enqueueWelcomeTask($this->getRequest($database), null, $currentUser, $database);
269
    }
270
}
271