$value) { if ($gpc) { $value = stripslashes($value); } $INSTALL[$setting] = $value; } if ( $goforward = (! empty( $_POST['next'] )) ) { $nextstage = $_POST['stage'] + 1; } else if (! empty( $_POST['prev'])) { $nextstage = $_POST['stage'] - 1; $INSTALL['stage'] = $_POST['stage'] - 1; } else if (! empty( $_POST['same'] )) { $nextstage = $_POST['stage']; } $nextstage = (int)$nextstage; if ($nextstage < 0) { $nextstage = WELCOME; } } else { $goforward = true; $nextstage = WELCOME; } //==========================================================================// /// Fake some settings so that we can use selected functions from moodlelib.php and weblib.php $SESSION->lang = (!empty($_POST['language'])) ? $_POST['language'] : $INSTALL['language']; $CFG->dirroot = $INSTALL['dirroot']; $CFG->libdir = $INSTALL['dirroot'].'/lib'; $CFG->dataroot = $INSTALL['dataroot']; $CFG->admin = $INSTALL['admindirname']; $CFG->directorypermissions = 00777; $CFG->running_installer = true; $CFG->docroot = 'http://docs.moodle.org'; $CFG->httpswwwroot = $INSTALL['wwwrootform']; // Needed by doc_link() in Server Checks page. $COURSE->id = 0; /// Include some moodle libraries require_once($CFG->libdir.'/adminlib.php'); require_once($CFG->libdir.'/setuplib.php'); require_once($CFG->libdir.'/moodlelib.php'); require_once($CFG->libdir.'/weblib.php'); require_once($CFG->libdir.'/deprecatedlib.php'); require_once($CFG->libdir.'/adodb/adodb.inc.php'); require_once($CFG->libdir.'/environmentlib.php'); require_once($CFG->libdir.'/xmlize.php'); require_once($CFG->libdir.'/componentlib.class.php'); require_once($CFG->dirroot.'/version.php'); /// Set version and release $INSTALL['version'] = $version; $INSTALL['release'] = $release; /// Have the $db object ready because we are going to use it often define ('ADODB_ASSOC_CASE', 0); //Use lowercase fieldnames for ADODB_FETCH_ASSOC $db = &ADONewConnection($INSTALL['dbtype']); $db->SetFetchMode(ADODB_FETCH_ASSOC); /// guess the www root if ($INSTALL['wwwroot'] == '') { list($INSTALL['wwwroot'], $xtra) = explode('/install.php', qualified_me()); $INSTALL['wwwrootform'] = $INSTALL['wwwroot']; // now try to guess the correct dataroot not accessible via web $CFG->wwwroot = $INSTALL['wwwroot']; $i = 0; //safety check - dirname might return some unexpected results while(is_dataroot_insecure()) { $parrent = dirname($CFG->dataroot); $i++; if ($parrent == '/' or $parrent == '.' or preg_match('/^[a-z]:\\\?$/i', $parrent) or ($i > 100)) { $CFG->dataroot = ''; //can not find secure location for dataroot break; } $CFG->dataroot = dirname($parrent).'/moodledata'; } $INSTALL['dataroot'] = $CFG->dataroot; } $headstagetext = array(WELCOME => get_string('chooselanguagehead', 'install'), COMPATIBILITY => get_string('compatibilitysettingshead', 'install'), DIRECTORY => get_string('directorysettingshead', 'install'), DATABASE => get_string('databasesettingshead', 'install'), ADMIN => get_string('admindirsettinghead', 'install'), ENVIRONMENT => get_string('environmenthead', 'install'), DOWNLOADLANG => get_string('downloadlanguagehead', 'install'), SAVE => get_string('configurationcompletehead', 'install') ); $substagetext = array(WELCOME => get_string('chooselanguagesub', 'install'), COMPATIBILITY => get_string('compatibilitysettingssub', 'install'), DIRECTORY => get_string('directorysettingssub', 'install'), DATABASE => get_string('databasesettingssub', 'install'), ADMIN => get_string('admindirsettingsub', 'install'), ENVIRONMENT => get_string('environmentsub', 'install'), DOWNLOADLANG => get_string('downloadlanguagesub', 'install'), SAVE => get_string('configurationcompletesub', 'install') ); //==========================================================================// /// Are we in help mode? if (isset($_GET['help'])) { $nextstage = -1; } //==========================================================================// /// Are we in config download mode? if (isset($_GET['download'])) { header("Content-Type: application/x-forcedownload\n"); header("Content-Disposition: attachment; filename=\"config.php\""); echo $INSTALL['config']; exit; } //==========================================================================// /// Check the directory settings if ($INSTALL['stage'] == DIRECTORY) { error_reporting(0); /// check wwwroot if (ini_get('allow_url_fopen') && false) { /// This was not reliable if (($fh = @fopen($INSTALL['wwwrootform'].'/install.php', 'r')) === false) { $errormsg .= get_string('wwwrooterror', 'install').'
'; $INSTALL['wwwrootform'] = $INSTALL['wwwroot']; } } if ($fh) fclose($fh); /// check dirroot if (($fh = @fopen($INSTALL['dirrootform'].'/install.php', 'r')) === false ) { $errormsg .= get_string('dirrooterror', 'install').'
'; $INSTALL['dirrootform'] = $INSTALL['dirroot']; } if ($fh) fclose($fh); /// check dataroot $CFG->dataroot = $INSTALL['dataroot']; $CFG->wwwroot = $INSTALL['wwwroot']; if (make_upload_directory('sessions', false) === false ) { $errormsg .= get_string('datarooterror', 'install').'
'; } else if (is_dataroot_insecure(true) == INSECURE_DATAROOT_ERROR) { $errormsg .= get_string('datarootpublicerror', 'install').'
'; } if (!empty($errormsg)) $nextstage = DIRECTORY; error_reporting(7); } //==========================================================================// /// Check database settings if stage 3 data submitted /// Try to connect to the database. If that fails then try to create the database if ($INSTALL['stage'] == DATABASE) { /// different format for postgres7 by socket if ($INSTALL['dbtype'] == 'postgres7' and ($INSTALL['dbhost'] == 'localhost' || $INSTALL['dbhost'] == '127.0.0.1')) { $INSTALL['dbhost'] = "user='{$INSTALL['dbuser']}' password='{$INSTALL['dbpass']}' dbname='{$INSTALL['dbname']}'"; $INSTALL['dbuser'] = ''; $INSTALL['dbpass'] = ''; $INSTALL['dbname'] = ''; if ($INSTALL['prefix'] == '') { /// must have a prefix $INSTALL['prefix'] = 'mdl_'; } } if ($INSTALL['dbtype'] == 'mysql') { /// Check MySQL extension is present if (!extension_loaded('mysql')) { $errormsg = get_string('mysqlextensionisnotpresentinphp', 'install'); $nextstage = DATABASE; } } if ($INSTALL['dbtype'] == 'mysqli') { /// Check MySQLi extension is present if (!extension_loaded('mysqli')) { $errormsg = get_string('mysqliextensionisnotpresentinphp', 'install'); $nextstage = DATABASE; } } if ($INSTALL['dbtype'] == 'postgres7') { /// Check PostgreSQL extension is present if (!extension_loaded('pgsql')) { $errormsg = get_string('pgsqlextensionisnotpresentinphp', 'install'); $nextstage = DATABASE; } } if ($INSTALL['dbtype'] == 'mssql') { /// Check MSSQL extension is present if (!function_exists('mssql_connect')) { $errormsg = get_string('mssqlextensionisnotpresentinphp', 'install'); $nextstage = DATABASE; } } if ($INSTALL['dbtype'] == 'mssql_n') { /// Check MSSQL extension is present if (!function_exists('mssql_connect')) { $errormsg = get_string('mssqlextensionisnotpresentinphp', 'install'); $nextstage = DATABASE; } } if ($INSTALL['dbtype'] == 'odbc_mssql') { /// Check ODBC extension is present if (!extension_loaded('odbc')) { $errormsg = get_string('odbcextensionisnotpresentinphp', 'install'); $nextstage = DATABASE; } } if ($INSTALL['dbtype'] == 'oci8po') { /// Check OCI extension is present if (!extension_loaded('oci8')) { $errormsg = get_string('ociextensionisnotpresentinphp', 'install'); $nextstage = DATABASE; } } if (empty($INSTALL['prefix']) && $INSTALL['dbtype'] != 'mysql' && $INSTALL['dbtype'] != 'mysqli') { // All DBs but MySQL require prefix (reserv. words) $errormsg = get_string('dbwrongprefix', 'install'); $nextstage = DATABASE; } if ($INSTALL['dbtype'] == 'oci8po' && strlen($INSTALL['prefix']) > 2) { // Oracle max prefix = 2cc (30cc limit) $errormsg = get_string('dbwrongprefix', 'install'); $nextstage = DATABASE; } if ($INSTALL['dbtype'] == 'oci8po' && !empty($INSTALL['dbhost'])) { // Oracle host must be blank (tnsnames.ora has it) $errormsg = get_string('dbwronghostserver', 'install'); $nextstage = DATABASE; } if (empty($errormsg)) { error_reporting(0); // Hide errors if (! $dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'],$INSTALL['dbname'])) { $db->database = ''; // reset database name cached by ADODB. Trick from MDL-9609 if ($dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'])) { /// Try to connect without DB switch ($INSTALL['dbtype']) { /// Try to create a database case 'mysql': case 'mysqli': if ($db->Execute("CREATE DATABASE {$INSTALL['dbname']} DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;")) { $dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'],$INSTALL['dbname']); } else { $errormsg = get_string('dbcreationerror', 'install'); $nextstage = DATABASE; } break; } } } else { /// We have been able to connect properly, just test the database encoding now. /// It must be Unicode for 1.8 installations. $encoding = ''; switch ($INSTALL['dbtype']) { case 'mysql': case 'mysqli': /// Get MySQL character_set_database value $rs = $db->Execute("SHOW VARIABLES LIKE 'character_set_database'"); if ($rs && !$rs->EOF) { $records = $rs->GetAssoc(true); $encoding = $records['character_set_database']['Value']; if (strtoupper($encoding) != 'UTF8') { /// Try to set the encoding now! if (! $db->Metatables()) { // We have no tables so go ahead $db->Execute("ALTER DATABASE `".$INSTALL['dbname']."` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci"); $rs = $db->Execute("SHOW VARIABLES LIKE 'character_set_database'"); // this works } } /// If conversion fails, skip, let environment testing do the job } break; case 'postgres7': /// Skip, let environment testing do the job break; case 'oci8po': /// Skip, let environment testing do the job break; } } } error_reporting(7); if (($dbconnected === false) and (empty($errormsg)) ) { $errormsg = get_string('dbconnectionerror', 'install'); $nextstage = DATABASE; } } //==========================================================================// /// If the next stage is admin directory settings OR we have just come from there then /// check the admin directory. /// If we can open a file then we know that the admin name is correct. if ($nextstage == ADMIN or $INSTALL['stage'] == ADMIN) { if (!ini_get('allow_url_fopen')) { $nextstage = ($goforward) ? ENVIRONMENT : DATABASE; } else if (($fh = @fopen($INSTALL['wwwrootform'].'/'.$INSTALL['admindirname'].'/environment.xml', 'r')) !== false) { $nextstage = ($goforward) ? ENVIRONMENT : DATABASE; fclose($fh); } else { $nextstage = ($goforward) ? ENVIRONMENT : DATABASE; //if ($nextstage != ADMIN) { // $errormsg = get_string('admindirerror', 'install'); // $nextstage = ADMIN; // } } } //==========================================================================// // Check if we can navigate from the environemt page (because it's ok) if ($INSTALL['stage'] == ENVIRONMENT) { error_reporting(0); // Hide errors $dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'],$INSTALL['dbname']); error_reporting(7); // Show errors if ($dbconnected) { /// Execute environment check, not printing results @remove_dir($INSTALL['dataroot'] . '/environment'); /// Always delete downloaded env. info to force use of the released one. MDL-9796 if (!check_moodle_environment($INSTALL['release'], $environment_results, false)) { $nextstage = ENVIRONMENT; } } else { /// We never should reach this because DB has been tested before arriving here $errormsg = get_string('dbconnectionerror', 'install'); $nextstage = DATABASE; } } //==========================================================================// // Try to download the lang pack if it has been selected if ($INSTALL['stage'] == DOWNLOADLANG && $INSTALL['downloadlangpack']) { $downloadsuccess = false; $downloaderror = ''; error_reporting(0); // Hide errors /// Create necessary lang dir if (!make_upload_directory('lang', false)) { $downloaderror = get_string('cannotcreatelangdir', 'error'); } /// Download and install component if (($cd = new component_installer('http://download.moodle.org', 'lang16', $INSTALL['language'].'.zip', 'languages.md5', 'lang')) && empty($errormsg)) { $status = $cd->install(); //returns COMPONENT_(ERROR | UPTODATE | INSTALLED) switch ($status) { case COMPONENT_ERROR: if ($cd->get_error() == 'remotedownloaderror') { $a = new stdClass(); $a->url = 'http://download.moodle.org/lang16/'.$INSTALL['language'].'.zip'; $a->dest= $CFG->dataroot.'/lang'; $downloaderror = get_string($cd->get_error(), 'error', $a); } else { $downloaderror = get_string($cd->get_error(), 'error'); } break; case COMPONENT_UPTODATE: case COMPONENT_INSTALLED: $downloadsuccess = true; break; default: //We shouldn't reach this point } } else { //We shouldn't reach this point } error_reporting(7); // Show errors if ($downloadsuccess) { $INSTALL['downloadlangpack'] = false; $INSTALL['showdownloadlangpack'] = false; $INSTALL['downloadlangpackerror'] = $downloaderror; } else { $INSTALL['downloadlangpack'] = false; $INSTALL['showdownloadlangpack'] = false; $INSTALL['downloadlangpackerror'] = $downloaderror; } } //==========================================================================// /// Display or print the data /// Put the data into a string /// Try to open config file for writing. if ($nextstage == SAVE) { $str = 'dbtype = \''.$INSTALL['dbtype']."';\r\n"; $str .= '$CFG->dbhost = \''.addslashes($INSTALL['dbhost'])."';\r\n"; if (!empty($INSTALL['dbname'])) { $str .= '$CFG->dbname = \''.$INSTALL['dbname']."';\r\n"; // support single quotes in db user/passwords $str .= '$CFG->dbuser = \''.addsingleslashes($INSTALL['dbuser'])."';\r\n"; $str .= '$CFG->dbpass = \''.addsingleslashes($INSTALL['dbpass'])."';\r\n"; } $str .= '$CFG->dbpersist = false;'."\r\n"; $str .= '$CFG->prefix = \''.$INSTALL['prefix']."';\r\n"; $str .= "\r\n"; $str .= '$CFG->wwwroot = \''.s($INSTALL['wwwrootform'],true)."';\r\n"; $str .= '$CFG->dirroot = \''.s($INSTALL['dirrootform'],true)."';\r\n"; $str .= '$CFG->dataroot = \''.s($INSTALL['dataroot'],true)."';\r\n"; $str .= '$CFG->admin = \''.s($INSTALL['admindirname'],true)."';\r\n"; $str .= "\r\n"; $str .= '$CFG->directorypermissions = 00777; // try 02777 on a server in Safe Mode'."\r\n"; $str .= "\r\n"; $str .= '$CFG->passwordsaltmain = \''.addsingleslashes(complex_random_string()).'\';'."\r\n"; $str .= "\r\n"; $str .= 'require_once("$CFG->dirroot/lib/setup.php");'."\r\n"; $str .= '// MAKE SURE WHEN YOU EDIT THIS FILE THAT THERE ARE NO SPACES, BLANK LINES,'."\r\n"; $str .= '// RETURNS, OR ANYTHING ELSE AFTER THE TWO CHARACTERS ON THE NEXT LINE.'."\r\n"; $str .= '?>'; umask(0137); if (( $configsuccess = ($fh = @fopen($configfile, 'w')) ) !== false) { fwrite($fh, $str); fclose($fh); } $INSTALL['config'] = $str; } //==========================================================================// ?> Moodle Install

window.onload=toggledbinfo;'; echo '
' . get_string('databasesettingssub_mysql', 'install'); echo '

' . get_string('databasesettingswillbecreated', 'install') . '

'; echo '
'; echo '
' . get_string('databasesettingssub_mysqli', 'install'); echo '

' . get_string('databasesettingswillbecreated', 'install') . '

'; echo '
'; echo '
' . get_string('databasesettingssub_postgres7', 'install'); echo '

' . get_string('postgresqlwarning', 'install') . '

'; echo '
'; echo '
' . get_string('databasesettingssub_mssql', 'install'); /// Link to mssql installation page echo "

"; echo 'Docs'; echo get_string('moodledocslink', 'install') . '

'; echo '
'; echo '
' . get_string('databasesettingssub_mssql_n', 'install'); /// Link to mssql installation page echo "

"; echo 'Docs'; echo get_string('moodledocslink', 'install') . '

'; echo '
'; echo '
'. get_string('databasesettingssub_odbc_mssql', 'install'); /// Link to mssql installation page echo "

"; echo 'Docs'; echo get_string('moodledocslink', 'install') . '

'; echo '
'; echo '
' . get_string('databasesettingssub_oci8po', 'install'); /// Link to oracle installation page echo "

"; echo 'Docs'; echo get_string('moodledocslink', 'install') . '

'; echo '
'; } else { if (!empty($substagetext[$nextstage])) { echo '

' . $substagetext[$nextstage] . '

'; } } ?>
$errormsg

\n"; if ($nextstage == SAVE) { $INSTALL['stage'] = WELCOME; $options = array(); $options['lang'] = $INSTALL['language']; if ($configsuccess) { echo "

".get_string('configfilewritten', 'install')."

\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "
  \n"; print_single_button("index.php", $options, get_string('continue')); echo "
\n"; } else { echo "

".get_string('configfilenotwritten', 'install')."

"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "
 \n"; $installoptions = array(); $installoptions['download'] = 1; print_single_button("install.php", $installoptions, get_string('download', 'install')); echo "\n"; print_single_button("index.php", $options, get_string('continue')); echo "
\n"; echo "
\n"; echo "
\n"; echo "
\n";
        print_r(s($str));
        echo "
\n"; echo "
\n"; } } else { $formaction = (isset($_GET['configfile'])) ? "install.php?configfile=".$_GET['configfile'] : "install.php"; form_table($nextstage, $formaction); } ?>

get_string('mysql', 'install'), 'mysqli' => get_string('mysqli', 'install'), 'oci8po' => get_string('oci8po', 'install'), 'postgres7' => get_string('postgres7', 'install'), 'mssql' => get_string('mssql', 'install'), 'mssql_n' => get_string('mssql_n', 'install'), 'odbc_mssql' => get_string('odbc_mssql', 'install')), 'dbtype', $INSTALL['dbtype'], '', 'toggledbinfo();') ?>

Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'],$INSTALL['dbname']); error_reporting(7); // Show errors if ($dbconnected) { /// Execute environment check, printing results @remove_dir($INSTALL['dataroot'] . '/environment'); /// Always delete downloaded env. info to force use of the released one. MDL-9796 check_moodle_environment($INSTALL['release'], $environment_results, true); } else { /// We never should reach this because DB has been tested before arriving here $errormsg = get_string('dbconnectionerror', 'install'); $nextstage = DATABASE; echo '

