diff options
Diffstat (limited to 'install/ElggInstaller.php')
| -rw-r--r-- | install/ElggInstaller.php | 150 |
1 files changed, 99 insertions, 51 deletions
diff --git a/install/ElggInstaller.php b/install/ElggInstaller.php index c07839065..78cdde90f 100644 --- a/install/ElggInstaller.php +++ b/install/ElggInstaller.php @@ -39,6 +39,7 @@ class ElggInstaller { ); protected $status = array( + 'config' => FALSE, 'database' => FALSE, 'settings' => FALSE, 'admin' => FALSE, @@ -119,6 +120,9 @@ class ElggInstaller { * account. If it fails, an exception is thrown. It does not check any of * the requirements as the multiple step web installer does. * + * If the settings.php file exists, it will use that rather than the parameters + * passed to this function. + * * @param array $params Array of key value pairs * @param bool $createHtaccess Should .htaccess be created * @@ -153,7 +157,7 @@ class ElggInstaller { 'password', ); foreach ($requiredParams as $key) { - if (!array_key_exists($key, $params)) { + if (empty($params[$key])) { $msg = elgg_echo('install:error:requiredfield', array($key)); throw new InstallationException($msg); } @@ -169,15 +173,22 @@ class ElggInstaller { } } - if (!$this->createSettingsFile($params)) { - throw new InstallationException(elgg_echo('install:error:settings')); + $this->setInstallStatus(); + + if (!$this->status['config']) { + if (!$this->createSettingsFile($params)) { + throw new InstallationException(elgg_echo('install:error:settings')); + } } if (!$this->connectToDatabase()) { throw new InstallationException(elgg_echo('install:error:databasesettings')); } - if (!$this->installDatabase()) { - throw new InstallationException(elgg_echo('install:error:cannotloadtables')); + + if (!$this->status['database']) { + if (!$this->installDatabase()) { + throw new InstallationException(elgg_echo('install:error:cannotloadtables')); + } } // load remaining core libraries @@ -380,7 +391,7 @@ class ElggInstaller { $formVars = array( 'sitename' => array( 'type' => 'text', - 'value' => 'New Elgg site', + 'value' => 'My New Community', 'required' => TRUE, ), 'siteemail' => array( @@ -524,8 +535,6 @@ class ElggInstaller { $params['destination'] = 'index.php'; } - elgg_invalidate_simplecache(); - $this->render('complete', $params); } @@ -562,7 +571,12 @@ class ElggInstaller { * @return string */ protected function getNextStep($currentStep) { - return $this->steps[1 + array_search($currentStep, $this->steps)]; + $index = 1 + array_search($currentStep, $this->steps); + if (isset($this->steps[$index])) { + return $this->steps[$index]; + } else { + return null; + } } /** @@ -592,6 +606,8 @@ class ElggInstaller { $this->loadSettingsFile(); + $this->status['config'] = TRUE; + // must be able to connect to database to jump install steps $dbSettingsPass = $this->checkDatabaseSettings( $CONFIG->dbuser, @@ -710,8 +726,9 @@ class ElggInstaller { // bootstrapping with required files in a required order $required_files = array( - 'elgglib.php', 'views.php', 'access.php', 'system_log.php', 'export.php', 'configuration.php', - 'sessions.php', 'languages.php', 'input.php', 'cache.php', 'output.php' + 'elgglib.php', 'views.php', 'access.php', 'system_log.php', 'export.php', + 'configuration.php', 'sessions.php', 'languages.php', 'pageowner.php', + 'input.php', 'cache.php', 'output.php', ); foreach ($required_files as $file) { @@ -736,19 +753,18 @@ class ElggInstaller { $dbIndex = array_search('database', $this->getSteps()); $settingsIndex = array_search('settings', $this->getSteps()); + $adminIndex = array_search('admin', $this->getSteps()); + $completeIndex = array_search('complete', $this->getSteps()); $stepIndex = array_search($step, $this->getSteps()); - if ($stepIndex <= $settingsIndex) { - // install has its own session handling before the db created and set up - session_name('Elgg'); + // To log in the user, we need to use the Elgg core session handling. + // Otherwise, use default php session handling + $useElggSession = ($stepIndex == $adminIndex && $this->isAction) || + $stepIndex == $completeIndex; + if (!$useElggSession) { + session_name('Elgg_install'); session_start(); elgg_unregister_event_handler('boot', 'system', 'session_init'); - } else if (!$this->isAction && $stepIndex == ($settingsIndex + 1)) { - // now using Elgg session handling so need to pass forward the system messages - // this is called on the GET of the next step - session_name('Elgg'); - session_start(); - $messages = $_SESSION['msg']; } if ($stepIndex > $dbIndex) { @@ -769,12 +785,12 @@ class ElggInstaller { 'memcache.php', 'metadata.php', 'metastrings.php', 'navigation.php', 'notification.php', 'objects.php', 'opendd.php', 'pagehandler.php', - 'pageowner.php', 'pam.php', 'plugins.php', + 'pam.php', 'plugins.php', 'private_settings.php', 'relationships.php', 'river.php', 'sites.php', 'statistics.php', 'tags.php', 'user_settings.php', 'users.php', 'upgrade.php', 'web_services.php', - 'widgets.php', 'xml.php', 'xml-rpc.php', 'deprecated-1.7.php', - 'deprecated-1.8.php', + 'widgets.php', 'xml.php', 'xml-rpc.php', + 'deprecated-1.7.php', 'deprecated-1.8.php', ); foreach ($lib_files as $file) { @@ -785,15 +801,18 @@ class ElggInstaller { } } - set_default_config(); + setup_db_connections(); + register_translations(dirname(dirname(__FILE__)) . "/languages/"); + + if ($stepIndex > $settingsIndex) { + $CONFIG->site_guid = (int) datalist_get('default_site'); + $CONFIG->site_id = $CONFIG->site_guid; + $CONFIG->site = get_entity($CONFIG->site_guid); + $CONFIG->dataroot = datalist_get('dataroot'); + _elgg_session_boot(NULL, NULL, NULL); + } - elgg_trigger_event('boot', 'system'); elgg_trigger_event('init', 'system'); - - // @hack finish the process of pushing system messages into new session - if (!$this->isAction && $stepIndex == ($settingsIndex + 1)) { - $_SESSION['msg'] = $messages; - } } } @@ -811,6 +830,10 @@ class ElggInstaller { $CONFIG->wwwroot = $this->getBaseUrl(); $CONFIG->url = $CONFIG->wwwroot; $CONFIG->path = dirname(dirname(__FILE__)) . '/'; + $CONFIG->viewpath = $CONFIG->path . 'views/'; + $CONFIG->pluginspath = $CONFIG->path . 'mod/'; + $CONFIG->context = array(); + $CONFIG->entity_types = array('group', 'object', 'site', 'user'); } /** @@ -1125,11 +1148,21 @@ class ElggInstaller { foreach ($formVars as $field => $info) { if ($info['required'] == TRUE && !$submissionVars[$field]) { $name = elgg_echo("install:database:label:$field"); - register_error("$name is required"); + register_error(elgg_echo('install:error:requiredfield', array($name))); return FALSE; } } + // according to postgres documentation: SQL identifiers and key words must + // begin with a letter (a-z, but also letters with diacritical marks and + // non-Latin letters) or an underscore (_). Subsequent characters in an + // identifier or key word can be letters, underscores, digits (0-9), or dollar signs ($). + // Refs #4994 + if (!preg_match("/^[a-zA-Z_][\w]*$/", $submissionVars['dbprefix'])) { + register_error(elgg_echo('install:error:database_prefix')); + return FALSE; + } + return $this->checkDatabaseSettings( $submissionVars['dbuser'], $submissionVars['dbpassword'], @@ -1314,6 +1347,21 @@ class ElggInstaller { } } + // check that data root is absolute path + if (stripos(PHP_OS, 'win') === 0) { + if (strpos($submissionVars['dataroot'], ':') !== 1) { + $msg = elgg_echo('install:error:relative_path', array($submissionVars['dataroot'])); + register_error($msg); + return FALSE; + } + } else { + if (strpos($submissionVars['dataroot'], '/') !== 0) { + $msg = elgg_echo('install:error:relative_path', array($submissionVars['dataroot'])); + register_error($msg); + return FALSE; + } + } + // check that data root exists if (!file_exists($submissionVars['dataroot'])) { $msg = elgg_echo('install:error:datadirectoryexists', array($submissionVars['dataroot'])); @@ -1366,11 +1414,11 @@ class ElggInstaller { $submissionVars['wwwroot'] = sanitise_filepath($submissionVars['wwwroot']); $site = new ElggSite(); - $site->name = $submissionVars['sitename']; - $site->url = $submissionVars['wwwroot']; + $site->name = strip_tags($submissionVars['sitename']); + $site->url = $submissionVars['wwwroot']; $site->access_id = ACCESS_PUBLIC; - $site->email = $submissionVars['siteemail']; - $guid = $site->save(); + $site->email = $submissionVars['siteemail']; + $guid = $site->save(); if (!$guid) { register_error(elgg_echo('install:error:createsite')); @@ -1387,7 +1435,7 @@ class ElggInstaller { datalist_set('default_site', $site->getGUID()); datalist_set('version', get_version()); datalist_set('simplecache_enabled', 1); - datalist_set('viewpath_cache_enabled', 1); + datalist_set('system_cache_enabled', 1); // new installations have run all the upgrades $upgrades = elgg_get_upgrade_files($submissionVars['path'] . 'engine/lib/upgrades/'); @@ -1398,15 +1446,10 @@ class ElggInstaller { set_config('default_access', $submissionVars['siteaccess'], $site->getGUID()); set_config('allow_registration', TRUE, $site->getGUID()); set_config('walled_garden', FALSE, $site->getGUID()); + set_config('allow_user_default_access', '', $site->getGUID()); $this->enablePlugins(); - // reset the views path in case of installing over an old data dir. - $dataroot = $submissionVars['dataroot']; - $CONFIG->dataroot = $dataroot; - $cache = new ElggFileCache($dataroot); - $cache->delete('view_paths'); - return TRUE; } @@ -1486,22 +1529,27 @@ class ElggInstaller { protected function createAdminAccount($submissionVars, $login = FALSE) { global $CONFIG; - $guid = register_user( - $submissionVars['username'], - $submissionVars['password1'], - $submissionVars['displayname'], - $submissionVars['email'] - ); + try { + $guid = register_user( + $submissionVars['username'], + $submissionVars['password1'], + $submissionVars['displayname'], + $submissionVars['email'] + ); + } catch (Exception $e) { + register_error($e->getMessage()); + return false; + } if (!$guid) { register_error(elgg_echo('install:admin:cannot_create')); - return FALSE; + return false; } $user = get_entity($guid); if (!$user) { register_error(elgg_echo('install:error:loadadmin')); - return FALSE; + return false; } elgg_set_ignore_access(TRUE); @@ -1510,7 +1558,7 @@ class ElggInstaller { } else { datalist_set('admin_registered', 1); } - elgg_set_ignore_access(FALSE); + elgg_set_ignore_access(false); // add validation data to satisfy user validation plugins create_metadata($guid, 'validated', TRUE, '', 0, ACCESS_PUBLIC); |
