123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637 |
- <?php
- namespace ForkBB\Controllers;
- use ForkBB\Core\Container;
- use ForkBB\Models\Page;
- class Routing
- {
- /**
- * Контейнер
- * @var Container
- */
- protected $c;
- /**
- * Конструктор
- *
- * @param Container $container
- */
- public function __construct(Container $container)
- {
- $this->c = $container;
- }
- /**
- * Маршрутиризация
- *
- * @return Page
- */
- public function routing(): Page
- {
- $user = $this->c->user;
- $config = $this->c->config;
- $r = $this->c->Router;
- // регистрация/вход/выход
- if ($user->isGuest) {
- // вход
- $r->add(
- $r::DUO,
- '/login',
- 'Auth:login',
- 'Login'
- );
- // забыли кодовую фразу
- $r->add(
- $r::DUO,
- '/login/forget',
- 'Auth:forget',
- 'Forget'
- );
- // смена кодовой фразы
- $r->add(
- $r::DUO,
- '/login/{id:\d+}/{key}/{hash}',
- 'Auth:changePass',
- 'ChangePassword'
- );
- // регистрация
- if ('1' == $config->o_regs_allow) {
- $r->add(
- $r::GET,
- '/registration',
- 'Rules:confirmation',
- 'Register'
- );
- $r->add(
- $r::PST,
- '/registration/agree',
- 'Register:reg',
- 'RegisterForm'
- );
- $r->add(
- $r::GET,
- '/registration/activate/{id:\d+}/{key}/{hash}',
- 'Register:activate',
- 'RegActivate'
- );
- }
- } else {
- // выход
- $r->add(
- $r::GET,
- '/logout/{token}',
- 'Auth:logout',
- 'Logout'
- );
- // обработка "кривых" перенаправлений с логина и регистрации
- $r->add(
- $r::GET,
- '/login[/{tail:.*}]',
- 'Redirect:toIndex'
- );
- $r->add(
- $r::GET,
- '/registration[/{tail:.*}]',
- 'Redirect:toIndex'
- );
- }
- // просмотр разрешен
- if ('1' == $user->g_read_board) {
- // главная
- $r->add(
- $r::GET,
- '/',
- 'Index:view',
- 'Index'
- );
- $r->add(
- $r::GET,
- '/index.php',
- 'Redirect:toIndex'
- );
- $r->add(
- $r::GET,
- '/index.html',
- 'Redirect:toIndex'
- );
- // правила
- if (
- '1' == $config->o_rules
- && (
- ! $user->isGuest
- || '1' == $config->o_regs_allow
- )
- ) {
- $r->add(
- $r::GET,
- '/rules',
- 'Rules:view',
- 'Rules'
- );
- }
- // поиск
- if ('1' == $user->g_search) {
- $r->add(
- $r::GET,
- '/search[/simple/{keywords}[/{page:[1-9]\d*}]]',
- 'Search:view',
- 'Search'
- );
- $r->add(
- $r::PST,
- '/search',
- 'Search:view'
- );
- $r->add(
- $r::GET,
- '/search/advanced[/{keywords}/{author}/{forums}/{serch_in:\d}/{sort_by:\d}/{sort_dir:\d}/{show_as:\d}[/{page:[1-9]\d*}]]',
- 'Search:viewAdvanced',
- 'SearchAdvanced'
- );
- $r->add(
- $r::PST,
- '/search/advanced',
- 'Search:viewAdvanced'
- );
- $r->add(
- $r::GET,
- '/search[/user/{uid:[2-9]|[1-9]\d+}]/{action:(?!search)[a-z_]+}[/in_forum/{forum:[1-9]\d*}][/{page:[1-9]\d*}]',
- 'Search:action',
- 'SearchAction'
- );
- }
- // юзеры
- if ($user->viewUsers) {
- // список пользователей
- $r->add(
- $r::GET,
- '/userlist[/{group:all|[1-9]\d*}/{sort:username|registered|num_posts}/{dir:ASC|DESC}/{name}][/{page:[1-9]\d*}]',
- 'Userlist:view',
- 'Userlist'
- );
- $r->add(
- $r::PST,
- '/userlist',
- 'Userlist:view'
- );
- // юзеры
- $r->add(
- $r::GET,
- '/user/{id:[2-9]|[1-9]\d+}/{name}',
- 'ProfileView:view',
- 'User'
- );
- $r->add(
- $r::DUO,
- '/user/{id:[2-9]|[1-9]\d+}/edit/profile',
- 'ProfileEdit:edit',
- 'EditUserProfile'
- );
- $r->add(
- $r::DUO,
- '/user/{id:[2-9]|[1-9]\d+}/edit/config',
- 'ProfileConfig:config',
- 'EditUserBoardConfig'
- );
- $r->add(
- $r::DUO,
- '/user/{id:[2-9]|[1-9]\d+}/edit/email',
- 'ProfileEmail:email',
- 'EditUserEmail'
- );
- $r->add(
- $r::DUO,
- '/user/{id:[2-9]|[1-9]\d+}/edit/passphrase',
- 'ProfilePass:pass',
- 'EditUserPass'
- );
- $r->add(
- $r::DUO,
- '/user/{id:[2-9]|[1-9]\d+}/edit/moderation',
- 'ProfileMod:moderation',
- 'EditUserModeration'
- );
- } elseif (! $user->isGuest) {
- // только свой профиль
- $r->add(
- $r::GET,
- '/user/{id:' . $user->id . '}/{name}',
- 'ProfileView:view',
- 'User'
- );
- $r->add(
- $r::DUO,
- '/user/{id:' . $user->id . '}/edit/profile',
- 'ProfileEdit:edit',
- 'EditUserProfile'
- );
- $r->add(
- $r::DUO,
- '/user/{id:' . $user->id . '}/edit/config',
- 'ProfileConfig:config',
- 'EditUserBoardConfig'
- );
- $r->add(
- $r::DUO,
- '/user/{id:' . $user->id . '}/edit/email',
- 'ProfileEmail:email',
- 'EditUserEmail'
- );
- $r->add(
- $r::DUO,
- '/user/{id:' . $user->id . '}/edit/passphrase',
- 'ProfilePass:pass',
- 'EditUserPass'
- );
- }
- // смена своего email
- if (! $user->isGuest) {
- $r->add(
- $r::GET,
- '/user/{id:' . $user->id . '}/{email}/{key}/{hash}',
- 'ProfileEmail:setEmail',
- 'SetNewEmail'
- );
- }
- // пометка разделов прочитанными
- if (! $user->isGuest) {
- $r->add(
- $r::GET,
- '/forum/{id:\d+}/markread/{token}',
- 'Misc:markread',
- 'MarkRead'
- );
- }
- // разделы
- $r->add(
- $r::GET,
- '/forum/{id:[1-9]\d*}/{name}[/{page:[1-9]\d*}]',
- 'Forum:view',
- 'Forum'
- );
- $r->add(
- $r::DUO,
- '/forum/{id:[1-9]\d*}/new/topic',
- 'Post:newTopic',
- 'NewTopic'
- );
- // темы
- $r->add(
- $r::GET,
- '/topic/{id:[1-9]\d*}/{name}[/{page:[1-9]\d*}]',
- 'Topic:viewTopic',
- 'Topic'
- );
- $r->add(
- $r::GET,
- '/topic/{id:[1-9]\d*}/view/new',
- 'Topic:viewNew',
- 'TopicViewNew'
- );
- $r->add(
- $r::GET,
- '/topic/{id:[1-9]\d*}/view/unread',
- 'Topic:viewUnread',
- 'TopicViewUnread'
- );
- $r->add(
- $r::GET,
- '/topic/{id:[1-9]\d*}/view/last',
- 'Topic:viewLast',
- 'TopicViewLast'
- );
- $r->add(
- $r::GET,
- '/topic/{id:[1-9]\d*}/new/reply[/{quote:[1-9]\d*}]',
- 'Post:newReply',
- 'NewReply'
- );
- $r->add(
- $r::PST,
- '/topic/{id:[1-9]\d*}/new/reply',
- 'Post:newReply'
- );
- // сообщения
- $r->add(
- $r::GET,
- '/post/{id:[1-9]\d*}#p{id}',
- 'Topic:viewPost',
- 'ViewPost'
- );
- $r->add(
- $r::DUO,
- '/post/{id:[1-9]\d*}/edit',
- 'Edit:edit',
- 'EditPost'
- );
- $r->add(
- $r::DUO,
- '/post/{id:[1-9]\d*}/delete',
- 'Delete:delete',
- 'DeletePost'
- );
- // сигналы (репорты)
- if (
- ! $user->isAdmin
- && ! $user->isGuest
- ) { // ????
- $r->add(
- $r::DUO,
- '/post/{id:[1-9]\d*}/report',
- 'Report:report',
- 'ReportPost'
- );
- }
- }
- // админ и модератор
- if ($user->isAdmMod) {
- $r->add(
- $r::GET,
- '/admin/',
- 'AdminIndex:index',
- 'Admin'
- );
- $r->add(
- $r::GET,
- '/admin/statistics',
- 'AdminStatistics:statistics',
- 'AdminStatistics'
- );
- if ($this->c->userRules->viewIP) {
- $r->add(
- $r::GET,
- '/admin/get/host/{ip:[0-9a-fA-F:.]+}',
- 'AdminHost:view',
- 'AdminHost'
- );
- $r->add(
- $r::GET,
- '/admin/users/user/{id:[2-9]|[1-9]\d+}[/{page:[1-9]\d*}]',
- 'AdminUsersStat:view',
- 'AdminUserStat'
- );
- }
- $r->add(
- $r::DUO,
- '/admin/users',
- 'AdminUsers:view',
- 'AdminUsers'
- );
- $r->add(
- $r::DUO,
- '/admin/users/result/{data}[/{page:[1-9]\d*}]',
- 'AdminUsersResult:view',
- 'AdminUsersResult'
- );
- $r->add(
- $r::DUO,
- '/admin/users/{action:\w+}/{ids:\d+(?:-\d+)*}[/{token}]',
- 'AdminUsersAction:view',
- 'AdminUsersAction'
- );
- $r->add(
- $r::GET,
- '/admin/users/promote/{uid:[2-9]|[1-9]\d+}/{pid:[1-9]\d*}/{token}',
- 'AdminUsersPromote:promote',
- 'AdminUserPromote'
- );
- if ($user->isAdmin) {
- $r->add(
- $r::DUO,
- '/admin/users/new',
- 'AdminUsersNew:view',
- 'AdminUsersNew'
- );
- $r->add(
- $r::PST,
- '/admin/users/recalculate',
- 'AdminUsers:recalculate',
- 'AdminUsersRecalculate'
- );
- }
- if ($this->c->userRules->banUsers) {
- $r->add(
- $r::DUO,
- '/admin/bans',
- 'AdminBans:view',
- 'AdminBans'
- );
- $r->add(
- $r::DUO,
- '/admin/bans/new[/{ids:\d+(?:-\d+)*}[/{uid:[2-9]|[1-9]\d+}]]',
- 'AdminBans:add',
- 'AdminBansNew'
- );
- $r->add(
- $r::DUO,
- '/admin/bans/edit/{id:[1-9]\d*}',
- 'AdminBans:edit',
- 'AdminBansEdit'
- );
- $r->add(
- $r::GET,
- '/admin/bans/result/{data}[/{page:[1-9]\d*}]',
- 'AdminBans:result',
- 'AdminBansResult'
- );
- $r->add(
- $r::GET,
- '/admin/bans/delete/{id:[1-9]\d*}/{token}[/{uid:[2-9]|[1-9]\d+}]',
- 'AdminBans:delete',
- 'AdminBansDelete'
- );
- }
- if (
- $user->isAdmin
- || '0' == $config->o_report_method
- || '2' == $config->o_report_method
- ) {
- $r->add(
- $r::GET,
- '/admin/reports',
- 'AdminReports:view',
- 'AdminReports'
- );
- $r->add(
- $r::GET,
- '/admin/reports/zap/{id:[1-9]\d*}/{token}',
- 'AdminReports:zap',
- 'AdminReportsZap'
- );
- }
- $r->add(
- $r::PST,
- '/moderate',
- 'Moderate:action',
- 'Moderate'
- );
- }
- // только админ
- if ($user->isAdmin) {
- $r->add(
- $r::GET,
- '/admin/statistics/info',
- 'AdminStatistics:info',
- 'AdminInfo'
- );
- $r->add(
- $r::DUO,
- '/admin/options',
- 'AdminOptions:edit',
- 'AdminOptions'
- );
- $r->add(
- $r::DUO,
- '/admin/permissions',
- 'AdminPermissions:edit',
- 'AdminPermissions'
- );
- $r->add(
- $r::DUO,
- '/admin/categories',
- 'AdminCategories:view',
- 'AdminCategories'
- );
- $r->add(
- $r::DUO,
- '/admin/categories/{id:[1-9]\d*}/delete',
- 'AdminCategories:delete',
- 'AdminCategoriesDelete'
- );
- $r->add(
- $r::DUO,
- '/admin/forums',
- 'AdminForums:view',
- 'AdminForums'
- );
- $r->add(
- $r::DUO,
- '/admin/forums/new',
- 'AdminForums:edit',
- 'AdminForumsNew'
- );
- $r->add(
- $r::DUO,
- '/admin/forums/{id:[1-9]\d*}/edit',
- 'AdminForums:edit',
- 'AdminForumsEdit'
- );
- $r->add(
- $r::DUO,
- '/admin/forums/{id:[1-9]\d*}/delete',
- 'AdminForums:delete',
- 'AdminForumsDelete'
- );
- $r->add(
- $r::GET,
- '/admin/groups',
- 'AdminGroups:view',
- 'AdminGroups'
- );
- $r->add(
- $r::PST,
- '/admin/groups/default',
- 'AdminGroups:defaultSet',
- 'AdminGroupsDefault'
- );
- $r->add(
- $r::PST,
- '/admin/groups/new[/{base:[1-9]\d*}]',
- 'AdminGroups:edit',
- 'AdminGroupsNew'
- );
- $r->add(
- $r::DUO,
- '/admin/groups/{id:[1-9]\d*}/edit',
- 'AdminGroups:edit',
- 'AdminGroupsEdit'
- );
- $r->add(
- $r::DUO,
- '/admin/groups/{id:[1-9]\d*}/delete',
- 'AdminGroups:delete',
- 'AdminGroupsDelete'
- );
- $r->add(
- $r::DUO,
- '/admin/censoring',
- 'AdminCensoring:edit',
- 'AdminCensoring'
- );
- $r->add(
- $r::DUO,
- '/admin/maintenance',
- 'AdminMaintenance:view',
- 'AdminMaintenance'
- );
- $r->add(
- $r::PST,
- '/admin/maintenance/rebuild',
- 'AdminMaintenance:rebuild',
- 'AdminMaintenanceRebuild'
- );
- $r->add(
- $r::GET,
- '/admin/maintenance/rebuild/{token}/{clear:[01]}/{limit:[1-9]\d*}/{start:[1-9]\d*}',
- 'AdminMaintenance:rebuild',
- 'AdminRebuildIndex'
- );
- }
- $uri = $_SERVER['REQUEST_URI'];
- if (false !== ($pos = \strpos($uri, '?'))) {
- $uri = \substr($uri, 0, $pos);
- }
- $uri = \rawurldecode($uri);
- $method = $_SERVER['REQUEST_METHOD'];
- $route = $r->route($method, $uri);
- $page = null;
- switch ($route[0]) {
- case $r::OK:
- // ... 200 OK
- list($page, $action) = \explode(':', $route[1], 2);
- $page = $this->c->$page->$action($route[2], $method);
- break;
- case $r::NOT_FOUND:
- // ... 404 Not Found
- if (
- '1' != $user->g_read_board
- && $user->isGuest
- ) {
- $page = $this->c->Redirect->page('Login');
- } else {
- $page = $this->c->Message->message('Bad request');
- }
- break;
- case $r::METHOD_NOT_ALLOWED:
- // ... 405 Method Not Allowed
- $page = $this->c->Message->message('Bad request', true, 405, ['Allow: ' . \implode(',', $route[1])]);
- break;
- case $r::NOT_IMPLEMENTED:
- // ... 501 Not implemented
- $page = $this->c->Message->message('Bad request', true, 501);
- break;
- }
- return $page;
- }
- }
|