Skip to content

Commit fcdb7cd

Browse files
authored
Merge branch 'develop' into feature/cross-env
2 parents 7d441f5 + 8d52e2e commit fcdb7cd

File tree

26 files changed

+667
-45
lines changed

26 files changed

+667
-45
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<?php
2+
3+
namespace Pterodactyl\Http\Controllers\Api\Client;
4+
5+
use Pterodactyl\Models\ApiKey;
6+
use Illuminate\Http\JsonResponse;
7+
use Pterodactyl\Exceptions\DisplayException;
8+
use Illuminate\Contracts\Encryption\Encrypter;
9+
use Pterodactyl\Services\Api\KeyCreationService;
10+
use Pterodactyl\Repositories\Eloquent\ApiKeyRepository;
11+
use Pterodactyl\Http\Requests\Api\Client\ClientApiRequest;
12+
use Pterodactyl\Transformers\Api\Client\ApiKeyTransformer;
13+
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
14+
use Pterodactyl\Http\Requests\Api\Client\Account\StoreApiKeyRequest;
15+
16+
class ApiKeyController extends ClientApiController
17+
{
18+
/**
19+
* @var \Pterodactyl\Services\Api\KeyCreationService
20+
*/
21+
private $keyCreationService;
22+
23+
/**
24+
* @var \Illuminate\Contracts\Encryption\Encrypter
25+
*/
26+
private $encrypter;
27+
28+
/**
29+
* @var \Pterodactyl\Repositories\Eloquent\ApiKeyRepository
30+
*/
31+
private $repository;
32+
33+
/**
34+
* ApiKeyController constructor.
35+
*
36+
* @param \Illuminate\Contracts\Encryption\Encrypter $encrypter
37+
* @param \Pterodactyl\Services\Api\KeyCreationService $keyCreationService
38+
* @param \Pterodactyl\Repositories\Eloquent\ApiKeyRepository $repository
39+
*/
40+
public function __construct(
41+
Encrypter $encrypter,
42+
KeyCreationService $keyCreationService,
43+
ApiKeyRepository $repository
44+
) {
45+
parent::__construct();
46+
47+
$this->encrypter = $encrypter;
48+
$this->keyCreationService = $keyCreationService;
49+
$this->repository = $repository;
50+
}
51+
52+
/**
53+
* Returns all of the API keys that exist for the given client.
54+
*
55+
* @param \Pterodactyl\Http\Requests\Api\Client\ClientApiRequest $request
56+
* @return array
57+
*/
58+
public function index(ClientApiRequest $request)
59+
{
60+
return $this->fractal->collection($request->user()->apiKeys)
61+
->transformWith($this->getTransformer(ApiKeyTransformer::class))
62+
->toArray();
63+
}
64+
65+
/**
66+
* Store a new API key for a user's account.
67+
*
68+
* @param \Pterodactyl\Http\Requests\Api\Client\Account\StoreApiKeyRequest $request
69+
* @return array
70+
*
71+
* @throws \Pterodactyl\Exceptions\DisplayException
72+
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
73+
*/
74+
public function store(StoreApiKeyRequest $request)
75+
{
76+
if ($request->user()->apiKeys->count() >= 5) {
77+
throw new DisplayException(
78+
'You have reached the account limit for number of API keys.'
79+
);
80+
}
81+
82+
$key = $this->keyCreationService->setKeyType(ApiKey::TYPE_ACCOUNT)->handle([
83+
'user_id' => $request->user()->id,
84+
'memo' => $request->input('description'),
85+
'allowed_ips' => $request->input('allowed_ips') ?? [],
86+
]);
87+
88+
return $this->fractal->item($key)
89+
->transformWith($this->getTransformer(ApiKeyTransformer::class))
90+
->addMeta([
91+
'secret_token' => $this->encrypter->decrypt($key->token),
92+
])
93+
->toArray();
94+
}
95+
96+
/**
97+
* Deletes a given API key.
98+
*
99+
* @param \Pterodactyl\Http\Requests\Api\Client\ClientApiRequest $request
100+
* @param string $identifier
101+
* @return \Illuminate\Http\JsonResponse
102+
*/
103+
public function delete(ClientApiRequest $request, string $identifier)
104+
{
105+
$response = $this->repository->deleteWhere([
106+
'user_id' => $request->user()->id,
107+
'identifier' => $identifier,
108+
]);
109+
110+
if (! $response) {
111+
throw new NotFoundHttpException;
112+
}
113+
114+
return JsonResponse::create([], JsonResponse::HTTP_NO_CONTENT);
115+
}
116+
}

app/Http/Controllers/Api/Client/Servers/ServerController.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,31 @@
33
namespace Pterodactyl\Http\Controllers\Api\Client\Servers;
44

