Skip to content

Commit 57cf636

Browse files
committed
Update server policy definitions
1 parent 4f3629f commit 57cf636

File tree

3 files changed

+208
-85
lines changed

3 files changed

+208
-85
lines changed

app/Policies/ServerPolicy.php

Lines changed: 132 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,84 @@ public function power(User $user, Server $server)
6060
return $user->permissions()->server($server)->permission('power')->exists();
6161
}
6262

63+
/**
64+
* Check if user has permission to start a server.
65+
*
66+
* @param Pterodactyl\Models\User $user
67+
* @param Pterodactyl\Models\Server $server
68+
* @return boolean
69+
*/
70+
public function powerStart(User $user, Server $server)
71+
{
72+
if ($this->isOwner($user, $server)) {
73+
return true;
74+
}
75+
76+
return $user->permissions()->server($server)->permission('power-start')->exists();
77+
}
78+
79+
/**
80+
* Check if user has permission to stop a server.
81+
*
82+
* @param Pterodactyl\Models\User $user
83+
* @param Pterodactyl\Models\Server $server
84+
* @return boolean
85+
*/
86+
public function powerStop(User $user, Server $server)
87+
{
88+
if ($this->isOwner($user, $server)) {
89+
return true;
90+
}
91+
92+
return $user->permissions()->server($server)->permission('power-stop')->exists();
93+
}
94+
95+
/**
96+
* Check if user has permission to restart a server.
97+
*
98+
* @param Pterodactyl\Models\User $user
99+
* @param Pterodactyl\Models\Server $server
100+
* @return boolean
101+
*/
102+
public function powerRestart(User $user, Server $server)
103+
{
104+
if ($this->isOwner($user, $server)) {
105+
return true;
106+
}
107+
108+
return $user->permissions()->server($server)->permission('power-restart')->exists();
109+
}
110+
111+
/**
112+
* Check if user has permission to kill a server.
113+
*
114+
* @param Pterodactyl\Models\User $user
115+
* @param Pterodactyl\Models\Server $server
116+
* @return boolean
117+
*/
118+
public function powerKill(User $user, Server $server)
119+
{
120+
if ($this->isOwner($user, $server)) {
121+
return true;
122+
}
123+
124+
return $user->permissions()->server($server)->permission('power-kill')->exists();
125+
}
126+
63127
/**
64128
* Check if user has permission to run a command on a server.
65129
*
66130
* @param Pterodactyl\Models\User $user
67131
* @param Pterodactyl\Models\Server $server
68132
* @return boolean
69133
*/
70-
public function command(User $user, Server $server)
134+
public function sendCommand(User $user, Server $server)
71135
{
72136
if ($this->isOwner($user, $server)) {
73137
return true;
74138
}
75139

76-
return $user->permissions()->server($server)->permission('command')->exists();
140+
return $user->permissions()->server($server)->permission('send-command')->exists();
77141
}
78142

79143
/**
@@ -212,13 +276,77 @@ public function setConnection(User $user, Server $server)
212276
* @param Pterodactyl\Models\Server $server
213277
* @return boolean
214278
*/
215-
public function viewSubusers(User $user, Server $server)
279+
public function listSubusers(User $user, Server $server)
280+
{
281+
if ($this->isOwner($user, $server)) {
282+
return true;
283+
}
284+
285+
return $user->permissions()->server($server)->permission('list-subusers')->exists();
286+
}
287+
288+
/**
289+
* Check if user has permission to view specific subuser permissions.
290+
*
291+
* @param Pterodactyl\Models\User $user
292+
* @param Pterodactyl\Models\Server $server
293+
* @return boolean
294+
*/
295+
public function viewSubuser(User $user, Server $server)
296+
{
297+
if ($this->isOwner($user, $server)) {
298+
return true;
299+
}
300+
301+
return $user->permissions()->server($server)->permission('view-subuser')->exists();
302+
}
303+
304+
/**
305+
* Check if user has permission to edit a subuser.
306+
*
307+
* @param Pterodactyl\Models\User $user
308+
* @param Pterodactyl\Models\Server $server
309+
* @return boolean
310+
*/
311+
public function editSubuser(User $user, Server $server)
312+
{
313+
if ($this->isOwner($user, $server)) {
314+
return true;
315+
}
316+
317+
return $user->permissions()->server($server)->permission('edit-subuser')->exists();
318+
}
319+
320+
/**
321+
* Check if user has permission to delete a subuser.
322+
*
323+
* @param Pterodactyl\Models\User $user
324+
* @param Pterodactyl\Models\Server $server
325+
* @return boolean
326+
*/
327+
public function deleteSubuser(User $user, Server $server)
328+
{
329+
if ($this->isOwner($user, $server)) {
330+
return true;
331+
}
332+
333+
return $user->permissions()->server($server)->permission('delete-subuser')->exists();
334+
}
335+
336+
/**
337+
* Check if user has permission to edit a subuser.
338+
*
339+
* @param Pterodactyl\Models\User $user
340+
* @param Pterodactyl\Models\Server $server
341+
* @return boolean
342+
*/
343+
public function createSubuser(User $user, Server $server)
216344
{
217345
if ($this->isOwner($user, $server)) {
218346
return true;
219347
}
220348

221-
return $user->permissions()->server($server)->permission('view-subusers')->exists();
349+
return $user->permissions()->server($server)->permission('create-subuser')->exists();
222350
}
223351

