Skip to content

Commit bcb6960

Browse files
committed
Add support for user management of databases
1 parent aaccf38 commit bcb6960

File tree

9 files changed

+132
-7
lines changed

9 files changed

+132
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ This project follows [Semantic Versioning](http://semver.org) guidelines.
1818
* Adds back client API for sending commands or power toggles to a server though the Panel API: `/api/client/servers/<identifier>`
1919
* Added proper transformer for Packs and re-enabled missing includes on server.
2020
* Added support for using Filesystem as a caching driver, although not recommended.
21+
* Added support for user management of server databases.
2122

2223
## v0.7.3 (Derelict Dermodactylus)
2324
### Fixed

app/Http/Controllers/Server/DatabaseController.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@
44

55
use Illuminate\View\View;
66
use Illuminate\Http\Request;
7+
use Illuminate\Http\Response;
78
use Illuminate\Http\JsonResponse;
89
use Illuminate\Http\RedirectResponse;
910
use Prologue\Alerts\AlertsMessageBag;
1011
use Pterodactyl\Http\Controllers\Controller;
1112
use Pterodactyl\Traits\Controllers\JavascriptInjection;
1213
use Pterodactyl\Services\Databases\DatabasePasswordService;
14+
use Pterodactyl\Services\Databases\DatabaseManagementService;
1315
use Pterodactyl\Services\Databases\DeployServerDatabaseService;
1416
use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface;
1517
use Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface;
1618
use Pterodactyl\Http\Requests\Server\Database\StoreServerDatabaseRequest;
19+
use Pterodactyl\Http\Requests\Server\Database\DeleteServerDatabaseRequest;
1720

1821
class DatabaseController extends Controller
1922
{
@@ -34,6 +37,11 @@ class DatabaseController extends Controller
3437
*/
3538
private $databaseHostRepository;
3639

40+
/**
41+
* @var \Pterodactyl\Services\Databases\DatabaseManagementService
42+
*/
43+
private $managementService;
44+
3745
/**
3846
* @var \Pterodactyl\Services\Databases\DatabasePasswordService
3947
*/
@@ -50,19 +58,22 @@ class DatabaseController extends Controller
5058
* @param \Prologue\Alerts\AlertsMessageBag $alert
5159
* @param \Pterodactyl\Services\Databases\DeployServerDatabaseService $deployServerDatabaseService
5260
* @param \Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface $databaseHostRepository
61+
* @param \Pterodactyl\Services\Databases\DatabaseManagementService $managementService
5362
* @param \Pterodactyl\Services\Databases\DatabasePasswordService $passwordService
5463
* @param \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface $repository
5564
*/
5665
public function __construct(
5766
AlertsMessageBag $alert,
5867
DeployServerDatabaseService $deployServerDatabaseService,
5968
DatabaseHostRepositoryInterface $databaseHostRepository,
69+
DatabaseManagementService $managementService,
6070
DatabasePasswordService $passwordService,
6171
DatabaseRepositoryInterface $repository
6272
) {
6373
$this->alert = $alert;
6474
$this->databaseHostRepository = $databaseHostRepository;
6575
$this->deployServerDatabaseService = $deployServerDatabaseService;
76+
$this->managementService = $managementService;
6677
$this->passwordService = $passwordService;
6778
$this->repository = $repository;
6879
}
@@ -136,4 +147,19 @@ public function update(Request $request): JsonResponse
136147

137148
return response()->json(['password' => $password]);
138149
}
150+
151+
/**
152+
* Delete a database for this server from the SQL server and Panel database.
153+
*
154+
* @param \Pterodactyl\Http\Requests\Server\Database\DeleteServerDatabaseRequest $request
155+
* @return \Illuminate\Http\Response
156+
*
157+
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
158+
*/
159+
public function delete(DeleteServerDatabaseRequest $request): Response
160+
{
161+
$this->managementService->delete($request->attributes->get('database')->id);
162+
163+
return response('', Response::HTTP_NO_CONTENT);
164+
}
139165
}

