From 9b9593b98db951fda432b38db512886d056dc2c6 Mon Sep 17 00:00:00 2001 From: Julian Prieber <60265788+JulianPrieber@users.noreply.github.com> Date: Wed, 23 Nov 2022 15:52:33 +0100 Subject: [PATCH] Added first setup page This setup will: 1. Check the server dependencies 2. Setup the database 3. Create the admin user 4. Configure the app --- INSTALLING | 0 app/Http/Controllers/InstallerController.php | 141 ++++++++++++ composer.lock | 38 ++-- resources/views/installer/installer.blade.php | 201 +++++++++++++++++ resources/views/layouts/installing.blade.php | 207 ++++++++++++++++++ routes/web.php | 25 ++- 6 files changed, 588 insertions(+), 24 deletions(-) create mode 100644 INSTALLING create mode 100644 app/Http/Controllers/InstallerController.php create mode 100644 resources/views/installer/installer.blade.php create mode 100644 resources/views/layouts/installing.blade.php diff --git a/INSTALLING b/INSTALLING new file mode 100644 index 0000000..e69de29 diff --git a/app/Http/Controllers/InstallerController.php b/app/Http/Controllers/InstallerController.php new file mode 100644 index 0000000..b909229 --- /dev/null +++ b/app/Http/Controllers/InstallerController.php @@ -0,0 +1,141 @@ +database == 'MySQL'){ + return redirect(url('?mysql')); + }else{ + return redirect(url('?4')); + } + } + + public function createAdmin(request $request) + { + + $email = $request->email; + $password = $request->password; + + + if(DB::table('users')->count() == '0'){ + Schema::disableForeignKeyConstraints(); + DB::table('users')->delete(); + DB::table('users')->truncate(); + Schema::enableForeignKeyConstraints(); + + $user = User::create([ + 'name' => 'Admin', + 'email' => $email, + 'email_verified_at' => '0001-01-01 00:00:00', + 'password' => Hash::make($password), + 'littlelink_name' => 'admin', + 'littlelink_description' => 'admin page', + 'block' => 'no', + ]); + + User::where('id', '1')->update(['role' => 'admin']); + } + + return redirect(url('?5')); + } + + public function mysql(request $request) + { + $DB_CONNECTION = 'mysql'; + $DB_HOST = $request->host; + $DB_PORT = $request->port; + $DB_DATABASE = $request->name; + $DB_USERNAME = $request->username; + $DB_PASSWORD = $request->password; + + if(EnvEditor::keyExists('DB_CONNECTION')){EnvEditor::editKey('DB_CONNECTION', $DB_CONNECTION);}else{EnvEditor::addKey('DB_CONNECTION', $DB_CONNECTION);} + if(EnvEditor::keyExists('DB_HOST')){EnvEditor::editKey('DB_HOST', $DB_HOST);}else{EnvEditor::addKey('DB_HOST', $DB_HOST);} + if(EnvEditor::keyExists('DB_PORT')){EnvEditor::editKey('DB_PORT', $DB_PORT);}else{EnvEditor::addKey('DB_PORT', $DB_PORT);} + if(EnvEditor::keyExists('DB_DATABASE')){EnvEditor::editKey('DB_DATABASE', $DB_DATABASE);}else{EnvEditor::addKey('DB_DATABASE', $DB_DATABASE);} + if(EnvEditor::keyExists('DB_USERNAME')){EnvEditor::editKey('DB_USERNAME', $DB_USERNAME);}else{EnvEditor::addKey('DB_USERNAME', $DB_USERNAME);} + if(EnvEditor::keyExists('DB_PASSWORD')){EnvEditor::editKey('DB_PASSWORD', $DB_PASSWORD);}else{EnvEditor::addKey('DB_PASSWORD', $DB_PASSWORD);} + + return redirect(url('mysql-test')); + + } + + public function mysqlTest(request $request) + { + try {Artisan::call('migrate');} catch (exception $e) {$failed = "true";} + try {Artisan::call('db:seed --force');} catch (exception $e) {$failed = "true";} + try {Artisan::call('db:seed --class="PageSeeder" --force');} catch (exception $e) {$failed = "true";} + try {Artisan::call('db:seed --class="ButtonSeeder" --force');} catch (exception $e) {$failed = "true";} + + try {$users = DB::table('buttons')->count(); $failed = false;} catch (exception $e) {$failed = true;} + + if($failed == true){ + if(EnvEditor::keyExists('DB_CONNECTION')){EnvEditor::editKey('DB_CONNECTION', 'sqlite');}else{EnvEditor::addKey('DB_CONNECTION', 'sqlite');} + if(EnvEditor::keyExists('DB_HOST')){EnvEditor::deleteKey('DB_HOST');} + if(EnvEditor::keyExists('DB_PORT')){EnvEditor::deleteKey('DB_PORT');} + if(EnvEditor::keyExists('DB_DATABASE')){EnvEditor::deleteKey('DB_DATABASE');} + if(EnvEditor::keyExists('DB_USERNAME')){EnvEditor::deleteKey('DB_USERNAME');} + if(EnvEditor::keyExists('DB_PASSWORD')){EnvEditor::deleteKey('DB_PASSWORD');} + return redirect(url('?error')); + }else{ + return redirect(url('?4')); + } + } + + public function options(request $request) + { + + $user = User::find(1); + $llName = $user->littlelink_name; + + if($request->register == 'Yes'){$register = "true";}else{$register = "false";} + Page::first()->update(['register' => $register]); + + if($request->verify == 'Yes'){$value = "verified";}else{$value = "auth";} + if(EnvEditor::keyExists('REGISTER_AUTH')){EnvEditor::editKey('REGISTER_AUTH', $value);} + + if($request->page == 'No'){$value = "";}else{$value = '"' . $llName . '"';} + if(EnvEditor::keyExists('HOME_URL')){EnvEditor::editKey('HOME_URL', $value);} + + if(EnvEditor::keyExists('APP_NAME')){EnvEditor::editKey('APP_NAME', '"' . $request->app . '"');} + + if(file_exists(base_path("INSTALLING"))){unlink(base_path("INSTALLING"));} + + return redirect(url('')); + } + +} diff --git a/composer.lock b/composer.lock index b691447..235dd80 100644 --- a/composer.lock +++ b/composer.lock @@ -2878,25 +2878,25 @@ }, { "name": "nette/schema", - "version": "v1.2.2", + "version": "v1.2.3", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df" + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df", - "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df", + "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", "shasum": "" }, "require": { "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", - "php": ">=7.1 <8.2" + "php": ">=7.1 <8.3" }, "require-dev": { "nette/tester": "^2.3 || ^2.4", - "phpstan/phpstan-nette": "^0.12", + "phpstan/phpstan-nette": "^1.0", "tracy/tracy": "^2.7" }, "type": "library", @@ -2934,9 +2934,9 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.2" + "source": "https://github.com/nette/schema/tree/v1.2.3" }, - "time": "2021-10-15T11:40:02+00:00" + "time": "2022-10-13T01:24:26+00:00" }, { "name": "nette/utils", @@ -7866,16 +7866,16 @@ }, { "name": "laravel/sail", - "version": "v1.16.2", + "version": "v1.16.3", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "7d1ed5f856ec8b9708712e3fc0708fcabe114659" + "reference": "0dbee8802e17911afbe29a8506316343829b056e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/7d1ed5f856ec8b9708712e3fc0708fcabe114659", - "reference": "7d1ed5f856ec8b9708712e3fc0708fcabe114659", + "url": "https://api.github.com/repos/laravel/sail/zipball/0dbee8802e17911afbe29a8506316343829b056e", + "reference": "0dbee8802e17911afbe29a8506316343829b056e", "shasum": "" }, "require": { @@ -7922,7 +7922,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2022-09-28T13:13:22+00:00" + "time": "2022-11-21T16:19:18+00:00" }, { "name": "mockery/mockery", @@ -8363,16 +8363,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.18", + "version": "9.2.19", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a" + "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/12fddc491826940cf9b7e88ad9664cf51f0f6d0a", - "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c77b56b63e3d2031bd8997fcec43c1925ae46559", + "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559", "shasum": "" }, "require": { @@ -8428,7 +8428,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.18" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.19" }, "funding": [ { @@ -8436,7 +8436,7 @@ "type": "github" } ], - "time": "2022-10-27T13:35:33+00:00" + "time": "2022-11-18T07:47:47+00:00" }, { "name": "phpunit/php-file-iterator", diff --git a/resources/views/installer/installer.blade.php b/resources/views/installer/installer.blade.php new file mode 100644 index 0000000..dbfa9be --- /dev/null +++ b/resources/views/installer/installer.blade.php @@ -0,0 +1,201 @@ +@extends('layouts.installing') + + +@Push('installer-body') +
+ +@if($_SERVER['QUERY_STRING'] === '') +{{-- Landing page --}} + +
+ Logo +
+

