Skip to content

Commit b7666bd

Browse files
committed
Basic initial subuser management
1 parent 57cf636 commit b7666bd

File tree

7 files changed

+381
-1
lines changed

7 files changed

+381
-1
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
namespace Pterodactyl\Http\Controllers\Server;
4+
5+
use DB;
6+
use Alert;
7+
use Pterodactyl\Models;
8+
9+
use Illuminate\Http\Request;
10+
use Pterodactyl\Http\Controllers\Controller;
11+
12+
class SubuserController extends Controller
13+
{
14+
15+
/**
16+
* Controller Constructor
17+
*
18+
* @return void
19+
*/
20+
public function __construct()
21+
{
22+
//
23+
}
24+
25+
public function getIndex(Request $request, $uuid)
26+
{
27+
$server = Models\Server::getByUUID($uuid);
28+
$this->authorize('list-subusers', $server);
29+
30+
return view('server.users.index', [
31+
'server' => $server,
32+
'node' => Models\Node::find($server->node),
33+
'subusers' => Models\Subuser::select('subusers.*', 'users.email as a_userEmail')
34+
->join('users', 'users.id', '=', 'subusers.user_id')
35+
->where('server_id', $server->id)
36+
->get()
37+
]);
38+
39+
}
40+
41+
public function getView(Request $request, $uuid, $id)
42+
{
43+
$server = Models\Server::getByUUID($uuid);
44+
$this->authorize('view-subuser', $server);
45+
46+
$subuser = Models\Subuser::select('subusers.*', 'users.email as a_userEmail')
47+
->join('users', 'users.id', '=', 'subusers.user_id')
48+
->where(DB::raw('md5(subusers.id)'), $id)->where('subusers.server_id', $server->id)
49+
->first();
50+
51+
if (!$subuser) {
52+
abort(404);
53+
}
54+
55+
$permissions = [];
56+
$modelPermissions = Models\Permission::select('permission')
57+
->where('user_id', $subuser->user_id)->where('server_id', $server->id)
58+
->get();
59+
60+
foreach($modelPermissions as &$perm) {
61+
$permissions[$perm->permission] = true;
62+
}
63+
64+
return view('server.users.view', [
65+
'server' => $server,
66+
'node' => Models\Node::find($server->node),
67+
'subuser' => $subuser,
68+
'permissions' => $permissions,
69+
]);
70+
}
71+
72+
public function postView(Request $request, $uuid, $id)
73+
{
74+
//
75+
}
76+
77+
}

app/Http/Routes/ServerRoutes.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,21 @@ public function map(Router $router) {
5252
'uses' => 'Server\AjaxController@postSaveFile'
5353
]);
5454

