diff --git a/application/Espo/Core/Utils/Util.php b/application/Espo/Core/Utils/Util.php index 76f8870d06..459efdaded 100644 --- a/application/Espo/Core/Utils/Util.php +++ b/application/Espo/Core/Utils/Util.php @@ -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); + } } diff --git a/install/core/Installer.php b/install/core/Installer.php index fa0c791f26..a8424a3d25 100644 --- a/install/core/Installer.php +++ b/install/core/Installer.php @@ -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; + } } diff --git a/install/core/SystemHelper.php b/install/core/SystemHelper.php index fea9faa0b9..755bef6e2c 100644 --- a/install/core/SystemHelper.php +++ b/install/core/SystemHelper.php @@ -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; } diff --git a/install/core/actions/step2.php b/install/core/actions/step2.php index 1fee018a90..4fded5aa08 100644 --- a/install/core/actions/step2.php +++ b/install/core/actions/step2.php @@ -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); \ No newline at end of file