55
use Pterodactyl\Models\Server;
6+
use Pterodactyl\Repositories\Eloquent\SubuserRepository;
67
use Pterodactyl\Transformers\Api\Client\ServerTransformer;
8+
use Pterodactyl\Exceptions\Repository\RecordNotFoundException;
79
use Pterodactyl\Http\Controllers\Api\Client\ClientApiController;
810
use Pterodactyl\Http\Requests\Api\Client\Servers\GetServerRequest;
911

1012
class ServerController extends ClientApiController
1113
{
14+
/**
15+
* @var \Pterodactyl\Repositories\Eloquent\SubuserRepository
16+
*/
17+
private $repository;
18+
19+
/**
20+
* ServerController constructor.
21+
*
22+
* @param \Pterodactyl\Repositories\Eloquent\SubuserRepository $repository
23+
*/
24+
public function __construct(SubuserRepository $repository)
25+
{
26+
parent::__construct();
27+
28+
$this->repository = $repository;
29+
}
30+
1231
/**
1332
* Transform an individual server into a response that can be consumed by a
1433
* client using the API.
@@ -19,8 +38,21 @@ class ServerController extends ClientApiController
1938
*/
2039
public function index(GetServerRequest $request, Server $server): array
2140
{
41+
try {
42+
$permissions = $this->repository->findFirstWhere([
43+
'server_id' => $server->id,
44+
'user_id' => $request->user()->id,
45+
])->permissions;
46+
} catch (RecordNotFoundException $exception) {
47+
$permissions = [];
48+
}
49+
2250
return $this->fractal->item($server)
2351
->transformWith($this->getTransformer(ServerTransformer::class))
52+
->addMeta([
53+
'is_server_owner' => $request->user()->id === $server->owner_id,
54+
'user_permissions' => $permissions,
55+
])
2456
->toArray();
2557
}
2658
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Pterodactyl\Http\Requests\Api\Client\Account;
4+
5+
use Pterodactyl\Http\Requests\Api\Client\ClientApiRequest;
6+
7+
class StoreApiKeyRequest extends ClientApiRequest
8+
{
9+
/**
10+
* @return array
11+
*/
12+
public function rules(): array
13+
{
14+
return [
15+
'description' => 'required|string|min:4',
16+
'allowed_ips' => 'array',
17+
'allowed_ips.*' => 'ip',
18+
];
19+
}
20+
}

app/Models/ApiKey.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,22 @@
44

55
use Pterodactyl\Services\Acl\Api\AdminAcl;
66

7+
/**
8+
* @property int $id
9+
* @property int $user_id
10+
* @property int $key_type
11+
* @property string $identifier
12+
* @property string $token
13+
* @property array $allowed_ips
14+
* @property string $memo
15+
* @property \Carbon\Carbon|null $last_used_at
16+
* @property \Carbon\Carbon $created_at
17+
* @property \Carbon\Carbon $updated_at
18+
*/
719
class ApiKey extends Validable
820
{
21+
const RESOURCE_NAME = 'api_key';
22+
923
/**
1024
* Different API keys that can exist on the system.
1125
*/

app/Models/Permission.php

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -286,28 +286,4 @@ public static function getPermissions($array = false)
286286

287287
return collect(self::$deprecatedPermissions);
288288
}
289-
290-
/**
291-
* Find permission by permission node.
292-
*
293-
* @param \Illuminate\Database\Query\Builder $query
294-
* @param string $permission
295-
* @return \Illuminate\Database\Query\Builder
296-
*/
297-
public function scopePermission($query, $permission)
298-
{
299-
return $query->where('permission', $permission);
300-
}
301-
302-
/**
303-
* Filter permission by server.
304-
*
305-
* @param \Illuminate\Database\Query\Builder $query
306-
* @param \Pterodactyl\Models\Server $server
307-
* @return \Illuminate\Database\Query\Builder
308-
*/
309-
public function scopeServer($query, Server $server)
310-
{
311-
return $query->where('server_id', $server->id);
312-
}
313289
}

