diff options
Diffstat (limited to 'install')
| -rw-r--r-- | install/ElggInstaller.php | 299 | ||||
| -rw-r--r-- | install/ElggRewriteTester.php | 15 | ||||
| -rw-r--r-- | install/cli/sample_installer.php | 44 | ||||
| -rw-r--r-- | install/css/install.css | 121 | ||||
| -rw-r--r-- | install/js/install.js | 42 | ||||
| -rw-r--r-- | install/languages/en.php | 17 |
6 files changed, 388 insertions, 150 deletions
diff --git a/install/ElggInstaller.php b/install/ElggInstaller.php index 7042f9811..78cdde90f 100644 --- a/install/ElggInstaller.php +++ b/install/ElggInstaller.php @@ -2,7 +2,27 @@ /** * Elgg Installer. - * Controller for installing Elgg. + * Controller for installing Elgg. Supports both web-based on CLI installation. + * + * This controller steps the user through the install process. The method for + * each step handles both the GET and POST requests. There is no XSS/CSRF protection + * on the POST processing since the installer is only run once by the administrator. + * + * The installation process can be resumed by hitting the first page. The installer + * will try to figure out where to pick up again. + * + * All the logic for the installation process is in this class, but it depends on + * the core libraries. To do this, we selectively load a subset of the core libraries + * for the first few steps and then load the entire engine once the database and + * site settings are configured. In addition, this controller does its own session + * handling until the database is setup. + * + * There is an aborted attempt in the code at creating the data directory for + * users as a subdirectory of Elgg's root. The idea was to protect this directory + * through a .htaccess file. The problem is that a malicious user can upload a + * .htaccess of his own that overrides the protection for his user directory. The + * best solution is server level configuration that turns off AllowOverride for the + * data directory. See ticket #3453 for discussion on this. * * @package Elgg.Core * @subpackage Installer @@ -19,6 +39,7 @@ class ElggInstaller { ); protected $status = array( + 'config' => FALSE, 'database' => FALSE, 'settings' => FALSE, 'admin' => FALSE, @@ -26,12 +47,15 @@ class ElggInstaller { protected $isAction = FALSE; - protected $autoLogin = FALSE; + protected $autoLogin = TRUE; /** * Constructor bootstraps the Elgg engine */ public function __construct() { + // load ElggRewriteTester as we depend on it + require_once(dirname(__FILE__) . "/ElggRewriteTester.php"); + $this->isAction = $_SERVER['REQUEST_METHOD'] === 'POST'; $this->bootstrapConfig(); @@ -96,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 * @@ -130,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); } @@ -140,22 +167,28 @@ class ElggInstaller { $params['password1'] = $params['password2'] = $params['password']; if ($createHtaccess) { - require_once(dirname(__FILE__) . "/ElggRewriteTester.php"); $rewriteTester = new ElggRewriteTester(); if (!$rewriteTester->createHtaccess($CONFIG->path)) { throw new InstallationException(elgg_echo('install:error:htaccess')); } } - 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 @@ -278,7 +311,7 @@ class ElggInstaller { 'dbpassword' => array( 'type' => 'password', 'value' => '', - 'required' => TRUE, + 'required' => FALSE, ), 'dbname' => array( 'type' => 'text', @@ -355,11 +388,10 @@ class ElggInstaller { protected function settings($submissionVars) { global $CONFIG; - $languages = get_installed_translations(); $formVars = array( 'sitename' => array( 'type' => 'text', - 'value' => 'New Elgg site', + 'value' => 'My New Community', 'required' => TRUE, ), 'siteemail' => array( @@ -382,12 +414,6 @@ class ElggInstaller { 'value' => '', 'required' => TRUE, ), - 'language' => array( - 'type' => 'pulldown', - 'value' => 'en', - 'options_values' => $languages, - 'required' => TRUE, - ), 'siteaccess' => array( 'type' => 'access', 'value' => ACCESS_PUBLIC, @@ -395,8 +421,19 @@ class ElggInstaller { ), ); + // if Apache, we give user option of having Elgg create data directory + //if (ElggRewriteTester::guessWebServer() == 'apache') { + // $formVars['dataroot']['type'] = 'combo'; + // $CONFIG->translations['en']['install:settings:help:dataroot'] = + // $CONFIG->translations['en']['install:settings:help:dataroot:apache']; + //} + if ($this->isAction) { do { + //if (!$this->createDataDirectory($submissionVars, $formVars)) { + // break; + //} + if (!$this->validateSettingsVars($submissionVars, $formVars)) { break; } @@ -454,7 +491,7 @@ class ElggInstaller { 'required' => TRUE, ), ); - + if ($this->isAction) { do { if (!$this->validateAdminVars($submissionVars, $formVars)) { @@ -493,11 +530,7 @@ class ElggInstaller { $params = array(); if ($this->autoLogin) { - // remind users to enable / disable desired tools - $msg = elgg_echo('firstadminlogininstructions'); - elgg_add_admin_notice('first_installation_plugin_reminder', $msg); - - $params['destination'] = 'pg/admin/plugins/simple'; + $params['destination'] = 'admin'; } else { $params['destination'] = 'index.php'; } @@ -538,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; + } } /** @@ -551,7 +589,7 @@ class ElggInstaller { protected function getNextStepUrl($currentStep) { global $CONFIG; $nextStep = $this->getNextStep($currentStep); - return elgg_get_site_url()."install.php?step=$nextStep"; + return elgg_get_site_url() . "install.php?step=$nextStep"; } /** @@ -568,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, @@ -686,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', 'install.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) { @@ -712,11 +753,16 @@ 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'); } @@ -739,11 +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', 'usersettings.php', - 'users.php', 'version.php', 'web_services.php', - 'widgets.php', 'xml.php', 'xml-rpc.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', ); foreach ($lib_files as $file) { @@ -754,11 +801,17 @@ class ElggInstaller { } } - $this->initGlobals(); - - 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'); } } @@ -777,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'); } /** @@ -1015,6 +1072,13 @@ class ElggInstaller { 'message' => elgg_echo("install:check:php:register_globals") ); } + + if (ini_get('session.auto_start')) { + $phpReport[] = array( + 'severity' => 'failure', + 'message' => elgg_echo("install:check:php:session.auto_start") + ); + } } /** @@ -1027,10 +1091,8 @@ class ElggInstaller { protected function checkRewriteRules(&$report) { global $CONFIG; - require_once(dirname(__FILE__) . "/ElggRewriteTester.php"); - $tester = new ElggRewriteTester(); - $url = elgg_get_site_url()."rewrite.php"; + $url = elgg_get_site_url() . "rewrite.php"; $report['rewrite'] = array($tester->run($url, $CONFIG->path)); } @@ -1086,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'], @@ -1223,6 +1295,39 @@ class ElggInstaller { */ /** + * Create the data directory if requested + * + * @param array $submissionVars Submitted vars + * @param array $formVars Variables in the form + * @return bool + */ + protected function createDataDirectory(&$submissionVars, $formVars) { + // did the user have option of Elgg creating the data directory + if ($formVars['dataroot']['type'] != 'combo') { + return TRUE; + } + + // did the user select the option + if ($submissionVars['dataroot'] != 'dataroot-checkbox') { + return TRUE; + } + + $dir = sanitise_filepath($submissionVars['path']) . 'data'; + if (file_exists($dir) || mkdir($dir, 0700)) { + $submissionVars['dataroot'] = $dir; + if (!file_exists("$dir/.htaccess")) { + $htaccess = "Order Deny,Allow\nDeny from All\n"; + if (!file_put_contents("$dir/.htaccess", $htaccess)) { + return FALSE; + } + } + return TRUE; + } + + return FALSE; + } + + /** * Validate the site settings form variables * * @param array $submissionVars Submitted vars @@ -1231,15 +1336,39 @@ class ElggInstaller { * @return bool */ protected function validateSettingsVars($submissionVars, $formVars) { + global $CONFIG; foreach ($formVars as $field => $info) { - if ($info['required'] == TRUE && !$submissionVars[$field]) { + $submissionVars[$field] = trim($submissionVars[$field]); + if ($info['required'] == TRUE && $submissionVars[$field] === '') { $name = elgg_echo("install:settings:label:$field"); register_error(elgg_echo('install:error:requiredfield', array($name))); return FALSE; } } + // 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'])); + register_error($msg); + return FALSE; + } + // check that data root is writable if (!is_writable($submissionVars['dataroot'])) { $msg = elgg_echo('install:error:writedatadirectory', array($submissionVars['dataroot'])); @@ -1247,11 +1376,13 @@ class ElggInstaller { return FALSE; } - // check that data root is not subdirectory of Elgg root - if (stripos($submissionVars['dataroot'], $submissionVars['path']) !== FALSE) { - $msg = elgg_echo('install:error:locationdatadirectory', array($submissionVars['dataroot'])); - register_error($msg); - return FALSE; + if (!isset($CONFIG->data_dir_override) || !$CONFIG->data_dir_override) { + // check that data root is not subdirectory of Elgg root + if (stripos($submissionVars['dataroot'], $submissionVars['path']) === 0) { + $msg = elgg_echo('install:error:locationdatadirectory', array($submissionVars['dataroot'])); + register_error($msg); + return FALSE; + } } // check that email address is email address @@ -1283,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')); @@ -1303,20 +1434,22 @@ class ElggInstaller { datalist_set('dataroot', $submissionVars['dataroot']); datalist_set('default_site', $site->getGUID()); datalist_set('version', get_version()); + datalist_set('simplecache_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/'); + datalist_set('processed_upgrades', serialize($upgrades)); set_config('view', 'default', $site->getGUID()); - set_config('language', $submissionVars['language'], $site->getGUID()); + set_config('language', 'en', $site->getGUID()); 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 = datalist_get('dataroot'); - $cache = new ElggFileCache($dataroot); - $cache->delete('view_paths'); - return TRUE; } @@ -1326,12 +1459,12 @@ class ElggInstaller { * @return void */ protected function enablePlugins() { - // activate plugins with manifest.xml: elgg_install_state = enabled - $plugins = get_plugin_list(); + elgg_generate_plugin_entities(); + $plugins = elgg_get_plugins('any'); foreach ($plugins as $plugin) { - if ($manifest = load_plugin_manifest($plugin)) { - if (isset($manifest['elgg_install_state']) && $manifest['elgg_install_state'] == 'enabled') { - enable_plugin($plugin); + if ($plugin->getManifest()) { + if ($plugin->getManifest()->getActivateOnInstall()) { + $plugin->activate(); } } } @@ -1396,29 +1529,36 @@ 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); if ($user->makeAdmin() == FALSE) { register_error(elgg_echo('install:error:adminaccess')); + } 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); @@ -1432,19 +1572,4 @@ class ElggInstaller { return TRUE; } - - /** - * Init globals because engine loaded within a function - * - * @return void - */ - protected function initGlobals() { - global $DB_QUERY_CACHE, $DB_DELAYED_QUERIES; - $DB_QUERY_CACHE = array(); - $DB_DELAYED_QUERIES = array(); - - global $METASTRINGS_CACHE, $METASTRINGS_DEADNAME_CACHE; - $METASTRINGS_CACHE = array(); - $METASTRINGS_DEADNAME_CACHE = array(); - } } diff --git a/install/ElggRewriteTester.php b/install/ElggRewriteTester.php index 64785da1a..ab68da2b7 100644 --- a/install/ElggRewriteTester.php +++ b/install/ElggRewriteTester.php @@ -30,7 +30,7 @@ class ElggRewriteTester { */ public function run($url, $path) { - $this->guessWebServer(); + $this->webserver = ElggRewriteTester::guessWebServer(); $this->rewriteTestPassed = $this->runRewriteTest($url); @@ -48,17 +48,17 @@ class ElggRewriteTester { /** * Guess the web server from $_SERVER['SERVER_SOFTWARE'] * - * @return void + * @return string */ - protected function guessWebServer() { + public static function guessWebServer() { $serverString = strtolower($_SERVER['SERVER_SOFTWARE']); $possibleServers = array('apache', 'nginx', 'lighttpd', 'iis'); foreach ($possibleServers as $server) { if (strpos($serverString, $server) !== FALSE) { - $this->webserver = $server; - return; + return $server; } } + return 'unknown'; } /** @@ -78,6 +78,7 @@ class ElggRewriteTester { curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); curl_close($ch); return $response === 'success'; @@ -153,6 +154,8 @@ class ElggRewriteTester { if ($this->serverSupportsRemoteRead == FALSE) { $msg = elgg_echo('install:warning:rewrite:unknown', array($url)); + $msg .= elgg_view('install/js_rewrite_check', array('url' => $url)); + return array( 'severity' => 'warning', 'message' => $msg, @@ -164,6 +167,8 @@ class ElggRewriteTester { $msg = "$serverString\n\n"; if (!isset($this->htaccessIssue)) { $msg .= elgg_echo('install:error:rewrite:allowoverride'); + $msg .= elgg_view('install/js_rewrite_check', array('url' => $url)); + return array( 'severity' => 'failure', 'message' => $msg, diff --git a/install/cli/sample_installer.php b/install/cli/sample_installer.php index 10838b562..a51f9aae4 100644 --- a/install/cli/sample_installer.php +++ b/install/cli/sample_installer.php @@ -1,12 +1,13 @@ <?php + /** * Sample cli installer script */ -require_once(dirname(dirname(__FILE__)) . "/ElggInstaller.php"); - -$installer = new ElggInstaller(); +// change to true to run this script. Change back to false when done. +$enabled = false; +// none of the following may be empty $params = array( // database parameters 'dbuser' => '', @@ -15,6 +16,7 @@ $params = array( // site settings 'sitename' => '', + 'siteemail' => '', 'wwwroot' => '', 'dataroot' => '', @@ -25,5 +27,41 @@ $params = array( 'password' => '', ); + +// Do not edit below this line. ////////////////////////////// + + +if (!$enabled) { + echo "To enable this script, change \$enabled to true.\n"; + echo "You *must* disable this script after a successful installation.\n"; + exit; +} + +if (PHP_SAPI !== 'cli') { + echo "You must use the command line to run this script."; + exit; +} + +require_once(dirname(dirname(__FILE__)) . "/ElggInstaller.php"); + +$installer = new ElggInstaller(); + // install and create the .htaccess file $installer->batchInstall($params, TRUE); + +// at this point installation has completed (otherwise an exception halted execution). +// try to rewrite the script to disable it. +if (is_writable(__FILE__)) { + $code = file_get_contents(__FILE__); + if (preg_match('~\\$enabled\\s*=\\s*(true|1)\\s*;~i', $code)) { + // looks safe to rewrite + $code = preg_replace('~\\$enabled\\s*=\\s*(true|1)\\s*;~i', '$enabled = false;', $code); + file_put_contents(__FILE__, $code); + + echo "\nNote: This script has been disabled for your safety.\n"; + exit; + } +} + +echo "\nWarning: You *must* disable this script by setting \$enabled = false;.\n"; +echo "Leaving this script enabled could endanger your installation.\n"; diff --git a/install/css/install.css b/install/css/install.css index 8ce4dfb38..e7290c130 100644 --- a/install/css/install.css +++ b/install/css/install.css @@ -62,37 +62,44 @@ ul { list-style: none; } -.clearfloat { - clear:both; - height:0; - font-size: 1px; - line-height: 0px; -} - -#elgg-wrapper { - background: white; - width: 800px; +.elgg-page { + width: 880px; margin: auto; - padding: 5px 40px; margin-top: 20px; +} +.elgg-page-header { border-right: 1px solid #666666; + padding: 15px 50px 10px; + background: white; +} +.elgg-page-body { border-bottom: 1px solid #666666; + border-right: 1px solid #666666; + padding: 0 40px 5px; + background: white; } -#elgg-header { - margin: 10px 10px; + +.elgg-page-body:after, +.elgg-page-header:after { + display: block; + content: '.'; + line-height: 0; + height: 0; + visibility: hidden; + clear: both; } -#elgg-sidebar { + +.elgg-sidebar { float: left; width: 250px; } -#elgg-content { - float: left; - width: 550px; +.elgg-body { + overflow: hidden; min-height: 320px; - padding-bottom: 60px; + padding-bottom: 10px; position: relative; } -#elgg-footer { +.elgg-page-footer { width: 800px; height: 20px; clear: both; @@ -101,28 +108,28 @@ ul { margin-bottom: 40px; } -.install-nav { +.elgg-install-nav { width: 100%; text-align: right; position: absolute; bottom: 0px; } -#elgg-footer a { +.elgg-page-footer a { color: white; } -#elgg-footer li { +.elgg-page-footer li { float: left; list-style: none; margin-right: 20px; } -#elgg-sidebar ol { +.elgg-sidebar ol { padding-left: 30px; } -#elgg-sidebar li { +.elgg-sidebar li { font-size: 1.2em; margin-bottom: 5px; } @@ -142,58 +149,57 @@ h3 { margin: 15px 0 5px; } +form > div { + margin-bottom: 15px; +} label { font-weight: bold; - color:#333333; + color: #333333; font-size: 140%; } +.elgg-combo-label { + font-size: 120%; +} input[type="text"], input[type="password"] { font: 120% Arial, Helvetica, sans-serif; padding: 5px; border: 1px solid #cccccc; - color:#666666; - width:566px; + color: #666666; + width: 96%; } .database-settings input[type="text"], .database-settings input[type="password"] { - width:220px; -} -textarea { - width: 100%; - height: 100%; - font: 120% Arial, Helvetica, sans-serif; - border: solid 1px #cccccc; - padding: 5px; - color:#666666; + width: 220px; } -textarea:focus, input[type="password"]:focus, input[type="text"]:focus { +input[type="password"]:focus, input[type="text"]:focus { border: solid 1px #4690d6; background: #e4ecf5; - color:#333333; + color: #333333; } input[type="submit"] { font-family: Arial, Helvetica, sans-serif; font-size: 16px; font-weight: bold; - color: #ffffff; + color: #fff; background: #4690d6; border: 4px solid #4690d6; + -webkit-border-radius: 4px; -moz-border-radius: 4px; + border-radius: 4px; + width: auto; height: 35px; - padding: 2px 6px 2px 6px; - margin: 10px 0 10px 0; + padding: 2px 6px; + margin: 10px 0; cursor: pointer; float: right; } - input[type="submit"]:hover { background: #0054a7; border: 4px solid #0054a7; } - select { display: block; padding: 5px; @@ -203,48 +209,61 @@ select { font-size: 90%; } -.install-nav a { +.elgg-require-database { + padding-bottom: 50px; +} + +.elgg-install-nav a { font-family: Arial, Helvetica, sans-serif; font-size: 16px; font-weight: bold; color: #ffffff; background: #4690d6; border: 4px solid #4690d6; + -webkit-border-radius: 4px; -moz-border-radius: 4px; - padding: 2px 9px 2px 9px; + border-radius: 4px; + + padding: 2px 9px; margin: 10px; cursor: pointer; float: right; } -.install-nav a:hover { +.elgg-install-nav a:hover { text-decoration: none; background: #0054a7; border: 4px solid #0054a7; } -.install-nav .disabled, .install-nav .disabled:hover { +.elgg-install-nav .elgg-state-disabled, +.elgg-install-nav .elgg-state-disabled:hover { background: #555555; border-color: #555555; cursor: default; } -#elgg-system-message { +.elgg-system-messages li { padding: 3px 10px 3px 10px; margin-bottom: 20px; } -.success { +.elgg-state-success { border: 1px solid #00cc00; background: #ccffcc; } -.error { +.elgg-state-error { border: 1px solid #D3322A; background: #F7DAD8; } -#elgg-content li { +.elgg-state-warning { + border: 1px solid #ded0a9; + background: #FEF5AA; +} + +.elgg-body li { margin-top: 5px; padding: 5px; } diff --git a/install/js/install.js b/install/js/install.js new file mode 100644 index 000000000..37e5b0dc3 --- /dev/null +++ b/install/js/install.js @@ -0,0 +1,42 @@ + +$(function() { + // prevent double-submission of forms + $('form').submit(function() { + if ($(this).data('submitted')) { + return false; + } + $(this).data('submitted', true); + return true; + }); + + // toggle the disable attribute of text box based on checkbox + $('.elgg-combo-checkbox').click(function() { + if ($(this).is(':checked')) { + $(this).prev().attr('disabled', true); + $(this).prev().val(''); + } else { + $(this).prev().attr('disabled', false); + } + }); +}); + +elgg = { + installer: {} +}; + +/** + * Check the rewrite address for "success" and then allows the installation to proceed. + */ +elgg.installer.rewriteTest = function(url, success_msg, nextURL) { + $.ajax(url, { + success: function(data, status, xhr) { + if (data == 'success') { + $('.elgg-require-rewrite li').attr('class', 'pass'); + $('.elgg-require-rewrite li').html('<p>' + success_msg + '</p>'); + $('.elgg-install-nav a.elgg-state-disabled') + .removeClass('elgg-state-disabled') + .attr('href', nextURL); + } + } + }); +} diff --git a/install/languages/en.php b/install/languages/en.php index ed42aa685..531379b1e 100644 --- a/install/languages/en.php +++ b/install/languages/en.php @@ -15,6 +15,9 @@ $english = array( 'install:admin' => 'Create admin account', 'install:complete' => 'Finished', + 'install:next' => 'Next', + 'install:refresh' => 'Refresh', + 'install:welcome:instructions' => "Installing Elgg has 6 simple steps and reading this welcome is the first one! If you haven't already, read through the installation instructions included with Elgg (or click the instructions link at the bottom of the page). @@ -42,6 +45,7 @@ If you are ready to proceed, click the Next button.", 'install:check:php:safe_mode' => 'Running PHP in safe mode is not recommened and may cause problems with Elgg.', 'install:check:php:arg_separator' => 'arg_separator.output must be & for Elgg to work and your server\'s value is %s', 'install:check:php:register_globals' => 'Register globals must be turned off.', + 'install:check:php:session.auto_start' => "session.auto_start must be off for Elgg to work. Either change the configuration of your server or add this directive to Elgg's .htaccess file.", 'install:check:enginedir' => 'Your web server does not have permission to create the settings.php file in the engine directory. You have two choices: @@ -63,13 +67,13 @@ If you are ready to proceed, click the Next button.", 'install:database:label:dbhost' => 'Database Host', 'install:database:label:dbprefix' => 'Database Table Prefix', - 'install:database:help:dbuser' => 'User that has full priviledges to the MySQL database that you created for Elgg', + 'install:database:help:dbuser' => 'User that has full privileges to the MySQL database that you created for Elgg', 'install:database:help:dbpassword' => 'Password for the above database user account', 'install:database:help:dbname' => 'Name of the Elgg database', 'install:database:help:dbhost' => 'Hostname of the MySQL server (usually localhost)', 'install:database:help:dbprefix' => "The prefix given to all of Elgg's tables (usually elgg_)", - 'install:settings:instructions' => "We need some information about the site as we configure Elgg. If you haven't created a data directory for Elgg, please do so before completing this step.", + 'install:settings:instructions' => 'We need some information about the site as we configure Elgg. If you haven\'t <a href="http://docs.elgg.org/wiki/Data_directory" target="_blank">created a data directory</a> for Elgg, you need to do so now.', 'install:settings:label:sitename' => 'Site Name', 'install:settings:label:siteemail' => 'Site Email Address', @@ -78,12 +82,14 @@ If you are ready to proceed, click the Next button.", 'install:settings:label:dataroot' => 'Data Directory', 'install:settings:label:language' => 'Site Language', 'install:settings:label:siteaccess' => 'Default Site Access', + 'install:label:combo:dataroot' => 'Elgg creates data directory', 'install:settings:help:sitename' => 'The name of your new Elgg site', 'install:settings:help:siteemail' => 'Email address used by Elgg for communication with users', 'install:settings:help:wwwroot' => 'The address of the site (Elgg usually guesses this correctly)', 'install:settings:help:path' => 'The directory where you put the Elgg code (Elgg usually guesses this correctly)', - 'install:settings:help:dataroot' => 'The directory that you created for Elgg to save files (the permissions on this directory are checked when you click Next)', + 'install:settings:help:dataroot' => 'The directory that you created for Elgg to save files (the permissions on this directory are checked when you click Next). It must be an absolute path.', + 'install:settings:help:dataroot:apache' => 'You have the option of Elgg creating the data directory or entering the directory that you already created for storing user files (the permissions on this directory are checked when you click Next)', 'install:settings:help:language' => 'The default language for the site', 'install:settings:help:siteaccess' => 'The default access level for new user created content', @@ -118,6 +124,7 @@ If you are ready to proceed, click the Next button.", 'install:error:htaccess' => 'Unable to create an .htaccess', 'install:error:settings' => 'Unable to create the settings file', 'install:error:databasesettings' => 'Unable to connect to the database with these settings.', + 'install:error:database_prefix' => 'Invalid characters in database prefix', 'install:error:oldmysql' => 'MySQL must be version 5.0 or above. Your server is using %s.', 'install:error:nodatabase' => 'Unable to use database %s. It may not exist.', 'install:error:cannotloadtables' => 'Cannot load the database tables', @@ -125,6 +132,8 @@ If you are ready to proceed, click the Next button.", 'install:error:readsettingsphp' => 'Unable to read engine/settings.example.php', 'install:error:writesettingphp' => 'Unable to write engine/settings.php', 'install:error:requiredfield' => '%s is required', + 'install:error:relative_path' => 'We don\'t think "%s" is an absolute path for your data directory', + 'install:error:datadirectoryexists' => 'Your data directory %s does not exist.', 'install:error:writedatadirectory' => 'Your data directory %s is not writable by the web server.', 'install:error:locationdatadirectory' => 'Your data directory %s must be outside of your install path for security.', 'install:error:emailaddress' => '%s is not a valid email address', @@ -146,7 +155,7 @@ If you are ready to proceed, click the Next button.", 'install:error:rewrite:htaccess:cannot_copy' => 'A unknown error occurred while creating the .htaccess file. You need to manually copy htaccess_dist to .htaccess in Elgg\'s directory.', 'install:error:rewrite:altserver' => 'The rewrite rules test failed. You need to configure your web server with Elgg\'s rewrite rules and try again.', 'install:error:rewrite:unknown' => 'Oof. We couldn\'t figure out what kind of web server is running on your server and it failed the rewrite rules. We cannot offer any specific advice. Please check the troubleshooting link.', - 'install:warning:rewrite:unknown' => 'Your server does not support automatic testing of the rewrite rules. You can continue the installation, but you may experience problems with your site. You can manually test the rewrite rules by clicking this link: <a href="%s" target="_blank">test</a>. You will see the word success if the rules are working.', + 'install:warning:rewrite:unknown' => 'Your server does not support automatic testing of the rewrite rules and your browser does not support checking via JavaScript. You can continue the installation, but you may experience problems with your site. You can manually test the rewrite rules by clicking this link: <a href="%s" target="_blank">test</a>. You will see the word success if the rules are working.', ); add_translation("en", $english); |
