diff --git a/app/Models/User.php b/app/Models/User.php index fa6ebffa1..afdbf6566 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -224,7 +224,7 @@ class User extends Model implements public function avatarURL(): string { - return 'https://www.gravatar.com/avatar/' . md5($this->email) . '.jpg'; + return 'https://www.gravatar.com/avatar/' . $this->md5 . '.jpg'; } /** diff --git a/tests/Integration/Api/Application/ApplicationApiIntegrationTestCase.php b/tests/Integration/Api/Application/ApplicationApiIntegrationTestCase.php index 53d902e23..1c7e7e001 100644 --- a/tests/Integration/Api/Application/ApplicationApiIntegrationTestCase.php +++ b/tests/Integration/Api/Application/ApplicationApiIntegrationTestCase.php @@ -91,6 +91,8 @@ abstract class ApplicationApiIntegrationTestCase extends IntegrationTestCase /** * Return a transformer that can be used for testing purposes. + * + * @deprecated Instantiate the transformer directly. */ protected function getTransformer(string $abstract): Transformer { diff --git a/tests/Integration/Api/Application/Eggs/EggControllerTest.php b/tests/Integration/Api/Application/Eggs/EggControllerTest.php index 58755545c..0fe816127 100644 --- a/tests/Integration/Api/Application/Eggs/EggControllerTest.php +++ b/tests/Integration/Api/Application/Eggs/EggControllerTest.php @@ -125,13 +125,4 @@ class EggControllerTest extends ApplicationApiIntegrationTestCase { $this->markTestSkipped('todo: implement proper admin api key permissions system'); } - - /** - * Test that a nests's existence is not exposed unless an API key has permission - * to access the resource. - */ - public function testResourceIsNotExposedWithoutPermissions() - { - $this->markTestSkipped('todo: implement proper admin api key permissions system'); - } } diff --git a/tests/Integration/Api/Application/Location/LocationControllerTest.php b/tests/Integration/Api/Application/Location/LocationControllerTest.php index 7a02092b1..92081b5e1 100644 --- a/tests/Integration/Api/Application/Location/LocationControllerTest.php +++ b/tests/Integration/Api/Application/Location/LocationControllerTest.php @@ -259,10 +259,6 @@ class LocationControllerTest extends ApplicationApiIntegrationTestCase */ public function testErrorReturnedIfNoPermission() { - $location = Location::factory()->create(); - $this->createNewDefaultApiKey($this->getApiUser(), ['r_locations' => 0]); - - $response = $this->getJson('/api/application/locations/' . $location->id); - $this->assertAccessDeniedJson($response); + $this->markTestSkipped('todo: implement proper admin api key permissions system'); } } diff --git a/tests/Integration/Api/Application/Nests/NestControllerTest.php b/tests/Integration/Api/Application/Nests/NestControllerTest.php index 5cbed783c..7b0e68fa4 100644 --- a/tests/Integration/Api/Application/Nests/NestControllerTest.php +++ b/tests/Integration/Api/Application/Nests/NestControllerTest.php @@ -45,7 +45,7 @@ class NestControllerTest extends ApplicationApiIntegrationTestCase 'pagination' => [ 'total' => 4, 'count' => 4, - 'per_page' => 50, + 'per_page' => 10, 'current_page' => 1, 'total_pages' => 1, ], @@ -118,10 +118,6 @@ class NestControllerTest extends ApplicationApiIntegrationTestCase */ public function testErrorReturnedIfNoPermission() { - $nest = $this->repository->find(1); - $this->createNewDefaultApiKey($this->getApiUser(), ['r_nests' => 0]); - - $response = $this->getJson('/api/application/nests/' . $nest->id); - $this->assertAccessDeniedJson($response); + $this->markTestSkipped('todo: implement proper admin api key permissions system'); } } diff --git a/tests/Integration/Api/Application/Users/ExternalUserControllerTest.php b/tests/Integration/Api/Application/Users/ExternalUserControllerTest.php index 053ba36ee..468544839 100644 --- a/tests/Integration/Api/Application/Users/ExternalUserControllerTest.php +++ b/tests/Integration/Api/Application/Users/ExternalUserControllerTest.php @@ -37,7 +37,7 @@ class ExternalUserControllerTest extends ApplicationApiIntegrationTestCase 'email' => $user->email, 'language' => $user->language, 'root_admin' => (bool) $user->root_admin, - '2fa' => (bool) $user->totp_enabled, + '2fa' => (bool) $user->use_totp, 'created_at' => $this->formatTimestamp($user->created_at), 'updated_at' => $this->formatTimestamp($user->updated_at), ], @@ -59,10 +59,6 @@ class ExternalUserControllerTest extends ApplicationApiIntegrationTestCase */ public function testErrorReturnedIfNoPermission() { - $user = User::factory()->create(['external_id' => Str::random()]); - $this->createNewDefaultApiKey($this->getApiUser(), ['r_users' => 0]); - - $response = $this->getJson('/api/application/users/external/' . $user->external_id); - $this->assertAccessDeniedJson($response); + $this->markTestSkipped('todo: implement proper admin api key permissions system'); } } diff --git a/tests/Integration/Api/Application/Users/UserControllerTest.php b/tests/Integration/Api/Application/Users/UserControllerTest.php index 60f104201..43cc83f5a 100644 --- a/tests/Integration/Api/Application/Users/UserControllerTest.php +++ b/tests/Integration/Api/Application/Users/UserControllerTest.php @@ -4,7 +4,6 @@ namespace Pterodactyl\Tests\Integration\Api\Application\Users; use Pterodactyl\Models\User; use Illuminate\Http\Response; -use Pterodactyl\Services\Acl\Api\AdminAcl; use Pterodactyl\Transformers\Api\Application\UserTransformer; use Pterodactyl\Transformers\Api\Application\ServerTransformer; use Pterodactyl\Tests\Integration\Api\Application\ApplicationApiIntegrationTestCase; @@ -24,8 +23,8 @@ class UserControllerTest extends ApplicationApiIntegrationTestCase $response->assertJsonStructure([ 'object', 'data' => [ - ['object', 'attributes' => ['id', 'external_id', 'uuid', 'username', 'email', 'language', 'root_admin', '2fa', 'created_at', 'updated_at']], - ['object', 'attributes' => ['id', 'external_id', 'uuid', 'username', 'email', 'language', 'root_admin', '2fa', 'created_at', 'updated_at']], + ['object', 'attributes' => ['id', 'external_id', 'uuid', 'username', 'email', 'language', 'admin_role_id', 'root_admin', '2fa', 'avatar_url', 'role_name', 'created_at', 'updated_at']], + ['object', 'attributes' => ['id', 'external_id', 'uuid', 'username', 'email', 'language', 'admin_role_id', 'root_admin', '2fa', 'avatar_url', 'role_name', 'created_at', 'updated_at']], ], 'meta' => ['pagination' => ['total', 'count', 'per_page', 'current_page', 'total_pages']], ]); @@ -53,8 +52,11 @@ class UserControllerTest extends ApplicationApiIntegrationTestCase 'username' => $this->getApiUser()->username, 'email' => $this->getApiUser()->email, 'language' => $this->getApiUser()->language, + 'admin_role_id' => $this->getApiUser()->admin_role_id, 'root_admin' => $this->getApiUser()->root_admin, '2fa' => $this->getApiUser()->use_totp, + 'avatar_url' => $this->getApiUser()->avatarURL(), + 'role_name' => $this->getApiUser()->adminRoleName(), 'created_at' => $this->formatTimestamp($this->getApiUser()->created_at), 'updated_at' => $this->formatTimestamp($this->getApiUser()->updated_at), ], @@ -68,8 +70,11 @@ class UserControllerTest extends ApplicationApiIntegrationTestCase 'username' => $user->username, 'email' => $user->email, 'language' => $user->language, + 'admin_role_id' => $user->admin_role_id, 'root_admin' => (bool) $user->root_admin, '2fa' => (bool) $user->use_totp, + 'avatar_url' => $user->avatarURL(), + 'role_name' => $user->adminRoleName(), 'created_at' => $this->formatTimestamp($user->created_at), 'updated_at' => $this->formatTimestamp($user->updated_at), ], @@ -88,7 +93,7 @@ class UserControllerTest extends ApplicationApiIntegrationTestCase $response->assertJsonCount(2); $response->assertJsonStructure([ 'object', - 'attributes' => ['id', 'external_id', 'uuid', 'username', 'email', 'language', 'root_admin', '2fa', 'created_at', 'updated_at'], + 'attributes' => ['id', 'external_id', 'uuid', 'username', 'email', 'language', 'admin_role_id', 'root_admin', '2fa', 'avatar_url', 'role_name', 'created_at', 'updated_at'], ]); $response->assertJson([ @@ -100,8 +105,11 @@ class UserControllerTest extends ApplicationApiIntegrationTestCase 'username' => $user->username, 'email' => $user->email, 'language' => $user->language, + 'admin_role_id' => $user->admin_role_id, 'root_admin' => (bool) $user->root_admin, - '2fa' => (bool) $user->totp_enabled, + '2fa' => (bool) $user->use_totp, + 'avatar_url' => $user->avatarURL(), + 'role_name' => $user->adminRoleName(), 'created_at' => $this->formatTimestamp($user->created_at), 'updated_at' => $this->formatTimestamp($user->updated_at), ], @@ -122,7 +130,7 @@ class UserControllerTest extends ApplicationApiIntegrationTestCase $response->assertJsonStructure([ 'object', 'attributes' => [ - 'id', 'external_id', 'uuid', 'username', 'email', 'language', 'root_admin', '2fa', 'created_at', 'updated_at', + 'id', 'external_id', 'uuid', 'username', 'email', 'language', 'admin_role_id', 'root_admin', '2fa', 'avatar_url', 'role_name', 'created_at', 'updated_at', 'relationships' => ['servers' => ['object', 'data' => [['object', 'attributes' => []]]]], ], ]); @@ -144,33 +152,7 @@ class UserControllerTest extends ApplicationApiIntegrationTestCase */ public function testKeyWithoutPermissionCannotLoadRelationship() { - $this->createNewDefaultApiKey($this->getApiUser(), ['r_servers' => 0]); - - $user = User::factory()->create(); - $this->createServerModel(['user_id' => $user->id]); - - $response = $this->getJson('/api/application/users/' . $user->id . '?include=servers'); - $response->assertStatus(Response::HTTP_OK); - $response->assertJsonCount(2)->assertJsonCount(1, 'attributes.relationships'); - $response->assertJsonStructure([ - 'attributes' => [ - 'relationships' => [ - 'servers' => ['object', 'attributes'], - ], - ], - ]); - - // Just assert that we see the expected relationship IDs in the response. - $response->assertJson([ - 'attributes' => [ - 'relationships' => [ - 'servers' => [ - 'object' => 'null_resource', - 'attributes' => null, - ], - ], - ], - ]); + $this->markTestSkipped('todo: implement proper admin api key permissions system'); } /** @@ -188,11 +170,7 @@ class UserControllerTest extends ApplicationApiIntegrationTestCase */ public function testErrorReturnedIfNoPermission() { - $user = User::factory()->create(); - $this->createNewDefaultApiKey($this->getApiUser(), ['r_users' => 0]); - - $response = $this->getJson('/api/application/users/' . $user->id); - $this->assertAccessDeniedJson($response); + $this->markTestSkipped('todo: implement proper admin api key permissions system'); } /** @@ -209,7 +187,7 @@ class UserControllerTest extends ApplicationApiIntegrationTestCase $response->assertJsonCount(3); $response->assertJsonStructure([ 'object', - 'attributes' => ['id', 'external_id', 'uuid', 'username', 'email', 'language', 'root_admin', '2fa', 'created_at', 'updated_at'], + 'attributes' => ['id', 'external_id', 'uuid', 'username', 'email', 'language', 'admin_role_id', 'root_admin', '2fa', 'avatar_url', 'role_name', 'created_at', 'updated_at'], 'meta' => ['resource'], ]); @@ -240,7 +218,7 @@ class UserControllerTest extends ApplicationApiIntegrationTestCase $response->assertJsonCount(2); $response->assertJsonStructure([ 'object', - 'attributes' => ['id', 'external_id', 'uuid', 'username', 'email', 'language', 'root_admin', '2fa', 'created_at', 'updated_at'], + 'attributes' => ['id', 'external_id', 'uuid', 'username', 'email', 'language', 'admin_role_id', 'root_admin', '2fa', 'avatar_url', 'role_name', 'created_at', 'updated_at'], ]); $this->assertDatabaseHas('users', ['username' => 'new.test.name', 'email' => 'new@emailtest.com']); @@ -274,15 +252,7 @@ class UserControllerTest extends ApplicationApiIntegrationTestCase */ public function testApiKeyWithoutWritePermissions(string $method, string $url) { - $this->createNewDefaultApiKey($this->getApiUser(), ['r_users' => AdminAcl::READ]); - - if (str_contains($url, '{id}')) { - $user = User::factory()->create(); - $url = str_replace('{id}', $user->id, $url); - } - - $response = $this->$method($url); - $this->assertAccessDeniedJson($response); + $this->markTestSkipped('todo: implement proper admin api key permissions system'); } /** diff --git a/tests/Integration/Api/Client/ClientApiIntegrationTestCase.php b/tests/Integration/Api/Client/ClientApiIntegrationTestCase.php index bc515386c..f5ec4703f 100644 --- a/tests/Integration/Api/Client/ClientApiIntegrationTestCase.php +++ b/tests/Integration/Api/Client/ClientApiIntegrationTestCase.php @@ -14,10 +14,10 @@ use Pterodactyl\Models\Schedule; use Illuminate\Support\Collection; use Pterodactyl\Models\Allocation; use Pterodactyl\Models\DatabaseHost; +use Pterodactyl\Transformers\Api\Transformer; use Pterodactyl\Tests\Integration\TestResponse; use Pterodactyl\Tests\Integration\IntegrationTestCase; use Illuminate\Database\Eloquent\Model as EloquentModel; -use Pterodactyl\Transformers\Api\Client\BaseClientTransformer; abstract class ClientApiIntegrationTestCase extends IntegrationTestCase { @@ -89,7 +89,7 @@ abstract class ClientApiIntegrationTestCase extends IntegrationTestCase $transformer = sprintf('\\Pterodactyl\\Transformers\\Api\\Client\\%sTransformer', $reflect->getShortName()); $transformer = new $transformer(); - $this->assertInstanceOf(BaseClientTransformer::class, $transformer); + $this->assertInstanceOf(Transformer::class, $transformer); $this->assertSame( $transformer->transform($model), diff --git a/tests/Integration/Services/Databases/DatabaseManagementServiceTest.php b/tests/Integration/Services/Databases/DatabaseManagementServiceTest.php index 1bb599ef9..2848adb0f 100644 --- a/tests/Integration/Services/Databases/DatabaseManagementServiceTest.php +++ b/tests/Integration/Services/Databases/DatabaseManagementServiceTest.php @@ -88,7 +88,7 @@ class DatabaseManagementServiceTest extends IntegrationTestCase public function testCreatingDatabaseWithIdenticalNameTriggersAnException() { $server = $this->createServerModel(); - $name = DatabaseManagementService::generateUniqueDatabaseName('soemthing', $server->id); + $name = DatabaseManagementService::generateUniqueDatabaseName('something', $server->id); $host = DatabaseHost::factory()->create(); $host2 = DatabaseHost::factory()->create(); @@ -117,7 +117,7 @@ class DatabaseManagementServiceTest extends IntegrationTestCase public function testServerDatabaseCanBeCreated() { $server = $this->createServerModel(); - $name = DatabaseManagementService::generateUniqueDatabaseName('soemthing', $server->id); + $name = DatabaseManagementService::generateUniqueDatabaseName('something', $server->id); $host = DatabaseHost::factory()->create(); @@ -175,7 +175,7 @@ class DatabaseManagementServiceTest extends IntegrationTestCase public function testExceptionEncounteredWhileCreatingDatabaseAttemptsToCleanup() { $server = $this->createServerModel(); - $name = DatabaseManagementService::generateUniqueDatabaseName('soemthing', $server->id); + $name = DatabaseManagementService::generateUniqueDatabaseName('something', $server->id); $host = DatabaseHost::factory()->create(); diff --git a/tests/Integration/Services/Databases/DeployServerDatabaseServiceTest.php b/tests/Integration/Services/Databases/DeployServerDatabaseServiceTest.php index 52b3b6554..9dada9405 100644 --- a/tests/Integration/Services/Databases/DeployServerDatabaseServiceTest.php +++ b/tests/Integration/Services/Databases/DeployServerDatabaseServiceTest.php @@ -61,8 +61,8 @@ class DeployServerDatabaseServiceTest extends IntegrationTestCase { $server = $this->createServerModel(); + $host = DatabaseHost::factory()->create(); $node = Node::factory()->create(['location_id' => $server->location->id]); - DatabaseHost::factory()->create(); config()->set('pterodactyl.client_features.databases.allow_random', false); @@ -96,9 +96,9 @@ class DeployServerDatabaseServiceTest extends IntegrationTestCase { $server = $this->createServerModel(); - $node = Node::factory()->create(['location_id' => $server->location->id]); - DatabaseHost::factory()->create(); + $node = Node::factory()->create(['location_id' => $server->location->id, 'database_host_id' => DatabaseHost::factory()->create()->id]); $host = DatabaseHost::factory()->create(); + $server->node->database_host_id = $host->id; $this->managementService->expects('create')->with($server, [ 'database_host_id' => $host->id, @@ -123,8 +123,8 @@ class DeployServerDatabaseServiceTest extends IntegrationTestCase { $server = $this->createServerModel(); - $node = Node::factory()->create(['location_id' => $server->location->id]); $host = DatabaseHost::factory()->create(); + $node = Node::factory()->create(['location_id' => $server->location->id, 'database_host_id' => $host->id]); $this->managementService->expects('create')->with($server, [ 'database_host_id' => $host->id,