app/Http/Middleware/Server/DatabaseBelongsToServer.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,13 @@ public function __construct(DatabaseRepositoryInterface $repository)
3838
public function handle(Request $request, Closure $next)
3939
{
4040
$server = $request->attributes->get('server');
41+
$database = $request->input('database') ?? $request->route()->parameter('database');
4142

42-
$database = $this->repository->find($request->input('database'));
43+
if (! is_digit($database)) {
44+
throw new NotFoundHttpException;
45+
}
46+
47+
$database = $this->repository->find($database);
4348
if (is_null($database) || $database->server_id !== $server->id) {
4449
throw new NotFoundHttpException;
4550
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace Pterodactyl\Http\Requests\Server\Database;
4+
5+
use Pterodactyl\Http\Requests\Server\ServerFormRequest;
6+
7+
class DeleteServerDatabaseRequest extends ServerFormRequest
8+
{
9+
/**
10+
* @return bool
11+
*/
12+
public function authorize()
13+
{
14+
if (! parent::authorize()) {
15+
return false;
16+
}
17+
18+
return config('pterodactyl.client_features.databases.enabled');
19+
}
20+
21+
/**
22+
* Return the user permission to validate this request aganist.
23+
*
24+
* @return string
25+
*/
26+
protected function permission(): string
27+
{
28+
return 'delete-database';
29+
}
30+
31+
/**
32+
* Rules to validate this request aganist.
33+
*
34+
* @return array
35+
*/
36+
public function rules()
37+
{
38+
return [];
39+
}
40+
}

app/Models/Permission.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ class Permission extends Model implements CleansAttributes, ValidableContract
9393
'database' => [
9494
'view-databases' => null,
9595
'reset-db-password' => null,
96+
'delete-database' => null,
97+
'create-database' => null,
9698
],
9799
'file' => [
98100
'access-sftp' => null,

public/js/laroute.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

resources/lang/en/server.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,14 @@
248248
'title' => 'Reset Database Password',
249249
'description' => 'Allows a user to reset passwords for databases.',
250250
],
251+
'delete_database' => [
252+
'title' => 'Delete Databases',
253+
'description' => 'Allows a user to delete databases for this server from the Panel.',
254+
],
255+
'create_database' => [
256+
'title' => 'Create Database',
257+
'description' => 'Allows a user to create additional databases for this server.',
258+
],
251259
],
252260
],
253261
'files' => [

resources/themes/pterodactyl/server/databases/index.blade.php

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
@section('content')
2323
<div class="row">
24-
<div class="{{ $allowCreation ? 'col-xs-12 col-sm-8' : 'col-xs-12' }}">
24+
<div class="{{ $allowCreation && Gate::allows('create-database', $server) ? 'col-xs-12 col-sm-8' : 'col-xs-12' }}">
2525
<div class="box">
2626
<div class="box-header with-border">
2727
<h3 class="box-title">@lang('server.config.database.your_dbs')</h3>
@@ -50,11 +50,20 @@
5050
</code>
5151
</td>
5252
<td class="middle"><code>{{ $database->host->host }}:{{ $database->host->port }}</code></td>
53-
@can('reset-db-password', $server)
53+
@if(Gate::allows('reset-db-password', $server) || Gate::allows('delete-database', $server))
5454
<td>
55-
<button class="btn btn-xs btn-primary pull-right" data-action="reset-password" data-id="{{ $database->id }}"><i class="fa fa-fw fa-refresh"></i> @lang('server.config.database.reset_password')</button>
55+
@can('delete-database', $server)
56+
<button class="btn btn-xs btn-danger pull-right" data-action="delete-database" data-id="{{ $database->id }}">
57+
<i class="fa fa-fw fa-trash-o"></i>
58+
</button>
59+
@endcan
60+
@can('reset-db-password', $server)
61+
<button class="btn btn-xs btn-primary pull-right" style="margin-right:10px;" data-action="reset-password" data-id="{{ $database->id }}">
62+
<i class="fa fa-fw fa-refresh"></i> @lang('server.config.database.reset_password')
63+
</button>
64+
@endcan
5665
</td>
57-
@endcan
66+
@endif
5867
</tr>
5968
@endforeach
6069
</tbody>
@@ -69,7 +78,7 @@
6978
@endif
7079
</div>
7180
</div>
72-
@if($allowCreation)
81+
@if($allowCreation && Gate::allows('create-database', $server))
7382
<div class="col-xs-12 col-sm-4">
7483
<div class="box box-success">
7584
<div class="box-header with-border">
@@ -153,5 +162,37 @@
153162
});
154163
});
155164
@endcan
165+
@can('delete-database', $server)
166+
$('[data-action="delete-database"]').click(function (event) {
167+
event.preventDefault();
168+
var self = $(this);
169+
swal({
170+
title: '',
171+
type: 'warning',
172+
text: 'Are you sure that you want to delete this database? There is no going back, all data will immediately be removed.',
173+
showCancelButton: true,
174+
confirmButtonText: 'Delete',
175+
confirmButtonColor: '#d9534f',
176+
closeOnConfirm: false,
177+
showLoaderOnConfirm: true,
178+
}, function () {
179+
$.ajax({
180+
method: 'DELETE',
181+
url: Router.route('server.databases.delete', { server: '{{ $server->uuidShort }}', database: self.data('id') }),
182+
headers: { 'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content') },
183+
}).done(function () {
184+
self.parent().parent().slideUp();
185+
swal.close();
186+
}).fail(function (jqXHR) {
187+
console.error(jqXHR);
188+
swal({
189+
type: 'error',
190+
title: 'Whoops!',
191+
text: (typeof jqXHR.responseJSON.error !== 'undefined') ? jqXHR.responseJSON.error : 'An error occured while processing this request.'
192+
});
193+
});
194+
});
195+
});
196+
@endcan
156197
</script>
157198
@endsection

routes/server.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
Route::post('/new', 'DatabaseController@store')->name('server.databases.new');
4242

4343
Route::patch('/password', 'DatabaseController@update')->middleware('server..database')->name('server.databases.password');
44+
45+
Route::delete('/delete/{database}', 'DatabaseController@delete')->middleware('server..database')->name('server.databases.delete');
4446
});
4547

4648
/*

0 commit comments

Comments
 (0)