55+
// Sub-User Routes
56+
$router->get('users', [
57+
'as' => 'server.subusers',
58+
'uses' => 'Server\SubuserController@getIndex'
59+
]);
60+
61+
$router->get('users/view/{id}', [
62+
'as' => 'server.subusers.view',
63+
'uses' => 'Server\SubuserController@getView'
64+
]);
65+
66+
$router->post('users/view/{id}', [
67+
'uses' => 'Server\SubuserController@postView'
68+
]);
69+
5570
// Assorted AJAX Routes
5671
$router->group(['prefix' => 'ajax'], function ($server) use ($router) {
5772
// Returns Server Status
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php
2+
3+
namespace Pterodactyl\Repositories;
4+
5+
use DB;
6+
use Validator;
7+
8+
use Pterodactyl\Models;
9+
use Pterodactyl\Services\UuidService;
10+
11+
use Pterodactyl\Exceptions\DisplayValidationException;
12+
use Pterodactyl\Exceptions\DisplayException;
13+
14+
class UserRepository
15+
{
16+
17+
/**
18+
* Allowed permissions and their related daemon permission.
19+
* @var array
20+
*/
21+
protected $permissions = [
22+
// Power Permissions
23+
'power-start' => 's:power:start',
24+
'power-stop' => 's:power:stop',
25+
'power-restart' => 's:power:restart',
26+
'power-kill' => 's:power:kill',
27+
28+
// Commands
29+
'send-command' => 's:command',
30+
31+
// File Manager
32+
'list-files' => 's:files:get',
33+
'edit-file' => 's:files:read',
34+
'save-file' => 's:files:post',
35+
'create-file' => 's:files:post',
36+
'download-file' => null,
37+
'upload-file' => 's:files:upload',
38+
'delete-file' => 's:files:delete',
39+
40+
// Subusers
41+
'list-subusers' => null,
42+
'view-subuser' => null,
43+
'edit-subuser' => null,
44+
'create-subuser' => null,
45+
'delete-subuser' => null,
46+
47+
// Management
48+
'set-connection' => null,
49+
'view-sftp' => null,
50+
'reset-sftp' => 's:set-password'
51+
];
52+
53+
public function __construct()
54+
{
55+
//
56+
}
57+
58+
/**
59+
* Updates permissions for a given subuser.
60+
* @param integer $id The ID of the subuser row in MySQL. (Not the user ID)
61+
* @param array $data
62+
* @throws DisplayValidationException
63+
* @throws DisplayException
64+
* @return void
65+
*/
66+
public function update($id, array $data)
67+
{
68+
$validator = Validator::make($data, [
69+
'permissions' => 'required|array'
70+
]);
71+
72+
if ($validator->fails()) {
73+
throw new DisplayValidationException(json_encode($validator->all()));
74+
}
75+
76+
// @TODO the thing.
77+
78+
}

resources/views/layouts/master.blade.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
<link rel="stylesheet" href="{{ asset('css/animate.css') }}">
1111
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
1212
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert.min.css">
13+
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/fuelux/3.13.0/css/fuelux.min.css" />
1314
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
1415
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.min.js"></script>
1516
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.7/socket.io.min.js"></script>
1617
<script src="//cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert.min.js"></script>
18+
<script src="//cdnjs.cloudflare.com/ajax/libs/fuelux/3.13.0/js/fuelux.min.js"></script>
1719
<script src="{{ asset('js/admin.min.js') }}"></script>
1820
<script src="{{ asset('js/bootstrap-notify.min.js') }}"></script>
1921
<script>

resources/views/server/index.blade.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,10 +448,14 @@ function updatePlayerListVisibility(data) {
448448
data: JSON.stringify({ command: ccmd })
449449
}).fail(function (jqXHR) {
450450
console.error(jqXHR);
451+
var error = 'An error occured while trying to process this request.';
452+
if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {
453+
error = jqXHR.responseJSON.error;
454+
}
451455
swal({
452456
type: 'error',
453457
title: 'Whoops!',
454-
text: 'There was an error while attempting to process your request. Please try again.'
458+
text: error
455459
});
456460
}).done(function () {
457461
$('#ccmd').val('');
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
@extends('layouts.master')
2+
3+
@section('title')
4+
Viewing Subusers
5+
@endsection
6+
7+
@section('content')
8+
<div class="col-md-12">
9+
<h3 class="nopad">Manage Sub-Users</h3><hr />
10+
<table class="table table-bordered table-hover">
11+
<thead>
12+
<tr>
13+
<th>Email</th>
14+
<th>Created</th>
15+
<th>Modified</th>
16+
@can('view-subuser', $server)<th></th>@endcan
17+
@can('delete-subuser', $server)<th></th>@endcan
18+
</tr>
19+
</thead>
20+
<tbody>
21+
@foreach($subusers as $user)
22+
<tr>
23+
<td><code>{{ $user->a_userEmail }}</code></td>
24+
<td>{{ $user->created_at }}</td>
25+
<td>{{ $user->updated_at }}</td>
26+
@can('view-subuser', $server)<td class="text-center"><a href="{{ route('server.subusers.view', ['server' => $server->uuidShort, 'id' => md5($user->id)]) }}" class="text-success"><i class="fa fa-wrench"></i></a></td>@endcan
27+
@can('delete-subuser', $server)<td class="text-center"><a href="#/delete/{{ md5($user->id) }}" class="text-danger"><i class="fa fa-trash-o"></i></a></td>@endcan
28+
</tr>
29+
@endforeach
30+
</tbody>
31+
</table>
32+
</div>
33+
<script>
34+
$(document).ready(function () {
35+
$('.server-users').addClass('active');
36+
});
37+
</script>
38+
@endsection

0 commit comments

Comments
 (0)