diff --git a/app/Http/Controllers/SetupController.php b/app/Http/Controllers/SetupController.php index 94af83064f18..5acb280e0a69 100644 --- a/app/Http/Controllers/SetupController.php +++ b/app/Http/Controllers/SetupController.php @@ -53,64 +53,60 @@ class SetupController extends Controller public function doSetup(StoreSetupRequest $request) { - $check = SystemHealth::check(false); + try { + $check = SystemHealth::check(false); + } catch (\Exception $e) { + info(['message' => $e->getMessage(), 'action' => 'SetupController::doSetup()']); + + return response()->json(['message' => $e->getMessage()], 400); + } if ($check['system_health'] === false) { info($check); - return response('Oops, something went wrong. Check your logs.'); /* We should never reach this block, but jic. */ + return response('Oops, something went wrong. Check your logs.'); /* We should never reach this block, but just in case. */ } $mail_driver = $request->input('mail_driver'); - if (! $this->failsafeMailCheck($request)) { + if (!$this->failsafeMailCheck($request)) { $mail_driver = 'log'; } $url = $request->input('url'); - if (substr($url, -1) != '/') + if (substr($url, -1) != '/') { $url = $url . '/'; + } - $_ENV['APP_KEY'] = config('app.key'); - $_ENV['APP_URL'] = $url; - $_ENV['APP_DEBUG'] = $request->input('debug') ? 'true' : 'false'; - $_ENV['REQUIRE_HTTPS'] = $request->input('https') ? 'true' : 'false'; - $_ENV['DB_TYPE'] = 'mysql'; - $_ENV['DB_HOST1'] = $request->input('host'); - $_ENV['DB_DATABASE1'] = $request->input('database'); - $_ENV['DB_USERNAME1'] = $request->input('db_username'); - $_ENV['DB_PASSWORD1'] = $request->input('db_password'); - $_ENV['MAIL_MAILER'] = $mail_driver; - $_ENV['MAIL_PORT'] = $request->input('mail_port'); - $_ENV['MAIL_ENCRYPTION'] = $request->input('encryption'); - $_ENV['MAIL_HOST'] = $request->input('mail_host'); - $_ENV['MAIL_USERNAME'] = $request->input('mail_username'); - $_ENV['MAIL_FROM_NAME'] = $request->input('mail_name'); - $_ENV['MAIL_FROM_ADDRESS'] = $request->input('mail_address'); - $_ENV['MAIL_PASSWORD'] = $request->input('mail_password'); - $_ENV['NINJA_ENVIRONMENT'] = 'selfhost'; - $_ENV['DB_CONNECTION'] = 'db-ninja-01'; + $env_values = [ + 'APP_URL' => $url, + 'REQUIRE_HTTPS' => $request->input('https') ? 'true' : 'false', + 'APP_DEBUG' => $request->input('debug') ? 'true' : 'false', - $config = ''; + 'DB_HOST1' => $request->input('host'), + 'DB_DATABASE1' => $request->input('database'), + 'DB_USERNAME1' => $request->input('db_username'), + 'DB_PASSWORD1' => $request->input('db_password'), + + 'MAIL_MAILER' => $mail_driver, + 'MAIL_PORT' => $request->input('mail_port'), + 'MAIL_ENCRYPTION' => $request->input('encryption'), + 'MAIL_HOST' => $request->input('mail_host'), + 'MAIL_USERNAME' => $request->input('mail_username'), + 'MAIL_FROM_NAME' => $request->input('mail_name'), + 'MAIL_FROM_ADDRESS' => $request->input('mail_address'), + 'MAIL_PASSWORD' => $request->input('mail_password'), + + 'NINJA_ENVIRONMENT' => 'selfhost', + 'DB_CONNECTION' => 'db-ninja-01', + ]; try { - foreach ($_ENV as $key => $val) { - if (is_array($val)) { - continue; - } - if (preg_match('/\s/', $val)) { - $val = "'{$val}'"; - } - $config .= "{$key}={$val}\n"; + foreach ($env_values as $property => $value) { + $this->updateEnvironmentProperty($property, $value); } - /* Write the .env file */ - $filePath = base_path() . '/.env'; - $fp = fopen($filePath, 'w'); - fwrite($fp, $config); - fclose($fp); - /* We need this in some environments that do not have STDIN defined */ define('STDIN', fopen('php://stdin', 'r')); @@ -130,7 +126,7 @@ class SetupController extends Controller } VersionCheck::dispatchNow(); - + $this->buildCache(true); return redirect('/'); @@ -151,13 +147,19 @@ class SetupController extends Controller */ public function checkDB(CheckDatabaseRequest $request): Response { - $status = SystemHealth::dbCheck($request); + try { + $status = SystemHealth::dbCheck($request); - if (is_array($status) && $status['success'] === true) { - return response([], 200); + if (is_array($status) && $status['success'] === true) { + return response([], 200); + } + + return response($status, 400); + } catch (\Exception $e) { + info(['message' => $e->getMessage(), 'action' => 'SetupController::checkDB()']); + + return response()->json(['message' => $e->getMessage()], 400); } - - return response($status, 400); } /** diff --git a/app/Http/Requests/Setup/CheckMailRequest.php b/app/Http/Requests/Setup/CheckMailRequest.php index 4dc58d2ecf71..6ff4640a4095 100644 --- a/app/Http/Requests/Setup/CheckMailRequest.php +++ b/app/Http/Requests/Setup/CheckMailRequest.php @@ -33,15 +33,17 @@ class CheckMailRequest extends Request */ public function rules() { + info($this->driver); + return [ - 'driver' => ['required', 'in:smtp,mail,sendmail'], - 'from_name' => ['required'], - 'from_address' => ['required'], - 'username' => ['required'], - 'host' => ['required'], - 'port' => ['required'], - 'encryption' => ['required'], - 'password' => ['required'], + 'driver' => ['required', 'in:smtp,mail,sendmail,log'], + 'from_name' => ['required_unless:driver,log'], + 'from_address' => ['required_unless:driver,log'], + 'username' => ['required_unless:driver,log'], + 'host' => ['required_unless:driver,log'], + 'port' => ['required_unless:driver,log'], + 'encryption' => ['required_unless:driver,log'], + 'password' => ['required_unless:driver,log'], ]; } } diff --git a/app/Http/Requests/Setup/StoreSetupRequest.php b/app/Http/Requests/Setup/StoreSetupRequest.php index a3e7d6595aa3..488c729f8e14 100644 --- a/app/Http/Requests/Setup/StoreSetupRequest.php +++ b/app/Http/Requests/Setup/StoreSetupRequest.php @@ -37,12 +37,12 @@ class StoreSetupRequest extends Request 'db_password' => '', /*Mail driver*/ 'mail_driver' => 'required', - 'encryption' => 'required', - 'mail_host' => 'required', - 'mail_username' => 'required', - 'mail_name' => 'required', - 'mail_address' => 'required', - 'mail_password' => 'required', + 'encryption' => 'required_unless:mail_driver,log', + 'mail_host' => 'required_unless:mail_driver,log', + 'mail_username' => 'required_unless:mail_driver,log', + 'mail_name' => 'required_unless:mail_driver,log', + 'mail_address' => 'required_unless:mail_driver,log', + 'mail_password' => 'required_unless:mail_driver,log', /*user registration*/ 'privacy_policy' => 'required', 'terms_of_service' => 'required', diff --git a/app/Utils/SystemHealth.php b/app/Utils/SystemHealth.php index 4fb7997b2c7d..3e0283dcb3d3 100644 --- a/app/Utils/SystemHealth.php +++ b/app/Utils/SystemHealth.php @@ -196,6 +196,10 @@ class SystemHealth public static function testMailServer($request = null) { + if ($request->driver == 'log') { + return []; + } + if ($request && $request instanceof CheckMailRequest) { config(['mail.driver' => $request->input('driver')]); config(['mail.host' => $request->input('host')]); @@ -225,7 +229,7 @@ class SystemHealth return Mail::failures(); } - return response()->json(['message'=>'Success'], 200); + return response()->json(['message' => 'Success'], 200); } private static function checkEnvWritable() diff --git a/app/Utils/Traits/AppSetup.php b/app/Utils/Traits/AppSetup.php index cd8560b550cd..280d2a945374 100644 --- a/app/Utils/Traits/AppSetup.php +++ b/app/Utils/Traits/AppSetup.php @@ -1,4 +1,5 @@ $class) { - if (request()->has('clear_cache') || ! Cache::has($name) || $force) { + if (request()->has('clear_cache') || !Cache::has($name) || $force) { // check that the table exists in case the migration is pending - if (! Schema::hasTable((new $class())->getTable())) { + if (!Schema::hasTable((new $class())->getTable())) { continue; } if ($name == 'payment_terms') { @@ -58,7 +60,7 @@ trait AppSetup } /*Build template cache*/ - if (request()->has('clear_cache') || ! Cache::has('templates')) + if (request()->has('clear_cache') || !Cache::has('templates')) $this->buildTemplates(); } @@ -67,49 +69,77 @@ trait AppSetup { $data = [ - 'invoice' => [ - 'subject' => EmailTemplateDefaults::emailInvoiceSubject(), - 'body' => EmailTemplateDefaults::emailInvoiceTemplate(), + 'invoice' => [ + 'subject' => EmailTemplateDefaults::emailInvoiceSubject(), + 'body' => EmailTemplateDefaults::emailInvoiceTemplate(), ], - - 'quote' => [ - 'subject' => EmailTemplateDefaults::emailQuoteSubject(), - 'body' => EmailTemplateDefaults::emailQuoteTemplate(), + + 'quote' => [ + 'subject' => EmailTemplateDefaults::emailQuoteSubject(), + 'body' => EmailTemplateDefaults::emailQuoteTemplate(), ], - 'payment' => [ - 'subject' => EmailTemplateDefaults::emailPaymentSubject(), - 'body' => EmailTemplateDefaults::emailPaymentTemplate(), + 'payment' => [ + 'subject' => EmailTemplateDefaults::emailPaymentSubject(), + 'body' => EmailTemplateDefaults::emailPaymentTemplate(), ], - 'payment_partial' => [ - 'subject' => EmailTemplateDefaults::emailPaymentPartialSubject(), - 'body' => EmailTemplateDefaults::emailPaymentPartialTemplate(), + 'payment_partial' => [ + 'subject' => EmailTemplateDefaults::emailPaymentPartialSubject(), + 'body' => EmailTemplateDefaults::emailPaymentPartialTemplate(), ], - 'reminder1' => [ - 'subject' => EmailTemplateDefaults::emailReminder1Subject(), - 'body' => EmailTemplateDefaults::emailReminder1Template(), + 'reminder1' => [ + 'subject' => EmailTemplateDefaults::emailReminder1Subject(), + 'body' => EmailTemplateDefaults::emailReminder1Template(), ], - 'reminder2' => [ - 'subject' => EmailTemplateDefaults::emailReminder2Subject(), - 'body' => EmailTemplateDefaults::emailReminder2Template(), + 'reminder2' => [ + 'subject' => EmailTemplateDefaults::emailReminder2Subject(), + 'body' => EmailTemplateDefaults::emailReminder2Template(), ], - 'reminder3' => [ - 'subject' => EmailTemplateDefaults::emailReminder3Subject(), - 'body' => EmailTemplateDefaults::emailReminder3Template(), + 'reminder3' => [ + 'subject' => EmailTemplateDefaults::emailReminder3Subject(), + 'body' => EmailTemplateDefaults::emailReminder3Template(), ], - 'reminder_endless' => [ - 'subject' => EmailTemplateDefaults::emailReminderEndlessSubject(), - 'body' => EmailTemplateDefaults::emailReminderEndlessTemplate(), + 'reminder_endless' => [ + 'subject' => EmailTemplateDefaults::emailReminderEndlessSubject(), + 'body' => EmailTemplateDefaults::emailReminderEndlessTemplate(), ], - 'statement' => [ - 'subject' => EmailTemplateDefaults::emailStatementSubject(), - 'body' => EmailTemplateDefaults::emailStatementTemplate(), + 'statement' => [ + 'subject' => EmailTemplateDefaults::emailStatementSubject(), + 'body' => EmailTemplateDefaults::emailStatementTemplate(), ], - 'credit' => [ - 'subject' => EmailTemplateDefaults::emailCreditSubject(), - 'body' => EmailTemplateDefaults::emailCreditTemplate(), + 'credit' => [ + 'subject' => EmailTemplateDefaults::emailCreditSubject(), + 'body' => EmailTemplateDefaults::emailCreditTemplate(), ], ]; Cache::forever($name, $data); } + + private function updateEnvironmentProperty(string $property, $value): void + { + $env = file(base_path('.env')); + + $position = null; + + foreach ((array) $env as $key => $variable) { + if (Str::startsWith($variable, $property)) { + $position = $key; + } + } + + // This should never happen, but this is login just in case. + // Variables that will be replaced (updated with different content) should already be in .env file. + + if (is_null($position)) { + $env[] = "{$property}=" . $value . "\n"; + } else { + $env[$position] = "{$property}=" . $value . "\n"; + } + + try { + file_put_contents(base_path('.env'), $env); + } catch (\Exception $e) { + info($e->getMessage()); + } + } } diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index bcf7aff5f94f..c5d0a8e792e6 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -3227,7 +3227,7 @@ return [ 'bank_account_not_linked' => 'To pay with bank account, first you have to add it as payment method.', 'application_settings_label' => 'Let\'s store basic information about your Invoice Ninja!', - 'recommended_in_production' => 'Recommended in production', + 'recommended_in_production' => 'Highly recommended in production', 'enable_only_for_development' => 'Enable only for development', 'test_pdf' => 'Test PDF', diff --git a/resources/views/setup/_mail.blade.php b/resources/views/setup/_mail.blade.php index 7cc878fdcd05..55c9691d4e76 100644 --- a/resources/views/setup/_mail.blade.php +++ b/resources/views/setup/_mail.blade.php @@ -1,4 +1,4 @@ -
+

{{ ctrans('texts.email_settings') }} @@ -14,14 +14,15 @@ {{ ctrans('texts.driver') }}
- +

-
+
{{ ctrans('texts.from_name') }}
@@ -29,7 +30,7 @@
-
+
{{ ctrans('texts.from_address') }}
@@ -37,15 +38,15 @@
-
+
{{ ctrans('texts.username') }}
- +
-
+
{{ ctrans('texts.host') }}
@@ -53,7 +54,7 @@
-
+
{{ ctrans('texts.port') }}
@@ -61,7 +62,7 @@
-
+
{{ ctrans('texts.encryption') }}
@@ -72,7 +73,7 @@
-
+
{{ ctrans('texts.password') }}
@@ -80,7 +81,7 @@
-
+