'.get_string('dbconnectionerror', 'install').'

'; } ?>
".$INSTALL['downloadlangpackerror']."

\n"; print_simple_box(get_string('langdownloaderror', 'install', $languages[$INSTALL['language']]), 'center', '80%'); } else { print_simple_box(get_string('langdownloadok', 'install', $languages[$INSTALL['language']]), 'center', '80%'); } } } ?>
\n" : " \n" ?> WELCOME) ? "
\n" : " \n" ?>
\n"; echo "

$testtext

\n"; if ($success) { echo "

".get_string('pass', 'install')."

\n"; echo " \n"; } else { echo ""; echo ($caution) ? "

".get_string('caution', 'install') : "

".get_string('fail', 'install'); echo "

\n"; echo ""; echo "

$errormessage "; if ($helpfield !== '') { install_helpbutton("install.php?help=$helpfield"); } echo "

\n"; } echo "\n"; return $success; } //==========================================================================// function install_helpbutton($url, $title='') { if ($title == '') { $title = get_string('help'); } echo ""; echo "\"$title\""; echo "\n"; } //==========================================================================// function print_install_help($help) { switch ($help) { case 'phpversionhelp': print_string($help, 'install', phpversion()); break; case 'memorylimithelp': print_string($help, 'install', get_memory_limit()); break; default: print_string($help, 'install'); } } //==========================================================================// function get_memory_limit() { if ($limit = ini_get('memory_limit')) { return $limit; } else { return get_cfg_var('memory_limit'); } } //==========================================================================// function check_memory_limit() { /// if limit is already 40 or more then we don't care if we can change it or not if ((int)str_replace('M', '', get_memory_limit()) >= 40) { return true; } /// Otherwise, see if we can change it ourselves raise_memory_limit('40M'); return ((int)str_replace('M', '', get_memory_limit()) >= 40); } //==========================================================================// function inst_check_php_version() { if (!check_php_version("4.3.0")) { return false; } else if (check_php_version("5.0.0")) { return check_php_version("5.1.0"); // 5.0.x is too buggy } return true; // 4.3.x or 4.4.x is fine } //==========================================================================// /* This function returns a list of languages and their full names. The * list of available languages is fetched from install/lang/xx/installer.php * and it's used exclusively by the installation process * @return array An associative array with contents in the form of LanguageCode => LanguageName */ function get_installer_list_of_languages() { global $CFG; $languages = array(); /// Get raw list of lang directories $langdirs = get_list_of_plugins('install/lang'); asort($langdirs); /// Get some info from each lang foreach ($langdirs as $lang) { if (file_exists($CFG->dirroot .'/install/lang/'. $lang .'/installer.php')) { include($CFG->dirroot .'/install/lang/'. $lang .'/installer.php'); if (substr($lang, -5) == '_utf8') { //Remove the _utf8 suffix from the lang to show $shortlang = substr($lang, 0, -5); } else { $shortlang = $lang; } if ($lang == 'en') { //Explain this is non-utf8 en $shortlang = 'non-utf8 en'; } if (!empty($string['thislanguage'])) { $languages[$lang] = $string['thislanguage'] .' ('. $shortlang .')'; } unset($string); } } /// Return array return $languages; } //==========================================================================// function css_styles() { ?>