From e9cf01f91114a3e0a7733d6e49de458d8ed6c30a Mon Sep 17 00:00:00 2001 From: Clemente Raposo Date: Wed, 15 Jan 2025 12:08:18 +0000 Subject: [PATCH] Add missing permissions warning page to install pre-checks --- .../installer_missing_permissions.html.twig | 85 ++++++++++++++ .../Install/Service/InstallPreChecks.php | 108 ++++++++++++------ public/install.php | 4 + 3 files changed, 160 insertions(+), 37 deletions(-) create mode 100644 core/backend/Install/Resources/installer_missing_permissions.html.twig diff --git a/core/backend/Install/Resources/installer_missing_permissions.html.twig b/core/backend/Install/Resources/installer_missing_permissions.html.twig new file mode 100644 index 000000000..2feec5305 --- /dev/null +++ b/core/backend/Install/Resources/installer_missing_permissions.html.twig @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + +
+ +
+
+
+
+
+
+
+ {{ mod_strings.ERR_CHECKSYS_NOT_WRITABLE }} +
+
'{{ path }}'
+
+ {{ mod_strings.LBL_DISABLED_DESCRIPTION_3 }} +
+
+ {{ mod_strings.LBL_DISABLED_HELP_1 }} + {{ mod_strings.LBL_DISABLED_HELP_2 }} +
+
+
+
+
+
+ + +
+ + diff --git a/core/backend/Install/Service/InstallPreChecks.php b/core/backend/Install/Service/InstallPreChecks.php index 817ae582e..51947021e 100644 --- a/core/backend/Install/Service/InstallPreChecks.php +++ b/core/backend/Install/Service/InstallPreChecks.php @@ -40,7 +40,6 @@ namespace App\Install\Service; -use AllowDynamicProperties; use Monolog\Logger; use Twig\Environment; use Twig\Loader\FilesystemLoader; @@ -84,20 +83,31 @@ class InstallPreChecks $this->log = $log; } + public function showMissingPermissionsPage($path): void + { + $sugar_config = $this->getConfigValues(); + $this->loadModStrings(); + + $cssFile = $this->getCssFile(); + + $loader = new FilesystemLoader(__DIR__ . '/../Resources'); + $twig = new Environment($loader); + $template = $twig->load('installer_missing_permissions.html.twig'); + echo $template->render([ + 'cssFile' => $cssFile, + 'path' => $path, + 'mod_strings' => $this->modStrings + ]); + return; + } + public function setupTwigTemplate(): void { $sugar_config = $this->getConfigValues(); - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); - $files = scandir('dist'); - - foreach ($files as $file) { - - if (preg_match("/styles\.[^.]+\.css/", $file)) { - $cssFile = $file; - } - } + $cssFile = $this->getCssFile(); if (file_exists('legacy/config.php') && ($sugar_config['installer_locked'] ?? false) === true) { $loader = new FilesystemLoader(__DIR__ . '/../Resources'); @@ -182,7 +192,7 @@ class InstallPreChecks function checkMainPage(string $baseUrl = ''): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $this->log->info('Running curl for SuiteCRM Main Page'); $ch = curl_init(); $timeout = 5; @@ -313,7 +323,7 @@ class InstallPreChecks */ function checkGraphQlAPI(string $baseUrl = ''): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $this->log->info('Running curl for Api'); $ch = curl_init(); @@ -410,7 +420,7 @@ class InstallPreChecks $enUsStrings = []; $lang = 'en_us'; - $sugarConfig = $this->getConfigValues(); + $sugar_config = $this->getConfigValues(); $configOverride = $this->getConfigOverrideValues(); $enUsLangPack = __DIR__ . '/../../../../public/legacy/install/language/' . $lang . '.lang.php'; @@ -467,7 +477,7 @@ class InstallPreChecks private function runPHPChecks($labels, $results): void { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $key = $this->modStrings['LBL_PHP_CHECKS']; @@ -484,7 +494,7 @@ class InstallPreChecks private function checkMemoryLimit(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $labels[] = $this->modStrings['LBL_CHECKSYS_MEM']; @@ -541,7 +551,7 @@ class InstallPreChecks private function checkAllowsStream(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $labels[] = $this->modStrings['LBL_STREAM']; @@ -618,7 +628,7 @@ class InstallPreChecks private function runPermissionChecks($labels, $results): void { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $key = $this->modStrings['LBL_PERMISSION_CHECKS']; @@ -655,7 +665,7 @@ class InstallPreChecks private function isWritableCustomDir(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $this->log->info('Checking if Custom Dir is writable'); @@ -679,7 +689,7 @@ class InstallPreChecks private function isWritableUploadDir(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $this->log->info('Checking if Upload Dir is Writable'); @@ -704,7 +714,7 @@ class InstallPreChecks private function isWritableLegacyCacheSubDir(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $this->log->info('Checking Legacy Cache Sub Dirs are writable'); @@ -754,7 +764,7 @@ class InstallPreChecks private function checkMbStringsModule(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $labels[] = $this->modStrings['LBL_CHECKSYS_MBSTRING']; $results = [ @@ -777,7 +787,7 @@ class InstallPreChecks private function isWritableConfigFile(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $labels[] = $this->modStrings['LBL_CHECKSYS_CONFIG']; $results = [ @@ -806,7 +816,7 @@ class InstallPreChecks private function isWritableSubDirFiles(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $labels[] = $this->modStrings['LBL_CHECKSYS_MODULE']; @@ -847,7 +857,7 @@ class InstallPreChecks private function checkXMLParsing(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $results = [ 'result' => '', @@ -871,7 +881,7 @@ class InstallPreChecks private function checkRequiredModulesInExtensions(&$labels, &$results): void { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $this->log->info('Checking required loaded extensions'); @@ -915,7 +925,7 @@ class InstallPreChecks private function checkPCRELibrary(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $results = [ 'result' => '', @@ -946,7 +956,7 @@ class InstallPreChecks private function checkSpriteSupport(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $results = [ 'result' => '', @@ -970,7 +980,7 @@ class InstallPreChecks private function checkUploadFileSize(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $results = [ 'result' => '', @@ -1022,7 +1032,7 @@ class InstallPreChecks private function runServerConfigurationCheck(array $labels, array $results): void { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $key = $this->modStrings['LBL_SERVER_CHECKS']; @@ -1043,7 +1053,7 @@ class InstallPreChecks private function checkSystemPhpVersion(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $labels[] = $this->modStrings['LBL_CHECKSYS_PHPVER']; @@ -1063,7 +1073,7 @@ class InstallPreChecks private function addChecks(string $key, $labels, $results, $optional = false): void { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $this->systemChecks[$key] = [ 'label' => '', @@ -1107,7 +1117,7 @@ class InstallPreChecks private function optionalInstallChecks(): void { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $this->checkOptionalModulesInExtensions(); @@ -1123,7 +1133,7 @@ class InstallPreChecks private function checkOptionalModulesInExtensions(): void { - $this->modStrings = $this->getLanguageStrings();; + $this->loadModStrings();; $this->log->info('Checking optional loaded extensions'); @@ -1177,7 +1187,7 @@ class InstallPreChecks protected function isRootWritable(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $this->log->info('Checking if root is writable'); @@ -1205,7 +1215,7 @@ class InstallPreChecks public function checkFolderIsWritable(string $folderName, array &$labels, string $parentDir = ''): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $this->log->info('Checking ' . $folderName . ' is writable'); @@ -1245,7 +1255,7 @@ class InstallPreChecks private function canTouchEnv(&$labels): array { - $this->modStrings = $this->getLanguageStrings(); + $this->loadModStrings(); $labels[] = $this->modStrings['LBL_CHECKSYS_ENV']; @@ -1256,7 +1266,7 @@ class InstallPreChecks 'errors' => [] ]; - if (file_exists($env) && is_writable($env) || !file_exists($env) && touch($env)) { + if ((file_exists($env) && is_writable($env)) || (!file_exists($env) && touch($env))) { $this->log->info('.env exists or is writable'); $results['result'] = $this->modStrings['LBL_CHECKSYS_OK']; @@ -1266,4 +1276,28 @@ class InstallPreChecks $results['errors'][] = $this->modStrings['ERR_CHECKSYS_ENV_NOT_WRITABLE']; return $results; } + + /** + * @return mixed + */ + protected function getCssFile(): mixed + { + $files = scandir('dist'); + + foreach ($files as $file) { + + if (preg_match("/styles\.[^.]+\.css/", $file)) { + $cssFile = $file; + } + } + return $cssFile; + } + + /** + * @return void + */ + protected function loadModStrings(): void + { + $this->modStrings = $this->getLanguageStrings(); + } } diff --git a/public/install.php b/public/install.php index 0e1be35a6..594a31cd1 100644 --- a/public/install.php +++ b/public/install.php @@ -44,6 +44,10 @@ use Monolog\Logger; require __DIR__ . '/../config/bootstrap.php'; require __DIR__ . '/../vendor/autoload.php'; +if (!is_writable('../logs')) { + (new InstallPreChecks(''))->showMissingPermissionsPage('/logs/install.log'); + return; +} $log = new Logger('install.log'); $sessionName = 'SCRMSESSID'; $sessionId = $_COOKIE[$sessionName] ?? false;