Skip to content

Commit 9c9d33c

Browse files
committed
Merge pull request pterodactyl#13 from DDynamic/development
Account Creation in AdminCP
2 parents 316e8a0 + 3d80c5b commit 9c9d33c

File tree

5 files changed

+136
-3
lines changed

5 files changed

+136
-3
lines changed

app/Http/Controllers/Admin/AccountsController.php

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
namespace Pterodactyl\Http\Controllers\Admin;
44

5+
use Alert;
56
use Debugbar;
6-
use Pterodactyl\Models\User;
7+
use Hash;
8+
use Uuid;
79

10+
use Pterodactyl\Models\User;
811
use Pterodactyl\Http\Controllers\Controller;
912
use Illuminate\Http\Request;
1013

@@ -32,12 +35,35 @@ public function getIndex(Request $request)
3235

3336
public function getNew(Request $request)
3437
{
35-
//
38+
return view('admin.accounts.new');
3639
}
3740

3841
public function getView(Request $request, $id)
3942
{
4043
//
4144
}
4245

46+
public function postNew(Request $request)
47+
{
48+
$this->validate($request, [
49+
'username' => 'required|min:4|unique:users,username',
50+
'email' => 'required|email|unique:users,email',
51+
'password' => 'required|confirmed|regex:((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,})',
52+
'password_confirmation' => 'required'
53+
]);
54+
55+
//@TODO: re-generate UUID if conflict
56+
$user = new User;
57+
$user->uuid = Uuid::generate(4);
58+
59+
$user->username = $request->input('username');
60+
$user->email = $request->input('email');
61+
$user->password = Hash::make($request->input('password'));
62+
63+
$user->save();
64+
65+
Alert::success('Account has been successfully created.')->flash();
66+
return redirect()->route('admin.accounts.view', ['id' => $user->id]);
67+
}
68+
4369
}

app/Http/Controllers/Base/IndexController.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@ public function getIndex(Request $request)
4141
]);
4242
}
4343

44+
/**
45+
* Generate a random string.
46+
*
47+
* @param \Illuminate\Http\Request $request
48+
* @return string
49+
*/
50+
public function getPassword(Request $request, $length = 16)
51+
{
52+
$length = ($length < 8) ? 8 : $length;
53+
return str_random($length);
54+
}
55+
4456
/**
4557
* Returns TOTP Management Page.
4658
*

app/Http/Routes/AdminRoutes.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ public function map(Router $router) {
1313
// Account Routes
1414
$router->group(['prefix' => 'accounts'], function ($server) use ($router) {
1515
$router->get('/', [ 'as' => 'admin.accounts', 'uses' => 'Admin\AccountsController@getIndex' ]);
16-
$router->get('/new', [ 'as' => 'admin.accounts.new', 'uses' => 'Admin\AccountsController@getNew' ]);
1716
$router->get('/view/{id}', [ 'as' => 'admin.accounts.view', 'uses' => 'Admin\AccountsController@getView' ]);
17+
18+
$router->get('/new', [ 'as' => 'admin.accounts.new', 'uses' => 'Admin\AccountsController@getNew' ]);
19+
$router->post('/new', [ 'as' => 'admin.accounts.new', 'uses' => 'Admin\AccountsController@postNew' ]);
1820
});
1921

2022
// Server Routes

app/Http/Routes/BaseRoutes.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ public function map(Router $router) {
1414
return redirect()->route('index');
1515
});
1616

17+
// Password Generation
18+
$router->get('/password-gen/{length}', [ 'as' => 'password-gen', 'uses' => 'Base\IndexController@getPassword' ]);
19+
1720
// Account Routes
1821
$router->get('/account', [ 'as' => 'account', 'uses' => 'Base\IndexController@getAccount' ]);
1922
$router->post('/account/password', [ 'uses' => 'Base\IndexController@postAccountPassword' ]);
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
@extends('layouts.admin')
2+
3+
@section('title')
4+
New Account
5+
@endsection
6+
7+
@section('content')
8+
<div class="col-md-9">
9+
<ul class="breadcrumb">
10+
<li><a href="/admin">Admin Controls</a></li>
11+
<li><a href="/admin/accounts">Accounts</a></li>
12+
<li class="active">Add New Account</li>
13+
</ul>
14+
@if (count($errors) > 0)
15+
<div class="alert alert-danger">
16+
<strong>{{ trans('strings.whoops') }}!</strong> {{ trans('auth.errorencountered') }}<br><br>
17+
<ul>
18+
@foreach ($errors->all() as $error)
19+
<li>{{ $error }}</li>
20+
@endforeach
21+
</ul>
22+
</div>
23+
@endif
24+
<h3>Create New Account</h3><hr />
25+
<form action="new" method="post">
26+
<fieldset>
27+
<div class="form-group">
28+
<label for="username" class="control-label">Username</label>
29+
<div>
30+
<input type="text" autocomplete="off" name="username" class="form-control" />
31+
</div>
32+
</div>
33+
<div class="form-group">
34+
<label for="email" class="control-label">Email</label>
35+
<div>
36+
<input type="text" autocomplete="off" name="email" class="form-control" />
37+
</div>
38+
</div>
39+
<div class="row">
40+
<div class="col-md-12">
41+
<div id="gen_pass" class=" alert alert-success" style="display:none;margin-bottom: 10px;"></div>
42+
</div>
43+
<div class="form-group col-md-6">
44+
<label for="pass" class="control-label">Password</label>
45+
<div>
46+
<input type="password" name="password" class="form-control" />
47+
</div>
48+
</div>
49+
<div class="form-group col-md-6">
50+
<label for="pass_2" class="control-label">Password Again</label>
51+
<div>
52+
<input type="password" name="password_confirmation" class="form-control" />
53+
</div>
54+
</div>
55+
</div>
56+
<div class="form-group">
57+
<div>
58+
{!! csrf_field() !!}
59+
<button class="btn btn-primary btn-sm" type="submit">Create Account</button>
60+
<button class="btn btn-default btn-sm" id="gen_pass_bttn" type="button">Generate Password</button>
61+
</div>
62+
</div>
63+
</fieldset>
64+
</form>
65+
</div>
66+
<script>
67+
$(document).ready(function(){
68+
$("#sidebar_links").find("a[href='/admin/account/new']").addClass('active');
69+
$("#gen_pass_bttn").click(function(e){
70+
e.preventDefault();
71+
$.ajax({
72+
type: "GET",
73+
url: "/password-gen/12",
74+
headers: {
75+
'X-CSRF-TOKEN': '{{ csrf_token() }}'
76+
},
77+
success: function(data) {
78+
$("#gen_pass").html('<strong>Generated Password:</strong> ' + data).slideDown();
79+
$('input[name="password"], input[name="password_confirmation"]').val(data);
80+
return false;
81+
}
82+
});
83+
return false;
84+
});
85+
});
86+
$(document).ready(function () {
87+
$('#sidebar_links').find("a[href='/admin/accounts']").addClass('active');
88+
});
89+
</script>
90+
@endsection

0 commit comments

Comments
 (0)