diff --git a/app/Http/Controllers/Admin/ApiController.php b/app/Http/Controllers/Admin/ApiController.php deleted file mode 100644 index 155b20cd7..000000000 --- a/app/Http/Controllers/Admin/ApiController.php +++ /dev/null @@ -1,118 +0,0 @@ -alert = $alert; - $this->keyCreationService = $keyCreationService; - $this->repository = $repository; - } - - /** - * Render view showing all of a user's application API keys. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\View\View - */ - public function index(Request $request): View - { - return view('admin.api.index', [ - 'keys' => $this->repository->getApplicationKeys($request->user()), - ]); - } - - /** - * Render view allowing an admin to create a new application API key. - * - * @return \Illuminate\View\View - * @throws \ReflectionException - */ - public function create(): View - { - $resources = AdminAcl::getResourceList(); - sort($resources); - - return view('admin.api.new', [ - 'resources' => $resources, - 'permissions' => [ - 'r' => AdminAcl::READ, - 'rw' => AdminAcl::READ | AdminAcl::WRITE, - 'n' => AdminAcl::NONE, - ], - ]); - } - - /** - * Store the new key and redirect the user back to the application key listing. - * - * @param \Pterodactyl\Http\Requests\Admin\Api\StoreApplicationApiKeyRequest $request - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - */ - public function store(StoreApplicationApiKeyRequest $request): RedirectResponse - { - $this->keyCreationService->setKeyType(ApiKey::TYPE_APPLICATION)->handle([ - 'memo' => $request->input('memo'), - 'user_id' => $request->user()->id, - ], $request->getKeyPermissions()); - - $this->alert->success('A new application API key has been generated for your account.')->flash(); - - return redirect()->route('admin.api.index'); - } - - /** - * Delete an application API key from the database. - * - * @param \Illuminate\Http\Request $request - * @param string $identifier - * @return \Illuminate\Http\Response - */ - public function delete(Request $request, string $identifier): Response - { - $this->repository->deleteApplicationKey($request->user(), $identifier); - - return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); - } -} diff --git a/app/Http/Controllers/Admin/DatabaseController.php b/app/Http/Controllers/Admin/DatabaseController.php deleted file mode 100644 index 0aee86806..000000000 --- a/app/Http/Controllers/Admin/DatabaseController.php +++ /dev/null @@ -1,193 +0,0 @@ -alert = $alert; - $this->creationService = $creationService; - $this->databaseRepository = $databaseRepository; - $this->deletionService = $deletionService; - $this->repository = $repository; - $this->locationRepository = $locationRepository; - $this->updateService = $updateService; - } - - /** - * Display database host index. - * - * @return \Illuminate\View\View - */ - public function index(): View - { - return view('admin.databases.index', [ - 'locations' => $this->locationRepository->getAllWithNodes(), - 'hosts' => $this->repository->getWithViewDetails(), - ]); - } - - /** - * Display database host to user. - * - * @param int $host - * @return \Illuminate\View\View - * - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function view(int $host): View - { - return view('admin.databases.view', [ - 'locations' => $this->locationRepository->getAllWithNodes(), - 'host' => $this->repository->find($host), - 'databases' => $this->databaseRepository->getDatabasesForHost($host), - ]); - } - - /** - * Handle request to create a new database host. - * - * @param \Pterodactyl\Http\Requests\Admin\DatabaseHostFormRequest $request - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Throwable - */ - public function create(DatabaseHostFormRequest $request): RedirectResponse - { - try { - $host = $this->creationService->handle($request->normalize()); - } catch (Exception $exception) { - if ($exception instanceof PDOException || $exception->getPrevious() instanceof PDOException) { - $this->alert->danger( - sprintf('There was an error while trying to connect to the host or while executing a query: "%s"', $exception->getMessage()) - )->flash(); - - return redirect()->route('admin.databases')->withInput($request->validated()); - } else { - throw $exception; - } - } - - $this->alert->success('Successfully created a new database host on the system.')->flash(); - - return redirect()->route('admin.databases.view', $host->id); - } - - /** - * Handle updating database host. - * - * @param \Pterodactyl\Http\Requests\Admin\DatabaseHostFormRequest $request - * @param \Pterodactyl\Models\DatabaseHost $host - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Throwable - */ - public function update(DatabaseHostFormRequest $request, DatabaseHost $host): RedirectResponse - { - $redirect = redirect()->route('admin.databases.view', $host->id); - - try { - $this->updateService->handle($host->id, $request->normalize()); - $this->alert->success('Database host was updated successfully.')->flash(); - } catch (Exception $exception) { - // Catch any SQL related exceptions and display them back to the user, otherwise just - // throw the exception like normal and move on with it. - if ($exception instanceof PDOException || $exception->getPrevious() instanceof PDOException) { - $this->alert->danger( - sprintf('There was an error while trying to connect to the host or while executing a query: "%s"', $exception->getMessage()) - )->flash(); - - return $redirect->withInput($request->normalize()); - } else { - throw $exception; - } - } - - return $redirect; - } - - /** - * Handle request to delete a database host. - * - * @param int $host - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Service\HasActiveServersException - */ - public function delete(int $host): RedirectResponse - { - $this->deletionService->handle($host); - $this->alert->success('The requested database host has been deleted from the system.')->flash(); - - return redirect()->route('admin.databases'); - } -} diff --git a/app/Http/Controllers/Admin/LocationController.php b/app/Http/Controllers/Admin/LocationController.php deleted file mode 100644 index 286d15cf9..000000000 --- a/app/Http/Controllers/Admin/LocationController.php +++ /dev/null @@ -1,157 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Controllers\Admin; - -use Pterodactyl\Models\Location; -use Prologue\Alerts\AlertsMessageBag; -use Pterodactyl\Exceptions\DisplayException; -use Pterodactyl\Http\Controllers\Controller; -use Pterodactyl\Http\Requests\Admin\LocationFormRequest; -use Pterodactyl\Services\Locations\LocationUpdateService; -use Pterodactyl\Services\Locations\LocationCreationService; -use Pterodactyl\Services\Locations\LocationDeletionService; -use Pterodactyl\Contracts\Repository\LocationRepositoryInterface; - -class LocationController extends Controller -{ - /** - * @var \Prologue\Alerts\AlertsMessageBag - */ - protected $alert; - - /** - * @var \Pterodactyl\Services\Locations\LocationCreationService - */ - protected $creationService; - - /** - * @var \Pterodactyl\Services\Locations\LocationDeletionService - */ - protected $deletionService; - - /** - * @var \Pterodactyl\Contracts\Repository\LocationRepositoryInterface - */ - protected $repository; - - /** - * @var \Pterodactyl\Services\Locations\LocationUpdateService - */ - protected $updateService; - - /** - * LocationController constructor. - * - * @param \Prologue\Alerts\AlertsMessageBag $alert - * @param \Pterodactyl\Services\Locations\LocationCreationService $creationService - * @param \Pterodactyl\Services\Locations\LocationDeletionService $deletionService - * @param \Pterodactyl\Contracts\Repository\LocationRepositoryInterface $repository - * @param \Pterodactyl\Services\Locations\LocationUpdateService $updateService - */ - public function __construct( - AlertsMessageBag $alert, - LocationCreationService $creationService, - LocationDeletionService $deletionService, - LocationRepositoryInterface $repository, - LocationUpdateService $updateService - ) { - $this->alert = $alert; - $this->creationService = $creationService; - $this->deletionService = $deletionService; - $this->repository = $repository; - $this->updateService = $updateService; - } - - /** - * Return the location overview page. - * - * @return \Illuminate\View\View - */ - public function index() - { - return view('admin.locations.index', [ - 'locations' => $this->repository->getAllWithDetails(), - ]); - } - - /** - * Return the location view page. - * - * @param int $id - * @return \Illuminate\View\View - * - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function view($id) - { - return view('admin.locations.view', [ - 'location' => $this->repository->getWithNodes($id), - ]); - } - - /** - * Handle request to create new location. - * - * @param \Pterodactyl\Http\Requests\Admin\LocationFormRequest $request - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Throwable - */ - public function create(LocationFormRequest $request) - { - $location = $this->creationService->handle($request->normalize()); - $this->alert->success('Location was created successfully.')->flash(); - - return redirect()->route('admin.locations.view', $location->id); - } - - /** - * Handle request to update or delete location. - * - * @param \Pterodactyl\Http\Requests\Admin\LocationFormRequest $request - * @param \Pterodactyl\Models\Location $location - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Throwable - */ - public function update(LocationFormRequest $request, Location $location) - { - if ($request->input('action') === 'delete') { - return $this->delete($location); - } - - $this->updateService->handle($location->id, $request->normalize()); - $this->alert->success('Location was updated successfully.')->flash(); - - return redirect()->route('admin.locations.view', $location->id); - } - - /** - * Delete a location from the system. - * - * @param \Pterodactyl\Models\Location $location - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Exception - * @throws \Pterodactyl\Exceptions\DisplayException - */ - public function delete(Location $location) - { - try { - $this->deletionService->handle($location->id); - - return redirect()->route('admin.locations'); - } catch (DisplayException $ex) { - $this->alert->danger($ex->getMessage())->flash(); - } - - return redirect()->route('admin.locations.view', $location->id); - } -} diff --git a/app/Http/Controllers/Admin/MountController.php b/app/Http/Controllers/Admin/MountController.php deleted file mode 100644 index 5ff73e153..000000000 --- a/app/Http/Controllers/Admin/MountController.php +++ /dev/null @@ -1,224 +0,0 @@ -alert = $alert; - $this->nestRepository = $nestRepository; - $this->locationRepository = $locationRepository; - $this->repository = $repository; - } - - /** - * Return the mount overview page. - * - * @return \Illuminate\View\View - */ - public function index() - { - return view('admin.mounts.index', [ - 'mounts' => $this->repository->getAllWithDetails(), - ]); - } - - /** - * Return the mount view page. - * - * @param string $id - * @return \Illuminate\View\View - * - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function view($id) - { - $nests = Nest::query()->with('eggs')->get(); - $locations = Location::query()->with('nodes')->get(); - - return view('admin.mounts.view', [ - 'mount' => $this->repository->getWithRelations($id), - 'nests' => $nests, - 'locations' => $locations, - ]); - } - - /** - * Handle request to create new mount. - * - * @param \Pterodactyl\Http\Requests\Admin\MountFormRequest $request - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Throwable - */ - public function create(MountFormRequest $request) - { - $model = (new Mount())->fill($request->validated()); - $model->forceFill(['uuid' => Uuid::uuid4()->toString()]); - - $model->saveOrFail(); - $mount = $model->fresh(); - - $this->alert->success('Mount was created successfully.')->flash(); - - return redirect()->route('admin.mounts.view', $mount->id); - } - - /** - * Handle request to update or delete location. - * - * @param \Pterodactyl\Http\Requests\Admin\MountFormRequest $request - * @param \Pterodactyl\Models\Mount $mount - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Throwable - */ - public function update(MountFormRequest $request, Mount $mount) - { - if ($request->input('action') === 'delete') { - return $this->delete($mount); - } - - $mount->forceFill($request->validated())->save(); - - $this->alert->success('Mount was updated successfully.')->flash(); - - return redirect()->route('admin.mounts.view', $mount->id); - } - - /** - * Delete a location from the system. - * - * @param \Pterodactyl\Models\Mount $mount - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Exception - */ - public function delete(Mount $mount) - { - $mount->delete(); - - return redirect()->route('admin.mounts'); - } - - /** - * Adds eggs to the mount's many to many relation. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Mount $mount - * @return \Illuminate\Http\RedirectResponse - */ - public function addEggs(Request $request, Mount $mount) - { - $validatedData = $request->validate([ - 'eggs' => 'required|exists:eggs,id', - ]); - - $eggs = $validatedData['eggs'] ?? []; - if (count($eggs) > 0) { - $mount->eggs()->attach($eggs); - } - - $this->alert->success('Mount was updated successfully.')->flash(); - - return redirect()->route('admin.mounts.view', $mount->id); - } - - /** - * Adds nodes to the mount's many to many relation. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Mount $mount - * @return \Illuminate\Http\RedirectResponse - */ - public function addNodes(Request $request, Mount $mount) - { - $data = $request->validate(['nodes' => 'required|exists:nodes,id']); - - $nodes = $data['nodes'] ?? []; - if (count($nodes) > 0) { - $mount->nodes()->attach($nodes); - } - - $this->alert->success('Mount was updated successfully.')->flash(); - - return redirect()->route('admin.mounts.view', $mount->id); - } - - /** - * Deletes an egg from the mount's many to many relation. - * - * @param \Pterodactyl\Models\Mount $mount - * @param int $egg_id - * @return \Illuminate\Http\Response - */ - public function deleteEgg(Mount $mount, int $egg_id) - { - $mount->eggs()->detach($egg_id); - - return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); - } - - /** - * Deletes an node from the mount's many to many relation. - * - * @param \Pterodactyl\Models\Mount $mount - * @param int $node_id - * @return \Illuminate\Http\Response - */ - public function deleteNode(Mount $mount, int $node_id) - { - $mount->nodes()->detach($node_id); - - return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); - } -} diff --git a/app/Http/Controllers/Admin/Nests/EggController.php b/app/Http/Controllers/Admin/Nests/EggController.php deleted file mode 100644 index 4e3dd5e94..000000000 --- a/app/Http/Controllers/Admin/Nests/EggController.php +++ /dev/null @@ -1,147 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Controllers\Admin\Nests; - -use Javascript; -use Illuminate\View\View; -use Pterodactyl\Models\Egg; -use Illuminate\Http\RedirectResponse; -use Prologue\Alerts\AlertsMessageBag; -use Pterodactyl\Http\Controllers\Controller; -use Pterodactyl\Services\Eggs\EggUpdateService; -use Pterodactyl\Services\Eggs\EggCreationService; -use Pterodactyl\Services\Eggs\EggDeletionService; -use Pterodactyl\Http\Requests\Admin\Egg\EggFormRequest; -use Pterodactyl\Contracts\Repository\EggRepositoryInterface; -use Pterodactyl\Contracts\Repository\NestRepositoryInterface; - -class EggController extends Controller -{ - protected $alert; - - protected $creationService; - - protected $deletionService; - - protected $nestRepository; - - protected $repository; - - protected $updateService; - - public function __construct( - AlertsMessageBag $alert, - EggCreationService $creationService, - EggDeletionService $deletionService, - EggRepositoryInterface $repository, - EggUpdateService $updateService, - NestRepositoryInterface $nestRepository - ) { - $this->alert = $alert; - $this->creationService = $creationService; - $this->deletionService = $deletionService; - $this->nestRepository = $nestRepository; - $this->repository = $repository; - $this->updateService = $updateService; - } - - /** - * Handle a request to display the Egg creation page. - * - * @return \Illuminate\View\View - * - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function create(): View - { - $nests = $this->nestRepository->getWithEggs(); - Javascript::put(['nests' => $nests->keyBy('id')]); - - return view('admin.eggs.new', ['nests' => $nests]); - } - - /** - * Handle request to store a new Egg. - * - * @param \Pterodactyl\Http\Requests\Admin\Egg\EggFormRequest $request - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Service\Egg\NoParentConfigurationFoundException - */ - public function store(EggFormRequest $request): RedirectResponse - { - $data = $request->normalize(); - if (!empty($data['docker_images']) && !is_array($data['docker_images'])) { - $data['docker_images'] = array_map(function ($value) { - return trim($value); - }, explode("\n", $data['docker_images'])); - } - - $egg = $this->creationService->handle($data); - $this->alert->success(trans('admin/nests.eggs.notices.egg_created'))->flash(); - - return redirect()->route('admin.nests.egg.view', $egg->id); - } - - /** - * Handle request to view a single Egg. - * - * @param \Pterodactyl\Models\Egg $egg - * @return \Illuminate\View\View - */ - public function view(Egg $egg): View - { - return view('admin.eggs.view', ['egg' => $egg]); - } - - /** - * Handle request to update an Egg. - * - * @param \Pterodactyl\Http\Requests\Admin\Egg\EggFormRequest $request - * @param \Pterodactyl\Models\Egg $egg - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - * @throws \Pterodactyl\Exceptions\Service\Egg\NoParentConfigurationFoundException - */ - public function update(EggFormRequest $request, Egg $egg): RedirectResponse - { - $data = $request->normalize(); - if (!empty($data['docker_images']) && !is_array($data['docker_images'])) { - $data['docker_images'] = array_map(function ($value) { - return trim($value); - }, explode("\n", $data['docker_images'])); - } - - $this->updateService->handle($egg, $data); - $this->alert->success(trans('admin/nests.eggs.notices.updated'))->flash(); - - return redirect()->route('admin.nests.egg.view', $egg->id); - } - - /** - * Handle request to destroy an egg. - * - * @param \Pterodactyl\Models\Egg $egg - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Service\Egg\HasChildrenException - * @throws \Pterodactyl\Exceptions\Service\HasActiveServersException - */ - public function destroy(Egg $egg): RedirectResponse - { - $this->deletionService->handle($egg->id); - $this->alert->success(trans('admin/nests.eggs.notices.deleted'))->flash(); - - return redirect()->route('admin.nests.view', $egg->nest_id); - } -} diff --git a/app/Http/Controllers/Admin/Nests/EggScriptController.php b/app/Http/Controllers/Admin/Nests/EggScriptController.php deleted file mode 100644 index ea8d4dfa9..000000000 --- a/app/Http/Controllers/Admin/Nests/EggScriptController.php +++ /dev/null @@ -1,92 +0,0 @@ -alert = $alert; - $this->installScriptService = $installScriptService; - $this->repository = $repository; - } - - /** - * Handle requests to render installation script for an Egg. - * - * @param int $egg - * @return \Illuminate\View\View - */ - public function index(int $egg): View - { - $egg = $this->repository->getWithCopyAttributes($egg); - $copy = $this->repository->findWhere([ - ['copy_script_from', '=', null], - ['nest_id', '=', $egg->nest_id], - ['id', '!=', $egg], - ]); - - $rely = $this->repository->findWhere([ - ['copy_script_from', '=', $egg->id], - ]); - - return view('admin.eggs.scripts', [ - 'copyFromOptions' => $copy, - 'relyOnScript' => $rely, - 'egg' => $egg, - ]); - } - - /** - * Handle a request to update the installation script for an Egg. - * - * @param \Pterodactyl\Http\Requests\Admin\Egg\EggScriptFormRequest $request - * @param \Pterodactyl\Models\Egg $egg - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - * @throws \Pterodactyl\Exceptions\Service\Egg\InvalidCopyFromException - */ - public function update(EggScriptFormRequest $request, Egg $egg): RedirectResponse - { - $this->installScriptService->handle($egg, $request->normalize()); - $this->alert->success(trans('admin/nests.eggs.notices.script_updated'))->flash(); - - return redirect()->route('admin.nests.egg.scripts', $egg); - } -} diff --git a/app/Http/Controllers/Admin/Nests/EggShareController.php b/app/Http/Controllers/Admin/Nests/EggShareController.php deleted file mode 100644 index 7845680e4..000000000 --- a/app/Http/Controllers/Admin/Nests/EggShareController.php +++ /dev/null @@ -1,120 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Controllers\Admin\Nests; - -use Pterodactyl\Models\Egg; -use Illuminate\Http\RedirectResponse; -use Prologue\Alerts\AlertsMessageBag; -use Pterodactyl\Http\Controllers\Controller; -use Symfony\Component\HttpFoundation\Response; -use Pterodactyl\Services\Eggs\Sharing\EggExporterService; -use Pterodactyl\Services\Eggs\Sharing\EggImporterService; -use Pterodactyl\Http\Requests\Admin\Egg\EggImportFormRequest; -use Pterodactyl\Services\Eggs\Sharing\EggUpdateImporterService; - -class EggShareController extends Controller -{ - /** - * @var \Prologue\Alerts\AlertsMessageBag - */ - protected $alert; - - /** - * @var \Pterodactyl\Services\Eggs\Sharing\EggExporterService - */ - protected $exporterService; - - /** - * @var \Pterodactyl\Services\Eggs\Sharing\EggImporterService - */ - protected $importerService; - - /** - * @var \Pterodactyl\Services\Eggs\Sharing\EggUpdateImporterService - */ - protected $updateImporterService; - - /** - * OptionShareController constructor. - * - * @param \Prologue\Alerts\AlertsMessageBag $alert - * @param \Pterodactyl\Services\Eggs\Sharing\EggExporterService $exporterService - * @param \Pterodactyl\Services\Eggs\Sharing\EggImporterService $importerService - * @param \Pterodactyl\Services\Eggs\Sharing\EggUpdateImporterService $updateImporterService - */ - public function __construct( - AlertsMessageBag $alert, - EggExporterService $exporterService, - EggImporterService $importerService, - EggUpdateImporterService $updateImporterService - ) { - $this->alert = $alert; - $this->exporterService = $exporterService; - $this->importerService = $importerService; - $this->updateImporterService = $updateImporterService; - } - - /** - * @param \Pterodactyl\Models\Egg $egg - * @return \Symfony\Component\HttpFoundation\Response - * - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function export(Egg $egg): Response - { - $filename = trim(preg_replace('/[^\w]/', '-', kebab_case($egg->name)), '-'); - - return response($this->exporterService->handle($egg->id), 200, [ - 'Content-Transfer-Encoding' => 'binary', - 'Content-Description' => 'File Transfer', - 'Content-Disposition' => 'attachment; filename=egg-' . $filename . '.json', - 'Content-Type' => 'application/json', - ]); - } - - /** - * Import a new service option using an XML file. - * - * @param \Pterodactyl\Http\Requests\Admin\Egg\EggImportFormRequest $request - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - * @throws \Pterodactyl\Exceptions\Service\Egg\BadJsonFormatException - * @throws \Pterodactyl\Exceptions\Service\InvalidFileUploadException - */ - public function import(EggImportFormRequest $request): RedirectResponse - { - $egg = $this->importerService->handle($request->file('import_file'), $request->input('import_to_nest')); - $this->alert->success(trans('admin/nests.eggs.notices.imported'))->flash(); - - return redirect()->route('admin.nests.egg.view', ['egg' => $egg->id]); - } - - /** - * Update an existing Egg using a new imported file. - * - * @param \Pterodactyl\Http\Requests\Admin\Egg\EggImportFormRequest $request - * @param \Pterodactyl\Models\Egg $egg - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - * @throws \Pterodactyl\Exceptions\Service\Egg\BadJsonFormatException - * @throws \Pterodactyl\Exceptions\Service\InvalidFileUploadException - */ - public function update(EggImportFormRequest $request, Egg $egg): RedirectResponse - { - $this->updateImporterService->handle($egg, $request->file('import_file')); - $this->alert->success(trans('admin/nests.eggs.notices.updated_via_import'))->flash(); - - return redirect()->route('admin.nests.egg.view', ['egg' => $egg]); - } -} diff --git a/app/Http/Controllers/Admin/Nests/EggVariableController.php b/app/Http/Controllers/Admin/Nests/EggVariableController.php deleted file mode 100644 index c0677abb5..000000000 --- a/app/Http/Controllers/Admin/Nests/EggVariableController.php +++ /dev/null @@ -1,147 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Controllers\Admin\Nests; - -use Illuminate\View\View; -use Pterodactyl\Models\Egg; -use Pterodactyl\Models\EggVariable; -use Illuminate\Http\RedirectResponse; -use Prologue\Alerts\AlertsMessageBag; -use Pterodactyl\Http\Controllers\Controller; -use Pterodactyl\Contracts\Repository\EggRepositoryInterface; -use Pterodactyl\Services\Eggs\Variables\VariableUpdateService; -use Pterodactyl\Http\Requests\Admin\Egg\EggVariableFormRequest; -use Pterodactyl\Services\Eggs\Variables\VariableCreationService; -use Pterodactyl\Contracts\Repository\EggVariableRepositoryInterface; - -class EggVariableController extends Controller -{ - /** - * @var \Prologue\Alerts\AlertsMessageBag - */ - protected $alert; - - /** - * @var \Pterodactyl\Services\Eggs\Variables\VariableCreationService - */ - protected $creationService; - - /** - * @var \Pterodactyl\Contracts\Repository\EggRepositoryInterface - */ - protected $repository; - - /** - * @var \Pterodactyl\Services\Eggs\Variables\VariableUpdateService - */ - protected $updateService; - - /** - * @var \Pterodactyl\Contracts\Repository\EggVariableRepositoryInterface - */ - protected $variableRepository; - - /** - * EggVariableController constructor. - * - * @param \Prologue\Alerts\AlertsMessageBag $alert - * @param \Pterodactyl\Services\Eggs\Variables\VariableCreationService $creationService - * @param \Pterodactyl\Services\Eggs\Variables\VariableUpdateService $updateService - * @param \Pterodactyl\Contracts\Repository\EggRepositoryInterface $repository - * @param \Pterodactyl\Contracts\Repository\EggVariableRepositoryInterface $variableRepository - */ - public function __construct( - AlertsMessageBag $alert, - VariableCreationService $creationService, - VariableUpdateService $updateService, - EggRepositoryInterface $repository, - EggVariableRepositoryInterface $variableRepository - ) { - $this->alert = $alert; - $this->creationService = $creationService; - $this->repository = $repository; - $this->updateService = $updateService; - $this->variableRepository = $variableRepository; - } - - /** - * Handle request to view the variables attached to an Egg. - * - * @param int $egg - * @return \Illuminate\View\View - * - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function view(int $egg): View - { - $egg = $this->repository->getWithVariables($egg); - - return view('admin.eggs.variables', ['egg' => $egg]); - } - - /** - * Handle a request to create a new Egg variable. - * - * @param \Pterodactyl\Http\Requests\Admin\Egg\EggVariableFormRequest $request - * @param \Pterodactyl\Models\Egg $egg - * - * @return \Illuminate\Http\RedirectResponse - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Service\Egg\Variable\BadValidationRuleException - * @throws \Pterodactyl\Exceptions\Service\Egg\Variable\ReservedVariableNameException - */ - public function store(EggVariableFormRequest $request, Egg $egg): RedirectResponse - { - $this->creationService->handle($egg->id, $request->normalize()); - $this->alert->success(trans('admin/nests.variables.notices.variable_created'))->flash(); - - return redirect()->route('admin.nests.egg.variables', $egg->id); - } - - /** - * Handle a request to update an existing Egg variable. - * - * @param \Pterodactyl\Http\Requests\Admin\Egg\EggVariableFormRequest $request - * @param \Pterodactyl\Models\Egg $egg - * @param \Pterodactyl\Models\EggVariable $variable - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\DisplayException - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - * @throws \Pterodactyl\Exceptions\Service\Egg\Variable\ReservedVariableNameException - */ - public function update(EggVariableFormRequest $request, Egg $egg, EggVariable $variable): RedirectResponse - { - $this->updateService->handle($variable, $request->normalize()); - $this->alert->success(trans('admin/nests.variables.notices.variable_updated', [ - 'variable' => $variable->name, - ]))->flash(); - - return redirect()->route('admin.nests.egg.variables', $egg->id); - } - - /** - * Handle a request to delete an existing Egg variable from the Panel. - * - * @param int $egg - * @param \Pterodactyl\Models\EggVariable $variable - * @return \Illuminate\Http\RedirectResponse - */ - public function destroy(int $egg, EggVariable $variable): RedirectResponse - { - $this->variableRepository->delete($variable->id); - $this->alert->success(trans('admin/nests.variables.notices.variable_deleted', [ - 'variable' => $variable->name, - ]))->flash(); - - return redirect()->route('admin.nests.egg.variables', $egg); - } -} diff --git a/app/Http/Controllers/Admin/Nests/NestController.php b/app/Http/Controllers/Admin/Nests/NestController.php deleted file mode 100644 index 155df2a5c..000000000 --- a/app/Http/Controllers/Admin/Nests/NestController.php +++ /dev/null @@ -1,160 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Controllers\Admin\Nests; - -use Illuminate\View\View; -use Illuminate\Http\RedirectResponse; -use Prologue\Alerts\AlertsMessageBag; -use Pterodactyl\Http\Controllers\Controller; -use Pterodactyl\Services\Nests\NestUpdateService; -use Pterodactyl\Services\Nests\NestCreationService; -use Pterodactyl\Services\Nests\NestDeletionService; -use Pterodactyl\Contracts\Repository\NestRepositoryInterface; -use Pterodactyl\Http\Requests\Admin\Nest\StoreNestFormRequest; - -class NestController extends Controller -{ - /** - * @var \Prologue\Alerts\AlertsMessageBag - */ - protected $alert; - - /** - * @var \Pterodactyl\Services\Nests\NestCreationService - */ - protected $nestCreationService; - - /** - * @var \Pterodactyl\Services\Nests\NestDeletionService - */ - protected $nestDeletionService; - - /** - * @var \Pterodactyl\Contracts\Repository\NestRepositoryInterface - */ - protected $repository; - - /** - * @var \Pterodactyl\Services\Nests\NestUpdateService - */ - protected $nestUpdateService; - - /** - * NestController constructor. - * - * @param \Prologue\Alerts\AlertsMessageBag $alert - * @param \Pterodactyl\Services\Nests\NestCreationService $nestCreationService - * @param \Pterodactyl\Services\Nests\NestDeletionService $nestDeletionService - * @param \Pterodactyl\Contracts\Repository\NestRepositoryInterface $repository - * @param \Pterodactyl\Services\Nests\NestUpdateService $nestUpdateService - */ - public function __construct( - AlertsMessageBag $alert, - NestCreationService $nestCreationService, - NestDeletionService $nestDeletionService, - NestRepositoryInterface $repository, - NestUpdateService $nestUpdateService - ) { - $this->alert = $alert; - $this->nestDeletionService = $nestDeletionService; - $this->nestCreationService = $nestCreationService; - $this->nestUpdateService = $nestUpdateService; - $this->repository = $repository; - } - - /** - * Render nest listing page. - * - * @return \Illuminate\View\View - * - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function index(): View - { - return view('admin.nests.index', [ - 'nests' => $this->repository->getWithCounts(), - ]); - } - - /** - * Render nest creation page. - * - * @return \Illuminate\View\View - */ - public function create(): View - { - return view('admin.nests.new'); - } - - /** - * Handle the storage of a new nest. - * - * @param \Pterodactyl\Http\Requests\Admin\Nest\StoreNestFormRequest $request - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - */ - public function store(StoreNestFormRequest $request): RedirectResponse - { - $nest = $this->nestCreationService->handle($request->normalize()); - $this->alert->success(trans('admin/nests.notices.created', ['name' => $nest->name]))->flash(); - - return redirect()->route('admin.nests.view', $nest->id); - } - - /** - * Return details about a nest including all of the eggs and servers per egg. - * - * @param int $nest - * @return \Illuminate\View\View - * - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function view(int $nest): View - { - return view('admin.nests.view', [ - 'nest' => $this->repository->getWithEggServers($nest), - ]); - } - - /** - * Handle request to update a nest. - * - * @param \Pterodactyl\Http\Requests\Admin\Nest\StoreNestFormRequest $request - * @param int $nest - * - * @return \Illuminate\Http\RedirectResponse - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function update(StoreNestFormRequest $request, int $nest): RedirectResponse - { - $this->nestUpdateService->handle($nest, $request->normalize()); - $this->alert->success(trans('admin/nests.notices.updated'))->flash(); - - return redirect()->route('admin.nests.view', $nest); - } - - /** - * Handle request to delete a nest. - * - * @param int $nest - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Service\HasActiveServersException - */ - public function destroy(int $nest): RedirectResponse - { - $this->nestDeletionService->handle($nest); - $this->alert->success(trans('admin/nests.notices.deleted'))->flash(); - - return redirect()->route('admin.nests'); - } -} diff --git a/app/Http/Controllers/Admin/NodeAutoDeployController.php b/app/Http/Controllers/Admin/NodeAutoDeployController.php deleted file mode 100644 index be6301c31..000000000 --- a/app/Http/Controllers/Admin/NodeAutoDeployController.php +++ /dev/null @@ -1,88 +0,0 @@ -keyCreationService = $keyCreationService; - $this->repository = $repository; - $this->encrypter = $encrypter; - } - - /** - * Generates a new API key for the logged in user with only permission to read - * nodes, and returns that as the deployment key for a node. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Node $node - * @return \Illuminate\Http\JsonResponse - * - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - */ - public function __invoke(Request $request, Node $node) - { - /** @var \Pterodactyl\Models\ApiKey|null $key */ - $key = $this->repository->getApplicationKeys($request->user()) - ->filter(function (ApiKey $key) { - foreach ($key->getAttributes() as $permission => $value) { - if ($permission === 'r_nodes' && $value === 1) { - return true; - } - } - - return false; - }) - ->first(); - - // We couldn't find a key that exists for this user with only permission for - // reading nodes. Go ahead and create it now. - if (! $key) { - $key = $this->keyCreationService->setKeyType(ApiKey::TYPE_APPLICATION)->handle([ - 'user_id' => $request->user()->id, - 'memo' => 'Automatically generated node deployment key.', - 'allowed_ips' => [], - ], ['r_nodes' => 1]); - } - - return JsonResponse::create([ - 'node' => $node->id, - 'token' => $key->identifier . $this->encrypter->decrypt($key->token), - ]); - } -} diff --git a/app/Http/Controllers/Admin/Nodes/NodeController.php b/app/Http/Controllers/Admin/Nodes/NodeController.php deleted file mode 100644 index 5a7bc1e30..000000000 --- a/app/Http/Controllers/Admin/Nodes/NodeController.php +++ /dev/null @@ -1,53 +0,0 @@ -view = $view; - $this->repository = $repository; - } - - /** - * Returns a listing of nodes on the system. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Contracts\View\View - */ - public function index(Request $request) - { - $nodes = QueryBuilder::for( - Node::query()->with('location')->withCount('servers') - ) - ->allowedFilters(['uuid', 'name']) - ->allowedSorts(['id']) - ->paginate(25); - - return $this->view->make('admin.nodes.index', ['nodes' => $nodes]); - } -} diff --git a/app/Http/Controllers/Admin/Nodes/NodeViewController.php b/app/Http/Controllers/Admin/Nodes/NodeViewController.php deleted file mode 100644 index 2121985c9..000000000 --- a/app/Http/Controllers/Admin/Nodes/NodeViewController.php +++ /dev/null @@ -1,164 +0,0 @@ -repository = $repository; - $this->view = $view; - $this->versionService = $versionService; - $this->locationRepository = $locationRepository; - $this->allocationRepository = $allocationRepository; - $this->serverRepository = $serverRepository; - } - - /** - * Returns index view for a specific node on the system. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Node $node - * @return \Illuminate\Contracts\View\View - */ - public function index(Request $request, Node $node) - { - $node = $this->repository->loadLocationAndServerCount($node); - - return $this->view->make('admin.nodes.view.index', [ - 'node' => $node, - 'stats' => $this->repository->getUsageStats($node), - 'version' => $this->versionService, - ]); - } - - /** - * Returns the settings page for a specific node. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Node $node - * @return \Illuminate\Contracts\View\View - */ - public function settings(Request $request, Node $node) - { - return $this->view->make('admin.nodes.view.settings', [ - 'node' => $node, - 'locations' => $this->locationRepository->all(), - ]); - } - - /** - * Return the node configuration page for a specific node. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Node $node - * @return \Illuminate\Contracts\View\View - */ - public function configuration(Request $request, Node $node) - { - return $this->view->make('admin.nodes.view.configuration', compact('node')); - } - - /** - * Return the node allocation management page. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Node $node - * @return \Illuminate\Contracts\View\View - */ - public function allocations(Request $request, Node $node) - { - $node = $this->repository->loadNodeAllocations($node); - - $this->plainInject(['node' => Collection::wrap($node)->only(['id'])]); - - return $this->view->make('admin.nodes.view.allocation', [ - 'node' => $node, - 'allocations' => Allocation::query()->where('node_id', $node->id) - ->groupBy('ip') - ->orderByRaw('INET_ATON(ip) ASC') - ->get(['ip']), - ]); - } - - /** - * Return a listing of servers that exist for this specific node. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Node $node - * @return \Illuminate\Contracts\View\View - */ - public function servers(Request $request, Node $node) - { - $this->plainInject([ - 'node' => Collection::wrap($node->makeVisible(['daemon_token_id', 'daemon_token'])) - ->only(['scheme', 'fqdn', 'daemonListen', 'daemon_token_id', 'daemon_token']), - ]); - - return $this->view->make('admin.nodes.view.servers', [ - 'node' => $node, - 'servers' => $this->serverRepository->loadAllServersForNode($node->id, 25), - ]); - } -} diff --git a/app/Http/Controllers/Admin/Nodes/SystemInformationController.php b/app/Http/Controllers/Admin/Nodes/SystemInformationController.php deleted file mode 100644 index 4e1a3fe8f..000000000 --- a/app/Http/Controllers/Admin/Nodes/SystemInformationController.php +++ /dev/null @@ -1,52 +0,0 @@ -repository = $repository; - } - - /** - * Returns system information from the Daemon. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Node $node - * @return \Illuminate\Http\JsonResponse - * - * @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException - */ - public function __invoke(Request $request, Node $node) - { - $data = $this->repository->setNode($node)->getSystemInformation(); - - return JsonResponse::create([ - 'version' => $data['version'] ?? '', - 'system' => [ - 'type' => Str::title($data['os'] ?? 'Unknown'), - 'arch' => $data['architecture'] ?? '--', - 'release' => $data['kernel_version'] ?? '--', - 'cpus' => $data['cpu_count'] ?? 0, - ], - ]); - } -} diff --git a/app/Http/Controllers/Admin/NodesController.php b/app/Http/Controllers/Admin/NodesController.php deleted file mode 100644 index 56858511a..000000000 --- a/app/Http/Controllers/Admin/NodesController.php +++ /dev/null @@ -1,302 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Controllers\Admin; - -use Illuminate\Http\Request; -use Pterodactyl\Models\Node; -use Illuminate\Http\Response; -use Pterodactyl\Models\Allocation; -use Prologue\Alerts\AlertsMessageBag; -use Pterodactyl\Http\Controllers\Controller; -use Pterodactyl\Services\Nodes\NodeUpdateService; -use Illuminate\Cache\Repository as CacheRepository; -use Pterodactyl\Services\Nodes\NodeCreationService; -use Pterodactyl\Services\Nodes\NodeDeletionService; -use Pterodactyl\Services\Allocations\AssignmentService; -use Pterodactyl\Services\Helpers\SoftwareVersionService; -use Pterodactyl\Http\Requests\Admin\Node\NodeFormRequest; -use Pterodactyl\Contracts\Repository\NodeRepositoryInterface; -use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; -use Pterodactyl\Http\Requests\Admin\Node\AllocationFormRequest; -use Pterodactyl\Services\Allocations\AllocationDeletionService; -use Pterodactyl\Contracts\Repository\LocationRepositoryInterface; -use Pterodactyl\Contracts\Repository\AllocationRepositoryInterface; -use Pterodactyl\Http\Requests\Admin\Node\AllocationAliasFormRequest; - -class NodesController extends Controller -{ - /** - * @var \Pterodactyl\Services\Allocations\AllocationDeletionService - */ - protected $allocationDeletionService; - - /** - * @var \Prologue\Alerts\AlertsMessageBag - */ - protected $alert; - - /** - * @var \Pterodactyl\Contracts\Repository\AllocationRepositoryInterface - */ - protected $allocationRepository; - - /** - * @var \Pterodactyl\Services\Allocations\AssignmentService - */ - protected $assignmentService; - - /** - * @var \Illuminate\Cache\Repository - */ - protected $cache; - - /** - * @var \Pterodactyl\Services\Nodes\NodeCreationService - */ - protected $creationService; - - /** - * @var \Pterodactyl\Services\Nodes\NodeDeletionService - */ - protected $deletionService; - - /** - * @var \Pterodactyl\Contracts\Repository\LocationRepositoryInterface - */ - protected $locationRepository; - - /** - * @var \Pterodactyl\Contracts\Repository\NodeRepositoryInterface - */ - protected $repository; - - /** - * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface - */ - protected $serverRepository; - - /** - * @var \Pterodactyl\Services\Nodes\NodeUpdateService - */ - protected $updateService; - - /** - * @var \Pterodactyl\Services\Helpers\SoftwareVersionService - */ - protected $versionService; - - /** - * NodesController constructor. - * - * @param \Prologue\Alerts\AlertsMessageBag $alert - * @param \Pterodactyl\Services\Allocations\AllocationDeletionService $allocationDeletionService - * @param \Pterodactyl\Contracts\Repository\AllocationRepositoryInterface $allocationRepository - * @param \Pterodactyl\Services\Allocations\AssignmentService $assignmentService - * @param \Illuminate\Cache\Repository $cache - * @param \Pterodactyl\Services\Nodes\NodeCreationService $creationService - * @param \Pterodactyl\Services\Nodes\NodeDeletionService $deletionService - * @param \Pterodactyl\Contracts\Repository\LocationRepositoryInterface $locationRepository - * @param \Pterodactyl\Contracts\Repository\NodeRepositoryInterface $repository - * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $serverRepository - * @param \Pterodactyl\Services\Nodes\NodeUpdateService $updateService - * @param \Pterodactyl\Services\Helpers\SoftwareVersionService $versionService - */ - public function __construct( - AlertsMessageBag $alert, - AllocationDeletionService $allocationDeletionService, - AllocationRepositoryInterface $allocationRepository, - AssignmentService $assignmentService, - CacheRepository $cache, - NodeCreationService $creationService, - NodeDeletionService $deletionService, - LocationRepositoryInterface $locationRepository, - NodeRepositoryInterface $repository, - ServerRepositoryInterface $serverRepository, - NodeUpdateService $updateService, - SoftwareVersionService $versionService - ) { - $this->alert = $alert; - $this->allocationDeletionService = $allocationDeletionService; - $this->allocationRepository = $allocationRepository; - $this->assignmentService = $assignmentService; - $this->cache = $cache; - $this->creationService = $creationService; - $this->deletionService = $deletionService; - $this->locationRepository = $locationRepository; - $this->repository = $repository; - $this->serverRepository = $serverRepository; - $this->updateService = $updateService; - $this->versionService = $versionService; - } - - /** - * Displays create new node page. - * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View - */ - public function create() - { - $locations = $this->locationRepository->all(); - if (count($locations) < 1) { - $this->alert->warning(trans('admin/node.notices.location_required'))->flash(); - - return redirect()->route('admin.locations'); - } - - return view('admin.nodes.new', ['locations' => $locations]); - } - - /** - * Post controller to create a new node on the system. - * - * @param \Pterodactyl\Http\Requests\Admin\Node\NodeFormRequest $request - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - */ - public function store(NodeFormRequest $request) - { - $node = $this->creationService->handle($request->normalize()); - $this->alert->info(trans('admin/node.notices.node_created'))->flash(); - - return redirect()->route('admin.nodes.view.allocation', $node->id); - } - - /** - * Updates settings for a node. - * - * @param \Pterodactyl\Http\Requests\Admin\Node\NodeFormRequest $request - * @param \Pterodactyl\Models\Node $node - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\DisplayException - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function updateSettings(NodeFormRequest $request, Node $node) - { - $this->updateService->handle($node, $request->normalize(), $request->input('reset_secret') === 'on'); - $this->alert->success(trans('admin/node.notices.node_updated'))->flash(); - - return redirect()->route('admin.nodes.view.settings', $node->id)->withInput(); - } - - /** - * Removes a single allocation from a node. - * - * @param int $node - * @param \Pterodactyl\Models\Allocation $allocation - * @return \Illuminate\Http\Response - * - * @throws \Pterodactyl\Exceptions\Service\Allocation\ServerUsingAllocationException - */ - public function allocationRemoveSingle(int $node, Allocation $allocation): Response - { - $this->allocationDeletionService->handle($allocation); - - return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); - } - - /** - * Removes multiple individual allocations from a node. - * - * @param \Illuminate\Http\Request $request - * @param int $node - * @return \Illuminate\Http\Response - * - * @throws \Pterodactyl\Exceptions\Service\Allocation\ServerUsingAllocationException - */ - public function allocationRemoveMultiple(Request $request, int $node): Response - { - $allocations = $request->input('allocations'); - foreach ($allocations as $rawAllocation) { - $allocation = new Allocation(); - $allocation->id = $rawAllocation['id']; - $this->allocationRemoveSingle($node, $allocation); - } - - return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); - } - - /** - * Remove all allocations for a specific IP at once on a node. - * - * @param \Illuminate\Http\Request $request - * @param int $node - * @return \Illuminate\Http\RedirectResponse - */ - public function allocationRemoveBlock(Request $request, $node) - { - $this->allocationRepository->deleteWhere([ - ['node_id', '=', $node], - ['server_id', '=', null], - ['ip', '=', $request->input('ip')], - ]); - - $this->alert->success(trans('admin/node.notices.unallocated_deleted', ['ip' => $request->input('ip')])) - ->flash(); - - return redirect()->route('admin.nodes.view.allocation', $node); - } - - /** - * Sets an alias for a specific allocation on a node. - * - * @param \Pterodactyl\Http\Requests\Admin\Node\AllocationAliasFormRequest $request - * @return \Symfony\Component\HttpFoundation\Response - * - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function allocationSetAlias(AllocationAliasFormRequest $request) - { - $this->allocationRepository->update($request->input('allocation_id'), [ - 'ip_alias' => (empty($request->input('alias'))) ? null : $request->input('alias'), - ]); - - return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); - } - - /** - * Creates new allocations on a node. - * - * @param \Pterodactyl\Http\Requests\Admin\Node\AllocationFormRequest $request - * @param int|\Pterodactyl\Models\Node $node - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Service\Allocation\CidrOutOfRangeException - * @throws \Pterodactyl\Exceptions\Service\Allocation\InvalidPortMappingException - * @throws \Pterodactyl\Exceptions\Service\Allocation\PortOutOfRangeException - * @throws \Pterodactyl\Exceptions\Service\Allocation\TooManyPortsInRangeException - */ - public function createAllocation(AllocationFormRequest $request, Node $node) - { - $this->assignmentService->handle($node, $request->normalize()); - $this->alert->success(trans('admin/node.notices.allocations_added'))->flash(); - - return redirect()->route('admin.nodes.view.allocation', $node->id); - } - - /** - * Deletes a node from the system. - * - * @param $node - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\DisplayException - */ - public function delete($node) - { - $this->deletionService->handle($node); - $this->alert->success(trans('admin/node.notices.node_deleted'))->flash(); - - return redirect()->route('admin.nodes'); - } -} diff --git a/app/Http/Controllers/Admin/Servers/CreateServerController.php b/app/Http/Controllers/Admin/Servers/CreateServerController.php deleted file mode 100644 index 1cea7651a..000000000 --- a/app/Http/Controllers/Admin/Servers/CreateServerController.php +++ /dev/null @@ -1,134 +0,0 @@ -repository = $repository; - $this->nodeRepository = $nodeRepository; - $this->alert = $alert; - $this->nestRepository = $nestRepository; - $this->locationRepository = $locationRepository; - $this->creationService = $creationService; - } - - /** - * Displays the create server page. - * - * @return \Illuminate\Contracts\View\Factory - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function index() - { - $nodes = $this->nodeRepository->all(); - if (count($nodes) < 1) { - $this->alert->warning(trans('admin/server.alerts.node_required'))->flash(); - - return redirect()->route('admin.nodes'); - } - - $nests = $this->nestRepository->getWithEggs(); - - Javascript::put([ - 'nodeData' => $this->nodeRepository->getNodesForServerCreation(), - 'nests' => $nests->map(function ($item) { - return array_merge($item->toArray(), [ - 'eggs' => $item->eggs->keyBy('id')->toArray(), - ]); - })->keyBy('id'), - ]); - - return view('admin.servers.new', [ - 'locations' => $this->locationRepository->all(), - 'nests' => $nests, - ]); - } - - /** - * Create a new server on the remote system. - * - * @param \Pterodactyl\Http\Requests\Admin\ServerFormRequest $request - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Illuminate\Validation\ValidationException - * @throws \Pterodactyl\Exceptions\DisplayException - * @throws \Pterodactyl\Exceptions\Service\Deployment\NoViableAllocationException - * @throws \Pterodactyl\Exceptions\Service\Deployment\NoViableNodeException - * @throws \Throwable - */ - public function store(ServerFormRequest $request) - { - $data = $request->except(['_token']); - if (!empty($data['custom_image'])) { - $data['image'] = $data['custom_image']; - unset($data['custom_image']); - } - - $server = $this->creationService->handle($data); - - $this->alert->success( - trans('admin/server.alerts.server_created') - )->flash(); - - return RedirectResponse::create('/admin/servers/view/' . $server->id); - } -} diff --git a/app/Http/Controllers/Admin/Servers/ServerController.php b/app/Http/Controllers/Admin/Servers/ServerController.php deleted file mode 100644 index c8e54b1c3..000000000 --- a/app/Http/Controllers/Admin/Servers/ServerController.php +++ /dev/null @@ -1,58 +0,0 @@ -view = $view; - $this->repository = $repository; - } - - /** - * Returns all of the servers that exist on the system using a paginated result set. If - * a query is passed along in the request it is also passed to the repository function. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Contracts\View\View - */ - public function index(Request $request) - { - $servers = QueryBuilder::for(Server::query()->with('node', 'user', 'allocation')) - ->allowedFilters([ - AllowedFilter::exact('owner_id'), - AllowedFilter::custom('*', new AdminServerFilter), - ]) - ->paginate(config()->get('pterodactyl.paginate.admin.servers')); - - return $this->view->make('admin.servers.index', ['servers' => $servers]); - } -} diff --git a/app/Http/Controllers/Admin/Servers/ServerTransferController.php b/app/Http/Controllers/Admin/Servers/ServerTransferController.php deleted file mode 100644 index 5207ef9d1..000000000 --- a/app/Http/Controllers/Admin/Servers/ServerTransferController.php +++ /dev/null @@ -1,164 +0,0 @@ -alert = $alert; - $this->allocationRepository = $allocationRepository; - $this->repository = $repository; - $this->locationRepository = $locationRepository; - $this->nodeRepository = $nodeRepository; - $this->transferService = $transferService; - $this->daemonConfigurationRepository = $daemonConfigurationRepository; - } - - /** - * Starts a transfer of a server to a new node. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Throwable - */ - public function transfer(Request $request, Server $server) { - $validatedData = $request->validate([ - 'node_id' => 'required|exists:nodes,id', - 'allocation_id' => 'required|bail|unique:servers|exists:allocations,id', - 'allocation_additional' => 'nullable', - ]); - - $node_id = $validatedData['node_id']; - $allocation_id = intval($validatedData['allocation_id']); - $additional_allocations = array_map('intval', $validatedData['allocation_additional'] ?? []); - - // Check if the node is viable for the transfer. - $node = $this->nodeRepository->getNodeWithResourceUsage($node_id); - if ($node->isViable($server->memory, $server->disk)) { - // Check if the selected daemon is online. - $this->daemonConfigurationRepository->setNode($node)->getSystemInformation(); - - // Create a new ServerTransfer entry. - $transfer = new ServerTransfer; - - $transfer->server_id = $server->id; - $transfer->old_node = $server->node_id; - $transfer->new_node = $node_id; - $transfer->old_allocation = $server->allocation_id; - $transfer->new_allocation = $allocation_id; - $transfer->old_additional_allocations = $server->allocations->where('id', '!=', $server->allocation_id)->pluck('id'); - $transfer->new_additional_allocations = $additional_allocations; - - $transfer->save(); - - // Add the allocations to the server so they cannot be automatically assigned while the transfer is in progress. - $this->assignAllocationsToServer($server, $node_id, $allocation_id, $additional_allocations); - - // Request an archive from the server's current daemon. (this also checks if the daemon is online) - $this->transferService->requestArchive($server); - - $this->alert->success(trans('admin/server.alerts.transfer_started'))->flash(); - } else { - $this->alert->danger(trans('admin/server.alerts.transfer_not_viable'))->flash(); - } - - return redirect()->route('admin.servers.view.manage', $server->id); - } - - /** - * Assigns the specified allocations to the specified server. - * - * @param Server $server - * @param int $node_id - * @param int $allocation_id - * @param array $additional_allocations - */ - private function assignAllocationsToServer(Server $server, int $node_id, int $allocation_id, array $additional_allocations) - { - $allocations = $additional_allocations; - array_push($allocations, $allocation_id); - - $unassigned = $this->allocationRepository->getUnassignedAllocationIds($node_id); - - $updateIds = []; - foreach ($allocations as $allocation) { - if (! in_array($allocation, $unassigned)) { - continue; - } - - $updateIds[] = $allocation; - } - - if (! empty($updateIds)) { - $this->allocationRepository->updateWhereIn('id', $updateIds, ['server_id' => $server->id]); - } - } -} diff --git a/app/Http/Controllers/Admin/Servers/ServerViewController.php b/app/Http/Controllers/Admin/Servers/ServerViewController.php deleted file mode 100644 index 5c2440b24..000000000 --- a/app/Http/Controllers/Admin/Servers/ServerViewController.php +++ /dev/null @@ -1,245 +0,0 @@ -view = $view; - $this->databaseHostRepository = $databaseHostRepository; - $this->locationRepository = $locationRepository; - $this->mountRepository = $mountRepository; - $this->nestRepository = $nestRepository; - $this->nodeRepository = $nodeRepository; - $this->repository = $repository; - $this->environmentService = $environmentService; - } - - /** - * Returns the index view for a server. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Contracts\View\View - */ - public function index(Request $request, Server $server) - { - return $this->view->make('admin.servers.view.index', compact('server')); - } - - /** - * Returns the server details page. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Contracts\View\View - */ - public function details(Request $request, Server $server) - { - return $this->view->make('admin.servers.view.details', compact('server')); - } - - /** - * Returns a view of server build settings. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Contracts\View\View - */ - public function build(Request $request, Server $server) - { - $allocations = $server->node->allocations->toBase(); - - return $this->view->make('admin.servers.view.build', [ - 'server' => $server, - 'assigned' => $allocations->where('server_id', $server->id)->sortBy('port')->sortBy('ip'), - 'unassigned' => $allocations->where('server_id', null)->sortBy('port')->sortBy('ip'), - ]); - } - - /** - * Returns the server startup management page. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Contracts\View\View - * - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function startup(Request $request, Server $server) - { - $nests = $this->nestRepository->getWithEggs(); - $variables = $this->environmentService->handle($server); - - $this->plainInject([ - 'server' => $server, - 'server_variables' => $variables, - 'nests' => $nests->map(function (Nest $item) { - return array_merge($item->toArray(), [ - 'eggs' => $item->eggs->keyBy('id')->toArray(), - ]); - })->keyBy('id'), - ]); - - return $this->view->make('admin.servers.view.startup', compact('server', 'nests')); - } - - /** - * Returns all of the databases that exist for the server. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Contracts\View\View - */ - public function database(Request $request, Server $server) - { - return $this->view->make('admin.servers.view.database', [ - 'hosts' => $this->databaseHostRepository->all(), - 'server' => $server, - ]); - } - - /** - * Returns all of the mounts that exist for the server. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Contracts\View\View - */ - public function mounts(Request $request, Server $server) - { - $server->load('mounts'); - - return $this->view->make('admin.servers.view.mounts', [ - 'mounts' => $this->mountRepository->getMountListForServer($server), - 'server' => $server, - ]); - } - - /** - * Returns the base server management page, or an exception if the server - * is in a state that cannot be recovered from. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Contracts\View\View - * - * @throws \Pterodactyl\Exceptions\DisplayException - */ - public function manage(Request $request, Server $server) - { - if ($server->installed > 1) { - throw new DisplayException( - 'This server is in a failed install state and cannot be recovered. Please delete and re-create the server.' - ); - } - - // Check if the panel doesn't have at least 2 nodes configured. - $nodes = $this->nodeRepository->all(); - $canTransfer = false; - if (count($nodes) >= 2) { - $canTransfer = true; - } - - Javascript::put([ - 'nodeData' => $this->nodeRepository->getNodesForServerCreation(), - ]); - - return $this->view->make('admin.servers.view.manage', [ - 'server' => $server, - 'locations' => $this->locationRepository->all(), - 'canTransfer' => $canTransfer, - ]); - } - - /** - * Returns the server deletion page. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Contracts\View\View - */ - public function delete(Request $request, Server $server) - { - return $this->view->make('admin.servers.view.delete', compact('server')); - } -} diff --git a/app/Http/Controllers/Admin/ServersController.php b/app/Http/Controllers/Admin/ServersController.php deleted file mode 100644 index 11ac4f399..000000000 --- a/app/Http/Controllers/Admin/ServersController.php +++ /dev/null @@ -1,461 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Controllers\Admin; - -use Illuminate\Support\Arr; -use Illuminate\Http\Request; -use Pterodactyl\Models\User; -use Pterodactyl\Models\Mount; -use Pterodactyl\Models\Server; -use Pterodactyl\Models\MountServer; -use Prologue\Alerts\AlertsMessageBag; -use GuzzleHttp\Exception\RequestException; -use Pterodactyl\Exceptions\DisplayException; -use Pterodactyl\Http\Controllers\Controller; -use Illuminate\Validation\ValidationException; -use Pterodactyl\Services\Servers\SuspensionService; -use Pterodactyl\Repositories\Eloquent\MountRepository; -use Pterodactyl\Services\Servers\ServerDeletionService; -use Pterodactyl\Services\Servers\ReinstallServerService; -use Pterodactyl\Exceptions\Model\DataValidationException; -use Pterodactyl\Repositories\Wings\DaemonServerRepository; -use Pterodactyl\Services\Servers\BuildModificationService; -use Pterodactyl\Services\Databases\DatabasePasswordService; -use Pterodactyl\Services\Servers\DetailsModificationService; -use Pterodactyl\Services\Servers\StartupModificationService; -use Pterodactyl\Contracts\Repository\NestRepositoryInterface; -use Pterodactyl\Repositories\Eloquent\DatabaseHostRepository; -use Pterodactyl\Services\Databases\DatabaseManagementService; -use Illuminate\Contracts\Config\Repository as ConfigRepository; -use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; -use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface; -use Pterodactyl\Contracts\Repository\AllocationRepositoryInterface; -use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException; -use Pterodactyl\Services\Servers\ServerConfigurationStructureService; -use Pterodactyl\Http\Requests\Admin\Servers\Databases\StoreServerDatabaseRequest; - -class ServersController extends Controller -{ - /** - * @var \Prologue\Alerts\AlertsMessageBag - */ - protected $alert; - - /** - * @var \Pterodactyl\Contracts\Repository\AllocationRepositoryInterface - */ - protected $allocationRepository; - - /** - * @var \Pterodactyl\Services\Servers\BuildModificationService - */ - protected $buildModificationService; - - /** - * @var \Illuminate\Contracts\Config\Repository - */ - protected $config; - - /** - * @var \Pterodactyl\Repositories\Wings\DaemonServerRepository - */ - private $daemonServerRepository; - - /** - * @var \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface - */ - protected $databaseRepository; - - /** - * @var \Pterodactyl\Services\Databases\DatabaseManagementService - */ - protected $databaseManagementService; - - /** - * @var \Pterodactyl\Services\Databases\DatabasePasswordService - */ - protected $databasePasswordService; - - /** - * @var \Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface - */ - protected $databaseHostRepository; - - /** - * @var \Pterodactyl\Services\Servers\ServerDeletionService - */ - protected $deletionService; - - /** - * @var \Pterodactyl\Services\Servers\DetailsModificationService - */ - protected $detailsModificationService; - - /** - * @var \Pterodactyl\Repositories\Eloquent\MountRepository - */ - protected $mountRepository; - - /** - * @var \Pterodactyl\Contracts\Repository\NestRepositoryInterface - */ - protected $nestRepository; - - /** - * @var \Pterodactyl\Services\Servers\ReinstallServerService - */ - protected $reinstallService; - - /** - * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface - */ - protected $repository; - - /** - * @var \Pterodactyl\Services\Servers\ServerConfigurationStructureService - */ - private $serverConfigurationStructureService; - - /** - * @var \Pterodactyl\Services\Servers\StartupModificationService - */ - private $startupModificationService; - - /** - * @var \Pterodactyl\Services\Servers\SuspensionService - */ - protected $suspensionService; - - /** - * ServersController constructor. - * - * @param \Prologue\Alerts\AlertsMessageBag $alert - * @param \Pterodactyl\Contracts\Repository\AllocationRepositoryInterface $allocationRepository - * @param \Pterodactyl\Services\Servers\BuildModificationService $buildModificationService - * @param \Illuminate\Contracts\Config\Repository $config - * @param \Pterodactyl\Repositories\Wings\DaemonServerRepository $daemonServerRepository - * @param \Pterodactyl\Services\Databases\DatabaseManagementService $databaseManagementService - * @param \Pterodactyl\Services\Databases\DatabasePasswordService $databasePasswordService - * @param \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface $databaseRepository - * @param \Pterodactyl\Repositories\Eloquent\DatabaseHostRepository $databaseHostRepository - * @param \Pterodactyl\Services\Servers\ServerDeletionService $deletionService - * @param \Pterodactyl\Services\Servers\DetailsModificationService $detailsModificationService - * @param \Pterodactyl\Services\Servers\ReinstallServerService $reinstallService - * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $repository - * @param \Pterodactyl\Repositories\Eloquent\MountRepository $mountRepository - * @param \Pterodactyl\Contracts\Repository\NestRepositoryInterface $nestRepository - * @param \Pterodactyl\Services\Servers\ServerConfigurationStructureService $serverConfigurationStructureService - * @param \Pterodactyl\Services\Servers\StartupModificationService $startupModificationService - * @param \Pterodactyl\Services\Servers\SuspensionService $suspensionService - */ - public function __construct( - AlertsMessageBag $alert, - AllocationRepositoryInterface $allocationRepository, - BuildModificationService $buildModificationService, - ConfigRepository $config, - DaemonServerRepository $daemonServerRepository, - DatabaseManagementService $databaseManagementService, - DatabasePasswordService $databasePasswordService, - DatabaseRepositoryInterface $databaseRepository, - DatabaseHostRepository $databaseHostRepository, - ServerDeletionService $deletionService, - DetailsModificationService $detailsModificationService, - ReinstallServerService $reinstallService, - ServerRepositoryInterface $repository, - MountRepository $mountRepository, - NestRepositoryInterface $nestRepository, - ServerConfigurationStructureService $serverConfigurationStructureService, - StartupModificationService $startupModificationService, - SuspensionService $suspensionService - ) { - $this->alert = $alert; - $this->allocationRepository = $allocationRepository; - $this->buildModificationService = $buildModificationService; - $this->config = $config; - $this->daemonServerRepository = $daemonServerRepository; - $this->databaseHostRepository = $databaseHostRepository; - $this->databaseManagementService = $databaseManagementService; - $this->databasePasswordService = $databasePasswordService; - $this->databaseRepository = $databaseRepository; - $this->detailsModificationService = $detailsModificationService; - $this->deletionService = $deletionService; - $this->nestRepository = $nestRepository; - $this->reinstallService = $reinstallService; - $this->repository = $repository; - $this->mountRepository = $mountRepository; - $this->serverConfigurationStructureService = $serverConfigurationStructureService; - $this->startupModificationService = $startupModificationService; - $this->suspensionService = $suspensionService; - } - - /** - * Update the details for a server. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function setDetails(Request $request, Server $server) - { - $this->detailsModificationService->handle($server, $request->only([ - 'owner_id', 'external_id', 'name', 'description', - ])); - - $this->alert->success(trans('admin/server.alerts.details_updated'))->flash(); - - return redirect()->route('admin.servers.view.details', $server->id); - } - - /** - * Toggles the install status for a server. - * - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\DisplayException - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function toggleInstall(Server $server) - { - if ($server->installed > 1) { - throw new DisplayException(trans('admin/server.exceptions.marked_as_failed')); - } - - $this->repository->update($server->id, [ - 'installed' => ! $server->installed, - ], true, true); - - $this->alert->success(trans('admin/server.alerts.install_toggled'))->flash(); - - return redirect()->route('admin.servers.view.manage', $server->id); - } - - /** - * Reinstalls the server with the currently assigned service. - * - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\DisplayException - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function reinstallServer(Server $server) - { - $this->reinstallService->handle($server); - $this->alert->success(trans('admin/server.alerts.server_reinstalled'))->flash(); - - return redirect()->route('admin.servers.view.manage', $server->id); - } - - /** - * Manage the suspension status for a server. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\DisplayException - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function manageSuspension(Request $request, Server $server) - { - $this->suspensionService->toggle($server, $request->input('action')); - $this->alert->success(trans('admin/server.alerts.suspension_toggled', [ - 'status' => $request->input('action') . 'ed', - ]))->flash(); - - return redirect()->route('admin.servers.view.manage', $server->id); - } - - /** - * Update the build configuration for a server. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\DisplayException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - * @throws \Illuminate\Validation\ValidationException - */ - public function updateBuild(Request $request, Server $server) - { - try { - $this->buildModificationService->handle($server, $request->only([ - 'allocation_id', 'add_allocations', 'remove_allocations', - 'memory', 'swap', 'io', 'cpu', 'threads', 'disk', - 'database_limit', 'allocation_limit', 'backup_limit', 'oom_disabled', - ])); - } catch (DataValidationException $exception) { - throw new ValidationException($exception->validator); - } - - $this->alert->success(trans('admin/server.alerts.build_updated'))->flash(); - - return redirect()->route('admin.servers.view.build', $server->id); - } - - /** - * Start the server deletion process. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\DisplayException - * @throws \Throwable - */ - public function delete(Request $request, Server $server) - { - $this->deletionService->withForce($request->filled('force_delete'))->handle($server); - $this->alert->success(trans('admin/server.alerts.server_deleted'))->flash(); - - return redirect()->route('admin.servers'); - } - - /** - * Update the startup command as well as variables. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Illuminate\Validation\ValidationException - */ - public function saveStartup(Request $request, Server $server) - { - $data = $request->except('_token'); - if (!empty($data['custom_docker_image'])) { - $data['docker_image'] = $data['custom_docker_image']; - unset($data['custom_docker_image']); - } - - try { - $this->startupModificationService - ->setUserLevel(User::USER_LEVEL_ADMIN) - ->handle($server, $data); - } catch (DataValidationException $exception) { - throw new ValidationException($exception->validator); - } - - $this->alert->success(trans('admin/server.alerts.startup_changed'))->flash(); - - return redirect()->route('admin.servers.view.startup', $server->id); - } - - /** - * Creates a new database assigned to a specific server. - * - * @param \Pterodactyl\Http\Requests\Admin\Servers\Databases\StoreServerDatabaseRequest $request - * @param \Pterodactyl\Models\Server $server - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Throwable - */ - public function newDatabase(StoreServerDatabaseRequest $request, Server $server) - { - $this->databaseManagementService->create($server, [ - 'database' => DatabaseManagementService::generateUniqueDatabaseName($request->input('database'), $server->id), - 'remote' => $request->input('remote'), - 'database_host_id' => $request->input('database_host_id'), - 'max_connections' => $request->input('max_connections'), - ]); - - return redirect()->route('admin.servers.view.database', $server->id)->withInput(); - } - - /** - * Resets the database password for a specific database on this server. - * - * @param \Illuminate\Http\Request $request - * @param int $server - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Throwable - */ - public function resetDatabasePassword(Request $request, $server) - { - $database = $this->databaseRepository->findFirstWhere([ - ['server_id', '=', $server], - ['id', '=', $request->input('database')], - ]); - - $this->databasePasswordService->handle($database); - - return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); - } - - /** - * Deletes a database from a server. - * - * @param int $server - * @param int $database - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Exception - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - */ - public function deleteDatabase($server, $database) - { - $database = $this->databaseRepository->findFirstWhere([ - ['server_id', '=', $server], - ['id', '=', $database], - ]); - - $this->databaseManagementService->delete($database); - - return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); - } - - /** - * Add a mount to a server. - * - * @param Server $server - * @param \Pterodactyl\Models\Mount $mount - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Throwable - */ - public function addMount(Server $server, Mount $mount) - { - $mountServer = (new MountServer)->forceFill([ - 'mount_id' => $mount->id, - 'server_id' => $server->id, - ]); - - $mountServer->saveOrFail(); - - $this->alert->success('Mount was added successfully.')->flash(); - - return redirect()->route('admin.servers.view.mounts', $server->id); - } - - /** - * Remove a mount from a server. - * - * @param Server $server - * @param \Pterodactyl\Models\Mount $mount - * @return \Illuminate\Http\RedirectResponse - */ - public function deleteMount(Server $server, Mount $mount) - { - MountServer::where('mount_id', $mount->id)->where('server_id', $server->id)->delete(); - - $this->alert->success('Mount was removed successfully.')->flash(); - - return redirect()->route('admin.servers.view.mounts', $server->id); - } -} diff --git a/app/Http/Controllers/Admin/Settings/AdvancedController.php b/app/Http/Controllers/Admin/Settings/AdvancedController.php deleted file mode 100644 index 54409d190..000000000 --- a/app/Http/Controllers/Admin/Settings/AdvancedController.php +++ /dev/null @@ -1,93 +0,0 @@ -alert = $alert; - $this->config = $config; - $this->kernel = $kernel; - $this->settings = $settings; - } - - /** - * Render advanced Panel settings UI. - * - * @return \Illuminate\View\View - */ - public function index(): View - { - $showRecaptchaWarning = false; - if ( - $this->config->get('recaptcha._shipped_secret_key') === $this->config->get('recaptcha.secret_key') - || $this->config->get('recaptcha._shipped_website_key') === $this->config->get('recaptcha.website_key') - ) { - $showRecaptchaWarning = true; - } - - return view('admin.settings.advanced', [ - 'showRecaptchaWarning' => $showRecaptchaWarning, - ]); - } - - /** - * @param \Pterodactyl\Http\Requests\Admin\Settings\AdvancedSettingsFormRequest $request - * @return \Illuminate\Http\RedirectResponse - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function update(AdvancedSettingsFormRequest $request): RedirectResponse - { - foreach ($request->normalize() as $key => $value) { - $this->settings->set('settings::' . $key, $value); - } - - $this->kernel->call('queue:restart'); - $this->alert->success('Advanced settings have been updated successfully and the queue worker was restarted to apply these changes.')->flash(); - - return redirect()->route('admin.settings.advanced'); - } -} diff --git a/app/Http/Controllers/Admin/Settings/IndexController.php b/app/Http/Controllers/Admin/Settings/IndexController.php deleted file mode 100644 index 1bf61d65a..000000000 --- a/app/Http/Controllers/Admin/Settings/IndexController.php +++ /dev/null @@ -1,91 +0,0 @@ -alert = $alert; - $this->kernel = $kernel; - $this->settings = $settings; - $this->versionService = $versionService; - } - - /** - * Render the UI for basic Panel settings. - * - * @return \Illuminate\View\View - */ - public function index(): View - { - return view('admin.settings.index', [ - 'version' => $this->versionService, - 'languages' => $this->getAvailableLanguages(true), - ]); - } - - /** - * Handle settings update. - * - * @param \Pterodactyl\Http\Requests\Admin\Settings\BaseSettingsFormRequest $request - * @return \Illuminate\Http\RedirectResponse - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function update(BaseSettingsFormRequest $request): RedirectResponse - { - foreach ($request->normalize() as $key => $value) { - $this->settings->set('settings::' . $key, $value); - } - - $this->kernel->call('queue:restart'); - $this->alert->success('Panel settings have been updated successfully and the queue worker was restarted to apply these changes.')->flash(); - - return redirect()->route('admin.settings'); - } -} diff --git a/app/Http/Controllers/Admin/Settings/MailController.php b/app/Http/Controllers/Admin/Settings/MailController.php deleted file mode 100644 index 4d8c4915f..000000000 --- a/app/Http/Controllers/Admin/Settings/MailController.php +++ /dev/null @@ -1,135 +0,0 @@ -alert = $alert; - $this->config = $config; - $this->encrypter = $encrypter; - $this->kernel = $kernel; - $this->settings = $settings; - } - - /** - * Render UI for editing mail settings. This UI should only display if - * the server is configured to send mail using SMTP. - * - * @return \Illuminate\View\View - */ - public function index(): View - { - return view('admin.settings.mail', [ - 'disabled' => $this->config->get('mail.driver') !== 'smtp', - ]); - } - - /** - * Handle request to update SMTP mail settings. - * - * @param \Pterodactyl\Http\Requests\Admin\Settings\MailSettingsFormRequest $request - * @return \Illuminate\Http\Response - * - * @throws DisplayException - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function update(MailSettingsFormRequest $request): Response - { - if ($this->config->get('mail.driver') !== 'smtp') { - throw new DisplayException('This feature is only available if SMTP is the selected email driver for the Panel.'); - } - - $values = $request->normalize(); - if (array_get($values, 'mail:password') === '!e') { - $values['mail:password'] = ''; - } - - foreach ($values as $key => $value) { - if (in_array($key, SettingsServiceProvider::getEncryptedKeys()) && ! empty($value)) { - $value = $this->encrypter->encrypt($value); - } - - $this->settings->set('settings::' . $key, $value); - } - - $this->kernel->call('queue:restart'); - - return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); - } - - /** - * Submit a request to send a test mail message. - * - * @param Request $request - * @return \Illuminate\Http\Response - */ - public function test(Request $request): Response - { - try { - Notification::route('mail', $request->user()->email) - ->notify(new MailTested($request->user())); - } catch (Exception $exception) { - return response($exception->getMessage(), 500); - } - - return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); - } -} diff --git a/app/Http/Controllers/Admin/StatisticsController.php b/app/Http/Controllers/Admin/StatisticsController.php deleted file mode 100644 index 612f04b62..000000000 --- a/app/Http/Controllers/Admin/StatisticsController.php +++ /dev/null @@ -1,99 +0,0 @@ -allocationRepository = $allocationRepository; - $this->databaseRepository = $databaseRepository; - $this->eggRepository = $eggRepository; - $this->nodeRepository = $nodeRepository; - $this->serverRepository = $serverRepository; - $this->userRepository = $userRepository; - } - - public function index() - { - throw new NotFoundHttpException; - $servers = $this->serverRepository->all(); - $nodes = $this->nodeRepository->all(); - $usersCount = $this->userRepository->count(); - $eggsCount = $this->eggRepository->count(); - $databasesCount = $this->databaseRepository->count(); - $totalAllocations = $this->allocationRepository->count(); - $suspendedServersCount = $this->serverRepository->getSuspendedServersCount(); - - $totalServerRam = 0; - $totalNodeRam = 0; - $totalServerDisk = 0; - $totalNodeDisk = 0; - foreach ($nodes as $node) { - $stats = $this->nodeRepository->getUsageStatsRaw($node); - $totalServerRam += $stats['memory']['value']; - $totalNodeRam += $stats['memory']['max']; - $totalServerDisk += $stats['disk']['value']; - $totalNodeDisk += $stats['disk']['max']; - } - - $tokens = []; - foreach ($nodes as $node) { - $tokens[$node->id] = decrypt($node->daemon_token); - } - - $this->injectJavascript([ - 'servers' => $servers, - 'suspendedServers' => $suspendedServersCount, - 'totalServerRam' => $totalServerRam, - 'totalNodeRam' => $totalNodeRam, - 'totalServerDisk' => $totalServerDisk, - 'totalNodeDisk' => $totalNodeDisk, - 'nodes' => $nodes, - 'tokens' => $tokens, - ]); - - return view('admin.statistics', [ - 'servers' => $servers, - 'nodes' => $nodes, - 'usersCount' => $usersCount, - 'eggsCount' => $eggsCount, - 'totalServerRam' => $totalServerRam, - 'databasesCount' => $databasesCount, - 'totalNodeRam' => $totalNodeRam, - 'totalNodeDisk' => $totalNodeDisk, - 'totalServerDisk' => $totalServerDisk, - 'totalAllocations' => $totalAllocations, - ]); - } -} diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php deleted file mode 100644 index b5126c766..000000000 --- a/app/Http/Controllers/Admin/UserController.php +++ /dev/null @@ -1,211 +0,0 @@ -alert = $alert; - $this->creationService = $creationService; - $this->deletionService = $deletionService; - $this->repository = $repository; - $this->translator = $translator; - $this->updateService = $updateService; - } - - /** - * Display user index page. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\View\View - */ - public function index(Request $request) - { - $users = QueryBuilder::for( - User::query()->select('users.*') - ->selectRaw('COUNT(DISTINCT(subusers.id)) as subuser_of_count') - ->selectRaw('COUNT(DISTINCT(servers.id)) as servers_count') - ->leftJoin('subusers', 'subusers.user_id', '=', 'users.id') - ->leftJoin('servers', 'servers.owner_id', '=', 'users.id') - ->groupBy('users.id') - ) - ->allowedFilters(['username', 'email', 'uuid']) - ->allowedSorts(['id', 'uuid']) - ->paginate(50); - - return view('admin.users.index', ['users' => $users]); - } - - /** - * Display new user page. - * - * @return \Illuminate\View\View - */ - public function create() - { - return view('admin.users.new', [ - 'languages' => $this->getAvailableLanguages(true), - ]); - } - - /** - * Display user view page. - * - * @param \Pterodactyl\Models\User $user - * @return \Illuminate\View\View - */ - public function view(User $user) - { - return view('admin.users.view', [ - 'user' => $user, - 'languages' => $this->getAvailableLanguages(true), - ]); - } - - /** - * Delete a user from the system. - * - * @param \Illuminate\Http\Request $request - * @param \Pterodactyl\Models\User $user - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Exception - * @throws \Pterodactyl\Exceptions\DisplayException - */ - public function delete(Request $request, User $user) - { - if ($request->user()->id === $user->id) { - throw new DisplayException($this->translator->trans('admin/user.exceptions.user_has_servers')); - } - - $this->deletionService->handle($user); - - return redirect()->route('admin.users'); - } - - /** - * Create a user. - * - * @param \Pterodactyl\Http\Requests\Admin\UserFormRequest $request - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Exception - * @throws \Throwable - */ - public function store(UserFormRequest $request) - { - $user = $this->creationService->handle($request->normalize()); - $this->alert->success($this->translator->get('admin/user.notices.account_created'))->flash(); - - return redirect()->route('admin.users.view', $user->id); - } - - /** - * Update a user on the system. - * - * @param \Pterodactyl\Http\Requests\Admin\UserFormRequest $request - * @param \Pterodactyl\Models\User $user - * @return \Illuminate\Http\RedirectResponse - * - * @throws \Pterodactyl\Exceptions\Model\DataValidationException - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - */ - public function update(UserFormRequest $request, User $user) - { - $this->updateService - ->setUserLevel(User::USER_LEVEL_ADMIN) - ->handle($user, $request->normalize()); - - $this->alert->success(trans('admin/user.notices.account_updated'))->flash(); - - return redirect()->route('admin.users.view', $user->id); - } - - /** - * Get a JSON response of users on the system. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Support\Collection|\Pterodactyl\Models\Model - */ - public function json(Request $request) - { - $users = QueryBuilder::for(User::query())->allowedFilters(['email'])->paginate(25); - - // Handle single user requests. - if ($request->query('user_id')) { - $user = User::query()->findOrFail($request->input('user_id')); - $user->md5 = md5(strtolower($user->email)); - - return $user; - } - - return $users->map(function ($item) { - $item->md5 = md5(strtolower($item->email)); - - return $item; - }); - } -} diff --git a/app/Http/Requests/Admin/AdminFormRequest.php b/app/Http/Requests/Admin/AdminFormRequest.php deleted file mode 100644 index 012d73364..000000000 --- a/app/Http/Requests/Admin/AdminFormRequest.php +++ /dev/null @@ -1,42 +0,0 @@ -user())) { - return false; - } - - return (bool) $this->user()->root_admin; - } - - /** - * Return only the fields that we are interested in from the request. - * This will include empty fields as a null value. - * - * @param array|null $only - * @return array - */ - public function normalize(array $only = null) - { - return $this->only($only ?? array_keys($this->rules())); - } -} diff --git a/app/Http/Requests/Admin/Api/StoreApplicationApiKeyRequest.php b/app/Http/Requests/Admin/Api/StoreApplicationApiKeyRequest.php deleted file mode 100644 index a29496280..000000000 --- a/app/Http/Requests/Admin/Api/StoreApplicationApiKeyRequest.php +++ /dev/null @@ -1,41 +0,0 @@ -mapWithKeys(function ($resource) use ($modelRules) { - return [AdminAcl::COLUMN_IDENTIFIER . $resource => $modelRules['r_' . $resource]]; - })->merge(['memo' => $modelRules['memo']])->toArray(); - } - - /** - * @return array - */ - public function attributes() - { - return [ - 'memo' => 'Description', - ]; - } - - public function getKeyPermissions(): array - { - return collect($this->validated())->filter(function ($value, $key) { - return substr($key, 0, strlen(AdminAcl::COLUMN_IDENTIFIER)) === AdminAcl::COLUMN_IDENTIFIER; - })->toArray(); - } -} diff --git a/app/Http/Requests/Admin/BaseFormRequest.php b/app/Http/Requests/Admin/BaseFormRequest.php deleted file mode 100644 index dff6b9fb2..000000000 --- a/app/Http/Requests/Admin/BaseFormRequest.php +++ /dev/null @@ -1,20 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Requests\Admin; - -class BaseFormRequest extends AdminFormRequest -{ - public function rules() - { - return [ - 'company' => 'required|between:1,256', - ]; - } -} diff --git a/app/Http/Requests/Admin/DatabaseHostFormRequest.php b/app/Http/Requests/Admin/DatabaseHostFormRequest.php deleted file mode 100644 index c6b2468a7..000000000 --- a/app/Http/Requests/Admin/DatabaseHostFormRequest.php +++ /dev/null @@ -1,34 +0,0 @@ -method() !== 'POST') { - return DatabaseHost::getRulesForUpdate($this->route()->parameter('host')); - } - - return DatabaseHost::getRules(); - } - - /** - * Modify submitted data before it is passed off to the validator. - * - * @return \Illuminate\Contracts\Validation\Validator - */ - protected function getValidatorInstance() - { - if (! $this->filled('node_id')) { - $this->merge(['node_id' => null]); - } - - return parent::getValidatorInstance(); - } -} diff --git a/app/Http/Requests/Admin/Egg/EggFormRequest.php b/app/Http/Requests/Admin/Egg/EggFormRequest.php deleted file mode 100644 index 2c865f228..000000000 --- a/app/Http/Requests/Admin/Egg/EggFormRequest.php +++ /dev/null @@ -1,49 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Requests\Admin\Egg; - -use Pterodactyl\Http\Requests\Admin\AdminFormRequest; - -class EggFormRequest extends AdminFormRequest -{ - /** - * {@inheritdoc} - */ - public function rules() - { - $rules = [ - 'name' => 'required|string|max:191', - 'description' => 'nullable|string', - 'docker_images' => 'required|string', - 'startup' => 'required|string', - 'config_from' => 'sometimes|bail|nullable|numeric', - 'config_stop' => 'required_without:config_from|nullable|string|max:191', - 'config_startup' => 'required_without:config_from|nullable|json', - 'config_logs' => 'required_without:config_from|nullable|json', - 'config_files' => 'required_without:config_from|nullable|json', - ]; - - if ($this->method() === 'POST') { - $rules['nest_id'] = 'required|numeric|exists:nests,id'; - } - - return $rules; - } - - /** - * @param \Illuminate\Contracts\Validation\Validator $validator - */ - public function withValidator($validator) - { - $validator->sometimes('config_from', 'exists:eggs,id', function () { - return (int) $this->input('config_from') !== 0; - }); - } -} diff --git a/app/Http/Requests/Admin/Egg/EggImportFormRequest.php b/app/Http/Requests/Admin/Egg/EggImportFormRequest.php deleted file mode 100644 index b6adb768e..000000000 --- a/app/Http/Requests/Admin/Egg/EggImportFormRequest.php +++ /dev/null @@ -1,31 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Requests\Admin\Egg; - -use Pterodactyl\Http\Requests\Admin\AdminFormRequest; - -class EggImportFormRequest extends AdminFormRequest -{ - /** - * @return array - */ - public function rules() - { - $rules = [ - 'import_file' => 'bail|required|file|max:1000|mimetypes:application/json,text/plain', - ]; - - if ($this->method() !== 'PUT') { - $rules['import_to_nest'] = 'bail|required|integer|exists:nests,id'; - } - - return $rules; - } -} diff --git a/app/Http/Requests/Admin/Egg/EggScriptFormRequest.php b/app/Http/Requests/Admin/Egg/EggScriptFormRequest.php deleted file mode 100644 index 3f522e96f..000000000 --- a/app/Http/Requests/Admin/Egg/EggScriptFormRequest.php +++ /dev/null @@ -1,31 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Requests\Admin\Egg; - -use Pterodactyl\Http\Requests\Admin\AdminFormRequest; - -class EggScriptFormRequest extends AdminFormRequest -{ - /** - * Return the rules to be used when validating the sent data in the request. - * - * @return array - */ - public function rules() - { - return [ - 'script_install' => 'sometimes|nullable|string', - 'script_is_privileged' => 'sometimes|required|boolean', - 'script_entry' => 'sometimes|required|string', - 'script_container' => 'sometimes|required|string', - 'copy_script_from' => 'sometimes|nullable|numeric', - ]; - } -} diff --git a/app/Http/Requests/Admin/Egg/EggVariableFormRequest.php b/app/Http/Requests/Admin/Egg/EggVariableFormRequest.php deleted file mode 100644 index d52fe94d2..000000000 --- a/app/Http/Requests/Admin/Egg/EggVariableFormRequest.php +++ /dev/null @@ -1,26 +0,0 @@ - 'required|string|min:1|max:191', - 'description' => 'sometimes|nullable|string', - 'env_variable' => 'required|regex:/^[\w]{1,191}$/|notIn:' . EggVariable::RESERVED_ENV_NAMES, - 'options' => 'sometimes|required|array', - 'rules' => 'bail|required|string', - 'default_value' => 'present', - ]; - } -} diff --git a/app/Http/Requests/Admin/LocationFormRequest.php b/app/Http/Requests/Admin/LocationFormRequest.php deleted file mode 100644 index 2ad202f9c..000000000 --- a/app/Http/Requests/Admin/LocationFormRequest.php +++ /dev/null @@ -1,29 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Requests\Admin; - -use Pterodactyl\Models\Location; - -class LocationFormRequest extends AdminFormRequest -{ - /** - * Setup the validation rules to use for these requests. - * - * @return array - */ - public function rules() - { - if ($this->method() === 'PATCH') { - return Location::getRulesForUpdate($this->route()->parameter('location')->id); - } - - return Location::getRules(); - } -} diff --git a/app/Http/Requests/Admin/MountFormRequest.php b/app/Http/Requests/Admin/MountFormRequest.php deleted file mode 100644 index bd94a633a..000000000 --- a/app/Http/Requests/Admin/MountFormRequest.php +++ /dev/null @@ -1,22 +0,0 @@ -method() === 'PATCH') { - return Mount::getRulesForUpdate($this->route()->parameter('mount')->id); - } - - return Mount::getRules(); - } -} diff --git a/app/Http/Requests/Admin/Nest/StoreNestFormRequest.php b/app/Http/Requests/Admin/Nest/StoreNestFormRequest.php deleted file mode 100644 index 2f01dfe9e..000000000 --- a/app/Http/Requests/Admin/Nest/StoreNestFormRequest.php +++ /dev/null @@ -1,26 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Requests\Admin\Nest; - -use Pterodactyl\Http\Requests\Admin\AdminFormRequest; - -class StoreNestFormRequest extends AdminFormRequest -{ - /** - * @return array - */ - public function rules() - { - return [ - 'name' => 'required|string|min:1|max:191', - 'description' => 'string|nullable', - ]; - } -} diff --git a/app/Http/Requests/Admin/Node/AllocationAliasFormRequest.php b/app/Http/Requests/Admin/Node/AllocationAliasFormRequest.php deleted file mode 100644 index 2552114ab..000000000 --- a/app/Http/Requests/Admin/Node/AllocationAliasFormRequest.php +++ /dev/null @@ -1,26 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Requests\Admin\Node; - -use Pterodactyl\Http\Requests\Admin\AdminFormRequest; - -class AllocationAliasFormRequest extends AdminFormRequest -{ - /** - * @return array - */ - public function rules() - { - return [ - 'alias' => 'present|nullable|string', - 'allocation_id' => 'required|numeric|exists:allocations,id', - ]; - } -} diff --git a/app/Http/Requests/Admin/Node/AllocationFormRequest.php b/app/Http/Requests/Admin/Node/AllocationFormRequest.php deleted file mode 100644 index 3c580c026..000000000 --- a/app/Http/Requests/Admin/Node/AllocationFormRequest.php +++ /dev/null @@ -1,27 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Requests\Admin\Node; - -use Pterodactyl\Http\Requests\Admin\AdminFormRequest; - -class AllocationFormRequest extends AdminFormRequest -{ - /** - * @return array - */ - public function rules() - { - return [ - 'allocation_ip' => 'required|string', - 'allocation_alias' => 'sometimes|nullable|string|max:191', - 'allocation_ports' => 'required|array', - ]; - } -} diff --git a/app/Http/Requests/Admin/Node/NodeFormRequest.php b/app/Http/Requests/Admin/Node/NodeFormRequest.php deleted file mode 100644 index caef04f9e..000000000 --- a/app/Http/Requests/Admin/Node/NodeFormRequest.php +++ /dev/null @@ -1,48 +0,0 @@ -. - * - * This software is licensed under the terms of the MIT license. - * https://opensource.org/licenses/MIT - */ - -namespace Pterodactyl\Http\Requests\Admin\Node; - -use Pterodactyl\Models\Node; -use Pterodactyl\Http\Requests\Admin\AdminFormRequest; - -class NodeFormRequest extends AdminFormRequest -{ - /** - * Get rules to apply to data in this request. - */ - public function rules() - { - if ($this->method() === 'PATCH') { - return Node::getRulesForUpdate($this->route()->parameter('node')); - } - - return Node::getRules(); - } - - /** - * Run validation after the rules above have been applied. - * - * @param \Illuminate\Validation\Validator $validator - */ - public function withValidator($validator) - { - $validator->after(function ($validator) { - // Check that the FQDN is a valid IP address. - if (! filter_var(gethostbyname($this->input('fqdn')), FILTER_VALIDATE_IP)) { - $validator->errors()->add('fqdn', trans('admin/node.validation.fqdn_not_resolvable')); - } - - // Check that if using HTTPS the FQDN is not an IP address. - if (filter_var($this->input('fqdn'), FILTER_VALIDATE_IP) && $this->input('scheme') === 'https') { - $validator->errors()->add('fqdn', trans('admin/node.validation.fqdn_required_for_ssl')); - } - }); - } -} diff --git a/app/Http/Requests/Admin/ServerFormRequest.php b/app/Http/Requests/Admin/ServerFormRequest.php deleted file mode 100644 index 585834224..000000000 --- a/app/Http/Requests/Admin/ServerFormRequest.php +++ /dev/null @@ -1,61 +0,0 @@ -after(function ($validator) { - $validator->sometimes('node_id', 'required|numeric|bail|exists:nodes,id', function ($input) { - return ! ($input->auto_deploy); - }); - - $validator->sometimes('allocation_id', [ - 'required', - 'numeric', - 'bail', - Rule::exists('allocations', 'id')->where(function ($query) { - $query->where('node_id', $this->input('node_id')); - $query->whereNull('server_id'); - }), - ], function ($input) { - return ! ($input->auto_deploy); - }); - - $validator->sometimes('allocation_additional.*', [ - 'sometimes', - 'required', - 'numeric', - Rule::exists('allocations', 'id')->where(function ($query) { - $query->where('node_id', $this->input('node_id')); - $query->whereNull('server_id'); - }), - ], function ($input) { - return ! ($input->auto_deploy); - }); - }); - } -} diff --git a/app/Http/Requests/Admin/Servers/Databases/StoreServerDatabaseRequest.php b/app/Http/Requests/Admin/Servers/Databases/StoreServerDatabaseRequest.php deleted file mode 100644 index 40a4b06bc..000000000 --- a/app/Http/Requests/Admin/Servers/Databases/StoreServerDatabaseRequest.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'required', - 'string', - 'min:1', - 'max:24', - Rule::unique('databases')->where(function (Builder $query) { - $query->where('database_host_id', $this->input('database_host_id') ?? 0); - }), - ], - 'max_connections' => 'nullable', - 'remote' => 'required|string|regex:/^[0-9%.]{1,15}$/', - 'database_host_id' => 'required|integer|exists:database_hosts,id', - ]; - } -} diff --git a/app/Http/Requests/Admin/Settings/AdvancedSettingsFormRequest.php b/app/Http/Requests/Admin/Settings/AdvancedSettingsFormRequest.php deleted file mode 100644 index e69bd9ba6..000000000 --- a/app/Http/Requests/Admin/Settings/AdvancedSettingsFormRequest.php +++ /dev/null @@ -1,44 +0,0 @@ - 'required|in:true,false', - 'recaptcha:secret_key' => 'required|string|max:191', - 'recaptcha:website_key' => 'required|string|max:191', - 'pterodactyl:guzzle:timeout' => 'required|integer|between:1,60', - 'pterodactyl:guzzle:connect_timeout' => 'required|integer|between:1,60', - 'pterodactyl:client_features:allocations:enabled' => 'required|in:true,false', - 'pterodactyl:client_features:allocations:range_start' => 'required|integer|between:1024,65535', - 'pterodactyl:client_features:allocations:range_end' => 'required|integer|between:1024,65535', - ]; - } - - /** - * @return array - */ - public function attributes() - { - return [ - 'recaptcha:enabled' => 'reCAPTCHA Enabled', - 'recaptcha:secret_key' => 'reCAPTCHA Secret Key', - 'recaptcha:website_key' => 'reCAPTCHA Website Key', - 'pterodactyl:guzzle:timeout' => 'HTTP Request Timeout', - 'pterodactyl:guzzle:connect_timeout' => 'HTTP Connection Timeout', - 'pterodactyl:client_features:allocations:enabled' => 'Auto Create Allocations Enabled', - 'pterodactyl:client_features:allocations:range_start' => 'Starting Port', - 'pterodactyl:client_features:allocations:range_end' => 'Ending Port', - ]; - } -} diff --git a/app/Http/Requests/Admin/Settings/BaseSettingsFormRequest.php b/app/Http/Requests/Admin/Settings/BaseSettingsFormRequest.php deleted file mode 100644 index 208c15b10..000000000 --- a/app/Http/Requests/Admin/Settings/BaseSettingsFormRequest.php +++ /dev/null @@ -1,38 +0,0 @@ - 'required|string|max:191', - 'pterodactyl:auth:2fa_required' => 'required|integer|in:0,1,2', - 'app:locale' => ['required', 'string', Rule::in(array_keys($this->getAvailableLanguages()))], - 'app:analytics' => 'nullable|string', - ]; - } - - /** - * @return array - */ - public function attributes() - { - return [ - 'app:name' => 'Company Name', - 'pterodactyl:auth:2fa_required' => 'Require 2-Factor Authentication', - 'app:locale' => 'Default Language', - 'app:analytics' => 'Google Analytics', - ]; - } -} diff --git a/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php b/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php deleted file mode 100644 index 728283af4..000000000 --- a/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php +++ /dev/null @@ -1,45 +0,0 @@ - 'required|string', - 'mail:port' => 'required|integer|between:1,65535', - 'mail:encryption' => ['present', Rule::in([null, 'tls', 'ssl'])], - 'mail:username' => 'nullable|string|max:191', - 'mail:password' => 'nullable|string|max:191', - 'mail:from:address' => 'required|string|email', - 'mail:from:name' => 'nullable|string|max:191', - ]; - } - - /** - * Override the default normalization function for this type of request - * as we need to accept empty values on the keys. - * - * @param array $only - * @return array - */ - public function normalize(array $only = null) - { - $keys = array_flip(array_keys($this->rules())); - - if (empty($this->input('mail:password'))) { - unset($keys['mail:password']); - } - - return $this->only(array_flip($keys)); - } -} diff --git a/app/Http/Requests/Admin/UserFormRequest.php b/app/Http/Requests/Admin/UserFormRequest.php deleted file mode 100644 index 4203e65d9..000000000 --- a/app/Http/Requests/Admin/UserFormRequest.php +++ /dev/null @@ -1,28 +0,0 @@ -route()->parameter('user')) - )->only([ - 'email', - 'username', - 'name_first', - 'name_last', - 'password', - 'language', - 'root_admin', - ])->toArray(); - } -} diff --git a/routes/admin.php b/routes/admin.php index e228d68d6..e215a12a1 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -5,166 +5,3 @@ use Illuminate\Support\Facades\Route; Route::get('/', 'BaseController@index')->name('admin.index')->fallback(); Route::get('/{react}', 'BaseController@index') ->where('react', '.+'); - -/* -|-------------------------------------------------------------------------- -| Location Controller Routes -|-------------------------------------------------------------------------- -| -| Endpoint: /admin/api -| -*/ -Route::group(['prefix' => 'api'], function () { - Route::post('/new', 'ApiController@store'); - - Route::delete('/revoke/{identifier}', 'ApiController@delete')->name('admin.api.delete'); -}); - -/* -|-------------------------------------------------------------------------- -| Location Controller Routes -|-------------------------------------------------------------------------- -| -| Endpoint: /admin/locations -| -*/ -Route::group(['prefix' => 'locations'], function () { - Route::post('/', 'LocationController@create'); - Route::patch('/view/{location}', 'LocationController@update'); -}); - -/* -|-------------------------------------------------------------------------- -| Database Controller Routes -|-------------------------------------------------------------------------- -| -| Endpoint: /admin/databases -| -*/ -Route::group(['prefix' => 'databases'], function () { - Route::post('/', 'DatabaseController@create'); - Route::patch('/view/{host}', 'DatabaseController@update'); - Route::delete('/view/{host}', 'DatabaseController@delete'); -}); - -/* -|-------------------------------------------------------------------------- -| Settings Controller Routes -|-------------------------------------------------------------------------- -| -| Endpoint: /admin/settings -| -*/ -Route::group(['prefix' => 'settings'], function () { - Route::patch('/', 'Settings\IndexController@update'); - Route::patch('/mail', 'Settings\MailController@update'); - Route::patch('/advanced', 'Settings\AdvancedController@update'); -}); - -/* -|-------------------------------------------------------------------------- -| User Controller Routes -|-------------------------------------------------------------------------- -| -| Endpoint: /admin/users -| -*/ -Route::group(['prefix' => 'users'], function () { - Route::post('/new', 'UserController@store'); - Route::patch('/view/{user}', 'UserController@update'); - - Route::delete('/view/{user}', 'UserController@delete'); -}); - -/* -|-------------------------------------------------------------------------- -| Server Controller Routes -|-------------------------------------------------------------------------- -| -| Endpoint: /admin/servers -| -*/ -Route::group(['prefix' => 'servers'], function () { - Route::post('/new', 'Servers\CreateServerController@store'); - Route::post('/view/{server}/build', 'ServersController@updateBuild'); - Route::post('/view/{server}/startup', 'ServersController@saveStartup'); - Route::post('/view/{server}/database', 'ServersController@newDatabase'); - Route::post('/view/{server}/mounts/{mount}', 'ServersController@addMount')->name('admin.servers.view.mounts.toggle'); - Route::post('/view/{server}/manage/toggle', 'ServersController@toggleInstall')->name('admin.servers.view.manage.toggle'); - Route::post('/view/{server}/manage/suspension', 'ServersController@manageSuspension')->name('admin.servers.view.manage.suspension'); - Route::post('/view/{server}/manage/reinstall', 'ServersController@reinstallServer')->name('admin.servers.view.manage.reinstall'); - Route::post('/view/{server}/manage/transfer', 'Servers\ServerTransferController@transfer')->name('admin.servers.view.manage.transfer'); - Route::post('/view/{server}/delete', 'ServersController@delete'); - - Route::patch('/view/{server}/details', 'ServersController@setDetails'); - Route::patch('/view/{server}/database', 'ServersController@resetDatabasePassword'); - - Route::delete('/view/{server}/database/{database}/delete', 'ServersController@deleteDatabase')->name('admin.servers.view.database.delete'); - Route::delete('/view/{server}/mounts/{mount}', 'ServersController@deleteMount'); -}); - -/* -|-------------------------------------------------------------------------- -| Node Controller Routes -|-------------------------------------------------------------------------- -| -| Endpoint: /admin/nodes -| -*/ -Route::group(['prefix' => 'nodes'], function () { - Route::post('/new', 'NodesController@store'); - Route::post('/view/{node}/allocation', 'NodesController@createAllocation'); - Route::post('/view/{node}/allocation/remove', 'NodesController@allocationRemoveBlock')->name('admin.nodes.view.allocation.removeBlock'); - Route::post('/view/{node}/allocation/alias', 'NodesController@allocationSetAlias')->name('admin.nodes.view.allocation.setAlias'); - - Route::patch('/view/{node}/settings', 'NodesController@updateSettings'); - - Route::delete('/view/{node}/delete', 'NodesController@delete')->name('admin.nodes.view.delete'); - Route::delete('/view/{node}/allocation/remove/{allocation}', 'NodesController@allocationRemoveSingle')->name('admin.nodes.view.allocation.removeSingle'); - Route::delete('/view/{node}/allocations', 'NodesController@allocationRemoveMultiple')->name('admin.nodes.view.allocation.removeMultiple'); -}); - -/* -|-------------------------------------------------------------------------- -| Mount Controller Routes -|-------------------------------------------------------------------------- -| -| Endpoint: /admin/mounts -| -*/ -Route::group(['prefix' => 'mounts'], function () { - Route::post('/', 'MountController@create'); - Route::post('/{mount}/eggs', 'MountController@addEggs')->name('admin.mounts.eggs'); - Route::post('/{mount}/nodes', 'MountController@addNodes')->name('admin.mounts.nodes'); - - Route::patch('/view/{mount}', 'MountController@update'); - - Route::delete('/{mount}/eggs/{egg_id}', 'MountController@deleteEgg'); - Route::delete('/{mount}/nodes/{node_id}', 'MountController@deleteNode'); -}); - -/* -|-------------------------------------------------------------------------- -| Nest Controller Routes -|-------------------------------------------------------------------------- -| -| Endpoint: /admin/nests -| -*/ -Route::group(['prefix' => 'nests'], function () { - Route::post('/new', 'Nests\NestController@store'); - Route::post('/import', 'Nests\EggShareController@import')->name('admin.nests.egg.import'); - Route::post('/egg/new', 'Nests\EggController@store'); - Route::post('/egg/{egg}/variables', 'Nests\EggVariableController@store'); - - Route::put('/egg/{egg}', 'Nests\EggShareController@update'); - - Route::patch('/view/{nest}', 'Nests\NestController@update'); - Route::patch('/egg/{egg}', 'Nests\EggController@update'); - Route::patch('/egg/{egg}/scripts', 'Nests\EggScriptController@update'); - Route::patch('/egg/{egg}/variables/{variable}', 'Nests\EggVariableController@update')->name('admin.nests.egg.variables.edit'); - - Route::delete('/view/{nest}', 'Nests\NestController@destroy'); - Route::delete('/egg/{egg}', 'Nests\EggController@destroy'); - Route::delete('/egg/{egg}/variables/{variable}', 'Nests\EggVariableController@destroy'); -});