Routing.php 27 KB

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