1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-06-05 22:09:38 +02:00
Files
openstamanager/app/Http/Controllers/ConfigurationController.php
2021-08-06 12:24:47 +02:00

271 lines
7.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
/**
* Controller dedicato alla gestione della configurazione di base del gestionale per la piattaforma in utilizzo.
*/
class ConfigurationController extends Controller
{
/**
* Verifica se la configurazione del gestionale per la piattaforma corrente è stata completata correttamente.
*
* @return bool
*/
public static function isConfigured()
{
try {
$connection = DB::connection();
$configuration_completed = !empty($connection->getDatabaseName());
$grants = $connection->select($connection->raw('SHOW GRANTS FOR CURRENT_USER'));
} catch (\Exception $e) {
$configuration_completed = false;
}
return $configuration_completed;
}
public function index(Request $request)
{
// Impostazione dinamica della lingua
$lang = $request->get('lang');
if (!empty($lang)) {
app()->setLocale($lang);
}
// Contenuti aggiuntivi
$args = [
'license' => file_get_contents(base_path('LICENSE')),
'languages' => [
'it_IT' => [
'title' => tr('Italiano'),
'flag' => 'IT',
],
'en_GB' => [
'title' => tr('Inglese'),
'flag' => 'GB',
],
],
// Default values
'host' => '',
'username' => '',
'database_name' => '',
];
return view('config.configuration', $args);
}
/**
* Metodo per la gestione della validazione della configurazione indicata.
*
* @return \Illuminate\Http\JsonResponse
*/
public function test(Request $request)
{
$requirements = $this->checkConnection($request);
if ($requirements === null) {
$state = 0;
}
// Permessi insufficienti
elseif (!empty($requirements)) {
$state = 1;
}
// Permessi completi
else {
$state = 2;
}
return response()->json(['test' => $state]);
}
/**
* Metodo per l'esecuzione della pulizia automatica per la cache della configurazione.
*/
public function cache(Request $request)
{
$route = route('config.index');
// Refresh della cache sulla configurazione
Artisan::call('cache:clear');
Artisan::call('config:cache');
return redirect($route);
}
/**
* Metodo per la gestione del messaggio di errore alla scrittura fisica della configurazione.
*/
public function write(Request $request)
{
$params = $request->old();
$env = $this->buildEnvFrom($params);
return view('config.configuration-writing', [
'config' => $env,
'params' => $params,
]);
}
/**
* Metodo indirizzato al salvataggio della configurazione.
*/
public function save(Request $request)
{
// Controllo sullo stato della connessione
$result = $this->checkConnection($request);
if ($result === null) {
return redirect(route('config.index'));
}
$env = $this->buildEnvFrom($request->all());
// Scrittura fisica della configurazione
$path = base_path('.env');
$result = file_put_contents($path, $env);
// Redirect in caso di fallimento
if ($result === false) {
return redirect(route('config.write'))
->withInput();
}
return redirect(route('config.cache'));
}
/**
* Verifica la connessione al database secondo i parametri indicati nella richiesta.
* Restituisce un array di permessi mancanti in caso la connessione avvenga con successo, oppure null in caso contrario.
*
* @return array|string[]|null
*/
protected function checkConnection(Request $request)
{
// Configurazione della connessione di test
$database_name = $request->input('database_name');
config(['database.connections.testing' => [
'driver' => 'mysql',
'host' => $request->input('host'),
'port' => '3306',
'password' => $request->input('password'),
'database' => $database_name,
'username' => $request->input('username'),
]]);
try {
$connection = DB::connection('testing');
// Controllo sul nome del database per verificare la connessione
$connection_completed = !empty($connection->getDatabaseName());
// Individuazione permessi garantiti all'utenza
$database_name = str_replace('_', '\_', $database_name);
$grants = $connection->select($connection->raw('SHOW GRANTS FOR CURRENT_USER'));
} catch (\Exception $e) {
return null;
}
$requirements = [
'SELECT',
'INSERT',
'UPDATE',
'CREATE',
'ALTER',
'DROP',
];
foreach ($grants as $result) {
$privileges = current($result);
if (
string_contains($privileges, ' ON `'.$database_name.'`.*') ||
string_contains($privileges, ' ON *.*')
) {
$pieces = explode(', ', explode(' ON ', str_replace('GRANT ', '', $privileges))[0]);
// Permessi generici sul database
if (in_array('ALL', $pieces) || in_array('ALL PRIVILEGES', $pieces)) {
$requirements = [];
break;
}
// Permessi specifici sul database
foreach ($requirements as $key => $value) {
if (in_array($value, $pieces)) {
unset($requirements[$key]);
}
}
}
}
return $requirements;
}
/**
* Definisce i nuovi contenuti per il file .env sulla base dell'input utente.
*
* @param array $params
*/
protected function buildEnvFrom($params): string
{
/*
// Individuazione parametri aggiuntivi
$decimals = $params['decimal_separator'];
$thousands = $params['thousand_separator'];
$decimals = $decimals == 'dot' ? '.' : ',';
$thousands = $thousands == 'dot' ? '.' : $thousands;
$thousands = $thousands == 'comma' ? ',' : $thousands;
*/
// Completamento configurazione
$pairs = [
'APP_LOCALE' => $params['language'],
'DB_HOST' => $params['host'],
'DB_USERNAME' => $params['username'],
'DB_PASSWORD' => $params['password'],
'DB_DATABASE' => $params['database_name'],
/*
'|timestamp|' => post('timestamp_format'),
'|date|' => post('date_format'),
'|time|' => post('time_format'),
'|decimals|' => $decimals,
'|thousands|' => $thousands,
*/
];
$env = $this->buildEnv($pairs);
return $env;
}
/**
* Definisce i nuovi contenuti per il file .env sulla base della configurazione indicata.
*
* @param $config
*/
protected function buildEnv($config): string
{
$file = base_path('.env');
$content = file_get_contents($file);
foreach ($config as $key => $value) {
$content = preg_replace(
'/'.preg_quote($key."=")."(.*)/",
$key."=".$value,
$content
);
}
return $content;
}
}