2017-08-31 08:17:58 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace SilverStripe\Dev\Install;
|
|
|
|
|
2017-10-16 05:43:12 +02:00
|
|
|
use SilverStripe\Core\Environment;
|
|
|
|
|
2017-08-31 08:17:58 +02:00
|
|
|
/**
|
|
|
|
* Provides environment settings from the current request + environment
|
|
|
|
*
|
|
|
|
* @skipUpgrade
|
|
|
|
*/
|
|
|
|
class InstallConfig
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* List of preferred DB classes in order
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $preferredDatabases = [
|
|
|
|
'MySQLPDODatabase',
|
|
|
|
'MySQLDatabase',
|
|
|
|
];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get database config from the current environment
|
|
|
|
*
|
|
|
|
* @param array $request Request object
|
|
|
|
* @param array $databaseClasses Supported database config
|
2017-11-27 06:15:53 +01:00
|
|
|
* @param bool $realPassword Set to true to get the real password. If false, any non-posted
|
|
|
|
* password will be redacted as '********'. Note: Posted passwords are considered disclosed and
|
|
|
|
* never redacted.
|
2017-08-31 08:17:58 +02:00
|
|
|
* @return array
|
|
|
|
*/
|
2017-11-27 06:15:53 +01:00
|
|
|
public function getDatabaseConfig($request, $databaseClasses, $realPassword = true)
|
2017-08-31 08:17:58 +02:00
|
|
|
{
|
|
|
|
// Get config from request
|
|
|
|
if (isset($request['db']['type'])) {
|
|
|
|
$type = $request['db']['type'];
|
|
|
|
if (isset($request['db'][$type])) {
|
2017-11-27 06:15:53 +01:00
|
|
|
$config = $request['db'][$type];
|
|
|
|
// The posted placeholder must be substituted with the real password
|
|
|
|
if (isset($config['password']) && $config['password'] === Installer::PASSWORD_PLACEHOLDER) {
|
|
|
|
$config['password'] = Environment::getEnv('SS_DATABASE_PASSWORD') ?: '';
|
|
|
|
}
|
|
|
|
return array_merge([ 'type' => $type ], $config);
|
2017-08-31 08:17:58 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Guess database config
|
|
|
|
return [
|
|
|
|
'type' => $this->getDatabaseClass($databaseClasses),
|
2017-10-16 05:43:12 +02:00
|
|
|
'server' => Environment::getEnv('SS_DATABASE_SERVER') ?: 'localhost',
|
|
|
|
'username' => Environment::getEnv('SS_DATABASE_USERNAME') ?: 'root',
|
2017-11-27 06:15:53 +01:00
|
|
|
'password' => $realPassword
|
|
|
|
? (Environment::getEnv('SS_DATABASE_PASSWORD') ?: '')
|
|
|
|
: Installer::PASSWORD_PLACEHOLDER, // Avoid password disclosure
|
2017-10-16 05:43:12 +02:00
|
|
|
'database' => Environment::getEnv('SS_DATABASE_NAME') ?: 'SS_mysite',
|
2017-11-27 06:15:53 +01:00
|
|
|
'path' => Environment::getEnv('SS_DATABASE_PATH')
|
|
|
|
?: Environment::getEnv('SS_SQLITE_DATABASE_PATH') // sqlite compat
|
|
|
|
?: null,
|
|
|
|
'key' => Environment::getEnv('SS_DATABASE_KEY')
|
|
|
|
?: Environment::getEnv('SS_SQLITE_DATABASE_KEY') // sqlite compat
|
|
|
|
?: null,
|
2017-08-31 08:17:58 +02:00
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get admin config from the environment
|
|
|
|
*
|
|
|
|
* @param array $request
|
2017-11-27 06:15:53 +01:00
|
|
|
* @param bool $realPassword Set to true to get the real password. If false, any non-posted
|
|
|
|
* password will be redacted as '********'. Note: Posted passwords are considered disclosed and
|
|
|
|
* never redacted.
|
2017-08-31 08:17:58 +02:00
|
|
|
* @return array
|
|
|
|
*/
|
2017-11-27 06:15:53 +01:00
|
|
|
public function getAdminConfig($request, $realPassword = true)
|
2017-08-31 08:17:58 +02:00
|
|
|
{
|
|
|
|
if (isset($request['admin'])) {
|
2017-11-27 06:15:53 +01:00
|
|
|
$config = $request['admin'];
|
|
|
|
if (isset($config['password']) && $config['password'] === Installer::PASSWORD_PLACEHOLDER) {
|
|
|
|
$config['password'] = Environment::getEnv('SS_DEFAULT_ADMIN_PASSWORD') ?: '';
|
|
|
|
}
|
2017-08-31 08:17:58 +02:00
|
|
|
return $request['admin'];
|
|
|
|
}
|
|
|
|
|
|
|
|
return [
|
2017-10-16 05:43:12 +02:00
|
|
|
'username' => Environment::getEnv('SS_DEFAULT_ADMIN_USERNAME') ?: 'admin',
|
2017-11-27 06:15:53 +01:00
|
|
|
'password' => $realPassword
|
|
|
|
? (Environment::getEnv('SS_DEFAULT_ADMIN_PASSWORD') ?: '')
|
|
|
|
: Installer::PASSWORD_PLACEHOLDER, // Avoid password disclosure
|
2017-08-31 08:17:58 +02:00
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if this site has already been installed
|
|
|
|
*
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
public function alreadyInstalled()
|
|
|
|
{
|
|
|
|
if (file_exists($this->getEnvPath())) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (!file_exists($this->getConfigPath())) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
$configContents = file_get_contents($this->getConfigPath());
|
|
|
|
if (strstr($configContents, '$databaseConfig')) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (strstr($configContents, '$database')) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
protected function getConfigPath()
|
|
|
|
{
|
|
|
|
return BASE_PATH . '/mysite/_config.php';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
protected function getEnvPath()
|
|
|
|
{
|
|
|
|
return BASE_PATH . '/.env';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Database configs available for configuration
|
|
|
|
*
|
|
|
|
* @param array $databaseClasses
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
protected function getDatabaseClass($databaseClasses)
|
|
|
|
{
|
2017-10-16 05:43:12 +02:00
|
|
|
$envDatabase = Environment::getEnv('SS_DATABASE_CLASS');
|
|
|
|
if ($envDatabase) {
|
|
|
|
return $envDatabase;
|
2017-08-31 08:17:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Check supported versions
|
|
|
|
foreach ($this->preferredDatabases as $candidate) {
|
|
|
|
if (!empty($databaseClasses[$candidate]['supported'])) {
|
|
|
|
return $candidate;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get string representation of the framework version
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function getFrameworkVersion()
|
|
|
|
{
|
|
|
|
$composerLockPath = BASE_PATH . '/composer.lock';
|
|
|
|
if (!file_exists($composerLockPath)) {
|
|
|
|
return 'unknown';
|
|
|
|
}
|
|
|
|
$lockData = json_decode(file_get_contents($composerLockPath), true);
|
|
|
|
if (json_last_error() || empty($lockData['packages'])) {
|
|
|
|
return 'unknown';
|
|
|
|
}
|
|
|
|
foreach ($lockData['packages'] as $package) {
|
|
|
|
if ($package['name'] === 'silverstripe/framework') {
|
|
|
|
return $package['version'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 'unknown';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if stats should be sent
|
|
|
|
*
|
|
|
|
* @param array $request
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
public function canSendStats($request)
|
|
|
|
{
|
|
|
|
return !empty($request['stats']);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get configured locales
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function getLocales()
|
|
|
|
{
|
|
|
|
return [
|
|
|
|
'af_ZA' => 'Afrikaans (South Africa)',
|
|
|
|
'ar_EG' => 'Arabic (Egypt)',
|
|
|
|
'hy_AM' => 'Armenian (Armenia)',
|
|
|
|
'ast_ES' => 'Asturian (Spain)',
|
|
|
|
'az_AZ' => 'Azerbaijani (Azerbaijan)',
|
|
|
|
'bs_BA' => 'Bosnian (Bosnia and Herzegovina)',
|
|
|
|
'bg_BG' => 'Bulgarian (Bulgaria)',
|
|
|
|
'ca_ES' => 'Catalan (Spain)',
|
|
|
|
'zh_CN' => 'Chinese (China)',
|
|
|
|
'zh_TW' => 'Chinese (Taiwan)',
|
|
|
|
'hr_HR' => 'Croatian (Croatia)',
|
|
|
|
'cs_CZ' => 'Czech (Czech Republic)',
|
|
|
|
'da_DK' => 'Danish (Denmark)',
|
|
|
|
'nl_NL' => 'Dutch (Netherlands)',
|
|
|
|
'en_GB' => 'English (United Kingdom)',
|
|
|
|
'en_US' => 'English (United States)',
|
|
|
|
'eo_XX' => 'Esperanto',
|
|
|
|
'et_EE' => 'Estonian (Estonia)',
|
|
|
|
'fo_FO' => 'Faroese (Faroe Islands)',
|
|
|
|
'fi_FI' => 'Finnish (Finland)',
|
|
|
|
'fr_FR' => 'French (France)',
|
|
|
|
'de_DE' => 'German (Germany)',
|
|
|
|
'el_GR' => 'Greek (Greece)',
|
|
|
|
'he_IL' => 'Hebrew (Israel)',
|
|
|
|
'hu_HU' => 'Hungarian (Hungary)',
|
|
|
|
'is_IS' => 'Icelandic (Iceland)',
|
|
|
|
'id_ID' => 'Indonesian (Indonesia)',
|
|
|
|
'it_IT' => 'Italian (Italy)',
|
|
|
|
'ja_JP' => 'Japanese (Japan)',
|
|
|
|
'km_KH' => 'Khmer (Cambodia)',
|
|
|
|
'lc_XX' => 'LOLCAT',
|
|
|
|
'lv_LV' => 'Latvian (Latvia)',
|
|
|
|
'lt_LT' => 'Lithuanian (Lithuania)',
|
|
|
|
'ms_MY' => 'Malay (Malaysia)',
|
|
|
|
'mi_NZ' => 'Maori (New Zealand)',
|
|
|
|
'ne_NP' => 'Nepali (Nepal)',
|
|
|
|
'nb_NO' => 'Norwegian',
|
|
|
|
'fa_IR' => 'Persian (Iran)',
|
|
|
|
'pl_PL' => 'Polish (Poland)',
|
|
|
|
'pt_BR' => 'Portuguese (Brazil)',
|
|
|
|
'pa_IN' => 'Punjabi (India)',
|
|
|
|
'ro_RO' => 'Romanian (Romania)',
|
|
|
|
'ru_RU' => 'Russian (Russia)',
|
|
|
|
'sr_RS' => 'Serbian (Serbia)',
|
|
|
|
'si_LK' => 'Sinhalese (Sri Lanka)',
|
|
|
|
'sk_SK' => 'Slovak (Slovakia)',
|
|
|
|
'sl_SI' => 'Slovenian (Slovenia)',
|
|
|
|
'es_AR' => 'Spanish (Argentina)',
|
|
|
|
'es_MX' => 'Spanish (Mexico)',
|
|
|
|
'es_ES' => 'Spanish (Spain)',
|
|
|
|
'sv_SE' => 'Swedish (Sweden)',
|
|
|
|
'th_TH' => 'Thai (Thailand)',
|
|
|
|
'tr_TR' => 'Turkish (Turkey)',
|
|
|
|
'uk_UA' => 'Ukrainian (Ukraine)',
|
|
|
|
'uz_UZ' => 'Uzbek (Uzbekistan)',
|
|
|
|
'vi_VN' => 'Vietnamese (Vietnam)',
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get theme selected
|
|
|
|
*
|
|
|
|
* @param $request
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function getTheme($request)
|
|
|
|
{
|
|
|
|
if (isset($request['template'])) {
|
|
|
|
return $request['template'];
|
|
|
|
}
|
|
|
|
// Default theme
|
|
|
|
return 'simple';
|
|
|
|
}
|
|
|
|
}
|