Completed
Push — search ( a5d1cc )
by Simon
13:48 queued 09:49
created

PageSearch   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 166
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 6
Bugs 0 Features 0
Metric Value
wmc 19
eloc 72
c 6
b 0
f 0
dl 0
loc 166
ccs 0
cts 97
cp 0
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
B main() 0 67 8
A getNameSearchResults() 0 4 1
A getEmailSearchResults() 0 9 2
A getCommentSearchResults() 0 11 2
A getIpSearchResults() 0 5 1
A validateSearchParameters() 0 17 5
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;
10
11
use Waca\DataObjects\Request;
12
use Waca\DataObjects\User;
13
use Waca\Exceptions\ApplicationLogicException;
14
use Waca\Fragments\RequestListData;
15
use Waca\Helpers\SearchHelpers\RequestSearchHelper;
16
use Waca\Security\SecurityManager;
17
use Waca\SessionAlert;
18
use Waca\Tasks\PagedInternalPageBase;
19
use Waca\WebRequest;
20
21
class PageSearch extends PagedInternalPageBase
22
{
23
    use RequestListData;
24
25
    /**
26
     * Main function for this page, when no specific actions are called.
27
     */
28
    protected function main()
29
    {
30
        $this->setHtmlTitle('Search');
31
32
        // Dual-mode page
33
        if (WebRequest::getString('type') !== null) {
34
            $searchType = WebRequest::getString('type');
35
            $searchTerm = WebRequest::getString('term');
36
            $excludeNonConfirmed = WebRequest::getBoolean('excludeNonConfirmed');
37
38
            $validationError = "";
39
            if (!$this->validateSearchParameters($searchType, $searchTerm, $validationError)) {
40
                SessionAlert::error($validationError, "Search error");
41
42
                $this->assign('term', $searchTerm);
43
                $this->assign('target', $searchType);
44
                $this->assign('excludeNonConfirmed', $excludeNonConfirmed);
45
                $this->assign('hasResultset', false);
46
                return;
47
            }
48
49
            $requestSearch = RequestSearchHelper::get($this->getDatabase());
50
51
            $this->setSearchHelper($requestSearch);
52
            $this->setupLimits();
53
54
            if ($excludeNonConfirmed) {
55
                $requestSearch->withConfirmedEmail();
56
            }
57
58
            switch ($searchType) {
59
                case 'name':
60
                    $this->getNameSearchResults($requestSearch, $searchTerm);
61
                    break;
62
                case 'email':
63
                    $this->getEmailSearchResults($requestSearch, $searchTerm);
64
                    break;
65
                case 'ip':
66
                    $this->getIpSearchResults($requestSearch, $searchTerm);
67
                    break;
68
                case 'comment':
69
                    $this->getCommentSearchResults($requestSearch, $searchTerm);
70
                    break;
71
            }
72
73
            /** @var Request[] $results */
74
            $results = $requestSearch->getRecordCount($count)->fetch();
75
76
            $this->setupPageData($count, [
77
                'term'                => $searchTerm,
78
                'type'                => $searchType,
79
                'excludeNonConfirmed' => $excludeNonConfirmed,
80
            ]);
81
82
            // deal with results
83
            $this->assign('requests', $this->prepareRequestData($results));
84
            $this->assign('resultCount', count($results));
85
            $this->assign('hasResultset', true);
86
87
            $this->setTemplate('search/main.tpl');
88
        }
89
        else {
90
            $this->assign('target', 'name');
91
            $this->assign('hasResultset', false);
92
            $this->assign('limit', 50);
93
            $this->assign('excludeNonConfirmed', true);
94
            $this->setTemplate('search/main.tpl');
95
        }
96
    }
97
98
    /**
99
     * Gets search results by name
100
     *
101
     * @param RequestSearchHelper $searchHelper
102
     * @param string              $searchTerm
103
     */
104
    private function getNameSearchResults(RequestSearchHelper $searchHelper, $searchTerm)
105
    {
106
        $padded = '%' . $searchTerm . '%';
107
        $searchHelper->byName($padded);
108
    }
109
110
    /**
111
     * Gets search results by comment
112
     *
113
     * @param RequestSearchHelper $searchHelper
114
     * @param string              $searchTerm
115
     */
116
    private function getCommentSearchResults(RequestSearchHelper $searchHelper, $searchTerm)
117
    {
118
        $padded = '%' . $searchTerm . '%';
119
        $searchHelper->byComment($padded);
120
121
        $securityManager = $this->getSecurityManager();
122
        $currentUser = User::getCurrent($this->getDatabase());
123
        $securityResult = $securityManager->allows('RequestData', 'seeRestrictedComments', $currentUser);
124
125
        if ($securityResult !== SecurityManager::ALLOWED) {
126
            $searchHelper->byCommentSecurity(['requester', 'user']);
127
        }
128
    }
129
130
    /**
131
     * Gets search results by email
132
     *
133
     * @param        $searchHelper
134
     * @param string $searchTerm
135
     *
136
     * @throws ApplicationLogicException
137
     */
138
    private function getEmailSearchResults(RequestSearchHelper $searchHelper, $searchTerm)
139
    {
140
        if ($searchTerm === "@") {
141
            throw new ApplicationLogicException('The search term "@" is not valid for email address searches!');
142
        }
143
144
        $padded = '%' . $searchTerm . '%';
145
146
        $searchHelper->byEmailAddress($padded)->excludingPurgedData($this->getSiteConfiguration());
147
    }
148
149
    /**
150
     * Gets search results by IP address or XFF IP address
151
     *
152
     * @param RequestSearchHelper $searchHelper
153
     * @param string              $searchTerm
154
     */
155
    private function getIpSearchResults(RequestSearchHelper $searchHelper, $searchTerm)
156
    {
157
        $searchHelper
158
            ->byIp($searchTerm)
159
            ->excludingPurgedData($this->getSiteConfiguration());
160
    }
161
162
    /**
163
     * @param string $searchType
164
     * @param string $searchTerm
165
     *
166
     * @param string $errorMessage
167
     *
168
     * @return bool true if parameters are valid
169
     */
170
    protected function validateSearchParameters($searchType, $searchTerm, &$errorMessage)
171
    {
172
        if (!in_array($searchType, array('name', 'email', 'ip', 'comment'))) {
173
            $errorMessage = 'Unknown search type';
174
175
            return false;
176
        }
177
178
        if ($searchTerm === '%' || $searchTerm === '' || $searchTerm === null) {
179
            $errorMessage = 'No search term specified entered';
180
181
            return false;
182
        }
183
184
        $errorMessage = "";
185
186
        return true;
187
    }
188
}
189