diff --git a/app/Services/Servers/DetailsModificationService.php b/app/Services/Servers/DetailsModificationService.php index a0c0f19c5..c8dfea9ff 100644 --- a/app/Services/Servers/DetailsModificationService.php +++ b/app/Services/Servers/DetailsModificationService.php @@ -54,7 +54,7 @@ class DetailsModificationService /** * @var \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService */ - private $keyDeletionService; + protected $keyDeletionService; /** * @var \Pterodactyl\Repositories\Eloquent\ServerRepository diff --git a/app/Services/Subusers/SubuserCreationService.php b/app/Services/Subusers/SubuserCreationService.php index 2ee578b9e..c73c8fed8 100644 --- a/app/Services/Subusers/SubuserCreationService.php +++ b/app/Services/Subusers/SubuserCreationService.php @@ -76,27 +76,27 @@ class SubuserCreationService * SubuserCreationService constructor. * * @param \Illuminate\Database\ConnectionInterface $connection - * @param \Pterodactyl\Services\Users\UserCreationService $userCreationService * @param \Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService $keyCreationService * @param \Pterodactyl\Services\Subusers\PermissionCreationService $permissionService * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $serverRepository * @param \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface $subuserRepository + * @param \Pterodactyl\Services\Users\UserCreationService $userCreationService * @param \Pterodactyl\Contracts\Repository\UserRepositoryInterface $userRepository */ public function __construct( ConnectionInterface $connection, - UserCreationService $userCreationService, DaemonKeyCreationService $keyCreationService, PermissionCreationService $permissionService, ServerRepositoryInterface $serverRepository, SubuserRepositoryInterface $subuserRepository, + UserCreationService $userCreationService, UserRepositoryInterface $userRepository ) { $this->connection = $connection; $this->keyCreationService = $keyCreationService; $this->permissionService = $permissionService; - $this->subuserRepository = $subuserRepository; $this->serverRepository = $serverRepository; + $this->subuserRepository = $subuserRepository; $this->userRepository = $userRepository; $this->userCreationService = $userCreationService; } diff --git a/app/Services/Subusers/SubuserDeletionService.php b/app/Services/Subusers/SubuserDeletionService.php index 76d472d76..c2f78f9fa 100644 --- a/app/Services/Subusers/SubuserDeletionService.php +++ b/app/Services/Subusers/SubuserDeletionService.php @@ -24,6 +24,7 @@ namespace Pterodactyl\Services\Subusers; +use Pterodactyl\Models\Subuser; use Illuminate\Database\ConnectionInterface; use Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService; use Pterodactyl\Contracts\Repository\SubuserRepositoryInterface; @@ -65,14 +66,16 @@ class SubuserDeletionService /** * Delete a subuser and their associated permissions from the Panel and Daemon. * - * @param int $subuser + * @param int|\Pterodactyl\Models\Subuser $subuser * * @throws \Pterodactyl\Exceptions\DisplayException * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException */ public function handle($subuser) { - $subuser = $this->repository->getWithServer($subuser); + if (! $subuser instanceof Subuser) { + $subuser = $this->repository->find($subuser); + } $this->connection->beginTransaction(); $this->keyDeletionService->handle($subuser->server_id, $subuser->user_id); diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index 4732a3513..1d069a26d 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -30,7 +30,6 @@ $factory->define(Pterodactyl\Models\Server::class, function (Faker\Generator $fa 'cpu' => 0, 'oom_disabled' => 0, 'pack_id' => null, - 'daemonSecret' => $faker->uuid, 'username' => $faker->userName, 'sftp_password' => null, 'installed' => 1, @@ -153,7 +152,6 @@ $factory->define(Pterodactyl\Models\Subuser::class, function (Faker\Generator $f 'id' => $faker->unique()->randomNumber(), 'user_id' => $faker->randomNumber(), 'server_id' => $faker->randomNumber(), - 'daemonSecret' => $faker->unique()->uuid, ]; }); @@ -197,3 +195,13 @@ $factory->define(Pterodactyl\Models\Task::class, function (Faker\Generator $fake 'is_queued' => false, ]; }); + +$factory->define(Pterodactyl\Models\DaemonKey::class, function (Faker\Generator $faker) { + return [ + 'id' => $faker->unique()->randomNumber(), + 'server_id' => $faker->randomNumber(), + 'user_id' => $faker->randomNumber(), + 'secret' => 'i_' . str_random(40), + 'expires_at' => \Carbon\Carbon::now()->addMinutes(10)->toDateTimeString(), + ]; +}); diff --git a/tests/Unit/Http/Controllers/Base/IndexControllerTest.php b/tests/Unit/Http/Controllers/Base/IndexControllerTest.php index 65884d748..a66dc3654 100644 --- a/tests/Unit/Http/Controllers/Base/IndexControllerTest.php +++ b/tests/Unit/Http/Controllers/Base/IndexControllerTest.php @@ -31,7 +31,7 @@ use Pterodactyl\Models\User; use Pterodactyl\Models\Server; use Tests\Assertions\ControllerAssertionsTrait; use Pterodactyl\Http\Controllers\Base\IndexController; -use Pterodactyl\Services\Servers\ServerAccessHelperService; +use Pterodactyl\Services\DaemonKeys\DaemonKeyProviderService; use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface; @@ -39,28 +39,28 @@ class IndexControllerTest extends TestCase { use ControllerAssertionsTrait; - /** - * @var \Pterodactyl\Services\Servers\ServerAccessHelperService - */ - protected $access; - /** * @var \Pterodactyl\Http\Controllers\Base\IndexController */ protected $controller; /** - * @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface + * @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface|\Mockery\Mock */ protected $daemonRepository; /** - * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface + * @var \Pterodactyl\Services\DaemonKeys\DaemonKeyProviderService|\Mockery\Mock + */ + protected $keyProviderService; + + /** + * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface|\Mockery\Mock */ protected $repository; /** - * @var \Illuminate\Http\Request + * @var \Illuminate\Http\Request|\Mockery\Mock */ protected $request; @@ -71,12 +71,12 @@ class IndexControllerTest extends TestCase { parent::setUp(); - $this->access = m::mock(ServerAccessHelperService::class); $this->daemonRepository = m::mock(DaemonServerRepositoryInterface::class); + $this->keyProviderService = m::mock(DaemonKeyProviderService::class); $this->repository = m::mock(ServerRepositoryInterface::class); $this->request = m::mock(Request::class); - $this->controller = new IndexController($this->daemonRepository, $this->access, $this->repository); + $this->controller = new IndexController($this->keyProviderService, $this->daemonRepository, $this->repository); } /** @@ -109,16 +109,17 @@ class IndexControllerTest extends TestCase $server = factory(Server::class)->make(['suspended' => 0, 'installed' => 1]); $this->request->shouldReceive('user')->withNoArgs()->once()->andReturn($user); - $this->access->shouldReceive('handle')->with($server->uuid, $user)->once()->andReturn($server); + $this->repository->shouldReceive('findFirstWhere')->with([['uuidShort', '=', $server->uuidShort]])->once()->andReturn($server); + $this->keyProviderService->shouldReceive('handle')->with($server->id, $user->id)->once()->andReturn('test123'); $this->daemonRepository->shouldReceive('setNode')->with($server->node_id)->once()->andReturnSelf() ->shouldReceive('setAccessServer')->with($server->uuid)->once()->andReturnSelf() - ->shouldReceive('setAccessToken')->with($server->daemonSecret)->once()->andReturnSelf() + ->shouldReceive('setAccessToken')->with('test123')->once()->andReturnSelf() ->shouldReceive('details')->withNoArgs()->once()->andReturnSelf(); $this->daemonRepository->shouldReceive('getBody')->withNoArgs()->once()->andReturn('["test"]'); - $response = $this->controller->status($this->request, $server->uuid); + $response = $this->controller->status($this->request, $server->uuidShort); $this->assertIsJsonResponse($response); $this->assertResponseJsonEquals(['test'], $response); } @@ -132,9 +133,10 @@ class IndexControllerTest extends TestCase $server = factory(Server::class)->make(['suspended' => 0, 'installed' => 0]); $this->request->shouldReceive('user')->withNoArgs()->once()->andReturn($user); - $this->access->shouldReceive('handle')->with($server->uuid, $user)->once()->andReturn($server); + $this->repository->shouldReceive('findFirstWhere')->with([['uuidShort', '=', $server->uuidShort]])->once()->andReturn($server); + $this->keyProviderService->shouldReceive('handle')->with($server->id, $user->id)->once()->andReturn('test123'); - $response = $this->controller->status($this->request, $server->uuid); + $response = $this->controller->status($this->request, $server->uuidShort); $this->assertIsJsonResponse($response); $this->assertResponseCodeEquals(200, $response); $this->assertResponseJsonEquals(['status' => 20], $response); @@ -149,9 +151,10 @@ class IndexControllerTest extends TestCase $server = factory(Server::class)->make(['suspended' => 1, 'installed' => 1]); $this->request->shouldReceive('user')->withNoArgs()->once()->andReturn($user); - $this->access->shouldReceive('handle')->with($server->uuid, $user)->once()->andReturn($server); + $this->repository->shouldReceive('findFirstWhere')->with([['uuidShort', '=', $server->uuidShort]])->once()->andReturn($server); + $this->keyProviderService->shouldReceive('handle')->with($server->id, $user->id)->once()->andReturn('test123'); - $response = $this->controller->status($this->request, $server->uuid); + $response = $this->controller->status($this->request, $server->uuidShort); $this->assertIsJsonResponse($response); $this->assertResponseCodeEquals(200, $response); $this->assertResponseJsonEquals(['status' => 30], $response); diff --git a/tests/Unit/Services/Nodes/NodeUpdateServiceTest.php b/tests/Unit/Services/Nodes/NodeUpdateServiceTest.php index e23e1805d..2c14a3779 100644 --- a/tests/Unit/Services/Nodes/NodeUpdateServiceTest.php +++ b/tests/Unit/Services/Nodes/NodeUpdateServiceTest.php @@ -41,12 +41,12 @@ class NodeUpdateServiceTest extends TestCase use PHPMock; /** - * @var \Pterodactyl\Contracts\Repository\Daemon\ConfigurationRepositoryInterface + * @var \Pterodactyl\Contracts\Repository\Daemon\ConfigurationRepositoryInterface|\Mockery\Mock */ protected $configRepository; /** - * @var \GuzzleHttp\Exception\RequestException + * @var \GuzzleHttp\Exception\RequestException|\Mockery\Mock */ protected $exception; @@ -56,7 +56,7 @@ class NodeUpdateServiceTest extends TestCase protected $node; /** - * @var \Pterodactyl\Contracts\Repository\NodeRepositoryInterface + * @var \Pterodactyl\Contracts\Repository\NodeRepositoryInterface|\Mockery\Mock */ protected $repository; @@ -66,7 +66,7 @@ class NodeUpdateServiceTest extends TestCase protected $service; /** - * @var \Illuminate\Log\Writer + * @var \Illuminate\Log\Writer|\Mockery\Mock */ protected $writer; @@ -106,7 +106,6 @@ class NodeUpdateServiceTest extends TestCase ])->andReturn(true); $this->configRepository->shouldReceive('setNode')->with($this->node->id)->once()->andReturnSelf() - ->shouldReceive('setAccessToken')->with($this->node->daemonSecret)->once()->andReturnSelf() ->shouldReceive('update')->withNoArgs()->once()->andReturnNull(); $this->assertTrue($this->service->handle($this->node, ['name' => 'NewName', 'reset_secret' => true])); @@ -123,7 +122,6 @@ class NodeUpdateServiceTest extends TestCase ])->andReturn(true); $this->configRepository->shouldReceive('setNode')->with($this->node->id)->once()->andReturnSelf() - ->shouldReceive('setAccessToken')->with($this->node->daemonSecret)->once()->andReturnSelf() ->shouldReceive('update')->withNoArgs()->once()->andReturnNull(); $this->assertTrue($this->service->handle($this->node, ['name' => 'NewName'])); @@ -167,7 +165,6 @@ class NodeUpdateServiceTest extends TestCase ])->andReturn(true); $this->configRepository->shouldReceive('setNode')->with($this->node->id)->once()->andReturnSelf() - ->shouldReceive('setAccessToken')->with($this->node->daemonSecret)->once()->andReturnSelf() ->shouldReceive('update')->withNoArgs()->once()->andReturnNull(); $this->assertTrue($this->service->handle($this->node->id, ['name' => 'NewName'])); diff --git a/tests/Unit/Services/Servers/DetailsModificationServiceTest.php b/tests/Unit/Services/Servers/DetailsModificationServiceTest.php index a33170bca..42a26aaeb 100644 --- a/tests/Unit/Services/Servers/DetailsModificationServiceTest.php +++ b/tests/Unit/Services/Servers/DetailsModificationServiceTest.php @@ -28,36 +28,46 @@ use Exception; use Mockery as m; use Tests\TestCase; use Illuminate\Log\Writer; -use phpmock\phpunit\PHPMock; use Pterodactyl\Models\Server; -use Illuminate\Database\DatabaseManager; use GuzzleHttp\Exception\RequestException; +use Illuminate\Database\ConnectionInterface; use Pterodactyl\Exceptions\DisplayException; +use Pterodactyl\Exceptions\PterodactylException; use Pterodactyl\Repositories\Eloquent\ServerRepository; use Pterodactyl\Services\Servers\DetailsModificationService; +use Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService; +use Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService; use Pterodactyl\Repositories\Daemon\ServerRepository as DaemonServerRepository; class DetailsModificationServiceTest extends TestCase { - use PHPMock; - /** - * @var \Illuminate\Database\DatabaseManager + * @var \Illuminate\Database\ConnectionInterface|\Mockery\Mock */ - protected $database; + protected $connection; /** - * @var \Pterodactyl\Repositories\Daemon\ServerRepository + * @var \Pterodactyl\Repositories\Daemon\ServerRepository|\Mockery\Mock */ protected $daemonServerRepository; /** - * @var \GuzzleHttp\Exception\RequestException + * @var \GuzzleHttp\Exception\RequestException|\Mockery\Mock */ protected $exception; /** - * @var \Pterodactyl\Repositories\Eloquent\ServerRepository + * @var \Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService|\Mockery\Mock + */ + protected $keyCreationService; + + /** + * @var \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService|\Mockery\Mock + */ + protected $keyDeletionService; + + /** + * @var \Pterodactyl\Repositories\Eloquent\ServerRepository|\Mockery\Mock */ protected $repository; @@ -67,7 +77,7 @@ class DetailsModificationServiceTest extends TestCase protected $service; /** - * @var \Illuminate\Log\Writer + * @var \Illuminate\Log\Writer|\Mockery\Mock */ protected $writer; @@ -78,17 +88,18 @@ class DetailsModificationServiceTest extends TestCase { parent::setUp(); - $this->database = m::mock(DatabaseManager::class); + $this->connection = m::mock(ConnectionInterface::class); $this->exception = m::mock(RequestException::class)->makePartial(); $this->daemonServerRepository = m::mock(DaemonServerRepository::class); + $this->keyCreationService = m::mock(DaemonKeyCreationService::class); + $this->keyDeletionService = m::mock(DaemonKeyDeletionService::class); $this->repository = m::mock(ServerRepository::class); $this->writer = m::mock(Writer::class); - $this->getFunctionMock('\\Pterodactyl\\Services\\Servers', 'str_random') - ->expects($this->any())->willReturn('random_string'); - $this->service = new DetailsModificationService( - $this->database, + $this->connection, + $this->keyCreationService, + $this->keyDeletionService, $this->daemonServerRepository, $this->repository, $this->writer @@ -106,21 +117,18 @@ class DetailsModificationServiceTest extends TestCase $data = ['owner_id' => 1, 'name' => 'New Name', 'description' => 'New Description']; - $this->repository->shouldNotReceive('find'); - $this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - + $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); $this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf() ->shouldReceive('update')->with($server->id, [ 'owner_id' => $data['owner_id'], 'name' => $data['name'], 'description' => $data['description'], - 'daemonSecret' => $server->daemonSecret, ], true, true)->once()->andReturnNull(); - $this->database->shouldReceive('commit')->withNoArgs()->once()->andReturn(true); + $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); - $response = $this->service->edit($server, $data); - $this->assertTrue($response); + $this->service->edit($server, $data); + $this->assertTrue(true); } /** @@ -135,20 +143,18 @@ class DetailsModificationServiceTest extends TestCase $data = ['owner_id' => 1, 'name' => 'New Name', 'description' => 'New Description']; $this->repository->shouldReceive('find')->with($server->id)->once()->andReturn($server); - $this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - + $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); $this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf() ->shouldReceive('update')->with($server->id, [ 'owner_id' => $data['owner_id'], 'name' => $data['name'], 'description' => $data['description'], - 'daemonSecret' => $server->daemonSecret, ], true, true)->once()->andReturnNull(); - $this->database->shouldReceive('commit')->withNoArgs()->once()->andReturn(true); + $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); - $response = $this->service->edit($server->id, $data); - $this->assertTrue($response); + $this->service->edit($server->id, $data); + $this->assertTrue(true); } /** @@ -163,135 +169,20 @@ class DetailsModificationServiceTest extends TestCase $data = ['owner_id' => 2, 'name' => 'New Name', 'description' => 'New Description']; - $this->repository->shouldNotReceive('find'); - $this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - + $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); $this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf() ->shouldReceive('update')->with($server->id, [ 'owner_id' => $data['owner_id'], 'name' => $data['name'], 'description' => $data['description'], - 'daemonSecret' => 'random_string', ], true, true)->once()->andReturnNull(); - $this->daemonServerRepository->shouldReceive('setNode')->with($server->node_id)->once()->andReturnSelf() - ->shouldReceive('setAccessServer')->with($server->uuid)->once()->andReturnSelf() - ->shouldReceive('update')->with([ - 'keys' => [ - $server->daemonSecret => [], - 'random_string' => DaemonServerRepository::DAEMON_PERMISSIONS, - ], - ])->once()->andReturnNull(); - - $this->database->shouldReceive('commit')->withNoArgs()->once()->andReturn(true); - - $response = $this->service->edit($server, $data); - $this->assertTrue($response); - } - - public function testEditShouldResetDaemonSecretIfBooleanValueIsPassed() - { - $server = factory(Server::class)->make([ - 'owner_id' => 1, - 'node_id' => 1, - ]); - - $data = ['owner_id' => 1, 'name' => 'New Name', 'description' => 'New Description', 'reset_token' => true]; - - $this->repository->shouldNotReceive('find'); - $this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - - $this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf() - ->shouldReceive('update')->with($server->id, [ - 'owner_id' => $data['owner_id'], - 'name' => $data['name'], - 'description' => $data['description'], - 'daemonSecret' => 'random_string', - ], true, true)->once()->andReturnNull(); - - $this->daemonServerRepository->shouldReceive('setNode')->with($server->node_id)->once()->andReturnSelf() - ->shouldReceive('setAccessServer')->with($server->uuid)->once()->andReturnSelf() - ->shouldReceive('update')->with([ - 'keys' => [ - $server->daemonSecret => [], - 'random_string' => DaemonServerRepository::DAEMON_PERMISSIONS, - ], - ])->once()->andReturnNull(); - - $this->database->shouldReceive('commit')->withNoArgs()->once()->andReturn(true); - - $response = $this->service->edit($server, $data); - $this->assertTrue($response); - } - - /** - * Test that a displayable exception is thrown if the daemon responds with an error. - */ - public function testEditShouldThrowADisplayableExceptionIfDaemonResponseErrors() - { - $server = factory(Server::class)->make([ - 'owner_id' => 1, - 'node_id' => 1, - ]); - - $data = ['owner_id' => 2, 'name' => 'New Name', 'description' => 'New Description']; - - $this->repository->shouldNotReceive('find'); - $this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - - $this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf() - ->shouldReceive('update')->with($server->id, [ - 'owner_id' => $data['owner_id'], - 'name' => $data['name'], - 'description' => $data['description'], - 'daemonSecret' => 'random_string', - ], true, true)->once()->andReturnNull(); - - $this->daemonServerRepository->shouldReceive('setNode')->andThrow($this->exception); - $this->exception->shouldReceive('getResponse')->withNoArgs()->once()->andReturnSelf() - ->shouldReceive('getStatusCode')->withNoArgs()->once()->andReturn(400); - - $this->writer->shouldReceive('warning')->with($this->exception)->once()->andReturnNull(); - - try { - $this->service->edit($server, $data); - } catch (Exception $exception) { - $this->assertInstanceOf(DisplayException::class, $exception); - $this->assertEquals( - trans('admin/server.exceptions.daemon_exception', ['code' => 400]), - $exception->getMessage() - ); - } - } - - /** - * Test that an exception not stemming from Guzzle is not thrown as a displayable exception. - * - * @expectedException \Exception - */ - public function testEditShouldNotThrowDisplayableExceptionIfExceptionIsNotThrownByGuzzle() - { - $server = factory(Server::class)->make([ - 'owner_id' => 1, - 'node_id' => 1, - ]); - - $data = ['owner_id' => 2, 'name' => 'New Name', 'description' => 'New Description']; - - $this->repository->shouldNotReceive('find'); - $this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - - $this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf() - ->shouldReceive('update')->with($server->id, [ - 'owner_id' => $data['owner_id'], - 'name' => $data['name'], - 'description' => $data['description'], - 'daemonSecret' => 'random_string', - ], true, true)->once()->andReturnNull(); - - $this->daemonServerRepository->shouldReceive('setNode')->andThrow(new Exception()); + $this->keyDeletionService->shouldReceive('handle')->with($server, $server->owner_id)->once()->andReturnNull(); + $this->keyCreationService->shouldReceive('handle')->with($server->id, $data['owner_id']); + $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); $this->service->edit($server, $data); + $this->assertTrue(true); } /** @@ -301,8 +192,7 @@ class DetailsModificationServiceTest extends TestCase { $server = factory(Server::class)->make(['node_id' => 1]); - $this->repository->shouldNotReceive('find'); - $this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); + $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); $this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf() ->shouldReceive('update')->with($server->id, [ 'image' => 'new/image', @@ -316,9 +206,10 @@ class DetailsModificationServiceTest extends TestCase ], ])->once()->andReturnNull(); - $this->database->shouldReceive('commit')->withNoArgs()->once()->andReturn(true); + $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); $this->service->setDockerImage($server, 'new/image'); + $this->assertTrue(true); } /** @@ -329,7 +220,7 @@ class DetailsModificationServiceTest extends TestCase $server = factory(Server::class)->make(['node_id' => 1]); $this->repository->shouldReceive('find')->with($server->id)->once()->andReturn($server); - $this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); + $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); $this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf() ->shouldReceive('update')->with($server->id, [ 'image' => 'new/image', @@ -343,9 +234,10 @@ class DetailsModificationServiceTest extends TestCase ], ])->once()->andReturnNull(); - $this->database->shouldReceive('commit')->withNoArgs()->once()->andReturn(true); + $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); $this->service->setDockerImage($server->id, 'new/image'); + $this->assertTrue(true); } /** @@ -355,13 +247,14 @@ class DetailsModificationServiceTest extends TestCase { $server = factory(Server::class)->make(['node_id' => 1]); - $this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); + $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); $this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf() ->shouldReceive('update')->with($server->id, [ 'image' => 'new/image', ])->once()->andReturnNull(); $this->daemonServerRepository->shouldReceive('setNode')->andThrow($this->exception); + $this->connection->shouldReceive('rollBack')->withNoArgs()->once()->andReturnNull(); $this->exception->shouldReceive('getResponse')->withNoArgs()->once()->andReturnSelf() ->shouldReceive('getStatusCode')->withNoArgs()->once()->andReturn(400); @@ -369,7 +262,7 @@ class DetailsModificationServiceTest extends TestCase try { $this->service->setDockerImage($server, 'new/image'); - } catch (Exception $exception) { + } catch (PterodactylException $exception) { $this->assertInstanceOf(DisplayException::class, $exception); $this->assertEquals( trans('admin/server.exceptions.daemon_exception', ['code' => 400]), diff --git a/tests/Unit/Services/Subusers/PermissionCreationServiceTest.php b/tests/Unit/Services/Subusers/PermissionCreationServiceTest.php index 65407ce91..22e06aa56 100644 --- a/tests/Unit/Services/Subusers/PermissionCreationServiceTest.php +++ b/tests/Unit/Services/Subusers/PermissionCreationServiceTest.php @@ -32,7 +32,7 @@ use Pterodactyl\Contracts\Repository\PermissionRepositoryInterface; class PermissionCreationServiceTest extends TestCase { /** - * @var \Pterodactyl\Contracts\Repository\PermissionRepositoryInterface + * @var \Pterodactyl\Contracts\Repository\PermissionRepositoryInterface|\Mockery\Mock */ protected $repository; @@ -59,14 +59,13 @@ class PermissionCreationServiceTest extends TestCase { $permissions = ['reset-sftp', 'view-sftp']; - $this->repository->shouldReceive('insert')->with([ - ['subuser_id' => 1, 'permission' => 'reset-sftp'], - ['subuser_id' => 1, 'permission' => 'view-sftp'], - ]); + $this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf() + ->shouldReceive('insert')->with([ + ['subuser_id' => 1, 'permission' => 'reset-sftp'], + ['subuser_id' => 1, 'permission' => 'view-sftp'], + ])->once()->andReturnNull(); - $response = $this->service->handle(1, $permissions); - - $this->assertNotEmpty($response); - $this->assertEquals(['s:get', 's:console', 's:set-password'], $response); + $this->service->handle(1, $permissions); + $this->assertTrue(true); } } diff --git a/tests/Unit/Services/Subusers/SubuserCreationServiceTest.php b/tests/Unit/Services/Subusers/SubuserCreationServiceTest.php index 8f351fa03..5b70b4ccc 100644 --- a/tests/Unit/Services/Subusers/SubuserCreationServiceTest.php +++ b/tests/Unit/Services/Subusers/SubuserCreationServiceTest.php @@ -26,7 +26,6 @@ namespace Tests\Unit\Services\Subusers; use Mockery as m; use Tests\TestCase; -use Illuminate\Log\Writer; use phpmock\phpunit\PHPMock; use Pterodactyl\Models\User; use Pterodactyl\Models\Server; @@ -37,39 +36,39 @@ use Pterodactyl\Services\Users\UserCreationService; use Pterodactyl\Services\Subusers\SubuserCreationService; use Pterodactyl\Services\Subusers\PermissionCreationService; use Pterodactyl\Contracts\Repository\UserRepositoryInterface; +use Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService; use Pterodactyl\Exceptions\Repository\RecordNotFoundException; use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; use Pterodactyl\Contracts\Repository\SubuserRepositoryInterface; use Pterodactyl\Exceptions\Service\Subuser\UserIsServerOwnerException; use Pterodactyl\Exceptions\Service\Subuser\ServerSubuserExistsException; -use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface; class SubuserCreationServiceTest extends TestCase { use PHPMock; /** - * @var \Illuminate\Database\ConnectionInterface + * @var \Illuminate\Database\ConnectionInterface|\Mockery\Mock */ protected $connection; /** - * @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface + * @var \Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService|\Mockery\Mock */ - protected $daemonRepository; + protected $keyCreationService; /** - * @var \Pterodactyl\Services\Subusers\PermissionCreationService + * @var \Pterodactyl\Services\Subusers\PermissionCreationService|\Mockery\Mock */ protected $permissionService; /** - * @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface + * @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface|\Mockery\Mock */ protected $subuserRepository; /** - * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface + * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface|\Mockery\Mock */ protected $serverRepository; @@ -79,20 +78,15 @@ class SubuserCreationServiceTest extends TestCase protected $service; /** - * @var \Pterodactyl\Services\Users\UserCreationService + * @var \Pterodactyl\Services\Users\UserCreationService|\Mockery\Mock */ protected $userCreationService; /** - * @var \Pterodactyl\Contracts\Repository\UserRepositoryInterface + * @var \Pterodactyl\Contracts\Repository\UserRepositoryInterface|\Mockery\Mock */ protected $userRepository; - /** - * @var \Illuminate\Log\Writer - */ - protected $writer; - /** * Setup tests. */ @@ -103,23 +97,21 @@ class SubuserCreationServiceTest extends TestCase $this->getFunctionMock('\\Pterodactyl\\Services\\Subusers', 'str_random')->expects($this->any())->willReturn('random_string'); $this->connection = m::mock(ConnectionInterface::class); - $this->daemonRepository = m::mock(DaemonServerRepositoryInterface::class); + $this->keyCreationService = m::mock(DaemonKeyCreationService::class); $this->permissionService = m::mock(PermissionCreationService::class); $this->subuserRepository = m::mock(SubuserRepositoryInterface::class); $this->serverRepository = m::mock(ServerRepositoryInterface::class); $this->userCreationService = m::mock(UserCreationService::class); $this->userRepository = m::mock(UserRepositoryInterface::class); - $this->writer = m::mock(Writer::class); $this->service = new SubuserCreationService( $this->connection, - $this->userCreationService, - $this->daemonRepository, + $this->keyCreationService, $this->permissionService, $this->serverRepository, $this->subuserRepository, - $this->userRepository, - $this->writer + $this->userCreationService, + $this->userRepository ); } @@ -143,22 +135,13 @@ class SubuserCreationServiceTest extends TestCase 'root_admin' => false, ])->once()->andReturn($user); - $this->subuserRepository->shouldReceive('create')->with([ - 'user_id' => $user->id, - 'server_id' => $server->id, - 'daemonSecret' => 'random_string', - ])->once()->andReturn($subuser); - - $this->permissionService->shouldReceive('handle')->with($subuser->id, array_keys($permissions))->once() - ->andReturn(['s:get', 's:console', 'test:1']); - - $this->daemonRepository->shouldReceive('setNode')->with($server->node_id)->once()->andReturnSelf() - ->shouldReceive('setAccessServer')->with($server->uuid)->once()->andReturnSelf() - ->shouldReceive('setSubuserKey')->with($subuser->daemonSecret, ['s:get', 's:console', 'test:1'])->once()->andReturnSelf(); + $this->subuserRepository->shouldReceive('create')->with(['user_id' => $user->id, 'server_id' => $server->id]) + ->once()->andReturn($subuser); + $this->keyCreationService->shouldReceive('handle')->with($server->id, $user->id)->once()->andReturnNull(); + $this->permissionService->shouldReceive('handle')->with($subuser->id, array_keys($permissions))->once()->andReturnNull(); $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); $response = $this->service->handle($server, $user->email, array_keys($permissions)); - $this->assertInstanceOf(Subuser::class, $response); $this->assertSame($subuser, $response); } @@ -180,22 +163,13 @@ class SubuserCreationServiceTest extends TestCase ['server_id', '=', $server->id], ])->once()->andReturn(0); - $this->subuserRepository->shouldReceive('create')->with([ - 'user_id' => $user->id, - 'server_id' => $server->id, - 'daemonSecret' => 'random_string', - ])->once()->andReturn($subuser); - - $this->permissionService->shouldReceive('handle')->with($subuser->id, $permissions)->once() - ->andReturn(['s:get', 's:console', 's:set-password']); - - $this->daemonRepository->shouldReceive('setNode')->with($server->node_id)->once()->andReturnSelf() - ->shouldReceive('setAccessServer')->with($server->uuid)->once()->andReturnSelf() - ->shouldReceive('setSubuserKey')->with($subuser->daemonSecret, ['s:get', 's:console', 's:set-password'])->once()->andReturnSelf(); + $this->subuserRepository->shouldReceive('create')->with(['user_id' => $user->id, 'server_id' => $server->id]) + ->once()->andReturn($subuser); + $this->keyCreationService->shouldReceive('handle')->with($server->id, $user->id)->once()->andReturnNull(); + $this->permissionService->shouldReceive('handle')->with($subuser->id, $permissions)->once()->andReturnNull(); $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); $response = $this->service->handle($server, $user->email, $permissions); - $this->assertInstanceOf(Subuser::class, $response); $this->assertSame($subuser, $response); } diff --git a/tests/Unit/Services/Subusers/SubuserDeletionServiceTest.php b/tests/Unit/Services/Subusers/SubuserDeletionServiceTest.php index dc2d16efd..46b41c28e 100644 --- a/tests/Unit/Services/Subusers/SubuserDeletionServiceTest.php +++ b/tests/Unit/Services/Subusers/SubuserDeletionServiceTest.php @@ -26,35 +26,26 @@ namespace Tests\Unit\Services\Subusers; use Mockery as m; use Tests\TestCase; -use Illuminate\Log\Writer; -use Pterodactyl\Models\Server; use Pterodactyl\Models\Subuser; -use GuzzleHttp\Exception\RequestException; use Illuminate\Database\ConnectionInterface; -use Pterodactyl\Exceptions\DisplayException; use Pterodactyl\Services\Subusers\SubuserDeletionService; +use Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService; use Pterodactyl\Contracts\Repository\SubuserRepositoryInterface; -use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface; class SubuserDeletionServiceTest extends TestCase { /** - * @var \Illuminate\Database\ConnectionInterface + * @var \Illuminate\Database\ConnectionInterface|\Mockery\Mock */ protected $connection; /** - * @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface + * @var \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService|\Mockery\Mock */ - protected $daemonRepository; + protected $keyDeletionService; /** - * @var \GuzzleHttp\Exception\RequestException - */ - protected $exception; - - /** - * @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface + * @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface|\Mockery\Mock */ protected $repository; @@ -63,11 +54,6 @@ class SubuserDeletionServiceTest extends TestCase */ protected $service; - /** - * @var \Illuminate\Log\Writer - */ - protected $writer; - /** * Setup tests. */ @@ -76,63 +62,46 @@ class SubuserDeletionServiceTest extends TestCase parent::setUp(); $this->connection = m::mock(ConnectionInterface::class); - $this->daemonRepository = m::mock(DaemonServerRepositoryInterface::class); - $this->exception = m::mock(RequestException::class); + $this->keyDeletionService = m::mock(DaemonKeyDeletionService::class); $this->repository = m::mock(SubuserRepositoryInterface::class); - $this->writer = m::mock(Writer::class); $this->service = new SubuserDeletionService( $this->connection, - $this->daemonRepository, - $this->repository, - $this->writer + $this->keyDeletionService, + $this->repository ); } /** * Test that a subuser is deleted correctly. */ - public function testSubuserIsDeleted() + public function testSubuserIsDeletedIfModelIsPassed() { $subuser = factory(Subuser::class)->make(); - $subuser->server = factory(Server::class)->make(); - $this->repository->shouldReceive('getWithServer')->with($subuser->id)->once()->andReturn($subuser); $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - $this->repository->shouldReceive('delete')->with($subuser->id)->once()->andReturn(1); - - $this->daemonRepository->shouldReceive('setNode')->with($subuser->server->node_id)->once()->andReturnSelf() - ->shouldReceive('setAccessServer')->with($subuser->server->uuid)->once()->andReturnSelf() - ->shouldReceive('setSubuserKey')->with($subuser->daemonSecret, [])->once()->andReturnNull(); - + $this->keyDeletionService->shouldReceive('handle')->with($subuser->server_id, $subuser->user_id)->once()->andReturnNull(); + $this->repository->shouldReceive('delete')->with($subuser->id)->once()->andReturnNull(); $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); - $response = $this->service->handle($subuser->id); - $this->assertEquals(1, $response); + $this->service->handle($subuser); + $this->assertTrue(true); } /** - * Test that an exception caused by the daemon is properly handled. + * Test that a subuser is deleted correctly if only the subuser ID is passed. */ - public function testExceptionIsThrownIfDaemonConnectionFails() + public function testSubuserIsDeletedIfIdPassedInPlaceOfModel() { $subuser = factory(Subuser::class)->make(); - $subuser->server = factory(Server::class)->make(); - $this->repository->shouldReceive('getWithServer')->with($subuser->id)->once()->andReturn($subuser); + $this->repository->shouldReceive('find')->with($subuser->id)->once()->andReturn($subuser); $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - $this->repository->shouldReceive('delete')->with($subuser->id)->once()->andReturn(1); + $this->keyDeletionService->shouldReceive('handle')->with($subuser->server_id, $subuser->user_id)->once()->andReturnNull(); + $this->repository->shouldReceive('delete')->with($subuser->id)->once()->andReturnNull(); + $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); - $this->daemonRepository->shouldReceive('setNode->setAccessServer->setSubuserKey')->once()->andThrow($this->exception); - - $this->connection->shouldReceive('rollBack')->withNoArgs()->once()->andReturnNull(); - $this->exception->shouldReceive('getResponse')->withNoArgs()->once()->andReturnNull(); - $this->writer->shouldReceive('warning')->with($this->exception)->once()->andReturnNull(); - - try { - $this->service->handle($subuser->id); - } catch (DisplayException $exception) { - $this->assertEquals(trans('exceptions.daemon_connection_failed', ['code' => 'E_CONN_REFUSED']), $exception->getMessage()); - } + $this->service->handle($subuser->id); + $this->assertTrue(true); } } diff --git a/tests/Unit/Services/Subusers/SubuserUpdateServiceTest.php b/tests/Unit/Services/Subusers/SubuserUpdateServiceTest.php index 521af1090..b570f5b93 100644 --- a/tests/Unit/Services/Subusers/SubuserUpdateServiceTest.php +++ b/tests/Unit/Services/Subusers/SubuserUpdateServiceTest.php @@ -32,8 +32,10 @@ use Pterodactyl\Models\Subuser; use GuzzleHttp\Exception\RequestException; use Illuminate\Database\ConnectionInterface; use Pterodactyl\Exceptions\DisplayException; +use Pterodactyl\Exceptions\PterodactylException; use Pterodactyl\Services\Subusers\SubuserUpdateService; use Pterodactyl\Services\Subusers\PermissionCreationService; +use Pterodactyl\Services\DaemonKeys\DaemonKeyProviderService; use Pterodactyl\Contracts\Repository\SubuserRepositoryInterface; use Pterodactyl\Contracts\Repository\PermissionRepositoryInterface; use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface; @@ -41,32 +43,37 @@ use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonS class SubuserUpdateServiceTest extends TestCase { /** - * @var \Illuminate\Database\ConnectionInterface + * @var \Illuminate\Database\ConnectionInterface|\Mockery\Mock */ protected $connection; /** - * @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface + * @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface|\Mockery\Mock */ protected $daemonRepository; /** - * @var \GuzzleHttp\Exception\RequestException + * @var \GuzzleHttp\Exception\RequestException|\Mockery\Mock */ protected $exception; /** - * @var \Pterodactyl\Contracts\Repository\PermissionRepositoryInterface + * @var \Pterodactyl\Services\DaemonKeys\DaemonKeyProviderService|\Mockery\Mock + */ + private $keyProviderService; + + /** + * @var \Pterodactyl\Contracts\Repository\PermissionRepositoryInterface|\Mockery\Mock */ protected $permissionRepository; /** - * @var \Pterodactyl\Services\Subusers\PermissionCreationService + * @var \Pterodactyl\Services\Subusers\PermissionCreationService|\Mockery\Mock */ protected $permissionService; /** - * @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface + * @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface|\Mockery\Mock */ protected $repository; @@ -76,7 +83,7 @@ class SubuserUpdateServiceTest extends TestCase protected $service; /** - * @var \Illuminate\Log\Writer + * @var \Illuminate\Log\Writer|\Mockery\Mock */ protected $writer; @@ -90,6 +97,7 @@ class SubuserUpdateServiceTest extends TestCase $this->connection = m::mock(ConnectionInterface::class); $this->daemonRepository = m::mock(DaemonServerRepositoryInterface::class); $this->exception = m::mock(RequestException::class); + $this->keyProviderService = m::mock(DaemonKeyProviderService::class); $this->permissionRepository = m::mock(PermissionRepositoryInterface::class); $this->permissionService = m::mock(PermissionCreationService::class); $this->repository = m::mock(SubuserRepositoryInterface::class); @@ -97,6 +105,7 @@ class SubuserUpdateServiceTest extends TestCase $this->service = new SubuserUpdateService( $this->connection, + $this->keyProviderService, $this->daemonRepository, $this->permissionService, $this->permissionRepository, @@ -115,18 +124,19 @@ class SubuserUpdateServiceTest extends TestCase $this->repository->shouldReceive('getWithServer')->with($subuser->id)->once()->andReturn($subuser); $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - $this->permissionRepository->shouldReceive('deleteWhere')->with([ - ['subuser_id', '=', $subuser->id], - ])->once()->andReturnNull(); - $this->permissionService->shouldReceive('handle')->with($subuser->id, ['some-permission'])->once()->andReturn(['test:1', 'test:2']); + $this->permissionRepository->shouldReceive('deleteWhere')->with([['subuser_id', '=', $subuser->id]]) + ->once()->andReturnNull(); + $this->permissionService->shouldReceive('handle')->with($subuser->id, ['some-permission'])->once()->andReturnNull(); + $this->keyProviderService->shouldReceive('handle')->with($subuser->server_id, $subuser->user_id, false) + ->once()->andReturn('test123'); $this->daemonRepository->shouldReceive('setNode')->with($subuser->server->node_id)->once()->andReturnSelf() - ->shouldReceive('setAccessServer')->with($subuser->server->uuid)->once()->andReturnSelf() - ->shouldReceive('setSubuserKey')->with($subuser->daemonSecret, ['test:1', 'test:2'])->once()->andReturnNull(); + ->shouldReceive('revokeAccessKey')->with('test123')->once()->andReturnNull(); $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); $this->service->handle($subuser->id, ['some-permission']); + $this->assertTrue(true); } /** @@ -139,11 +149,12 @@ class SubuserUpdateServiceTest extends TestCase $this->repository->shouldReceive('getWithServer')->with($subuser->id)->once()->andReturn($subuser); $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - $this->permissionRepository->shouldReceive('deleteWhere')->with([ - ['subuser_id', '=', $subuser->id], - ])->once()->andReturnNull(); - $this->permissionService->shouldReceive('handle')->with($subuser->id, [])->once()->andReturn([]); + $this->permissionRepository->shouldReceive('deleteWhere')->with([['subuser_id', '=', $subuser->id]]) + ->once()->andReturnNull(); + $this->permissionService->shouldReceive('handle')->with($subuser->id, [])->once()->andReturnNull(); + $this->keyProviderService->shouldReceive('handle')->with($subuser->server_id, $subuser->user_id, false) + ->once()->andReturn('test123'); $this->daemonRepository->shouldReceive('setNode')->once()->andThrow($this->exception); $this->connection->shouldReceive('rollBack')->withNoArgs()->once()->andReturnNull(); $this->writer->shouldReceive('warning')->with($this->exception)->once()->andReturnNull(); @@ -151,8 +162,11 @@ class SubuserUpdateServiceTest extends TestCase try { $this->service->handle($subuser->id, []); - } catch (DisplayException $exception) { - $this->assertEquals(trans('exceptions.daemon_connection_failed', ['code' => 'E_CONN_REFUSED']), $exception->getMessage()); + } catch (PterodactylException $exception) { + $this->assertInstanceOf(DisplayException::class, $exception); + $this->assertEquals(trans('exceptions.daemon_connection_failed', [ + 'code' => 'E_CONN_REFUSED', + ]), $exception->getMessage()); } } }