app/Models/Subuser.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
* @property int $id
99
* @property int $user_id
1010
* @property int $server_id
11+
* @property array $permissions
1112
* @property \Carbon\Carbon $created_at
1213
* @property \Carbon\Carbon $updated_at
1314
*
1415
* @property \Pterodactyl\Models\User $user
1516
* @property \Pterodactyl\Models\Server $server
16-
* @property \Pterodactyl\Models\Permission[]|\Illuminate\Database\Eloquent\Collection $permissions
1717
*/
1818
class Subuser extends Validable
1919
{
@@ -45,8 +45,9 @@ class Subuser extends Validable
4545
* @var array
4646
*/
4747
protected $casts = [
48-
'user_id' => 'integer',
49-
'server_id' => 'integer',
48+
'user_id' => 'int',
49+
'server_id' => 'int',
50+
'permissions' => 'array',
5051
];
5152

5253
/**
@@ -55,6 +56,8 @@ class Subuser extends Validable
5556
public static $validationRules = [
5657
'user_id' => 'required|numeric|exists:users,id',
5758
'server_id' => 'required|numeric|exists:servers,id',
59+
'permissions' => 'nullable|array',
60+
'permissions.*' => 'string',
5861
];
5962

6063
/**

app/Models/User.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
* @property \Carbon\Carbon $updated_at
3737
*
3838
* @property string $name
39+
* @property \Pterodactyl\Models\ApiKey[]|\Illuminate\Database\Eloquent\Collection $apiKeys
3940
* @property \Pterodactyl\Models\Permission[]|\Illuminate\Database\Eloquent\Collection $permissions
4041
* @property \Pterodactyl\Models\Server[]|\Illuminate\Database\Eloquent\Collection $servers
4142
* @property \Pterodactyl\Models\Subuser[]|\Illuminate\Database\Eloquent\Collection $subuserOf
@@ -258,4 +259,13 @@ public function keys()
258259
{
259260
return $this->hasMany(DaemonKey::class);
260261
}
262+
263+
/**
264+
* @return \Illuminate\Database\Eloquent\Relations\HasMany
265+
*/
266+
public function apiKeys()
267+
{
268+
return $this->hasMany(ApiKey::class)
269+
->where('key_type', ApiKey::TYPE_ACCOUNT);
270+
}
261271
}

app/Providers/RepositoryServiceProvider.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
use Pterodactyl\Repositories\Wings\DaemonPowerRepository;
2222
use Pterodactyl\Repositories\Eloquent\DaemonKeyRepository;
2323
use Pterodactyl\Repositories\Eloquent\AllocationRepository;
24-
use Pterodactyl\Repositories\Eloquent\PermissionRepository;
2524
use Pterodactyl\Repositories\Wings\DaemonCommandRepository;
2625
use Pterodactyl\Contracts\Repository\EggRepositoryInterface;
2726
use Pterodactyl\Repositories\Eloquent\EggVariableRepository;
@@ -43,7 +42,6 @@
4342
use Pterodactyl\Repositories\Wings\DaemonConfigurationRepository;
4443
use Pterodactyl\Contracts\Repository\DaemonKeyRepositoryInterface;
4544
use Pterodactyl\Contracts\Repository\AllocationRepositoryInterface;
46-
use Pterodactyl\Contracts\Repository\PermissionRepositoryInterface;
4745
use Pterodactyl\Contracts\Repository\Daemon\FileRepositoryInterface;
4846
use Pterodactyl\Contracts\Repository\EggVariableRepositoryInterface;
4947
use Pterodactyl\Contracts\Repository\Daemon\PowerRepositoryInterface;
@@ -73,7 +71,6 @@ public function register()
7371
$this->app->bind(NestRepositoryInterface::class, NestRepository::class);
7472
$this->app->bind(NodeRepositoryInterface::class, NodeRepository::class);
7573
$this->app->bind(PackRepositoryInterface::class, PackRepository::class);
76-
$this->app->bind(PermissionRepositoryInterface::class, PermissionRepository::class);
7774
$this->app->bind(ScheduleRepositoryInterface::class, ScheduleRepository::class);
7875
$this->app->bind(ServerRepositoryInterface::class, ServerRepository::class);
7976
$this->app->bind(ServerVariableRepositoryInterface::class, ServerVariableRepository::class);

app/Repositories/Eloquent/PermissionRepository.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Pterodactyl\Repositories\Eloquent;
44

5-
use Pterodactyl\Models\Permission;
5+
use Exception;
66
use Pterodactyl\Contracts\Repository\PermissionRepositoryInterface;
77

88
class PermissionRepository extends EloquentRepository implements PermissionRepositoryInterface
@@ -11,9 +11,10 @@ class PermissionRepository extends EloquentRepository implements PermissionRepos
1111
* Return the model backing this repository.
1212
*
1313
* @return string
14+
* @throws \Exception
1415
*/
1516
public function model()
1617
{
17-
return Permission::class;
18+
throw new Exception('This functionality is not implemented.');
1819
}
1920
}

app/Services/Api/KeyCreationService.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,6 @@ public function handle(array $data, array $permissions = []): ApiKey
7272
$data = array_merge($data, $permissions);
7373
}
7474

75-
$instance = $this->repository->create($data, true, true);
76-
77-
return $instance;
75+
return $this->repository->create($data, true, true);
7876
}
7977
}

0 commit comments

Comments
 (0)