diff --git a/CRM/Upgrade/Form.php b/CRM/Upgrade/Form.php index 27cfa35e24be..65ba1c350caa 100644 --- a/CRM/Upgrade/Form.php +++ b/CRM/Upgrade/Form.php @@ -18,7 +18,7 @@ class CRM_Upgrade_Form extends CRM_Core_Form { /** * Minimum size of MySQL's thread_stack option * - * @see install/index.php MINIMUM_THREAD_STACK + * @see CRM_Upgrade_Form::MINIMUM_THREAD_STACK */ const MINIMUM_THREAD_STACK = 192; diff --git a/install/block_small.png b/install/block_small.png deleted file mode 100644 index 83495a2a790c..000000000000 Binary files a/install/block_small.png and /dev/null differ diff --git a/install/civicrm.php b/install/civicrm.php deleted file mode 100644 index fa497fe7ff32..000000000000 --- a/install/civicrm.php +++ /dev/null @@ -1,337 +0,0 @@ -register(); - - $sqlPath = $crmPath . DIRECTORY_SEPARATOR . 'sql'; - $tplPath = $crmPath . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'CRM' . DIRECTORY_SEPARATOR . 'common' . DIRECTORY_SEPARATOR; - - if (!is_dir($filesDirectory)) { - mkdir($filesDirectory, 0777); - chmod($filesDirectory, 0777); - } - - $scratchDir = $filesDirectory . DIRECTORY_SEPARATOR . 'civicrm'; - if (!is_dir($scratchDir)) { - mkdir($scratchDir, 0777); - } - - $compileDir = $scratchDir . DIRECTORY_SEPARATOR . 'templates_c' . DIRECTORY_SEPARATOR; - if (!is_dir($compileDir)) { - mkdir($compileDir, 0777); - } - $compileDir = addslashes($compileDir); -} - -/** - * @param string $name - * @param $buffer - */ -function civicrm_write_file($name, &$buffer) { - $fd = fopen($name, "w"); - if (!$fd) { - die("Cannot open $name"); - } - fwrite($fd, $buffer); - fclose($fd); -} - -/** - * @param $config - */ -function civicrm_main(&$config) { - global $sqlPath, $crmPath, $cmsPath, $installType; - - if ($installType == 'drupal') { - $siteDir = $config['site_dir'] ?? getSiteDir($cmsPath, $_SERVER['SCRIPT_FILENAME']); - civicrm_setup($cmsPath . DIRECTORY_SEPARATOR . 'sites' . DIRECTORY_SEPARATOR . $siteDir . DIRECTORY_SEPARATOR . 'files' - ); - } - elseif ($installType == 'backdrop') { - civicrm_setup($cmsPath . DIRECTORY_SEPARATOR . 'files'); - } - elseif ($installType == 'wordpress') { - $upload_dir = wp_upload_dir(); - $files_dirname = $upload_dir['basedir']; - civicrm_setup($files_dirname); - } - - $parts = explode(':', $config['mysql']['server']); - if (empty($parts[1])) { - $parts[1] = 3306; - } - $config['mysql']['server'] = implode(':', $parts); - - $dsn = "mysql://{$config['mysql']['username']}:{$config['mysql']['password']}@{$config['mysql']['server']}/{$config['mysql']['database']}?new_link=true"; - civicrm_source($dsn, $sqlPath . DIRECTORY_SEPARATOR . 'civicrm.mysql'); - - if (!empty($config['loadGenerated'])) { - civicrm_source($dsn, $sqlPath . DIRECTORY_SEPARATOR . 'civicrm_generated.mysql'); - } - else { - if (isset($config['seedLanguage']) - and preg_match('/^[a-z][a-z]_[A-Z][A-Z]$/', $config['seedLanguage']) - and file_exists($sqlPath . DIRECTORY_SEPARATOR . "civicrm_data.{$config['seedLanguage']}.mysql") - and file_exists($sqlPath . DIRECTORY_SEPARATOR . "civicrm_acl.{$config['seedLanguage']}.mysql") - ) { - civicrm_source($dsn, $sqlPath . DIRECTORY_SEPARATOR . "civicrm_data.{$config['seedLanguage']}.mysql"); - civicrm_source($dsn, $sqlPath . DIRECTORY_SEPARATOR . "civicrm_acl.{$config['seedLanguage']}.mysql"); - } - else { - civicrm_source($dsn, $sqlPath . DIRECTORY_SEPARATOR . 'civicrm_data.mysql'); - civicrm_source($dsn, $sqlPath . DIRECTORY_SEPARATOR . 'civicrm_acl.mysql'); - } - } - - // generate backend settings file - if ($installType == 'drupal') { - $configFile = $cmsPath . DIRECTORY_SEPARATOR . 'sites' . DIRECTORY_SEPARATOR . $siteDir . DIRECTORY_SEPARATOR . 'civicrm.settings.php'; - } - elseif ($installType == 'backdrop') { - $configFile = $cmsPath . DIRECTORY_SEPARATOR . 'civicrm.settings.php'; - } - elseif ($installType == 'wordpress') { - $configFile = $files_dirname . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR . 'civicrm.settings.php'; - } - - $string = civicrm_config($config); - civicrm_write_file($configFile, - $string - ); -} - -/** - * @param $dsn - * @param string $fileName - * @param bool $lineMode - */ -function civicrm_source($dsn, $fileName, $lineMode = FALSE) { - global $crmPath; - - // CRM-19699 See also CRM_Core_DAO for PHP7 mysqli compatiblity. - // Duplicated here because this is not using CRM_Core_DAO directly - // and this function may be called directly from Drush. - if (!defined('DB_DSN_MODE')) { - define('DB_DSN_MODE', 'auto'); - } - - $db = DB::connect($dsn); - if (PEAR::isError($db)) { - die("Cannot open $dsn: " . $db->getMessage()); - } - $db->query('SET NAMES utf8mb4'); - - if (!$lineMode) { - $string = file_get_contents($fileName); - - // change \r\n to fix windows issues - $string = str_replace("\r\n", "\n", $string); - - //get rid of comments starting with # and -- - - $string = preg_replace("/^#[^\n]*$/m", "\n", $string); - $string = preg_replace("/^(--[^-]).*/m", "\n", $string); - - $queries = preg_split('/;\s*$/m', $string); - foreach ($queries as $query) { - $query = trim($query); - if (!empty($query)) { - $res = &$db->query($query); - if (PEAR::isError($res)) { - print_r($res); - die("Cannot execute $query: " . $res->getMessage()); - } - } - } - } - else { - $fd = fopen($fileName, "r"); - while ($string = fgets($fd)) { - $string = preg_replace("/^#[^\n]*$/m", "\n", $string); - $string = preg_replace("/^(--[^-]).*/m", "\n", $string); - - $string = trim($string); - if (!empty($string)) { - $res = &$db->query($string); - if (PEAR::isError($res)) { - die("Cannot execute $string: " . $res->getMessage()); - } - } - } - } -} - -/** - * @param $config - * - * @return string - */ -function civicrm_config(&$config) { - global $crmPath, $comPath; - global $compileDir; - global $tplPath, $installType; - - // Ex: $extraSettings[] = '$civicrm_settings["domain"]["foo"] = "bar";'; - $extraSettings = []; - - $params = [ - 'crmRoot' => $crmPath, - 'templateCompileDir' => $compileDir, - 'frontEnd' => 0, - 'dbUser' => addslashes($config['mysql']['username']), - 'dbPass' => addslashes($config['mysql']['password']), - 'dbHost' => $config['mysql']['server'], - 'dbName' => addslashes($config['mysql']['database']), - // These need to be filled manually when using the old installer if an - // SSL connection to MySQL is needed. - 'dbSSL' => '', - 'CMSdbSSL' => '', - ]; - - $params['baseURL'] = $config['base_url'] ?? civicrm_cms_base(); - if ($installType == 'drupal' && defined('VERSION')) { - if (version_compare(VERSION, '8.0') >= 0) { - $params['cms'] = 'Drupal'; - $params['CMSdbUser'] = addslashes($config['drupal']['username']); - $params['CMSdbPass'] = addslashes($config['drupal']['password']); - $params['CMSdbHost'] = $config['drupal']['host'] . ":" . !empty($config['drupal']['port']) ? $config['drupal']['port'] : "3306"; - $params['CMSdbName'] = addslashes($config['drupal']['database']); - } - elseif (version_compare(VERSION, '7.0-rc1') >= 0) { - $params['cms'] = 'Drupal'; - $params['CMSdbUser'] = addslashes($config['drupal']['username']); - $params['CMSdbPass'] = addslashes($config['drupal']['password']); - $params['CMSdbHost'] = $config['drupal']['server']; - $params['CMSdbName'] = addslashes($config['drupal']['database']); - } - } - elseif ($installType == 'drupal') { - $params['cms'] = $config['cms']; - $params['CMSdbUser'] = addslashes($config['cmsdb']['username']); - $params['CMSdbPass'] = addslashes($config['cmsdb']['password']); - $params['CMSdbHost'] = $config['cmsdb']['server']; - $params['CMSdbName'] = addslashes($config['cmsdb']['database']); - } - elseif ($installType == 'backdrop') { - $params['cms'] = 'Backdrop'; - $params['CMSdbUser'] = addslashes($config['backdrop']['username']); - $params['CMSdbPass'] = addslashes($config['backdrop']['password']); - $params['CMSdbHost'] = $config['backdrop']['server']; - $params['CMSdbName'] = addslashes($config['backdrop']['database']); - } - else { - $params['cms'] = 'WordPress'; - $params['CMSdbUser'] = addslashes(DB_USER); - $params['CMSdbPass'] = addslashes(DB_PASSWORD); - $params['CMSdbHost'] = DB_HOST; - $params['CMSdbName'] = addslashes(DB_NAME); - - // CRM-12386 - $params['crmRoot'] = addslashes($params['crmRoot']); - //CRM-16421 - - $extraSettings[] = sprintf('$civicrm_paths[\'wp.frontend.base\'][\'url\'] = %s;', var_export(home_url() . '/', 1)); - $extraSettings[] = sprintf('$civicrm_paths[\'wp.backend.base\'][\'url\'] = %s;', var_export(admin_url(), 1)); - $extraSettings[] = sprintf('$civicrm_setting[\'URL Preferences\'][\'userFrameworkResourceURL\'] = %s;', var_export(plugin_dir_url(CIVICRM_PLUGIN_FILE) . 'civicrm', 1)); - } - - if ($extraSettings) { - $params['extraSettings'] = "Additional settings generated by installer:\n" . implode("\n", $extraSettings); - } - else { - $params['extraSettings'] = ""; - } - - $params['siteKey'] = md5(rand() . mt_rand() . rand() . uniqid('', TRUE) . $params['baseURL']); - // Would prefer openssl_random_pseudo_bytes(), but I don't think it's universally available. - - $str = file_get_contents($tplPath . 'civicrm.settings.php.template'); - foreach ($params as $key => $value) { - $str = str_replace('%%' . $key . '%%', $value, $str); - } - return trim($str); -} - -/** - * @return string - */ -function civicrm_cms_base() { - global $installType; - - // for drupal - $numPrevious = 6; - - if (isset($_SERVER['HTTPS']) && - !empty($_SERVER['HTTPS']) && - strtolower($_SERVER['HTTPS']) != 'off' - ) { - $url = 'https://' . $_SERVER['HTTP_HOST']; - } - else { - $url = 'http://' . $_SERVER['HTTP_HOST']; - } - - $baseURL = $_SERVER['SCRIPT_NAME']; - - if ($installType == 'drupal' || $installType == 'backdrop') { - //don't assume 6 dir levels, as civicrm - //may or may not be in sites/all/modules/ - //lets allow to install in custom dir. CRM-6840 - global $cmsPath; - $crmDirLevels = str_replace($cmsPath, '', str_replace('\\', '/', $_SERVER['SCRIPT_FILENAME'])); - $baseURL = str_replace($crmDirLevels, '', str_replace('\\', '/', $baseURL)); - } - elseif ($installType == 'wordpress') { - $baseURL = str_replace($url, '', site_url()); - } - else { - for ($i = 1; $i <= $numPrevious; $i++) { - $baseURL = dirname($baseURL); - } - } - - // remove the last directory separator string from the directory - if (substr($baseURL, -1, 1) == DIRECTORY_SEPARATOR) { - $baseURL = substr($baseURL, 0, -1); - } - - // also convert all DIRECTORY_SEPARATOR to the forward slash for windoze - $baseURL = str_replace(DIRECTORY_SEPARATOR, '/', $baseURL); - - if ($baseURL != '/') { - $baseURL .= '/'; - } - - return $url . $baseURL; -} - -/** - * @return string - */ -function civicrm_home_url() { - $drupalURL = civicrm_cms_base(); - return $drupalURL . 'index.php?q=civicrm'; -} diff --git a/install/error.html b/install/error.html deleted file mode 100644 index 568bb4b0c9b7..000000000000 --- a/install/error.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - <?php echo $errorTitle ?> - - /> - - - -
-

- - - -
- - diff --git a/install/index.php b/install/index.php deleted file mode 100644 index aa14a8e5fb8c..000000000000 --- a/install/index.php +++ /dev/null @@ -1,1981 +0,0 @@ -=')) { - errorDisplayPage('PHP Version Requirement', sprintf("CiviCRM requires PHP %s+. The web server is running PHP %s.", $minPhpVer, phpversion()), FALSE); - } -} - -$pkgPath = $crmPath . DIRECTORY_SEPARATOR . 'packages'; - -require_once $crmPath . '/CRM/Core/ClassLoader.php'; -CRM_Core_ClassLoader::singleton()->register(); - -$loadGenerated = 0; -if (isset($_POST['loadGenerated'])) { - $loadGenerated = 1; -} - -require_once dirname(__FILE__) . CIVICRM_DIRECTORY_SEPARATOR . 'langs.php'; -foreach ($langs as $locale => $_) { - if ($locale == 'en_US') { - continue; - } - if (!file_exists(implode(CIVICRM_DIRECTORY_SEPARATOR, [$crmPath, 'sql', "civicrm_data.$locale.mysql"]))) { - unset($langs[$locale]); - } -} - -// Set the CMS -// This is mostly sympbolic, since nothing we do during the install -// really requires CIVICRM_UF to be defined. -$installTypeToUF = [ - 'wordpress' => 'WordPress', - 'drupal' => 'Drupal', - 'backdrop' => 'Backdrop', -]; - -$uf = ($installTypeToUF[$installType] ?? 'Drupal'); -define('CIVICRM_UF', $uf); - -// Set the Locale (required by CRM_Core_Config) -global $tsLocale; - -$tsLocale = 'en_US'; -$seedLanguage = 'en_US'; - -// Backwards compatibility with default location of l10n files -if (!defined('CIVICRM_L10N_BASEDIR') && file_exists($crmPath . DIRECTORY_SEPARATOR . 'l10n')) { - define('CIVICRM_L10N_BASEDIR', $crmPath . DIRECTORY_SEPARATOR . 'l10n'); -} - -// CRM-16801 This validates that seedLanguage is valid by looking in $langs. -// NB: the variable is initial a $_REQUEST for the initial page reload, -// then becomes a $_POST when the installation form is submitted. -if (isset($_REQUEST['seedLanguage']) and isset($langs[$_REQUEST['seedLanguage']])) { - $seedLanguage = $_REQUEST['seedLanguage']; - $tsLocale = $_REQUEST['seedLanguage']; -} - -CRM_Core_Config::singleton(FALSE); -$GLOBALS['civicrm_default_error_scope'] = NULL; - -// The translation files are in the parent directory (l10n) -$i18n = CRM_Core_I18n::singleton(); - -// Support for Arabic, Hebrew, Farsi, etc. -// Used in the template.html -$short_lang_code = CRM_Core_I18n_PseudoConstant::shortForLong($tsLocale); -$text_direction = (CRM_Core_I18n::isLanguageRTL($tsLocale) ? 'rtl' : 'ltr'); - -global $cmsPath; -if ($installType == 'drupal') { - //CRM-6840 -don't force to install in sites/all/modules/ - $object = new CRM_Utils_System_Drupal(); - $cmsPath = $object->cmsRootPath(); - - $siteDir = getSiteDir($cmsPath, $_SERVER['SCRIPT_FILENAME']); - $alreadyInstalled = file_exists($cmsPath . CIVICRM_DIRECTORY_SEPARATOR . - 'sites' . CIVICRM_DIRECTORY_SEPARATOR . - $siteDir . CIVICRM_DIRECTORY_SEPARATOR . - 'civicrm.settings.php' - ); -} -elseif ($installType == 'backdrop') { - $object = new CRM_Utils_System_Backdrop(); - $cmsPath = $object->cmsRootPath(); - $siteDir = getSiteDir($cmsPath, $_SERVER['SCRIPT_FILENAME']); - $alreadyInstalled = file_exists($cmsPath . CIVICRM_DIRECTORY_SEPARATOR . 'civicrm.settings.php'); -} -elseif ($installType == 'wordpress') { - $cmsPath = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . 'civicrm'; - $upload_dir = wp_upload_dir(); - $files_dirname = $upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'civicrm'; - $wp_civi_settings = $upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR . 'civicrm.settings.php'; - $wp_civi_settings_deprectated = CIVICRM_PLUGIN_DIR . 'civicrm.settings.php'; - if (file_exists($wp_civi_settings_deprectated)) { - $alreadyInstalled = $wp_civi_settings_deprectated; - } - elseif (file_exists($wp_civi_settings)) { - $alreadyInstalled = $wp_civi_settings; - } -} - -if ($installType == 'drupal') { - // Lets check only /modules/. - $pattern = '/' . preg_quote(CIVICRM_DIRECTORY_SEPARATOR . 'modules', CIVICRM_DIRECTORY_SEPARATOR) . '/'; - - if (!preg_match($pattern, str_replace("\\", "/", $_SERVER['SCRIPT_FILENAME']))) { - $directory = implode(CIVICRM_DIRECTORY_SEPARATOR, ['sites', 'all', 'modules']); - $errorTitle = ts("Oops! Please correct your install location"); - $errorMsg = ts("Please untar (uncompress) your downloaded copy of CiviCRM in the %1 directory below your Drupal root directory.", [1 => $directory]); - errorDisplayPage($errorTitle, $errorMsg); - } -} - -if ($installType == 'backdrop') { - // Lets check only /modules/. - $pattern = '/' . preg_quote(CIVICRM_DIRECTORY_SEPARATOR . 'modules', CIVICRM_DIRECTORY_SEPARATOR) . '/'; - - if (!preg_match($pattern, str_replace("\\", "/", $_SERVER['SCRIPT_FILENAME']))) { - $directory = 'modules'; - $errorTitle = ts("Oops! Please correct your install location"); - $errorMsg = ts("Please untar (uncompress) your downloaded copy of CiviCRM in the %1 directory below your Drupal root directory.", [1 => $directory]); - errorDisplayPage($errorTitle, $errorMsg); - } -} - -// Exit with error if CiviCRM has already been installed. -if ($alreadyInstalled) { - $errorTitle = ts("Oops! CiviCRM is already installed"); - $settings_directory = $cmsPath; - - if ($installType == 'drupal') { - $settings_directory = implode(CIVICRM_DIRECTORY_SEPARATOR, [ - ts('[your Drupal root directory]'), - 'sites', - $siteDir, - ]); - } - if ($installType == 'backdrop') { - $settings_directory = implode(CIVICRM_DIRECTORY_SEPARATOR, [ - ts('[your Backdrop root directory]'), - $siteDir, - ]); - } - - $docLink = CRM_Utils_System::docURL2('Installation and Upgrades', FALSE, ts('Installation Guide'), NULL, NULL, "wiki"); - $errorMsg = ts("CiviCRM has already been installed. ", [1 => $settings_directory, 2 => $docLink]); - errorDisplayPage($errorTitle, $errorMsg, FALSE); -} - -$versionFile = $crmPath . CIVICRM_DIRECTORY_SEPARATOR . 'civicrm-version.php'; -if (file_exists($versionFile)) { - require_once $versionFile; - $civicrm_version = civicrmVersion(); -} -else { - $civicrm_version = 'unknown'; -} - -if ($installType == 'drupal') { - // Ensure that they have downloaded the correct version of CiviCRM - if ($civicrm_version['cms'] != 'Drupal') { - $errorTitle = ts("Oops! Incorrect CiviCRM version"); - $errorMsg = ts("This installer can only be used for the Drupal version of CiviCRM."); - errorDisplayPage($errorTitle, $errorMsg); - } - - define('DRUPAL_ROOT', $cmsPath); - $drupalVersionFiles = [ - // D6 - implode(CIVICRM_DIRECTORY_SEPARATOR, [$cmsPath, 'modules', 'system', 'system.module']), - // D7 - implode(CIVICRM_DIRECTORY_SEPARATOR, [$cmsPath, 'includes', 'bootstrap.inc']), - ]; - foreach ($drupalVersionFiles as $drupalVersionFile) { - if (file_exists($drupalVersionFile)) { - require_once $drupalVersionFile; - } - } - - // Bootstrap Drupal to get settings and user - $base_root = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; - $base_root .= '://' . $_SERVER['HTTP_HOST']; - $base_url = $base_root; - drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); - - // Check that user is logged in and has administrative permissions - // This is necessary because the script exposes the database settings in the form and these could be viewed by unauthorised users - if ((!function_exists('user_access')) || (!user_access('administer site configuration'))) { - $errorTitle = ts("You don't have permission to access this page"); - $errorMsg = ts("The installer can only be run by a user with the permission to administer site configuration."); - errorDisplayPage($errorTitle, $errorMsg); - exit(); - } - - if (!defined('VERSION') or version_compare(VERSION, '6.0') < 0) { - $errorTitle = ts("Oops! Incorrect Drupal version"); - $errorMsg = ts("This version of CiviCRM can only be used with Drupal 6.x or 7.x. Please ensure that '%1' exists if you are running Drupal 7.0 and over.", [1 => implode("' or '", $drupalVersionFiles)]); - errorDisplayPage($errorTitle, $errorMsg); - } -} -elseif ($installType == 'backdrop') { - // Ensure that they have downloaded the correct version of CiviCRM - if ($civicrm_version['cms'] != 'Backdrop') { - $errorTitle = ts("Oops! Incorrect CiviCRM version"); - $errorMsg = ts("This installer can only be used for the Backdrop version of CiviCRM."); - errorDisplayPage($errorTitle, $errorMsg); - } - - define('BACKDROP_ROOT', $cmsPath); - - $backdropVersionFiles = [ - // Backdrop - implode(CIVICRM_DIRECTORY_SEPARATOR, [$cmsPath, 'core', 'includes', 'bootstrap.inc']), - ]; - foreach ($backdropVersionFiles as $backdropVersionFile) { - if (file_exists($backdropVersionFile)) { - require_once $backdropVersionFile; - } - } - if (!defined('BACKDROP_VERSION') or version_compare(BACKDROP_VERSION, '1.0') < 0) { - $errorTitle = ts("Oops! Incorrect Backdrop version"); - $errorMsg = ts("This version of CiviCRM can only be used with Backdrop 1.x. Please ensure that '%1' exists if you are running Backdrop 1.0 and over.", [1 => implode("' or '", $backdropVersionFiles)]); - errorDisplayPage($errorTitle, $errorMsg); - } -} -elseif ($installType == 'wordpress') { - //HACK for now - $civicrm_version['cms'] = 'WordPress'; - - // Ensure that they have downloaded the correct version of CiviCRM - if ($civicrm_version['cms'] != 'WordPress') { - $errorTitle = ts("Oops! Incorrect CiviCRM version"); - $errorMsg = ts("This installer can only be used for the WordPress version of CiviCRM."); - errorDisplayPage($errorTitle, $errorMsg); - } -} - -// Load CiviCRM database config -if (isset($_POST['mysql'])) { - $databaseConfig = $_POST['mysql']; -} - -if ($installType == 'wordpress') { - // Load WP database config - if (isset($_POST['mysql'])) { - $databaseConfig = $_POST['mysql']; - } - else { - $databaseConfig = [ - "server" => DB_HOST, - "username" => DB_USER, - "password" => DB_PASSWORD, - "database" => DB_NAME, - ]; - } -} - -if ($installType == 'drupal') { - // Load drupal database config - if (isset($_POST['drupal'])) { - $drupalConfig = $_POST['drupal']; - } - else { - $dbServer = $databases['default']['default']['host']; - if (!empty($databases['default']['default']['port'])) { - $dbServer .= ':' . $databases['default']['default']['port']; - } - $drupalConfig = [ - "server" => $dbServer, - "username" => $databases['default']['default']['username'], - "password" => $databases['default']['default']['password'], - "database" => $databases['default']['default']['database'], - ]; - } -} - -if ($installType == 'backdrop') { - // Load backdrop database config - if (isset($_POST['backdrop'])) { - $backdropConfig = $_POST['backdrop']; - } - else { - $backdropConfig = [ - "server" => "localhost", - "username" => "backdrop", - "password" => "", - "database" => "backdrop", - ]; - } -} - -// By default set CiviCRM database to be same as CMS database -if (!isset($databaseConfig)) { - if (($installType == 'drupal') && (isset($drupalConfig))) { - $databaseConfig = $drupalConfig; - } - if (($installType == 'backdrop') && (isset($backdropConfig))) { - $databaseConfig = $backdropConfig; - } -} - -// Check requirements -$req = new InstallRequirements(); -$req->check(); - -if ($req->hasErrors()) { - $hasErrorOtherThanDatabase = TRUE; -} - -if ($databaseConfig) { - $dbReq = new InstallRequirements(); - $dbReq->checkdatabase($databaseConfig, 'CiviCRM'); - if ($installType == 'drupal') { - $dbReq->checkdatabase($drupalConfig, 'Drupal'); - } - if ($installType == 'backdrop') { - $dbReq->checkdatabase($backdropConfig, 'Backdrop'); - } -} - -// Actual processor -if (isset($_POST['go']) && !$req->hasErrors() && !$dbReq->hasErrors()) { - // Confirm before reinstalling - if (!isset($_POST['force_reinstall']) && $alreadyInstalled) { - include $installDirPath . 'template.html'; - } - else { - $inst = new Installer(); - $inst->install($_POST); - } - - // Show the config form -} -else { - include $installDirPath . 'template.html'; -} - -/** - * This class checks requirements - * Each of the requireXXX functions takes an argument which gives a user description of the test. It's an array - * of 3 parts: - * $description[0] - The test category - * $description[1] - The test title - * $description[2] - The test error to show, if it goes wrong - */ -class InstallRequirements { - public $errors; - public $warnings; - public $tests; - public $conn; - - // @see CRM_Upgrade_Form::MINIMUM_THREAD_STACK - const MINIMUM_THREAD_STACK = 192; - - /** - * Just check that the database configuration is okay. - * @param $databaseConfig - * @param $dbName - */ - public function checkdatabase($databaseConfig, $dbName) { - if ($this->requireFunction('mysqli_connect', - [ - ts("PHP Configuration"), - ts("MySQL support"), - ts("MySQL support not included in PHP."), - ] - ) - ) { - $this->requireMySQLServer($databaseConfig['server'], - [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts("Does the server exist?"), - ts("Can't find the a MySQL server on '%1'.", [1 => $databaseConfig['server']]), - $databaseConfig['server'], - ] - ); - if ($this->requireMysqlConnection($databaseConfig['server'], - $databaseConfig['username'], - $databaseConfig['password'], - [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts("Are the access credentials correct?"), - ts("That username/password doesn't work"), - ] - ) - ) { - @$this->requireMySQLVersion(CRM_Upgrade_Incremental_General::MIN_INSTALL_MYSQL_VER, - [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts("MySQL version at least %1", [1 => CRM_Upgrade_Incremental_General::MIN_INSTALL_MYSQL_VER]), - ts("MySQL version %1 or higher is required, you are running MySQL %2.", [1 => CRM_Upgrade_Incremental_General::MIN_INSTALL_MYSQL_VER, 2 => mysqli_get_server_info($this->conn)]), - ts("MySQL %1", [1 => mysqli_get_server_info($this->conn)]), - ] - ); - $this->requireMySQLAutoIncrementIncrementOne($databaseConfig['server'], - $databaseConfig['username'], - $databaseConfig['password'], - [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts("Is auto_increment_increment set to 1"), - ts("An auto_increment_increment value greater than 1 is not currently supported. Please see issue CRM-7923 for further details and potential workaround."), - ] - ); - $testDetails = [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts("Is the provided database name valid?"), - ts("The database name provided is not valid. Please use only 0-9, a-z, A-Z, _ and - as characters in the name."), - ]; - if (!CRM_Core_DAO::requireSafeDBName($databaseConfig['database'])) { - $this->error($testDetails); - return FALSE; - } - else { - $this->testing($testDetails); - } - $this->requireMySQLThreadStack($databaseConfig['server'], - $databaseConfig['username'], - $databaseConfig['password'], - $databaseConfig['database'], - self::MINIMUM_THREAD_STACK, - [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts("Does MySQL thread_stack meet minimum (%1k)", [1 => self::MINIMUM_THREAD_STACK]), - "", - // "The MySQL thread_stack does not meet minimum " . CRM_Upgrade_Form::MINIMUM_THREAD_STACK . "k. Please update thread_stack in my.cnf.", - ] - ); - } - $onlyRequire = $dbName == 'Drupal' || $dbName == 'Backdrop'; - $this->requireDatabaseOrCreatePermissions( - $databaseConfig['server'], - $databaseConfig['username'], - $databaseConfig['password'], - $databaseConfig['database'], - [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts("Can I access/create the database?"), - ts("I can't create new databases and the database '%1' doesn't exist.", [1 => $databaseConfig['database']]), - ], - $onlyRequire - ); - if ($dbName != 'Drupal' && $dbName != 'Backdrop') { - $this->requireNoExistingData( - $databaseConfig['server'], - $databaseConfig['username'], - $databaseConfig['password'], - $databaseConfig['database'], - [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts("Does the database have data from a previous installation?"), - ts("CiviCRM data from previous installation exists in '%1'.", [1 => $databaseConfig['database']]), - ] - ); - $this->requireMySQLInnoDB($databaseConfig['server'], - $databaseConfig['username'], - $databaseConfig['password'], - $databaseConfig['database'], - [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts("Can I access/create InnoDB tables in the database?"), - ts("Unable to create InnoDB tables. MySQL InnoDB support is required for CiviCRM but is either not available or not enabled in this MySQL database server."), - ] - ); - $this->requireMySQLTempTables($databaseConfig['server'], - $databaseConfig['username'], - $databaseConfig['password'], - $databaseConfig['database'], - [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts('Can I create temporary tables in the database?'), - ts('Unable to create temporary tables. This MySQL user is missing the CREATE TEMPORARY TABLES privilege.'), - ] - ); - $this->requireMySQLLockTables($databaseConfig['server'], - $databaseConfig['username'], - $databaseConfig['password'], - $databaseConfig['database'], - [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts('Can I create lock tables in the database?'), - ts('Unable to lock tables. This MySQL user is missing the LOCK TABLES privilege.'), - ] - ); - $this->requireMySQLTrigger($databaseConfig['server'], - $databaseConfig['username'], - $databaseConfig['password'], - $databaseConfig['database'], - [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts('Can I create triggers in the database?'), - ts('Unable to create triggers. This MySQL user is missing the CREATE TRIGGERS privilege.'), - ] - ); - $this->requireMySQLUtf8mb4($databaseConfig['server'], - $databaseConfig['username'], - $databaseConfig['password'], - $databaseConfig['database'], - [ - ts("MySQL %1 Configuration", [1 => $dbName]), - ts('Is the utf8mb4 character set supported?'), - ts('This MySQL server does not support the utf8mb4 character set.'), - ] - ); - } - } - } - - /** - * Connect via mysqli. - * - * This is exactly the same as mysqli_connect(), except that it accepts - * the port as part of the `$host`. - * - * @param string $host - * Ex: 'localhost', 'localhost:3307', '127.0.0.1:3307', '[::1]', '[::1]:3307'. - * @param string $username - * @param string $password - * @param string $database - * @return \mysqli - */ - protected function connect($host, $username, $password, $database = '') { - $hostParts = explode(':', $host); - if (count($hostParts) > 1 && strrpos($host, ']') !== strlen($host) - 1) { - $port = array_pop($hostParts); - $host = implode(':', $hostParts); - } - else { - $port = NULL; - } - $conn = @mysqli_connect($host, $username, $password, $database, $port); - return $conn; - } - - /** - * Check everything except the database. - */ - public function check() { - global $crmPath, $installType; - - $this->errors = NULL; - - $this->requirePHPVersion([ - ts("PHP Configuration"), - ts("PHP7 installed"), - ]); - - // Check that we can identify the root folder successfully - $this->requireFile($crmPath . CIVICRM_DIRECTORY_SEPARATOR . 'README.md', - [ - ts("File permissions"), - ts("Does the webserver know where files are stored?"), - ts("The webserver isn't letting me identify where files are stored."), - $this->getBaseDir(), - ], - TRUE - ); - - // CRM-6485: make sure the path does not contain PATH_SEPARATOR, as we don’t know how to escape it - $this->requireNoPathSeparator( - [ - ts("File permissions"), - ts('Does the CiviCRM path contain PATH_SEPARATOR?'), - ts('The path %1 contains PATH_SEPARATOR (the %2 character).', [1 => $this->getBaseDir(), 2 => PATH_SEPARATOR]), - $this->getBaseDir(), - ] - ); - - $requiredDirectories = ['CRM', 'packages', 'templates', 'js', 'api', 'i', 'sql']; - foreach ($requiredDirectories as $dir) { - $this->requireFile($crmPath . CIVICRM_DIRECTORY_SEPARATOR . $dir, - [ - ts("File permissions"), - ts("Folder '%1' exists?", [1 => $dir]), - ts("There is no '%1' folder.", [1 => $dir]), - ], TRUE - ); - } - - $configIDSiniDir = NULL; - global $cmsPath; - $siteDir = getSiteDir($cmsPath, $_SERVER['SCRIPT_FILENAME']); - if ($installType == 'drupal') { - - // make sure that we can write to sites/default and files/ - $writableDirectories = [ - $cmsPath . CIVICRM_DIRECTORY_SEPARATOR . - 'sites' . CIVICRM_DIRECTORY_SEPARATOR . - $siteDir . CIVICRM_DIRECTORY_SEPARATOR . - 'files', - $cmsPath . CIVICRM_DIRECTORY_SEPARATOR . - 'sites' . CIVICRM_DIRECTORY_SEPARATOR . - $siteDir, - ]; - } - elseif ($installType == 'backdrop') { - - // make sure that we can write to sites/default and files/ - $writableDirectories = [ - $cmsPath . CIVICRM_DIRECTORY_SEPARATOR . - 'files', - $cmsPath, - ]; - } - elseif ($installType == 'wordpress') { - // make sure that we can write to uploads/civicrm/ - $upload_dir = wp_upload_dir(); - $files_dirname = $upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'civicrm'; - if (!file_exists($files_dirname)) { - wp_mkdir_p($files_dirname); - } - $writableDirectories = [$files_dirname]; - } - - foreach ($writableDirectories as $dir) { - $dirName = CIVICRM_WINDOWS ? $dir : CIVICRM_DIRECTORY_SEPARATOR . $dir; - $testDetails = [ - ts("File permissions"), - ts("Is the %1 folder writeable?", [1 => $dir]), - NULL, - ]; - $this->requireWriteable($dirName, $testDetails, TRUE); - } - - // Check for rewriting - if (isset($_SERVER['SERVER_SOFTWARE'])) { - $webserver = strip_tags(trim($_SERVER['SERVER_SOFTWARE'])); - } - elseif (isset($_SERVER['SERVER_SIGNATURE'])) { - $webserver = strip_tags(trim($_SERVER['SERVER_SIGNATURE'])); - } - - if ($webserver == '') { - $webserver = ts("I can't tell what webserver you are running"); - } - - // Check for $_SERVER configuration - $this->requireServerVariables(['SCRIPT_NAME', 'HTTP_HOST', 'SCRIPT_FILENAME'], [ - ts("Webserver config"), - ts("Recognised webserver"), - ts("You seem to be using an unsupported webserver. The server variables SCRIPT_NAME, HTTP_HOST, SCRIPT_FILENAME need to be set."), - ]); - - // Check for MySQL support - $this->requireFunction('mysqli_connect', [ - ts("PHP Configuration"), - ts("MySQL support"), - ts("MySQL support not included in PHP."), - ]); - - // Check for XML support - $this->requireFunction('simplexml_load_file', [ - ts("PHP Configuration"), - ts("SimpleXML support"), - ts("SimpleXML support not included in PHP."), - ]); - - // Check for JSON support - $this->requireFunction('json_encode', [ - ts("PHP Configuration"), - ts("JSON support"), - ts("JSON support not included in PHP."), - ]); - - // check for Multibyte support such as mb_substr. Required for proper handling of Multilingual setups. - $this->requireFunction('mb_substr', [ - ts("PHP Configuration"), - ts("Multibyte support"), - ts("Multibyte support not enabled in PHP."), - ]); - - // Check for xcache_isset and emit warning if exists - $this->checkXCache([ - ts("PHP Configuration"), - ts("XCache compatibility"), - ts("XCache is installed and there are known compatibility issues between XCache and CiviCRM. Consider using an alternative PHP caching mechanism or disable PHP caching altogether."), - ]); - - // Check memory allocation - $this->requireMemory(32 * 1024 * 1024, - 64 * 1024 * 1024, - [ - ts("PHP Configuration"), - ts("Memory allocated (PHP config option 'memory_limit')"), - ts("CiviCRM needs a minimum of %1 MB allocated to PHP, but recommends %2 MB.", [1 => 32, 2 => 64]), - ini_get("memory_limit"), - ] - ); - - return $this->errors; - } - - /** - * @param $min - * @param $recommended - * @param $testDetails - */ - public function requireMemory($min, $recommended, $testDetails) { - $this->testing($testDetails); - $mem = $this->getPHPMemory(); - - if ($mem < $min && $mem > 0) { - $testDetails[2] .= " " . ts("You only have %1 allocated", [1 => ini_get("memory_limit")]); - $this->error($testDetails); - } - elseif ($mem < $recommended && $mem > 0) { - $testDetails[2] .= " " . ts("You only have %1 allocated", [1 => ini_get("memory_limit")]); - $this->warning($testDetails); - } - elseif ($mem == 0) { - $testDetails[2] .= " " . ts("We can't determine how much memory you have allocated. Install only if you're sure you've allocated at least %1 MB.", [1 => 32]); - $this->warning($testDetails); - } - } - - /** - * @return float - */ - public function getPHPMemory() { - $memString = ini_get("memory_limit"); - - switch (strtolower(substr($memString, -1))) { - case "k": - return round(substr($memString, 0, -1) * 1024); - - case "m": - return round(substr($memString, 0, -1) * 1024 * 1024); - - case "g": - return round(substr($memString, 0, -1) * 1024 * 1024 * 1024); - - default: - return round($memString); - } - } - - public function listErrors() { - if ($this->errors) { - echo "

" . ts("The following problems are preventing me from installing CiviCRM:") . "

"; - foreach ($this->errors as $error) { - echo "
  • " . htmlentities($error) . "
  • "; - } - } - } - - /** - * @param string|null $section - */ - public function showTable($section = NULL) { - if ($section) { - $tests = $this->tests[$section]; - echo ""; - foreach ($tests as $test => $result) { - echo ""; - } - echo "
    $test" . nl2br(htmlentities($result[1])) . "
    "; - } - else { - foreach ($this->tests as $section => $tests) { - echo "

    $section

    "; - echo ""; - - foreach ($tests as $test => $result) { - echo ""; - } - echo "
    $test" . nl2br(htmlentities($result[1])) . "
    "; - } - } - } - - /** - * @param string $funcName - * @param $testDetails - * - * @return bool - */ - public function requireFunction($funcName, $testDetails) { - $this->testing($testDetails); - - if (!function_exists($funcName)) { - $this->error($testDetails); - return FALSE; - } - else { - return TRUE; - } - } - - /** - * @param $testDetails - */ - public function checkXCache($testDetails) { - if (function_exists('xcache_isset') && - ini_get('xcache.size') > 0 - ) { - $this->testing($testDetails); - $this->warning($testDetails); - } - } - - /** - * @param array $testDetails - * @return bool - */ - public function requirePHPVersion($testDetails) { - - $this->testing($testDetails); - - $phpVersion = phpversion(); - $aboveMinVersion = version_compare($phpVersion, CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER) >= 0; - - if ($aboveMinVersion) { - if (version_compare($phpVersion, CRM_Upgrade_Incremental_General::MIN_RECOMMENDED_PHP_VER) < 0) { - $testDetails[2] = ts('This webserver is running an outdated version of PHP (%1). It is strongly recommended to upgrade to PHP %2 or later, as older versions can present a security risk. The preferred version is %3.', [ - 1 => $phpVersion, - 2 => CRM_Upgrade_Incremental_General::MIN_RECOMMENDED_PHP_VER, - 3 => preg_replace(';^(\d+\.\d+(?:\.[1-9]\d*)?).*$;', '\1', CRM_Upgrade_Incremental_General::RECOMMENDED_PHP_VER), - ]); - $this->warning($testDetails); - } - return TRUE; - } - - if (empty($testDetails[2])) { - $testDetails[2] = ts("You need PHP version %1 or later, only %2 is installed. Please upgrade your server, or ask your web-host to do so.", [1 => CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER, 2 => $phpVersion]); - } - - $this->error($testDetails); - } - - /** - * @param string $filename - * @param $testDetails - * @param bool $absolute - */ - public function requireFile($filename, $testDetails, $absolute = FALSE) { - $this->testing($testDetails); - if (!$absolute) { - $filename = $this->getBaseDir() . $filename; - } - if (!file_exists($filename)) { - $testDetails[2] .= " (" . ts("file '%1' not found", [1 => $filename]) . ')'; - $this->error($testDetails); - } - } - - /** - * @param $testDetails - */ - public function requireNoPathSeparator($testDetails) { - $this->testing($testDetails); - if (substr_count($this->getBaseDir(), PATH_SEPARATOR)) { - $this->error($testDetails); - } - } - - /** - * @param string $filename - * @param $testDetails - */ - public function requireNoFile($filename, $testDetails) { - $this->testing($testDetails); - $filename = $this->getBaseDir() . $filename; - if (file_exists($filename)) { - $testDetails[2] .= " (" . ts("file '%1' found", [1 => $filename]) . ")"; - $this->error($testDetails); - } - } - - /** - * @param string $filename - * @param $testDetails - */ - public function moveFileOutOfTheWay($filename, $testDetails) { - $this->testing($testDetails); - $filename = $this->getBaseDir() . $filename; - if (file_exists($filename)) { - if (file_exists("$filename.bak")) { - rm("$filename.bak"); - } - rename($filename, "$filename.bak"); - } - } - - /** - * @param string $filename - * @param $testDetails - * @param bool $absolute - */ - public function requireWriteable($filename, $testDetails, $absolute = FALSE) { - $this->testing($testDetails); - if (!$absolute) { - $filename = $this->getBaseDir() . $filename; - } - - if (!is_writable($filename)) { - $name = NULL; - if (function_exists('posix_getpwuid')) { - $user = posix_getpwuid(posix_geteuid()); - $name = '- ' . $user['name'] . ' -'; - } - - if (!isset($testDetails[2])) { - $testDetails[2] = NULL; - } - $testDetails[2] .= ts("The user account used by your web-server %1 needs to be granted write access to the following directory in order to configure the CiviCRM settings file:", [1 => $name]) . "\n$filename"; - $this->error($testDetails); - } - } - - /** - * @param string $moduleName - * @param $testDetails - */ - public function requireApacheModule($moduleName, $testDetails) { - $this->testing($testDetails); - if (!in_array($moduleName, apache_get_modules())) { - $this->error($testDetails); - } - } - - /** - * @param $server - * @param string $username - * @param $password - * @param $testDetails - */ - public function requireMysqlConnection($server, $username, $password, $testDetails) { - $this->testing($testDetails); - $this->conn = $this->connect($server, $username, $password); - - if ($this->conn) { - return TRUE; - } - else { - $testDetails[2] .= ": " . mysqli_connect_error(); - $this->error($testDetails); - } - } - - /** - * @param $server - * @param $testDetails - */ - public function requireMySQLServer($server, $testDetails) { - $this->testing($testDetails); - $conn = $this->connect($server, NULL, NULL); - - if ($conn || mysqli_connect_errno() < 2000) { - return TRUE; - } - else { - $testDetails[2] .= ": " . mysqli_connect_error(); - $this->error($testDetails); - } - } - - /** - * @param $version - * @param $testDetails - */ - public function requireMySQLVersion($version, $testDetails) { - $this->testing($testDetails); - - if (!mysqli_get_server_info($this->conn)) { - $testDetails[2] = ts('Cannot determine the version of MySQL installed. Please ensure at least version %1 is installed.', [1 => $version]); - $this->warning($testDetails); - } - else { - list($majorRequested, $minorRequested) = explode('.', $version); - list($majorHas, $minorHas) = explode('.', mysqli_get_server_info($this->conn)); - - if (($majorHas > $majorRequested) || ($majorHas == $majorRequested && $minorHas >= $minorRequested)) { - return TRUE; - } - else { - $versionDetails = mysqli_query($this->conn, 'SELECT version() as version')->fetch_assoc(); - if (version_compare($versionDetails['version'], $version) == -1) { - $testDetails[2] .= "{$majorHas}.{$minorHas}."; - $this->error($testDetails); - } - else { - return TRUE; - } - } - } - } - - /** - * @param $server - * @param string $username - * @param $password - * @param $database - * @param $testDetails - */ - public function requireMySQLInnoDB($server, $username, $password, $database, $testDetails) { - $this->testing($testDetails); - $conn = $this->connect($server, $username, $password); - if (!$conn) { - $testDetails[2] .= ' ' . ts("Could not determine if MySQL has InnoDB support. Assuming no."); - $this->error($testDetails); - return; - } - - $innodb_support = FALSE; - $result = mysqli_query($conn, "SHOW ENGINES"); - while ($values = mysqli_fetch_array($result)) { - if ($values['Engine'] == 'InnoDB') { - if (strtolower($values['Support']) == 'yes' || - strtolower($values['Support']) == 'default' - ) { - $innodb_support = TRUE; - } - } - } - if ($innodb_support) { - $testDetails[3] = ts('MySQL server does have InnoDB support'); - } - else { - $testDetails[2] .= ' ' . ts('Could not determine if MySQL has InnoDB support. Assuming no'); - } - } - - /** - * @param $server - * @param string $username - * @param $password - * @param $database - * @param $testDetails - */ - public function requireMySQLTempTables($server, $username, $password, $database, $testDetails) { - $this->testing($testDetails); - $conn = $this->connect($server, $username, $password); - if (!$conn) { - $testDetails[2] = ts('Could not login to the database.'); - $this->error($testDetails); - return; - } - - if (!@mysqli_select_db($conn, $database)) { - $testDetails[2] = ts('Could not select the database.'); - $this->error($testDetails); - return; - } - - $tempTableName = CRM_Utils_SQL_TempTable::build()->setCategory('install')->getName(); - $result = mysqli_query($conn, 'CREATE TEMPORARY TABLE ' . $tempTableName . ' (test text)'); - if (!$result) { - $testDetails[2] = ts('Could not create a temp table.'); - $this->error($testDetails); - } - $result = mysqli_query($conn, 'DROP TEMPORARY TABLE ' . $tempTableName); - } - - /** - * @param $server - * @param string $username - * @param $password - * @param $database - * @param $testDetails - */ - public function requireMySQLTrigger($server, $username, $password, $database, $testDetails) { - $this->testing($testDetails); - $conn = $this->connect($server, $username, $password); - if (!$conn) { - $testDetails[2] = ts('Could not login to the database.'); - $this->error($testDetails); - return; - } - - if (!@mysqli_select_db($conn, $database)) { - $testDetails[2] = ts('Could not select the database.'); - $this->error($testDetails); - return; - } - - $result = mysqli_query($conn, 'CREATE TABLE civicrm_install_temp_table_test (test text)'); - if (!$result) { - $testDetails[2] = ts('Could not create a table in the database.'); - $this->error($testDetails); - } - - $result = mysqli_query($conn, 'CREATE TRIGGER civicrm_install_temp_table_test_trigger BEFORE INSERT ON civicrm_install_temp_table_test FOR EACH ROW BEGIN END'); - if (!$result) { - mysqli_query($conn, 'DROP TABLE civicrm_install_temp_table_test'); - $testDetails[2] = ts('Could not create a database trigger.'); - $this->error($testDetails); - } - - mysqli_query($conn, 'DROP TRIGGER civicrm_install_temp_table_test_trigger'); - mysqli_query($conn, 'DROP TABLE civicrm_install_temp_table_test'); - } - - /** - * @param $server - * @param string $username - * @param $password - * @param $database - * @param $testDetails - */ - public function requireMySQLLockTables($server, $username, $password, $database, $testDetails) { - $this->testing($testDetails); - $conn = $this->connect($server, $username, $password); - if (!$conn) { - $testDetails[2] = ts('Could not connect to the database server.'); - $this->error($testDetails); - return; - } - - if (!@mysqli_select_db($conn, $database)) { - $testDetails[2] = ts('Could not select the database.'); - $this->error($testDetails); - return; - } - - $tempTableName = CRM_Utils_SQL_TempTable::build()->setCategory('install')->getName(); - $result = mysqli_query($conn, 'CREATE TEMPORARY TABLE ' . $tempTableName . ' (test text)'); - if (!$result) { - $testDetails[2] = ts('Could not create a table in the database.'); - $this->error($testDetails); - return; - } - - $result = mysqli_query($conn, 'LOCK TABLES ' . $tempTableName . ' WRITE'); - if (!$result) { - $testDetails[2] = ts('Could not obtain a write lock for the database table.'); - $this->error($testDetails); - $result = mysqli_query($conn, 'DROP TEMPORARY TABLE ' . $tempTableName); - return; - } - - $result = mysqli_query($conn, 'UNLOCK TABLES'); - if (!$result) { - $testDetails[2] = ts('Could not release the lock for the database table.'); - $this->error($testDetails); - $result = mysqli_query($conn, 'DROP TEMPORARY TABLE ' . $tempTableName); - return; - } - - $result = mysqli_query($conn, 'DROP TEMPORARY TABLE ' . $tempTableName); - } - - /** - * @param $server - * @param string $username - * @param $password - * @param $testDetails - */ - public function requireMySQLAutoIncrementIncrementOne($server, $username, $password, $testDetails) { - $this->testing($testDetails); - $conn = $this->connect($server, $username, $password); - if (!$conn) { - $testDetails[2] = ts('Could not connect to the database server.'); - $this->error($testDetails); - return; - } - - $result = mysqli_query($conn, "SHOW variables like 'auto_increment_increment'"); - if (!$result) { - $testDetails[2] = ts('Could not query database server variables.'); - $this->error($testDetails); - return; - } - else { - $values = mysqli_fetch_row($result); - if ($values[1] == 1) { - $testDetails[3] = ts('MySQL server auto_increment_increment is 1'); - } - else { - $this->error($testDetails); - } - } - } - - /** - * @param $server - * @param string $username - * @param $password - * @param $database - * @param $minValueKB - * @param $testDetails - */ - public function requireMySQLThreadStack($server, $username, $password, $database, $minValueKB, $testDetails) { - $this->testing($testDetails); - $conn = $this->connect($server, $username, $password); - if (!$conn) { - $testDetails[2] = ts('Could not connect to the database server.'); - $this->error($testDetails); - return; - } - - if (!@mysqli_select_db($conn, $database)) { - $testDetails[2] = ts('Could not select the database.'); - $this->error($testDetails); - return; - } - - // bytes => kb - $result = mysqli_query($conn, "SHOW VARIABLES LIKE 'thread_stack'"); - if (!$result) { - $testDetails[2] = ts('Could not get information about the thread_stack of the database.'); - $this->error($testDetails); - } - else { - $values = mysqli_fetch_row($result); - if ($values[1] < (1024 * $minValueKB)) { - $testDetails[2] = ts('MySQL "thread_stack" is %1 kb', [1 => ($values[1] / 1024)]); - $this->error($testDetails); - } - } - } - - /** - * @param $server - * @param $username - * @param $password - * @param $database - * @param $testDetails - */ - public function requireNoExistingData( - $server, - $username, - $password, - $database, - $testDetails - ) { - $this->testing($testDetails); - $conn = $this->connect($server, $username, $password); - - @mysqli_select_db($conn, $database); - $contactRecords = mysqli_query($conn, "SELECT count(*) as contactscount FROM civicrm_contact"); - if ($contactRecords) { - $contactRecords = mysqli_fetch_object($contactRecords); - if ($contactRecords->contactscount > 0) { - $this->error($testDetails); - return; - } - } - - $testDetails[3] = ts('CiviCRM data from previous installation does not exist in %1.', [1 => $database]); - $this->testing($testDetails); - } - - /** - * @param $server - * @param string $username - * @param $password - * @param $database - * @param $testDetails - * @param bool $onlyRequire - */ - public function requireDatabaseOrCreatePermissions( - $server, - $username, - $password, - $database, - $testDetails, - $onlyRequire = FALSE - ) { - $this->testing($testDetails); - $conn = $this->connect($server, $username, $password); - - $okay = NULL; - if (@mysqli_select_db($conn, $database)) { - $okay = "Database '$database' exists"; - } - elseif ($onlyRequire) { - $testDetails[2] = ts("The database: '%1' does not exist.", [1 => $database]); - $this->error($testDetails); - return; - } - else { - $query = sprintf("CREATE DATABASE %s", mysqli_real_escape_string($conn, $database)); - if (@mysqli_query($conn, $query)) { - $okay = ts("Able to create a new database."); - } - else { - $testDetails[2] .= " (" . ts("user '%1' doesn't have CREATE DATABASE permissions.", [1 => $username]) . ")"; - $this->error($testDetails); - return; - } - } - - if ($okay) { - $testDetails[3] = $okay; - $this->testing($testDetails); - } - } - - /** - * @param $varNames - * @param $errorMessage - */ - public function requireServerVariables($varNames, $errorMessage) { - //$this->testing($testDetails); - foreach ($varNames as $varName) { - if (!$_SERVER[$varName]) { - $missing[] = '$_SERVER[' . $varName . ']'; - } - } - if (!isset($missing)) { - return TRUE; - } - else { - $testDetails[2] = " (" . ts('the following PHP variables are missing: %1', [1 => implode(", ", $missing)]) . ")"; - $this->error($testDetails); - } - } - - /** - * @param $server - * @param string $username - * @param $password - * @param $database - * @param $testDetails - */ - public function requireMysqlUtf8mb4($server, $username, $password, $database, $testDetails) { - $this->testing($testDetails); - $conn = $this->connect($server, $username, $password); - if (!$conn) { - $testDetails[2] = ts('Could not connect to the database server.'); - $this->error($testDetails); - return; - } - - if (!@mysqli_select_db($conn, $database)) { - $testDetails[2] = ts('Could not select the database.'); - $this->error($testDetails); - return; - } - - $result = mysqli_query($conn, 'CREATE TABLE civicrm_utf8mb4_test (id VARCHAR(255), PRIMARY KEY(id(255))) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC ENGINE=INNODB'); - if (!$result) { - $testDetails[2] = ts('It is recommended, though not yet required, to configure your MySQL server for utf8mb4 support. You will need the following MySQL server configuration: innodb_large_prefix=true innodb_file_format=barracuda innodb_file_per_table=true'); - $this->warning($testDetails); - return; - } - $result = mysqli_query($conn, 'DROP TABLE civicrm_utf8mb4_test'); - - // Ensure that the MySQL driver supports utf8mb4 encoding. - $version = mysqli_get_client_info(); - if (strpos($version, 'mysqlnd') !== FALSE) { - // The mysqlnd driver supports utf8mb4 starting at version 5.0.9. - $version = preg_replace('/^\D+([\d.]+).*/', '$1', $version); - if (version_compare($version, '5.0.9', '<')) { - $testDetails[2] = 'It is recommended, though not yet required, to upgrade your PHP MySQL driver (mysqlnd) to >= 5.0.9 for utf8mb4 support.'; - $this->warning($testDetails); - return; - } - } - else { - // The libmysqlclient driver supports utf8mb4 starting at version 5.5.3. - if (version_compare($version, '5.5.3', '<')) { - $testDetails[2] = 'It is recommended, though not yet required, to upgrade your PHP MySQL driver (libmysqlclient) to >= 5.5.3 for utf8mb4 support.'; - $this->warning($testDetails); - return; - } - } - } - - /** - * @param $testDetails - * - * @return bool - */ - public function isRunningApache($testDetails) { - $this->testing($testDetails); - if (function_exists('apache_get_modules') || stristr($_SERVER['SERVER_SIGNATURE'], 'Apache')) { - return TRUE; - } - - $this->warning($testDetails); - return FALSE; - } - - /** - * @return string - */ - public function getBaseDir() { - return dirname($_SERVER['SCRIPT_FILENAME']) . CIVICRM_DIRECTORY_SEPARATOR; - } - - /** - * @param $testDetails - */ - public function testing($testDetails) { - if (!$testDetails) { - return; - } - - $section = $testDetails[0]; - $test = $testDetails[1]; - - $message = ts("OK"); - if (isset($testDetails[3])) { - $message .= " ($testDetails[3])"; - } - - $this->tests[$section][$test] = ["good", $message]; - } - - /** - * @param $testDetails - */ - public function error($testDetails) { - $section = $testDetails[0]; - $test = $testDetails[1]; - - $this->tests[$section][$test] = ["error", $testDetails[2]]; - $this->errors[] = $testDetails; - } - - /** - * @param $testDetails - */ - public function warning($testDetails) { - $section = $testDetails[0]; - $test = $testDetails[1]; - - $this->tests[$section][$test] = ["warning", $testDetails[2]]; - $this->warnings[] = $testDetails; - } - - /** - * @return int - */ - public function hasErrors() { - return !empty($this->errors); - } - - /** - * @return int - */ - public function hasWarnings() { - return !empty($this->warnings); - } - -} - -/** - * Class Installer - */ -class Installer extends InstallRequirements { - - /** - * @param $server - * @param $username - * @param $password - * @param $database - */ - public function createDatabaseIfNotExists($server, $username, $password, $database) { - $conn = $this->connect($server, $username, $password); - - if (@mysqli_select_db($conn, $database)) { - // skip if database already present - return; - } - $query = sprintf("CREATE DATABASE %s", mysqli_real_escape_string($conn, $database)); - if (@mysqli_query($conn, $query)) { - } - else { - $errorTitle = ts("Oops! Could not create database %1", [1 => $database]); - $errorMsg = ts("We encountered an error when attempting to create the database. Please check your MySQL server permissions and the database name and try again."); - errorDisplayPage($errorTitle, $errorMsg); - } - } - - /** - * @param $config - * - * @return mixed - */ - public function install($config) { - global $installDirPath; - - // create database if does not exists - $this->createDatabaseIfNotExists($config['mysql']['server'], - $config['mysql']['username'], - $config['mysql']['password'], - $config['mysql']['database'] - ); - - global $installDirPath; - - // Build database - require_once $installDirPath . 'civicrm.php'; - civicrm_main($config); - - if (!$this->errors) { - global $installType, $installURLPath; - - $registerSiteURL = "https://civicrm.org/register-site"; - $commonOutputMessage - = "
  • " . ts("Have you registered this site at CiviCRM.org? If not, please help strengthen the CiviCRM ecosystem by taking a few minutes to fill out the site registration form. The information collected will help us prioritize improvements, target our communications and build the community. If you have a technical role for this site, be sure to check Keep in Touch to receive technical updates (a low volume mailing list).", [1 => "href='$registerSiteURL' target='_blank'"]) . "
  • " - . "
  • " . ts("We have integrated KCFinder with CKEditor and TinyMCE. This allows a user to upload images. All uploaded images are public.") . "
  • "; - - $output = NULL; - - if ( - $installType == 'drupal' && - version_compare(VERSION, '7.0-rc1') >= 0 - ) { - - // clean output - @ob_clean(); - - $output .= ''; - $output .= ''; - $output .= ''; - $output .= '' . ts('CiviCRM Installed') . ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= '

    ' . ts('CiviCRM has been successfully installed') . '

    '; - $output .= ''; - $output .= '
    '; - $output .= ''; - $output .= ''; - echo $output; - } - elseif ( - $installType == 'backdrop' - ) { - - // clean output - @ob_clean(); - - $output .= ''; - $output .= ''; - $output .= ''; - $output .= '' . ts('CiviCRM Installed') . ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= '

    ' . ts('CiviCRM has been successfully installed') . '

    '; - $output .= ''; - $output .= '
    '; - $output .= ''; - $output .= ''; - echo $output; - } - elseif ($installType == 'drupal' && version_compare(VERSION, '6.0') >= 0) { - // clean output - @ob_clean(); - - $output .= ''; - $output .= ''; - $output .= ''; - $output .= '' . ts('CiviCRM Installed') . ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= '

    ' . ts("CiviCRM has been successfully installed") . '

    '; - $output .= '