165 lines
6 KiB
PHP
165 lines
6 KiB
PHP
<?php
|
|
|
|
namespace Pterodactyl\Http\Controllers\Server;
|
|
|
|
use Illuminate\View\View;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Response;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Prologue\Alerts\AlertsMessageBag;
|
|
use Pterodactyl\Http\Controllers\Controller;
|
|
use Pterodactyl\Traits\Controllers\JavascriptInjection;
|
|
use Pterodactyl\Services\Databases\DatabasePasswordService;
|
|
use Pterodactyl\Services\Databases\DatabaseManagementService;
|
|
use Pterodactyl\Services\Databases\DeployServerDatabaseService;
|
|
use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface;
|
|
use Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface;
|
|
use Pterodactyl\Http\Requests\Server\Database\StoreServerDatabaseRequest;
|
|
use Pterodactyl\Http\Requests\Server\Database\DeleteServerDatabaseRequest;
|
|
|
|
class DatabaseController extends Controller
|
|
{
|
|
use JavascriptInjection;
|
|
|
|
/**
|
|
* @var \Prologue\Alerts\AlertsMessageBag
|
|
*/
|
|
private $alert;
|
|
|
|
/**
|
|
* @var \Pterodactyl\Services\Databases\DeployServerDatabaseService
|
|
*/
|
|
private $deployServerDatabaseService;
|
|
|
|
/**
|
|
* @var \Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface
|
|
*/
|
|
private $databaseHostRepository;
|
|
|
|
/**
|
|
* @var \Pterodactyl\Services\Databases\DatabaseManagementService
|
|
*/
|
|
private $managementService;
|
|
|
|
/**
|
|
* @var \Pterodactyl\Services\Databases\DatabasePasswordService
|
|
*/
|
|
private $passwordService;
|
|
|
|
/**
|
|
* @var \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface
|
|
*/
|
|
private $repository;
|
|
|
|
/**
|
|
* DatabaseController constructor.
|
|
*
|
|
* @param \Prologue\Alerts\AlertsMessageBag $alert
|
|
* @param \Pterodactyl\Services\Databases\DeployServerDatabaseService $deployServerDatabaseService
|
|
* @param \Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface $databaseHostRepository
|
|
* @param \Pterodactyl\Services\Databases\DatabaseManagementService $managementService
|
|
* @param \Pterodactyl\Services\Databases\DatabasePasswordService $passwordService
|
|
* @param \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface $repository
|
|
*/
|
|
public function __construct(
|
|
AlertsMessageBag $alert,
|
|
DeployServerDatabaseService $deployServerDatabaseService,
|
|
DatabaseHostRepositoryInterface $databaseHostRepository,
|
|
DatabaseManagementService $managementService,
|
|
DatabasePasswordService $passwordService,
|
|
DatabaseRepositoryInterface $repository
|
|
) {
|
|
$this->alert = $alert;
|
|
$this->databaseHostRepository = $databaseHostRepository;
|
|
$this->deployServerDatabaseService = $deployServerDatabaseService;
|
|
$this->managementService = $managementService;
|
|
$this->passwordService = $passwordService;
|
|
$this->repository = $repository;
|
|
}
|
|
|
|
/**
|
|
* Render the database listing for a server.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\View\View
|
|
*
|
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
|
*/
|
|
public function index(Request $request): View
|
|
{
|
|
$server = $request->attributes->get('server');
|
|
$this->authorize('view-databases', $server);
|
|
$this->setRequest($request)->injectJavascript();
|
|
|
|
$canCreateDatabase = config('pterodactyl.client_features.databases.enabled');
|
|
$allowRandom = config('pterodactyl.client_features.databases.allow_random');
|
|
|
|
if ($this->databaseHostRepository->findCountWhere([['node_id', '=', $server->node_id]]) === 0) {
|
|
if ($canCreateDatabase && ! $allowRandom) {
|
|
$canCreateDatabase = false;
|
|
}
|
|
}
|
|
|
|
$databases = $this->repository->getDatabasesForServer($server->id);
|
|
|
|
return view('server.databases.index', [
|
|
'allowCreation' => $canCreateDatabase,
|
|
'overLimit' => ! is_null($server->database_limit) && count($databases) >= $server->database_limit,
|
|
'databases' => $databases,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Handle a request from a user to create a new database for the server.
|
|
*
|
|
* @param \Pterodactyl\Http\Requests\Server\Database\StoreServerDatabaseRequest $request
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*
|
|
* @throws \Exception
|
|
* @throws \Pterodactyl\Exceptions\Service\Database\DatabaseClientFeatureNotEnabledException
|
|
*/
|
|
public function store(StoreServerDatabaseRequest $request): RedirectResponse
|
|
{
|
|
$this->deployServerDatabaseService->handle($request->getServer(), $request->validated());
|
|
|
|
$this->alert->success('Successfully created a new database.')->flash();
|
|
|
|
return redirect()->route('server.databases.index', $request->getServer()->uuidShort);
|
|
}
|
|
|
|
/**
|
|
* Handle a request to update the password for a specific database.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*
|
|
* @throws \Illuminate\Auth\Access\AuthorizationException
|
|
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
|
|
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
|
*/
|
|
public function update(Request $request): JsonResponse
|
|
{
|
|
$this->authorize('reset-db-password', $request->attributes->get('server'));
|
|
|
|
$password = str_random(20);
|
|
$this->passwordService->handle($request->attributes->get('database'), $password);
|
|
|
|
return response()->json(['password' => $password]);
|
|
}
|
|
|
|
/**
|
|
* Delete a database for this server from the SQL server and Panel database.
|
|
*
|
|
* @param \Pterodactyl\Http\Requests\Server\Database\DeleteServerDatabaseRequest $request
|
|
* @return \Illuminate\Http\Response
|
|
*
|
|
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
|
*/
|
|
public function delete(DeleteServerDatabaseRequest $request): Response
|
|
{
|
|
$this->managementService->delete($request->attributes->get('database')->id);
|
|
|
|
return response('', Response::HTTP_NO_CONTENT);
|
|
}
|
|
}
|