PageRenderTime 50ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/phpmyfaq/admin/index.php

http://github.com/thorsten/phpMyFAQ
PHP | 518 lines | 387 code | 30 blank | 101 comment | 56 complexity | 8c167ac3a6d603e72fcf969dfed625e8 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, LGPL-2.1, LGPL-3.0
  1. <?php
  2. /**
  3. * The main admin backend index file.
  4. *
  5. * This Source Code Form is subject to the terms of the Mozilla Public License,
  6. * v. 2.0. If a copy of the MPL was not distributed with this file, You can
  7. * obtain one at http://mozilla.org/MPL/2.0/.
  8. *
  9. * @package phpMyFAQ
  10. * @author Thorsten Rinne <thorsten@phpmyfaq.de>
  11. * @author Bastian Poettner <bastian@poettner.net>
  12. * @author Meikel Katzengreis <meikel@katzengreis.com>
  13. * @author Minoru TODA <todam@netjapan.co.jp>
  14. * @author Matteo Scaramuccia <matteo@phpmyfaq.de>
  15. * @copyright 2002-2021 phpMyFAQ Team
  16. * @license http://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0
  17. * @link https://www.phpmyfaq.de
  18. * @since 2002-09-16
  19. */
  20. use phpMyFAQ\Attachment\AttachmentFactory;
  21. use phpMyFAQ\Auth\AuthLdap;
  22. use phpMyFAQ\Auth\AuthSso;
  23. use phpMyFAQ\Faq;
  24. use phpMyFAQ\Filter;
  25. use phpMyFAQ\Helper\HttpHelper;
  26. use phpMyFAQ\Language;
  27. use phpMyFAQ\Logging;
  28. use phpMyFAQ\Permission\MediumPermission;
  29. use phpMyFAQ\Strings;
  30. use phpMyFAQ\System;
  31. use phpMyFAQ\Template;
  32. use phpMyFAQ\User\CurrentUser;
  33. define('PMF_ROOT_DIR', dirname(__DIR__));
  34. //
  35. // Define the named constant used as a check by any included PHP file
  36. //
  37. define('IS_VALID_PHPMYFAQ', null);
  38. //
  39. // Bootstrapping
  40. //
  41. require PMF_ROOT_DIR . '/src/Bootstrap.php';
  42. // get language (default: english)
  43. $Language = new Language($faqConfig);
  44. $faqLangCode = $Language->setLanguage($faqConfig->get('main.languageDetection'), $faqConfig->get('main.language'));
  45. // Preload English strings
  46. require PMF_ROOT_DIR . '/lang/language_en.php';
  47. $faqConfig->setLanguage($Language);
  48. if (isset($faqLangCode) && Language::isASupportedLanguage($faqLangCode)) {
  49. // Overwrite English strings with the ones we have in the current language
  50. if (!file_exists(PMF_ROOT_DIR . '/lang/language_' . $faqLangCode . '.php')) {
  51. $faqLangCode = 'en';
  52. }
  53. require PMF_ROOT_DIR . '/lang/language_' . $faqLangCode . '.php';
  54. } else {
  55. $faqLangCode = 'en';
  56. }
  57. //
  58. // Initalizing static string wrapper
  59. //
  60. Strings::init($faqLangCode);
  61. //
  62. // Set actual template set name
  63. //
  64. Template::setTplSetName($faqConfig->get('main.templateSet'));
  65. //
  66. // Initialize attachment factory
  67. //
  68. AttachmentFactory::init(
  69. $faqConfig->get('records.attachmentsStorageType'),
  70. $faqConfig->get('records.defaultAttachmentEncKey'),
  71. $faqConfig->get('records.enableAttachmentEncryption')
  72. );
  73. //
  74. // Create a new phpMyFAQ system object
  75. //
  76. $faqSystem = new System();
  77. //
  78. // Create a new HTTP Helper
  79. //
  80. $http = new HttpHelper();
  81. //
  82. // Create a new FAQ object
  83. //
  84. $faq = new Faq($faqConfig);
  85. //
  86. // use mbstring extension if available and when possible
  87. //
  88. $validMbStrings = array('ja', 'en', 'uni');
  89. $mbLanguage = ($PMF_LANG['metaLanguage'] != 'ja') ? 'uni' : $PMF_LANG['metaLanguage'];
  90. if (function_exists('mb_language') && in_array($mbLanguage, $validMbStrings)) {
  91. mb_language($mbLanguage);
  92. mb_internal_encoding('utf-8');
  93. }
  94. //
  95. // Get user action
  96. //
  97. $action = Filter::filterInput(INPUT_GET, 'action', FILTER_UNSAFE_RAW);
  98. if (is_null($action)) {
  99. $action = Filter::filterInput(INPUT_POST, 'action', FILTER_UNSAFE_RAW);
  100. }
  101. //
  102. // Get possible redirect action
  103. //
  104. $redirectAction = Filter::filterInput(INPUT_POST, 'redirect-action', FILTER_UNSAFE_RAW);
  105. if (is_null($action) && '' !== $redirectAction && 'logout' !== $redirectAction) {
  106. $action = $redirectAction;
  107. }
  108. // authenticate current user
  109. $auth = null;
  110. $error = '';
  111. $faqusername = Filter::filterInput(INPUT_POST, 'faqusername', FILTER_UNSAFE_RAW);
  112. $faqpassword = Filter::filterInput(INPUT_POST, 'faqpassword', FILTER_UNSAFE_RAW, FILTER_FLAG_NO_ENCODE_QUOTES);
  113. $faqremember = Filter::filterInput(INPUT_POST, 'faqrememberme', FILTER_UNSAFE_RAW);
  114. // Set username via SSO
  115. if ($faqConfig->get('security.ssoSupport') && isset($_SERVER['REMOTE_USER'])) {
  116. $faqusername = trim($_SERVER['REMOTE_USER']);
  117. $faqpassword = '';
  118. }
  119. // Login via local DB or LDAP or SSO
  120. if (!is_null($faqusername) && !is_null($faqpassword)) {
  121. $user = new CurrentUser($faqConfig);
  122. if (!is_null($faqremember) && 'rememberMe' === $faqremember) {
  123. $user->enableRememberMe();
  124. }
  125. if ($faqConfig->get('ldap.ldapSupport') && function_exists('ldap_connect')) {
  126. try {
  127. $authLdap = new AuthLdap($faqConfig);
  128. $user->addAuth($authLdap, 'ldap');
  129. } catch (Exception $e) {
  130. $error = $e->getMessage() . '<br>';
  131. }
  132. }
  133. if ($faqConfig->get('security.ssoSupport')) {
  134. $authSso = new AuthSso($faqConfig);
  135. $user->addAuth($authSso, 'sso');
  136. }
  137. if ($user->login($faqusername, $faqpassword)) {
  138. // login, if user account is NOT blocked
  139. if ($user->getStatus() != 'blocked') {
  140. $auth = true;
  141. } else {
  142. $error = $error . $PMF_LANG['ad_auth_fail'];
  143. }
  144. } else {
  145. // error
  146. $logging = new Logging($faqConfig);
  147. $logging->logAdmin($user, 'Loginerror\nLogin: ' . $faqusername . '\nErrors: ' . implode(', ', $user->errors));
  148. $error = $error . $PMF_LANG['ad_auth_fail'];
  149. }
  150. } else {
  151. // Try to authenticate with cookie information
  152. $user = CurrentUser::getFromCookie($faqConfig);
  153. // authenticate with session information
  154. if (!$user instanceof CurrentUser) {
  155. $user = CurrentUser::getFromSession($faqConfig);
  156. }
  157. if ($user instanceof CurrentUser) {
  158. $auth = true;
  159. } else {
  160. $user = new CurrentUser($faqConfig);
  161. }
  162. }
  163. // logout
  164. if ($action == 'logout' && $auth) {
  165. $user->deleteFromSession(true);
  166. $auth = null;
  167. $ssoLogout = $faqConfig->get('security.ssoLogoutRedirect');
  168. if ($faqConfig->get('security.ssoSupport') && !empty($ssoLogout)) {
  169. $http->redirect($ssoLogout);
  170. }
  171. }
  172. //
  173. // Get current admin user and group id - default: -1
  174. //
  175. if (isset($user) && is_object($user)) {
  176. $currentAdminUser = $user->getUserId();
  177. if ($user->perm instanceof MediumPermission) {
  178. $currentAdminGroups = $user->perm->getUserGroups($currentAdminUser);
  179. } else {
  180. $currentAdminGroups = array(-1);
  181. }
  182. if (0 === count($currentAdminGroups)) {
  183. $currentAdminGroups = array(-1);
  184. }
  185. }
  186. //
  187. // Get action from _GET and _POST first
  188. $ajax = Filter::filterInput(INPUT_GET, 'ajax', FILTER_UNSAFE_RAW);
  189. if (is_null($ajax)) {
  190. $ajax = Filter::filterInput(INPUT_POST, 'ajax', FILTER_UNSAFE_RAW);
  191. }
  192. // if performing AJAX operation, needs to branch before header.php
  193. if (isset($auth) && (count($user->perm->getAllUserRights($user->getUserId())) > 0 || $user->isSuperAdmin())) {
  194. if (isset($action) && isset($ajax)) {
  195. if ('ajax' === $action) {
  196. switch ($ajax) {
  197. // Attachments
  198. case 'att':
  199. require 'ajax.attachment.php';
  200. break;
  201. // Dashboard
  202. case 'dashboard':
  203. require 'ajax.dashboard.php';
  204. break;
  205. // Link verification
  206. case 'verifyURL':
  207. require 'ajax.verifyurl.php';
  208. break;
  209. case 'onDemandURL':
  210. require 'ajax.ondemandurl.php';
  211. break;
  212. // Categories
  213. case 'categories':
  214. require 'ajax.category.php';
  215. break;
  216. // Configuration management
  217. case 'config_list':
  218. require 'ajax.config_list.php';
  219. break;
  220. case 'config':
  221. require 'ajax.config.php';
  222. break;
  223. case 'elasticsearch':
  224. require 'ajax.elasticsearch.php';
  225. break;
  226. // Tags management
  227. case 'tags':
  228. require 'ajax.tags.php';
  229. break;
  230. // Comments
  231. case 'comment':
  232. require 'ajax.comment.php';
  233. break;
  234. // Records
  235. case 'records':
  236. require 'ajax.records.php';
  237. break;
  238. case 'recordSave':
  239. require 'record.save.php';
  240. break;
  241. case 'recordAdd':
  242. require 'record.add.php';
  243. break;
  244. case 'markdown':
  245. require 'ajax.markdown.php';
  246. break;
  247. // Search
  248. case 'search':
  249. require 'ajax.search.php';
  250. break;
  251. // Users
  252. case 'user':
  253. require 'ajax.user.php';
  254. break;
  255. // Groups
  256. case 'group':
  257. require 'ajax.group.php';
  258. break;
  259. // Sections
  260. case 'section':
  261. require 'ajax.section.php';
  262. break;
  263. // Interface translation
  264. case 'trans':
  265. require 'ajax.trans.php';
  266. break;
  267. // Image upload
  268. case 'image':
  269. require 'ajax.image.php';
  270. break;
  271. }
  272. exit();
  273. }
  274. }
  275. }
  276. // are we running a PMF export file request?
  277. switch ($action) {
  278. case 'exportfile':
  279. require 'export.file.php';
  280. exit();
  281. break;
  282. case 'reportexport':
  283. require 'report.export.php';
  284. exit();
  285. break;
  286. }
  287. // Header of the admin page including the navigation
  288. require 'header.php';
  289. $numRights = count($user->perm->getAllUserRights($user->getUserId()));
  290. // User is authenticated
  291. if (isset($auth) && ($numRights > 0 || $user->isSuperAdmin())) {
  292. if (!is_null($action)) {
  293. // the various sections of the admin area
  294. switch ($action) {
  295. // functions for user administration
  296. case 'user':
  297. require 'user.php';
  298. break;
  299. case 'group':
  300. require 'group.php';
  301. break;
  302. case 'section':
  303. require 'section.php';
  304. break;
  305. // functions for content administration
  306. case 'faqs-overview':
  307. require 'faqs.overview.php';
  308. break;
  309. case 'viewinactive':
  310. case 'viewactive':
  311. case 'view':
  312. require 'record.show.php';
  313. break;
  314. case 'searchfaqs':
  315. require 'record.search.php';
  316. break;
  317. case 'takequestion':
  318. case 'editentry':
  319. case 'copyentry':
  320. case 'editpreview':
  321. require 'record.edit.php';
  322. break;
  323. case 'insertentry':
  324. require 'record.add.php';
  325. break;
  326. case 'saveentry':
  327. require 'record.save.php';
  328. break;
  329. case 'delatt':
  330. require 'record.delatt.php';
  331. break;
  332. case 'question':
  333. require 'record.questions.php';
  334. break;
  335. case 'comments':
  336. require 'record.comments.php';
  337. break;
  338. // functions for tags
  339. case 'tags':
  340. case 'delete-tag':
  341. require 'tags.php';
  342. break;
  343. // news administration
  344. case 'news':
  345. case 'add-news':
  346. case 'edit-news':
  347. case 'save-news':
  348. case 'update-news':
  349. case 'delete-news':
  350. require 'news.php';
  351. break;
  352. // category administration
  353. case 'content':
  354. case 'category':
  355. case 'savecategory':
  356. case 'updatecategory':
  357. case 'checkIfCategoryExists':
  358. case 'removecategory':
  359. case 'changecategory':
  360. case 'pastecategory':
  361. require 'category.main.php';
  362. break;
  363. case 'addcategory':
  364. require 'category.add.php';
  365. break;
  366. case 'editcategory':
  367. require 'category.edit.php';
  368. break;
  369. case 'translatecategory':
  370. require 'category.translate.php';
  371. break;
  372. case 'deletecategory':
  373. require 'category.delete.php';
  374. break;
  375. case 'cutcategory':
  376. require 'category.cut.php';
  377. break;
  378. case 'movecategory':
  379. require 'category.move.php';
  380. break;
  381. case 'showcategory':
  382. require 'category.showstructure.php';
  383. break;
  384. // glossary
  385. case 'glossary':
  386. case 'saveglossary':
  387. case 'updateglossary':
  388. case 'deleteglossary':
  389. require 'glossary.main.php';
  390. break;
  391. case 'addglossary':
  392. require 'glossary.add.php';
  393. break;
  394. case 'editglossary':
  395. require 'glossary.edit.php';
  396. break;
  397. // functions for password administration
  398. case 'passwd':
  399. require 'pwd.change.php';
  400. break;
  401. // functions for session administration
  402. case 'adminlog':
  403. case 'deleteadminlog':
  404. require 'stat.adminlog.php';
  405. break;
  406. case 'viewsessions':
  407. case 'clear-visits':
  408. require 'stat.main.php';
  409. break;
  410. case 'sessionbrowse':
  411. require 'stat.browser.php';
  412. break;
  413. case 'viewsession':
  414. require 'statistics.show.php';
  415. break;
  416. case 'clear-statistics':
  417. case 'statistics':
  418. require 'stat.ratings.php';
  419. break;
  420. case 'truncatesearchterms':
  421. case 'searchstats':
  422. require 'stat.search.php';
  423. break;
  424. // Reports
  425. case 'reports':
  426. require 'report.main.php';
  427. break;
  428. case 'reportview':
  429. require 'report.view.php';
  430. break;
  431. // Config administration
  432. case 'config':
  433. require 'configuration.php';
  434. break;
  435. case 'system':
  436. require 'system.php';
  437. break;
  438. case 'updateinstance':
  439. case 'instances':
  440. require 'instances.php';
  441. break;
  442. case 'editinstance':
  443. require 'instances.edit.php';
  444. break;
  445. case 'stopwordsconfig':
  446. require 'stopwords.php';
  447. break;
  448. case 'elasticsearch':
  449. require 'elasticsearch.php';
  450. break;
  451. case 'meta':
  452. case 'meta.update';
  453. require 'meta.php';
  454. break;
  455. case 'meta.edit':
  456. require 'meta.edit.php';
  457. break;
  458. // functions for backup administration
  459. case 'backup':
  460. require 'backup.main.php';
  461. break;
  462. case 'restore':
  463. require 'backup.import.php';
  464. break;
  465. // functions for FAQ export
  466. case 'export':
  467. require 'export.main.php';
  468. break;
  469. // attachment administration
  470. case 'attachments':
  471. require 'attachments.php';
  472. break;
  473. default:
  474. echo 'Dave, this conversation can serve no purpose anymore. Goodbye.';
  475. break;
  476. }
  477. } else {
  478. require 'dashboard.php';
  479. }
  480. // User is authenticated, but has no rights
  481. } elseif (isset($auth) && $numRights === 0) {
  482. require 'noperm.php';
  483. // User is NOT authenticated
  484. } else {
  485. require 'loginform.php';
  486. }
  487. require 'footer.php';
  488. $faqConfig->getDb()->close();