Setup LittleLink Custom

+

+

+ Welcome to the setup for LittleLink Custom

+ This setup will:
+ 1. Check the server dependencies
+ 2. Setup the database
+ 3. Create the admin user
+ 4. Configure the app
+

+
+    +
+ +@endif + +@if($_SERVER['QUERY_STRING'] === 'error') +{{-- Landing page --}} + +
+ Logo +
+

Setup failed

+

An error has occured. Please try again.

+
+    +
+ +@endif + +@if($_SERVER['QUERY_STRING'] === '2') +{{-- Landing page --}} + +
+ Logo +
+

Dependency check

+

Required PHP modules:

+
+ + + + + + + + + + + + + + +
BCMath: @if(extension_loaded('bcmath'))@else@endif
Ctype: @if(extension_loaded('Ctype'))@else@endif
cURL: @if(extension_loaded('cURL'))@else@endif
DOM: @if(extension_loaded('DOM'))@else@endif
Fileinfo: @if(extension_loaded('Fileinfo'))@else@endif
JSON: @if(extension_loaded('JSON'))@else@endif
Mbstring: @if(extension_loaded('Mbstring'))@else@endif
OpenSSL: @if(extension_loaded('OpenSSL'))@else@endif
PCRE: @if(extension_loaded('PCRE'))@else@endif
PDO: @if(extension_loaded('PDO'))@else@endif
Tokenizer: @if(extension_loaded('Tokenizer'))@else@endif
XML: @if(extension_loaded('XML'))@else@endif
+
+ Depending on your database type: + + + +
SQLite: @if(extension_loaded('PDO_SQLite'))@else@endif
MySQL: @if(extension_loaded('PDO_MySQL'))@else@endif
+

