This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | /** |
||
4 | * The REST API. |
||
5 | * |
||
6 | * |
||
7 | * |
||
8 | * This Source Code Form is subject to the terms of the Mozilla Public License, |
||
9 | * v. 2.0. If a copy of the MPL was not distributed with this file, You can |
||
10 | * obtain one at http://mozilla.org/MPL/2.0/. |
||
11 | * |
||
12 | * @package phpMyFAQ |
||
13 | * @author Thorsten Rinne <[email protected]> |
||
14 | * @copyright 2009-2019 phpMyFAQ Team |
||
15 | * @license http://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0 |
||
16 | * @link https://www.phpmyfaq.de |
||
17 | * @since 2009-09-03 |
||
18 | */ |
||
19 | |||
20 | define('IS_VALID_PHPMYFAQ', null); |
||
21 | |||
22 | use phpMyFAQ\Attachment\Factory; |
||
23 | use phpMyFAQ\Category; |
||
24 | use phpMyFAQ\Comment; |
||
25 | use phpMyFAQ\Faq; |
||
26 | use phpMyFAQ\Filter; |
||
27 | use phpMyFAQ\Helper\HttpHelper; |
||
28 | use phpMyFAQ\Language; |
||
29 | use phpMyFAQ\Language\Plurals; |
||
30 | use phpMyFAQ\News; |
||
31 | use phpMyFAQ\Search; |
||
32 | use phpMyFAQ\Search\Resultset; |
||
33 | use phpMyFAQ\Services; |
||
34 | use phpMyFAQ\Strings; |
||
35 | use phpMyFAQ\Tags; |
||
36 | use phpMyFAQ\User\CurrentUser; |
||
37 | use phpMyFAQ\Utils; |
||
38 | |||
39 | // |
||
40 | // Bootstrapping |
||
41 | // |
||
42 | require 'src/Bootstrap.php'; |
||
43 | |||
44 | // |
||
45 | // Send headers |
||
46 | // |
||
47 | $http = new HttpHelper(); |
||
48 | $http->setContentType('application/json'); |
||
49 | $http->addHeader(); |
||
50 | |||
51 | // |
||
52 | // Set user permissions |
||
53 | // |
||
54 | $currentUser = -1; |
||
55 | $currentGroups = array(-1); |
||
56 | $auth = false; |
||
57 | |||
58 | $action = Filter::filterInput(INPUT_GET, 'action', FILTER_SANITIZE_STRING); |
||
59 | $language = Filter::filterInput(INPUT_GET, 'lang', FILTER_SANITIZE_STRING, 'en'); |
||
60 | $categoryId = Filter::filterInput(INPUT_GET, 'categoryId', FILTER_VALIDATE_INT); |
||
61 | $recordId = Filter::filterInput(INPUT_GET, 'recordId', FILTER_VALIDATE_INT); |
||
62 | $tagId = Filter::filterInput(INPUT_GET, 'tagId', FILTER_VALIDATE_INT); |
||
63 | |||
64 | $faqusername = Filter::filterInput(INPUT_POST, 'faqusername', FILTER_SANITIZE_STRING); |
||
65 | $faqpassword = Filter::filterInput(INPUT_POST, 'faqpassword', FILTER_SANITIZE_STRING); |
||
66 | |||
67 | // |
||
68 | // Get language (default: english) |
||
69 | // |
||
70 | $Language = new Language($faqConfig); |
||
71 | $language = $Language->setLanguage($faqConfig->get('main.languageDetection'), $faqConfig->get('main.language')); |
||
72 | |||
73 | // |
||
74 | // Set language |
||
75 | // |
||
76 | if (Language::isASupportedLanguage($language)) { |
||
77 | require LANGUAGE_DIR.'/language_'.$language.'.php'; |
||
78 | } else { |
||
79 | require LANGUAGE_DIR.'/language_en.php'; |
||
80 | } |
||
81 | $faqConfig->setLanguage($Language); |
||
82 | |||
83 | $plr = new Plurals($PMF_LANG); |
||
84 | Strings::init($language); |
||
85 | |||
86 | // |
||
87 | // Set empty result |
||
88 | $result = []; |
||
89 | |||
90 | // |
||
91 | // Check if user is already authenticated |
||
92 | // |
||
93 | if (is_null($faqusername) && is_null($faqpassword)) { |
||
94 | |||
95 | $currentUser = CurrentUser::getFromCookie($faqConfig); |
||
96 | // authenticate with session information |
||
97 | if (!$currentUser instanceof CurrentUser) { |
||
98 | $currentUser = CurrentUser::getFromSession($faqConfig); |
||
99 | } |
||
100 | if ($currentUser instanceof CurrentUser) { |
||
101 | $auth = true; |
||
102 | } else { |
||
103 | $currentUser = new CurrentUser($faqConfig); |
||
104 | } |
||
105 | } |
||
106 | |||
107 | // |
||
108 | // Handle actions |
||
109 | // |
||
110 | switch ($action) { |
||
111 | |||
112 | case 'getVersion': |
||
113 | $result = ['version' => $faqConfig->get('main.currentVersion')]; |
||
114 | break; |
||
115 | |||
116 | case 'getApiVersion': |
||
117 | $result = ['apiVersion' => $faqConfig->get('main.currentApiVersion')]; |
||
118 | break; |
||
119 | |||
120 | case 'getCount': |
||
121 | $faq = new Faq($faqConfig); |
||
122 | $faq->setUser($currentUser); |
||
0 ignored issues
–
show
|
|||
123 | $faq->setGroups($currentGroups); |
||
124 | $result = ['faqCount' => $faq->getNumberOfRecords($language)]; |
||
125 | break; |
||
126 | |||
127 | case 'getDefaultLanguage': |
||
128 | $result = ['defaultLanguage' => $faqConfig->getLanguage()->getLanguage()]; |
||
129 | break; |
||
130 | |||
131 | case 'search': |
||
132 | $faq = new Faq($faqConfig); |
||
133 | $faq->setUser($currentUser); |
||
0 ignored issues
–
show
It seems like
$currentUser can also be of type object<phpMyFAQ\User\CurrentUser> ; however, phpMyFAQ\Faq::setUser() does only seem to accept integer , maybe add an additional type check?
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check: /**
* @return array|string
*/
function returnsDifferentValues($x) {
if ($x) {
return 'foo';
}
return array();
}
$x = returnsDifferentValues($y);
if (is_array($x)) {
// $x is an array.
}
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue. ![]() |
|||
134 | $faq->setGroups($currentGroups); |
||
135 | $user = new CurrentUser($faqConfig); |
||
136 | $search = new Search($faqConfig); |
||
137 | $search->setCategory(new Category($faqConfig)); |
||
138 | |||
139 | $faqSearchResult = new Resultset($user, $faq, $faqConfig); |
||
140 | $searchString = Filter::filterInput(INPUT_GET, 'q', FILTER_SANITIZE_STRIPPED); |
||
141 | try { |
||
142 | $searchResults = $search->search($searchString, false); |
||
143 | $url = $faqConfig->getDefaultUrl().'index.php?action=faq&cat=%d&id=%d&artlang=%s'; |
||
144 | $faqSearchResult->reviewResultset($searchResults); |
||
0 ignored issues
–
show
It seems like
$searchResults defined by $search->search($searchString, false) on line 142 can also be of type resource ; however, phpMyFAQ\Search\Resultset::reviewResultset() does only seem to accept array , maybe add an additional type check?
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check: /**
* @return array|string
*/
function returnsDifferentValues($x) {
if ($x) {
return 'foo';
}
return array();
}
$x = returnsDifferentValues($y);
if (is_array($x)) {
// $x is an array.
}
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue. ![]() |
|||
145 | foreach ($faqSearchResult->getResultset() as $data) { |
||
146 | $data->answer = html_entity_decode(strip_tags($data->answer), ENT_COMPAT, 'utf-8'); |
||
147 | $data->answer = Utils::makeShorterText($data->answer, 12); |
||
148 | $data->link = sprintf($url, $data->category_id, $data->id, $data->lang); |
||
149 | $result[] = $data; |
||
150 | } |
||
151 | } catch (Search\Exception $e) { |
||
152 | $result = ['error' => $e->getMessage()]; |
||
153 | } |
||
154 | break; |
||
155 | |||
156 | case 'getCategories': |
||
157 | $category = new Category($faqConfig, $currentGroups, true); |
||
158 | $category->setUser($currentUser); |
||
0 ignored issues
–
show
It seems like
$currentUser can also be of type object<phpMyFAQ\User\CurrentUser> ; however, phpMyFAQ\Category::setUser() does only seem to accept integer , maybe add an additional type check?
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check: /**
* @return array|string
*/
function returnsDifferentValues($x) {
if ($x) {
return 'foo';
}
return array();
}
$x = returnsDifferentValues($y);
if (is_array($x)) {
// $x is an array.
}
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue. ![]() |
|||
159 | $category->setGroups($currentGroups); |
||
160 | $result = array_values($category->getAllCategories()); |
||
161 | break; |
||
162 | |||
163 | case 'getFaqs': |
||
164 | $faq = new Faq($faqConfig); |
||
165 | $faq->setUser($currentUser); |
||
0 ignored issues
–
show
It seems like
$currentUser can also be of type object<phpMyFAQ\User\CurrentUser> ; however, phpMyFAQ\Faq::setUser() does only seem to accept integer , maybe add an additional type check?
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check: /**
* @return array|string
*/
function returnsDifferentValues($x) {
if ($x) {
return 'foo';
}
return array();
}
$x = returnsDifferentValues($y);
if (is_array($x)) {
// $x is an array.
}
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue. ![]() |
|||
166 | $faq->setGroups($currentGroups); |
||
167 | $result = $faq->getAllRecordPerCategory($categoryId); |
||
168 | break; |
||
169 | |||
170 | case 'getFAQsByTag': |
||
171 | $tags = new Tags($faqConfig); |
||
172 | $recordIds = $tags->getRecordsByTagId($tagId); |
||
173 | $faq = new Faq($faqConfig); |
||
174 | $faq->setUser($currentUser); |
||
0 ignored issues
–
show
It seems like
$currentUser can also be of type object<phpMyFAQ\User\CurrentUser> ; however, phpMyFAQ\Faq::setUser() does only seem to accept integer , maybe add an additional type check?
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check: /**
* @return array|string
*/
function returnsDifferentValues($x) {
if ($x) {
return 'foo';
}
return array();
}
$x = returnsDifferentValues($y);
if (is_array($x)) {
// $x is an array.
}
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue. ![]() |
|||
175 | $faq->setGroups($currentGroups); |
||
176 | $result = $faq->getRecordsByIds($recordIds); |
||
177 | break; |
||
178 | |||
179 | case 'getFaq': |
||
180 | $faq = new Faq($faqConfig); |
||
181 | $faq->setUser($currentUser); |
||
0 ignored issues
–
show
It seems like
$currentUser can also be of type object<phpMyFAQ\User\CurrentUser> ; however, phpMyFAQ\Faq::setUser() does only seem to accept integer , maybe add an additional type check?
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check: /**
* @return array|string
*/
function returnsDifferentValues($x) {
if ($x) {
return 'foo';
}
return array();
}
$x = returnsDifferentValues($y);
if (is_array($x)) {
// $x is an array.
}
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue. ![]() |
|||
182 | $faq->setGroups($currentGroups); |
||
183 | $faq->getRecord($recordId); |
||
184 | $result = $faq->faqRecord; |
||
185 | break; |
||
186 | |||
187 | case 'getComments': |
||
188 | $comment = new Comment($faqConfig); |
||
189 | $result = $comment->getCommentsData($recordId, 'faq'); |
||
190 | break; |
||
191 | |||
192 | case 'getAllFaqs': |
||
193 | $faq = new Faq($faqConfig); |
||
194 | $faq->setUser($currentUser); |
||
0 ignored issues
–
show
It seems like
$currentUser can also be of type object<phpMyFAQ\User\CurrentUser> ; however, phpMyFAQ\Faq::setUser() does only seem to accept integer , maybe add an additional type check?
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check: /**
* @return array|string
*/
function returnsDifferentValues($x) {
if ($x) {
return 'foo';
}
return array();
}
$x = returnsDifferentValues($y);
if (is_array($x)) {
// $x is an array.
}
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue. ![]() |
|||
195 | $faq->setGroups($currentGroups); |
||
196 | $faq->getAllRecords(FAQ_SORTING_TYPE_CATID_FAQID, ['lang' => $language]); |
||
197 | $result = $faq->faqRecords; |
||
198 | break; |
||
199 | |||
200 | case 'getFaqAsPdf': |
||
201 | $service = new Services($faqConfig); |
||
202 | $service->setFaqId($recordId); |
||
203 | $service->setLanguage($language); |
||
204 | $service->setCategoryId($categoryId); |
||
205 | |||
206 | $result = ['pdfUrl' => $service->getPdfApiLink()]; |
||
207 | break; |
||
208 | |||
209 | case 'getAttachmentsFromFaq': |
||
210 | $attachments = $result = []; |
||
211 | try { |
||
212 | $attachments = Factory::fetchByRecordId($faqConfig, $recordId); |
||
213 | } catch (\phpMyFAQ\Attachment\Exception $e) { |
||
214 | $result = ['error' => $e->getMessage()]; |
||
215 | } |
||
216 | foreach ($attachments as $attachment) { |
||
217 | $result[] = [ |
||
218 | 'filename' => $attachment->getFilename(), |
||
219 | 'url' => $faqConfig->getDefaultUrl().$attachment->buildUrl(), |
||
220 | ]; |
||
221 | } |
||
222 | break; |
||
223 | |||
224 | View Code Duplication | case 'getPopular': |
|
225 | $faq = new Faq($faqConfig); |
||
226 | $faq->setUser($currentUser); |
||
0 ignored issues
–
show
It seems like
$currentUser can also be of type object<phpMyFAQ\User\CurrentUser> ; however, phpMyFAQ\Faq::setUser() does only seem to accept integer , maybe add an additional type check?
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check: /**
* @return array|string
*/
function returnsDifferentValues($x) {
if ($x) {
return 'foo';
}
return array();
}
$x = returnsDifferentValues($y);
if (is_array($x)) {
// $x is an array.
}
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue. ![]() |
|||
227 | $faq->setGroups($currentGroups); |
||
228 | $result = array_values($faq->getTopTenData(PMF_NUMBER_RECORDS_TOPTEN)); |
||
229 | break; |
||
230 | |||
231 | View Code Duplication | case 'getLatest': |
|
232 | $faq = new Faq($faqConfig); |
||
233 | $faq->setUser($currentUser); |
||
0 ignored issues
–
show
It seems like
$currentUser can also be of type object<phpMyFAQ\User\CurrentUser> ; however, phpMyFAQ\Faq::setUser() does only seem to accept integer , maybe add an additional type check?
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check: /**
* @return array|string
*/
function returnsDifferentValues($x) {
if ($x) {
return 'foo';
}
return array();
}
$x = returnsDifferentValues($y);
if (is_array($x)) {
// $x is an array.
}
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue. ![]() |
|||
234 | $faq->setGroups($currentGroups); |
||
235 | $result = array_values($faq->getLatestData(PMF_NUMBER_RECORDS_LATEST)); |
||
236 | break; |
||
237 | |||
238 | case 'getNews': |
||
239 | $news = new News($faqConfig); |
||
240 | $result = $news->getLatestData(false, true, true); |
||
241 | break; |
||
242 | |||
243 | case 'getPopularSearches': |
||
244 | $search = new Search($faqConfig); |
||
245 | $result = $search->getMostPopularSearches(7, true); |
||
246 | break; |
||
247 | |||
248 | case 'getPopularTags': |
||
249 | $tags = new Tags($faqConfig); |
||
250 | $result = $tags->getPopularTagsAsArray(16); |
||
251 | break; |
||
252 | |||
253 | case 'login': |
||
254 | $currentUser = new CurrentUser($faqConfig); |
||
255 | if ($currentUser->login($faqusername, $faqpassword)) { |
||
256 | if ($currentUser->getStatus() != 'blocked') { |
||
257 | $auth = true; |
||
258 | $result = [ |
||
259 | 'loggedin' => true |
||
260 | ]; |
||
261 | } else { |
||
262 | $result = [ |
||
263 | 'loggedin' => false, |
||
264 | 'error' => $PMF_LANG['ad_auth_fail'].' ('.$faqusername.')' |
||
265 | ]; |
||
266 | } |
||
267 | } else { |
||
268 | $result = [ |
||
269 | 'loggedin' => false, |
||
270 | 'error' => $PMF_LANG['ad_auth_fail'] |
||
271 | ]; |
||
272 | } |
||
273 | break; |
||
274 | } |
||
275 | |||
276 | // |
||
277 | // Check if FAQ should be secured |
||
278 | // |
||
279 | if (!$auth && $faqConfig->get('security.enableLoginOnly')) { |
||
280 | $http->sendJsonWithHeaders( |
||
281 | [ |
||
282 | 'error' => 'You are not allowed to view this content.' |
||
283 | ] |
||
284 | ); |
||
285 | $http->sendStatus(403); |
||
286 | } |
||
287 | |||
288 | $http->sendJsonWithHeaders($result); |
||
289 |
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.