From ab2973c4d1c62c0bfc5e34c111d8ac62c64304f7 Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Thu, 1 Mar 2018 18:43:39 -0600 Subject: [PATCH] Add pack transformer support --- CHANGELOG.md | 1 + app/Providers/MacroServiceProvider.php | 44 +-------- .../Api/Application/PackTransformer.php | 92 +++++-------------- .../Api/Application/ServerTransformer.php | 59 ++++++++---- .../Api/Application/SubuserTransformer.php | 60 ------------ 5 files changed, 62 insertions(+), 194 deletions(-) delete mode 100644 app/Transformers/Api/Application/SubuserTransformer.php diff --git a/CHANGELOG.md b/CHANGELOG.md index eee443604..f0953dcdd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. ### Added * Adds back client API for sending commands or power toggles to a server though the Panel API: `/api/client/servers/` +* Added proper transformer for Packs and re-enabled missing includes on server. ## v0.7.3 (Derelict Dermodactylus) ### Fixed diff --git a/app/Providers/MacroServiceProvider.php b/app/Providers/MacroServiceProvider.php index ddfbf7aa8..9eae42b81 100644 --- a/app/Providers/MacroServiceProvider.php +++ b/app/Providers/MacroServiceProvider.php @@ -1,21 +1,9 @@ . - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ namespace Pterodactyl\Providers; -use File; -use Cache; -use Carbon; -use Request; -use Pterodactyl\Models\ApiKey; +use Illuminate\Support\Facades\File; use Illuminate\Support\ServiceProvider; -use Pterodactyl\Services\ApiKeyService; class MacroServiceProvider extends ServiceProvider { @@ -36,35 +24,5 @@ class MacroServiceProvider extends ServiceProvider return round($size, ($i < 2) ? 0 : $precision) . ' ' . $units[$i]; }); - - Request::macro('apiKey', function () { - if (! Request::bearerToken()) { - return false; - } - - $parts = explode('.', Request::bearerToken()); - - if (count($parts) === 2 && strlen($parts[0]) === ApiKeyService::PUB_CRYPTO_BYTES * 2) { - // Because the key itself isn't changing frequently, we simply cache this for - // 15 minutes to speed up the API and keep requests flowing. - return Cache::tags([ - 'ApiKeyMacro', - 'ApiKeyMacro:Key:' . $parts[0], - ])->remember('ApiKeyMacro.' . $parts[0], Carbon::now()->addMinutes(15), function () use ($parts) { - return ApiKey::where('public', $parts[0])->first(); - }); - } - - return false; - }); - - Request::macro('apiKeyHasPermission', function ($permission) { - $key = Request::apiKey(); - if (! $key) { - return false; - } - - return Request::user()->can($permission, $key); - }); } } diff --git a/app/Transformers/Api/Application/PackTransformer.php b/app/Transformers/Api/Application/PackTransformer.php index 973002ae8..e77bdd459 100644 --- a/app/Transformers/Api/Application/PackTransformer.php +++ b/app/Transformers/Api/Application/PackTransformer.php @@ -1,90 +1,40 @@ . - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ -namespace Pterodactyl\Transformers\Admin; +namespace Pterodactyl\Transformers\Api\Application; -use Illuminate\Http\Request; use Pterodactyl\Models\Pack; -use League\Fractal\TransformerAbstract; -class PackTransformer extends TransformerAbstract +class PackTransformer extends BaseTransformer { /** - * List of resources that can be included. + * Return the resource name for the JSONAPI output. * - * @var array + * @return string */ - protected $availableIncludes = [ - 'option', - 'servers', - ]; - - /** - * The Illuminate Request object if provided. - * - * @var \Illuminate\Http\Request|bool - */ - protected $request; - - /** - * Setup request object for transformer. - * - * @param \Illuminate\Http\Request|bool $request - */ - public function __construct($request = false) + public function getResourceName(): string { - if (! $request instanceof Request && $request !== false) { - throw new DisplayException('Request passed to constructor must be of type Request or false.'); - } - - $this->request = $request; + return Pack::RESOURCE_NAME; } /** - * Return a generic transformed pack array. + * Return a transformed User model that can be consumed by external services. * + * @param \Pterodactyl\Models\Pack $pack * @return array */ - public function transform($pack) + public function transform(Pack $pack): array { - if (! $pack instanceof Pack) { - return ['id' => null]; - } - - return $pack->toArray(); - } - - /** - * Return the packs associated with this service. - * - * @return \Leauge\Fractal\Resource\Item - */ - public function includeOption(Pack $pack) - { - if ($this->request && ! $this->request->apiKeyHasPermission('option-view')) { - return; - } - - return $this->item($pack->option, new OptionTransformer($this->request), 'option'); - } - - /** - * Return the packs associated with this service. - * - * @return \Leauge\Fractal\Resource\Collection - */ - public function includeServers(Pack $pack) - { - if ($this->request && ! $this->request->apiKeyHasPermission('server-list')) { - return; - } - - return $this->collection($pack->servers, new ServerTransformer($this->request), 'server'); + return [ + 'id' => $pack->id, + 'uuid' => $pack->uuid, + 'egg' => $pack->egg_id, + 'name' => $pack->name, + 'description' => $pack->description, + 'is_selectable' => (bool) $pack->selectable, + 'is_visible' => (bool) $pack->visible, + 'is_locked' => (bool) $pack->locked, + 'created_at' => $this->formatTimestamp($pack->created_at), + 'updated_at' => $this->formatTimestamp($pack->updated_at), + ]; } } diff --git a/app/Transformers/Api/Application/ServerTransformer.php b/app/Transformers/Api/Application/ServerTransformer.php index 31eed90c5..6a003b4dc 100644 --- a/app/Transformers/Api/Application/ServerTransformer.php +++ b/app/Transformers/Api/Application/ServerTransformer.php @@ -116,6 +116,8 @@ class ServerTransformer extends BaseTransformer * * @param \Pterodactyl\Models\Server $server * @return \League\Fractal\Resource\Collection|\League\Fractal\Resource\NullResource + * + * @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeSubusers(Server $server) { @@ -133,6 +135,8 @@ class ServerTransformer extends BaseTransformer * * @param \Pterodactyl\Models\Server $server * @return \League\Fractal\Resource\Item|\League\Fractal\Resource\NullResource + * + * @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeUser(Server $server) { @@ -150,40 +154,49 @@ class ServerTransformer extends BaseTransformer * * @param \Pterodactyl\Models\Server $server * @return \League\Fractal\Resource\Item|\League\Fractal\Resource\NullResource + * + * @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException */ -// public function includePack(Server $server) -// { -// if (! $this->authorize(AdminAcl::RESOURCE_PACKS)) { -// return $this->null(); -// } -// -// $server->loadMissing('pack'); -// -// return $this->item($server->getRelation('pack'), $this->makeTransformer(PackTransformer::class), 'pack'); -// } + public function includePack(Server $server) + { + if (! $this->authorize(AdminAcl::RESOURCE_PACKS)) { + return $this->null(); + } + + $server->loadMissing('pack'); + if (is_null($server->getRelation('pack'))) { + return $this->null(); + } + + return $this->item($server->getRelation('pack'), $this->makeTransformer(PackTransformer::class), 'pack'); + } /** * Return a generic array with nest information for this server. * * @param \Pterodactyl\Models\Server $server * @return \League\Fractal\Resource\Item|\League\Fractal\Resource\NullResource + * + * @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException */ -// public function includeNest(Server $server) -// { -// if (! $this->authorize(AdminAcl::RESOURCE_NESTS)) { -// return $this->null(); -// } -// -// $server->loadMissing('nest'); -// -// return $this->item($server->getRelation('nest'), $this->makeTransformer(NestTransformer::class), 'nest'); -// } + public function includeNest(Server $server) + { + if (! $this->authorize(AdminAcl::RESOURCE_NESTS)) { + return $this->null(); + } + + $server->loadMissing('nest'); + + return $this->item($server->getRelation('nest'), $this->makeTransformer(NestTransformer::class), 'nest'); + } /** * Return a generic array with service option information for this server. * * @param \Pterodactyl\Models\Server $server * @return \League\Fractal\Resource\Item|\League\Fractal\Resource\NullResource + * + * @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeOption(Server $server) { @@ -201,6 +214,8 @@ class ServerTransformer extends BaseTransformer * * @param \Pterodactyl\Models\Server $server * @return \League\Fractal\Resource\Collection|\League\Fractal\Resource\NullResource + * + * @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeVariables(Server $server) { @@ -218,6 +233,8 @@ class ServerTransformer extends BaseTransformer * * @param \Pterodactyl\Models\Server $server * @return \League\Fractal\Resource\Item|\League\Fractal\Resource\NullResource + * + * @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeLocation(Server $server) { @@ -235,6 +252,8 @@ class ServerTransformer extends BaseTransformer * * @param \Pterodactyl\Models\Server $server * @return \League\Fractal\Resource\Item|\League\Fractal\Resource\NullResource + * + * @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeNode(Server $server) { diff --git a/app/Transformers/Api/Application/SubuserTransformer.php b/app/Transformers/Api/Application/SubuserTransformer.php deleted file mode 100644 index 93ed25d52..000000000 --- a/app/Transformers/Api/Application/SubuserTransformer.php +++ /dev/null @@ -1,60 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Transformers\Admin; - -use Illuminate\Http\Request; -use Pterodactyl\Models\Subuser; -use League\Fractal\TransformerAbstract; - -class SubuserTransformer extends TransformerAbstract -{ - /** - * The Illuminate Request object if provided. - * - * @var \Illuminate\Http\Request|bool - */ - protected $request; - - /** - * Setup request object for transformer. - * - * @param \Illuminate\Http\Request|bool $request - */ - public function __construct($request = false) - { - if (! $request instanceof Request && $request !== false) { - throw new DisplayException('Request passed to constructor must be of type Request or false.'); - } - - $this->request = $request; - } - - /** - * Return a generic transformed subuser array. - * - * @return array - */ - public function transform(Subuser $subuser) - { - if ($this->request && ! $this->request->apiKeyHasPermission('server-view')) { - return; - } - - return [ - 'id' => $subuser->id, - 'username' => $subuser->user->username, - 'email' => $subuser->user->email, - '2fa' => (bool) $subuser->user->use_totp, - 'permissions' => $subuser->permissions->pluck('permission'), - 'created_at' => $subuser->created_at, - 'updated_at' => $subuser->updated_at, - ]; - } -}