+
+    +
+ +@endif + +@if($_SERVER['QUERY_STRING'] === '3') +{{-- Landing page --}} + +
+ Logo +
+

Setup LittleLink Custom

+

Select a database type

+

Under most circumstances, we recommend using SQLite.
MySQL requires a separate, empty MySQL database.


+
+
+
+ + +


+ + +
+ +@endif + +@if($_SERVER['QUERY_STRING'] === 'mysql') +{{-- Landing page --}} + +
+ Logo +
+

Setup LittleLink Custom

+

MySQL

+ +
+
+ + + + + + + + + + +
+

+ + +
+ +
+
+ +@endif + +@if($_SERVER['QUERY_STRING'] === '4') +{{-- Landing page --}} + +
+ Logo +
+

Setup LittleLink Custom

+

Create an admin account.

+ +
+
+ + + + +
+

+ + +
+ +@endif + +@if($_SERVER['QUERY_STRING'] === '5') +{{-- Landing page --}} + +
+ Logo +
+

Setup LittleLink Custom

+

Configure your page

+
+
+
+ + + + + + + + + + + + + +

+ + +
+ +@endif + + +
+@endpush \ No newline at end of file diff --git a/resources/views/layouts/installing.blade.php b/resources/views/layouts/installing.blade.php new file mode 100644 index 0000000..8168f28 --- /dev/null +++ b/resources/views/layouts/installing.blade.php @@ -0,0 +1,207 @@ + + +@include('layouts.lang') + + + +@include('layouts.analytics') + + + +@stack('installer-head') + + LittleLink Custom setup + + + + + + + @if(file_exists(base_path("littlelink/images/avatar.png" ))) + + @else + + @endif + + {{-- custom font for logo text --}} + + + + @if ($color_scheme_override == 'dark') + + @elseif ($color_scheme_override == 'light') + + @elseif (config('advanced-config.theme') == 'dark') + + @elseif (config('advanced-config.theme') == 'light') + + @else + + @endif + + + + + + +@stack('installer-body') + + + diff --git a/routes/web.php b/routes/web.php index e6354a3..71ec270 100755 --- a/routes/web.php +++ b/routes/web.php @@ -7,6 +7,7 @@ use App\Http\Controllers\UserController; use App\Http\Controllers\Auth\SocialLoginController; use App\Http\Controllers\LinkTypeViewController; use App\Http\Controllers\PagesController; +use App\Http\Controllers\InstallerController; /* |-------------------------------------------------------------------------- @@ -21,12 +22,24 @@ use App\Http\Controllers\PagesController; // Prevents section below from being run by 'composer update' if(file_exists(base_path('storage/app/ISINSTALLED'))){ - // generates new APP KEY if no one is set - if(EnvEditor::getKey('APP_KEY')==''){Artisan::call('key:generate');} + // generates new APP KEY if no one is set + if(EnvEditor::getKey('APP_KEY')==''){Artisan::call('key:generate');} + + // copies template meta config if none is present + if(!file_exists(base_path("config/advanced-config.php"))){copy(base_path('storage/templates/advanced-config.php'), base_path('config/advanced-config.php'));} + } - // copies template meta config if none is present - if(!file_exists(base_path("config/advanced-config.php"))){copy(base_path('storage/templates/advanced-config.php'), base_path('config/advanced-config.php'));} -} + // Installer +if(file_exists(base_path('INSTALLING'))){ + + Route::get('/', [InstallerController::class, 'showInstaller'])->name('showInstaller'); + Route::post('/create-admin', [InstallerController::class, 'createAdmin'])->name('createAdmin'); + Route::post('/db', [InstallerController::class, 'db'])->name('db'); + Route::post('/mysql', [InstallerController::class, 'mysql'])->name('mysql'); + Route::post('/options', [InstallerController::class, 'options'])->name('options'); + Route::get('/mysql-test', [InstallerController::class, 'mysqlTest'])->name('mysqlTest'); + +}else{ // Disables routes if in Maintenance Mode if(env('MAINTENANCE_MODE') != 'true' and !file_exists(base_path("storage/MAINTENANCE"))){ @@ -189,4 +202,6 @@ Route::get('/{any}', function () { })->where('any', '.*'); } +} + require __DIR__.'/auth.php';