diff --git a/README.md b/README.md index 88840fe1..fa5c37f2 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,8 @@ ![controlpanel](https://user-images.githubusercontent.com/45005889/123518824-06b05000-d6a8-11eb-91b9-d1ed36bd2317.png) -[//]: ![](https://img.shields.io/endpoint?style=flat&url=https%3A%2F%2Fmarket.controlpanel.gg%2Fcallhome.php%3Fgetinstalls) +![](https://img.shields.io/endpoint?label=v0.8%20Installations&url=https%3A%2F%2Fmarket.controlpanel.gg%2Fcallhome.php%3Fgetinstalls) +![](https://img.shields.io/badge/Overall%20Installations-2500%2B-green) ![](https://img.shields.io/github/stars/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/forks/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/tag/ControlPanel-gg/dashboard) [![Crowdin](https://badges.crowdin.net/controlpanelgg/localized.svg)](https://crowdin.com/project/controlpanelgg) ![](https://img.shields.io/github/issues/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/license/ControlPanel-gg/dashboard) ![](https://img.shields.io/discord/787829714483019826) ## About diff --git a/app/Classes/Pterodactyl.php b/app/Classes/Pterodactyl.php index f217bd34..a7bc9bd5 100644 --- a/app/Classes/Pterodactyl.php +++ b/app/Classes/Pterodactyl.php @@ -312,7 +312,7 @@ class Pterodactyl * Update Server Resources * @param Server $server * @param Product $product - * @return boolean + * @return Response */ public static function updateServer(Server $server, Product $product) { @@ -335,7 +335,7 @@ class Pterodactyl * Power Action Specific Server * @param Server $server * @param string $action - * @return boolean + * @return Response */ public static function powerAction(Server $server, $action) { diff --git a/app/Classes/Settings/System.php b/app/Classes/Settings/System.php index 63266ad4..22fed19e 100644 --- a/app/Classes/Settings/System.php +++ b/app/Classes/Settings/System.php @@ -43,8 +43,17 @@ public function checkPteroClientkey(){ "pterodactyl-api-key" => "required|string", "pterodactyl-url" => "required|string", "pterodactyl-admin-api-key" => "required|string", + "enable-upgrades" => "string", ]); + + $validator->after(function ($validator) use ($request) { + // if enable-recaptcha is true then recaptcha-site-key and recaptcha-secret-key must be set + if ($request->get('enable-upgrades') == 'true' && (!$request->get('pterodactyl-admin-api-key'))) { + $validator->errors()->add('pterodactyl-admin-api-key', 'The admin api key is required when upgrades are enabled.'); + } + }); + if ($validator->fails()) { return redirect(route('admin.settings.index') . '#system')->with('error', __('System settings have not been updated!'))->withErrors($validator) ->withInput(); @@ -73,6 +82,7 @@ public function checkPteroClientkey(){ "SETTINGS::SYSTEM:PTERODACTYL:TOKEN" => "pterodactyl-api-key", "SETTINGS::SYSTEM:ENABLE_LOGIN_LOGO" => "enable-login-logo", "SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN" => "pterodactyl-admin-api-key", + "SETTINGS::SYSTEM:ENABLE_UPGRADE" => "enable-upgrade", ]; diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index a9429689..62089d7e 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -3,9 +3,12 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; +use App\Models\User; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Log; class LoginController extends Controller { @@ -66,6 +69,9 @@ class LoginController extends Controller } if ($this->attemptLogin($request)) { + $user = Auth::user(); + $user->last_seen = now(); + $user->save(); return $this->sendLoginResponse($request); } diff --git a/app/Http/Controllers/ServerController.php b/app/Http/Controllers/ServerController.php index 96ced460..87993162 100644 --- a/app/Http/Controllers/ServerController.php +++ b/app/Http/Controllers/ServerController.php @@ -278,12 +278,25 @@ class ServerController extends Controller $oldProduct = Product::where('id', $server->product->id)->first(); $newProduct = Product::where('id', $request->product_upgrade)->first(); $serverAttributes = Pterodactyl::getServerAttributes($server->pterodactyl_id); + $serverRelationships = $serverAttributes['relationships']; + + // Get node resource allocation info + $nodeId = $serverRelationships['node']['attributes']['id']; + $node = Node::where('id', $nodeId)->firstOrFail(); + $nodeName = $node->name; + + // Check if node has enough memory and disk space + $requireMemory = $newProduct->memory - $oldProduct->memory; + $requiredisk = $newProduct->disk - $oldProduct->disk; + $checkResponse = Pterodactyl::checkNodeResources($node, $requireMemory, $requiredisk); + if ($checkResponse == False) return redirect()->route('servers.index')->with('error', __("The node '" . $nodeName . "' doesn't have the required memory or disk left to upgrade the server.")); + $priceupgrade = $newProduct->getHourlyPrice(); if ($priceupgrade < $oldProduct->getHourlyPrice()) { $priceupgrade = 0; } - if ($user->credits >= $priceupgrade) + if ($user->credits >= $priceupgrade && $user->credits >= $newProduct->minimum_credits) { $server->product_id = $request->product_upgrade; @@ -295,7 +308,7 @@ class ServerController extends Controller $user->decrement('credits', $priceupgrade); //restart the server $response = Pterodactyl::powerAction($server, "restart"); - if ($response->failed()) return $this->serverCreationFailed($response, $server); + if ($response->failed()) return redirect()->route('servers.index')->with('error', $response->json()['errors'][0]['detail']); return redirect()->route('servers.show', ['server' => $server->id])->with('success', __('Server Successfully Upgraded')); } else diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 5f9dd9ff..4a193f98 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -107,12 +107,30 @@ class AppServiceProvider extends ServiceProvider Artisan::call('cache:clear'); } + + try { + $stringfromfile = file(base_path().'/.git/HEAD'); + + $firstLine = $stringfromfile[0]; //get the string from the array + + $explodedstring = explode("/", $firstLine, 3); //seperate out by the "/" in the string + + $branchname = $explodedstring[2]; //get the one that is always the branch name + } catch (Exception $e) { + $branchname = "unknown"; + Log::error($e); + } + config(['BRANCHNAME' => $branchname]); + + // Set Discord-API Config config(['services.discord.client_id' => config('SETTINGS::DISCORD:CLIENT_ID')]); config(['services.discord.client_secret' => config('SETTINGS::DISCORD:CLIENT_SECRET')]); } catch (Exception $e) { - error_log("Settings Error: Could not load settings from database"); - Log::error("Settings Error: Could not load settings from database"); + error_log("Settings Error: Could not load settings from database. The Installation probably is not done yet."); + error_log($e); + Log::error("Settings Error: Could not load settings from database. The Installation probably is not done yet."); + Log::error($e); } } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 0531b53e..eef3de13 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -61,7 +61,7 @@ class RouteServiceProvider extends ServiceProvider return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip()); }); RateLimiter::for('web', function (Request $request) { - return Limit::perMinute(15)->by(optional($request->user())->id ?: $request->ip()); + return Limit::perMinute(40)->by(optional($request->user())->id ?: $request->ip()); }); } } diff --git a/config/app.php b/config/app.php index e8ab470b..90bdfdde 100644 --- a/config/app.php +++ b/config/app.php @@ -4,7 +4,7 @@ use App\Models\Settings; return [ - 'version' => '0.8', + 'version' => '0.8.2', /* |-------------------------------------------------------------------------- diff --git a/database/seeders/Seeds/SettingsSeeder.php b/database/seeders/Seeds/SettingsSeeder.php index a79501a9..fe695a76 100644 --- a/database/seeders/Seeds/SettingsSeeder.php +++ b/database/seeders/Seeds/SettingsSeeder.php @@ -508,5 +508,12 @@ class SettingsSeeder extends Seeder 'type' => 'string', 'description' => 'The Client API Key of an Pterodactyl Admin Account' ]); + Settings::firstOrCreate([ + 'key' => 'SETTINGS::SYSTEM:ENABLE_UPGRADE', + ], [ + 'value' =>"", + 'type' => 'string', + 'description' => 'Enables the updgrade/downgrade feature for servers' + ]); } } diff --git a/resources/views/admin/api/index.blade.php b/resources/views/admin/api/index.blade.php index 6eaf5fba..377095b1 100644 --- a/resources/views/admin/api/index.blade.php +++ b/resources/views/admin/api/index.blade.php @@ -65,7 +65,7 @@ document.addEventListener("DOMContentLoaded", function () { $('#datatable').DataTable({ language: { - url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' }, processing: true, serverSide: true, diff --git a/resources/views/admin/nests/index.blade.php b/resources/views/admin/nests/index.blade.php index 843bbe5f..152773e4 100644 --- a/resources/views/admin/nests/index.blade.php +++ b/resources/views/admin/nests/index.blade.php @@ -75,7 +75,7 @@ THIS FILE IS DEPRECATED document.addEventListener("DOMContentLoaded", function () { $('#datatable').DataTable({ language: { - url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' }, processing: true, serverSide: true, diff --git a/resources/views/admin/nodes/index.blade.php b/resources/views/admin/nodes/index.blade.php index d6fe5034..bb57e0ce 100644 --- a/resources/views/admin/nodes/index.blade.php +++ b/resources/views/admin/nodes/index.blade.php @@ -75,7 +75,7 @@ THIS FILE IS DEPRECATED document.addEventListener("DOMContentLoaded", function () { $('#datatable').DataTable({ language: { - url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' }, processing: true, serverSide: true, diff --git a/resources/views/admin/overview/index.blade.php b/resources/views/admin/overview/index.blade.php index 8da6292d..1b697104 100644 --- a/resources/views/admin/overview/index.blade.php +++ b/resources/views/admin/overview/index.blade.php @@ -143,6 +143,22 @@ +
+
+
+
+
+ {{__('Controlpanel.gg')}} +
+
+
+ +
+ +
+
diff --git a/resources/views/admin/payments/index.blade.php b/resources/views/admin/payments/index.blade.php index c60debba..6f907c36 100644 --- a/resources/views/admin/payments/index.blade.php +++ b/resources/views/admin/payments/index.blade.php @@ -66,7 +66,7 @@ document.addEventListener("DOMContentLoaded", function() { $('#datatable').DataTable({ language: { - url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' }, processing: true, serverSide: true, diff --git a/resources/views/admin/products/index.blade.php b/resources/views/admin/products/index.blade.php index 25cea9a0..49c8ccd8 100644 --- a/resources/views/admin/products/index.blade.php +++ b/resources/views/admin/products/index.blade.php @@ -79,7 +79,7 @@ document.addEventListener("DOMContentLoaded", function () { $("#datatable").DataTable({ language: { - url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' }, processing: true, serverSide: true, diff --git a/resources/views/admin/servers/table.blade.php b/resources/views/admin/servers/table.blade.php index 09426c76..b71671de 100644 --- a/resources/views/admin/servers/table.blade.php +++ b/resources/views/admin/servers/table.blade.php @@ -23,7 +23,7 @@ document.addEventListener("DOMContentLoaded", function () { $('#datatable').DataTable({ language: { - url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' }, processing: true, serverSide: true, diff --git a/resources/views/admin/settings/tabs/system.blade.php b/resources/views/admin/settings/tabs/system.blade.php index 66628c18..9f86947a 100644 --- a/resources/views/admin/settings/tabs/system.blade.php +++ b/resources/views/admin/settings/tabs/system.blade.php @@ -75,6 +75,11 @@ + @error('pterodactyl-admin-api-key') +
+ {{$message}} +
+ @enderror @@ -162,6 +167,21 @@

{{ __('Server') }}

+
+
+
+
+ + +
+ +
+
+
@@ -175,6 +195,8 @@ class="form-control @error('allocation-limit') is-invalid @enderror" required>
+ +
{{-- Design --}} diff --git a/resources/views/admin/usefullinks/index.blade.php b/resources/views/admin/usefullinks/index.blade.php index f0cc60a6..32100334 100644 --- a/resources/views/admin/usefullinks/index.blade.php +++ b/resources/views/admin/usefullinks/index.blade.php @@ -67,7 +67,7 @@ document.addEventListener("DOMContentLoaded", function () { $('#datatable').DataTable({ language: { - url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' }, processing: true, serverSide: true, diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php index 7cf8665d..b3a0e87f 100644 --- a/resources/views/admin/users/index.blade.php +++ b/resources/views/admin/users/index.blade.php @@ -74,7 +74,7 @@ document.addEventListener("DOMContentLoaded", function () { $('#datatable').DataTable({ language: { - url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' }, processing: true, serverSide: false, //increases loading times too much? change back to "true" if it does diff --git a/resources/views/admin/vouchers/index.blade.php b/resources/views/admin/vouchers/index.blade.php index 59f0efc6..1f60e9aa 100644 --- a/resources/views/admin/vouchers/index.blade.php +++ b/resources/views/admin/vouchers/index.blade.php @@ -70,7 +70,7 @@ document.addEventListener("DOMContentLoaded", function () { $('#datatable').DataTable({ language: { - url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' }, processing: true, serverSide: true, diff --git a/resources/views/admin/vouchers/users.blade.php b/resources/views/admin/vouchers/users.blade.php index c12281fb..284dc1c3 100644 --- a/resources/views/admin/vouchers/users.blade.php +++ b/resources/views/admin/vouchers/users.blade.php @@ -63,7 +63,7 @@ document.addEventListener("DOMContentLoaded", function() { $('#datatable').DataTable({ language: { - url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' }, processing: true, serverSide: true, diff --git a/resources/views/layouts/main.blade.php b/resources/views/layouts/main.blade.php index 55fa3ceb..ae31b5e1 100644 --- a/resources/views/layouts/main.blade.php +++ b/resources/views/layouts/main.blade.php @@ -403,8 +403,10 @@ Copyright © 2021-{{ date('Y') }} {{ env('APP_NAME', 'Laravel') }}. All rights - reserved. Powered by ControlPanel. Version - {{ config('app')['version'] }} + reserved. Powered by ControlPanel. + @if(!str_contains(config("BRANCHNAME"),"main")) + Version {{ config('app')['version'] }} - {{config("BRANCHNAME")}} + @endif diff --git a/resources/views/moderator/ticket/blacklist.blade.php b/resources/views/moderator/ticket/blacklist.blade.php index 2a8d8f2a..403a5b90 100644 --- a/resources/views/moderator/ticket/blacklist.blade.php +++ b/resources/views/moderator/ticket/blacklist.blade.php @@ -90,7 +90,7 @@ document.addEventListener("DOMContentLoaded", function () { $('#datatable').DataTable({ language: { - url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' }, processing: true, serverSide: true, diff --git a/resources/views/moderator/ticket/index.blade.php b/resources/views/moderator/ticket/index.blade.php index 203ca227..3ec056a4 100644 --- a/resources/views/moderator/ticket/index.blade.php +++ b/resources/views/moderator/ticket/index.blade.php @@ -48,10 +48,10 @@ - + - + @@ -63,7 +63,7 @@ document.addEventListener("DOMContentLoaded", function () { $('#datatable').DataTable({ language: { - url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' }, processing: true, serverSide: true, diff --git a/resources/views/moderator/ticket/show.blade.php b/resources/views/moderator/ticket/show.blade.php index 18e4ebaa..22bd2ea1 100644 --- a/resources/views/moderator/ticket/show.blade.php +++ b/resources/views/moderator/ticket/show.blade.php @@ -51,6 +51,11 @@ @endif

Created on: {{ $ticket->created_at->diffForHumans() }}

+
+ {{csrf_field()}} + {{method_field("POST") }} + +
diff --git a/resources/views/servers/settings.blade.php b/resources/views/servers/settings.blade.php index 7607de10..e320533c 100644 --- a/resources/views/servers/settings.blade.php +++ b/resources/views/servers/settings.blade.php @@ -221,16 +221,14 @@ + @endif