Routing.php 27 KB

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