From 6d61ca5ceff04119452b138b5d6ae5b3bead34e0 Mon Sep 17 00:00:00 2001 From: 1day2die Date: Mon, 5 Feb 2024 09:27:24 +0100 Subject: [PATCH 01/33] fix installer --- ..._01_181334_create_pterodactyl_settings.php | 6 ++++-- storage/app/public/logo.png | Bin 95961 -> 96827 bytes 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/database/settings/2023_02_01_181334_create_pterodactyl_settings.php b/database/settings/2023_02_01_181334_create_pterodactyl_settings.php index f3b5b37d..9ab9d72f 100644 --- a/database/settings/2023_02_01_181334_create_pterodactyl_settings.php +++ b/database/settings/2023_02_01_181334_create_pterodactyl_settings.php @@ -10,8 +10,10 @@ class CreatePterodactylSettings extends SettingsMigration $table_exists = DB::table('settings_old')->exists(); // Get the user-set configuration values from the old table. - $this->migrator->addEncrypted('pterodactyl.admin_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:TOKEN') : env('PTERODACTYL_TOKEN', '')); - $this->migrator->addEncrypted('pterodactyl.user_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN') : ''); + //$this->migrator->addEncrypted('pterodactyl.admin_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:TOKEN') : env('PTERODACTYL_TOKEN', '')); + //$this->migrator->addEncrypted('pterodactyl.user_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN') : ''); + $this->migrator->add('pterodactyl.admin_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:TOKEN') : env('PTERODACTYL_TOKEN', '')); + $this->migrator->add('pterodactyl.user_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN') : ''); $this->migrator->add('pterodactyl.panel_url', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:URL') : env('PTERODACTYL_URL', '')); $this->migrator->add('pterodactyl.per_page_limit', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:PER_PAGE_LIMIT') : 200); } diff --git a/storage/app/public/logo.png b/storage/app/public/logo.png index 1dda9e7c6c5aa69f3b2d512e6a0521aee51f7b3c..8a68b5fbd7c9eb5949713891ee898d7bda8a8eaf 100644 GIT binary patch literal 96827 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 literal 95961 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
diff --git a/themes/default/views/information/privacy-content.blade.php b/themes/default/views/information/privacy-content.blade.php index 5f465e82..9b1db499 100644 --- a/themes/default/views/information/privacy-content.blade.php +++ b/themes/default/views/information/privacy-content.blade.php @@ -49,8 +49,8 @@ Service or from the Service infrastructure itself (for example, the duration of a page visit).

  • -

    Website refers to CtrlPanel, accessible from controlpanel

    +

    Website refers to CtrlPanel, accessible from ctrlpanel

  • You means the individual accessing or using the Service, or the company, or other legal diff --git a/themes/default/views/information/tos-content.blade.php b/themes/default/views/information/tos-content.blade.php index 6dd7c129..e9a42927 100644 --- a/themes/default/views/information/tos-content.blade.php +++ b/themes/default/views/information/tos-content.blade.php @@ -146,6 +146,10 @@

    - PayPal

    +

    - Stripe

    + +

    - Mollie

    +

    You agree to provide current, complete, and accurate purchase and account information for all purchases made via the Site. You further agree to promptly update account and payment information, including email address, payment method, and payment card expiration date, so that we can complete your transactions and contact you as needed. Sales tax will be added to the price of purchases as deemed required by us. We may change prices at any time. All payments shall beinU.S. dollars.

    From 6a11341c0a4256a5e59d8280a756d80eda36fea0 Mon Sep 17 00:00:00 2001 From: 1day2die Date: Thu, 14 Mar 2024 14:40:08 +0100 Subject: [PATCH 06/33] Fix roles notification --- app/Http/Controllers/Admin/UserController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 60a1120f..b023d232 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -316,7 +316,8 @@ class UserController extends Controller ->line(new HtmlString($data['content'])); } $all = $data['all'] ?? false; - if(!$data["roles"]){ + $roles = $data['roles'] ?? false; + if(!$roles){ $users = $all ? User::all() : User::whereIn('id', $data['users'])->get(); } else{ $users = User::role($data["roles"])->get(); From 7f0d934ed5afe30de58e46e2397473a7efd87e71 Mon Sep 17 00:00:00 2001 From: IceToast Date: Fri, 12 Apr 2024 14:03:11 +0200 Subject: [PATCH 07/33] =?UTF-8?q?feat:=20=E2=9C=A8=20Create=20LegacySettin?= =?UTF-8?q?gsMigration=20to=20centralize=20migration=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Classes/LegacySettingsMigration.php | 58 +++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 app/Classes/LegacySettingsMigration.php diff --git a/app/Classes/LegacySettingsMigration.php b/app/Classes/LegacySettingsMigration.php new file mode 100644 index 00000000..3b6ccfaf --- /dev/null +++ b/app/Classes/LegacySettingsMigration.php @@ -0,0 +1,58 @@ +where([['group', '=', 'general'], ['name', '=', $name]])->get(['payload'])->first(); + + // Some keys returns '""' as a value. + if ($new_value->payload === '""') { + return null; + } + + // remove the quotes from the string + if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { + return substr($new_value->payload, 1, -1); + } + + return $new_value->payload; + } + + /** + * Get the old value from the settings_old table. + * @param string $key The key to get the value from table. + * @param int|string|bool|null $default The default value to return if the value is null. If value is not nullable, a default must be provided. + */ + public function getOldValue(string $key, int|string|bool|null $default = null) + { + $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); + + if (is_null($old_value->value)) { + return $default; + } + + switch ($old_value->type) { + case 'string': + case 'text': + // Edgecase: The value is a boolean, but it's stored as a string. + if ($old_value->value === "false" || $old_value->value === "true") { + return filter_var($old_value->value, FILTER_VALIDATE_BOOL); + } + return $old_value->value; + case 'boolean': + return filter_var($old_value->value, FILTER_VALIDATE_BOOL); + case 'integer': + return filter_var($old_value->value, FILTER_VALIDATE_INT); + default: + throw new Exception("Unknown type: {$old_value->type}"); + } + } +} From 48cce11ebc776fc71f3d32009fc6e01821b89d26 Mon Sep 17 00:00:00 2001 From: IceToast Date: Fri, 12 Apr 2024 14:04:26 +0200 Subject: [PATCH 08/33] =?UTF-8?q?fix:=20=F0=9F=9A=91=EF=B8=8F=20Use=20Lega?= =?UTF-8?q?cySettingsMigration=20&&=20mind=20nullable=20values?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3_02_01_164731_create_general_settings.php | 61 +++------------- ..._01_181334_create_pterodactyl_settings.php | 60 +++------------- ...2023_02_01_181453_create_mail_settings.php | 47 +----------- ...2023_02_01_181925_create_user_settings.php | 71 ++++--------------- ...23_02_01_181950_create_server_settings.php | 53 ++------------ ...3_02_01_182021_create_invoice_settings.php | 63 +++------------- ...3_02_01_182043_create_discord_settings.php | 59 +++------------ ...23_02_01_182108_create_locale_settings.php | 53 ++------------ ..._02_01_182135_create_referral_settings.php | 55 ++------------ ...3_02_01_182158_create_website_settings.php | 60 +++------------- ...23_02_04_181156_create_ticket_settings.php | 52 +------------- 11 files changed, 78 insertions(+), 556 deletions(-) diff --git a/database/settings/2023_02_01_164731_create_general_settings.php b/database/settings/2023_02_01_164731_create_general_settings.php index 5d183590..5e7360dc 100644 --- a/database/settings/2023_02_01_164731_create_general_settings.php +++ b/database/settings/2023_02_01_164731_create_general_settings.php @@ -1,9 +1,9 @@ migrator->add('general.store_enabled', true); - $this->migrator->add('general.credits_display_name', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME') : 'Credits'); + $this->migrator->add('general.credits_display_name', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME', 'Credits') : 'Credits'); $this->migrator->add('general.recaptcha_site_key', $table_exists ? $this->getOldValue("SETTINGS::RECAPTCHA:SITE_KEY") : env('RECAPTCHA_SITE_KEY', '6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI')); $this->migrator->add('general.recaptcha_secret_key', $table_exists ? $this->getOldValue("SETTINGS::RECAPTCHA:SECRET_KEY") : env('RECAPTCHA_SECRET_KEY', '6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe')); - $this->migrator->add('general.recaptcha_enabled', $table_exists ? $this->getOldValue("SETTINGS::RECAPTCHA:ENABLED") : true); - $this->migrator->add('general.phpmyadmin_url', $table_exists ? $this->getOldValue("SETTINGS::MISC:PHPMYADMIN:URL") : env('PHPMYADMIN_URL', '')); - $this->migrator->add('general.alert_enabled', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:ALERT_ENABLED") : false); - $this->migrator->add('general.alert_type', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:ALERT_TYPE") : 'dark'); - $this->migrator->add('general.alert_message', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:ALERT_MESSAGE") : ''); - $this->migrator->add('general.theme', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:THEME") : 'default'); + $this->migrator->add('general.recaptcha_enabled', $table_exists ? $this->getOldValue("SETTINGS::RECAPTCHA:ENABLED", false) : false); + $this->migrator->add('general.phpmyadmin_url', $table_exists ? $this->getOldValue("SETTINGS::MISC:PHPMYADMIN:URL") : env('PHPMYADMIN_URL')); + $this->migrator->add('general.alert_enabled', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:ALERT_ENABLED", false) : false); + $this->migrator->add('general.alert_type', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:ALERT_TYPE", 'dark') : 'dark'); + $this->migrator->add('general.alert_message', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:ALERT_MESSAGE") : null); + $this->migrator->add('general.theme', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:THEME", 'default') : 'default'); } public function down(): void @@ -93,47 +93,4 @@ class CreateGeneralSettings extends SettingsMigration $this->migrator->delete('general.alert_message'); $this->migrator->delete('general.theme'); } - - public function getNewValue(string $name) - { - $new_value = DB::table('settings')->where([['group', '=', 'general'], ['name', '=', $name]])->get(['payload'])->first(); - - // Some keys returns '""' as a value. - if ($new_value->payload === '""') { - return null; - } - - // remove the quotes from the string - if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { - return substr($new_value->payload, 1, -1); - } - - return $new_value->payload; - } - - public function getOldValue(string $key) - { - // Always get the first value of the key. - $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); - - // Handle the old values to return without it being a string in all cases. - if ($old_value->type === "string" || $old_value->type === "text") { - if (is_null($old_value->value)) { - return ''; - } - - // Some values have the type string, but their values are boolean. - if ($old_value->value === "false" || $old_value->value === "true") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return $old_value->value; - } - - if ($old_value->type === "boolean") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return filter_var($old_value->value, FILTER_VALIDATE_INT); - } } diff --git a/database/settings/2023_02_01_181334_create_pterodactyl_settings.php b/database/settings/2023_02_01_181334_create_pterodactyl_settings.php index 9ab9d72f..d8f65248 100644 --- a/database/settings/2023_02_01_181334_create_pterodactyl_settings.php +++ b/database/settings/2023_02_01_181334_create_pterodactyl_settings.php @@ -1,21 +1,20 @@ exists(); - // Get the user-set configuration values from the old table. - //$this->migrator->addEncrypted('pterodactyl.admin_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:TOKEN') : env('PTERODACTYL_TOKEN', '')); - //$this->migrator->addEncrypted('pterodactyl.user_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN') : ''); - $this->migrator->add('pterodactyl.admin_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:TOKEN') : env('PTERODACTYL_TOKEN', '')); - $this->migrator->add('pterodactyl.user_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN') : ''); - $this->migrator->add('pterodactyl.panel_url', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:URL') : env('PTERODACTYL_URL', '')); - $this->migrator->add('pterodactyl.per_page_limit', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:PER_PAGE_LIMIT') : 200); + $this->migrator->addEncrypted('pterodactyl.admin_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:TOKEN', '') : env('PTERODACTYL_TOKEN', '')); + $this->migrator->addEncrypted('pterodactyl.user_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN', '') : ''); + // $this->migrator->add('pterodactyl.admin_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:TOKEN') : env('PTERODACTYL_TOKEN', '')); + // $this->migrator->add('pterodactyl.user_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN') : ''); + $this->migrator->add('pterodactyl.panel_url', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:URL', '') : env('PTERODACTYL_URL', '')); + $this->migrator->add('pterodactyl.per_page_limit', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:PER_PAGE_LIMIT', 200) : 200); } public function down(): void @@ -54,47 +53,4 @@ class CreatePterodactylSettings extends SettingsMigration $this->migrator->delete('pterodactyl.panel_url'); $this->migrator->delete('pterodactyl.per_page_limit'); } - - public function getNewValue(string $name) - { - $new_value = DB::table('settings')->where([['group', '=', 'pterodactyl'], ['name', '=', $name]])->get(['payload'])->first(); - - // Some keys returns '""' as a value. - if ($new_value->payload === '""') { - return null; - } - - // remove the quotes from the string - if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { - return substr($new_value->payload, 1, -1); - } - - return $new_value->payload; - } - - public function getOldValue(string $key) - { - // Always get the first value of the key. - $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); - - // Handle the old values to return without it being a string in all cases. - if ($old_value->type === "string" || $old_value->type === "text") { - if (is_null($old_value->value)) { - return ''; - } - - // Some values have the type string, but their values are boolean. - if ($old_value->value === "false" || $old_value->value === "true") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return $old_value->value; - } - - if ($old_value->type === "boolean") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return filter_var($old_value->value, FILTER_VALIDATE_INT); - } } diff --git a/database/settings/2023_02_01_181453_create_mail_settings.php b/database/settings/2023_02_01_181453_create_mail_settings.php index 8437a61a..42ab0f4b 100644 --- a/database/settings/2023_02_01_181453_create_mail_settings.php +++ b/database/settings/2023_02_01_181453_create_mail_settings.php @@ -1,9 +1,9 @@ migrator->delete('mail.mail_from_name'); $this->migrator->delete('mail.mail_mailer'); } - - - public function getNewValue(string $name) - { - $new_value = DB::table('settings')->where([['group', '=', 'mail'], ['name', '=', $name]])->get(['payload'])->first(); - - // Some keys returns '""' as a value. - if ($new_value->payload === '""') { - return null; - } - - // remove the quotes from the string - if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { - return substr($new_value->payload, 1, -1); - } - - return $new_value->payload; - } - public function getOldValue(string $key) - { - // Always get the first value of the key. - $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); - - // Handle the old values to return without it being a string in all cases. - if ($old_value->type === "string" || $old_value->type === "text") { - if (is_null($old_value->value)) { - return ''; - } - - // Some values have the type string, but their values are boolean. - if ($old_value->value === "false" || $old_value->value === "true") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return $old_value->value; - } - - if ($old_value->type === "boolean") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return filter_var($old_value->value, FILTER_VALIDATE_INT); - } } diff --git a/database/settings/2023_02_01_181925_create_user_settings.php b/database/settings/2023_02_01_181925_create_user_settings.php index 524ef0b7..8c9e088b 100644 --- a/database/settings/2023_02_01_181925_create_user_settings.php +++ b/database/settings/2023_02_01_181925_create_user_settings.php @@ -1,27 +1,27 @@ exists(); // Get the user-set configuration values from the old table. - $this->migrator->add('user.credits_reward_after_verify_discord', $table_exists ? $this->getOldValue('SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_DISCORD') : 250); - $this->migrator->add('user.credits_reward_after_verify_email', $table_exists ? $this->getOldValue('SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_EMAIL') : 250); - $this->migrator->add('user.force_discord_verification', $table_exists ? $this->getOldValue('SETTINGS::USER:FORCE_DISCORD_VERIFICATION') : false); - $this->migrator->add('user.force_email_verification', $table_exists ? $this->getOldValue('SETTINGS::USER:FORCE_EMAIL_VERIFICATION') : false); - $this->migrator->add('user.initial_credits', $table_exists ? $this->getOldValue('SETTINGS::USER:INITIAL_CREDITS') : 250); - $this->migrator->add('user.initial_server_limit', $table_exists ? $this->getOldValue('SETTINGS::USER:INITIAL_SERVER_LIMIT') : 1); - $this->migrator->add('user.min_credits_to_make_server', $table_exists ? $this->getOldValue('SETTINGS::USER:MINIMUM_REQUIRED_CREDITS_TO_MAKE_SERVER') : 50); - $this->migrator->add('user.server_limit_after_irl_purchase', $table_exists ? $this->getOldValue('SETTINGS::USER:SERVER_LIMIT_AFTER_IRL_PURCHASE') : 10); - $this->migrator->add('user.server_limit_after_verify_discord', $table_exists ? $this->getOldValue('SETTINGS::USER:SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD') : 2); - $this->migrator->add('user.server_limit_after_verify_email', $table_exists ? $this->getOldValue('SETTINGS::USER:SERVER_LIMIT_REWARD_AFTER_VERIFY_EMAIL') : 2); - $this->migrator->add('user.register_ip_check', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:REGISTER_IP_CHECK") : true); - $this->migrator->add('user.creation_enabled', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:CREATION_OF_NEW_USERS") : true); + $this->migrator->add('user.credits_reward_after_verify_discord', $table_exists ? $this->getOldValue('SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_DISCORD', 250) : 250); + $this->migrator->add('user.credits_reward_after_verify_email', $table_exists ? $this->getOldValue('SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_EMAIL', 250) : 250); + $this->migrator->add('user.force_discord_verification', $table_exists ? $this->getOldValue('SETTINGS::USER:FORCE_DISCORD_VERIFICATION', false) : false); + $this->migrator->add('user.force_email_verification', $table_exists ? $this->getOldValue('SETTINGS::USER:FORCE_EMAIL_VERIFICATION', false) : false); + $this->migrator->add('user.initial_credits', $table_exists ? $this->getOldValue('SETTINGS::USER:INITIAL_CREDITS', 250) : 250); + $this->migrator->add('user.initial_server_limit', $table_exists ? $this->getOldValue('SETTINGS::USER:INITIAL_SERVER_LIMIT', 1) : 1); + $this->migrator->add('user.min_credits_to_make_server', $table_exists ? $this->getOldValue('SETTINGS::USER:MINIMUM_REQUIRED_CREDITS_TO_MAKE_SERVER', 50) : 50); + $this->migrator->add('user.server_limit_after_irl_purchase', $table_exists ? $this->getOldValue('SETTINGS::USER:SERVER_LIMIT_AFTER_IRL_PURCHASE', 10) : 10); + $this->migrator->add('user.server_limit_after_verify_discord', $table_exists ? $this->getOldValue('SETTINGS::USER:SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD', 2) : 2); + $this->migrator->add('user.server_limit_after_verify_email', $table_exists ? $this->getOldValue('SETTINGS::USER:SERVER_LIMIT_REWARD_AFTER_VERIFY_EMAIL', 2) : 2); + $this->migrator->add('user.register_ip_check', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:REGISTER_IP_CHECK", true) : true); + $this->migrator->add('user.creation_enabled', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:CREATION_OF_NEW_USERS", true) : true); } public function down(): void @@ -117,47 +117,4 @@ class CreateUserSettings extends SettingsMigration $this->migrator->delete('user.register_ip_check'); $this->migrator->delete('user.creation_enabled'); } - - public function getNewValue(string $name) - { - $new_value = DB::table('settings')->where([['group', '=', 'user'], ['name', '=', $name]])->get(['payload'])->first(); - - // Some keys returns '""' as a value. - if ($new_value->payload === '""') { - return null; - } - - // remove the quotes from the string - if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { - return substr($new_value->payload, 1, -1); - } - - return $new_value->payload; - } - - public function getOldValue(string $key) - { - // Always get the first value of the key. - $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); - - // Handle the old values to return without it being a string in all cases. - if ($old_value->type === "string" || $old_value->type === "text") { - if (is_null($old_value->value)) { - return ''; - } - - // Some values have the type string, but their values are boolean. - if ($old_value->value === "false" || $old_value->value === "true") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return $old_value->value; - } - - if ($old_value->type === "boolean") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return filter_var($old_value->value, FILTER_VALIDATE_INT); - } } diff --git a/database/settings/2023_02_01_181950_create_server_settings.php b/database/settings/2023_02_01_181950_create_server_settings.php index 7198adcb..de25c94f 100644 --- a/database/settings/2023_02_01_181950_create_server_settings.php +++ b/database/settings/2023_02_01_181950_create_server_settings.php @@ -1,18 +1,18 @@ exists(); // Get the user-set configuration values from the old table. - $this->migrator->add('server.allocation_limit', $table_exists ? $this->getOldValue('SETTINGS::SERVER:ALLOCATION_LIMIT') : 200); - $this->migrator->add('server.creation_enabled', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:CREATION_OF_NEW_SERVERS') : true); - $this->migrator->add('server.enable_upgrade', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:ENABLE_UPGRADE') : false); + $this->migrator->add('server.allocation_limit', $table_exists ? $this->getOldValue('SETTINGS::SERVER:ALLOCATION_LIMIT', 200) : 200); + $this->migrator->add('server.creation_enabled', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:CREATION_OF_NEW_SERVERS', true) : true); + $this->migrator->add('server.enable_upgrade', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:ENABLE_UPGRADE', false) : false); } public function down(): void @@ -42,47 +42,4 @@ class CreateServerSettings extends SettingsMigration $this->migrator->delete('server.creation_enabled'); $this->migrator->delete('server.enable_upgrade'); } - - public function getNewValue(string $name) - { - $new_value = DB::table('settings')->where([['group', '=', 'server'], ['name', '=', $name]])->get(['payload'])->first(); - - // Some keys returns '""' as a value. - if ($new_value->payload === '""') { - return null; - } - - // remove the quotes from the string - if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { - return substr($new_value->payload, 1, -1); - } - - return $new_value->payload; - } - - public function getOldValue(string $key) - { - // Always get the first value of the key. - $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); - - // Handle the old values to return without it being a string in all cases. - if ($old_value->type === "string" || $old_value->type === "text") { - if (is_null($old_value->value)) { - return ''; - } - - // Some values have the type string, but their values are boolean. - if ($old_value->value === "false" || $old_value->value === "true") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return $old_value->value; - } - - if ($old_value->type === "boolean") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return filter_var($old_value->value, FILTER_VALIDATE_INT); - } } diff --git a/database/settings/2023_02_01_182021_create_invoice_settings.php b/database/settings/2023_02_01_182021_create_invoice_settings.php index 8569c3ff..effc67d7 100644 --- a/database/settings/2023_02_01_182021_create_invoice_settings.php +++ b/database/settings/2023_02_01_182021_create_invoice_settings.php @@ -1,23 +1,23 @@ exists(); // Get the user-set configuration values from the old table. - $this->migrator->add('invoice.company_address', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:COMPANY_ADDRESS') : ''); - $this->migrator->add('invoice.company_mail', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:COMPANY_MAIL') : ''); - $this->migrator->add('invoice.company_name', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:COMPANY_NAME') : ''); - $this->migrator->add('invoice.company_phone', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:COMPANY_PHONE') : ''); - $this->migrator->add('invoice.company_vat', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:COMPANY_VAT') : ''); - $this->migrator->add('invoice.company_website', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:COMPANY_WEBSITE') : ''); - $this->migrator->add('invoice.enabled', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:ENABLED') : false); - $this->migrator->add('invoice.prefix', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:PREFIX') : 'INV'); + $this->migrator->add('invoice.company_address', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:COMPANY_ADDRESS') : null); + $this->migrator->add('invoice.company_mail', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:COMPANY_MAIL') : null); + $this->migrator->add('invoice.company_name', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:COMPANY_NAME') : null); + $this->migrator->add('invoice.company_phone', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:COMPANY_PHONE') : null); + $this->migrator->add('invoice.company_vat', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:COMPANY_VAT') : null); + $this->migrator->add('invoice.company_website', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:COMPANY_WEBSITE') : null); + $this->migrator->add('invoice.enabled', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:ENABLED', false) : false); + $this->migrator->add('invoice.prefix', $table_exists ? $this->getOldValue('SETTINGS::INVOICE:PREFIX') : null); } public function down(): void @@ -82,47 +82,4 @@ class CreateInvoiceSettings extends SettingsMigration $this->migrator->delete('invoice.enabled'); $this->migrator->delete('invoice.prefix'); } - - public function getNewValue(string $name) - { - $new_value = DB::table('settings')->where([['group', '=', 'invoice'], ['name', '=', $name]])->get(['payload'])->first(); - - // Some keys returns '""' as a value. - if ($new_value->payload === '""') { - return null; - } - - // remove the quotes from the string - if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { - return substr($new_value->payload, 1, -1); - } - - return $new_value->payload; - } - - public function getOldValue(string $key) - { - // Always get the first value of the key. - $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); - - // Handle the old values to return without it being a string in all cases. - if ($old_value->type === "string" || $old_value->type === "text") { - if (is_null($old_value->value)) { - return ''; - } - - // Some values have the type string, but their values are boolean. - if ($old_value->value === "false" || $old_value->value === "true") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return $old_value->value; - } - - if ($old_value->type === "boolean") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return filter_var($old_value->value, FILTER_VALIDATE_INT); - } } diff --git a/database/settings/2023_02_01_182043_create_discord_settings.php b/database/settings/2023_02_01_182043_create_discord_settings.php index 60e450b9..21ccc5b6 100644 --- a/database/settings/2023_02_01_182043_create_discord_settings.php +++ b/database/settings/2023_02_01_182043_create_discord_settings.php @@ -1,21 +1,21 @@ exists(); // Get the user-set configuration values from the old table. - $this->migrator->add('discord.bot_token', $table_exists ? $this->getOldValue('SETTINGS::DISCORD:BOT_TOKEN') : ''); - $this->migrator->add('discord.client_id', $table_exists ? $this->getOldValue('SETTINGS::DISCORD:CLIENT_ID') : ''); - $this->migrator->add('discord.client_secret', $table_exists ? $this->getOldValue('SETTINGS::DISCORD:CLIENT_SECRET') : ''); - $this->migrator->add('discord.guild_id', $table_exists ? $this->getOldValue('SETTINGS::DISCORD:GUILD_ID') : ''); - $this->migrator->add('discord.invite_url', $table_exists ? $this->getOldValue('SETTINGS::DISCORD:INVITE_URL') : ''); - $this->migrator->add('discord.role_id', $table_exists ? $this->getOldValue('SETTINGS::DISCORD:ROLE_ID') : ''); + $this->migrator->add('discord.bot_token', $table_exists ? $this->getOldValue('SETTINGS::DISCORD:BOT_TOKEN') : null); + $this->migrator->add('discord.client_id', $table_exists ? $this->getOldValue('SETTINGS::DISCORD:CLIENT_ID') : null); + $this->migrator->add('discord.client_secret', $table_exists ? $this->getOldValue('SETTINGS::DISCORD:CLIENT_SECRET') : null); + $this->migrator->add('discord.guild_id', $table_exists ? $this->getOldValue('SETTINGS::DISCORD:GUILD_ID') : null); + $this->migrator->add('discord.invite_url', $table_exists ? $this->getOldValue('SETTINGS::DISCORD:INVITE_URL') : null); + $this->migrator->add('discord.role_id', $table_exists ? $this->getOldValue('SETTINGS::DISCORD:ROLE_ID') : null); } public function down(): void @@ -67,47 +67,4 @@ class CreateDiscordSettings extends SettingsMigration $this->migrator->delete('discord.invite_url'); $this->migrator->delete('discord.role_id'); } - - public function getNewValue(string $name) - { - $new_value = DB::table('settings')->where([['group', '=', 'discord'], ['name', '=', $name]])->get(['payload'])->first(); - - // Some keys returns '""' as a value. - if ($new_value->payload === '""') { - return null; - } - - // remove the quotes from the string - if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { - return substr($new_value->payload, 1, -1); - } - - return $new_value->payload; - } - - public function getOldValue(string $key) - { - // Always get the first value of the key. - $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); - - // Handle the old values to return without it being a string in all cases. - if ($old_value->type === "string" || $old_value->type === "text") { - if (is_null($old_value->value)) { - return ''; - } - - // Some values have the type string, but their values are boolean. - if ($old_value->value === "false" || $old_value->value === "true") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return $old_value->value; - } - - if ($old_value->type === "boolean") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return filter_var($old_value->value, FILTER_VALIDATE_INT); - } } diff --git a/database/settings/2023_02_01_182108_create_locale_settings.php b/database/settings/2023_02_01_182108_create_locale_settings.php index 014dd8fd..13dbde9d 100644 --- a/database/settings/2023_02_01_182108_create_locale_settings.php +++ b/database/settings/2023_02_01_182108_create_locale_settings.php @@ -1,9 +1,9 @@ migrator->add('locale.available', $table_exists ? $this->getOldValue('SETTINGS::LOCALE:AVAILABLE') : ''); - $this->migrator->add('locale.clients_can_change', $table_exists ? $this->getOldValue('SETTINGS::LOCALE:CLIENTS_CAN_CHANGE') : true); + $this->migrator->add('locale.clients_can_change', $table_exists ? $this->getOldValue('SETTINGS::LOCALE:CLIENTS_CAN_CHANGE', true) : true); $this->migrator->add('locale.datatables', $table_exists ? $this->getOldValue('SETTINGS::LOCALE:DATATABLES') : 'en-gb'); - $this->migrator->add('locale.default', $table_exists ? $this->getOldValue('SETTINGS::LOCALE:DEFAULT') : 'en'); - $this->migrator->add('locale.dynamic', $table_exists ? $this->getOldValue('SETTINGS::LOCALE:DYNAMIC') : false); + $this->migrator->add('locale.default', $table_exists ? $this->getOldValue('SETTINGS::LOCALE:DEFAULT', 'en') : 'en'); + $this->migrator->add('locale.dynamic', $table_exists ? $this->getOldValue('SETTINGS::LOCALE:DYNAMIC', false) : false); } public function down(): void @@ -58,47 +58,4 @@ class CreateLocaleSettings extends SettingsMigration $this->migrator->delete('locale.default'); $this->migrator->delete('locale.dynamic'); } - - public function getNewValue(string $name) - { - $new_value = DB::table('settings')->where([['group', '=', 'locale'], ['name', '=', $name]])->get(['payload'])->first(); - - // Some keys returns '""' as a value. - if ($new_value->payload === '""') { - return null; - } - - // remove the quotes from the string - if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { - return substr($new_value->payload, 1, -1); - } - - return $new_value->payload; - } - - public function getOldValue(string $key) - { - // Always get the first value of the key. - $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); - - // Handle the old values to return without it being a string in all cases. - if ($old_value->type === "string" || $old_value->type === "text") { - if (is_null($old_value->value)) { - return ''; - } - - // Some values have the type string, but their values are boolean. - if ($old_value->value === "false" || $old_value->value === "true") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return $old_value->value; - } - - if ($old_value->type === "boolean") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return filter_var($old_value->value, FILTER_VALIDATE_INT); - } } diff --git a/database/settings/2023_02_01_182135_create_referral_settings.php b/database/settings/2023_02_01_182135_create_referral_settings.php index 5727557b..839f0e28 100644 --- a/database/settings/2023_02_01_182135_create_referral_settings.php +++ b/database/settings/2023_02_01_182135_create_referral_settings.php @@ -1,20 +1,20 @@ exists(); // Get the user-set configuration values from the old table. - $this->migrator->add('referral.always_give_commission', $table_exists ? $this->getOldValue('SETTINGS::REFERRAL::ALWAYS_GIVE_COMMISSION') : false); - $this->migrator->add('referral.enabled', $table_exists ? $this->getOldValue('SETTINGS::REFERRAL::ENABLED') : false); + $this->migrator->add('referral.always_give_commission', $table_exists ? $this->getOldValue('SETTINGS::REFERRAL::ALWAYS_GIVE_COMMISSION', false) : false); + $this->migrator->add('referral.enabled', $table_exists ? $this->getOldValue('SETTINGS::REFERRAL::ENABLED', false) : false); $this->migrator->add('referral.reward', $table_exists ? $this->getOldValue('SETTINGS::REFERRAL::REWARD') : 100); - $this->migrator->add('referral.mode', $table_exists ? $this->getOldValue('SETTINGS::REFERRAL:MODE') : 'sign-up'); - $this->migrator->add('referral.percentage', $table_exists ? $this->getOldValue('SETTINGS::REFERRAL:PERCENTAGE') : 100); + $this->migrator->add('referral.mode', $table_exists ? $this->getOldValue('SETTINGS::REFERRAL:MODE', 'sign-up') : 'sign-up'); + $this->migrator->add('referral.percentage', $table_exists ? $this->getOldValue('SETTINGS::REFERRAL:PERCENTAGE', 100) : 100); } public function down(): void @@ -65,47 +65,4 @@ class CreateReferralSettings extends SettingsMigration $this->migrator->delete('referral.mode'); $this->migrator->delete('referral.percentage'); } - - public function getNewValue(string $name) - { - $new_value = DB::table('settings')->where([['group', '=', 'referral'], ['name', '=', $name]])->get(['payload'])->first(); - - // Some keys returns '""' as a value. - if ($new_value->payload === '""') { - return null; - } - - // remove the quotes from the string - if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { - return substr($new_value->payload, 1, -1); - } - - return $new_value->payload; - } - - public function getOldValue(string $key) - { - // Always get the first value of the key. - $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); - - // Handle the old values to return without it being a string in all cases. - if ($old_value->type === "string" || $old_value->type === "text") { - if (is_null($old_value->value)) { - return ''; - } - - // Some values have the type string, but their values are boolean. - if ($old_value->value === "false" || $old_value->value === "true") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return $old_value->value; - } - - if ($old_value->type === "boolean") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return filter_var($old_value->value, FILTER_VALIDATE_INT); - } } diff --git a/database/settings/2023_02_01_182158_create_website_settings.php b/database/settings/2023_02_01_182158_create_website_settings.php index fd542ff3..2bbdd5b5 100644 --- a/database/settings/2023_02_01_182158_create_website_settings.php +++ b/database/settings/2023_02_01_182158_create_website_settings.php @@ -1,27 +1,28 @@ exists(); // Get the user-set configuration values from the old table. - $this->migrator->add('website.motd_enabled', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:MOTD_ENABLED") : true); + $this->migrator->add('website.motd_enabled', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:MOTD_ENABLED", true) : true); $this->migrator->add( 'website.motd_message', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:MOTD_MESSAGE") : "

     width=CtrlPanel.gg

    Thank you for using our Software

    If you have any questions, make sure to join our Discord

    -

    (you can change this message in the Settings )

    "); - $this->migrator->add('website.show_imprint', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:SHOW_IMPRINT") : false); - $this->migrator->add('website.show_privacy', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:SHOW_PRIVACY") : false); - $this->migrator->add('website.show_tos', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:SHOW_TOS") : false); - $this->migrator->add('website.useful_links_enabled', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:USEFULLINKS_ENABLED") : true); +

    (you can change this message in the Settings )

    " + ); + $this->migrator->add('website.show_imprint', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:SHOW_IMPRINT", false) : false); + $this->migrator->add('website.show_privacy', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:SHOW_PRIVACY", false) : false); + $this->migrator->add('website.show_tos', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:SHOW_TOS", false) : false); + $this->migrator->add('website.useful_links_enabled', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:USEFULLINKS_ENABLED", true) : true); $this->migrator->add('website.seo_title', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:SEO_TITLE") : 'CtrlPanel.gg'); $this->migrator->add('website.seo_description', $table_exists ? $this->getOldValue("SETTINGS::SYSTEM:SEO_DESCRIPTION") : 'Billing software for Pterodactyl Panel.'); $this->migrator->add('website.enable_login_logo', true); @@ -96,47 +97,4 @@ class CreateWebsiteSettings extends SettingsMigration $this->migrator->delete('website.seo_description'); $this->migrator->delete('website.enable_login_logo'); } - - public function getNewValue(string $name) - { - $new_value = DB::table('settings')->where([['group', '=', 'website'], ['name', '=', $name]])->get(['payload'])->first(); - - // Some keys returns '""' as a value. - if ($new_value->payload === '""') { - return null; - } - - // remove the quotes from the string - if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { - return substr($new_value->payload, 1, -1); - } - - return $new_value->payload; - } - - public function getOldValue(string $key) - { - // Always get the first value of the key. - $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); - - // Handle the old values to return without it being a string in all cases. - if ($old_value->type === "string" || $old_value->type === "text") { - if (is_null($old_value->value)) { - return ''; - } - - // Some values have the type string, but their values are boolean. - if ($old_value->value === "false" || $old_value->value === "true") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return $old_value->value; - } - - if ($old_value->type === "boolean") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return filter_var($old_value->value, FILTER_VALIDATE_INT); - } } diff --git a/database/settings/2023_02_04_181156_create_ticket_settings.php b/database/settings/2023_02_04_181156_create_ticket_settings.php index 1e71ad3a..41eefe73 100644 --- a/database/settings/2023_02_04_181156_create_ticket_settings.php +++ b/database/settings/2023_02_04_181156_create_ticket_settings.php @@ -1,9 +1,9 @@ migrator->delete('ticket.enabled'); $this->migrator->delete('ticket.notify'); } - - public function getNewValue(string $name) - { - $new_value = DB::table('settings')->where([['group', '=', 'ticket'], ['name', '=', $name]])->get(['payload'])->first(); - - // Some keys returns '""' as a value. - if ($new_value->payload === '""') { - return null; - } - - // remove the quotes from the string - if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { - return substr($new_value->payload, 1, -1); - } - - return $new_value->payload; - } - - public function getOldValue(string $key) - { - // Always get the first value of the key. - $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); - - // Handle the old values to return without it being a string in all cases. - - if (is_null($old_value)) { - return ''; - } - if ($old_value->type === "string" || $old_value->type === "text") { - if (is_null($old_value->value)) { - return ''; - } - - - // Some values have the type string, but their values are boolean. - if ($old_value->value === "false" || $old_value->value === "true") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return $old_value->value; - } - - if ($old_value->type === "boolean") { - return filter_var($old_value->value, FILTER_VALIDATE_BOOL); - } - - return filter_var($old_value->value, FILTER_VALIDATE_INT); - } } From 330ea45c5b9b4e3cc16d765f1c204b70bf7db42d Mon Sep 17 00:00:00 2001 From: IceToast Date: Fri, 12 Apr 2024 21:01:00 +0200 Subject: [PATCH 09/33] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Try=20catch=20for?= =?UTF-8?q?=20possible=20non=20available=20settings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Classes/LegacySettingsMigration.php | 11 +++++--- app/Http/Controllers/ServerController.php | 3 --- app/Providers/AppServiceProvider.php | 32 ++++++++++++----------- config/settings.php | 2 +- routes/web.php | 8 +++--- 5 files changed, 31 insertions(+), 25 deletions(-) diff --git a/app/Classes/LegacySettingsMigration.php b/app/Classes/LegacySettingsMigration.php index 3b6ccfaf..dd32a761 100644 --- a/app/Classes/LegacySettingsMigration.php +++ b/app/Classes/LegacySettingsMigration.php @@ -9,15 +9,20 @@ use Spatie\LaravelSettings\Migrations\SettingsMigration; abstract class LegacySettingsMigration extends SettingsMigration { - public function getNewValue(string $name) + public function getNewValue(string $name, string $group) { - $new_value = DB::table('settings')->where([['group', '=', 'general'], ['name', '=', $name]])->get(['payload'])->first(); + $new_value = DB::table('settings')->where([['group', '=', $group], ['name', '=', $name]])->get(['payload'])->first(); + + if (is_null($new_value) || is_null($new_value->payload)) { + return null; + } // Some keys returns '""' as a value. if ($new_value->payload === '""') { return null; } + // remove the quotes from the string if (substr($new_value->payload, 0, 1) === '"' && substr($new_value->payload, -1) === '"') { return substr($new_value->payload, 1, -1); @@ -35,7 +40,7 @@ abstract class LegacySettingsMigration extends SettingsMigration { $old_value = DB::table('settings_old')->where('key', '=', $key)->get(['value', 'type'])->first(); - if (is_null($old_value->value)) { + if (is_null($old_value) || is_null($old_value->value)) { return $default; } diff --git a/app/Http/Controllers/ServerController.php b/app/Http/Controllers/ServerController.php index d291e298..0c18a508 100644 --- a/app/Http/Controllers/ServerController.php +++ b/app/Http/Controllers/ServerController.php @@ -8,8 +8,6 @@ use App\Models\Pterodactyl\Nest; use App\Models\Pterodactyl\Node; use App\Models\Product; use App\Models\Server; -use App\Models\User; -use App\Models\Settings; use App\Notifications\ServerCreationError; use Carbon\Carbon; use App\Settings\UserSettings; @@ -18,7 +16,6 @@ use App\Settings\PterodactylSettings; use App\Classes\PterodactylClient; use App\Settings\GeneralSettings; use Exception; -use GuzzleHttp\Promise\Create; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Client\Response; use Illuminate\Http\RedirectResponse; diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index fb6e8f9c..5e1f05d0 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,7 +2,6 @@ namespace App\Providers; -use App\Extensions\PaymentGateways\PayPal\PayPalSettings; use App\Models\UsefulLink; use App\Settings\GeneralSettings; use App\Settings\MailSettings; @@ -89,20 +88,23 @@ class AppServiceProvider extends ServiceProvider Log::error("Couldnt find useful_links. Probably the installation is not completet. " . $e); } - $generalSettings = $this->app->make(GeneralSettings::class); - if (!file_exists(base_path('themes') . "/" . $generalSettings->theme)) { - $generalSettings->theme = "default"; + + try { + $generalSettings = $this->app->make(GeneralSettings::class); + if (!file_exists(base_path('themes') . "/" . $generalSettings->theme)) { + $generalSettings->theme = "default"; + } + + if ($generalSettings->theme && $generalSettings->theme !== config('theme.active')) { + Theme::set($generalSettings->theme, "default"); + } else { + Theme::set("default", "default"); + } + + $settings = $this->app->make(MailSettings::class); + $settings->setConfig(); + } catch (Exception $e) { + Log::error("Couldnt load Settings. Probably the installation is not completet. " . $e); } - - if ($generalSettings->theme && $generalSettings->theme !== config('theme.active')) { - Theme::set($generalSettings->theme, "default"); - } else { - Theme::set("default", "default"); - } - - - $settings = $this->app->make(MailSettings::class); - $settings->setConfig(); - } } diff --git a/config/settings.php b/config/settings.php index 6b6ae4b7..e9a3a4b1 100644 --- a/config/settings.php +++ b/config/settings.php @@ -32,7 +32,7 @@ return [ UserSettings::class, WebsiteSettings::class, TicketSettings::class, - CouponSettings::class, + CouponSettings::class, ], /* diff --git a/routes/web.php b/routes/web.php index a6a2ab3c..42d2edf3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -77,11 +77,13 @@ Route::middleware(['auth', 'checkSuspended'])->group(function () { Route::patch('/servers/cancel/{server}', [ServerController::class, 'cancel'])->name('servers.cancel'); Route::resource('servers', ServerController::class); - if (config('app.key')) { + try { $serverSettings = app(App\Settings\ServerSettings::class); - if ($serverSettings->enable_upgrade) { - Route::post('servers/{server}/upgrade', [ServerController::class, 'upgrade'])->name('servers.upgrade'); + if ($serverSettings->creation_enabled) { + Route::resource('servers', ServerController::class); } + } catch (Exception $e) { + // Do nothing if the settings are not available. } Route::post('profile/selfdestruct', [ProfileController::class, 'selfDestroyUser'])->name('profile.selfDestroyUser'); From 38cf81d92d4d418599514d13bdf4f0f3bd290ed1 Mon Sep 17 00:00:00 2001 From: IceToast Date: Fri, 12 Apr 2024 21:01:49 +0200 Subject: [PATCH 10/33] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Use=20groups=20on?= =?UTF-8?q?=20getNewValue=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...08_094402_update_user_credits_datatype.php | 2 +- ...3_02_01_164731_create_general_settings.php | 43 ++++++++------- ..._01_181334_create_pterodactyl_settings.php | 20 ++++--- ...2023_02_01_181453_create_mail_settings.php | 36 +++++++------ ...2023_02_01_181925_create_user_settings.php | 52 ++++++++++--------- ...23_02_01_181950_create_server_settings.php | 16 +++--- ...3_02_01_182021_create_invoice_settings.php | 36 +++++++------ ...3_02_01_182043_create_discord_settings.php | 28 +++++----- ...23_02_01_182108_create_locale_settings.php | 24 +++++---- ..._02_01_182135_create_referral_settings.php | 28 +++++----- ...3_02_01_182158_create_website_settings.php | 40 +++++++------- ...23_02_04_181156_create_ticket_settings.php | 12 +++-- ..._delete_notify_add_ticket_information.php} | 6 +++ 13 files changed, 196 insertions(+), 147 deletions(-) rename database/settings/{2023_05_07_195343_ticket_information.php => 2023_05_07_195343_delete_notify_add_ticket_information.php} (70%) diff --git a/database/migrations/2023_05_08_094402_update_user_credits_datatype.php b/database/migrations/2023_05_08_094402_update_user_credits_datatype.php index 292102cc..db0acb2f 100644 --- a/database/migrations/2023_05_08_094402_update_user_credits_datatype.php +++ b/database/migrations/2023_05_08_094402_update_user_credits_datatype.php @@ -26,7 +26,7 @@ class UpdateUserCreditsDatatype extends Migration public function down() { Schema::table('users', function (Blueprint $table) { - $table->decimal('price', ['11', '2'])->change(); + $table->decimal('credits', ['11', '2'])->change(); }); } } diff --git a/database/settings/2023_02_01_164731_create_general_settings.php b/database/settings/2023_02_01_164731_create_general_settings.php index 5e7360dc..06c876c5 100644 --- a/database/settings/2023_02_01_164731_create_general_settings.php +++ b/database/settings/2023_02_01_164731_create_general_settings.php @@ -27,70 +27,73 @@ class CreateGeneralSettings extends LegacySettingsMigration DB::table('settings_old')->insert([ [ 'key' => 'SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME', - 'value' => $this->getNewValue('credits_display_name'), + 'value' => $this->getNewValue('credits_display_name', 'general'), 'type' => 'string', 'description' => 'The name of the credits on the panel.' ], [ 'key' => 'SETTINGS::SYSTEM:ALERT_ENABLED', - 'value' => $this->getNewValue('alert_enabled'), + 'value' => $this->getNewValue('alert_enabled', 'general'), 'type' => 'boolean', 'description' => 'Enable the alert at the top of the panel.' ], [ 'key' => 'SETTINGS::SYSTEM:ALERT_TYPE', - 'value' => $this->getNewValue('alert_type'), + 'value' => $this->getNewValue('alert_type', 'general'), 'type' => 'string', 'description' => 'The type of alert to display.' ], [ 'key' => 'SETTINGS::SYSTEM:ALERT_MESSAGE', - 'value' => $this->getNewValue('alert_message'), + 'value' => $this->getNewValue('alert_message', 'general'), 'type' => 'text', 'description' => 'The message to display in the alert.' ], [ 'key' => 'SETTINGS::SYSTEM:THEME', - 'value' => $this->getNewValue('theme'), + 'value' => $this->getNewValue('theme', 'general'), 'type' => 'string', 'description' => 'The theme to use for the panel.' ], [ 'key' => 'SETTINGS::RECAPTCHA:SITE_KEY', - 'value' => $this->getNewValue('recaptcha_site_key'), + 'value' => $this->getNewValue('recaptcha_site_key', 'general'), 'type' => 'string', 'description' => 'The site key for reCAPTCHA.' ], [ 'key' => 'SETTINGS::RECAPTCHA:SECRET_KEY', - 'value' => $this->getNewValue('recaptcha_secret_key'), + 'value' => $this->getNewValue('recaptcha_secret_key', 'general'), 'type' => 'string', 'description' => 'The secret key for reCAPTCHA.' ], [ 'key' => 'SETTINGS::RECAPTCHA:ENABLED', - 'value' => $this->getNewValue('recaptcha_enabled'), + 'value' => $this->getNewValue('recaptcha_enabled', 'general'), 'type' => 'boolean', 'description' => 'Enable reCAPTCHA on the panel.' ], [ 'key' => 'SETTINGS::MISC:PHPMYADMIN:URL', - 'value' => $this->getNewValue('phpmyadmin_url'), + 'value' => $this->getNewValue('phpmyadmin_url', 'general'), 'type' => 'string', 'description' => 'The URL to your phpMyAdmin installation.' ], ]); - - $this->migrator->delete('general.store_enabled'); - $this->migrator->delete('general.credits_display_name'); - $this->migrator->delete('general.recaptcha_site_key'); - $this->migrator->delete('general.recaptcha_secret_key'); - $this->migrator->delete('general.recaptcha_enabled'); - $this->migrator->delete('general.phpmyadmin_url'); - $this->migrator->delete('general.alert_enabled'); - $this->migrator->delete('general.alert_type'); - $this->migrator->delete('general.alert_message'); - $this->migrator->delete('general.theme'); + try { + $this->migrator->delete('general.store_enabled'); + $this->migrator->delete('general.credits_display_name'); + $this->migrator->delete('general.recaptcha_site_key'); + $this->migrator->delete('general.recaptcha_secret_key'); + $this->migrator->delete('general.recaptcha_enabled'); + $this->migrator->delete('general.phpmyadmin_url'); + $this->migrator->delete('general.alert_enabled'); + $this->migrator->delete('general.alert_type'); + $this->migrator->delete('general.alert_message'); + $this->migrator->delete('general.theme'); + } catch (Exception $e) { + // Do nothing + } } } diff --git a/database/settings/2023_02_01_181334_create_pterodactyl_settings.php b/database/settings/2023_02_01_181334_create_pterodactyl_settings.php index d8f65248..1bf0c7c0 100644 --- a/database/settings/2023_02_01_181334_create_pterodactyl_settings.php +++ b/database/settings/2023_02_01_181334_create_pterodactyl_settings.php @@ -24,33 +24,37 @@ class CreatePterodactylSettings extends LegacySettingsMigration DB::table('settings_old')->insert([ [ 'key' => 'SETTINGS::SYSTEM:PTERODACTYL:TOKEN', - 'value' => $this->getNewValue('admin_token'), + 'value' => $this->getNewValue('admin_token', 'pterodactyl'), 'type' => 'string', 'description' => 'The admin token for the Pterodactyl panel.', ], [ 'key' => 'SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN', - 'value' => $this->getNewValue('user_token'), + 'value' => $this->getNewValue('user_token', 'pterodactyl'), 'type' => 'string', 'description' => 'The user token for the Pterodactyl panel.', ], [ 'key' => 'SETTINGS::SYSTEM:PTERODACTYL:URL', - 'value' => $this->getNewValue('panel_url'), + 'value' => $this->getNewValue('panel_url', 'pterodactyl'), 'type' => 'string', 'description' => 'The URL for the Pterodactyl panel.', ], [ 'key' => 'SETTINGS::SYSTEM:PTERODACTYL:PER_PAGE_LIMIT', - 'value' => $this->getNewValue('per_page_limit'), + 'value' => $this->getNewValue('per_page_limit', 'pterodactyl'), 'type' => 'integer', 'description' => 'The number of servers to show per page.', ], ]); - $this->migrator->delete('pterodactyl.admin_token'); - $this->migrator->delete('pterodactyl.user_token'); - $this->migrator->delete('pterodactyl.panel_url'); - $this->migrator->delete('pterodactyl.per_page_limit'); + try { + $this->migrator->delete('pterodactyl.admin_token'); + $this->migrator->delete('pterodactyl.user_token'); + $this->migrator->delete('pterodactyl.panel_url'); + $this->migrator->delete('pterodactyl.per_page_limit'); + } catch (Exception $e) { + echo 'Caught exception: ', $e->getMessage(), "\n"; + } } } diff --git a/database/settings/2023_02_01_181453_create_mail_settings.php b/database/settings/2023_02_01_181453_create_mail_settings.php index 42ab0f4b..b7d2c0d3 100644 --- a/database/settings/2023_02_01_181453_create_mail_settings.php +++ b/database/settings/2023_02_01_181453_create_mail_settings.php @@ -25,62 +25,66 @@ class CreateMailSettings extends LegacySettingsMigration DB::table('settings_old')->insert([ [ 'key' => 'SETTINGS::MAIL:HOST', - 'value' => $this->getNewValue('mail_host'), + 'value' => $this->getNewValue('mail_host', 'mail'), 'type' => 'string', 'description' => 'The host of the mail server.', ], [ 'key' => 'SETTINGS::MAIL:PORT', - 'value' => $this->getNewValue('mail_port'), + 'value' => $this->getNewValue('mail_port', 'mail'), 'type' => 'integer', 'description' => 'The port of the mail server.', ], [ 'key' => 'SETTINGS::MAIL:USERNAME', - 'value' => $this->getNewValue('mail_username'), + 'value' => $this->getNewValue('mail_username', 'mail'), 'type' => 'string', 'description' => 'The username of the mail server.', ], [ 'key' => 'SETTINGS::MAIL:PASSWORD', - 'value' => $this->getNewValue('mail_password'), + 'value' => $this->getNewValue('mail_password', 'mail'), 'type' => 'string', 'description' => 'The password of the mail server.', ], [ 'key' => 'SETTINGS::MAIL:ENCRYPTION', - 'value' => $this->getNewValue('mail_encryption'), + 'value' => $this->getNewValue('mail_encryption', 'mail'), 'type' => 'string', 'description' => 'The encryption of the mail server.', ], [ 'key' => 'SETTINGS::MAIL:FROM_ADDRESS', - 'value' => $this->getNewValue('mail_from_address'), + 'value' => $this->getNewValue('mail_from_address', 'mail'), 'type' => 'string', 'description' => 'The from address of the mail server.', ], [ 'key' => 'SETTINGS::MAIL:FROM_NAME', - 'value' => $this->getNewValue('mail_from_name'), + 'value' => $this->getNewValue('mail_from_name', 'mail'), 'type' => 'string', 'description' => 'The from name of the mail server.', ], [ 'key' => 'SETTINGS::MAIL:MAILER', - 'value' => $this->getNewValue('mail_mailer'), + 'value' => $this->getNewValue('mail_mailer', 'mail'), 'type' => 'string', 'description' => 'The mailer of the mail server.', ], ]); - $this->migrator->delete('mail.mail_host'); - $this->migrator->delete('mail.mail_port'); - $this->migrator->delete('mail.mail_username'); - $this->migrator->delete('mail.mail_password'); - $this->migrator->delete('mail.mail_encryption'); - $this->migrator->delete('mail.mail_from_address'); - $this->migrator->delete('mail.mail_from_name'); - $this->migrator->delete('mail.mail_mailer'); + try { + $this->migrator->delete('mail.mail_host'); + $this->migrator->delete('mail.mail_port'); + $this->migrator->delete('mail.mail_username'); + $this->migrator->delete('mail.mail_password'); + $this->migrator->delete('mail.mail_encryption'); + $this->migrator->delete('mail.mail_from_address'); + $this->migrator->delete('mail.mail_from_name'); + $this->migrator->delete('mail.mail_mailer'); + } catch (Exception $e) { + // + } } } diff --git a/database/settings/2023_02_01_181925_create_user_settings.php b/database/settings/2023_02_01_181925_create_user_settings.php index 8c9e088b..683c998b 100644 --- a/database/settings/2023_02_01_181925_create_user_settings.php +++ b/database/settings/2023_02_01_181925_create_user_settings.php @@ -29,92 +29,96 @@ class CreateUserSettings extends LegacySettingsMigration DB::table('settings_old')->insert([ [ 'key' => 'SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_DISCORD', - 'value' => $this->getNewValue('credits_reward_after_verify_discord'), + 'value' => $this->getNewValue('credits_reward_after_verify_discord', 'user'), 'type' => 'integer', 'description' => 'The amount of credits that the user will receive after verifying their Discord account.', ], [ 'key' => 'SETTINGS::USER:CREDITS_REWARD_AFTER_VERIFY_EMAIL', - 'value' => $this->getNewValue('credits_reward_after_verify_email'), + 'value' => $this->getNewValue('credits_reward_after_verify_email', 'user'), 'type' => 'integer', 'description' => 'The amount of credits that the user will receive after verifying their email.', ], [ 'key' => 'SETTINGS::USER:FORCE_DISCORD_VERIFICATION', - 'value' => $this->getNewValue('force_discord_verification'), + 'value' => $this->getNewValue('force_discord_verification', 'user'), 'type' => 'boolean', 'description' => 'If the user must verify their Discord account to use the panel.', ], [ 'key' => 'SETTINGS::USER:FORCE_EMAIL_VERIFICATION', - 'value' => $this->getNewValue('force_email_verification'), + 'value' => $this->getNewValue('force_email_verification', 'user'), 'type' => 'boolean', 'description' => 'If the user must verify their email to use the panel.', ], [ 'key' => 'SETTINGS::USER:INITIAL_CREDITS', - 'value' => $this->getNewValue('initial_credits'), + 'value' => $this->getNewValue('initial_credits', 'user'), 'type' => 'integer', 'description' => 'The amount of credits that the user will receive when they register.', ], [ 'key' => 'SETTINGS::USER:INITIAL_SERVER_LIMIT', - 'value' => $this->getNewValue('initial_server_limit'), + 'value' => $this->getNewValue('initial_server_limit', 'user'), 'type' => 'integer', 'description' => 'The amount of servers that the user will be able to create when they register.', ], [ 'key' => 'SETTINGS::USER:MINIMUM_REQUIRED_CREDITS_TO_MAKE_SERVER', - 'value' => $this->getNewValue('min_credits_to_make_server'), + 'value' => $this->getNewValue('min_credits_to_make_server', 'user'), 'type' => 'integer', 'description' => 'The minimum amount of credits that the user must have to create a server.', ], [ 'key' => 'SETTINGS::USER:SERVER_LIMIT_AFTER_IRL_PURCHASE', - 'value' => $this->getNewValue('server_limit_after_irl_purchase'), + 'value' => $this->getNewValue('server_limit_after_irl_purchase', 'user'), 'type' => 'integer', 'description' => 'The amount of servers that the user will be able to create after making a real purchase.', ], [ 'key' => 'SETTINGS::USER:SERVER_LIMIT_REWARD_AFTER_VERIFY_DISCORD', - 'value' => $this->getNewValue('server_limit_after_verify_discord'), + 'value' => $this->getNewValue('server_limit_after_verify_discord', 'user'), 'type' => 'integer', 'description' => 'The amount of servers that the user will be able to create after verifying their Discord account.', ], [ 'key' => 'SETTINGS::USER:SERVER_LIMIT_REWARD_AFTER_VERIFY_EMAIL', - 'value' => $this->getNewValue('server_limit_after_verify_email'), + 'value' => $this->getNewValue('server_limit_after_verify_email', 'user'), 'type' => 'integer', 'description' => 'The amount of servers that the user will be able to create after verifying their email.', ], [ 'key' => 'SETTINGS::SYSTEM:REGISTER_IP_CHECK', - 'value' => $this->getNewValue('register_ip_check'), + 'value' => $this->getNewValue('register_ip_check', 'user'), 'type' => 'boolean', 'description' => 'If the user must verify their IP address to register.', ], [ 'key' => 'SETTINGS::SYSTEM:CREATION_OF_NEW_USERS', - 'value' => $this->getNewValue('creation_enabled'), + 'value' => $this->getNewValue('creation_enabled', 'user'), 'type' => 'boolean', 'description' => 'If the user can register.', ], ]); - $this->migrator->delete('user.credits_reward_after_verify_discord'); - $this->migrator->delete('user.credits_reward_after_verify_email'); - $this->migrator->delete('user.force_discord_verification'); - $this->migrator->delete('user.force_email_verification'); - $this->migrator->delete('user.initial_credits'); - $this->migrator->delete('user.initial_server_limit'); - $this->migrator->delete('user.min_credits_to_make_server'); - $this->migrator->delete('user.server_limit_after_irl_purchase'); - $this->migrator->delete('user.server_limit_after_verify_discord'); - $this->migrator->delete('user.server_limit_after_verify_email'); - $this->migrator->delete('user.register_ip_check'); - $this->migrator->delete('user.creation_enabled'); + try { + $this->migrator->delete('user.credits_reward_after_verify_discord'); + $this->migrator->delete('user.credits_reward_after_verify_email'); + $this->migrator->delete('user.force_discord_verification'); + $this->migrator->delete('user.force_email_verification'); + $this->migrator->delete('user.initial_credits'); + $this->migrator->delete('user.initial_server_limit'); + $this->migrator->delete('user.min_credits_to_make_server'); + $this->migrator->delete('user.server_limit_after_irl_purchase'); + $this->migrator->delete('user.server_limit_after_verify_discord'); + $this->migrator->delete('user.server_limit_after_verify_email'); + $this->migrator->delete('user.register_ip_check'); + $this->migrator->delete('user.creation_enabled'); + } catch (Exception $e) { + // Do nothing + } } } diff --git a/database/settings/2023_02_01_181950_create_server_settings.php b/database/settings/2023_02_01_181950_create_server_settings.php index de25c94f..bd63d8e7 100644 --- a/database/settings/2023_02_01_181950_create_server_settings.php +++ b/database/settings/2023_02_01_181950_create_server_settings.php @@ -20,26 +20,30 @@ class CreateServerSettings extends LegacySettingsMigration DB::table('settings_old')->insert([ [ 'key' => 'SETTINGS::SERVER:ALLOCATION_LIMIT', - 'value' => $this->getNewValue('allocation_limit'), + 'value' => $this->getNewValue('allocation_limit', 'server'), 'type' => 'integer', 'description' => 'The number of servers to show per page.', ], [ 'key' => 'SETTINGS::SYSTEM:CREATION_OF_NEW_SERVERS', - 'value' => $this->getNewValue('creation_enabled'), + 'value' => $this->getNewValue('creation_enabled', 'server'), 'type' => 'boolean', 'description' => 'Whether or not users can create new servers.', ], [ 'key' => 'SETTINGS::SYSTEM:ENABLE_UPGRADE', - 'value' => $this->getNewValue('enable_upgrade'), + 'value' => $this->getNewValue('enable_upgrade', 'server'), 'type' => 'boolean', 'description' => 'Whether or not users can upgrade their servers.', ], ]); - $this->migrator->delete('server.allocation_limit'); - $this->migrator->delete('server.creation_enabled'); - $this->migrator->delete('server.enable_upgrade'); + try { + $this->migrator->delete('server.allocation_limit'); + $this->migrator->delete('server.creation_enabled'); + $this->migrator->delete('server.enable_upgrade'); + } catch (Exception $e) { + // Do nothing + } } } diff --git a/database/settings/2023_02_01_182021_create_invoice_settings.php b/database/settings/2023_02_01_182021_create_invoice_settings.php index effc67d7..d3ac8f63 100644 --- a/database/settings/2023_02_01_182021_create_invoice_settings.php +++ b/database/settings/2023_02_01_182021_create_invoice_settings.php @@ -25,61 +25,65 @@ class CreateInvoiceSettings extends LegacySettingsMigration DB::table('settings_old')->insert([ [ 'key' => 'SETTINGS::INVOICE:COMPANY_ADDRESS', - 'value' => $this->getNewValue('company_address'), + 'value' => $this->getNewValue('company_address', 'invoice'), 'type' => 'string', 'description' => 'The address of the company.', ], [ 'key' => 'SETTINGS::INVOICE:COMPANY_MAIL', - 'value' => $this->getNewValue('company_mail'), + 'value' => $this->getNewValue('company_mail', 'invoice'), 'type' => 'string', 'description' => 'The email address of the company.', ], [ 'key' => 'SETTINGS::INVOICE:COMPANY_NAME', - 'value' => $this->getNewValue('company_name'), + 'value' => $this->getNewValue('company_name', 'invoice'), 'type' => 'string', 'description' => 'The name of the company.', ], [ 'key' => 'SETTINGS::INVOICE:COMPANY_PHONE', - 'value' => $this->getNewValue('company_phone'), + 'value' => $this->getNewValue('company_phone', 'invoice'), 'type' => 'string', 'description' => 'The phone number of the company.', ], [ 'key' => 'SETTINGS::INVOICE:COMPANY_VAT', - 'value' => $this->getNewValue('company_vat'), + 'value' => $this->getNewValue('company_vat', 'invoice'), 'type' => 'string', 'description' => 'The VAT number of the company.', ], [ 'key' => 'SETTINGS::INVOICE:COMPANY_WEBSITE', - 'value' => $this->getNewValue('company_website'), + 'value' => $this->getNewValue('company_website', 'invoice'), 'type' => 'string', 'description' => 'The website of the company.', ], [ 'key' => 'SETTINGS::INVOICE:ENABLED', - 'value' => $this->getNewValue('enabled'), + 'value' => $this->getNewValue('enabled', 'invoice'), 'type' => 'boolean', 'description' => 'Enable or disable the invoice system.', ], [ 'key' => 'SETTINGS::INVOICE:PREFIX', - 'value' => $this->getNewValue('prefix'), + 'value' => $this->getNewValue('prefix', 'invoice'), 'type' => 'string', 'description' => 'The prefix of the invoice.', ], ]); - $this->migrator->delete('invoice.company_address'); - $this->migrator->delete('invoice.company_mail'); - $this->migrator->delete('invoice.company_name'); - $this->migrator->delete('invoice.company_phone'); - $this->migrator->delete('invoice.company_vat'); - $this->migrator->delete('invoice.company_website'); - $this->migrator->delete('invoice.enabled'); - $this->migrator->delete('invoice.prefix'); + try { + $this->migrator->delete('invoice.company_address'); + $this->migrator->delete('invoice.company_mail'); + $this->migrator->delete('invoice.company_name'); + $this->migrator->delete('invoice.company_phone'); + $this->migrator->delete('invoice.company_vat'); + $this->migrator->delete('invoice.company_website'); + $this->migrator->delete('invoice.enabled'); + $this->migrator->delete('invoice.prefix'); + } catch (Exception $e) { + // Do nothing + } } } diff --git a/database/settings/2023_02_01_182043_create_discord_settings.php b/database/settings/2023_02_01_182043_create_discord_settings.php index 21ccc5b6..c8216c49 100644 --- a/database/settings/2023_02_01_182043_create_discord_settings.php +++ b/database/settings/2023_02_01_182043_create_discord_settings.php @@ -23,48 +23,52 @@ class CreateDiscordSettings extends LegacySettingsMigration DB::table('settings_old')->insert([ [ 'key' => 'SETTINGS::DISCORD:BOT_TOKEN', - 'value' => $this->getNewValue('bot_token'), + 'value' => $this->getNewValue('bot_token', 'discord'), 'type' => 'string', 'description' => 'The bot token for the Discord bot.', ], [ 'key' => 'SETTINGS::DISCORD:CLIENT_ID', - 'value' => $this->getNewValue('client_id'), + 'value' => $this->getNewValue('client_id', 'discord'), 'type' => 'string', 'description' => 'The client ID for the Discord bot.', ], [ 'key' => 'SETTINGS::DISCORD:CLIENT_SECRET', - 'value' => $this->getNewValue('client_secret'), + 'value' => $this->getNewValue('client_secret', 'discord'), 'type' => 'string', 'description' => 'The client secret for the Discord bot.', ], [ 'key' => 'SETTINGS::DISCORD:GUILD_ID', - 'value' => $this->getNewValue('guild_id'), + 'value' => $this->getNewValue('guild_id', 'discord'), 'type' => 'string', 'description' => 'The guild ID for the Discord bot.', ], [ 'key' => 'SETTINGS::DISCORD:INVITE_URL', - 'value' => $this->getNewValue('invite_url'), + 'value' => $this->getNewValue('invite_url', 'discord'), 'type' => 'string', 'description' => 'The invite URL for the Discord bot.', ], [ 'key' => 'SETTINGS::DISCORD:ROLE_ID', - 'value' => $this->getNewValue('role_id'), + 'value' => $this->getNewValue('role_id', 'discord'), 'type' => 'string', 'description' => 'The role ID for the Discord bot.', ] ]); - $this->migrator->delete('discord.bot_token'); - $this->migrator->delete('discord.client_id'); - $this->migrator->delete('discord.client_secret'); - $this->migrator->delete('discord.guild_id'); - $this->migrator->delete('discord.invite_url'); - $this->migrator->delete('discord.role_id'); + try { + $this->migrator->delete('discord.bot_token'); + $this->migrator->delete('discord.client_id'); + $this->migrator->delete('discord.client_secret'); + $this->migrator->delete('discord.guild_id'); + $this->migrator->delete('discord.invite_url'); + $this->migrator->delete('discord.role_id'); + } catch (Exception $e) { + // Do nothing. + } } } diff --git a/database/settings/2023_02_01_182108_create_locale_settings.php b/database/settings/2023_02_01_182108_create_locale_settings.php index 13dbde9d..86f3d6e4 100644 --- a/database/settings/2023_02_01_182108_create_locale_settings.php +++ b/database/settings/2023_02_01_182108_create_locale_settings.php @@ -22,40 +22,44 @@ class CreateLocaleSettings extends LegacySettingsMigration DB::table('settings_old')->insert([ [ 'key' => 'SETTINGS::LOCALE:AVAILABLE', - 'value' => $this->getNewValue('available'), + 'value' => $this->getNewValue('available', 'locale'), 'type' => 'string', 'description' => 'The available locales.', ], [ 'key' => 'SETTINGS::LOCALE:CLIENTS_CAN_CHANGE', - 'value' => $this->getNewValue('clients_can_change'), + 'value' => $this->getNewValue('clients_can_change', 'locale'), 'type' => 'boolean', 'description' => 'If clients can change their locale.', ], [ 'key' => 'SETTINGS::LOCALE:DATATABLES', - 'value' => $this->getNewValue('datatables'), + 'value' => $this->getNewValue('datatables', 'locale'), 'type' => 'string', 'description' => 'The locale for datatables.', ], [ 'key' => 'SETTINGS::LOCALE:DEFAULT', - 'value' => $this->getNewValue('default'), + 'value' => $this->getNewValue('default', 'locale'), 'type' => 'string', 'description' => 'The default locale.', ], [ 'key' => 'SETTINGS::LOCALE:DYNAMIC', - 'value' => $this->getNewValue('dynamic'), + 'value' => $this->getNewValue('dynamic', 'locale'), 'type' => 'boolean', 'description' => 'If the locale should be dynamic.', ], ]); - $this->migrator->delete('locale.available'); - $this->migrator->delete('locale.clients_can_change'); - $this->migrator->delete('locale.datatables'); - $this->migrator->delete('locale.default'); - $this->migrator->delete('locale.dynamic'); + try { + $this->migrator->delete('locale.available'); + $this->migrator->delete('locale.clients_can_change'); + $this->migrator->delete('locale.datatables'); + $this->migrator->delete('locale.default'); + $this->migrator->delete('locale.dynamic'); + } catch (Exception $e) { + // Do nothing + } } } diff --git a/database/settings/2023_02_01_182135_create_referral_settings.php b/database/settings/2023_02_01_182135_create_referral_settings.php index 839f0e28..ed7ff3fd 100644 --- a/database/settings/2023_02_01_182135_create_referral_settings.php +++ b/database/settings/2023_02_01_182135_create_referral_settings.php @@ -22,47 +22,51 @@ class CreateReferralSettings extends LegacySettingsMigration DB::table('settings_old')->insert([ [ 'key' => 'SETTINGS::REFERRAL::ALLOWED', - 'value' => $this->getNewValue('allowed'), + 'value' => $this->getNewValue('allowed', 'referral'), 'type' => 'string', 'description' => 'The allowed referral types.', ], [ 'key' => 'SETTINGS::REFERRAL::ALWAYS_GIVE_COMMISSION', - 'value' => $this->getNewValue('always_give_commission'), + 'value' => $this->getNewValue('always_give_commission', 'referral'), 'type' => 'boolean', 'description' => 'Whether to always give commission to the referrer.', ], [ 'key' => 'SETTINGS::REFERRAL::ENABLED', - 'value' => $this->getNewValue('enabled'), + 'value' => $this->getNewValue('enabled', 'referral'), 'type' => 'boolean', 'description' => 'Whether to enable the referral system.', ], [ 'key' => 'SETTINGS::REFERRAL::REWARD', - 'value' => $this->getNewValue('reward'), + 'value' => $this->getNewValue('reward', 'referral'), 'type' => 'integer', 'description' => 'The reward for the referral.', ], [ 'key' => 'SETTINGS::REFERRAL:MODE', - 'value' => $this->getNewValue('mode'), + 'value' => $this->getNewValue('mode', 'referral'), 'type' => 'string', 'description' => 'The referral mode.', ], [ 'key' => 'SETTINGS::REFERRAL:PERCENTAGE', - 'value' => $this->getNewValue('percentage'), + 'value' => $this->getNewValue('percentage', 'referral'), 'type' => 'integer', 'description' => 'The referral percentage.', ], ]); - $this->migrator->delete('referral.allowed'); - $this->migrator->delete('referral.always_give_commission'); - $this->migrator->delete('referral.enabled'); - $this->migrator->delete('referral.reward'); - $this->migrator->delete('referral.mode'); - $this->migrator->delete('referral.percentage'); + try { + $this->migrator->delete('referral.allowed'); + $this->migrator->delete('referral.always_give_commission'); + $this->migrator->delete('referral.enabled'); + $this->migrator->delete('referral.reward'); + $this->migrator->delete('referral.mode'); + $this->migrator->delete('referral.percentage'); + } catch (Exception $e) { + // + } } } diff --git a/database/settings/2023_02_01_182158_create_website_settings.php b/database/settings/2023_02_01_182158_create_website_settings.php index 2bbdd5b5..eb8f3295 100644 --- a/database/settings/2023_02_01_182158_create_website_settings.php +++ b/database/settings/2023_02_01_182158_create_website_settings.php @@ -33,68 +33,72 @@ class CreateWebsiteSettings extends LegacySettingsMigration DB::table('settings_old')->insert([ [ 'key' => 'SETTINGS::SYSTEM:MOTD_ENABLED', - 'value' => $this->getNewValue('motd_enabled'), + 'value' => $this->getNewValue('motd_enabled', 'website'), 'type' => 'boolean', 'description' => 'Enable or disable the MOTD.', ], [ 'key' => 'SETTINGS::SYSTEM:MOTD_MESSAGE', - 'value' => $this->getNewValue('motd_message'), + 'value' => $this->getNewValue('motd_message', 'website'), 'type' => 'text', 'description' => 'The message that will be displayed in the MOTD.', ], [ 'key' => 'SETTINGS::SYSTEM:SHOW_IMPRINT', - 'value' => $this->getNewValue('show_imprint'), + 'value' => $this->getNewValue('show_imprint', 'website'), 'type' => 'boolean', 'description' => 'Enable or disable the imprint.', ], [ 'key' => 'SETTINGS::SYSTEM:SHOW_PRIVACY', - 'value' => $this->getNewValue('show_privacy'), + 'value' => $this->getNewValue('show_privacy', 'website'), 'type' => 'boolean', 'description' => 'Enable or disable the privacy policy.', ], [ 'key' => 'SETTINGS::SYSTEM:SHOW_TOS', - 'value' => $this->getNewValue('show_tos'), + 'value' => $this->getNewValue('show_tos', 'website'), 'type' => 'boolean', 'description' => 'Enable or disable the terms of service.', ], [ 'key' => 'SETTINGS::SYSTEM:USEFULLINKS_ENABLED', - 'value' => $this->getNewValue('useful_links_enabled'), + 'value' => $this->getNewValue('useful_links_enabled', 'website'), 'type' => 'boolean', 'description' => 'Enable or disable the useful links.', ], [ 'key' => 'SETTINGS::SYSTEM:SEO_TITLE', - 'value' => $this->getNewValue('seo_title'), + 'value' => $this->getNewValue('seo_title', 'website'), 'type' => 'string', 'description' => 'The title of the website.', ], [ 'key' => 'SETTINGS::SYSTEM:SEO_DESCRIPTION', - 'value' => $this->getNewValue('seo_description'), + 'value' => $this->getNewValue('seo_description', 'website'), 'type' => 'string', 'description' => 'The description of the website.', ], [ 'key' => 'SETTINGS::SYSTEM:ENABLE_LOGIN_LOGO', - 'value' => $this->getNewValue('enable_login_logo'), + 'value' => $this->getNewValue('enable_login_logo', 'website'), 'type' => 'boolean', 'description' => 'Enable or disable the login logo.', ] ]); - $this->migrator->delete('website.motd_enabled'); - $this->migrator->delete('website.motd_message'); - $this->migrator->delete('website.show_imprint'); - $this->migrator->delete('website.show_privacy'); - $this->migrator->delete('website.show_tos'); - $this->migrator->delete('website.useful_links_enabled'); - $this->migrator->delete('website.seo_title'); - $this->migrator->delete('website.seo_description'); - $this->migrator->delete('website.enable_login_logo'); + try { + $this->migrator->delete('website.motd_enabled'); + $this->migrator->delete('website.motd_message'); + $this->migrator->delete('website.show_imprint'); + $this->migrator->delete('website.show_privacy'); + $this->migrator->delete('website.show_tos'); + $this->migrator->delete('website.useful_links_enabled'); + $this->migrator->delete('website.seo_title'); + $this->migrator->delete('website.seo_description'); + $this->migrator->delete('website.enable_login_logo'); + } catch (Exception $e) { + // Do nothing + } } } diff --git a/database/settings/2023_02_04_181156_create_ticket_settings.php b/database/settings/2023_02_04_181156_create_ticket_settings.php index 41eefe73..b4cfd8f2 100644 --- a/database/settings/2023_02_04_181156_create_ticket_settings.php +++ b/database/settings/2023_02_04_181156_create_ticket_settings.php @@ -19,19 +19,23 @@ class CreateTicketSettings extends LegacySettingsMigration DB::table('settings_old')->insert([ [ 'key' => 'SETTINGS::TICKET:NOTIFY', - 'value' => $this->getNewValue('notify'), + 'value' => $this->getNewValue('notify', 'ticket'), 'type' => 'string', 'description' => 'The notification type for tickets.', ], [ 'key' => 'SETTINGS::TICKET:ENABLED', - 'value' => $this->getNewValue('enabled'), + 'value' => $this->getNewValue('enabled', 'ticket'), 'type' => 'boolean', 'description' => 'Enable or disable the ticket system.', ] ]); - $this->migrator->delete('ticket.enabled'); - $this->migrator->delete('ticket.notify'); + try { + $this->migrator->delete('ticket.enabled'); + $this->migrator->delete('ticket.notify'); + } catch (Exception $e) { + // Do nothing. + } } } diff --git a/database/settings/2023_05_07_195343_ticket_information.php b/database/settings/2023_05_07_195343_delete_notify_add_ticket_information.php similarity index 70% rename from database/settings/2023_05_07_195343_ticket_information.php rename to database/settings/2023_05_07_195343_delete_notify_add_ticket_information.php index 21d9aa67..68ec4555 100644 --- a/database/settings/2023_05_07_195343_ticket_information.php +++ b/database/settings/2023_05_07_195343_delete_notify_add_ticket_information.php @@ -9,4 +9,10 @@ return new class extends SettingsMigration $this->migrator->delete('ticket.notify'); $this->migrator->add('ticket.information', "Can't start your server? Need an additional port? Do you have any other questions? Let us know by opening a ticket."); } + + public function down(): void + { + $this->migrator->add('ticket.notify', 'all'); + $this->migrator->delete('ticket.information'); + } }; From 931f08a1d7e73fdbfe5bfe2041e32d5ce0c2c6e1 Mon Sep 17 00:00:00 2001 From: IceToast Date: Wed, 24 Apr 2024 10:47:39 +0200 Subject: [PATCH 11/33] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Try=20Catch=20for?= =?UTF-8?q?=20upgrade=20routing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/web.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/routes/web.php b/routes/web.php index 42d2edf3..c575ea98 100644 --- a/routes/web.php +++ b/routes/web.php @@ -34,6 +34,7 @@ use App\Http\Controllers\TicketsController; use App\Http\Controllers\TranslationController; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Route; /* @@ -80,10 +81,10 @@ Route::middleware(['auth', 'checkSuspended'])->group(function () { try { $serverSettings = app(App\Settings\ServerSettings::class); if ($serverSettings->creation_enabled) { - Route::resource('servers', ServerController::class); + Route::post('servers/{server}/upgrade', [ServerController::class, 'upgrade'])->name('servers.upgrade'); } } catch (Exception $e) { - // Do nothing if the settings are not available. + Log::error("ServerSettings not found, skipping server upgrade route"); } Route::post('profile/selfdestruct', [ProfileController::class, 'selfDestroyUser'])->name('profile.selfDestroyUser'); From e35bbddc40d65b581dccd584e916dffd775273b2 Mon Sep 17 00:00:00 2001 From: IceToast Date: Wed, 24 Apr 2024 10:54:06 +0200 Subject: [PATCH 12/33] =?UTF-8?q?chore:=20=E2=99=BB=EF=B8=8F=20Add=20encry?= =?UTF-8?q?pted=20prop=20back=20in?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Settings/DiscordSettings.php | 2 -- app/Settings/MailSettings.php | 7 ++++++- app/Settings/PterodactylSettings.php | 8 +++++++- .../2023_02_01_181334_create_pterodactyl_settings.php | 2 -- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/Settings/DiscordSettings.php b/app/Settings/DiscordSettings.php index 4788ae7e..79981c71 100644 --- a/app/Settings/DiscordSettings.php +++ b/app/Settings/DiscordSettings.php @@ -18,8 +18,6 @@ class DiscordSettings extends Settings return 'discord'; } - - /** * Summary of validations array * @return array diff --git a/app/Settings/MailSettings.php b/app/Settings/MailSettings.php index 90b5a328..c3a9a367 100644 --- a/app/Settings/MailSettings.php +++ b/app/Settings/MailSettings.php @@ -20,7 +20,12 @@ class MailSettings extends Settings return 'mail'; } - + public static function encrypted(): array + { + return [ + 'mail_password', + ]; + } public function setConfig() { diff --git a/app/Settings/PterodactylSettings.php b/app/Settings/PterodactylSettings.php index 3e888b93..c9693386 100644 --- a/app/Settings/PterodactylSettings.php +++ b/app/Settings/PterodactylSettings.php @@ -16,7 +16,13 @@ class PterodactylSettings extends Settings return 'pterodactyl'; } - + public static function encrypted(): array + { + return [ + 'admin_token', + 'user_token', + ]; + } /** * Get url with ensured ending backslash diff --git a/database/settings/2023_02_01_181334_create_pterodactyl_settings.php b/database/settings/2023_02_01_181334_create_pterodactyl_settings.php index 1bf0c7c0..dbbb93b6 100644 --- a/database/settings/2023_02_01_181334_create_pterodactyl_settings.php +++ b/database/settings/2023_02_01_181334_create_pterodactyl_settings.php @@ -11,8 +11,6 @@ class CreatePterodactylSettings extends LegacySettingsMigration $this->migrator->addEncrypted('pterodactyl.admin_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:TOKEN', '') : env('PTERODACTYL_TOKEN', '')); $this->migrator->addEncrypted('pterodactyl.user_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN', '') : ''); - // $this->migrator->add('pterodactyl.admin_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:TOKEN') : env('PTERODACTYL_TOKEN', '')); - // $this->migrator->add('pterodactyl.user_token', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN') : ''); $this->migrator->add('pterodactyl.panel_url', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:URL', '') : env('PTERODACTYL_URL', '')); $this->migrator->add('pterodactyl.per_page_limit', $table_exists ? $this->getOldValue('SETTINGS::SYSTEM:PTERODACTYL:PER_PAGE_LIMIT', 200) : 200); } From d5ffe982d8c4f0ee21b4cddbea6abd0176531963 Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 30 Apr 2024 14:28:48 +0200 Subject: [PATCH 13/33] UPDATE: moved building.md to a readme in the developement docker --- BUILDING.md => docker/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename BUILDING.md => docker/README.md (100%) diff --git a/BUILDING.md b/docker/README.md similarity index 100% rename from BUILDING.md rename to docker/README.md From 75c6dfcb798089bb188493bb395359f2d734eca0 Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 30 Apr 2024 14:29:03 +0200 Subject: [PATCH 14/33] UPDATE: moved contributing.md to .github --- CONTRIBUTING.md => .github/CONTRIBUTING.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename CONTRIBUTING.md => .github/CONTRIBUTING.md (100%) diff --git a/CONTRIBUTING.md b/.github/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.md rename to .github/CONTRIBUTING.md From 5c32ff24912bfeac82a11d039a0b50a80482e2cc Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 30 Apr 2024 14:29:18 +0200 Subject: [PATCH 15/33] ADD: empty code of conduct in .github --- .github/CODE_OF_CONDUCT.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/CODE_OF_CONDUCT.md diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..e69de29b From bc190dceb6f62229c5018fabc07c50207c2bda16 Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 30 Apr 2024 14:41:18 +0200 Subject: [PATCH 16/33] FIX: bug and feature displaying differently --- .github/ISSUE_TEMPLATE/bug.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 24b38f4f..f9e8e9ec 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -1,6 +1,6 @@ name: "\U0001F41B Bug report" description: Create a report to help us improve -title: "[Bug]: " +title: "[Bug] " labels: ["bug"] body: - type: textarea From 971458a01b8d5a35c66730d051c244441f035c51 Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 30 Apr 2024 14:46:10 +0200 Subject: [PATCH 17/33] ADD: empty issue template --- .github/PULL_REQUEST_TEMPLATE.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..e69de29b From 37e505c37eb286fc9d62b32839ed6f360dea7b4c Mon Sep 17 00:00:00 2001 From: S0ly Date: Mon, 6 May 2024 11:52:52 +0200 Subject: [PATCH 18/33] REMOVE: empty composer file at root --- composer | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 composer diff --git a/composer b/composer deleted file mode 100644 index e69de29b..00000000 From 077ee2c7e4b325257dd3d160f161f931941c5347 Mon Sep 17 00:00:00 2001 From: S0ly Date: Mon, 6 May 2024 11:54:03 +0200 Subject: [PATCH 19/33] REMOVE: strange unused test.json file --- test.json | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 test.json diff --git a/test.json b/test.json deleted file mode 100644 index e0ff4215..00000000 --- a/test.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "PASSWORD": "", - "USERNAME": "", - "AUTO_UPDATE": "0", - "BOT_PY_FILE": "bot.py", - "PY_PACKAGES": "", - "USER_UPLOAD": "0", - "INSTALL_REPO": "", - "INSTALL_BRANCH": "" - } -] From 3656c8169d74300c8a3be2a52f3ee5067738066d Mon Sep 17 00:00:00 2001 From: S0ly Date: Mon, 6 May 2024 11:59:44 +0200 Subject: [PATCH 20/33] UPDATE: cleared and documented git files --- .gitattributes | 5 +++++ .gitignore | 35 ++++++++++++++++++++--------------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/.gitattributes b/.gitattributes index 967315dd..2f74b7dd 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,10 @@ +# Automatically detect text files * text=auto + +# Vendored files for specific languages *.css linguist-vendored *.scss linguist-vendored *.js linguist-vendored + +# Ignore CHANGELOG.md when exporting CHANGELOG.md export-ignore diff --git a/.gitignore b/.gitignore index ad9d095b..f72249a8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,29 +1,34 @@ +# Ignore dependencies and cache /node_modules +/vendor +/storage/*.key + +# Ignore public assets /public/hot /public/storage -/storage/*.key -/vendor -/storage/credit_deduction_log -storage/debugbar +/storage/app/public/logo.png + +# Ignore environment files and configuration .env .env.testing .env.backup -.idea +.env.dev + +# Ignore testing and debug logs .phpunit.result.cache -.editorconfig -docker-compose.override.yml -Homestead.json -Homestead.yaml npm-debug.log yarn-error.log yarn.lock + +# Ignore Docker and Homestead configuration +docker-compose.override.yml +Homestead.json +Homestead.yaml + +# Ignore gitignore itself .gitignore -.env.dev -.env.testing -storage/invoices.zip -storage/app/public/logo.png -*vscode - - Kopie.env + +# Ignore installation logs and locks public/install/logs.txt install.lock public/install/logs/installer.log From f18e8c817774edfde0475439065ab0f60aa2c241 Mon Sep 17 00:00:00 2001 From: S0ly Date: Mon, 6 May 2024 11:59:57 +0200 Subject: [PATCH 21/33] UPDATE: cleared and documented .env.exemple --- .env.example | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/.env.example b/.env.example index 98f9662b..46f1a273 100644 --- a/.env.example +++ b/.env.example @@ -4,25 +4,24 @@ APP_ENV=production APP_KEY= APP_DEBUG=false APP_URL=http://localhost -# List with timezones https://www.php.net/manual/en/timezones.php -APP_TIMEZONE=UTC +APP_TIMEZONE=UTC # List with timezones https://www.php.net/manual/en/timezones.php ### --- App Settings End --- ### -### --- DB Settings (required) --- ### +### --- Database Settings (required) --- ### DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=dashboard DB_USERNAME=dashboarduser DB_PASSWORD= -### --- DB Settings End --- ### +### --- Database Settings End --- ### - -# Google Recaptcha API Credentials - https://www.google.com/recaptcha/admin - reCaptcha V2 (not v3) +### --- Google Recaptcha Settings --- ### RECAPTCHA_SITE_KEY=6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI RECAPTCHA_SECRET_KEY=6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe +### --- Google Recaptcha Settings End --- ### -# Mail Server Settings - (HOST -> SMTP Server) +### --- Mail Server Settings --- ### MAIL_MAILER=smtp MAIL_HOST=mailhog MAIL_PORT=1025 @@ -31,25 +30,22 @@ MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}" +### --- Mail Server Settings End --- ### - -# Laravel Logging Settings - https://laravel.com/docs/5.7/logging - Not needed to be changed +### --- Logging Settings --- ### LOG_CHANNEL=stack LOG_LEVEL=debug +### --- Logging Settings End --- ### -# Do not change anything below this line -BROADCAST_DRIVER=log +### --- Cache and Queue Settings --- ### CACHE_DRIVER=file QUEUE_CONNECTION=database SESSION_DRIVER=file SESSION_LIFETIME=120 +SETTINGS_CACHE_ENABLED=true +### --- Cache and Queue Settings End --- ### -MEMCACHED_HOST=127.0.0.1 - -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - +### --- External Services Credentials --- ### AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 @@ -59,9 +55,15 @@ PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 +### --- External Services Credentials End --- ### + +### --- Additional Configuration --- ### +MEMCACHED_HOST=127.0.0.1 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" - -# Settings Cache -SETTINGS_CACHE_ENABLED=true +### --- Additional Configuration End --- ### From b2ee49f534059cc75115f2702970413f4adf94f8 Mon Sep 17 00:00:00 2001 From: S0ly Date: Mon, 6 May 2024 12:02:18 +0200 Subject: [PATCH 22/33] UPDATE: de-mixed the code of conduct from the contribute file --- .github/CODE_OF_CONDUCT.md | 25 +++++++++++++++++++++++++ .github/CONTRIBUTING.md | 26 -------------------------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index e69de29b..1714350a 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,25 @@ +## Code of Conduct + +### Our Pledge +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +### Coding Style + +We are following the PSR12 code standard for PHP. + +### Our Standards +Examples of behavior that contributes to creating a positive environment include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a professional setting diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 74ddb1f9..c7d33644 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -15,29 +15,3 @@ php artisan translatable:export en 1. Give your PR a good descriptive title, so we can view immediately what the PR is about. 2. The dev team will look at your code and approve / merge when possible. 3. Make sure your PR follows our code of conduct and coding style. - -## Code of Conduct - -### Our Pledge -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -### Coding Style - -We are following the PSR12 code standard for PHP. - -### Our Standards -Examples of behavior that contributes to creating a positive environment include: - -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Focusing on what is best for the community -- Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -- The use of sexualized language or imagery and unwelcome sexual attention or advances -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or electronic address, without explicit permission -- Other conduct which could reasonably be considered inappropriate in a professional setting From 0f138cab1dffd0c046b6854d2ae8133210e2f2f3 Mon Sep 17 00:00:00 2001 From: S0ly Date: Mon, 6 May 2024 12:13:35 +0200 Subject: [PATCH 23/33] ADD: basic Pull request tempalte --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e69de29b..50d3e388 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +⚠️ Please be sure that you have read pull request rules. + +Tick the checkbox if you understand [x]: +- [ ] I have read and understand the pull request rules. + +# Description + +Fixes #(issue) + +## Type of change + +Please delete any options that are not relevant. + +- Bug fix (non-breaking change which fixes an issue) +- User interface (UI) +- New feature (non-breaking change which adds functionality) +- Breaking change (a fix or feature that would cause existing functionality to not work as expected) +- Other +- This change requires a documentation update + +## Checklist + +- [ ] My code follows the style guidelines of this project +- [ ] I have performed a self-review of my own code and tested it +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] My changes generates no new warnings +- [ ] My code needed automated testing. I have added them (this is optional task) + +## Screenshots (if any) + +Please do not use any external image service. Instead, just paste in or drag and drop the image here, and it will be uploaded automatically. \ No newline at end of file From 9b45d76b445cf166c16c1ab026d967a8cabb2ee5 Mon Sep 17 00:00:00 2001 From: S0ly Date: Mon, 6 May 2024 12:30:52 +0200 Subject: [PATCH 24/33] ADD: Basic Security Policy --- .github/SECURITY.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/SECURITY.md diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 00000000..e3c6ecee --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,17 @@ +# Security Policy + +## Reporting a Vulnerability + +Please report security issues to ... + +Do not use the public issue tracker or discuss it in public as it will cause more damage. + +## Do you accept other 3rd-party bug bounty platforms? + +At this moment, we do not accept other bug bounty platforms, please report through GitHub Advisories only. We will ignore all 3rd-party bug bounty platforms emails. + +## Supported Versions + +### ControlPanel Versions + +You should use or upgrade to the latest version of ControlPanel. From 44a6946c44257bb5dc781c024c1d75003c3c0f6f Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 7 May 2024 09:59:15 +0200 Subject: [PATCH 25/33] UPDATE: made a better security policy --- .github/SECURITY.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/SECURITY.md b/.github/SECURITY.md index e3c6ecee..278e81e7 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -2,16 +2,16 @@ ## Reporting a Vulnerability -Please report security issues to ... +🛡️ If you discover a security vulnerability, please report it to us via GitHub Advisories. -Do not use the public issue tracker or discuss it in public as it will cause more damage. +⚠️ Please refrain from using the public issue tracker or discussing the vulnerability in public channels, as it may exacerbate the issue. -## Do you accept other 3rd-party bug bounty platforms? +## Acceptance of Bug Bounty Platforms -At this moment, we do not accept other bug bounty platforms, please report through GitHub Advisories only. We will ignore all 3rd-party bug bounty platforms emails. +At this time, we only accept vulnerability reports through GitHub Advisories. We kindly ask that you do not submit reports via other third-party bug bounty platforms, as they will be disregarded. ## Supported Versions ### ControlPanel Versions -You should use or upgrade to the latest version of ControlPanel. +We strongly recommend using or upgrading to the latest version of ControlPanel to ensure you have access to the latest security fixes and enhancements. From f12ab58c8e0d3cb91e4a44b403a71f0db68fbec8 Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 7 May 2024 09:59:27 +0200 Subject: [PATCH 26/33] UPDATE: made a better code of conduct --- .github/CODE_OF_CONDUCT.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index 1714350a..6b807f42 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -1,13 +1,10 @@ ## Code of Conduct -### Our Pledge -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. +### 🤝 Our Pledge -### Coding Style +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. -We are following the PSR12 code standard for PHP. - -### Our Standards +### 🌟 Our Standards Examples of behavior that contributes to creating a positive environment include: - Using welcoming and inclusive language From cad6361e492e312dcd011ef6ff59c477a6b84618 Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 7 May 2024 09:59:39 +0200 Subject: [PATCH 27/33] UPDATE: made a better contributing policy --- .github/CONTRIBUTING.md | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index c7d33644..ff44e211 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,17 +1,34 @@ -# Contributing +# Contributing Guidelines -When contributing to this repository, please go through the open issues to see if you can contribute to something. If you want to contribute something that is not in the issues you can make an issue and wait for response from the dev team. +Thank you for considering contributing to this repository! Before making a contribution, please take a moment to review the following guidelines. -Please note we have a code of conduct, please follow it in all your interactions with the project. +## 🕵️‍♂️ Finding Tasks -If you added any Strings which are displayed at the frontend please localize them (e.g. "New String" -> {{ __('New String') }}) and run the localization string generation: +Check the open issues to see if there's something you can contribute to. If you have an idea or encounter a bug that's not already listed, feel free to create a new issue and wait for feedback from the development team. +## 🤝 Code of Conduct + +Please adhere to our [Code of Conduct](link-to-code-of-conduct) in all your interactions with the project. + +## 🌍 Localization + +If you add any strings that are displayed on the frontend, please localize them using the following format: +``` +"New String" -> {{ __('New String') }} +``` +After adding localized strings, run the following command to generate localization files: ```cmd php artisan translatable:export en ``` -## Pull request process +## 🚀 Pull Request Process -1. Give your PR a good descriptive title, so we can view immediately what the PR is about. -2. The dev team will look at your code and approve / merge when possible. -3. Make sure your PR follows our code of conduct and coding style. +1. Give your pull request (PR) a clear and descriptive title that summarizes the changes. +2. The development team will review your code and provide feedback or approve/merge it when appropriate. +3. Ensure that your PR follows our Code of Conduct and coding style guidelines. + +### 💻 Coding Style + +We follow the PSR12 code standard for PHP. + +Thank you for your contributions! 🎉 From 14e200f88e655a6f337677d7baf03854b90a7123 Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 7 May 2024 09:59:50 +0200 Subject: [PATCH 28/33] UPDATE: made a better pull request template --- .github/PULL_REQUEST_TEMPLATE.md | 38 ++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 50d3e388..095ada5e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,31 +1,35 @@ -⚠️ Please be sure that you have read pull request rules. +✨ Thank you for your contribution to our project! Before you submit your pull request, please take a moment to review and complete the following -Tick the checkbox if you understand [x]: -- [ ] I have read and understand the pull request rules. +⚠️ Please modify this template below and if not already one, read our pull request rules, Thanks! -# Description +Ensure that your pull request meets the following criteria: -Fixes #(issue) +- The code follows the style guidelines of this project +- You have performed a self-review of your own code and tested it +- You have commented your code, particularly in hard-to-understand areas +- Your changes generate no new warnings -## Type of change +--- -Please delete any options that are not relevant. +💡 **Description** + +Briefly describe the purpose of your pull request, including any relevant issue numbers it addresses. + +--- + +🛠️ **Type of Change** + +Please select the appropriate type of change: - Bug fix (non-breaking change which fixes an issue) -- User interface (UI) +- User interface (UI) improvement - New feature (non-breaking change which adds functionality) - Breaking change (a fix or feature that would cause existing functionality to not work as expected) - Other - This change requires a documentation update -## Checklist +--- -- [ ] My code follows the style guidelines of this project -- [ ] I have performed a self-review of my own code and tested it -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] My changes generates no new warnings -- [ ] My code needed automated testing. I have added them (this is optional task) +🖼️ **Screenshots (if applicable)** -## Screenshots (if any) - -Please do not use any external image service. Instead, just paste in or drag and drop the image here, and it will be uploaded automatically. \ No newline at end of file +If your pull request includes any visual changes, please provide screenshots here, do not use any external link. From 5ea4ceda6babd1468791b41c470ca53e71d36b54 Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 7 May 2024 10:00:00 +0200 Subject: [PATCH 29/33] UPDATE: made a better main readme --- README.md | 100 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 57 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index c121ff78..092ac217 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,81 @@ -### Features - -- PayPal, Stripe and Mollie Integration -- Hourly, Weekely, Monthly, Quarterly and Annual billing Cycles -- Referral System -- Partner System -- Ticket System -- Upgrade/Downgrade Server Resources -- Store (credit system with hourly billing and invoices) -- Email Verification -- Audit Log -- Admin Dashboard -- User/Server Management -- Customisable server plans -- Vouchers -- Alert System -- Theme Support -- and so much more! +
    + +
    # CtrlPanel-gg -![ctrlpanel](https://user-images.githubusercontent.com/67899387/214684708-739c1d21-06e8-4dec-a4f1-81533a46cc7e.png) +CtrlPanel offers an easy-to-use and free billing solution for all starting and experienced hosting providers that seamlessly integrates with the Pterodactyl panel. It facilitates account creation, server ordering, and management, while offering addons, multiple payment methods, and customizable themes for a comprehensive solution. +![GitHub tag](https://img.shields.io/github/tag/ControlPanel-gg/dashboard) +![Overall Installations](https://img.shields.io/badge/Overall%20Installations-5000%2B-green) +![GitHub stars](https://img.shields.io/github/stars/ControlPanel-gg/dashboard) +[![Crowdin](https://badges.crowdin.net/controlpanelgg/localized.svg)](https://crowdin.com/project/controlpanelgg) +![License](https://img.shields.io/github/license/ControlPanel-gg/dashboard) +![Discord](https://img.shields.io/discord/787829714483019826) -![](https://img.shields.io/endpoint?label=v0.9%20Installations&url=https%3A%2F%2Fmarket.ctrlpanel.gg%2Fcallhome.php%3Fgetinstalls) -![](https://img.shields.io/badge/Overall%20Installations-5000%2B-green) -![](https://img.shields.io/github/stars/ctrlpanel-gg/dashboard) ![](https://img.shields.io/github/forks/ctrlpanel-gg/panel) ![](https://img.shields.io/github/tag/ctrlpanel-gg/panel) [![Crowdin](https://badges.crowdin.com/project/controlpanelgg/localized.svg)](https://crowdin.com/project/controlpanelgg) ![](https://img.shields.io/github/issues/ctrlpanel-gg/panel) ![](https://img.shields.io/github/license/ctrlpanel-gg/panel) ![](https://img.shields.io/discord/787829714483019826) -## About +![CtrlPanel](https://user-images.githubusercontent.com/67899387/214684708-739c1d21-06e8-4dec-a4f1-81533a46cc7e.png) -CtrlPanel's Dashboard is a dashboard application designed to offer clients a management tool to manage their pterodactyl servers. This dashboard comes with a credit-based billing solution that charges users depending on the billing cycle you chose for each server they have and suspends them if they run out of credits. +## ⭐ Features -This dashboard offers an easy to use and free billing solution for all starting and experienced hosting providers. This dashboard has many customisation options and added discord Oauth verification to offer a solid link between your discord server and your dashboard. You can check our [Demo here](https://demo.CtrlPanel.gg "Demo"). +- Store (credit system with hourly billing and invoices) +- Many Popular Payment Methods +- Referral +- Partner +- Vouchers +- Ticket +- Account Management +- Admin Dashboard and Tools +- Addon Support +- and more! -### [Installation](https://ctrlpanel.gg/docs/intro "Installation") +## ⛰️ Live Demo -### [Updating](https://ctrlpanel.gg/docs/Installation/updating "Updating") +Try it! -### [Discord](https://discord.gg/4Y6HjD2uyU "Discord") +Demo Server: [demo.CtrlPanel.gg](https://demo.CtrlPanel.gg) -### [Contributing](https://ctrlpanel.gg/docs/Contributing/contributing "Contributing") +It is a temporary live demo; all data will be deleted. -### [Donating](https://ctrlpanel.gg/docs/Contributing/donating "Donating") +## 🔧 How to Install +### 🐳 Docker +```bash +docker run ... +``` -# Preview +CtrlPanel is now running on [0.0.0.0:3001](http://0.0.0.0:3001). Don't forget to configure the database and Pterodactyl. [Documentation](documentation link here) -### Server Creation -![image](https://user-images.githubusercontent.com/67899387/214687234-d1ae58c0-5667-4e99-ac39-adeaabfcc7f2.png) +more info: [Docker](docker documentation link here) -### Overview -![image](https://user-images.githubusercontent.com/67899387/214685859-03c8d9e1-c685-4a07-979f-df2e88ec3931.png) +### 💪🏻 Non-Docker -### Example server products -![image](https://user-images.githubusercontent.com/67899387/214686950-218e1ede-6a1f-4e53-b3f4-fe1abc371a9c.png) +Requirements: -### Ticket System -![image](https://user-images.githubusercontent.com/67899387/214687123-0a3d0f8f-b53c-4b0d-869a-4d5df45f5184.png) +- Platform + - Major Linux distros such as Debian, Ubuntu, CentOS, Fedora, and ArchLinux etc. + - Windows 10 (x64), Windows Server ... -### Voucher System -![image](https://user-images.githubusercontent.com/67899387/214686578-ec9f0b0f-6047-4665-835f-70594b56dfd5.png) +Follow the [documentation](documentation link here) to know how to install. -### Partner System -![image](https://user-images.githubusercontent.com/67899387/214686321-36ba97a3-4181-4e60-9ba3-c9b318fe66a8.png) +### MarketPlace +If you need more functionality, check out [Marketplace](https://market.ctrlpanel.gg/resources/). +## 🆙 How to Update +Please read: [Update Instructions](https://ctrlpanel.gg/docs/Installation/updating) + +## 🆕 What's Next? + +Roadmap: [CtrlPanel Roadmap](https://github.com/orgs/Ctrlpanel-gg/projects/1) + +## 🗣️ Discussion / Ask for Help + +For any general or technical questions, join CtrlPanel Discord for finding answers to your question. If you cannot find the information you need, feel free to ask. + +## 🤝 Contributing + +Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. + +Thanks to all contributors and supporters! From 8c98acb20a5a0d9bc93ba5c1d7a228b9e8311191 Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 7 May 2024 10:18:22 +0200 Subject: [PATCH 30/33] FIX: links in main readme --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 092ac217..36c11d00 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
    - +
    # CtrlPanel-gg @@ -34,19 +34,21 @@ Try it! Demo Server: [demo.CtrlPanel.gg](https://demo.CtrlPanel.gg) -It is a temporary live demo; all data will be deleted. + ## 🔧 How to Install ### 🐳 Docker -```bash +Soon... + + ### 💪🏻 Non-Docker @@ -56,7 +58,7 @@ Requirements: - Major Linux distros such as Debian, Ubuntu, CentOS, Fedora, and ArchLinux etc. - Windows 10 (x64), Windows Server ... -Follow the [documentation](documentation link here) to know how to install. +Follow the [documentation](https://ctrlpanel.gg/docs/intro) to know how to install. ### MarketPlace @@ -76,6 +78,6 @@ For any general or technical questions, join CtrlPanel Discord for finding answe ## 🤝 Contributing -Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. +Please read [CONTRIBUTING.md](https://github.com/Ctrlpanel-gg/panel/blob/main/.github/CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. Thanks to all contributors and supporters! From f563dcdd741ed080d12d1c5fddd482143a5c5796 Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 7 May 2024 10:19:27 +0200 Subject: [PATCH 31/33] FIX: links in contributing.md --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index ff44e211..72eb32a7 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -8,7 +8,7 @@ Check the open issues to see if there's something you can contribute to. If you ## 🤝 Code of Conduct -Please adhere to our [Code of Conduct](link-to-code-of-conduct) in all your interactions with the project. +Please adhere to our [Code of Conduct](https://github.com/Ctrlpanel-gg/panel/blob/main/.github/CODE_OF_CONDUCT.md) in all your interactions with the project. ## 🌍 Localization From 6f55e306c1dce4756a0c21d23114abcee3cbf5f1 Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 7 May 2024 10:22:32 +0200 Subject: [PATCH 32/33] ADD: warning to default pull request text --- .github/PULL_REQUEST_TEMPLATE.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 095ada5e..89224a42 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,6 @@ ✨ Thank you for your contribution to our project! Before you submit your pull request, please take a moment to review and complete the following -⚠️ Please modify this template below and if not already one, read our pull request rules, Thanks! +⚠️ Please modify this template below and if not already done, read our pull request rules, Thanks! Ensure that your pull request meets the following criteria: @@ -9,6 +9,8 @@ Ensure that your pull request meets the following criteria: - You have commented your code, particularly in hard-to-understand areas - Your changes generate no new warnings +Delete the above text and the following sections before submitting your pull request. + --- 💡 **Description** From 812b817968e656588f56e3a076082a03ee267051 Mon Sep 17 00:00:00 2001 From: S0ly Date: Tue, 7 May 2024 10:32:24 +0200 Subject: [PATCH 33/33] ADD: donation to the project main readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 36c11d00..291c86cf 100644 --- a/README.md +++ b/README.md @@ -81,3 +81,7 @@ For any general or technical questions, join CtrlPanel Discord for finding answe Please read [CONTRIBUTING.md](https://github.com/Ctrlpanel-gg/panel/blob/main/.github/CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. Thanks to all contributors and supporters! + +## ♥️ Donations + +If you like what we do, please consider [supporting](https://ctrlpanel.gg/docs/Contributing/donating) us.
  • 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 Date: Sat, 17 Feb 2024 23:38:30 +0530 Subject: [PATCH 02/33] fix: installer showing feeding failed, as well as adding proper error handling. --- public/install/forms.php | 35 +++++++++++++++++------------------ public/install/functions.php | 20 ++++++++++++++------ 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/public/install/forms.php b/public/install/forms.php index 98f05657..96f1dfa1 100644 --- a/public/install/forms.php +++ b/public/install/forms.php @@ -29,8 +29,7 @@ if (isset($_POST['checkDB'])) { try { $db = new mysqli($_POST['databasehost'], $_POST['databaseuser'], $_POST['databaseuserpass'], $_POST['database'], $_POST['databaseport']); - } - catch (mysqli_sql_exception $e) { + } catch (mysqli_sql_exception $e) { wh_log($e->getMessage(), 'error'); header('LOCATION: index.php?step=2&message=' . $e->getMessage()); exit(); @@ -69,26 +68,26 @@ if (isset($_POST['feedDB'])) { wh_log('Feeding the Database', 'debug'); $logs = ''; - //$logs .= run_console(setenv('COMPOSER_HOME', dirname(__FILE__, 3) . '/vendor/bin/composer')); - //$logs .= run_console('composer install --no-dev --optimize-autoloader'); - if (!str_contains(getenv('APP_KEY'), 'base64')) { - $logs .= run_console('php artisan key:generate --force'); - } else { - $logs .= "Key already exists. Skipping\n"; - } - $logs .= run_console('php artisan storage:link'); - $logs .= run_console('php artisan migrate --seed --force'); - $logs .= run_console('php artisan db:seed --class=ExampleItemsSeeder --force'); - $logs .= run_console('php artisan db:seed --class=PermissionsSeeder --force'); + try { + //$logs .= run_console(setenv('COMPOSER_HOME', dirname(__FILE__, 3) . '/vendor/bin/composer')); + //$logs .= run_console('composer install --no-dev --optimize-autoloader'); + if (!str_contains(getenv('APP_KEY'), 'base64')) { + $logs .= run_console('php artisan key:generate --force'); + } else { + $logs .= "Key already exists. Skipping\n"; + } + $logs .= run_console('php artisan storage:link'); + $logs .= run_console('php artisan migrate --seed --force'); + $logs .= run_console('php artisan db:seed --class=ExampleItemsSeeder --force'); + $logs .= run_console('php artisan db:seed --class=PermissionsSeeder --force'); - wh_log($logs, 'debug'); + wh_log($logs, 'debug'); - if (str_contains(getenv('APP_KEY'), 'base64')) { wh_log('Feeding the Database successful', 'debug'); header('LOCATION: index.php?step=3'); - } else { - wh_log('Feeding the Database failed', 'debug'); - header('LOCATION: index.php?step=2.5&message=There was an error. Please check the installer.log file in /var/www/controlpanel/storage/logs !'); + } catch (\Throwable $th) { + wh_log('Feeding the Database failed', 'error'); + header("LOCATION: index.php?step=2.5&message=" . $th->getMessage() . "
    Please check the installer.log file in /var/www/controlpanel/storage/logs !"); } } diff --git a/public/install/functions.php b/public/install/functions.php index 8eb1318c..451d8b95 100644 --- a/public/install/functions.php +++ b/public/install/functions.php @@ -10,7 +10,7 @@ use Monolog\Handler\StreamHandler; use Monolog\Logger; if (!file_exists('../../.env')) { - echo run_console('cp .env.example .env'); + echo run_console('cp .env.example .env'); } (new DotEnv(dirname(__FILE__, 3) . '/.env'))->load(); @@ -150,7 +150,8 @@ function checkExtensions(): array return $not_ok; } -function removeQuotes($string){ +function removeQuotes($string) +{ return str_replace('"', "", $string); } @@ -162,7 +163,7 @@ function removeQuotes($string){ */ function setenv($envKey, $envValue) { - $envFile = dirname(__FILE__, 3).'/.env'; + $envFile = dirname(__FILE__, 3) . '/.env'; $str = file_get_contents($envFile); $str .= "\n"; // In case the searched variable is in the last line without \n @@ -236,9 +237,16 @@ function run_console(string $command, array $descriptors = null, string $cwd = n $path = dirname(__FILE__, 3); $descriptors = $descriptors ?? [0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['pipe', 'w']]; $handle = proc_open("cd '$path' && bash -c 'exec -a ServerCPP $command'", $descriptors, $pipes, $cwd, null, $options); + $output = stream_get_contents($pipes[1]); + $exit_code = proc_close($handle); - wh_log('command result: ' . stream_get_contents($pipes[1]), 'debug'); - return stream_get_contents($pipes[1]); + if ($exit_code > 0) { + wh_log('command result: ' . $output, 'error'); + throw new Exception("There was an error after running command `$command`", $exit_code); + return $output; + } else { + return $output; + } } /** @@ -259,7 +267,7 @@ function wh_log(string $message, string $level = 'info', array $context = []): v switch (strtolower($level)) { case 'debug': // Only log debug messages if APP_DEBUG is true - if(getenv('APP_DEBUG') === false) return; + if (getenv('APP_DEBUG') === false) return; $log->debug($message, $context); break; case 'info': From bfb169e1917f4249ea55aa57c86342aa4a320a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=A2=C2=80MrWeez?= Date: Thu, 29 Feb 2024 01:29:31 +0300 Subject: [PATCH 03/33] Added support for php8.3 --- public/install/functions.php | 2 +- storage/app/public/logo.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 storage/app/public/logo.png diff --git a/public/install/functions.php b/public/install/functions.php index 451d8b95..a5f2b045 100644 --- a/public/install/functions.php +++ b/public/install/functions.php @@ -19,7 +19,7 @@ $required_extensions = ['openssl', 'gd', 'mysql', 'PDO', 'mbstring', 'tokenizer' $requirements = [ 'minPhp' => '8.1', - 'maxPhp' => '8.3', // This version is not supported + 'maxPhp' => '8.4', // This version is not supported 'mysql' => '5.7.22', ]; diff --git a/storage/app/public/logo.png b/storage/app/public/logo.png old mode 100644 new mode 100755 From afe3fd23c5d0156fd1a14325daf8238e2357b46f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=A2=C2=80MrWeez?= Date: Thu, 29 Feb 2024 13:42:15 +0300 Subject: [PATCH 04/33] Repair docker image for PHP-FPM by Hyd3r1 --- docker/docker-compose.yml | 20 +++----------------- docker/php/Dockerfile | 13 +++++-------- 2 files changed, 8 insertions(+), 25 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 98eded4a..56c9e24d 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -12,7 +12,7 @@ services: ports: - 80:80 volumes: - - "../:/var/www/html:delegated" + - "../:/var/www/html" depends_on: - php - mysql @@ -42,7 +42,7 @@ services: dockerfile: docker/php/Dockerfile container_name: controlpanel_php volumes: - - "../:/var/www/html:delegated" + - "../:/var/www/html" networks: - laravel @@ -61,19 +61,5 @@ services: networks: - laravel - redis: - image: "redis:alpine" - command: redis-server --requirepass sOmE_sEcUrE_pAsS - ports: - - "6379:6379" - volumes: - - $PWD/redis-data:/var/lib/redis - - $PWD/redis.conf:/usr/local/etc/redis/redis.conf - environment: - - REDIS_REPLICATION_MODE=master - networks: - - laravel - - volumes: - mysql: + mysql: \ No newline at end of file diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile index 65dfab87..4b8d91dd 100644 --- a/docker/php/Dockerfile +++ b/docker/php/Dockerfile @@ -1,16 +1,14 @@ -FROM php:8.0-fpm-alpine3.13 +FROM php:8.1-fpm-buster +RUN apt-get update \ + && apt-get install -y build-essential zlib1g-dev default-mysql-client curl gnupg procps vim git unzip libzip-dev libpq-dev libicu-dev libonig-dev libpng-dev libjpeg-dev libfreetype6-dev -RUN apk update && apk upgrade -RUN apk add --no-cache --repository https://alpine.global.ssl.fastly.net/alpine/edge/community/ - -RUN apk add --no-cache curl-dev icu-dev libzip-dev -RUN docker-php-ext-install mysqli pdo pdo_mysql intl zip +RUN docker-php-ext-install mysqli pdo pdo_mysql intl zip gd bcmath ADD ./docker/php/www.conf /usr/local/etc/php-fpm.d/ RUN mkdir -p /var/www/html -RUN addgroup -g 1000 laravel && adduser -G laravel -g laravel -s /bin/sh -D laravel +RUN addgroup --gid 1000 laravel && adduser --ingroup laravel --uid 1000 --shell /bin/sh --disabled-password --gecos "" laravel RUN chown laravel:laravel /var/www/html WORKDIR /var/www/html @@ -18,4 +16,3 @@ WORKDIR /var/www/html USER laravel COPY --from=composer:latest /usr/bin/composer /usr/bin/composer - From 6f6517033e0a3a23e6e3b15e0138d57422e56743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=A2=C2=80MrWeez?= Date: Thu, 29 Feb 2024 14:15:58 +0300 Subject: [PATCH 05/33] Fixed old link and name --- themes/default/views/admin/overview/index.blade.php | 2 +- themes/default/views/information/privacy-content.blade.php | 4 ++-- themes/default/views/information/tos-content.blade.php | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/themes/default/views/admin/overview/index.blade.php b/themes/default/views/admin/overview/index.blade.php index e9c4debf..09f07e93 100644 --- a/themes/default/views/admin/overview/index.blade.php +++ b/themes/default/views/admin/overview/index.blade.php @@ -43,7 +43,7 @@ class="mr-2 fas fa-link">
    {{__('Documentation')}}