diff --git a/app/Repositories/Wings/DaemonServerRepository.php b/app/Repositories/Wings/DaemonServerRepository.php index 9bcf80b84..ddd4c4d60 100644 --- a/app/Repositories/Wings/DaemonServerRepository.php +++ b/app/Repositories/Wings/DaemonServerRepository.php @@ -2,6 +2,7 @@ namespace Pterodactyl\Repositories\Wings; +use BadMethodCallException; use Webmozart\Assert\Assert; use Pterodactyl\Models\Server; use GuzzleHttp\Exception\TransferException; @@ -69,4 +70,30 @@ class DaemonServerRepository extends DaemonRepository throw new DaemonConnectionException($exception); } } + + /** + * Delete a server from the daemon. + */ + public function delete(): void + { + throw new BadMethodCallException('Method is not implemented.'); + } + + /** + * Reinstall a server on the daemon. + */ + public function reinstall(): void + { + throw new BadMethodCallException('Method is not implemented.'); + } + + public function suspend(): void + { + throw new BadMethodCallException('Method is not implemented.'); + } + + public function unsuspend(): void + { + throw new BadMethodCallException('Method is not implemented.'); + } } diff --git a/app/Services/DaemonKeys/DaemonKeyDeletionService.php b/app/Services/DaemonKeys/DaemonKeyDeletionService.php deleted file mode 100644 index 1c9919c9a..000000000 --- a/app/Services/DaemonKeys/DaemonKeyDeletionService.php +++ /dev/null @@ -1,124 +0,0 @@ -. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -namespace Pterodactyl\Services\DaemonKeys; - -use Webmozart\Assert\Assert; -use Pterodactyl\Models\Server; -use Psr\Log\LoggerInterface as Writer; -use GuzzleHttp\Exception\RequestException; -use Illuminate\Database\ConnectionInterface; -use Pterodactyl\Exceptions\DisplayException; -use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; -use Pterodactyl\Contracts\Repository\DaemonKeyRepositoryInterface; -use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface; - -class DaemonKeyDeletionService -{ - /** - * @var \Illuminate\Database\ConnectionInterface - */ - protected $connection; - - /** - * @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface - */ - protected $daemonRepository; - - /** - * @var \Pterodactyl\Contracts\Repository\DaemonKeyRepositoryInterface - */ - protected $repository; - - /** - * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface - */ - protected $serverRepository; - - /** - * @var \Psr\Log\LoggerInterface - */ - protected $writer; - - /** - * DaemonKeyDeletionService constructor. - * - * @param \Illuminate\Database\ConnectionInterface $connection - * @param \Pterodactyl\Contracts\Repository\DaemonKeyRepositoryInterface $repository - * @param \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface $daemonRepository - * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $serverRepository - * @param \Psr\Log\LoggerInterface $writer - */ - public function __construct( - ConnectionInterface $connection, - DaemonKeyRepositoryInterface $repository, - DaemonServerRepositoryInterface $daemonRepository, - ServerRepositoryInterface $serverRepository, - Writer $writer - ) { - $this->connection = $connection; - $this->daemonRepository = $daemonRepository; - $this->repository = $repository; - $this->serverRepository = $serverRepository; - $this->writer = $writer; - } - - /** - * @param \Pterodactyl\Models\Server|int $server - * @param int $user - * - * @throws \Pterodactyl\Exceptions\DisplayException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function handle($server, $user) - { - Assert::integerish($user, 'Second argument passed to handle must be an integer, received %s.'); - - if (! $server instanceof Server) { - $server = $this->serverRepository->find($server); - } - - $this->connection->beginTransaction(); - $key = $this->repository->findFirstWhere([ - ['user_id', '=', $user], - ['server_id', '=', $server->id], - ]); - - $this->repository->delete($key->id); - - try { - $this->daemonRepository->setServer($server)->revokeAccessKey($key->secret); - } catch (RequestException $exception) { - $response = $exception->getResponse(); - $this->connection->rollBack(); - $this->writer->warning($exception); - - throw new DisplayException(trans('admin/server.exceptions.daemon_exception', [ - 'code' => is_null($response) ? 'E_CONN_REFUSED' : $response->getStatusCode(), - ])); - } - - $this->connection->commit(); - } -} diff --git a/app/Services/Servers/ContainerRebuildService.php b/app/Services/Servers/ContainerRebuildService.php index 0dc25b0e4..a5e21c1dc 100644 --- a/app/Services/Servers/ContainerRebuildService.php +++ b/app/Services/Servers/ContainerRebuildService.php @@ -4,28 +4,30 @@ namespace Pterodactyl\Services\Servers; use Pterodactyl\Models\Server; use GuzzleHttp\Exception\RequestException; +use Pterodactyl\Repositories\Wings\DaemonServerRepository; use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException; -use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface; class ContainerRebuildService { /** - * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface + * @var \Pterodactyl\Repositories\Wings\DaemonServerRepository */ private $repository; /** * ContainerRebuildService constructor. * - * @param \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface $repository + * @param \Pterodactyl\Repositories\Wings\DaemonServerRepository $repository */ - public function __construct(ServerRepositoryInterface $repository) + public function __construct(DaemonServerRepository $repository) { $this->repository = $repository; } /** - * Mark a server for rebuild on next boot cycle. + * Mark a server for rebuild on next boot cycle. This just makes an empty patch + * request to Wings which will automatically mark the container as requiring a rebuild + * on the next boot as a result. * * @param \Pterodactyl\Models\Server $server * @@ -34,7 +36,7 @@ class ContainerRebuildService public function handle(Server $server) { try { - $this->repository->setServer($server)->rebuild(); + $this->repository->setServer($server)->update([]); } catch (RequestException $exception) { throw new DaemonConnectionException($exception); } diff --git a/app/Services/Servers/DetailsModificationService.php b/app/Services/Servers/DetailsModificationService.php index 37bf0813c..65a5b2815 100644 --- a/app/Services/Servers/DetailsModificationService.php +++ b/app/Services/Servers/DetailsModificationService.php @@ -6,8 +6,6 @@ use Pterodactyl\Models\Server; use Illuminate\Database\ConnectionInterface; use Pterodactyl\Traits\Services\ReturnsUpdatedModels; use Pterodactyl\Repositories\Eloquent\ServerRepository; -use Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService; -use Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService; class DetailsModificationService { @@ -18,16 +16,6 @@ class DetailsModificationService */ private $connection; - /** - * @var \Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService - */ - private $keyCreationService; - - /** - * @var \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService - */ - private $keyDeletionService; - /** * @var \Pterodactyl\Repositories\Eloquent\ServerRepository */ @@ -37,19 +25,13 @@ class DetailsModificationService * DetailsModificationService constructor. * * @param \Illuminate\Database\ConnectionInterface $connection - * @param \Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService $keyCreationService - * @param \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService $keyDeletionService * @param \Pterodactyl\Repositories\Eloquent\ServerRepository $repository */ public function __construct( ConnectionInterface $connection, - DaemonKeyCreationService $keyCreationService, - DaemonKeyDeletionService $keyDeletionService, ServerRepository $repository ) { $this->connection = $connection; - $this->keyCreationService = $keyCreationService; - $this->keyDeletionService = $keyDeletionService; $this->repository = $repository; } @@ -60,7 +42,6 @@ class DetailsModificationService * @param array $data * @return bool|\Pterodactyl\Models\Server * - * @throws \Pterodactyl\Exceptions\DisplayException * @throws \Pterodactyl\Exceptions\Model\DataValidationException * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException */ @@ -75,11 +56,6 @@ class DetailsModificationService 'description' => array_get($data, 'description') ?? '', ], true, true); - if ((int) array_get($data, 'owner_id', 0) !== (int) $server->owner_id) { - $this->keyDeletionService->handle($server, $server->owner_id); - $this->keyCreationService->handle($server->id, array_get($data, 'owner_id')); - } - $this->connection->commit(); return $response; diff --git a/app/Services/Servers/ReinstallServerService.php b/app/Services/Servers/ReinstallServerService.php index 1d0d4c6e8..6242eeea2 100644 --- a/app/Services/Servers/ReinstallServerService.php +++ b/app/Services/Servers/ReinstallServerService.php @@ -1,48 +1,41 @@ . - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ namespace Pterodactyl\Services\Servers; use Pterodactyl\Models\Server; use GuzzleHttp\Exception\RequestException; use Illuminate\Database\ConnectionInterface; +use Pterodactyl\Repositories\Wings\DaemonServerRepository; use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException; -use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface; class ReinstallServerService { /** - * @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface + * @var \Pterodactyl\Repositories\Wings\DaemonServerRepository */ - protected $daemonServerRepository; + private $daemonServerRepository; /** * @var \Illuminate\Database\ConnectionInterface */ - protected $database; + private $database; /** * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface */ - protected $repository; + private $repository; /** * ReinstallService constructor. * * @param \Illuminate\Database\ConnectionInterface $database - * @param \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface $daemonServerRepository + * @param \Pterodactyl\Repositories\Wings\DaemonServerRepository $daemonServerRepository * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $repository */ public function __construct( ConnectionInterface $database, - DaemonServerRepositoryInterface $daemonServerRepository, + DaemonServerRepository $daemonServerRepository, ServerRepositoryInterface $repository ) { $this->daemonServerRepository = $daemonServerRepository; diff --git a/app/Services/Servers/ServerDeletionService.php b/app/Services/Servers/ServerDeletionService.php index e2919894b..83a936054 100644 --- a/app/Services/Servers/ServerDeletionService.php +++ b/app/Services/Servers/ServerDeletionService.php @@ -1,82 +1,76 @@ . - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ namespace Pterodactyl\Services\Servers; -use Psr\Log\LoggerInterface as Writer; +use Psr\Log\LoggerInterface; +use Pterodactyl\Models\Server; use GuzzleHttp\Exception\RequestException; use Illuminate\Database\ConnectionInterface; +use Pterodactyl\Repositories\Eloquent\ServerRepository; +use Pterodactyl\Repositories\Eloquent\DatabaseRepository; +use Pterodactyl\Repositories\Wings\DaemonServerRepository; use Pterodactyl\Services\Databases\DatabaseManagementService; -use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; -use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface; use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException; -use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface; class ServerDeletionService { - /** - * @var \Illuminate\Database\ConnectionInterface - */ - protected $connection; - - /** - * @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface - */ - protected $daemonServerRepository; - - /** - * @var \Pterodactyl\Services\Databases\DatabaseManagementService - */ - protected $databaseManagementService; - - /** - * @var \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface - */ - protected $databaseRepository; - /** * @var bool */ protected $force = false; /** - * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface + * @var \Illuminate\Database\ConnectionInterface */ - protected $repository; + private $connection; + + /** + * @var \Pterodactyl\Repositories\Wings\DaemonServerRepository + */ + private $daemonServerRepository; + + /** + * @var \Pterodactyl\Repositories\Eloquent\DatabaseRepository + */ + private $databaseRepository; + + /** + * @var \Pterodactyl\Services\Databases\DatabaseManagementService + */ + private $databaseManagementService; + + /** + * @var \Pterodactyl\Repositories\Eloquent\ServerRepository + */ + private $repository; /** * @var \Psr\Log\LoggerInterface */ - protected $writer; + private $writer; /** * DeletionService constructor. * * @param \Illuminate\Database\ConnectionInterface $connection - * @param \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface $daemonServerRepository - * @param \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface $databaseRepository + * @param \Pterodactyl\Repositories\Wings\DaemonServerRepository $daemonServerRepository + * @param \Pterodactyl\Repositories\Eloquent\DatabaseRepository $databaseRepository * @param \Pterodactyl\Services\Databases\DatabaseManagementService $databaseManagementService - * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $repository + * @param \Pterodactyl\Repositories\Eloquent\ServerRepository $repository * @param \Psr\Log\LoggerInterface $writer */ public function __construct( ConnectionInterface $connection, - DaemonServerRepositoryInterface $daemonServerRepository, - DatabaseRepositoryInterface $databaseRepository, + DaemonServerRepository $daemonServerRepository, + DatabaseRepository $databaseRepository, DatabaseManagementService $databaseManagementService, - ServerRepositoryInterface $repository, - Writer $writer + ServerRepository $repository, + LoggerInterface $writer ) { - $this->daemonServerRepository = $daemonServerRepository; $this->connection = $connection; - $this->databaseManagementService = $databaseManagementService; + $this->daemonServerRepository = $daemonServerRepository; $this->databaseRepository = $databaseRepository; + $this->databaseManagementService = $databaseManagementService; $this->repository = $repository; $this->writer = $writer; } @@ -97,11 +91,12 @@ class ServerDeletionService /** * Delete a server from the panel and remove any associated databases from hosts. * - * @param int|\Pterodactyl\Models\Server $server + * @param \Pterodactyl\Models\Server $server * + * @throws \Throwable * @throws \Pterodactyl\Exceptions\DisplayException */ - public function handle($server) + public function handle(Server $server) { try { $this->daemonServerRepository->setServer($server)->delete(); @@ -119,12 +114,12 @@ class ServerDeletionService } } - $this->connection->beginTransaction(); - $this->databaseRepository->setColumns('id')->findWhere([['server_id', '=', $server->id]])->each(function ($item) { - $this->databaseManagementService->delete($item->id); - }); + $this->connection->transaction(function () use ($server) { + $this->databaseRepository->setColumns('id')->findWhere([['server_id', '=', $server->id]])->each(function ($item) { + $this->databaseManagementService->delete($item->id); + }); - $this->repository->delete($server->id); - $this->connection->commit(); + $this->repository->delete($server->id); + }); } } diff --git a/app/Services/Servers/StartupModificationService.php b/app/Services/Servers/StartupModificationService.php index 82f11bbf8..8cbc4ab2c 100644 --- a/app/Services/Servers/StartupModificationService.php +++ b/app/Services/Servers/StartupModificationService.php @@ -7,21 +7,16 @@ use Pterodactyl\Models\Server; use GuzzleHttp\Exception\RequestException; use Illuminate\Database\ConnectionInterface; use Pterodactyl\Traits\Services\HasUserLevels; +use Pterodactyl\Repositories\Wings\DaemonServerRepository; use Pterodactyl\Contracts\Repository\EggRepositoryInterface; use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException; use Pterodactyl\Contracts\Repository\ServerVariableRepositoryInterface; -use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface; class StartupModificationService { use HasUserLevels; - /** - * @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface - */ - private $daemonServerRepository; - /** * @var \Illuminate\Database\ConnectionInterface */ @@ -52,11 +47,16 @@ class StartupModificationService */ private $validatorService; + /** + * @var \Pterodactyl\Repositories\Wings\DaemonServerRepository + */ + private $daemonServerRepository; + /** * StartupModificationService constructor. * * @param \Illuminate\Database\ConnectionInterface $connection - * @param \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface $daemonServerRepository + * @param \Pterodactyl\Repositories\Wings\DaemonServerRepository $daemonServerRepository * @param \Pterodactyl\Contracts\Repository\EggRepositoryInterface $eggRepository * @param \Pterodactyl\Services\Servers\EnvironmentService $environmentService * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $repository @@ -65,20 +65,20 @@ class StartupModificationService */ public function __construct( ConnectionInterface $connection, - DaemonServerRepositoryInterface $daemonServerRepository, + DaemonServerRepository $daemonServerRepository, EggRepositoryInterface $eggRepository, EnvironmentService $environmentService, ServerRepositoryInterface $repository, ServerVariableRepositoryInterface $serverVariableRepository, VariableValidatorService $validatorService ) { - $this->daemonServerRepository = $daemonServerRepository; $this->connection = $connection; $this->eggRepository = $eggRepository; $this->environmentService = $environmentService; $this->repository = $repository; $this->serverVariableRepository = $serverVariableRepository; $this->validatorService = $validatorService; + $this->daemonServerRepository = $daemonServerRepository; } /** diff --git a/app/Services/Servers/SuspensionService.php b/app/Services/Servers/SuspensionService.php index 7dcbd2408..3eba0fefd 100644 --- a/app/Services/Servers/SuspensionService.php +++ b/app/Services/Servers/SuspensionService.php @@ -1,66 +1,59 @@ . - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ namespace Pterodactyl\Services\Servers; +use Psr\Log\LoggerInterface; use InvalidArgumentException; use Pterodactyl\Models\Server; -use Psr\Log\LoggerInterface as Writer; use GuzzleHttp\Exception\RequestException; use Illuminate\Database\ConnectionInterface; use Pterodactyl\Exceptions\DisplayException; +use Pterodactyl\Repositories\Wings\DaemonServerRepository; use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; -use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface; class SuspensionService { const ACTION_SUSPEND = 'suspend'; const ACTION_UNSUSPEND = 'unsuspend'; - /** - * @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface - */ - protected $daemonServerRepository; - /** * @var \Illuminate\Database\ConnectionInterface */ - protected $database; + private $database; /** * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface */ - protected $repository; + private $repository; /** * @var \Psr\Log\LoggerInterface */ - protected $writer; + private $writer; + + /** + * @var \Pterodactyl\Repositories\Wings\DaemonServerRepository + */ + private $daemonServerRepository; /** * SuspensionService constructor. * * @param \Illuminate\Database\ConnectionInterface $database - * @param \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface $daemonServerRepository + * @param \Pterodactyl\Repositories\Wings\DaemonServerRepository $daemonServerRepository * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $repository * @param \Psr\Log\LoggerInterface $writer */ public function __construct( ConnectionInterface $database, - DaemonServerRepositoryInterface $daemonServerRepository, + DaemonServerRepository $daemonServerRepository, ServerRepositoryInterface $repository, - Writer $writer + LoggerInterface $writer ) { - $this->daemonServerRepository = $daemonServerRepository; $this->database = $database; $this->repository = $repository; $this->writer = $writer; + $this->daemonServerRepository = $daemonServerRepository; } /** diff --git a/app/Services/Subusers/SubuserDeletionService.php b/app/Services/Subusers/SubuserDeletionService.php index 28d7cd168..6bc35ae3b 100644 --- a/app/Services/Subusers/SubuserDeletionService.php +++ b/app/Services/Subusers/SubuserDeletionService.php @@ -1,31 +1,12 @@ . - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ namespace Pterodactyl\Services\Subusers; use Pterodactyl\Models\Subuser; -use Illuminate\Database\ConnectionInterface; -use Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService; use Pterodactyl\Contracts\Repository\SubuserRepositoryInterface; class SubuserDeletionService { - /** - * @var \Illuminate\Database\ConnectionInterface - */ - private $connection; - - /** - * @var \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService - */ - private $keyDeletionService; - /** * @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface */ @@ -34,17 +15,11 @@ class SubuserDeletionService /** * SubuserDeletionService constructor. * - * @param \Illuminate\Database\ConnectionInterface $connection - * @param \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService $keyDeletionService * @param \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface $repository */ public function __construct( - ConnectionInterface $connection, - DaemonKeyDeletionService $keyDeletionService, SubuserRepositoryInterface $repository ) { - $this->connection = $connection; - $this->keyDeletionService = $keyDeletionService; $this->repository = $repository; } @@ -52,15 +27,9 @@ class SubuserDeletionService * Delete a subuser and their associated permissions from the Panel and Daemon. * * @param \Pterodactyl\Models\Subuser $subuser - * - * @throws \Pterodactyl\Exceptions\DisplayException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException */ public function handle(Subuser $subuser) { - $this->connection->beginTransaction(); - $this->keyDeletionService->handle($subuser->server_id, $subuser->user_id); $this->repository->delete($subuser->id); - $this->connection->commit(); } } diff --git a/tests/Unit/Services/DaemonKeys/DaemonKeyDeletionServiceTest.php b/tests/Unit/Services/DaemonKeys/DaemonKeyDeletionServiceTest.php deleted file mode 100644 index 77328c56a..000000000 --- a/tests/Unit/Services/DaemonKeys/DaemonKeyDeletionServiceTest.php +++ /dev/null @@ -1,163 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Tests\Unit\Services\DaemonKeys; - -use Mockery as m; -use Tests\TestCase; -use GuzzleHttp\Psr7\Response; -use Pterodactyl\Models\Server; -use Pterodactyl\Models\DaemonKey; -use Psr\Log\LoggerInterface as Writer; -use GuzzleHttp\Exception\RequestException; -use Illuminate\Database\ConnectionInterface; -use Pterodactyl\Exceptions\DisplayException; -use Pterodactyl\Exceptions\PterodactylException; -use Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService; -use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; -use Pterodactyl\Contracts\Repository\DaemonKeyRepositoryInterface; -use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface; - -class DaemonKeyDeletionServiceTest extends TestCase -{ - /** - * @var \Illuminate\Database\ConnectionInterface|\Mockery\Mock - */ - protected $connection; - - /** - * @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface|\Mockery\Mock - */ - protected $daemonRepository; - - /** - * @var \GuzzleHttp\Exception\RequestException|\Mockery\Mock - */ - protected $exception; - - /** - * @var \Pterodactyl\Contracts\Repository\DaemonKeyRepositoryInterface|\Mockery\Mock - */ - protected $repository; - - /** - * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface|\Mockery\Mock - */ - protected $serverRepository; - - /** - * @var \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService - */ - protected $service; - - /** - * @var \Psr\Log\LoggerInterface|\Mockery\Mock - */ - protected $writer; - - /** - * Setup tests. - */ - public function setUp() - { - parent::setUp(); - - $this->connection = m::mock(ConnectionInterface::class); - $this->daemonRepository = m::mock(DaemonServerRepositoryInterface::class); - $this->exception = m::mock(RequestException::class); - $this->repository = m::mock(DaemonKeyRepositoryInterface::class); - $this->serverRepository = m::mock(ServerRepositoryInterface::class); - $this->writer = m::mock(Writer::class); - - $this->service = new DaemonKeyDeletionService( - $this->connection, - $this->repository, - $this->daemonRepository, - $this->serverRepository, - $this->writer - ); - } - - /** - * Test that a daemon key is deleted correctly. - */ - public function testKeyIsDeleted() - { - $server = factory(Server::class)->make(); - $key = factory(DaemonKey::class)->make(); - - $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - $this->repository->shouldReceive('findFirstWhere')->with([ - ['user_id', '=', 100], - ['server_id', '=', $server->id], - ])->once()->andReturn($key); - - $this->repository->shouldReceive('delete')->with($key->id)->once()->andReturn(1); - $this->daemonRepository->shouldReceive('setServer')->with($server)->once()->andReturnSelf() - ->shouldReceive('revokeAccessKey')->with($key->secret)->once()->andReturn(new Response); - $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); - - $this->service->handle($server, 100); - $this->assertTrue(true); - } - - /** - * Test that a daemon key can be deleted when only a server ID is passed. - */ - public function testKeyIsDeletedIfIdIsPassedInPlaceOfModel() - { - $server = factory(Server::class)->make(); - $key = factory(DaemonKey::class)->make(); - - $this->serverRepository->shouldReceive('find')->with($server->id)->once()->andReturn($server); - $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - $this->repository->shouldReceive('findFirstWhere')->with([ - ['user_id', '=', 100], - ['server_id', '=', $server->id], - ])->once()->andReturn($key); - - $this->repository->shouldReceive('delete')->with($key->id)->once()->andReturn(1); - $this->daemonRepository->shouldReceive('setServer')->with($server)->once()->andReturnSelf() - ->shouldReceive('revokeAccessKey')->with($key->secret)->once()->andReturn(new Response); - $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); - - $this->service->handle($server->id, 100); - $this->assertTrue(true); - } - - /** - * Test that an exception is properly handled if thrown by guzzle. - */ - public function testExceptionReturnedByGuzzleIsHandled() - { - $server = factory(Server::class)->make(); - $key = factory(DaemonKey::class)->make(); - - $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - $this->repository->shouldReceive('findFirstWhere')->with([ - ['user_id', '=', 100], - ['server_id', '=', $server->id], - ])->once()->andReturn($key); - - $this->repository->shouldReceive('delete')->with($key->id)->once()->andReturn(1); - $this->daemonRepository->shouldReceive('setServer')->with($server)->once()->andThrow($this->exception); - $this->exception->shouldReceive('getResponse')->withNoArgs()->once()->andReturnNull(); - $this->connection->shouldReceive('rollBack')->withNoArgs()->once()->andReturnNull(); - $this->writer->shouldReceive('warning')->with($this->exception)->once()->andReturnNull(); - - try { - $this->service->handle($server, 100); - } catch (PterodactylException $exception) { - $this->assertInstanceOf(DisplayException::class, $exception); - $this->assertEquals(trans('admin/server.exceptions.daemon_exception', [ - 'code' => 'E_CONN_REFUSED', - ]), $exception->getMessage()); - } - } -} diff --git a/tests/Unit/Services/Servers/DetailsModificationServiceTest.php b/tests/Unit/Services/Servers/DetailsModificationServiceTest.php deleted file mode 100644 index bbb7ab1ff..000000000 --- a/tests/Unit/Services/Servers/DetailsModificationServiceTest.php +++ /dev/null @@ -1,132 +0,0 @@ -connection = m::mock(ConnectionInterface::class); - $this->keyCreationService = m::mock(DaemonKeyCreationService::class); - $this->keyDeletionService = m::mock(DaemonKeyDeletionService::class); - $this->repository = m::mock(ServerRepository::class); - } - - /** - * Test basic updating of core variables when a model is provided. - */ - public function testDetailsAreEdited() - { - $server = factory(Server::class)->make(['owner_id' => 1]); - - $data = ['owner_id' => 1, 'name' => 'New Name', 'description' => 'New Description']; - - $this->connection->shouldReceive('beginTransaction')->once()->withNoArgs()->andReturnNull(); - $this->repository->shouldReceive('setFreshModel')->once()->with(false)->andReturnSelf(); - $this->repository->shouldReceive('update')->once()->with($server->id, [ - 'external_id' => null, - 'owner_id' => $data['owner_id'], - 'name' => $data['name'], - 'description' => $data['description'], - ], true, true)->andReturn(true); - - $this->connection->shouldReceive('commit')->once()->withNoArgs()->andReturnNull(); - - $response = $this->getService()->handle($server, $data); - $this->assertTrue($response); - } - - /** - * Test that a model is returned if requested. - */ - public function testModelIsReturned() - { - $server = factory(Server::class)->make(['owner_id' => 1]); - - $this->connection->shouldReceive('beginTransaction')->once()->withNoArgs()->andReturnNull(); - $this->repository->shouldReceive('setFreshModel')->once()->with(true)->andReturnSelf(); - $this->repository->shouldReceive('update')->once()->andReturn($server); - - $this->connection->shouldReceive('commit')->once()->withNoArgs()->andReturnNull(); - - $response = $this->getService()->returnUpdatedModel()->handle($server, ['owner_id' => 1]); - $this->assertInstanceOf(Server::class, $response); - } - - /** - * Test that the daemon secret is reset if the owner id changes. - */ - public function testEditShouldResetDaemonSecretIfOwnerIdIsChanged() - { - $server = factory(Server::class)->make([ - 'owner_id' => 1, - ]); - - $data = ['owner_id' => 2, 'name' => 'New Name', 'description' => 'New Description', 'external_id' => 'abcd1234']; - - $this->connection->shouldReceive('beginTransaction')->once()->withNoArgs()->andReturnNull(); - $this->repository->shouldReceive('setFreshModel')->once()->with(false)->andReturnSelf(); - $this->repository->shouldReceive('update')->once()->with($server->id, [ - 'external_id' => 'abcd1234', - 'owner_id' => $data['owner_id'], - 'name' => $data['name'], - 'description' => $data['description'], - ], true, true)->andReturn(true); - - $this->keyDeletionService->shouldReceive('handle')->once()->with($server, $server->owner_id)->andReturnNull(); - $this->keyCreationService->shouldReceive('handle')->once()->with($server->id, $data['owner_id'])->andReturnNull(); - $this->connection->shouldReceive('commit')->once()->withNoArgs()->andReturnNull(); - - $response = $this->getService()->handle($server, $data); - $this->assertTrue($response); - } - - /** - * Return an instance of the service with mocked dependencies for testing. - * - * @return \Pterodactyl\Services\Servers\DetailsModificationService - */ - private function getService(): DetailsModificationService - { - return new DetailsModificationService( - $this->connection, - $this->keyCreationService, - $this->keyDeletionService, - $this->repository - ); - } -} diff --git a/tests/Unit/Services/Subusers/SubuserDeletionServiceTest.php b/tests/Unit/Services/Subusers/SubuserDeletionServiceTest.php deleted file mode 100644 index b32b272ed..000000000 --- a/tests/Unit/Services/Subusers/SubuserDeletionServiceTest.php +++ /dev/null @@ -1,74 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Tests\Unit\Services\Subusers; - -use Mockery as m; -use Tests\TestCase; -use Pterodactyl\Models\Subuser; -use Illuminate\Database\ConnectionInterface; -use Pterodactyl\Services\Subusers\SubuserDeletionService; -use Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService; -use Pterodactyl\Contracts\Repository\SubuserRepositoryInterface; - -class SubuserDeletionServiceTest extends TestCase -{ - /** - * @var \Illuminate\Database\ConnectionInterface|\Mockery\Mock - */ - private $connection; - - /** - * @var \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService|\Mockery\Mock - */ - private $keyDeletionService; - - /** - * @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface|\Mockery\Mock - */ - private $repository; - - /** - * Setup tests. - */ - public function setUp() - { - parent::setUp(); - - $this->connection = m::mock(ConnectionInterface::class); - $this->keyDeletionService = m::mock(DaemonKeyDeletionService::class); - $this->repository = m::mock(SubuserRepositoryInterface::class); - } - - /** - * Test that a subuser is deleted correctly. - */ - public function testSubuserIsDeleted() - { - $subuser = factory(Subuser::class)->make(); - - $this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull(); - $this->keyDeletionService->shouldReceive('handle')->with($subuser->server_id, $subuser->user_id)->once()->andReturnNull(); - $this->repository->shouldReceive('delete')->with($subuser->id)->once()->andReturn(1); - $this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull(); - - $this->getService()->handle($subuser); - $this->assertTrue(true); - } - - /** - * Return an instance of the service with mocked dependencies for testing. - * - * @return \Pterodactyl\Services\Subusers\SubuserDeletionService - */ - private function getService(): SubuserDeletionService - { - return new SubuserDeletionService($this->connection, $this->keyDeletionService, $this->repository); - } -}