installer: added possibility to load values from existing data/config.php

This commit is contained in:
Taras Machyshyn
2017-08-22 14:19:55 +03:00
parent e991241ad2
commit 7a6a8bc707
4 changed files with 471 additions and 416 deletions
+13
View File
@@ -602,5 +602,18 @@ class Util
return $array;
}
/**
* Array keys exists
*
* @param array $keys
* @param array $array
*
* @return boolean
*/
static public function arrayKeysExists(array $keys, array $array)
{
return !array_diff_key(array_flip($keys), $array);
}
}
+398 -398
View File
@@ -33,424 +33,424 @@ use Espo\Core\Utils\Config;
class Installer
{
protected $app = null;
protected $language = null;
protected $systemHelper = null;
protected $isAuth = false;
protected $permissionMap;
protected $permissionError;
private $passwordHash;
protected $settingList = array(
'dateFormat',
'timeFormat',
'timeZone',
'weekStart',
'defaultCurrency' => array(
'currencyList', 'defaultCurrency',
),
'smtpSecurity',
'language',
);
public function __construct()
{
$this->initialize();
$this->app = new \Espo\Core\Application();
$user = $this->getEntityManager()->getEntity('User');
$this->app->getContainer()->setUser($user);
require_once('install/core/SystemHelper.php');
$this->systemHelper = new SystemHelper();
protected $app = null;
protected $language = null;
protected $systemHelper = null;
protected $isAuth = false;
protected $permissionMap;
protected $permissionError;
private $passwordHash;
protected $settingList = array(
'dateFormat',
'timeFormat',
'timeZone',
'weekStart',
'defaultCurrency' => array(
'currencyList', 'defaultCurrency',
),
'smtpSecurity',
'language',
);
public function __construct()
{
$this->initialize();
$this->app = new \Espo\Core\Application();
$user = $this->getEntityManager()->getEntity('User');
$this->app->getContainer()->setUser($user);
require_once('install/core/SystemHelper.php');
$this->systemHelper = new SystemHelper();
$configPath = $this->getConfig()->getConfigPath();
$this->permissionMap = $this->getConfig()->get('permissionMap');
$this->permissionMap['writable'][] = $configPath;
$configPath = $this->getConfig()->getConfigPath();
$this->permissionMap = $this->getConfig()->get('permissionMap');
$this->permissionMap['writable'][] = $configPath;
}
if (!file_exists($configPath)) {
$configData = $this->getConfig()->getDefaults();
$this->getConfig()->set($configData);
$this->getConfig()->save();
}
}
protected function initialize()
{
$fileManager = new FileManager();
$config = new Config($fileManager);
$configPath = $config->getConfigPath();
if (!file_exists($configPath)) {
$fileManager->putPhpContents($configPath, array());
$configData = $config->getDefaults();
$config->set($configData);
$config->save();
}
}
protected function getContainer()
{
return $this->app->getContainer();
}
protected function getEntityManager()
{
return $this->getContainer()->get('entityManager');
}
protected function getConfig()
{
return $this->app->getContainer()->get('config');
}
protected function getSystemHelper()
{
return $this->systemHelper;
}
protected function getFileManager()
{
return $this->app->getContainer()->get('fileManager');
}
protected function getPasswordHash()
{
if (!isset($this->passwordHash)) {
$config = $this->getConfig();
$this->passwordHash = new \Espo\Core\Utils\PasswordHash($config);
}
return $this->passwordHash;
}
public function getVersion()
{
return $this->getConfig()->get('version');
}
protected function auth()
{
if (!$this->isAuth) {
$auth = new \Espo\Core\Utils\Auth($this->app->getContainer());
$auth->useNoAuth();
$this->isAuth = true;
}
return $this->isAuth;
}
public function isInstalled()
{
return $this->app->isInstalled();
}
protected function getLanguage()
{
if (!isset($this->language)) {
$this->language = $this->app->getContainer()->get('language');
}
return $this->language;
}
public function getLanguageList()
{
$config = $this->app->getContainer()->get('config');
$languageList = $config->get('languageList');
$translated = $this->getLanguage()->translate('language', 'options', 'Global', $languageList);
return $translated;
}
/**
* Save data
*
* @param array $database
* array (
* 'driver' => 'pdo_mysql',
* 'host' => 'localhost',
* 'dbname' => 'espocrm_test',
* 'user' => 'root',
* 'password' => '',
* ),
* @param string $language
* @return bool
*/
public function saveData($database, $language)
{
$initData = include('install/core/afterInstall/config.php');
$siteUrl = $this->getSystemHelper()->getBaseUrl();
$data = array(
'database' => $database,
'language' => $language,
'siteUrl' => $siteUrl,
'passwordSalt' => $this->getPasswordHash()->generateSalt(),
'cryptKey' => $this->getContainer()->get('crypt')->generateKey()
);
$owner = $this->getFileManager()->getPermissionUtils()->getDefaultOwner(true);
$group = $this->getFileManager()->getPermissionUtils()->getDefaultGroup(true);
if (!empty($owner)) {
$data['defaultPermissions']['user'] = $owner;
}
if (!empty($group)) {
$data['defaultPermissions']['group'] = $group;
}
$data = array_merge($data, $initData);
$result = $this->saveConfig($data);
return $result;
}
public function saveConfig($data)
{
$config = $this->app->getContainer()->get('config');
$config->set($data);
$result = $config->save();
return $result;
}
protected function initialize()
{
$fileManager = new FileManager();
$config = new Config($fileManager);
$configPath = $config->getConfigPath();
if (!file_exists($configPath)) {
$fileManager->putPhpContents($configPath, array());
}
$data = include('data/config.php');
$defaultData = $config->getDefaults();
//save default data if not exists, check by keys
if (!Util::arrayKeysExists(array_keys($defaultData), $data)) {
$defaultData = array_replace_recursive($defaultData, $data);
$config->set($defaultData);
$config->save();
}
}
protected function getContainer()
{
return $this->app->getContainer();
}
protected function getEntityManager()
{
return $this->getContainer()->get('entityManager');
}
public function getConfig()
{
return $this->app->getContainer()->get('config');
}
protected function getSystemHelper()
{
return $this->systemHelper;
}
protected function getFileManager()
{
return $this->app->getContainer()->get('fileManager');
}
protected function getPasswordHash()
{
if (!isset($this->passwordHash)) {
$config = $this->getConfig();
$this->passwordHash = new \Espo\Core\Utils\PasswordHash($config);
}
return $this->passwordHash;
}
public function getVersion()
{
return $this->getConfig()->get('version');
}
protected function auth()
{
if (!$this->isAuth) {
$auth = new \Espo\Core\Utils\Auth($this->app->getContainer());
$auth->useNoAuth();
$this->isAuth = true;
}
return $this->isAuth;
}
public function isInstalled()
{
return $this->app->isInstalled();
}
protected function getLanguage()
{
if (!isset($this->language)) {
$this->language = $this->app->getContainer()->get('language');
}
return $this->language;
}
public function getLanguageList()
{
$config = $this->app->getContainer()->get('config');
$languageList = $config->get('languageList');
$translated = $this->getLanguage()->translate('language', 'options', 'Global', $languageList);
return $translated;
}
/**
* Save data
*
* @param array $database
* array (
* 'driver' => 'pdo_mysql',
* 'host' => 'localhost',
* 'dbname' => 'espocrm_test',
* 'user' => 'root',
* 'password' => '',
* ),
* @param string $language
* @return bool
*/
public function saveData($database, $language)
{
$initData = include('install/core/afterInstall/config.php');
$siteUrl = $this->getSystemHelper()->getBaseUrl();
$data = array(
'database' => $database,
'language' => $language,
'siteUrl' => $siteUrl,
'passwordSalt' => $this->getPasswordHash()->generateSalt(),
'cryptKey' => $this->getContainer()->get('crypt')->generateKey()
);
$owner = $this->getFileManager()->getPermissionUtils()->getDefaultOwner(true);
$group = $this->getFileManager()->getPermissionUtils()->getDefaultGroup(true);
if (!empty($owner)) {
$data['defaultPermissions']['user'] = $owner;
}
if (!empty($group)) {
$data['defaultPermissions']['group'] = $group;
}
$data = array_merge($data, $initData);
$result = $this->saveConfig($data);
return $result;
}
public function saveConfig($data)
{
$config = $this->app->getContainer()->get('config');
$config->set($data);
$result = $config->save();
return $result;
}
public function buildDatabase()
{
$result = false;
try {
$result = $this->app->getContainer()->get('schema')->rebuild();
} catch (\Exception $e) {
$this->auth();
$result = $this->app->getContainer()->get('schema')->rebuild();
}
return $result;
}
public function setPreferences($preferences)
{
$currencyList = $this->getConfig()->get('currencyList', array());
if (isset($preferences['defaultCurrency']) && !in_array($preferences['defaultCurrency'], $currencyList)) {
$preferences['currencyList'] = array($preferences['defaultCurrency']);
$preferences['baseCurrency'] = $preferences['defaultCurrency'];
}
$res = $this->saveConfig($preferences);
/*save these settings for admin*/
$this->setAdminPreferences($preferences);
return $res;
}
protected function createRecords()
{
$records = include('install/core/afterInstall/records.php');
$result = true;
foreach ($records as $entityName => $recordList) {
foreach ($recordList as $data) {
$result &= $this->createRecord($entityName, $data);
}
}
return $result;
}
protected function createRecord($entityName, $data)
{
if (isset($data['id'])) {
$entity = $this->getEntityManager()->getEntity($entityName, $data['id']);
if (!isset($entity)) {
$pdo = $this->getEntityManager()->getPDO();
$sql = "SELECT id FROM `".Util::toUnderScore($entityName)."` WHERE `id` = '".$data['id']."'";
$sth = $pdo->prepare($sql);
$sth->execute();
public function buildDatabase()
{
$result = false;
try {
$result = $this->app->getContainer()->get('schema')->rebuild();
} catch (\Exception $e) {
$this->auth();
$result = $this->app->getContainer()->get('schema')->rebuild();
}
return $result;
}
public function setPreferences($preferences)
{
$currencyList = $this->getConfig()->get('currencyList', array());
if (isset($preferences['defaultCurrency']) && !in_array($preferences['defaultCurrency'], $currencyList)) {
$preferences['currencyList'] = array($preferences['defaultCurrency']);
$preferences['baseCurrency'] = $preferences['defaultCurrency'];
}
$res = $this->saveConfig($preferences);
/*save these settings for admin*/
$this->setAdminPreferences($preferences);
return $res;
}
protected function createRecords()
{
$records = include('install/core/afterInstall/records.php');
$result = true;
foreach ($records as $entityName => $recordList) {
foreach ($recordList as $data) {
$result &= $this->createRecord($entityName, $data);
}
}
return $result;
}
protected function createRecord($entityName, $data)
{
if (isset($data['id'])) {
$entity = $this->getEntityManager()->getEntity($entityName, $data['id']);
if (!isset($entity)) {
$pdo = $this->getEntityManager()->getPDO();
$sql = "SELECT id FROM `".Util::toUnderScore($entityName)."` WHERE `id` = '".$data['id']."'";
$sth = $pdo->prepare($sql);
$sth->execute();
$deletedEntity = $sth->fetch(\PDO::FETCH_ASSOC);
$deletedEntity = $sth->fetch(\PDO::FETCH_ASSOC);
if ($deletedEntity) {
$sql = "UPDATE `".Util::toUnderScore($entityName)."` SET deleted = '0' WHERE `id` = '".$data['id']."'";
$pdo->prepare($sql)->execute();
$entity = $this->getEntityManager()->getEntity($entityName, $data['id']);
}
}
}
if ($deletedEntity) {
$sql = "UPDATE `".Util::toUnderScore($entityName)."` SET deleted = '0' WHERE `id` = '".$data['id']."'";
$pdo->prepare($sql)->execute();
$entity = $this->getEntityManager()->getEntity($entityName, $data['id']);
}
}
}
if (!isset($entity)) {
$entity = $this->getEntityManager()->getEntity($entityName);
}
if (!isset($entity)) {
$entity = $this->getEntityManager()->getEntity($entityName);
}
$entity->set($data);
$entity->set($data);
$id = $this->getEntityManager()->saveEntity($entity);
$id = $this->getEntityManager()->saveEntity($entity);
return is_string($id);
}
return is_string($id);
}
public function createUser($userName, $password)
{
$this->auth();
public function createUser($userName, $password)
{
$this->auth();
$user = array(
'id' => '1',
'userName' => $userName,
'password' => $this->getPasswordHash()->hash($password),
'lastName' => 'Admin',
'isAdmin' => '1',
);
$user = array(
'id' => '1',
'userName' => $userName,
'password' => $this->getPasswordHash()->hash($password),
'lastName' => 'Admin',
'isAdmin' => '1',
);
$result = $this->createRecord('User', $user);
return $result;
}
protected function setAdminPreferences($preferences)
{
$allowedPreferences = array(
'dateFormat',
'timeFormat',
'timeZone',
'weekStart',
'defaultCurrency',
'thousandSeparator',
'decimalMark',
'language',
);
$result = $this->createRecord('User', $user);
return $result;
}
protected function setAdminPreferences($preferences)
{
$allowedPreferences = array(
'dateFormat',
'timeFormat',
'timeZone',
'weekStart',
'defaultCurrency',
'thousandSeparator',
'decimalMark',
'language',
);
$data = array_intersect_key($preferences, array_flip($allowedPreferences));
if (empty($data)) {
return true;
}
$data = array_intersect_key($preferences, array_flip($allowedPreferences));
if (empty($data)) {
return true;
}
$entity = $this->getEntityManager()->getEntity('Preferences', '1');
if ($entity) {
$entity->set($data);
return $this->getEntityManager()->saveEntity($entity);
}
$entity = $this->getEntityManager()->getEntity('Preferences', '1');
if ($entity) {
$entity->set($data);
return $this->getEntityManager()->saveEntity($entity);
}
return false;
}
return false;
}
public function checkPermission()
{
return $this->getFileManager()->getPermissionUtils()->setMapPermission();
}
public function checkPermission()
{
return $this->getFileManager()->getPermissionUtils()->setMapPermission();
}
public function getLastPermissionError()
{
return $this->getFileManager()->getPermissionUtils()->getLastErrorRules();
}
public function setSuccess()
{
$this->auth();
/** afterInstall scripts */
$result = $this->createRecords();
$result &= $this->executeQueries();
/** END: afterInstall scripts */
$config = $this->app->getContainer()->get('config');
$config->set('isInstalled', true);
$result &= $config->save();
return $result;
}
public function getSettingDefaults()
{
$defaults = array();
$settingDefs = $this->app->getMetadata()->get('entityDefs.Settings.fields');
foreach ($this->settingList as $fieldName => $field) {
if (is_array($field)) {
$fieldDefaults = array();
foreach ($field as $subField) {
if (isset($settingDefs[$subField])) {
$fieldDefaults = array_merge($fieldDefaults, $this->translateSetting($subField, $settingDefs[$subField]));
}
}
$defaults[$fieldName] = $fieldDefaults;
} else if (isset($settingDefs[$field])) {
$defaults[$field] = $this->translateSetting($field, $settingDefs[$field]);
}
}
if (isset($defaults['language'])) {
$defaults['language']['options'] = $this->getLanguageList();
}
return $defaults;
}
protected function translateSetting($name, array $settingDefs)
{
if (isset($settingDefs['options'])) {
$optionLabel = $this->getLanguage()->translate($name, 'options', 'Settings', $settingDefs['options']);
if ($optionLabel == $name) {
$optionLabel = $this->getLanguage()->translate($name, 'options', 'Global', $settingDefs['options']);
}
if ($optionLabel == $name) {
$optionLabel = array();
foreach ($settingDefs['options'] as $key => $value) {
$optionLabel[$value] = $value;
}
}
$settingDefs['options'] = $optionLabel;
}
return $settingDefs;
}
public function getCronMessage()
{
return $this->getContainer()->get('scheduledJob')->getSetupMessage();
}
protected function executeQueries()
{
$queries = include('install/core/afterInstall/queries.php');
$pdo = $this->getEntityManager()->getPDO();
public function getLastPermissionError()
{
return $this->getFileManager()->getPermissionUtils()->getLastErrorRules();
}
public function setSuccess()
{
$this->auth();
/** afterInstall scripts */
$result = $this->createRecords();
$result &= $this->executeQueries();
/** END: afterInstall scripts */
$config = $this->app->getContainer()->get('config');
$config->set('isInstalled', true);
$result &= $config->save();
return $result;
}
public function getSettingDefaults()
{
$defaults = array();
$settingDefs = $this->app->getMetadata()->get('entityDefs.Settings.fields');
foreach ($this->settingList as $fieldName => $field) {
if (is_array($field)) {
$fieldDefaults = array();
foreach ($field as $subField) {
if (isset($settingDefs[$subField])) {
$fieldDefaults = array_merge($fieldDefaults, $this->translateSetting($subField, $settingDefs[$subField]));
}
}
$defaults[$fieldName] = $fieldDefaults;
} else if (isset($settingDefs[$field])) {
$defaults[$field] = $this->translateSetting($field, $settingDefs[$field]);
}
}
if (isset($defaults['language'])) {
$defaults['language']['options'] = $this->getLanguageList();
}
return $defaults;
}
protected function translateSetting($name, array $settingDefs)
{
if (isset($settingDefs['options'])) {
$optionLabel = $this->getLanguage()->translate($name, 'options', 'Settings', $settingDefs['options']);
if ($optionLabel == $name) {
$optionLabel = $this->getLanguage()->translate($name, 'options', 'Global', $settingDefs['options']);
}
if ($optionLabel == $name) {
$optionLabel = array();
foreach ($settingDefs['options'] as $key => $value) {
$optionLabel[$value] = $value;
}
}
$settingDefs['options'] = $optionLabel;
}
return $settingDefs;
}
public function getCronMessage()
{
return $this->getContainer()->get('scheduledJob')->getSetupMessage();
}
protected function executeQueries()
{
$queries = include('install/core/afterInstall/queries.php');
$pdo = $this->getEntityManager()->getPDO();
$result = true;
$result = true;
foreach ($queries as $query) {
$sth = $pdo->prepare($query);
$result =& $sth->execute();
}
foreach ($queries as $query) {
$sth = $pdo->prepare($query);
$result =& $sth->execute();
}
return $result;
}
return $result;
}
}
+41 -3
View File
@@ -31,6 +31,8 @@ class SystemHelper extends \Espo\Core\Utils\System
{
protected $config;
protected $mainConfig;
protected $requirements;
protected $apiPath;
@@ -45,10 +47,23 @@ class SystemHelper extends \Espo\Core\Utils\System
{
$this->config = include('config.php');
if (file_exists('data/config.php')) {
$this->mainConfig = include('data/config.php');
}
$this->requirements = $this->config['requirements'];
$this->apiPath = $this->config['apiPath'];
}
protected function getMainConfig($optionName, $returns = null)
{
if (isset($this->mainConfig[$optionName])) {
return $this->mainConfig[$optionName];
}
return $returns;
}
public function initWritable()
{
if (is_writable($this->writableDir)) {
@@ -199,11 +214,34 @@ class SystemHelper extends \Espo\Core\Utils\System
return $result;
}
public function getPdoConnection($hostName, $port, $dbUserName, $dbUserPass, $dbName)
protected function getPdoConnection($hostName, $port, $dbUserName, $dbUserPass, $dbName)
{
$params = $this->getMainConfig('database', array());
$port = empty($port) ? '' : 'port=' . $port . ';';
$platform = !empty($params['platform']) ? strtolower($params['platform']) : 'mysql';
$options = array();
if (isset($params['sslCA'])) {
$options[PDO::MYSQL_ATTR_SSL_CA] = $params['sslCA'];
}
if (isset($params['sslCert'])) {
$options[PDO::MYSQL_ATTR_SSL_CERT] = $params['sslCert'];
}
if (isset($params['sslKey'])) {
$options[PDO::MYSQL_ATTR_SSL_KEY] = $params['sslKey'];
}
if (isset($params['sslCAPath'])) {
$options[PDO::MYSQL_ATTR_SSL_CAPATH] = $params['sslCAPath'];
}
if (isset($params['sslCipher'])) {
$options[PDO::MYSQL_ATTR_SSL_CIPHER] = $params['sslCipher'];
}
try {
$dsn = "mysql:host={$hostName};" . ((!empty($port)) ? "port={$port};" : '') . "dbname={$dbName}";
$dbh = new PDO($dsn, $dbUserName, $dbUserPass);
$dsn = $platform . ':host='.$hostName.';'.$port.'dbname=' . $dbName;
$dbh = new PDO($dsn, $dbUserName, $dbUserPass, $options);
} catch (PDOException $e) {
return $e;
}
+19 -15
View File
@@ -27,23 +27,27 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
$fields = array(
'db-name' => array(),
'host-name' => array(
'default' => (isset($langs['labels']['localhost']))? $langs['labels']['localhost'] : '',),
'port' => array(),
'db-user-name' => array(),
'db-user-password' => array(),
'db-driver' => array()
$defaults = $installer->getConfig()->get('database');
$fieldMap = array(
'db-driver' => 'driver',
'db-name' => 'dbname',
'host-name' => 'host',
'port' => 'port',
'db-user-name' => 'user',
'db-user-password' => 'password',
);
foreach ($fields as $fieldName => $field) {
if (isset($_SESSION['install'][$fieldName])) {
$fields[$fieldName]['value'] = $_SESSION['install'][$fieldName];
}
else {
$fields[$fieldName]['value'] = (isset($fields[$fieldName]['default']))? $fields[$fieldName]['default'] : '';
}
$fields = array();
foreach ($fieldMap as $fieldName => $optionName) {
$fields[$fieldName] = array();
if (isset($_SESSION['install'][$fieldName])) {
$fields[$fieldName]['value'] = $_SESSION['install'][$fieldName];
} else {
$fields[$fieldName]['value'] = isset($defaults[$optionName]) ? $defaults[$optionName] : '';
}
}
$smarty->assign('fields', $fields);