Routing.php 27 KB

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