Routing.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  1. <?php
  2. /**
  3. * This file is part of the ForkBB <https://github.com/forkbb>.
  4. *
  5. * @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
  6. * @license The MIT License (MIT)
  7. */
  8. declare(strict_types=1);
  9. namespace ForkBB\Controllers;
  10. use ForkBB\Core\Container;
  11. use ForkBB\Models\Page;
  12. class Routing
  13. {
  14. public function __construct(protected Container $c)
  15. {
  16. }
  17. /**
  18. * Маршрутиризация
  19. */
  20. public function routing(): Page
  21. {
  22. $user = $this->c->user;
  23. $config = $this->c->config;
  24. $r = $this->c->Router;
  25. // регистрация/вход/выход
  26. if ($user->isGuest) {
  27. // вход
  28. $r->add(
  29. $r::DUO,
  30. '/login',
  31. 'Auth:login',
  32. 'Login'
  33. );
  34. // забыли кодовую фразу
  35. $r->add(
  36. $r::DUO,
  37. '/login/forget',
  38. 'Auth:forget',
  39. 'Forget'
  40. );
  41. // смена кодовой фразы
  42. $r->add(
  43. $r::DUO,
  44. '/login/{id|i:[1-9]\d*}/{key}/{hash}',
  45. 'Auth:changePass',
  46. 'ChangePassword'
  47. );
  48. // регистрация
  49. if (1 === $config->b_regs_allow) {
  50. $r->add(
  51. $r::GET,
  52. '/registration',
  53. 'Rules:confirmation',
  54. 'Register'
  55. );
  56. $r->add(
  57. $r::PST,
  58. '/registration/agree',
  59. 'Register:reg',
  60. 'RegisterForm'
  61. );
  62. $r->add(
  63. $r::GET,
  64. '/registration/activate/{id|i:[1-9]\d*}/{key}/{hash}',
  65. 'Register:activate',
  66. 'RegActivate'
  67. );
  68. }
  69. } else {
  70. // выход
  71. $r->add(
  72. $r::GET,
  73. '/logout/{token}',
  74. 'Auth:logout',
  75. 'Logout'
  76. );
  77. // обработка "кривых" перенаправлений с логина и регистрации
  78. $r->add(
  79. $r::GET,
  80. '/login[/{tail:.*}]',
  81. 'Redirect:toIndex'
  82. );
  83. $r->add(
  84. $r::GET,
  85. '/registration[/{tail:.*}]',
  86. 'Redirect:toIndex'
  87. );
  88. }
  89. // OAuth
  90. if (
  91. $user->isAdmin
  92. || 1 === $config->b_oauth_allow
  93. ) {
  94. $r->add(
  95. $r::GET,
  96. '/reglog/callback/{name}',
  97. 'RegLog:callback',
  98. 'RegLogCallback'
  99. );
  100. }
  101. if (1 === $config->b_oauth_allow) {
  102. $r->add(
  103. $r::PST,
  104. '/reglog/redirect/{type}',
  105. 'RegLog:redirect',
  106. 'RegLogRedirect'
  107. );
  108. }
  109. // просмотр разрешен
  110. if (1 === $user->g_read_board) {
  111. // главная
  112. $r->add(
  113. $r::GET,
  114. '/',
  115. 'Index:view',
  116. 'Index'
  117. );
  118. $r->add(
  119. $r::GET,
  120. '/index.php',
  121. 'Redirect:toIndex'
  122. );
  123. $r->add(
  124. $r::GET,
  125. '/index.html',
  126. 'Redirect:toIndex'
  127. );
  128. // правила
  129. if (
  130. 1 === $config->b_rules
  131. && (
  132. ! $user->isGuest
  133. || 1 === $config->b_regs_allow
  134. )
  135. ) {
  136. $r->add(
  137. $r::GET,
  138. '/rules',
  139. 'Rules:view',
  140. 'Rules'
  141. );
  142. }
  143. // поиск
  144. if (1 === $user->g_search) {
  145. $r->add(
  146. $r::GET,
  147. '/search[/simple/{keywords}[/{page|i:[1-9]\d*}]]',
  148. 'Search:view',
  149. 'Search'
  150. );
  151. $r->add(
  152. $r::PST,
  153. '/search',
  154. 'Search:view'
  155. );
  156. $r->add(
  157. $r::GET,
  158. '/search/advanced[/{keywords}/{author}/{forums}/{serch_in:\d}/{sort_by:\d}/{sort_dir:\d}/{show_as:\d}[/{page|i:[1-9]\d*}]]',
  159. 'Search:viewAdvanced',
  160. 'SearchAdvanced'
  161. );
  162. $r->add(
  163. $r::PST,
  164. '/search/advanced',
  165. 'Search:viewAdvanced'
  166. );
  167. $r->add(
  168. $r::GET,
  169. '/search[/user/{uid|i:[1-9]\d*}]/{action:(?!search)[a-z_]+}[/in_forum/{forum|i:[1-9]\d*}][/{page|i:[1-9]\d*}]',
  170. 'Search:action',
  171. 'SearchAction'
  172. );
  173. }
  174. // юзеры
  175. if ($user->viewUsers) {
  176. // список пользователей
  177. $r->add(
  178. $r::GET,
  179. '/userlist[/{group:all|[1-9]\d*}/{sort:username|registered|num_posts}/{dir:ASC|DESC}/{name}][/{page|i:[1-9]\d*}]',
  180. 'Userlist:view',
  181. 'Userlist'
  182. );
  183. $r->add(
  184. $r::PST,
  185. '/userlist',
  186. 'Userlist:view'
  187. );
  188. // юзеры
  189. $r->add(
  190. $r::GET,
  191. '/user/{id|i:[1-9]\d*}/{name}',
  192. 'ProfileView:view',
  193. 'User'
  194. );
  195. if (! $user->isGuest) {
  196. $r->add(
  197. $r::DUO,
  198. '/user/{id|i:[1-9]\d*}/edit/profile',
  199. 'ProfileEdit:edit',
  200. 'EditUserProfile'
  201. );
  202. $r->add(
  203. $r::DUO,
  204. '/user/{id|i:[1-9]\d*}/edit/config',
  205. 'ProfileConfig:config',
  206. 'EditUserBoardConfig'
  207. );
  208. $r->add(
  209. $r::DUO,
  210. '/user/{id|i:[1-9]\d*}/edit/profile/email',
  211. 'ProfileEmail:email',
  212. 'EditUserEmail'
  213. );
  214. $r->add(
  215. $r::DUO,
  216. '/user/{id|i:[1-9]\d*}/edit/profile/passphrase',
  217. 'ProfilePass:pass',
  218. 'EditUserPass'
  219. );
  220. $r->add(
  221. $r::DUO,
  222. '/user/{id|i:[1-9]\d*}/edit/profile/moderation',
  223. 'ProfileMod:moderation',
  224. 'EditUserModeration'
  225. );
  226. }
  227. } elseif (! $user->isGuest) {
  228. // только свой профиль
  229. $r->add(
  230. $r::GET,
  231. '/user/{id|i:' . $user->id . '}/{name}',
  232. 'ProfileView:view',
  233. 'User'
  234. );
  235. $r->add(
  236. $r::DUO,
  237. '/user/{id|i:' . $user->id . '}/edit/profile',
  238. 'ProfileEdit:edit',
  239. 'EditUserProfile'
  240. );
  241. $r->add(
  242. $r::DUO,
  243. '/user/{id|i:' . $user->id . '}/edit/config',
  244. 'ProfileConfig:config',
  245. 'EditUserBoardConfig'
  246. );
  247. $r->add(
  248. $r::DUO,
  249. '/user/{id|i:' . $user->id . '}/edit/profile/email',
  250. 'ProfileEmail:email',
  251. 'EditUserEmail'
  252. );
  253. $r->add(
  254. $r::DUO,
  255. '/user/{id|i:' . $user->id . '}/edit/profile/passphrase',
  256. 'ProfilePass:pass',
  257. 'EditUserPass'
  258. );
  259. }
  260. // управление аккаунтами OAuth
  261. if (
  262. ! $user->isGuest
  263. && 1 === $config->b_oauth_allow
  264. ) {
  265. $r->add(
  266. $r::GET,
  267. '/user/{id|i:' . $user->id . '}/edit/profile/oauth',
  268. 'ProfileOAuth:list',
  269. 'EditUserOAuth'
  270. );
  271. $r->add(
  272. $r::DUO,
  273. '/user/{id|i:' . $user->id . '}/edit/profile/oauth/{key}',
  274. 'ProfileOAuth:action',
  275. 'EditUserOAuthAction'
  276. );
  277. }
  278. // смена своего email
  279. if (! $user->isGuest) {
  280. $r->add(
  281. $r::GET,
  282. '/user/{id|i:' . $user->id . '}/{email}/{key}/{hash}',
  283. 'ProfileEmail:setEmail',
  284. 'SetNewEmail'
  285. );
  286. }
  287. if (! $user->isGuest) {
  288. // пометка разделов прочитанными
  289. $r->add(
  290. $r::GET,
  291. '/forum/{id|i:\d+}/markread/{token}',
  292. 'Misc:markread',
  293. 'MarkRead'
  294. );
  295. // скролирование до топика
  296. $r->add(
  297. $r::GET,
  298. '/forum/scroll/topic/{tid|i:[1-9]\d*}',
  299. 'Forum:scrollToTopic',
  300. 'ForumScrollToTopic'
  301. );
  302. }
  303. // разделы
  304. $r->add(
  305. $r::GET,
  306. '/forum/{id|i:[1-9]\d*}/{name}[/{page|i:[1-9]\d*}]',
  307. 'Forum:view',
  308. 'Forum'
  309. );
  310. $r->add(
  311. $r::DUO,
  312. '/forum/{id|i:[1-9]\d*}/new/topic',
  313. 'Post:newTopic',
  314. 'NewTopic'
  315. );
  316. // темы
  317. $r->add(
  318. $r::GET,
  319. '/topic/{id|i:[1-9]\d*}/{name}[/{page|i:[1-9]\d*}]',
  320. 'Topic:viewTopic',
  321. 'Topic'
  322. );
  323. $r->add(
  324. $r::GET,
  325. '/topic/{id|i:[1-9]\d*}/view/new',
  326. 'Topic:viewNew',
  327. 'TopicViewNew'
  328. );
  329. $r->add(
  330. $r::GET,
  331. '/topic/{id|i:[1-9]\d*}/view/unread',
  332. 'Topic:viewUnread',
  333. 'TopicViewUnread'
  334. );
  335. $r->add(
  336. $r::GET,
  337. '/topic/{id|i:[1-9]\d*}/view/last',
  338. 'Topic:viewLast',
  339. 'TopicViewLast'
  340. );
  341. $r->add(
  342. $r::GET,
  343. '/topic/{id|i:[1-9]\d*}/new/reply[/{quote|i:[1-9]\d*}]',
  344. 'Post:newReply',
  345. 'NewReply'
  346. );
  347. $r->add(
  348. $r::PST,
  349. '/topic/{id|i:[1-9]\d*}/new/reply',
  350. 'Post:newReply'
  351. );
  352. // сообщения
  353. $r->add(
  354. $r::GET,
  355. '/post/{id|i:[1-9]\d*}#p{id}',
  356. 'Topic:viewPost',
  357. 'ViewPost'
  358. );
  359. $r->add(
  360. $r::DUO,
  361. '/post/{id|i:[1-9]\d*}/edit',
  362. 'Edit:edit',
  363. 'EditPost'
  364. );
  365. $r->add(
  366. $r::DUO,
  367. '/post/{id|i:[1-9]\d*}/delete',
  368. 'Delete:delete',
  369. 'DeletePost'
  370. );
  371. // сигналы (репорты)
  372. if (
  373. ! $user->isAdmin
  374. && ! $user->isGuest
  375. ) {
  376. $r->add(
  377. $r::DUO,
  378. '/post/{id|i:[1-9]\d*}/report',
  379. 'Report:report',
  380. 'ReportPost'
  381. );
  382. }
  383. // отправка email
  384. if (
  385. ! $user->isGuest
  386. && 1 === $user->g_send_email
  387. ) {
  388. $r->add(
  389. $r::DUO,
  390. '/send_email/{id|i:[1-9]\d*}/{hash}',
  391. 'Email:email',
  392. 'SendEmail'
  393. );
  394. }
  395. // feed
  396. $r->add(
  397. $r::GET,
  398. '/feed/{type:atom|rss}[/forum/{fid|i:[1-9]\d*}][/topic/{tid|i:[1-9]\d*}]',
  399. 'Feed:view',
  400. 'Feed'
  401. );
  402. // подписки
  403. if (
  404. ! $user->isGuest
  405. && ! $user->isUnverified
  406. ) {
  407. $r->add(
  408. $r::GET,
  409. '/forum/{fid|i:[1-9]\d*}/{type:subscribe|unsubscribe}/{token}',
  410. 'Misc:forumSubscription',
  411. 'ForumSubscription'
  412. );
  413. $r->add(
  414. $r::GET,
  415. '/topic/{tid|i:[1-9]\d*}/{type:subscribe|unsubscribe}/{token}',
  416. 'Misc:topicSubscription',
  417. 'TopicSubscription'
  418. );
  419. }
  420. // личные сообщения
  421. if ($user->usePM) {
  422. $r->add(
  423. $r::GET,
  424. '/pm',
  425. 'PM:action',
  426. 'PM'
  427. );
  428. $r->add(
  429. $r::DUO,
  430. '/pm[/user/{second}][/{action}[/{more1|i:[1-9]\d*}[/{more2}]]][#p{numPost}]',
  431. 'PM:action',
  432. 'PMAction'
  433. );
  434. }
  435. }
  436. // опросы
  437. if ($user->usePoll) {
  438. $r->add(
  439. $r::PST,
  440. '/poll/{tid|i:[1-9]\d*}',
  441. 'Poll:vote',
  442. 'Poll'
  443. );
  444. }
  445. // админ и модератор
  446. if ($user->isAdmMod) {
  447. $r->add(
  448. $r::GET,
  449. '/admin/',
  450. 'AdminIndex:index',
  451. 'Admin'
  452. );
  453. $r->add(
  454. $r::GET,
  455. '/admin/statistics',
  456. 'AdminStatistics:statistics',
  457. 'AdminStatistics'
  458. );
  459. if ($this->c->userRules->viewIP) {
  460. $r->add(
  461. $r::GET,
  462. '/admin/get/host/{ip:[0-9a-fA-F:.]+}',
  463. 'AdminHost:view',
  464. 'AdminHost'
  465. );
  466. $r->add(
  467. $r::GET,
  468. '/admin/users/user/{id|i:[1-9]\d*}[/{page|i:[1-9]\d*}]',
  469. 'AdminUsersStat:view',
  470. 'AdminUserStat'
  471. );
  472. }
  473. $r->add(
  474. $r::DUO,
  475. '/admin/users',
  476. 'AdminUsers:view',
  477. 'AdminUsers'
  478. );
  479. $r->add(
  480. $r::DUO,
  481. '/admin/users/result/{data}[/{page|i:[1-9]\d*}]',
  482. 'AdminUsersResult:view',
  483. 'AdminUsersResult'
  484. );
  485. $r->add(
  486. $r::DUO,
  487. '/admin/users/{action:\w+}/{ids:\d+(?:-\d+)*}[/{token}]',
  488. 'AdminUsersAction:view',
  489. 'AdminUsersAction'
  490. );
  491. $r->add(
  492. $r::GET,
  493. '/admin/users/promote/{uid|i:[1-9]\d*}/{pid|i:[1-9]\d*}/{token}',
  494. 'AdminUsersPromote:promote',
  495. 'AdminUserPromote'
  496. );
  497. if ($user->isAdmin) {
  498. $r->add(
  499. $r::DUO,
  500. '/admin/users/new',
  501. 'AdminUsersNew:view',
  502. 'AdminUsersNew'
  503. );
  504. $r->add(
  505. $r::PST,
  506. '/admin/users/recalculate',
  507. 'AdminUsers:recalculate',
  508. 'AdminUsersRecalculate'
  509. );
  510. }
  511. if ($this->c->userRules->banUsers) {
  512. $r->add(
  513. $r::DUO,
  514. '/admin/bans',
  515. 'AdminBans:view',
  516. 'AdminBans'
  517. );
  518. $r->add(
  519. $r::DUO,
  520. '/admin/bans/new[/{ids:\d+(?:-\d+)*}[/{uid|i:[1-9]\d*}]]',
  521. 'AdminBans:add',
  522. 'AdminBansNew'
  523. );
  524. $r->add(
  525. $r::DUO,
  526. '/admin/bans/edit/{id|i:[1-9]\d*}',
  527. 'AdminBans:edit',
  528. 'AdminBansEdit'
  529. );
  530. $r->add(
  531. $r::GET,
  532. '/admin/bans/result/{data}[/{page|i:[1-9]\d*}]',
  533. 'AdminBans:result',
  534. 'AdminBansResult'
  535. );
  536. $r->add(
  537. $r::GET,
  538. '/admin/bans/delete/{id|i:[1-9]\d*}/{token}[/{uid|i:[1-9]\d*}]',
  539. 'AdminBans:delete',
  540. 'AdminBansDelete'
  541. );
  542. }
  543. if (
  544. $user->isAdmin
  545. || 0 === $config->i_report_method
  546. || 2 === $config->i_report_method
  547. ) {
  548. $r->add(
  549. $r::GET,
  550. '/admin/reports',
  551. 'AdminReports:view',
  552. 'AdminReports'
  553. );
  554. $r->add(
  555. $r::GET,
  556. '/admin/reports/zap/{id|i:[1-9]\d*}/{token}',
  557. 'AdminReports:zap',
  558. 'AdminReportsZap'
  559. );
  560. }
  561. $r->add(
  562. $r::PST,
  563. '/moderate',
  564. 'Moderate:action',
  565. 'Moderate'
  566. );
  567. }
  568. // только админ
  569. if ($user->isAdmin) {
  570. $r->add(
  571. $r::GET,
  572. '/admin/statistics/info',
  573. 'AdminStatistics:info',
  574. 'AdminInfo'
  575. );
  576. $r->add(
  577. $r::GET,
  578. '/admin/statistics/info/{time|i:\d+}',
  579. 'AdminStatistics:infoCSS',
  580. 'AdminInfoCSS'
  581. );
  582. $r->add(
  583. $r::DUO,
  584. '/admin/options',
  585. 'AdminOptions:edit',
  586. 'AdminOptions'
  587. );
  588. $r->add(
  589. $r::DUO,
  590. '/admin/options/providers',
  591. 'AdminProviders:view',
  592. 'AdminProviders'
  593. );
  594. $r->add(
  595. $r::DUO,
  596. '/admin/options/providers/{name}',
  597. 'AdminProviders:edit',
  598. 'AdminProvider'
  599. );
  600. $r->add(
  601. $r::DUO,
  602. '/admin/parser',
  603. 'AdminParser:edit',
  604. 'AdminParser'
  605. );
  606. $r->add(
  607. $r::DUO,
  608. '/admin/parser/bbcode',
  609. 'AdminParserBBCode:view',
  610. 'AdminBBCode'
  611. );
  612. $r->add(
  613. $r::DUO,
  614. '/admin/parser/bbcode/delete/{id|i:[1-9]\d*}',
  615. 'AdminParserBBCode:delete',
  616. 'AdminBBCodeDelete'
  617. );
  618. $r->add(
  619. $r::DUO,
  620. '/admin/parser/bbcode/edit/{id|i:[1-9]\d*}',
  621. 'AdminParserBBCode:edit',
  622. 'AdminBBCodeEdit'
  623. );
  624. $r->add(
  625. $r::DUO,
  626. '/admin/parser/bbcode/new',
  627. 'AdminParserBBCode:edit',
  628. 'AdminBBCodeNew'
  629. );
  630. $r->add(
  631. $r::GET,
  632. '/admin/parser/bbcode/default/{id|i:[1-9]\d*}/{token}',
  633. 'AdminParserBBCode:default',
  634. 'AdminBBCodeDefault'
  635. );
  636. $r->add(
  637. $r::DUO,
  638. '/admin/parser/smilies',
  639. 'AdminParserSmilies:view',
  640. 'AdminSmilies'
  641. );
  642. $r->add(
  643. $r::GET,
  644. '/admin/parser/smilies/delete/{name}/{token}',
  645. 'AdminParserSmilies:delete',
  646. 'AdminSmiliesDelete'
  647. );
  648. $r->add(
  649. $r::PST,
  650. '/admin/parser/smilies/upload',
  651. 'AdminParserSmilies:upload',
  652. 'AdminSmiliesUpload'
  653. );
  654. $r->add(
  655. $r::DUO,
  656. '/admin/categories',
  657. 'AdminCategories:view',
  658. 'AdminCategories'
  659. );
  660. $r->add(
  661. $r::DUO,
  662. '/admin/categories/{id|i:[1-9]\d*}/delete',
  663. 'AdminCategories:delete',
  664. 'AdminCategoriesDelete'
  665. );
  666. $r->add(
  667. $r::DUO,
  668. '/admin/forums',
  669. 'AdminForums:view',
  670. 'AdminForums'
  671. );
  672. $r->add(
  673. $r::DUO,
  674. '/admin/forums/new',
  675. 'AdminForums:edit',
  676. 'AdminForumsNew'
  677. );
  678. $r->add(
  679. $r::DUO,
  680. '/admin/forums/{id|i:[1-9]\d*}/edit',
  681. 'AdminForums:edit',
  682. 'AdminForumsEdit'
  683. );
  684. $r->add(
  685. $r::DUO,
  686. '/admin/forums/{id|i:[1-9]\d*}/delete',
  687. 'AdminForums:delete',
  688. 'AdminForumsDelete'
  689. );
  690. $r->add(
  691. $r::GET,
  692. '/admin/groups',
  693. 'AdminGroups:view',
  694. 'AdminGroups'
  695. );
  696. $r->add(
  697. $r::PST,
  698. '/admin/groups/default',
  699. 'AdminGroups:defaultSet',
  700. 'AdminGroupsDefault'
  701. );
  702. $r->add(
  703. $r::PST,
  704. '/admin/groups/new[/{base|i:[1-9]\d*}]',
  705. 'AdminGroups:edit',
  706. 'AdminGroupsNew'
  707. );
  708. $r->add(
  709. $r::DUO,
  710. '/admin/groups/{id|i:[1-9]\d*}/edit',
  711. 'AdminGroups:edit',
  712. 'AdminGroupsEdit'
  713. );
  714. $r->add(
  715. $r::DUO,
  716. '/admin/groups/{id|i:[1-9]\d*}/delete',
  717. 'AdminGroups:delete',
  718. 'AdminGroupsDelete'
  719. );
  720. $r->add(
  721. $r::DUO,
  722. '/admin/censoring',
  723. 'AdminCensoring:edit',
  724. 'AdminCensoring'
  725. );
  726. $r->add(
  727. $r::DUO,
  728. '/admin/maintenance',
  729. 'AdminMaintenance:view',
  730. 'AdminMaintenance'
  731. );
  732. $r->add(
  733. $r::PST,
  734. '/admin/maintenance/rebuild',
  735. 'AdminMaintenance:rebuild',
  736. 'AdminMaintenanceRebuild'
  737. );
  738. $r->add(
  739. $r::GET,
  740. '/admin/maintenance/rebuild/{token}/{clear:[01]}/{limit|i:[1-9]\d*}/{start|i:[1-9]\d*}',
  741. 'AdminMaintenance:rebuild',
  742. 'AdminRebuildIndex'
  743. );
  744. $r->add(
  745. $r::PST,
  746. '/admin/maintenance/clear',
  747. 'AdminMaintenance:clearCache',
  748. 'AdminMaintenanceClear'
  749. );
  750. $r->add(
  751. $r::GET,
  752. '/admin/logs',
  753. 'AdminLogs:info',
  754. 'AdminLogs'
  755. );
  756. $r->add(
  757. $r::DUO,
  758. '/admin/logs/{action:\w+}/{hash}/{token}',
  759. 'AdminLogs:action',
  760. 'AdminLogsAction'
  761. );
  762. $r->add(
  763. $r::DUO,
  764. '/admin/uploads',
  765. 'AdminUploads:view',
  766. 'AdminUploads'
  767. );
  768. }
  769. $uri = $_SERVER['REQUEST_URI'];
  770. if (false !== ($pos = \strpos($uri, '?'))) {
  771. $uri = \substr($uri, 0, $pos);
  772. }
  773. $uri = \rawurldecode($uri);
  774. $method = $_SERVER['REQUEST_METHOD'];
  775. $route = $r->route($method, $uri);
  776. $page = null;
  777. switch ($route[0]) {
  778. case $r::OK:
  779. // ... 200 OK
  780. list($page, $action) = \explode(':', $route[1], 2);
  781. $page = $this->c->$page->$action($route[2], $method);
  782. break;
  783. case $r::NOT_FOUND:
  784. // ... 404 Not Found
  785. if (
  786. 1 !== $user->g_read_board
  787. && $user->isGuest
  788. ) {
  789. $page = $this->c->Redirect->page('Login');
  790. } else {
  791. $page = $this->c->Message->message('Not Found', true, 404);
  792. }
  793. break;
  794. case $r::METHOD_NOT_ALLOWED:
  795. // ... 405 Method Not Allowed
  796. $page = $this->c->Message->message(
  797. 'Bad request',
  798. true,
  799. 405,
  800. [
  801. ['Allow', \implode(',', $route[1])],
  802. ]
  803. );
  804. break;
  805. case $r::NOT_IMPLEMENTED:
  806. // ... 501 Not implemented
  807. $page = $this->c->Message->message('Bad request', true, 501);
  808. break;
  809. }
  810. return $page;
  811. }
  812. }