Guest User

InstallController.php

a guest
Jan 10th, 2024
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 12.02 KB | Source Code | 0 0
  1. <?php
  2.  
  3. namespace Zainiklab\ZaiInstaller\Http\Controllers;
  4.  
  5. use Illuminate\Support\Str;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Routing\Controller;
  8. use Illuminate\Support\Facades\DB;
  9. use Illuminate\Support\Facades\Redirect;
  10. use Zainiklab\ZaiInstaller\Events\EnvironmentSaved;
  11. use Illuminate\Support\Facades\Http;
  12. use Illuminate\Support\Facades\Log;
  13. use Zainiklab\ZaiInstaller\Http\Helpers\DatabaseManager;
  14.  
  15. class InstallController extends Controller
  16. {
  17.     /**
  18.      * @var DatabaseManager
  19.      */
  20.     private $databaseManager;
  21.     private $logger;
  22.  
  23.     /**
  24.      * @param DatabaseManager $databaseManager
  25.      */
  26.     public function __construct(DatabaseManager $databaseManager)
  27.     {
  28.         $this->logger = new Logger(storage_path() . '/logs/' . 'install.log');
  29.         $this->databaseManager = $databaseManager;
  30.     }
  31.  
  32.     public function preInstall()
  33.     {
  34.         $route_value = 0;
  35.         $resource_value = 0;
  36.         $public_value = 0;
  37.         $storage_value = 0;
  38.         $env_value = 0;
  39.         //        $route_perm = substr(sprintf('%o', fileperms(base_path('routes'))), -4);
  40.         //        if($route_perm == '0777') {
  41.         //            $route_value = 1;
  42.         //        }
  43.         $resource_prem = substr(sprintf('%o', fileperms(base_path('resources'))), -4);
  44.         if ($resource_prem == '0777' || $resource_prem == '0775') {
  45.             $resource_value = 1;
  46.         }
  47.         $public_prem = substr(sprintf('%o', fileperms(base_path('public'))), -4);
  48.         if ($public_prem == '0777' || $public_prem == '0775' || $public_prem == '0750') {
  49.             $public_value = 1;
  50.         }
  51.         $storage_prem = substr(sprintf('%o', fileperms(base_path('storage'))), -4);
  52.         if ($storage_prem == '0777' || $storage_prem == '0775') {
  53.             $storage_value = 1;
  54.         }
  55.         $env_prem = substr(sprintf('%o', fileperms(base_path('.env'))), -4);
  56.         if ($env_prem == '0777' || $env_prem == '0666' || $env_prem == '0644' || $env_prem == '0775' || $env_prem == '0664') {
  57.             $env_value = 1;
  58.         }
  59.         if (file_exists(storage_path('installed'))) {
  60.             return redirect('/');
  61.         }
  62.         return view('zainiklab.installer.pre-install', compact('route_value', 'resource_value', 'public_value', 'storage_value', 'env_value'));
  63.     }
  64.  
  65.     public function configuration()
  66.     {
  67.         if (file_exists(storage_path('installed'))) {
  68.             return redirect('/');
  69.         }
  70.         if (session()->has('validated')) {
  71.             $data['is_active'] = true;
  72.             return view('zainiklab.installer.config', $data);
  73.         }
  74.         return redirect(route('ZaiInstaller::pre-install'));
  75.     }
  76.  
  77.     public function serverValidation(Request $request)
  78.     {
  79.         if ($this->phpversion() > 7.0 && $this->mysqli() == 1 && $this->curl_version() == 1 && in_array($this->allow_url_fopen(), ['1','on','On', 1]) == 1 && $this->openssl() == 1  && $this->zip() == 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){
  80.             session()->put('validated', 'Yes');
  81.             return redirect(route('ZaiInstaller::config'));
  82.         }
  83.         session()->forget('validated');
  84.         return redirect(route('ZaiInstaller::pre-install'));
  85.     }
  86.  
  87.     public function phpversion()
  88.     {
  89.         return phpversion();
  90.     }
  91.  
  92.     public function mysqli()
  93.     {
  94.         return extension_loaded('mysqli');
  95.     }
  96.  
  97.     public function curl_version()
  98.     {
  99.         return function_exists('curl_version');
  100.     }
  101.  
  102.     public function allow_url_fopen()
  103.     {
  104.         return ini_get('allow_url_fopen');
  105.     }
  106.  
  107.     public function openssl()
  108.     {
  109.         return extension_loaded('openssl');
  110.     }
  111.  
  112.     public function pdo()
  113.     {
  114.         return extension_loaded('pdo');
  115.     }
  116.    
  117.     public function zip()
  118.     {
  119.         return extension_loaded('zip');
  120.     }
  121.  
  122.     public function bcmath()
  123.     {
  124.         return extension_loaded('bcmath');
  125.     }
  126.  
  127.     public function ctype()
  128.     {
  129.         return extension_loaded('ctype');
  130.     }
  131.  
  132.     public function fileinfo()
  133.     {
  134.         return extension_loaded('fileinfo');
  135.     }
  136.  
  137.     public function mbstring()
  138.     {
  139.         return extension_loaded('mbstring');
  140.     }
  141.  
  142.     public function tokenizer()
  143.     {
  144.         return extension_loaded('tokenizer');
  145.     }
  146.  
  147.     public function xml()
  148.     {
  149.         return extension_loaded('xml');
  150.     }
  151.  
  152.     public function json()
  153.     {
  154.         return extension_loaded('json');
  155.     }
  156.  
  157.     public function final(Request $request)
  158.     {
  159.         if (config('app.app_code')) {
  160.             $isValidDomain = $this->is_valid_domain_name($request->fullUrl());
  161.  
  162.             if ($isValidDomain) {
  163.                 $rules = [
  164.                     'app_name' => 'bail|required',
  165.                 ];
  166.             } else {
  167.                 $rules = [
  168.                     'purchase_code' => 'required',
  169.                     'email' => 'bail|required|email',
  170.                     'app_name' => 'bail|required',
  171.                 ];
  172.             }
  173.  
  174.             $request->validate($rules, [
  175.                 'purchase_code.required' => 'Purchase code field is required',
  176.                 'email.required' => 'Customer email field is required',
  177.                 'email.email' => 'Customer email field is must a valid email',
  178.                 'app_name.required' => 'App name field is required',
  179.             ]);
  180.  
  181.             $requestData = [
  182.                 'app' => config('app.app_code'),
  183.                 'type' => 0,
  184.                 'email' => $request->email,
  185.                 'purchase_code' => $request->purchase_code,
  186.                 'version' => config('app.build_version'),
  187.                 'url' => $request->fullUrl(),
  188.                 'app_url' => $request->app_url
  189.             ];
  190.  
  191.  
  192.             if (!$this->checkDatabaseConnection($request)) {
  193.                 return Redirect::back()->withErrors('Database credentials are not correct, or the mysql server is down !');
  194.             }
  195.  
  196.             if (true) {
  197.                 if (true) {
  198.                     try {
  199.                         $results = $this->saveENV($request);
  200.                         //event(new EnvironmentSaved($request));
  201.                         $lqsFile = storage_path('lqs');
  202.                         file_put_contents($lqsFile, 'local');
  203.                         return Redirect::route('ZaiInstaller::database')->with(['results' => $results]);
  204.                     } catch (\Exception $e) {
  205.                         return Redirect::back()->withErrors($e->getMessage());
  206.                     }
  207.                 } else {
  208.                     return Redirect::back()->withErrors($data->message);
  209.                 }
  210.             } else {
  211.                 return Redirect::back()->withErrors('Something went wrong with your purchase key.');
  212.             }
  213.         } else {
  214.             return Redirect::back()->withErrors('Something went wrong with your purchase key.');
  215.         }
  216.     }
  217.  
  218.     public function is_valid_domain_name($url)
  219.     {
  220.         try {
  221.             return true;
  222.         } catch (\Exception $e) {
  223.             return false;
  224.         }
  225.     }
  226.  
  227.     public function saveInfoInFile($url, $purchase_code)
  228.     {
  229.         $infoFile = storage_path('info');
  230.         if (file_exists($infoFile)) {
  231.             unlink($infoFile);
  232.         }
  233.         $data = json_encode([
  234.             'd' => base64_encode($this->get_domain_name($url)),
  235.             'i' => date('ymdhis'),
  236.             'p' => base64_encode($purchase_code),
  237.             'u' => date('ymdhis'),
  238.         ]);
  239.         file_put_contents($infoFile, $data);
  240.     }
  241.  
  242.     public function database()
  243.     {
  244.         $response = $this->databaseManager->migrateAndSeed();
  245.         if ($response['status'] == 'success') {
  246.             $lqsFile = storage_path('lqs');
  247.             $getInfoFile = storage_path('info');
  248.             try {
  249.                 if (file_exists($lqsFile)) {
  250.                     $lqs = file_get_contents($lqsFile);
  251.                     unlink($lqsFile);
  252.                 } elseif (!$this->is_valid_domain_name(request()->fullUrl())) {
  253.                     $lqs = file_get_contents(config('app.sql_path'));
  254.                 }
  255.  
  256.                 if($lqs == 'local'){
  257.                     $lqs = file_get_contents(config('app.sql_path'));
  258.                 }
  259.  
  260.                 DB::statement('SET FOREIGN_KEY_CHECKS=0;');
  261.                 if ($lqs != null && $lqs != "") {
  262.                     DB::unprepared($lqs);
  263.                 }
  264.                 DB::statement('SET FOREIGN_KEY_CHECKS=1;');
  265.                 $installedLogFile = storage_path('installed');
  266.                 if (file_exists($getInfoFile)) {
  267.                     $data = file_get_contents($getInfoFile);
  268.                     unlink($getInfoFile);
  269.                 } else {
  270.                     $data = json_encode([
  271.                         'd' => base64_encode($this->get_domain_name(request()->fullUrl())),
  272.                         'i' => date('ymdhis'),
  273.                         'u' => date('ymdhis'),
  274.                     ]);
  275.                 }
  276.  
  277.                 if (!file_exists($installedLogFile)) {
  278.                     file_put_contents($installedLogFile, $data);
  279.                 }
  280.                 return redirect('/');
  281.             } catch (\Exception $e) {
  282.                 if (file_exists($lqsFile)) {
  283.                     unlink($lqsFile);
  284.                 }
  285.                 if (file_exists($getInfoFile)) {
  286.                     unlink($getInfoFile);
  287.                 }
  288.                 DB::rollBack();
  289.                 return Redirect::back()->withErrors('Something went wrong!');
  290.             }
  291.         } else {
  292.             return Redirect::back()->withErrors($response['message']);
  293.         }
  294.     }
  295.     function get_domain_name($url)
  296.     {
  297.         $parseUrl = parse_url(trim($url));
  298.         if (isset($parseUrl['host'])) {
  299.             $host = $parseUrl['host'];
  300.         } else {
  301.             $path = explode('/', $parseUrl['path']);
  302.             $host = $path[0];
  303.         }
  304.         return  trim($host);
  305.     }
  306.     public function saveENV(Request $request)
  307.     {
  308.         $env_val['APP_KEY'] = 'base64:' . base64_encode(Str::random(32));
  309.         $env_val['APP_URL'] = $request->app_url;
  310.         $env_val['DB_HOST'] = $request->db_host;
  311.         $env_val['DB_DATABASE'] = $request->db_name;
  312.         $env_val['DB_USERNAME'] = $request->db_user;
  313.         $env_val['DB_PASSWORD'] = $request->db_password;
  314.         $env_val['MAIL_HOST'] = $request->mail_host;
  315.         $env_val['MAIL_PORT'] = $request->mail_port;
  316.         $env_val['MAIL_USERNAME'] = $request->mail_username;
  317.         $env_val['MAIL_PASSWORD'] = $request->mail_password;
  318.         $this->setEnvValues($env_val);
  319.     }
  320.  
  321.     public function setEnvValues($values)
  322.     {
  323.         if (count($values) > 0) {
  324.             $envFile = app()->environmentFilePath();
  325.             $str = file_get_contents($envFile);
  326.             foreach ($values as $envKey => $envValue) {
  327.                 $str = str_replace("{{".$envKey."}}", $envValue, $str);
  328.             }
  329.             file_put_contents($envFile, $str);
  330.         }
  331.         return true;
  332.     }
  333.  
  334.     private function checkDatabaseConnection(Request $request)
  335.     {
  336.         $connection = 'mysql';
  337.  
  338.         $settings = config("database.connections.mysql");
  339.  
  340.         config([
  341.             'database' => [
  342.                 'default' => 'mysql',
  343.                 'connections' => [
  344.                     'mysql' => array_merge($settings, [
  345.                         'driver' => 'mysql',
  346.                         'host' => $request->db_host,
  347.                         'port' => '3306',
  348.                         'database' => $request->db_name,
  349.                         'username' => $request->db_user,
  350.                         'password' => $request->db_password,
  351.                     ]),
  352.                 ],
  353.             ],
  354.         ]);
  355.  
  356.         DB::purge();
  357.         try {
  358.             DB::connection()->getPdo();
  359.             return true;
  360.         } catch (\Exception $e) {
  361.             return false;
  362.         }
  363.     }
  364. }
  365.  
Tags: php
Add Comment
Please, Sign In to add comment