224352
/**

resources/views/layouts/master.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@
194194
<a href="#" class="list-group-item list-group-item-heading"><strong>{{ trans('pagination.sidebar.server_controls') }}</strong></a>
195195
<a href="/server/{{ $server->uuidShort }}/" class="list-group-item server-index">{{ trans('pagination.sidebar.overview') }}</a>
196196
@can('list-files', $server)<a href="/server/{{ $server->uuidShort }}/files" class="list-group-item server-files">{{ trans('pagination.sidebar.files') }}</a>@endcan
197-
@can('view-subusers', $server)<a href="/server/{{ $server->uuidShort }}/users" class="list-group-item server-users">{{ trans('pagination.sidebar.subusers') }}</a>@endcan
197+
@can('list-subusers', $server)<a href="/server/{{ $server->uuidShort }}/users" class="list-group-item server-users">{{ trans('pagination.sidebar.subusers') }}</a>@endcan
198198
@can('view-manage', $server)<a href="/server/{{ $server->uuidShort }}/settings" class="list-group-item server-settings">{{ trans('pagination.sidebar.manage') }}</a>@endcan
199199
</div>
200200
@endif

resources/views/server/index.blade.php

Lines changed: 75 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,12 @@
4343
</div>
4444
<div class="col-md-6" style="text-align:center;">
4545
<hr />
46-
@can('power', $server)
47-
<button class="btn btn-success btn-sm disabled" data-attr="power" data-action="start">Start</button>
48-
<button class="btn btn-primary btn-sm disabled" data-attr="power" data-action="restart">Restart</button>
49-
<button class="btn btn-danger btn-sm disabled" data-attr="power" data-action="stop">Stop</button>
50-
<button class="btn btn-danger btn-sm disabled" data-attr="power" data-action="kill"><i class="fa fa-ban" data-toggle="tooltip" data-placement="top" title="Kill Running Process"></i></button>
51-
<button class="btn btn-primary btn-sm" data-toggle="modal" data-target="#pauseConsole" id="pause_console"><small><i class="fa fa-pause fa-fw"></i></small></button>
52-
<div id="pw_resp" style="display:none;margin-top: 15px;"></div>
53-
@endcan
46+
@can('power-start', $server)<button class="btn btn-success btn-sm disabled" data-attr="power" data-action="start">Start</button>@endcan
47+
@can('power-restart', $server)<button class="btn btn-primary btn-sm disabled" data-attr="power" data-action="restart">Restart</button>@endcan
48+
@can('power-stop', $server)<button class="btn btn-danger btn-sm disabled" data-attr="power" data-action="stop">Stop</button>@endcan
49+
@can('power-kill', $server)<button class="btn btn-danger btn-sm disabled" data-attr="power" data-action="kill"><i class="fa fa-ban" data-toggle="tooltip" data-placement="top" title="Kill Running Process"></i></button>@endcan
50+
<button class="btn btn-primary btn-sm" data-toggle="modal" data-target="#pauseConsole" id="pause_console"><small><i class="fa fa-pause fa-fw"></i></small></button>
51+
<div id="pw_resp" style="display:none;margin-top: 15px;"></div>
5452
</div>
5553
</div>
5654
<div class="row">
@@ -462,87 +460,84 @@ function updatePlayerListVisibility(data) {
462460
});
463461
});
464462
@endcan
465-
@can('power', $server)
466-
var can_run = true;
467-
function updateServerPowerControls (data) {
468-
469-
// Reset Console Data
470-
if (data === 2) {
471-
$('#live_console').val($('#live_console').val() + '\n --+ Server Detected as Booting + --\n');
472-
$('#live_console').scrollTop($('#live_console')[0].scrollHeight);
473-
}
463+
var can_run = true;
464+
function updateServerPowerControls (data) {
474465
475-
// Server is On or Starting
476-
if(data == 1 || data == 2) {
477-
$("#console_command").slideDown();
478-
$('[data-attr="power"][data-action="start"]').addClass('disabled');
479-
$('[data-attr="power"][data-action="stop"], [data-attr="power"][data-action="restart"]').removeClass('disabled');
480-
} else {
481-
$("#console_command").slideUp();
482-
$('[data-attr="power"][data-action="start"]').removeClass('disabled');
483-
$('[data-attr="power"][data-action="stop"], [data-attr="power"][data-action="restart"]').addClass('disabled');
484-
}
485-
486-
if(data !== 0) {
487-
$('[data-attr="power"][data-action="kill"]').removeClass('disabled');
488-
} else {
489-
$('[data-attr="power"][data-action="kill"]').addClass('disabled');
490-
}
466+
// Reset Console Data
467+
if (data === 2) {
468+
$('#live_console').val($('#live_console').val() + '\n --+ Server Detected as Booting + --\n');
469+
$('#live_console').scrollTop($('#live_console')[0].scrollHeight);
470+
}
491471
472+
// Server is On or Starting
473+
if(data == 1 || data == 2) {
474+
$("#console_command").slideDown();
475+
$('[data-attr="power"][data-action="start"]').addClass('disabled');
476+
$('[data-attr="power"][data-action="stop"], [data-attr="power"][data-action="restart"]').removeClass('disabled');
477+
} else {
478+
$("#console_command").slideUp();
479+
$('[data-attr="power"][data-action="start"]').removeClass('disabled');
480+
$('[data-attr="power"][data-action="stop"], [data-attr="power"][data-action="restart"]').addClass('disabled');
492481
}
493482
494-
$('[data-attr="power"]').click(function (event) {
495-
event.preventDefault();
496-
var action = $(this).data('action');
497-
var killConfirm = false;
498-
if (action === 'kill') {
499-
swal({
500-
type: 'warning',
501-
title: '',
502-
text: 'This operation will not save your server data gracefully. You should only use this if your server is failing to respond to normal stop commands.',
503-
showCancelButton: true,
504-
allowOutsideClick: true,
505-
closeOnConfirm: true,
506-
confirmButtonText: 'Kill Server',
507-
confirmButtonColor: '#d9534f'
508-
}, function () {
509-
setTimeout(function() {
510-
powerToggleServer('kill');
511-
}, 100);
512-
});
513-
} else {
514-
powerToggleServer(action);
515-
}
483+
if(data !== 0) {
484+
$('[data-attr="power"][data-action="kill"]').removeClass('disabled');
485+
} else {
486+
$('[data-attr="power"][data-action="kill"]').addClass('disabled');
487+
}
516488
517-
});
489+
}
518490
519-
function powerToggleServer(action) {
520-
$.ajax({
521-
type: 'PUT',
522-
headers: {
523-
'X-Access-Token': '{{ $server->daemonSecret }}',
524-
'X-Access-Server': '{{ $server->uuid }}'
525-
},
526-
contentType: 'application/json; charset=utf-8',
527-
data: JSON.stringify({
528-
action: action
529-
}),
530-
url: '{{ $node->scheme }}://{{ $node->fqdn }}:{{ $node->daemonListen }}/server/power',
531-
timeout: 10000
532-
}).fail(function(jqXHR) {
533-
var error = 'An error occured while trying to process this request.';
534-
if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {
535-
error = jqXHR.responseJSON.error;
536-
}
537-
swal({
538-
type: 'error',
539-
title: 'Whoops!',
540-
text: error
541-
});
491+
$('[data-attr="power"]').click(function (event) {
492+
event.preventDefault();
493+
var action = $(this).data('action');
494+
var killConfirm = false;
495+
if (action === 'kill') {
496+
swal({
497+
type: 'warning',
498+
title: '',
499+
text: 'This operation will not save your server data gracefully. You should only use this if your server is failing to respond to normal stop commands.',
500+
showCancelButton: true,
501+
allowOutsideClick: true,
502+
closeOnConfirm: true,
503+
confirmButtonText: 'Kill Server',
504+
confirmButtonColor: '#d9534f'
505+
}, function () {
506+
setTimeout(function() {
507+
powerToggleServer('kill');
508+
}, 100);
542509
});
510+
} else {
511+
powerToggleServer(action);
543512
}
544513
545-
@endcan
514+
});
515+
516+
function powerToggleServer(action) {
517+
$.ajax({
518+
type: 'PUT',
519+
headers: {
520+
'X-Access-Token': '{{ $server->daemonSecret }}',
521+
'X-Access-Server': '{{ $server->uuid }}'
522+
},
523+
contentType: 'application/json; charset=utf-8',
524+
data: JSON.stringify({
525+
action: action
526+
}),
527+
url: '{{ $node->scheme }}://{{ $node->fqdn }}:{{ $node->daemonListen }}/server/power',
528+
timeout: 10000
529+
}).fail(function(jqXHR) {
530+
var error = 'An error occured while trying to process this request.';
531+
if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {
532+
error = jqXHR.responseJSON.error;
533+
}
534+
swal({
535+
type: 'error',
536+
title: 'Whoops!',
537+
text: error
538+
});
539+
});
540+
}
546541
});
547542
548543
$(document).ready(function () {

0 commit comments

Comments
 (0)