Spaces:
No application file
No application file
| namespace Mautic\InstallBundle\Configurator\Step; | |
| use Mautic\CoreBundle\Configurator\Configurator; | |
| use Mautic\CoreBundle\Configurator\Step\StepInterface; | |
| use Mautic\CoreBundle\Helper\FileHelper; | |
| use Mautic\CoreBundle\Security\Cryptography\Cipher\Symmetric\OpenSSLCipher; | |
| use Mautic\InstallBundle\Configurator\Form\CheckStepType; | |
| use Symfony\Component\HttpFoundation\RequestStack; | |
| class CheckStep implements StepInterface | |
| { | |
| /** | |
| * Flag if the configuration file is writable. | |
| */ | |
| private bool $configIsWritable; | |
| /** | |
| * Absolute path to cache directory. | |
| * Required in step. | |
| * | |
| * @var string | |
| */ | |
| public $cache_path = '%kernel.project_dir%/var/cache'; | |
| /** | |
| * Absolute path to log directory. | |
| * Required in step. | |
| * | |
| * @var string | |
| */ | |
| public $log_path = '%kernel.project_dir%/var/logs'; | |
| /** | |
| * Set the domain URL for use in getting the absolute URL for cli/cronjob generated URLs. | |
| * | |
| * @var string | |
| */ | |
| public $site_url = ''; | |
| /** | |
| * Recommended minimum memory limit for Mautic. | |
| * | |
| * @var string | |
| */ | |
| public const RECOMMENDED_MEMORY_LIMIT = '512M'; | |
| /** | |
| * @param Configurator $configurator Configurator service | |
| * @param string $projectDir Kernel root path | |
| * @param RequestStack $requestStack Request stack | |
| */ | |
| public function __construct( | |
| Configurator $configurator, | |
| private string $projectDir, | |
| RequestStack $requestStack, | |
| private OpenSSLCipher $openSSLCipher | |
| ) { | |
| $request = $requestStack->getCurrentRequest(); | |
| $this->configIsWritable = $configurator->isFileWritable(); | |
| if (!empty($request)) { | |
| $this->site_url = $request->getSchemeAndHttpHost().$request->getBasePath(); | |
| } | |
| } | |
| public function getFormType(): string | |
| { | |
| return CheckStepType::class; | |
| } | |
| public function checkRequirements(): array | |
| { | |
| $messages = []; | |
| if (!is_dir($this->projectDir.'/vendor/composer')) { | |
| $messages[] = 'mautic.install.composer.dependencies'; | |
| } | |
| if (!$this->configIsWritable) { | |
| $messages[] = 'mautic.install.config.unwritable'; | |
| } | |
| if (!is_writable(str_replace('%kernel.project_dir%', $this->projectDir, $this->cache_path))) { | |
| $messages[] = 'mautic.install.cache.unwritable'; | |
| } | |
| if (!is_writable(str_replace('%kernel.project_dir%', $this->projectDir, $this->log_path))) { | |
| $messages[] = 'mautic.install.logs.unwritable'; | |
| } | |
| $timezones = []; | |
| foreach (\DateTimeZone::listAbbreviations() as $abbreviations) { | |
| foreach ($abbreviations as $abbreviation) { | |
| $timezones[$abbreviation['timezone_id']] = true; | |
| } | |
| } | |
| if (!isset($timezones[date_default_timezone_get()])) { | |
| $messages[] = 'mautic.install.timezone.not.supported'; | |
| } | |
| if (!function_exists('json_encode')) { | |
| $messages[] = 'mautic.install.function.jsonencode'; | |
| } | |
| if (!function_exists('session_start')) { | |
| $messages[] = 'mautic.install.function.sessionstart'; | |
| } | |
| if (!function_exists('ctype_alpha')) { | |
| $messages[] = 'mautic.install.function.ctypealpha'; | |
| } | |
| if (!function_exists('token_get_all')) { | |
| $messages[] = 'mautic.install.function.tokengetall'; | |
| } | |
| if (!function_exists('simplexml_import_dom')) { | |
| $messages[] = 'mautic.install.function.simplexml'; | |
| } | |
| if (false === $this->openSSLCipher->isSupported()) { | |
| $messages[] = 'mautic.install.extension.openssl'; | |
| } | |
| if (!function_exists('curl_init')) { | |
| $messages[] = 'mautic.install.extension.curl'; | |
| } | |
| if (!function_exists('finfo_open')) { | |
| $messages[] = 'mautic.install.extension.fileinfo'; | |
| } | |
| if (!function_exists('mb_strtolower')) { | |
| $messages[] = 'mautic.install.extension.mbstring'; | |
| } | |
| if (extension_loaded('xdebug')) { | |
| if (ini_get('xdebug.show_exception_trace')) { | |
| $messages[] = 'mautic.install.xdebug.exception.trace'; | |
| } | |
| if (ini_get('xdebug.scream')) { | |
| $messages[] = 'mautic.install.xdebug.scream'; | |
| } | |
| } | |
| return $messages; | |
| } | |
| public function checkOptionalSettings(): array | |
| { | |
| $messages = []; | |
| if (extension_loaded('xdebug')) { | |
| $cfgValue = ini_get('xdebug.max_nesting_level'); | |
| if ($cfgValue <= 100) { | |
| $messages[] = 'mautic.install.xdebug.nesting'; | |
| } | |
| } | |
| if (!extension_loaded('zip')) { | |
| $messages[] = 'mautic.install.extension.zip'; | |
| } | |
| // We set a default timezone in the app bootstrap, but advise the user if their PHP config is missing it | |
| if (!ini_get('date.timezone')) { | |
| $messages[] = 'mautic.install.date.timezone.not.set'; | |
| } | |
| if (!class_exists('\\DomDocument')) { | |
| $messages[] = 'mautic.install.module.phpxml'; | |
| } | |
| if (!function_exists('iconv')) { | |
| $messages[] = 'mautic.install.function.iconv'; | |
| } | |
| if (!extension_loaded('xml')) { | |
| $messages[] = 'mautic.install.function.xml'; | |
| } | |
| if (!function_exists('imap_open')) { | |
| $messages[] = 'mautic.install.extension.imap'; | |
| } | |
| if (!$this->site_url || !str_starts_with($this->site_url, 'https')) { | |
| $messages[] = 'mautic.install.ssl.certificate'; | |
| } | |
| if (!defined('PHP_WINDOWS_VERSION_BUILD')) { | |
| if (!function_exists('posix_isatty')) { | |
| $messages[] = 'mautic.install.function.posix.enable'; | |
| } | |
| } | |
| $memoryLimit = FileHelper::convertPHPSizeToBytes(ini_get('memory_limit')); | |
| $suggestedLimit = FileHelper::convertPHPSizeToBytes(self::RECOMMENDED_MEMORY_LIMIT); | |
| if ($memoryLimit > -1 && $memoryLimit < $suggestedLimit) { | |
| $messages[] = 'mautic.install.memory.limit'; | |
| } | |
| if (!class_exists('\\Locale')) { | |
| $messages[] = 'mautic.install.module.intl'; | |
| } | |
| if (class_exists('\\Collator')) { | |
| try { | |
| if (is_null(new \Collator('fr_FR'))) { | |
| $messages[] = 'mautic.install.intl.config'; | |
| } | |
| } catch (\Exception) { | |
| $messages[] = 'mautic.install.intl.config'; | |
| } | |
| } | |
| if (-1 !== (int) ini_get('zend.assertions')) { | |
| $messages[] = 'mautic.install.zend_assertions'; | |
| } | |
| return $messages; | |
| } | |
| public function getTemplate(): string | |
| { | |
| return '@MauticInstall/Install/check.html.twig'; | |
| } | |
| /** | |
| * @return mixed[] | |
| */ | |
| public function update(StepInterface $data): array | |
| { | |
| $parameters = []; | |
| foreach ($data as $key => $value) { | |
| // Exclude keys from the config | |
| if (!in_array($key, ['configIsWritable', 'projectDir'])) { | |
| $parameters[$key] = $value; | |
| } | |
| } | |
| return $parameters; | |
| } | |
| } | |