����JFIF��x�x����'
| Server IP : 78.140.185.180 / Your IP : 216.73.216.170 Web Server : LiteSpeed System : Linux cpanel13.v.fozzy.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64 User : builderbox ( 1072) PHP Version : 7.3.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /proc/thread-self/root/home/builderbox/././././public_html/public/install_files/php/ |
Upload File : |
<?php
use App\User;
use Common\Auth\Permissions\Permission;
use Common\Database\MigrateAndSeed;
use Common\Files\Controllers\UploadFaviconController;
use Common\Settings\DotEnvEditor;
use Illuminate\Encryption\Encrypter;
use Illuminate\Foundation\Application;
class Installer
{
/**
* @var string
*/
protected $baseDirectory;
/**
* @var string
*/
private $logFile;
public function __construct()
{
$this->baseDirectory = PATH_INSTALL;
$this->logFile = PATH_INSTALL . '/public/install_files/install.log';
$this->logPost();
if (!is_null($handler = $this->post('handler'))) {
if (!strlen($handler)) exit;
try {
if (!preg_match('/^on[A-Z]{1}[\w+]*$/', $handler)) throw new Exception(sprintf('Invalid handler: %s', $this->e($handler)));
if (method_exists($this, $handler) && ($result = $this->$handler()) !== null) {
$this->log('Execute handler (%s): %s', $handler, print_r($result, true));
header('Content-Type: application/json');
die(json_encode($result));
}
} catch (Exception $ex) {
header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
$this->log('Handler error (%s): %s', $handler, $ex->getMessage());
$this->log(['Trace log:', '%s'], $ex->getTraceAsString());
die($ex->getMessage());
}
exit;
}
}
protected function onCheckRequirements()
{
$this->log('Check requirements: start');
$this->createHtaccessFiles();
$result = [
'PHP Version' => ['result' => version_compare(PHP_VERSION, MINIMUM_VERSION, '>'), 'errorMessage' => 'You need at least ' . MINIMUM_VERSION . ' PHP Version to install.'],
'PDO' => ['result' => defined('PDO::ATTR_DRIVER_NAME'), 'errorMessage' => 'PHP PDO extension is required.',],
'XML' => ['result' => extension_loaded('xml'), 'errorMessage' => 'PHP XML extension is required.',],
'Mbstring' => ['result' => extension_loaded('mbstring'), 'errorMessage' => 'PHP mbstring extension is required.',],
'Fileinfo' => ['result' => extension_loaded('fileinfo'), 'errorMessage' => 'PHP fileinfo extension is required.'],
'OpenSSL' => ['result' => extension_loaded('openssl'), 'errorMessage' => 'PHP openssl extension is required.'],
'GD' => ['result' => extension_loaded('gd'), 'errorMessage' => 'PHP GD extension is required.'],
'fpassthru' => ['result' => function_exists('fpassthru'), 'errorMessage' => '"fpassthru" PHP function needs to be enabled.'],
'Curl' => ['result' => extension_loaded('curl'), 'errorMessage' => 'PHP curl functionality needs to be enabled.'],
'Zip' => ['result' => class_exists('ZipArchive'), 'errorMessage' => 'PHP ZipArchive extension needs to be installed.'],
];
$allPass = array_filter($result, function($item) {
return !$item['result'];
});
$this->log('Check requirements: end', ($allPass ? '+OK' : '=FAIL'));
return $result;
}
protected function onCheckFileSystem()
{
$this->log('Check filesystem: start');
$directories = [
'',
'storage',
'storage/app',
'storage/logs',
'storage/framework',
'public/storage',
];
$results = [];
foreach ($directories as $directory) {
$path = rtrim("{$this->baseDirectory}/$directory", '/');
$writable = is_writable($path);
$result = ['path' => $path, 'result' => $writable, 'errorMessage' => ''];
if ( ! $writable) {
$result['errorMessage'] = is_dir($path) ?
'Make this directory writable by giving it 0755 or 0777 permissions via file manager.' :
'Make this directory writable by giving it 644 permissions via file manager.';
}
$results[] = $result;
}
$files = [
'.htaccess',
'public/.htaccess',
];
if ( ! $this->fileExistsAndNotEmpty('.env') && ! $this->fileExistsAndNotEmpty('env.example')) {
$results[] = [
'path' => $this->baseDirectory,
'result' => false,
'errorMessage' => "Make sure <strong>env.example</strong> or <strong>.env</strong> file has been uploaded properly to the directory above and is writable.",
];
}
foreach ($files as $file) {
$results[] = [
'path' => "{$this->baseDirectory}/$file",
'result' => $this->fileExistsAndNotEmpty($file),
'errorMessage' => "Make sure <strong>$file</strong> file has been uploaded properly to your server and is writable."
];
}
$allPass = array_filter($results, function($item) {
return !$item['result'];
});
$this->log('Check filesystem: end', $results, ($allPass ? '+OK' : '=FAIL'));
return $results;
}
/**
* @param string $path
* @return bool
*/
protected function fileExistsAndNotEmpty($path)
{
$filePath = "{$this->baseDirectory}/$path";
$writable = is_writable($filePath);
$content = $writable ? trim(file_get_contents($filePath)) : '';
return $writable && strlen($content);
}
protected function onValidateAndInsertDatabaseCredentials()
{
if (!strlen($this->post('db_host'))) {
throw new InstallerException('Please specify a database host.', 'db_host');
}
if (!strlen($this->post('db_database'))) {
throw new InstallerException('Please specify the database name.', 'db_database');
}
$config = ['db_host' => null, 'db_database' => null, 'db_port' => null, 'db_username' => null, 'db_password' => null, 'db_prefix' => null];
array_walk($config, function (&$value, $key) {
$value = $value ?: $this->post($key);
});
$dsn = 'mysql:host=' . $config['db_host'] . ';dbname=' . $config['db_database'];
if ($config['port']) $dsn .= ";port=" . $config['port'];
try {
$db = new PDO($dsn, $config['db_username'], $config['db_password'], array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
} catch (PDOException $ex) {
throw new Exception('Connection failed: ' . $ex->getMessage());
}
/*
* Check the database is empty
*/
$fetch = $db->query('show tables', PDO::FETCH_NUM);
$tables = 0;
while ($result = $fetch->fetch()) $tables++;
if ($tables > 0) {
throw new Exception(sprintf('Database "%s" is not empty. Please empty the database or specify another database.', $this->e($config['db_database'])));
}
$this->insertDBCredentials($config);
}
protected function onValidateAdminAccount()
{
if (!strlen($this->post('email'))) throw new InstallerException('Please specify administrator email address', 'email');
if (!filter_var($this->post('email'), FILTER_VALIDATE_EMAIL)) throw new InstallerException('Please specify valid email address', 'email');
if (!strlen($this->post('password'))) throw new InstallerException('Please specify password', 'password');
if (strlen($this->post('password')) < 4) throw new InstallerException('Please specify password length more than 4 characters', 'password');
if (strlen($this->post('password')) > 255) throw new InstallerException('Please specify password length less than 64 characters', 'password');
if (!strlen($this->post('password_confirmation'))) throw new InstallerException('Please confirm chosen password', 'password_confirmation');
if (strcmp($this->post('password'), $this->post('password_confirmation'))) throw new InstallerException('Specified password does not match the confirmed password', 'password');
}
protected function onInstallApplication()
{
$this->bootFramework();
// Fix "index is too long" issue on MariaDB and older mysql versions
Schema::defaultStringLength(191);
// Generate key
$appKey = 'base64:'.base64_encode(
Encrypter::generateKey(config('app.cipher') )
);
app(DotEnvEditor::class)->write([
'app_key' => $appKey,
]);
app(MigrateAndSeed::class)->execute(function() {
$this->createAdminAccount();
});
$this->putAppInProductionEnv();
// move default favicons
File::copyDirectory("$this->baseDirectory/assets/favicons", public_path(UploadFaviconController::FAVICON_DIR));
Cache::flush();
try {
$this->deleteInstallationFiles();
} catch (Exception $e) {
//
}
}
public function createAdminAccount()
{
$email = $this->post('email');
$user = app(User::class)->firstOrNew(['email' => $email]);
$user->username = $this->post('username');
$user->email = $email;
$user->password = Hash::make($this->post('password'));
$user->email_verified_at = now();
$user->save();
$adminPermission = app(Permission::class)->firstOrCreate(
['name' => 'admin'],
[
'name' => 'admin',
'group' => 'admin',
'display_name' => 'Super Admin',
'description' => 'Give all permissions to user.',
]
);
$user->permissions()->attach($adminPermission->id);
Auth::login($user);
}
/**
* Insert user supplied db credentials into .env file.
*
* @param array $credentials
* @return void
*/
protected function insertDBCredentials($credentials)
{
$this->bootFramework();
$envFile = $this->baseDirectory . '/.env';
$envExampleFile = $this->baseDirectory . '/env.example';
$envExists = file_exists($envFile);
(new DotEnvEditor)
->write($credentials, $this->envFileName());
if ( ! $envExists) {
// rename env.example to .env
rename($envExampleFile, $envFile);
}
}
private function putAppInProductionEnv()
{
$writer = app(DotEnvEditor::class);
$writer->write([
'app_url' => $this->getBaseUrl(),
'app_env' => 'production',
'app_debug' => false,
'installed' => true,
]);
}
protected function createHtaccessFiles($force = false, $alternative = false) {
$rootHtaccess = "{$this->baseDirectory}/.htaccess";
$rootHtaccessStub = "{$this->baseDirectory}/htaccess.example";
$publicHtaccess = "{$this->baseDirectory}/public/.htaccess";
$publicHtaccessStub = "{$this->baseDirectory}/public/htaccess.example";
$parts = parse_url($this->getBaseUrl());
if ( ! file_exists($rootHtaccess) || $force) {
$contents = file_get_contents($rootHtaccessStub);
if ($alternative) {
$path = isset($parts['path']) ? $parts['path'] : '/';
$contents = str_replace('# RewriteBase /', "RewriteBase $path", $contents);
}
file_put_contents($rootHtaccess, $contents);
}
if ( ! file_exists($publicHtaccess) || $force) {
$contents = file_get_contents($publicHtaccessStub);
if ($alternative) {
$path = isset($parts['path']) ? $parts['path'] : '';
$contents = str_replace('index.php', "{$path}/index.php", $contents);
$contents = str_replace('# RewriteBase /', "RewriteBase $path", $contents);
}
file_put_contents($publicHtaccess, $contents);
}
}
private function deleteInstallationFiles()
{
$dir = $this->baseDirectory . '/public/install_files';
$it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
$files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);
foreach ($files as $file) {
if ($file->isDir()) {
rmdir($file->getRealPath());
} else {
unlink($file->getRealPath());
}
}
@rmdir($dir);
}
public function startNewLogSection()
{
file_put_contents($this->logFile, '"========================== INSTALLATION LOG SECTION ========================"' . PHP_EOL, FILE_APPEND);
}
public function logPost()
{
if (!isset($_POST) || !count($_POST)) return;
$postData = $_POST;
if (array_key_exists('disableLog', $postData)) $postData = array('disableLog' => true);
/*
* Sensitive data fields
*/
if (isset($postData['admin_email'])) $postData['admin_email'] = '*******@*****.com';
$fieldsToErase = array('encryption_code', 'admin_password', 'admin_confirm_password', 'db_pass', 'project_id',);
foreach ($fieldsToErase as $field) {
if (isset($postData[$field])) $postData[$field] = '*******';
}
file_put_contents($this->logFile, '.============================ POST REQUEST ==========================.' . PHP_EOL, FILE_APPEND);
$this->log('Postback payload: %s', print_r($postData, true));
}
public function log()
{
$args = func_get_args();
$message = array_shift($args);
if (is_array($message)) $message = implode(PHP_EOL, $message);
$message = "[" . date("Y/m/d h:i:s", time()) . "] " . vsprintf($message, $args) . PHP_EOL;
try {
file_put_contents($this->logFile, $message, FILE_APPEND);
} catch (\Exception $e) {
//
}
}
protected function bootFramework()
{
$autoloadFile = $this->baseDirectory . '/vendor/autoload.php';
if (!file_exists($autoloadFile)) {
throw new Exception('Unable to find autoloader: ~/vendor/autoload.php');
}
require $autoloadFile;
$appFile = $this->baseDirectory . '/bootstrap/app.php';
if (!file_exists($appFile)) {
throw new Exception('Unable to find app loader: ~/bootstrap/app.php');
}
/** @var Application $app */
$app = require_once $appFile;
$kernel = $app->make('Illuminate\Contracts\Console\Kernel');
$kernel->bootstrap();
}
protected function post($var, $default = null)
{
if (array_key_exists($var, $_REQUEST)) {
$result = $_REQUEST[$var];
if (is_string($result)) $result = trim($result);
return $result;
}
return $default;
}
public function getBaseUrl($suffix = null)
{
if (isset($_SERVER['HTTP_HOST'])) {
$baseUrl = !empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
$baseUrl .= '://' . $_SERVER['HTTP_HOST'];
$baseUrl .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
} else {
$baseUrl = 'http://localhost/';
}
$baseUrl = rtrim($baseUrl, '/');
$baseUrl = preg_replace('/\/public$/', '', $baseUrl);
$baseUrl = str_replace('install_files', '', $baseUrl);
$baseUrl = trim($baseUrl);
return rtrim(($suffix ? "$baseUrl/$suffix" : $baseUrl), '/');
}
public function e($value)
{
return htmlentities($value, ENT_QUOTES, 'UTF-8', false);
}
private function envFileName()
{
return file_exists("$this->baseDirectory/.env") ? '.env' : 'env.example';
}
}