From 08e09c5d08a69f8e95c6f01b46d1c89d3da5f4cd Mon Sep 17 00:00:00 2001 From: AGuyNamedJens Date: Thu, 30 Mar 2023 00:30:19 +0200 Subject: [PATCH] (feat) New encryption and decryption functions (refactor) Modify the get and set environment functions (refactor) Refactor the entire functions.php file. --- public/install/functions.php | 153 ++++++++++++++++++++++++++--------- 1 file changed, 114 insertions(+), 39 deletions(-) diff --git a/public/install/functions.php b/public/install/functions.php index 39410c81..9b0984cb 100644 --- a/public/install/functions.php +++ b/public/install/functions.php @@ -1,6 +1,9 @@ '8.1', @@ -8,7 +11,11 @@ $requirements = [ 'mysql' => '5.7.22', ]; -function checkPhpVersion() +/** + * Check if the minimum PHP version is present + * @return string 'OK' on success and 'not OK' on failure. + */ +function checkPhpVersion(): string { global $requirements; if (version_compare(phpversion(), $requirements['minPhp'], '>=') && version_compare(phpversion(), $requirements['maxPhp'], '<=')) { @@ -17,17 +24,31 @@ function checkPhpVersion() return 'not OK'; } -function checkWriteable() + +/** + * Check if the environment file is writable + * @return bool Returns true on writable and false on not writable. + */ +function checkWriteable(): bool { return is_writable('../../.env'); } -function checkHTTPS() + +/** + * Check if the server runs using HTTPS + * @return bool Returns true on HTTPS or false on HTTP. + */ +function checkHTTPS(): bool { return (! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443; } -function getMySQLVersion() +/** + * Check if MySQL is installed and runs the correct version using a shell command + * @return mixed|string 'OK' if required version is met, returns MySQL version if not met. + */ +function getMySQLVersion(): mixed { global $requirements; @@ -39,7 +60,11 @@ function getMySQLVersion() return intval($versionoutput) > intval($requirements['mysql']) ? 'OK' : $versionoutput; } -function getZipVersion() +/** + * Check if zip is installed using a shell command + * @return string 'OK' on success and 'not OK' on failure. + */ +function getZipVersion(): string { $output = shell_exec('zip -v') ?? ''; preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', $output, $version); @@ -49,7 +74,11 @@ function getZipVersion() return $versionoutput != 0 ? 'OK' : 'not OK'; } -function getGitVersion() +/** + * Check if git is installed using a shell command + * @return string 'OK' on success and 'not OK' on failure. + */ +function getGitVersion(): string { $output = shell_exec('git --version') ?? ''; preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', $output, $version); @@ -59,7 +88,11 @@ function getGitVersion() return $versionoutput != 0 ? 'OK' : 'not OK'; } -function getTarVersion() +/** + * Check if tar is installed using a shell command + * @return string 'OK' on success and 'not OK' on failure. + */ +function getTarVersion(): string { $output = shell_exec('tar --version') ?? ''; preg_match('@[0-9]+\.[0-9]+@', $output, $version); @@ -69,14 +102,18 @@ function getTarVersion() return $versionoutput != 0 ? 'OK' : 'not OK'; } -function checkExtensions() +/** + * Check all extensions to see if they have loaded or not + * @return array Returns an array of extensions that failed to load. + */ +function checkExtensions(): array { - global $required_extentions; + global $required_extensions; $not_ok = []; $extentions = get_loaded_extensions(); - foreach ($required_extentions as $ext) { + foreach ($required_extensions as $ext) { if (! preg_grep('/^(?=.*'.$ext.').*$/', $extentions)) { array_push($not_ok, $ext); } @@ -85,38 +122,66 @@ function checkExtensions() return $not_ok; } -function setEnvironmentValue($envKey, $envValue) +/** + * Sets the environment variable into the env file + * @param string $envKey The environment key to set or modify + * @param string $envValue The environment variable to set + * @return bool true on success or false on failure. + */ +function setEnvironmentValue(string $envKey, $envValue) { - $envFile = dirname(__FILE__, 3).'/.env'; - $str = file_get_contents($envFile); - - $str .= "\n"; // In case the searched variable is in the last line without \n - $keyPosition = strpos($str, "{$envKey}="); - $endOfLinePosition = strpos($str, PHP_EOL, $keyPosition); - $oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition); - $str = str_replace($oldLine, "{$envKey}={$envValue}", $str); - $str = substr($str, 0, -1); - - $fp = fopen($envFile, 'w'); - fwrite($fp, $str); - fclose($fp); + $str = "{$envKey}={$envValue}"; + return putenv($str); } -function getEnvironmentValue($envKey) +/** + * Gets the variable from the env file + * @param string $envKey The environment variable to look for + * @return array|false|string Returns the value if found, otherwise returns false. + */ +function getEnvironmentValue(string $envKey): array|false|string { - $envFile = dirname(__FILE__, 3).'/.env'; - $str = file_get_contents($envFile); - - $str .= "\n"; // In case the searched variable is in the last line without \n - $keyPosition = strpos($str, "{$envKey}="); - $endOfLinePosition = strpos($str, PHP_EOL, $keyPosition); - $oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition); - $value = substr($oldLine, strpos($oldLine, '=') + 1); - - return $value; + return getenv($envKey); } -function run_console($command) + +/** + * Encrypts the variable passed and returns the encrypted version + * @param mixed $value The variable to be encrypted + * @return string Returns the encrypted variable. + */ +function encryptSettingsValue(mixed $value): string +{ + $appKey = getEnvironmentValue('APP_KEY'); + $appKey = base64_decode(Str::after($appKey, 'base64:')); + $encrypter = new Encrypter($appKey, 'AES-256-CBC'); + $encryptedKey = $encrypter->encrypt($value); + + return $encryptedKey; +} + +/** + * Decrypts the payload passed and returns the decrypted version + * @param mixed $payload The payload to be decrypted + * @return mixed Returns the decrypted variable on success, throws otherwise. + */ + +function decryptSettingsValue(mixed $payload, $unserialize = true) +{ + $appKey = getEnvironmentValue('APP_KEY'); + $appKey = base64_decode(Str::after($appKey, 'base64:')); + $encrypter = new Encrypter($appKey, 'AES-256-CBC'); + $decryptedKey = $encrypter->decrypt($payload, $unserialize); + + return $decryptedKey; +} + +/** + * Run a shell command + * @param string $command The command string to run + * @return false|string|null Returns the result from the command. + */ +function run_console(string $command) { $path = dirname(__FILE__, 3); $cmd = "cd '$path' && bash -c 'exec -a ServerCPP $command' 2>&1"; @@ -124,7 +189,12 @@ function run_console($command) return shell_exec($cmd); } -function wh_log($log_msg) +/** + * Log to installer.log in the install folder + * @param string $log_msg the message to log + * @return void No output. + */ +function wh_log(string $log_msg) { $log_filename = 'logs'; if (! file_exists($log_filename)) { @@ -136,7 +206,12 @@ function wh_log($log_msg) file_put_contents($log_file_data, '['.date('h:i:s').'] '.$log_msg."\n", FILE_APPEND); } -function generateRandomString($length = 8) +/** + * Generate a random string + * @param int $length The length of the random string + * @return string The randomly generated string. + */ +function generateRandomString(int $length = 8): string { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters);