From 574d03d02f078d594ec6f54063ffbe0f9ddf075a Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Mon, 20 Nov 2023 05:36:39 +0500 Subject: [PATCH] Add a redirect for new Usernames to UUIDs endpoint (#29) * fix: add redirect for new "Usernames to UUIDs" endpoint location "As of 23w42a, the endpoint moved to: 'POST https://sessionserver.mojang.com/session/minecraft/profile/lookup/bulk/byname' " https://wiki.vg/Mojang_API#Usernames_to_UUIDs * add a redirect for authlib-injector too Signed-off-by: Octol1ttle * revert: .gitignore Signed-off-by: Octol1ttle * tests: pass new URL to existing tests Signed-off-by: Octol1ttle * review: address requested changes Signed-off-by: Octol1ttle * style: add type hints to MinecraftProfilesCest functions too Signed-off-by: Octol1ttle --------- Signed-off-by: Octol1ttle --- api/config/routes.php | 2 + api/tests/_pages/MojangApiRoute.php | 5 -- .../authlibInjector/MinecraftProfilesCest.php | 72 ++++++++++++++----- .../mojang/UsernamesToUuidsCest.php | 72 ++++++++++++------- 4 files changed, 103 insertions(+), 48 deletions(-) diff --git a/api/config/routes.php b/api/config/routes.php index 9eccb63..3f837b5 100644 --- a/api/config/routes.php +++ b/api/config/routes.php @@ -41,6 +41,7 @@ return [ '/minecraft/session/hasJoined' => 'session/session/has-joined', '/minecraft/session/legacy/hasJoined' => 'session/session/has-joined-legacy', '/minecraft/session/profile/' => 'session/session/profile', + 'POST /minecraft/session/profile/lookup/bulk/byname' => 'mojang/api/uuids-by-usernames', // Mojang API module routes '/mojang/profiles/' => 'mojang/api/uuid-by-username', @@ -54,4 +55,5 @@ return [ '/authlib-injector/sessionserver/session/minecraft/hasJoined' => 'session/session/has-joined', '/authlib-injector/sessionserver/session/minecraft/profile/' => 'session/session/profile', '/authlib-injector/api/profiles/minecraft' => 'mojang/api/uuids-by-usernames', + '/authlib-injector/sessionserver/session/minecraft/profile/lookup/bulk/byname' => 'mojang/api/uuids-by-usernames', ]; diff --git a/api/tests/_pages/MojangApiRoute.php b/api/tests/_pages/MojangApiRoute.php index 3fdebb1..2298343 100644 --- a/api/tests/_pages/MojangApiRoute.php +++ b/api/tests/_pages/MojangApiRoute.php @@ -11,9 +11,4 @@ class MojangApiRoute extends BasePage { public function usernamesByUuid($uuid) { $this->getActor()->sendGET("/api/mojang/profiles/{$uuid}/names"); } - - public function uuidsByUsernames($uuids) { - $this->getActor()->sendPOST('/api/mojang/profiles', $uuids); - } - } diff --git a/api/tests/functional/authlibInjector/MinecraftProfilesCest.php b/api/tests/functional/authlibInjector/MinecraftProfilesCest.php index 6159869..0c39392 100644 --- a/api/tests/functional/authlibInjector/MinecraftProfilesCest.php +++ b/api/tests/functional/authlibInjector/MinecraftProfilesCest.php @@ -4,11 +4,15 @@ declare(strict_types=1); namespace api\tests\functional\authlibInjector; use api\tests\FunctionalTester; +use Codeception\Example; final class MinecraftProfilesCest { - public function geUuidByOneUsername(FunctionalTester $I) { - $I->sendPOST('/api/authlib-injector/api/profiles/minecraft', ['Admin']); + /** + * @dataProvider bulkProfilesEndpoints + */ + public function getUuidByOneUsername(FunctionalTester $I, Example $url) : void { + $I->sendPOST($url[0], ['Admin']); $I->canSeeResponseCodeIs(200); $I->canSeeResponseContainsJson([ [ @@ -18,21 +22,32 @@ final class MinecraftProfilesCest { ]); } - public function getUuidsByUsernames(FunctionalTester $I) { - $I->sendPOST('/api/authlib-injector/api/profiles/minecraft', ['Admin', 'AccWithOldPassword', 'Notch']); + /** + * @dataProvider bulkProfilesEndpoints + */ + public function getUuidsByUsernames(FunctionalTester $I, Example $url) : void { + $I->sendPOST($url[0], ['Admin', 'AccWithOldPassword', 'Notch']); $this->validateFewValidUsernames($I); } - public function getUuidsByUsernamesWithPostString(FunctionalTester $I) { + + /** + * @dataProvider bulkProfilesEndpoints + */ + public function getUuidsByUsernamesWithPostString(FunctionalTester $I, Example $url) : void { $I->sendPOST( - '/api/authlib-injector/api/profiles/minecraft', + $url[0], json_encode(['Admin', 'AccWithOldPassword', 'Notch']), ); $this->validateFewValidUsernames($I); } - public function getUuidsByPartialNonexistentUsernames(FunctionalTester $I) { - $I->sendPOST('/api/authlib-injector/api/profiles/minecraft', ['Admin', 'DeletedAccount', 'not-exists-user']); + + /** + * @dataProvider bulkProfilesEndpoints + */ + public function getUuidsByPartialNonexistentUsernames(FunctionalTester $I, Example $url) : void { + $I->sendPOST($url[0], ['Admin', 'DeletedAccount', 'not-exists-user']); $I->canSeeResponseCodeIs(200); $I->canSeeResponseContainsJson([ [ @@ -44,20 +59,28 @@ final class MinecraftProfilesCest { $I->cantSeeResponseJsonMatchesJsonPath('$.[?(@.name="not-exists-user")]'); } - public function passAllNonexistentUsernames(FunctionalTester $I) { - $I->sendPOST('/api/authlib-injector/api/profiles/minecraft', ['not-exists-1', 'not-exists-2']); + + /** + * @dataProvider bulkProfilesEndpoints + */ + public function passAllNonexistentUsernames(FunctionalTester $I, Example $url) : void { + $I->sendPOST($url[0], ['not-exists-1', 'not-exists-2']); $I->canSeeResponseCodeIs(200); $I->canSeeResponseIsJson(); $I->canSeeResponseEquals('[]'); } - public function passTooManyUsernames(FunctionalTester $I) { + + /** + * @dataProvider bulkProfilesEndpoints + */ + public function passTooManyUsernames(FunctionalTester $I, Example $url) : void { $usernames = []; for ($i = 0; $i < 150; $i++) { $usernames[] = random_bytes(10); } - $I->sendPOST('/api/authlib-injector/api/profiles/minecraft', $usernames); + $I->sendPOST($url[0], $usernames); $I->canSeeResponseCodeIs(400); $I->canSeeResponseContainsJson([ 'error' => 'IllegalArgumentException', @@ -65,8 +88,12 @@ final class MinecraftProfilesCest { ]); } - public function passEmptyUsername(FunctionalTester $I) { - $I->sendPOST('/api/authlib-injector/api/profiles/minecraft', ['Admin', '']); + + /** + * @dataProvider bulkProfilesEndpoints + */ + public function passEmptyUsername(FunctionalTester $I, Example $url) : void { + $I->sendPOST($url[0], ['Admin', '']); $I->canSeeResponseCodeIs(400); $I->canSeeResponseContainsJson([ 'error' => 'IllegalArgumentException', @@ -74,8 +101,12 @@ final class MinecraftProfilesCest { ]); } - public function passEmptyField(FunctionalTester $I) { - $I->sendPOST('/api/authlib-injector/api/profiles/minecraft', []); + + /** + * @dataProvider bulkProfilesEndpoints + */ + public function passEmptyField(FunctionalTester $I, Example $url) : void { + $I->sendPOST($url[0], []); $I->canSeeResponseCodeIs(400); $I->canSeeResponseContainsJson([ 'error' => 'IllegalArgumentException', @@ -83,7 +114,7 @@ final class MinecraftProfilesCest { ]); } - private function validateFewValidUsernames(FunctionalTester $I) { + private function validateFewValidUsernames(FunctionalTester $I) : void { $I->canSeeResponseCodeIs(200); $I->canSeeResponseIsJson(); $I->canSeeResponseContainsJson([ @@ -102,4 +133,11 @@ final class MinecraftProfilesCest { ]); } + private function bulkProfilesEndpoints() : array { + return [ + ["/api/authlib-injector/api/profiles/minecraft"], + ["/api/authlib-injector/sessionserver/session/minecraft/profile/lookup/bulk/byname"] + ]; + } + } diff --git a/api/tests/functional/mojang/UsernamesToUuidsCest.php b/api/tests/functional/mojang/UsernamesToUuidsCest.php index 174c8c4..91edc8b 100644 --- a/api/tests/functional/mojang/UsernamesToUuidsCest.php +++ b/api/tests/functional/mojang/UsernamesToUuidsCest.php @@ -1,23 +1,16 @@ route = new MojangApiRoute($I); - } - - public function geUuidByOneUsername(FunctionalTester $I) { + public function getUuidByOneUsername(FunctionalTester $I, Example $url) : void { $I->wantTo('get uuid by one username'); - $this->route->uuidsByUsernames(['Admin']); + $I->sendPost($url[0], ['Admin']); $I->canSeeResponseCodeIs(200); $I->canSeeResponseIsJson(); $I->canSeeResponseContainsJson([ @@ -28,21 +21,30 @@ class UsernamesToUuidsCest { ]); } - public function getUuidsByUsernames(FunctionalTester $I) { + /** + * @dataProvider bulkProfilesEndpoints + */ + public function getUuidsByUsernames(FunctionalTester $I, Example $url) : void { $I->wantTo('get uuids by few usernames'); - $this->route->uuidsByUsernames(['Admin', 'AccWithOldPassword', 'Notch']); + $I->sendPost($url[0], ['Admin', 'AccWithOldPassword', 'Notch']); $this->validateFewValidUsernames($I); } - public function getUuidsByUsernamesWithPostString(FunctionalTester $I) { + /** + * @dataProvider bulkProfilesEndpoints + */ + public function getUuidsByUsernamesWithPostString(FunctionalTester $I, Example $url) : void { $I->wantTo('get uuids by few usernames'); - $this->route->uuidsByUsernames(json_encode(['Admin', 'AccWithOldPassword', 'Notch'])); + $I->sendPost($url[0], json_encode(['Admin', 'AccWithOldPassword', 'Notch'])); $this->validateFewValidUsernames($I); } - public function getUuidsByPartialNonexistentUsernames(FunctionalTester $I) { + /** + * @dataProvider bulkProfilesEndpoints + */ + public function getUuidsByPartialNonexistentUsernames(FunctionalTester $I, Example $url) : void { $I->wantTo('get uuids by few usernames and some nonexistent'); - $this->route->uuidsByUsernames(['Admin', 'DeletedAccount', 'not-exists-user']); + $I->sendPost($url[0], ['Admin', 'DeletedAccount', 'not-exists-user']); $I->canSeeResponseCodeIs(200); $I->canSeeResponseIsJson(); $I->canSeeResponseContainsJson([ @@ -55,22 +57,28 @@ class UsernamesToUuidsCest { $I->cantSeeResponseJsonMatchesJsonPath('$.[?(@.name="not-exists-user")]'); } - public function passAllNonexistentUsernames(FunctionalTester $I) { + /** + * @dataProvider bulkProfilesEndpoints + */ + public function passAllNonexistentUsernames(FunctionalTester $I, Example $url) : void { $I->wantTo('get specific response when pass all nonexistent usernames'); - $this->route->uuidsByUsernames(['not-exists-1', 'not-exists-2']); + $I->sendPost($url[0], ['not-exists-1', 'not-exists-2']); $I->canSeeResponseCodeIs(200); $I->canSeeResponseIsJson(); $I->canSeeResponseContainsJson([]); } - public function passTooManyUsernames(FunctionalTester $I) { + /** + * @dataProvider bulkProfilesEndpoints + */ + public function passTooManyUsernames(FunctionalTester $I, Example $url) : void { $I->wantTo('get specific response when pass too many usernames'); $usernames = []; for ($i = 0; $i < 150; $i++) { $usernames[] = random_bytes(10); } - $this->route->uuidsByUsernames($usernames); + $I->sendPost($url[0], $usernames); $I->canSeeResponseCodeIs(400); $I->canSeeResponseIsJson(); $I->canSeeResponseContainsJson([ @@ -79,9 +87,12 @@ class UsernamesToUuidsCest { ]); } - public function passEmptyUsername(FunctionalTester $I) { + /** + * @dataProvider bulkProfilesEndpoints + */ + public function passEmptyUsername(FunctionalTester $I, Example $url) : void { $I->wantTo('get specific response when pass empty username'); - $this->route->uuidsByUsernames(['Admin', '']); + $I->sendPost($url[0], ['Admin', '']); $I->canSeeResponseCodeIs(400); $I->canSeeResponseIsJson(); $I->canSeeResponseContainsJson([ @@ -90,9 +101,12 @@ class UsernamesToUuidsCest { ]); } - public function passEmptyField(FunctionalTester $I) { + /** + * @dataProvider bulkProfilesEndpoints + */ + public function passEmptyField(FunctionalTester $I, Example $url) : void { $I->wantTo('get response when pass empty array'); - $this->route->uuidsByUsernames([]); + $I->sendPost($url[0], []); $I->canSeeResponseCodeIs(400); $I->canSeeResponseIsJson(); $I->canSeeResponseContainsJson([ @@ -101,7 +115,7 @@ class UsernamesToUuidsCest { ]); } - private function validateFewValidUsernames(FunctionalTester $I) { + private function validateFewValidUsernames(FunctionalTester $I) : void { $I->canSeeResponseCodeIs(200); $I->canSeeResponseIsJson(); $I->canSeeResponseContainsJson([ @@ -120,4 +134,10 @@ class UsernamesToUuidsCest { ]); } + private function bulkProfilesEndpoints() : array { + return [ + ["/api/authlib-injector/api/profiles/minecraft"], + ["/api/authlib-injector/sessionserver/session/minecraft/profile/lookup/bulk/byname"] + ]; + } }