Untitled
unknown
plain_text
2 years ago
13 kB
192
Indexable
<?php
namespace Zainiklab\ZaiInstaller\Http\Controllers;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redirect;
use Zainiklab\ZaiInstaller\Events\EnvironmentSaved;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Zainiklab\ZaiInstaller\Http\Helpers\DatabaseManager;
class InstallController extends Controller
{
/**
* @var DatabaseManager
*/
private $databaseManager;
private $logger;
/**
* @param DatabaseManager $databaseManager
*/
public function __construct(DatabaseManager $databaseManager)
{
$this->logger = new Logger(storage_path() . '/logs/' . 'install.log');
$this->databaseManager = $databaseManager;
}
public function preInstall()
{
$route_value = 0;
$resource_value = 0;
$public_value = 0;
$storage_value = 0;
$env_value = 0;
// $route_perm = substr(sprintf('%o', fileperms(base_path('routes'))), -4);
// if($route_perm == '0777') {
// $route_value = 1;
// }
$resource_prem = substr(sprintf('%o', fileperms(base_path('resources'))), -4);
if ($resource_prem == '0777' || $resource_prem == '0775') {
$resource_value = 1;
}
$public_prem = substr(sprintf('%o', fileperms(base_path('public'))), -4);
if ($public_prem == '0777' || $public_prem == '0775' || $public_prem == '0750') {
$public_value = 1;
}
$storage_prem = substr(sprintf('%o', fileperms(base_path('storage'))), -4);
if ($storage_prem == '0777' || $storage_prem == '0775') {
$storage_value = 1;
}
$env_prem = substr(sprintf('%o', fileperms(base_path('.env'))), -4);
if ($env_prem == '0777' || $env_prem == '0666' || $env_prem == '0644' || $env_prem == '0775' || $env_prem == '0664') {
$env_value = 1;
}
if (file_exists(storage_path('installed'))) {
return redirect('/');
}
return view('zainiklab.installer.pre-install', compact('route_value', 'resource_value', 'public_value', 'storage_value', 'env_value'));
}
public function configuration()
{
if (file_exists(storage_path('installed'))) {
return redirect('/');
}
if (session()->has('validated')) {
$data['is_active'] = true;
return view('zainiklab.installer.config', $data);
}
return redirect(route('ZaiInstaller::pre-install'));
}
public function serverValidation(Request $request)
{
if ($this->phpversion() > 7.0 && $this->mysqli() == 1 && $this->curl_version() == 1 && $this->allow_url_fopen() == 1 && $this->openssl() == 1 && $this->pdo() == 1 && $this->bcmath() == 1 && $this->ctype() == 1 && $this->fileinfo() == 1 && $this->mbstring() == 1 && $this->tokenizer() == 1 && $this->xml() == 1 && $this->json() == 1) {
session()->put('validated', 'Yes');
return redirect(route('ZaiInstaller::config'));
}
session()->forget('validated');
return redirect(route('ZaiInstaller::pre-install'));
}
public function phpversion()
{
return phpversion();
}
public function mysqli()
{
return extension_loaded('mysqli');
}
public function curl_version()
{
return function_exists('curl_version');
}
public function allow_url_fopen()
{
return ini_get('allow_url_fopen');
}
public function openssl()
{
return extension_loaded('openssl');
}
public function pdo()
{
return extension_loaded('pdo');
}
public function bcmath()
{
return extension_loaded('bcmath');
}
public function ctype()
{
return extension_loaded('ctype');
}
public function fileinfo()
{
return extension_loaded('fileinfo');
}
public function mbstring()
{
return extension_loaded('mbstring');
}
public function tokenizer()
{
return extension_loaded('tokenizer');
}
public function xml()
{
return extension_loaded('xml');
}
public function json()
{
return extension_loaded('json');
}
public function final(Request $request)
{
if (config('app.app_code')) {
$isValidDomain = $this->is_valid_domain_name($request->fullUrl());
if ($isValidDomain) {
$rules = [
'app_name' => 'bail|required',
];
} else {
$rules = [
'purchase_code' => 'required',
'email' => 'bail|required|email',
'app_name' => 'bail|required',
];
}
$request->validate($rules, [
'purchase_code.required' => 'Purchase code field is required',
'email.required' => 'Customer email field is required',
'email.email' => 'Customer email field is must a valid email',
'app_name.required' => 'App name field is required',
]);
$requestData = [
'app' => config('app.app_code'),
'type' => 0,
'email' => $request->email,
'purchase_code' => $request->purchase_code,
'version' => config('app.build_version'),
'url' => $request->fullUrl(),
'app_url' => $request->app_url
];
if (!$this->checkDatabaseConnection($request)) {
return Redirect::back()->withErrors('Database credentials are not correct, or the mysql server is down !');
}
if (true) {
if (true) {
try {
$results = $this->saveENV($request);
//event(new EnvironmentSaved($request));
$lqsFile = storage_path('lqs');
file_put_contents($lqsFile, 'local');
return Redirect::route('ZaiInstaller::database')->with(['results' => $results]);
} catch (\Exception $e) {
return Redirect::back()->withErrors($e->getMessage());
}
} else {
return Redirect::back()->withErrors($data->message);
}
} else {
return Redirect::back()->withErrors('Something went wrong with your purchase key.');
}
} else {
return Redirect::back()->withErrors('Something went wrong with your purchase key.');
}
}
public function is_valid_domain_name($url)
{
try {
return true;
} catch (\Exception $e) {
return false;
}
}
public function saveInfoInFile($url, $purchase_code)
{
$infoFile = storage_path('info');
if (file_exists($infoFile)) {
unlink($infoFile);
}
$data = json_encode([
'd' => base64_encode($this->get_domain_name($url)),
'i' => date('ymdhis'),
'p' => base64_encode($purchase_code),
'u' => date('ymdhis'),
]);
file_put_contents($infoFile, $data);
}
public function database()
{
$response = $this->databaseManager->migrateAndSeed();
if ($response['status'] == 'success') {
$lqsFile = storage_path('lqs');
$getInfoFile = storage_path('info');
try {
if (file_exists($lqsFile)) {
$lqs = file_get_contents($lqsFile);
unlink($lqsFile);
} elseif (!$this->is_valid_domain_name(request()->fullUrl())) {
$lqs = file_get_contents(config('app.sql_path'));
}
if($lqs == 'local'){
$lqs = file_get_contents(config('app.sql_path'));
}
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
if ($lqs != null && $lqs != "") {
DB::unprepared($lqs);
}
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
$installedLogFile = storage_path('installed');
if (file_exists($getInfoFile)) {
$data = file_get_contents($getInfoFile);
unlink($getInfoFile);
} else {
$data = json_encode([
'd' => base64_encode($this->get_domain_name(request()->fullUrl())),
'i' => date('ymdhis'),
'u' => date('ymdhis'),
]);
}
if (!file_exists($installedLogFile)) {
file_put_contents($installedLogFile, $data);
}
return redirect('/');
} catch (\Exception $e) {
if (file_exists($lqsFile)) {
unlink($lqsFile);
}
if (file_exists($getInfoFile)) {
unlink($getInfoFile);
}
DB::rollBack();
return Redirect::back()->withErrors('Something went wrong!');
}
} else {
return Redirect::back()->withErrors($response['message']);
}
}
function get_domain_name($url)
{
$parseUrl = parse_url(trim($url));
if (isset($parseUrl['host'])) {
$host = $parseUrl['host'];
} else {
$path = explode('/', $parseUrl['path']);
$host = $path[0];
}
return trim($host);
}
public function saveENV(Request $request)
{
$this->logger->log('ENV', 'Write start from saveENV');
$env_val['APP_KEY'] = 'base64:' . base64_encode(Str::random(32));
$env_val['APP_URL'] = $request->app_url;
$env_val['DB_HOST'] = $request->db_host;
$env_val['DB_DATABASE'] = $request->db_name;
$env_val['DB_USERNAME'] = $request->db_user;
$env_val['DB_PASSWORD'] = $request->db_password;
$env_val['MAIL_HOST'] = $request->mail_host;
$env_val['MAIL_PORT'] = $request->mail_port;
$env_val['MAIL_USERNAME'] = $request->mail_username;
$env_val['MAIL_PASSWORD'] = $request->mail_password;
$this->setEnvValue($env_val);
}
public function setEnvValue($values)
{
$this->logger->log('ENV', 'Write start from setEnvValue');
if (count($values) > 0) {
foreach ($values as $envKey => $envValue) {
$this->setEnvironmentValue($envKey, $envValue);
}
}
$this->logger->log('ENV', 'Write setEnvValue successfully');
return true;
}
function setEnvironmentValue($envKey, $envValue)
{
try {
$this->logger->log('ENV Write start', $envKey.'=>'.$envValue);
$envFile = app()->environmentFilePath();
$str = file_get_contents($envFile);
$str .= "\n"; // In case the searched variable is in the last line without \n
$keyPosition = strpos($str, "{$envKey}=");
if ($keyPosition) {
if(PHP_OS_FAMILY === 'Windows'){
$endOfLinePosition = strpos($str, "\n", $keyPosition);
}
else{
$endOfLinePosition = strpos($str, PHP_EOL, $keyPosition);
}
$oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition);
$envValue = str_replace(chr(92), "\\\\", $envValue);
$envValue = str_replace('"', '\"', $envValue);
$newLine = "{$envKey}=\"{$envValue}\"";
if ($oldLine != $newLine) {
$str = str_replace($oldLine, $newLine, $str);
$str = substr($str, 0, -1);
$fp = fopen($envFile, 'w');
fwrite($fp, $str);
fclose($fp);
}
}
$this->logger->log('ENV Write END', $envKey.'=>'.$envValue);
return true;
} catch (\Exception $e) {
$this->logger->log('ENV', 'Write setEnvValue failed');
$this->logger->log('Exception', $e->getMessage());
return false;
}
}
private function checkDatabaseConnection(Request $request)
{
$connection = 'mysql';
$settings = config("database.connections.mysql");
config([
'database' => [
'default' => 'mysql',
'connections' => [
'mysql' => array_merge($settings, [
'driver' => 'mysql',
'host' => $request->db_host,
'port' => '3306',
'database' => $request->db_name,
'username' => $request->db_user,
'password' => $request->db_password,
]),
],
],
]);
DB::purge();
try {
DB::connection()->getPdo();
return true;
} catch (\Exception $e) {
return false;
}
}
}
Editor is loading...