dbConn = $dbConn; $this->config = $config; $this->users = new Users($this->dbConn); } public function getDbQueryCount(): int { $result = $this->dbConn->query('SHOW SESSION STATUS LIKE "Questions"'); return $result->next() ? $result->getInteger(0) : 0; } public function createMigrationManager(): DbMigrationManager { return new DbMigrationManager($this->dbConn, 'msz_' . DbMigrationManager::DEFAULT_TABLE); } public function createMigrationRepo(): IDbMigrationRepo { return new FsDbMigrationRepo(MSZ_MIGRATIONS); } public function getConfig(): IConfig { return $this->config; } public function getRouter(): Router { return $this->router->getRouter(); } /*public function getUsers(): Users { return $this->users; }*/ public function getGeoIP(): GeoIPHelper { if($this->geoIP === null) return $this->geoIP = new GeoIPHelper($this->config->scopeTo('geoip')); return $this->geoIP; } public function setUpHttp(bool $legacy = false): void { $this->router = new HttpFx; $this->router->use('/', function($response) { $response->setPoweredBy('Misuzu'); }); $this->registerErrorPages(); if($legacy) $this->registerLegacyRedirects(); else $this->registerHttpRoutes(); } public function dispatchHttp(?HttpRequest $request = null): void { $this->router->dispatch($request); } private function registerErrorPages(): void { $this->router->addErrorHandler(400, function($response) { $response->setContent(Template::renderRaw('errors.400')); }); $this->router->addErrorHandler(403, function($response) { $response->setContent(Template::renderRaw('errors.403')); }); $this->router->addErrorHandler(404, function($response) { $response->setContent(Template::renderRaw('errors.404')); }); $this->router->addErrorHandler(500, function($response) { $response->setContent(file_get_contents(MSZ_TEMPLATES . '/500.html')); }); $this->router->addErrorHandler(503, function($response) { $response->setContent(file_get_contents(MSZ_TEMPLATES . '/503.html')); }); } private function registerHttpRoutes(): void { function msz_compat_handler(string $className, string $method) { return function(...$args) use ($className, $method) { $className = "\\Misuzu\\Http\\Handlers\\{$className}Handler"; return (new $className)->{$method}(...$args); }; } $this->router->get('/', msz_compat_handler('Home', 'index')); $this->router->get('/assets/:filename', msz_compat_handler('Assets', 'serveComponent')); $this->router->get('/assets/avatar/:filename', msz_compat_handler('Assets', 'serveAvatar')); $this->router->get('/assets/profile-background/:filename', msz_compat_handler('Assets', 'serveProfileBackground')); $this->router->get('/info', msz_compat_handler('Info', 'index')); $this->router->get('/info/:name', msz_compat_handler('Info', 'page')); $this->router->get('/info/:project/:name', msz_compat_handler('Info', 'page')); $this->router->get('/changelog', msz_compat_handler('Changelog', 'index')); $this->router->get('/changelog.rss', msz_compat_handler('Changelog', 'feedRss')); $this->router->get('/changelog.atom', msz_compat_handler('Changelog', 'feedAtom')); $this->router->get('/changelog/change/:id', msz_compat_handler('Changelog', 'change')); $this->router->get('/news', msz_compat_handler('News', 'index')); $this->router->get('/news.rss', msz_compat_handler('News', 'feedIndexRss')); $this->router->get('/news.atom', msz_compat_handler('News', 'feedIndexAtom')); $this->router->get('/news/:category', msz_compat_handler('News', 'viewCategory')); $this->router->get('/news/post/:id', msz_compat_handler('News', 'viewPost')); $this->router->get('/forum/mark-as-read', msz_compat_handler('Forum', 'markAsReadGET')); $this->router->post('/forum/mark-as-read', msz_compat_handler('Forum', 'markAsReadPOST')); new SharpChatRoutes($this->router, $this->config->scopeTo('sockChat')); } private function registerLegacyRedirects(): void { $this->router->get('/index.php', function($response) { $response->redirect(url('index'), true); }); $this->router->get('/info.php', function($response) { $response->redirect(url('info'), true); }); $this->router->get('/settings.php', function($response) { $response->redirect(url('settings-index'), true); }); $this->router->get('/changelog.php', function($response, $request) { $changeId = $request->getParam('c', FILTER_SANITIZE_NUMBER_INT); if($changeId) { $response->redirect(url('changelog-change', ['change' => $changeId]), true); return; } $response->redirect(url('changelog-index', [ 'date' => $request->getParam('d'), 'user' => $request->getParam('u', FILTER_SANITIZE_NUMBER_INT), ]), true); }); $infoRedirect = function($response, $request, string ...$parts) { $response->redirect(url('info', ['title' => implode('/', $parts)]), true); }; $this->router->get('/info.php/:name', $infoRedirect); $this->router->get('/info.php/:project/:name', $infoRedirect); $this->router->get('/auth.php', function($response, $request) { $response->redirect(url([ 'logout' => 'auth-logout', 'reset' => 'auth-reset', 'forgot' => 'auth-forgot', 'register' => 'auth-register', ][$request->getParam('m')] ?? 'auth-login'), true); }); $this->router->get('/news.php', function($response, $request) { $postId = $request->getParam('n', FILTER_SANITIZE_NUMBER_INT) ?? $request->getParam('p', FILTER_SANITIZE_NUMBER_INT); if($postId > 0) $location = url('news-post', ['post' => $postId]); else { $catId = $request->getParam('c', FILTER_SANITIZE_NUMBER_INT); $pageId = $request->getParam('page', FILTER_SANITIZE_NUMBER_INT); $location = url($catId > 0 ? 'news-category' : 'news-index', ['category' => $catId, 'page' => $pageId]); } $response->redirect($location, true); }); $this->router->get('/news.php/rss', function($response, $request) { $catId = $request->getParam('c', FILTER_SANITIZE_NUMBER_INT); $location = url($catId > 0 ? 'news-category-feed-rss' : 'news-feed-rss', ['category' => $catId]); $response->redirect($location, true); }); $this->router->get('/news.php/atom', function($response, $request) { $catId = $request->getParam('c', FILTER_SANITIZE_NUMBER_INT); $location = url($catId > 0 ? 'news-category-feed-atom' : 'news-feed-atom', ['category' => $catId]); $response->redirect($location, true); }); $this->router->get('/news/index.php', function($response) { $response->redirect(url('news-index', [ 'page' => $request->getParam('page', FILTER_SANITIZE_NUMBER_INT), ]), true); }); $this->router->get('/news/category.php', function($response, $request) { $response->redirect(url('news-category', [ 'category' => $request->getParam('c', FILTER_SANITIZE_NUMBER_INT), 'page' => $request->getParam('p', FILTER_SANITIZE_NUMBER_INT), ]), true); }); $this->router->get('/news/post.php', function($response, $request) { $response->redirect(url('news-post', [ 'post' => $request->getParam('p', FILTER_SANITIZE_NUMBER_INT), ]), true); }); $this->router->get('/news/feed.php', function() { return 400; }); $this->router->get('/news/feed.php/rss', function($response, $request) { $response->redirect(url( $catId > 0 ? 'news-category-feed-rss' : 'news-feed-rss', ['category' => $request->getParam('c', FILTER_SANITIZE_NUMBER_INT)] ), true); }); $this->router->get('/news/feed.php/atom', function($response, $request) { $response->redirect(url( $catId > 0 ? 'news-category-feed-atom' : 'news-feed-atom', ['category' => $request->getParam('c', FILTER_SANITIZE_NUMBER_INT)] ), true); }); $this->router->get('/user-assets.php', function($response, $request) { return (new \Misuzu\Http\Handlers\AssetsHandler)->serveLegacy($response, $request); }); } }