From a508190185f37aeb96311087f662647951d2100e Mon Sep 17 00:00:00 2001 From: flashwave Date: Fri, 12 Jul 2024 15:31:06 +0000 Subject: [PATCH] Updated Minecraft website code with new endpoints and new mod jar. --- public/dl/flashii-extensions-1.1.0.jar | Bin 0 -> 31425 bytes src/MojangInterop.php | 23 ++++---- src/SkinsRoutes.php | 72 ++++++++++++++++++------- templates/downloads.twig | 3 +- templates/guide.twig | 7 +-- 5 files changed, 70 insertions(+), 35 deletions(-) create mode 100644 public/dl/flashii-extensions-1.1.0.jar diff --git a/public/dl/flashii-extensions-1.1.0.jar b/public/dl/flashii-extensions-1.1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..0be8c38c7c6e372daacbb77089c746d452b0b92f GIT binary patch literal 31425 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 j(^rx(l9(Zt2>`LF*6ZPCr2 literal 0 HcmV?d00001 diff --git a/src/MojangInterop.php b/src/MojangInterop.php index 153551e..64cdb6c 100644 --- a/src/MojangInterop.php +++ b/src/MojangInterop.php @@ -36,10 +36,6 @@ final class MojangInterop { public static function registerRoutes(IRouter $router): void { $router->get('/uuid', fn($response, $request) => self::uuidResolver($response, $request)); $router->get('/blockedservers', fn($response, $request) => self::proxyBlockServers($response, $request)); - - // figure out how to proxy these someday to keep online mode working transparently - $router->get('/session/minecraft/hasJoined', fn() => 501); - $router->post('/session/minecraft/join', fn() => 501); } public static function uuidResolver(HttpResponseBuilder $response, HttpRequest $request): string { @@ -132,16 +128,19 @@ final class MojangInterop { return json_decode($info->body); } - public static function proxySessionMinecraftProfile(HttpResponseBuilder $response, HttpRequest $request, string $uuid): string { + public static function proxySessionMinecraftProfile(?HttpResponseBuilder $response, HttpRequest $request, string $uuid): string { $info = self::getSessionMinecraftProfileRaw($uuid, $request->getHeaderLine('User-Agent')); - $response->setStatusCode((int)$info->status[1]); - $response->setCacheControl('max-age=30'); - foreach($info->headers as $header) { - [$name, $value] = explode(':', $header); - $name = strtolower(trim($name)); - if(str_starts_with($name, 'x-') || $name === 'content-type') - $response->setHeader($name, $value); + if($response !== null) { + $response->setStatusCode((int)$info->status[1]); + $response->setCacheControl('max-age=30'); + + foreach($info->headers as $header) { + [$name, $value] = explode(':', $header); + $name = strtolower(trim($name)); + if(str_starts_with($name, 'x-') || $name === 'content-type') + $response->setHeader($name, $value); + } } return $info->body; diff --git a/src/SkinsRoutes.php b/src/SkinsRoutes.php index d8b2bbc..2c2f2a6 100644 --- a/src/SkinsRoutes.php +++ b/src/SkinsRoutes.php @@ -9,7 +9,7 @@ use RuntimeException; use Index\XString; use Index\Http\Routing\{RouteHandler,HttpGet,HttpMiddleware,HttpPost}; use Index\Security\CSRFP; -use Ramsey\Uuid\Uuid; +use Ramsey\Uuid\{Uuid,UuidInterface}; use Sasae\SasaeEnvironment; class SkinsRoutes extends RouteHandler { @@ -326,22 +326,7 @@ class SkinsRoutes extends RouteHandler { $response->redirect('/skins'); } - #[HttpGet('/session/minecraft/profile/([a-fA-F0-9\-]+)')] - public function getSessionMinecraftProfile($response, $request, string $id) { - try { - $uuid = Uuid::fromString($id); - } catch(InvalidArgumentException $ex) { - $response->setStatusCode(400); - return [ - 'path' => sprintf('/session/minecraft/profile/%s', $id), - 'errorMessage' => sprintf('Not a valid UUID: %s', $id), - ]; - } - - if(MojangInterop::isMojangId($uuid)) - return MojangInterop::proxySessionMinecraftProfile($response, $request, $id); - - $response->setCacheControl('max-age=30'); + private function getProfileInfo(UuidInterface $uuid, bool $includeProfileActions) { if(!MojangInterop::isOfflineId($uuid)) return 204; @@ -368,10 +353,9 @@ class SkinsRoutes extends RouteHandler { $profileId = (string)$uuid->getHex(); $profileName = $linkInfo->getName(); - return [ + $profileInfo = [ 'id' => $profileId, 'name' => $profileName, - 'profileActions' => [], 'properties' => [ [ 'name' => 'textures', @@ -384,6 +368,56 @@ class SkinsRoutes extends RouteHandler { ], ], ]; + + if($includeProfileActions) + $profileInfo['profileActions'] = []; + + return $profileInfo; + } + + #[HttpGet('/session/minecraft/profile/([a-fA-F0-9\-]+)')] + public function getSessionMinecraftProfile($response, $request, string $id) { + try { + $uuid = Uuid::fromString($id); + } catch(InvalidArgumentException $ex) { + $response->setStatusCode(400); + return [ + 'path' => sprintf('/session/minecraft/profile/%s', $id), + 'errorMessage' => sprintf('Not a valid UUID: %s', $id), + ]; + } + + if(MojangInterop::isMojangId($uuid)) { + $raw = MojangInterop::proxySessionMinecraftProfile(null, $request, $id); + $result = json_decode($raw); + if(!is_object($result)) + return $raw; + + $uuid = MojangInterop::createOfflinePlayerUUID($result->name); + } + + $response->setCacheControl('max-age=30'); + + return $this->getProfileInfo($uuid, true); + } + + #[HttpPost('/session/minecraft/join')] + public function postSessionMinecraftJoin($response, $request) { + if(!$request->isJsonContent()) + return 415; + + // just accept this always idk if it matters + return 204; + } + + #[HttpGet('/session/minecraft/hasJoined')] + public function getSessionMinecraftHasJoined($response, $request) { + $userName = (string)$request->getParam('username'); + $serverId = (string)$request->getParam('serverId'); + $remoteAddr = (string)$request->getParam('ip'); + $uuid = MojangInterop::createOfflinePlayerUUID($userName); + + return $this->getProfileInfo($uuid, false); } #[HttpGet('/users/profiles/minecraft/([A-Za-z0-9_]+)')] diff --git a/templates/downloads.twig b/templates/downloads.twig index e10b686..cc3d14c 100644 --- a/templates/downloads.twig +++ b/templates/downloads.twig @@ -13,7 +13,8 @@

This as a mod built on Fabric to alter the server your Minecraft client uses to request skins from Mojang's to ours. This mod is likely why you're on this page.

diff --git a/templates/guide.twig b/templates/guide.twig index 4fac96f..160c922 100644 --- a/templates/guide.twig +++ b/templates/guide.twig @@ -6,6 +6,7 @@

Guide to getting you started

This guide will walk you through the steps of settings up a client and connecting to one of our servers.

+

IMPORTANT: I will not be updating this guide for every new version of things that come out, unless the process changes drastically. Prism Launcher does a good job of telling you what version of Fabric is good for your selected version of Minecraft using the little star icon.

@@ -23,7 +24,7 @@ For some reason Oracle doesn't make their own new versions of Java and restrictive licences likely prevent Mojang and Prism from distributing their own, so we're going to have to download one ourselves. This part may only apply to Windows, I'm not sure how it would go on macOS and I can't be bothered to test on Linux distributions so you might have to improvise for this step.

-

Go to the Adoptium Website

+

Go to the Adoptium Website

Click on the ".msi" button for whichever architecture is applicable to you (likely x64) and install it. Make sure the installer is set to install Set JAVA_HOME variable and JavaSoft (Oracle) registry keys or you will have issues later on. @@ -46,8 +47,8 @@

The first time you start it you'll be asked to pick a language and what version of Java to use. If you properly followed the previous step the Adoptium JVM should be immediately selected. - If you did not properly follow the previous step, the path of the javaw.exe should be something among the lines of C:/Program Files/Eclipse Adoptium/jdk-17.0.8.7-hotspot/bin/javaw.exe. - During the next step of the Quick Setup, make sure to select Background Cat (from MultiMC) because he's epic. + If you did not properly follow the previous step, the path of the javaw.exe should be something among the lines of C:/Program Files/Eclipse Adoptium/jdk-21.0.2.13-hotspot/bin/javaw.exe. + During the next step of the Quick Setup, make sure to select Background Cat (from MultiMC) because they are epic.

You should now be at the main screen of Prism Launcher!