From da130e58551e0a62cc1cbc464f5159dd3de703d3 Mon Sep 17 00:00:00 2001 From: flashwave Date: Sat, 5 Oct 2024 15:25:27 +0000 Subject: [PATCH] Updated to use URL registry. --- public/index.php | 19 ++++++++++++++++--- src/ClientsRoutes.php | 25 ++++++++++++++++--------- src/HomeRoutes.php | 14 ++++++++++---- src/SkinsRoutes.php | 34 +++++++++++++++++++++------------- templates/clients/index.twig | 10 +++++----- templates/downloads.twig | 2 +- templates/guide.twig | 6 +++--- templates/index.twig | 6 +++++- templates/master.twig | 12 ++++++------ templates/skins/index.twig | 12 ++++++------ 10 files changed, 89 insertions(+), 51 deletions(-) diff --git a/public/index.php b/public/index.php index d06431d..c1d3620 100644 --- a/public/index.php +++ b/public/index.php @@ -4,6 +4,7 @@ namespace Mince; use Index\CsrfToken; use Index\Http\Routing\HttpRouter; use Index\Templating\TplEnvironment; +use Index\Urls\ArrayUrlRegistry; require_once __DIR__ . '/../mince.php'; @@ -36,13 +37,25 @@ $authorisations->prune(); $verifications = new Verifications($db); $verifications->prune(); +$urls = new ArrayUrlRegistry; +$templating->addFunction('url', $urls->format(...)); + $router = new HttpRouter(errorHandler: new RouterErrorHandler($templating)); $router->use('/', function($response, $request) { $response->setPoweredBy('Mince'); }); $router->register(new RpcRoutes($users, $accountLinks, $authorisations, $verifications, $cfg->getString('rpc:secret'), $cfg->getString('urls:clients'))); -$router->register(new HomeRoutes($templating, new Servers($db), $authInfo, $cfg->getString('site:login'))); -$router->register(new ClientsRoutes($templating, $accountLinks, $authorisations, $verifications, $csrfp, $authInfo)); -$router->register(new SkinsRoutes($templating, $accountLinks, new Skins($db), new Capes($db), $csrfp, $authInfo, $cfg->getString('urls:skins_base'))); + +$homeRoutes = new HomeRoutes($templating, $urls, new Servers($db), $authInfo, $cfg->getString('site:login')); +$router->register($homeRoutes); +$urls->register($homeRoutes); + +$clientRoutes = new ClientsRoutes($templating, $urls, $accountLinks, $authorisations, $verifications, $csrfp, $authInfo); +$router->register($clientRoutes); +$urls->register($clientRoutes); + +$skinsRoutes = new SkinsRoutes($templating, $urls, $accountLinks, new Skins($db), new Capes($db), $csrfp, $authInfo, $cfg->getString('urls:skins_base')); +$router->register($skinsRoutes); +$urls->register($skinsRoutes); MojangInterop::registerRoutes($router); diff --git a/src/ClientsRoutes.php b/src/ClientsRoutes.php index 36e166a..a9c63c7 100644 --- a/src/ClientsRoutes.php +++ b/src/ClientsRoutes.php @@ -6,13 +6,15 @@ use RuntimeException; use Index\CsrfToken; use Index\Http\Routing\{HttpGet,HttpMiddleware,HttpPost,RouteHandler,RouteHandlerTrait}; use Index\Templating\TplEnvironment; +use Index\Urls\{UrlFormat,UrlRegistry,UrlSource,UrlSourceTrait}; use Ramsey\Uuid\Uuid; -class ClientsRoutes implements RouteHandler { - use RouteHandlerTrait; +class ClientsRoutes implements RouteHandler, UrlSource { + use RouteHandlerTrait, UrlSourceTrait; public function __construct( private TplEnvironment $templating, + private UrlRegistry $urls, private AccountLinks $accountLinks, private Authorisations $authorisations, private Verifications $verifications, @@ -44,6 +46,7 @@ class ClientsRoutes implements RouteHandler { ]; #[HttpGet('/clients')] + #[UrlFormat('clients:index', '/clients', ['error' => ''])] public function getClients($response, $request) { $template = $this->templating->load('clients/index'); @@ -76,16 +79,17 @@ class ClientsRoutes implements RouteHandler { } #[HttpPost('/clients/link')] + #[UrlFormat('clients:link', '/clients/link')] public function postLink($response, $request) { if($this->accountLinks->checkHasLink($this->authInfo->user_id)) { - $response->redirect('/clients?error=link:already'); + $response->redirect($this->urls->format('clients:index', ['error' => 'link:already'])); return; } $body = $request->getContent(); $code = (string)$body->getParam('code'); if(strlen($code) !== 10) { - $response->redirect('/clients?error=link:format'); + $response->redirect($this->urls->format('clients:index', ['error' => 'link:format'])); return; } @@ -94,7 +98,7 @@ class ClientsRoutes implements RouteHandler { try { $verifyInfo = $this->verifications->getVerification(code: $code); } catch(RuntimeException $ex) { - $response->redirect('/clients?error=link:code'); + $response->redirect($this->urls->format('clients:index', ['error' => 'link:code'])); return; } @@ -102,16 +106,18 @@ class ClientsRoutes implements RouteHandler { $this->accountLinks->createLink($this->authInfo->user_id, $verifyInfo); $this->authorisations->createAuthorisation($verifyInfo, grant: true); - $response->redirect('/clients'); + $response->redirect($this->urls->format('clients:index')); } #[HttpPost('/clients/unlink')] + #[UrlFormat('clients:unlink', '/clients/unlink')] public function postUnlink($response) { $this->accountLinks->deleteLink(userInfo: $this->authInfo->user_id); - $response->redirect('/clients'); + $response->redirect($this->urls->format('clients:index')); } #[HttpPost('/clients/authorise')] + #[UrlFormat('clients:authorise', '/clients/authorise')] public function postAuthorise($response, $request) { $body = $request->getContent(); $authId = (string)$body->getParam('auth'); @@ -137,10 +143,11 @@ class ClientsRoutes implements RouteHandler { $this->authorisations->setAuthorisationGranted($authInfo); - $response->redirect('/clients'); + $response->redirect($this->urls->format('clients:index')); } #[HttpPost('/clients/deauthorise')] + #[UrlFormat('clients:deauthorise', '/clients/deauthorise')] public function postDeauthorise($response, $request) { $body = $request->getContent(); $authId = (string)$body->getParam('auth'); @@ -170,6 +177,6 @@ class ClientsRoutes implements RouteHandler { $this->authorisations->deleteAuthorisations(authInfo: $authInfo); } - $response->redirect('/clients'); + $response->redirect($this->urls->format('clients:index')); } } diff --git a/src/HomeRoutes.php b/src/HomeRoutes.php index f635e77..7792233 100644 --- a/src/HomeRoutes.php +++ b/src/HomeRoutes.php @@ -2,19 +2,22 @@ namespace Mince; use Index\Http\Routing\{HttpGet,RouteHandler,RouteHandlerTrait}; +use Index\Urls\{UrlFormat,UrlRegistry,UrlSource,UrlSourceTrait}; use Index\Templating\TplEnvironment; -class HomeRoutes implements RouteHandler { - use RouteHandlerTrait; +class HomeRoutes implements RouteHandler, UrlSource { + use RouteHandlerTrait, UrlSourceTrait; public function __construct( private TplEnvironment $templating, + private UrlRegistry $urls, private Servers $servers, private object $userInfo, private string $loginUrl ) {} #[HttpGet('/')] + #[UrlFormat('index', '/')] public function getIndex($response, $request) { return $this->templating->render('index', [ 'servers' => iterator_to_array($this->servers->getServers(deleted: false)), @@ -22,22 +25,25 @@ class HomeRoutes implements RouteHandler { } #[HttpGet('/login')] + #[UrlFormat('login', '/login')] public function getLogin($response) { - $response->redirect($this->userInfo->success ? '/' : $this->loginUrl); + $response->redirect($this->userInfo->success ? $this->urls->format('index') : $this->loginUrl); } #[HttpGet('/downloads')] + #[UrlFormat('downloads', '/downloads')] public function getDownloads() { return $this->templating->render('downloads'); } #[HttpGet('/guide')] + #[UrlFormat('guide', '/guide')] public function getGuide() { return $this->templating->render('guide'); } #[HttpGet('/index.php')] public function getRedirect($response) { - $response->redirect('/', true); + $response->redirect($this->urls->format('index'), true); } } diff --git a/src/SkinsRoutes.php b/src/SkinsRoutes.php index 25f6577..f76a5cb 100644 --- a/src/SkinsRoutes.php +++ b/src/SkinsRoutes.php @@ -9,10 +9,11 @@ use RuntimeException; use Index\{CsrfToken,XString}; use Index\Http\Routing\{HttpGet,HttpMiddleware,HttpPost,RouteHandler,RouteHandlerTrait}; use Index\Templating\TplEnvironment; +use Index\Urls\{UrlFormat,UrlRegistry,UrlSource,UrlSourceTrait}; use Ramsey\Uuid\{Uuid,UuidInterface}; -class SkinsRoutes implements RouteHandler { - use RouteHandlerTrait; +class SkinsRoutes implements RouteHandler, UrlSource { + use RouteHandlerTrait, UrlSourceTrait; private const TEXTURES_DIR = '/textures'; private const TEXTURES_PATH = MCR_DIR_PUB . self::TEXTURES_DIR; @@ -21,6 +22,7 @@ class SkinsRoutes implements RouteHandler { public function __construct( private TplEnvironment $templating, + private UrlRegistry $urls, private AccountLinks $accountLinks, private Skins $skins, private Capes $capes, @@ -61,7 +63,7 @@ class SkinsRoutes implements RouteHandler { try { $this->linkInfo = $this->accountLinks->getLink(userInfo: $this->authInfo->user_id); } catch(RuntimeException $ex) { - $response->redirect('/clients'); + $response->redirect($this->urls->format('clients:index')); return true; } @@ -88,6 +90,7 @@ class SkinsRoutes implements RouteHandler { ]; #[HttpGet('/skins')] + #[UrlFormat('skins:index', '/skins', ['error' => ''])] public function getSkins($response, $request) { $skinInfo = $this->skins->getSkin($this->linkInfo); $skinPath = $skinInfo === null ? null : $this->getRemotePath($skinInfo->getHash(), false); @@ -121,6 +124,7 @@ class SkinsRoutes implements RouteHandler { } #[HttpPost('/skins/upload-skin')] + #[UrlFormat('skins:skin:upload', '/skins/upload-skin')] public function postUploadSkin($response, $request) { $body = $request->getContent(); if(!$body->hasUploadedFile('texture')) @@ -130,12 +134,12 @@ class SkinsRoutes implements RouteHandler { $model = (string)$body->getParam('model'); if(!in_array($model, Skins::MODELS)) { - $response->redirect('/skins?error=skin:model'); + $response->redirect($this->urls->format('skins:index', ['error' => 'skin:model'])); return; } if($texture->getSize() > 512000) { - $response->redirect('/skins?error=skin:size'); + $response->redirect($this->urls->format('skins:index', ['error' => 'skin:size'])); return; } @@ -153,7 +157,7 @@ class SkinsRoutes implements RouteHandler { $imagick->writeImage(); $imagick->destroy(); } catch(ImagickException $ex) { - $response->redirect('/skins?error=skin:format'); + $response->redirect($this->urls->format('skins:index', ['error' => 'skin:format'])); return; } @@ -180,10 +184,11 @@ class SkinsRoutes implements RouteHandler { $this->deleteLocalFileMaybe($hash); } - $response->redirect('/skins'); + $response->redirect($this->urls->format('skins:index')); } #[HttpPost('/skins/delete-skin')] + #[UrlFormat('skins:skin:delete', '/skins/delete-skin')] public function postDeleteSkin($response) { $skinInfo = $this->skins->getSkin($this->linkInfo); if($skinInfo !== null) { @@ -191,10 +196,11 @@ class SkinsRoutes implements RouteHandler { $this->deleteLocalFileMaybe($skinInfo->getHash()); } - $response->redirect('/skins'); + $response->redirect($this->urls->format('skins:index')); } #[HttpPost('/skins/upload-cape')] + #[UrlFormat('skins:cape:upload', '/skins/upload-cape')] public function postUploadCape($response, $request) { $body = $request->getContent(); if(!$body->hasUploadedFile('texture')) @@ -202,7 +208,7 @@ class SkinsRoutes implements RouteHandler { $texture = $body->getUploadedFile('texture'); if($texture->getSize() > 256000) { - $response->redirect('/skins?error=cape:size'); + $response->redirect($this->urls->format('skins:index', ['error' => 'cape:size'])); return; } @@ -217,7 +223,7 @@ class SkinsRoutes implements RouteHandler { $imagick->writeImage(); $imagick->destroy(); } catch(ImagickException $ex) { - $response->redirect('/skins?error=cape:format'); + $response->redirect($this->urls->format('skins:index', ['error' => 'cape:format'])); return; } @@ -243,10 +249,11 @@ class SkinsRoutes implements RouteHandler { $this->deleteLocalFileMaybe($hash); } - $response->redirect('/skins'); + $response->redirect($this->urls->format('skins:index')); } #[HttpPost('/skins/delete-cape')] + #[UrlFormat('skins:cape:delete', '/skins/delete-cape')] public function postDeleteCape($response) { $capeInfo = $this->capes->getCape($this->linkInfo); if($capeInfo !== null) { @@ -254,10 +261,11 @@ class SkinsRoutes implements RouteHandler { $this->deleteLocalFileMaybe($capeInfo->getHash()); } - $response->redirect('/skins'); + $response->redirect($this->urls->format('skins:index')); } #[HttpPost('/skins/import')] + #[UrlFormat('skins:import', '/skins/import')] public function postImport($response, $request) { $body = $request->getContent(); $userAgent = $request->getHeaderLine('User-Agent'); @@ -324,7 +332,7 @@ class SkinsRoutes implements RouteHandler { } } - $response->redirect('/skins'); + $response->redirect($this->urls->format('skins:index')); } private function getProfileInfo(UuidInterface $uuid, bool $includeProfileActions) { diff --git a/templates/clients/index.twig b/templates/clients/index.twig index 068da78..a515cf3 100644 --- a/templates/clients/index.twig +++ b/templates/clients/index.twig @@ -17,7 +17,7 @@

{{ error.message }}

{% endif %} -
+