='); } /** * This function checks if a php extension exists or not and returns an HTML status string. * * @param string Name of the PHP extension to be checked * @param string Text to show when extension is available (defaults to 'Yes') * @param string Text to show when extension is available (defaults to 'No') * @param boolean Whether this extension is optional (in this case show unavailable text in orange rather than red) * @return string HTML string reporting the status of this extension. Language-aware. * @author Christophe Gesch?? * @author Patrick Cool , Ghent University * @author Yannick Warnier * @version Dokeos 1.8.1, May 2007 */ function check_extension($extension_name, $return_success = 'Yes', $return_failure = 'No', $optional = false) { if (extension_loaded($extension_name)) { return Display::label($return_success, 'success'); } else { if ($optional) { return Display::label($return_failure, 'warning'); //return ''.$return_failure.''; } else { return Display::label($return_failure, 'important'); //return ''.$return_failure.''; } } } /** * This function checks whether a php setting matches the recommended value * * @author Patrick Cool , Ghent University * @version Dokeos 1.8, august 2006 */ function check_php_setting($php_setting, $recommended_value, $return_success = false, $return_failure = false) { $current_php_value = get_php_setting($php_setting); if ($current_php_value == $recommended_value) { return Display::label($current_php_value.' '.$return_success, 'success'); } else { return Display::label($current_php_value.' '.$return_success, 'important'); } } /** * Returns a textual value ('ON' or 'OFF') based on a requester 2-state ini- configuration setting. * * @param string $val a php ini value * @return boolean: ON or OFF * @author Joomla */ function get_php_setting($val) { return ini_get($val) == '1' ? 'ON' : 'OFF'; } /** * This function returns a string "true" or "false" according to the passed parameter. * * @param integer $var The variable to present as text * @return string the string "true" or "false" * @author Christophe Gesch?? */ function true_false($var) { return $var ? 'true' : 'false'; } /** * Removes memory and time limits as much as possible. */ function remove_memory_and_time_limits() { if (function_exists('ini_set')) { ini_set('memory_limit', -1); ini_set('max_execution_time', 0); } else { error_log('Update-db script: could not change memory and time limits', 0); } } /** * Detects browser's language. * @return string Returns a language identificator, i.e. 'english', 'spanish', ... * @author Ivan Tcholakov, 2010 */ function detect_browser_language() { static $language_index = array( 'ar' => 'arabic', 'ast' => 'asturian', 'bg' => 'bulgarian', 'bs' => 'bosnian', 'ca' => 'catalan', 'zh' => 'simpl_chinese', 'zh-tw' => 'trad_chinese', 'cs' => 'czech', 'da' => 'danish', 'prs' => 'dari', 'de' => 'german', 'el' => 'greek', 'en' => 'english', 'es' => 'spanish', 'eo' => 'esperanto', 'eu' => 'basque', 'fa' => 'persian', 'fr' => 'french', 'fur' => 'friulian', 'gl' => 'galician', 'ka' => 'georgian', 'hr' => 'croatian', 'he' => 'hebrew', 'hi' => 'hindi', 'id' => 'indonesian', 'it' => 'italian', 'ko' => 'korean', 'lv' => 'latvian', 'lt' => 'lithuanian', 'mk' => 'macedonian', 'hu' => 'hungarian', 'ms' => 'malay', 'nl' => 'dutch', 'ja' => 'japanese', 'no' => 'norwegian', 'oc' => 'occitan', 'ps' => 'pashto', 'pl' => 'polish', 'pt' => 'portuguese', 'pt-br' => 'brazilian', 'ro' => 'romanian', 'qu' => 'quechua_cusco', 'ru' => 'russian', 'sk' => 'slovak', 'sl' => 'slovenian', 'sr' => 'serbian', 'fi' => 'finnish', 'sv' => 'swedish', 'th' => 'thai', 'tr' => 'turkish', 'uk' => 'ukrainian', 'vi' => 'vietnamese', 'sw' => 'swahili', 'yo' => 'yoruba' ); $system_available_languages = & get_language_folder_list(); $accept_languages = strtolower(str_replace('_', '-', $_SERVER['HTTP_ACCEPT_LANGUAGE'])); foreach ($language_index as $code => $language) { if (strpos($accept_languages, $code) === 0) { if (!empty($system_available_languages[$language])) { return $language; } } } $user_agent = strtolower(str_replace('_', '-', $_SERVER['HTTP_USER_AGENT'])); foreach ($language_index as $code => $language) { if (@preg_match("/[\[\( ]{$code}[;,_\-\)]/", $user_agent)) { if (!empty($system_available_languages[$language])) { return $language; } } } return 'english'; } /* FILESYSTEM RELATED FUNCTIONS */ /** * This function checks if the given folder is writable */ function check_writable($folder, $suggestion = false) { if (is_writable(api_get_path(SYS_CODE_PATH).$folder)) { return Display::label(get_lang('Writable'), 'success'); } else { if ($suggestion) { return Display::label(get_lang('NotWritable'), 'info'); } else { return Display::label(get_lang('NotWritable'), 'important'); } } } /** * This function is similar to the core file() function, except that it * works with line endings in Windows (which is not the case of file()) * @param string File path * @return array The lines of the file returned as an array */ function file_to_array($filename) { if(!is_readable($filename) || is_dir($filename)){ return array(); } $fp = fopen($filename, 'rb'); $buffer = fread($fp, filesize($filename)); fclose($fp); return explode('
', nl2br($buffer)); } /** * We assume this function is called from install scripts that reside inside the install folder. */ function set_file_folder_permissions() { @chmod('.', 0755); //set permissions on install dir @chmod('..', 0755); //set permissions on parent dir of install dir @chmod('country_data.csv.csv', 0755); } /** * Add's a .htaccess file to the courses directory * @param string $url_append The path from your webroot to your chamilo root */ function write_courses_htaccess_file($url_append) { $content = file_get_contents(dirname(__FILE__).'/'.COURSES_HTACCESS_FILENAME); $content = str_replace('{CHAMILO_URL_APPEND_PATH}', $url_append, $content); $fp = @ fopen(api_get_path(SYS_PATH).'courses/.htaccess', 'w'); if ($fp) { fwrite($fp, $content); return fclose($fp); } return false; } /** * Write the main system config file * @param string $path Path to the config file */ function write_system_config_file($path) { global $dbHostForm; global $dbUsernameForm; global $dbPassForm; global $enableTrackingForm; global $singleDbForm; global $dbPrefixForm; global $dbNameForm; global $dbStatsForm; global $dbScormForm; global $dbUserForm; global $urlForm; global $pathForm; global $urlAppendPath; global $languageForm; global $encryptPassForm; global $installType; global $updatePath; global $session_lifetime; global $new_version; global $new_version_stable; $root_sys = api_add_trailing_slash(str_replace('\\', '/', realpath($pathForm))); $content = file_get_contents(dirname(__FILE__).'/'.SYSTEM_CONFIG_FILENAME); $config['{DATE_GENERATED}'] = date('r'); $config['{DATABASE_HOST}'] = $dbHostForm; $config['{DATABASE_USER}'] = $dbUsernameForm; $config['{DATABASE_PASSWORD}'] = $dbPassForm; $config['TRACKING_ENABLED'] = true_false($enableTrackingForm); $config['SINGLE_DATABASE'] = true_false($singleDbForm); $config['{COURSE_TABLE_PREFIX}'] = ($singleDbForm ? 'crs_' : ''); $config['{DATABASE_GLUE}'] = ($singleDbForm ? '_' : '`.`'); $config['{DATABASE_PREFIX}'] = ''; $config['{DATABASE_MAIN}'] = $dbNameForm; $config['{DATABASE_STATS}'] = $dbNameForm; $config['{DATABASE_SCORM}'] = $dbNameForm; $config['{DATABASE_PERSONAL}'] = $dbNameForm; $config['{ROOT_WEB}'] = $urlForm; $config['{ROOT_SYS}'] = $root_sys; $config['{URL_APPEND_PATH}'] = $urlAppendPath; $config['{PLATFORM_LANGUAGE}'] = $languageForm; $config['{SECURITY_KEY}'] = md5(uniqid(rand().time())); $config['{ENCRYPT_PASSWORD}'] = $encryptPassForm; $config['SESSION_LIFETIME'] = $session_lifetime; $config['{NEW_VERSION}'] = $new_version; $config['NEW_VERSION_STABLE'] = true_false($new_version_stable); foreach ($config as $key => $value) { $content = str_replace($key, $value, $content); } $fp = @ fopen($path, 'w'); if (!$fp) { echo 'Your script doesn\'t have write access to the config directory
('.str_replace('\\', '/', realpath($path)).')

You probably do not have write access on Chamilo root directory, i.e. you should CHMOD 777 or 755 or 775.

Your problems can be related on two possible causes:
  • Permission problems.
    Try initially with chmod -R 777 and increase restrictions gradually.
  • PHP is running in Safe-Mode. If possible, try to switch it off.
Read about this problem in Support Forum

Please go back to step 5.

'; exit; } fwrite($fp, $content); fclose($fp); } /** * Returns a list of language directories. */ function & get_language_folder_list() { static $result; if (!is_array($result)) { $result = array(); $exceptions = array('.', '..', 'CVS', '.svn'); $search = array('_latin', '_unicode', '_corporate', '_org' , '_KM', '_'); $replace_with = array(' (Latin)', ' (unicode)', ' (corporate)', ' (org)', ' (KM)', ' '); $dirname = api_get_path(SYS_LANG_PATH); $handle = opendir($dirname); while ($entries = readdir($handle)) { if (in_array($entries, $exceptions)) { continue; } if (is_dir($dirname.$entries)) { $result[$entries] = ucwords(str_replace($search, $replace_with, $entries)); } } closedir($handle); asort($result); } return $result; } /** * TODO: my_directory_to_array() - maybe within the main API there is already a suitable function? */ function my_directory_to_array($directory) { $array_items = array(); if ($handle = opendir($directory)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { if (is_dir($directory. "/" . $file)) { $array_items = array_merge($array_items, my_directory_to_array($directory. '/' . $file)); $file = $directory . "/" . $file; $array_items[] = preg_replace("/\/\//si", '/', $file); } } } closedir($handle); } return $array_items; } /** * This function returns the value of a parameter from the configuration file * * WARNING - this function relies heavily on global variables $updateFromConfigFile * and $configFile, and also changes these globals. This can be rewritten. * * @param string $param the parameter of which the value is returned * @param string If we want to give the path rather than take it from POST * @return string the value of the parameter * @author Olivier Brouckaert * @author Reworked by Ivan Tcholakov, 2010 */ function get_config_param($param, $updatePath = '') { global $configFile, $updateFromConfigFile; // Look if we already have the queried parameter. if (is_array($configFile) && isset($configFile[$param])) { return $configFile[$param]; } if (empty($updatePath) && !empty($_POST['updatePath'])) { $updatePath = $_POST['updatePath']; } if (empty($updatePath)) { $updatePath = api_get_path(SYS_PATH); } $updatePath = api_add_trailing_slash(str_replace('\\', '/', realpath($updatePath))); $updateFromInstalledVersionFile = ''; if (empty($updateFromConfigFile)) { // If update from previous install was requested, // try to recover old config file from dokeos 1.8.x. if (file_exists($updatePath.'main/inc/conf/configuration.php')) { $updateFromConfigFile = 'main/inc/conf/configuration.php'; } elseif (file_exists($updatePath.'claroline/inc/conf/claro_main.conf.php')) { $updateFromConfigFile = 'claroline/inc/conf/claro_main.conf.php'; } else { // Give up recovering. //error_log('Chamilo Notice: Could not find previous config file at '.$updatePath.'main/inc/conf/configuration.php nor at '.$updatePath.'claroline/inc/conf/claro_main.conf.php in get_config_param(). Will start new config (in '.__FILE__.', line '.__LINE__.')', 0); return null; } } if (file_exists($updatePath.$updateFromConfigFile) && !is_dir($updatePath.$updateFromConfigFile)) { // The parameter was not found among the global variables, so look into the old configuration file. // Make sure the installedVersion file is read first so it is overwritten // by the config file if the config file contains the version (from 1.8.4). $config_data_2 = array(); if (file_exists($updatePath.$updateFromInstalledVersionFile)) { $config_data_2 = file_to_array($updatePath.$updateFromInstalledVersionFile); } $configFile = array(); $config_data = file_to_array($updatePath.$updateFromConfigFile); $config_data = array_merge($config_data, $config_data_2); $val = ''; // Parse the configuration file, statement by statement (line by line, actually). foreach ($config_data as $php_statement) { if (strpos($php_statement, '=') !== false) { // Variable assignment statement have been detected (probably). // It is expected to be as follows: // $variable = 'some_value'; // A comment that is not mandatory. // Split the statement into its left and right sides. $php_statement = explode('=', $php_statement); $variable = trim($php_statement[0]); $value = $php_statement[1]; if (substr($variable, 0, 1) == '$') { // We have for sure a php variable assignment detected. // On the left side: Retrieve the pure variable's name $variable = trim(str_replace('$', '', $variable)); // On the right side: Remove the comment, if it exists. list($value) = explode(' //', $value); // Remove extra whitespace, if any. Remove the trailing semicolon (;). $value = substr(trim($value), 0, -1); // Remove surroundig quotes, restore escaped quotes. $value = str_replace('\"', '"', preg_replace('/^"|"$/', '', $value)); $value = str_replace('\'', '"', preg_replace('/^\'|\'$/', '', $value)); if (strtolower($value) == 'true') { // A boolean true value have been recognized. $value = 1; } elseif (strtolower($value) == 'false') { // A boolean false value have been recognized. $value = 0; } else { // Probably we have a string value, but also we have to check // possible string concatenations that may include string values // and other configuration variables. I this case we have to // get the calculated result of the concatenation. $implode_string = ' '; if (!strstr($value, '." ".') && strstr($value, '.$')) { // Yes, there is concatenation, insert a special separator string. $value = str_replace('.$', '." ".$', $value); $implode_string = ''; } // Split the concatenated values, if they are more than one. $sub_strings = explode('." ".', $value); // Seek for variables and retrieve their values. foreach ($sub_strings as $key => & $sub_string) { if (preg_match('/^\$[a-zA-Z_][a-zA-Z0-9_]*$/', $sub_string)) { // A variable has been detected, read it by recursive call. $sub_string = get_config_param(str_replace('$', '', $sub_string)); } } // Concatenate everything into the final, the calculated string value. $value = implode($implode_string, $sub_strings); } // Cache the result value. $configFile[$variable] = $value; $a = explode("'", $variable); $key_tmp = isset($a[1]) ? $a[1] : null; if ($key_tmp == $param) { $val = $value; } } } } } if($param == 'dbGlu' && empty($val)){ return '`.`'; } //Special treatment for dokeos_version parameter due to Dokeos 1.8.3 have the dokeos_version in the main/inc/installedVersion.inc.php file if ($param == 'dokeos_version') { //dokeos_version from configuration.php if empty $dokeos_version = $val; if (empty($dokeos_version)) { //checking the dokeos_version value exists in main/inc/installedVersion.inc.php if (file_exists($updatePath.'main/inc/installedVersion.inc.php')) { $updateFromInstalledVersionFile = $updatePath.'main/inc/installedVersion.inc.php'; require ($updateFromInstalledVersionFile); //there are only 2 variables here: $stable & $dokeos_version $stable = false; } } return $dokeos_version; } else { if (file_exists($updatePath.$updateFromConfigFile)) { return $val; } else { error_log('Config array could not be found in get_config_param()', 0); return null; } } } /* DATABASE RELATED FUNCTIONS */ /** * Gets a configuration parameter from the database. Returns returns null on failure. * @param string DB Host * @param string DB login * @param string DB pass * @param string DB name * @param string Name of param we want * @return mixed The parameter value or null if not found */ function get_config_param_from_db($host, $login, $pass, $db_name, $param = '') { Database::connect(array('server' => $host, 'username' => $login, 'password' => $pass)); Database::query("set session sql_mode='';"); // Disabling special SQL modes (MySQL 5) Database::select_db($db_name); if (($res = Database::query("SELECT * FROM settings_current WHERE variable = '$param'")) !== false) { if (Database::num_rows($res) > 0) { $row = Database::fetch_array($res); return $row['selected_value']; } } return null; } /** * Connects to the database server. */ function database_server_connect() { global $dbHostForm, $dbUsernameForm, $dbPassForm; if (($res = @Database::connect(array('server' => $dbHostForm, 'username' => $dbUsernameForm, 'password' => $dbPassForm))) === false) { $no = Database::errno(); $msg = Database::error(); echo '
#'.$no.': '.$msg.'
'; echo get_lang('DBServerDoesntWorkOrLoginPassIsWrong').'.

'. get_lang('PleaseCheckTheseValues').' :

'. ''.get_lang('DBHost').' : '.$dbHostForm.'
'. ''.get_lang('DBLogin').' : '.$dbUsernameForm.'
'. ''.get_lang('DBPassword').' : '.$dbPassForm.'

'. get_lang('PleaseGoBackToStep').' '. (defined('SYSTEM_INSTALLATION') ? '3' : '1').'.'. '

'. ''; exit (); } @Database::query("set session sql_mode='';"); // Disabling special SQL modes (MySQL 5) } /** * Database exists for the MYSQL user * @param type $database_name * @return boolean */ function database_exists($database_name) { if (empty($database_name)) { return false; } $select_database = @Database::select_db($database_name); $show_database = false; $sql = "SHOW DATABASES LIKE '".addslashes($database_name)."'"; $result = @Database::query($sql); if (Database::num_rows($result)) { $show_database = true; } return $select_database || $show_database; } /** * In step 3. Tests establishing connection to the database server. * If it's a single database environment the function checks if the database exist. * If the database doesn't exist we check the creation permissions. * * @return int 1 when there is no problem; * 0 when a new database is impossible to be created, then the single/multiple database configuration is impossible too * -1 when there is no connection established. */ function test_db_connect($dbHostForm, $dbUsernameForm, $dbPassForm, $singleDbForm, $dbPrefixForm, $dbNameForm) { $dbConnect = -1; //Checking user credentials if (@Database::connect(array('server' => $dbHostForm, 'username' => $dbUsernameForm, 'password' => $dbPassForm)) !== false) { $dbConnect = 1; } else { $dbConnect = -1; } return $dbConnect; //return 1, if no problems, "0" if, in case we can't create a new DB and "-1" if there is no connection. } /** * Fills the countries table with a list of countries. */ function fill_track_countries_table($track_countries_table) { $file_path = dirname(__FILE__).'/'.COUNTRY_DATA_FILENAME; $countries = file($file_path); $add_country_sql = "INSERT INTO $track_countries_table (id, code, country, counter) VALUES "; foreach ($countries as $line) { $elems = explode(',',$line); $add_country_sql .= '('.intval($elems[0]).',\''.Database::escape_string($elems[1]).'\',\''.Database::escape_string($elems[2]).'\','.intval($elems[3]).'),'; } $add_country_sql = substr($add_country_sql,0,-1); //$add_country_sql = "LOAD DATA INFILE '".Database::escape_string($file_path)."' INTO TABLE $track_countries_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\'';"; @ Database::query($add_country_sql); } /** * Creates the structure of the main database and fills it * with data. Placeholder symbols in the main database file * have to be replaced by the settings entered by the user during installation. * * @param array $installation_settings list of settings entered by the user * @param string optional path about the script for database * @return void */ function load_main_database($installation_settings, $db_script = '') { if (!empty($db_script)) { if (file_exists($db_script)) { $sql_text = file_get_contents($db_script); } } else { $db_script = api_get_path(SYS_CODE_PATH).'install/'.SYSTEM_MAIN_DATABASE_FILE; if (file_exists($db_script)) { $sql_text = file_get_contents($db_script); } } //replace symbolic parameters with user-specified values foreach ($installation_settings as $key => $value) { $sql_text = str_replace($key, Database::escape_string($value), $sql_text); } parse_sql_queries($sql_text); } /** * Creates the structure of the stats database * @param string Name of the file containing the SQL script inside the install directory */ function load_database_script($db_script) { $db_script = api_get_path(SYS_CODE_PATH).'install/'.$db_script; if (file_exists($db_script)) { $sql_text = file_get_contents($db_script); } parse_sql_queries($sql_text); } function parse_sql_queries($sql_text) { //split in array of sql strings $sql_instructions = array(); split_sql_file($sql_instructions, $sql_text); //execute the sql instructions $count = count($sql_instructions); for ($i = 0; $i < $count; $i++) { $this_sql_query = $sql_instructions[$i]['query']; Database::query($this_sql_query); //UTF8 fix see #5678 /* if (strpos(strtolower($this_sql_query), 'create table') === false) { Database::query($this_sql_query); } else { //$this_sql_query .= substr($this_sql_query, strlen($this_sql_query), strlen($this_sql_query)-1); $this_sql_query .= ' DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci '; Database::query($this_sql_query); }*/ } } /** * Function copied and adapted from phpMyAdmin 2.6.0 PMA_splitSqlFile (also GNU GPL) * Removes comment lines and splits up large sql files into individual queries * Last revision: September 23, 2001 - gandon * @param array the splitted sql commands * @param string the sql commands * @param integer the MySQL release number (because certains php3 versions * can't get the value of a constant from within a function) * @return boolean always true */ function split_sql_file(&$ret, $sql) { // do not trim, see bug #1030644 //$sql = trim($sql); $sql = rtrim($sql, "\n\r"); $sql_len = strlen($sql); $char = ''; $string_start = ''; $in_string = false; $nothing = true; $time0 = time(); for ($i = 0; $i < $sql_len; ++$i) { $char = $sql[$i]; // We are in a string, check for not escaped end of strings except for // backquotes that can't be escaped if ($in_string) { for (;;) { $i = strpos($sql, $string_start, $i); // No end of string found -> add the current substring to the // returned array if (!$i) { $ret[] = $sql; return true; } // Backquotes or no backslashes before quotes: it's indeed the // end of the string -> exit the loop elseif ($string_start == '`' || $sql[$i - 1] != '\\') { $string_start = ''; $in_string = false; break; } // one or more Backslashes before the presumed end of string... else { // ... first checks for escaped backslashes $j = 2; $escaped_backslash = false; while ($i - $j > 0 && $sql[$i - $j] == '\\') { $escaped_backslash = !$escaped_backslash; $j++; } // ... if escaped backslashes: it's really the end of the // string -> exit the loop if ($escaped_backslash) { $string_start = ''; $in_string = false; break; } // ... else loop else { $i++; } } // end if...elseif...else } // end for } // end if (in string) // lets skip comments (/*, -- and #) elseif (($char == '-' && $sql_len > $i + 2 && $sql[$i + 1] == '-' && $sql[$i + 2] <= ' ') || $char == '#' || ($char == '/' && $sql_len > $i + 1 && $sql[$i + 1] == '*')) { $i = strpos($sql, $char == '/' ? '*/' : "\n", $i); // didn't we hit end of string? if ($i === false) { break; } if ($char == '/') $i++; } // We are not in a string, first check for delimiter... elseif ($char == ';') { // if delimiter found, add the parsed part to the returned array $ret[] = array('query' => substr($sql, 0, $i), 'empty' => $nothing); $nothing = true; $sql = ltrim(substr($sql, min($i + 1, $sql_len))); $sql_len = strlen($sql); if ($sql_len) { $i = -1; } else { // The submited statement(s) end(s) here return true; } } // end elseif (is delimiter) // ... then check for start of a string,... elseif (($char == '"') || ($char == '\'') || ($char == '`')) { $in_string = true; $nothing = false; $string_start = $char; } // end elseif (is start of string) elseif ($nothing) { $nothing = false; } // loic1: send a fake header each 30 sec. to bypass browser timeout $time1 = time(); if ($time1 >= $time0 + 30) { $time0 = $time1; header('X-pmaPing: Pong'); } // end if } // end for // add any rest to the returned array if (!empty($sql) && preg_match('@[^[:space:]]+@', $sql)) { $ret[] = array('query' => $sql, 'empty' => $nothing); } return true; } // end of the 'split_sql_file()' function /** * Get an SQL file's contents * * This function bases its parsing on the pre-set format of the specific SQL files in * the install/upgrade procedure: * Lines starting with "--" are comments (but need to be taken into account as they also hold sections names) * Other lines are considered to be one-line-per-query lines (this is checked quickly by this function) * @param string File to parse (in the current directory) * @param string Section to return * @param boolean Print (true) or hide (false) error texts when they occur */ function get_sql_file_contents($file, $section, $print_errors = true) { //check given parameters if (empty($file)) { $error = "Missing name of file to parse in get_sql_file_contents()"; if ($print_errors) echo $error; return false; } if (!in_array($section, array('main', 'user', 'stats', 'scorm', 'course'))) { $error = "Section '$section' is not authorized in get_sql_file_contents()"; if ($print_errors) echo $error; return false; } $filepath = getcwd().'/'.$file; if (!is_file($filepath) or !is_readable($filepath)) { $error = "File $filepath not found or not readable in get_sql_file_contents()"; if ($print_errors) echo $error; return false; } //read the file in an array // Empty lines should not be executed as SQL statements, because errors occur, see Task #2167. $file_contents = file($filepath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); if (!is_array($file_contents) or count($file_contents) < 1) { $error = "File $filepath looks empty in get_sql_file_contents()"; if ($print_errors) echo $error; return false; } //prepare the resulting array $section_contents = array(); $record = false; foreach ($file_contents as $index => $line) { if (substr($line, 0, 2) == '--') { //This is a comment. Check if section name, otherwise ignore $result = array(); if (preg_match('/^-- xx([A-Z]*)xx/', $line, $result)) { //we got a section name here if ($result[1] == strtoupper($section)) { //we have the section we are looking for, start recording $record = true; } else { //we have another section's header. If we were recording, stop now and exit loop if ($record) { break; } $record = false; } } } else { if ($record) { if (!empty($line)) { $section_contents[] = $line; } } } } //now we have our section's SQL statements group ready, return return $section_contents; } /** * Adds a new document to the database - specific to version 1.8.0 * * @param array $_course * @param string $path * @param string $filetype * @param int $filesize * @param string $title * @return id if inserted document */ function add_document_180($_course, $path, $filetype, $filesize, $title, $comment = null) { $table_document = Database::get_course_table(TABLE_DOCUMENT, $_course['dbName']); $sql = "INSERT INTO $table_document (`path`,`filetype`,`size`,`title`, `comment`) VALUES ('$path','$filetype','$filesize','". Database::escape_string($title)."', '$comment')"; if (Database::query($sql)) { //display_message("Added to database (id ".Database::insert_id().")!"); return Database::insert_id(); } else { //display_error("The uploaded file could not be added to the database (".Database::error().")!"); return false; } } /* DISPLAY FUNCTIONS */ /** * This function prints class=active_step $current_step=$param * @author Patrick Cool , Ghent University */ function step_active($param) { global $current_step; if ($param == $current_step) { echo 'class="current_step" '; } } /** * This function displays the Step X of Y - * @return string String that says 'Step X of Y' with the right values */ function display_step_sequence() { global $current_step; return get_lang('Step'.$current_step).' – '; } /** * Displays a drop down box for selection the preferred language. */ function display_language_selection_box($name = 'language_list', $default_language = 'english') { // Reading language list. $language_list = get_language_folder_list(); /* // Reduction of the number of languages shown. Enable this fragment of code for customization purposes. // Modify the language list according to your preference. Don't exclude the 'english' item. $language_to_display = array('asturian', 'bulgarian', 'english', 'italian', 'french', 'slovenian', 'slovenian_unicode', 'spanish'); foreach ($language_list as $key => & $value) { if (!in_array($key, $language_to_display)) { unset($language_list[$key]); } } */ // Sanity checks due to the possibility for customizations. if (!is_array($language_list) || empty($language_list)) { $language_list = array('english' => 'English'); } // Sorting again, if it is necessary. //asort($language_list); // More sanity checks. if (!array_key_exists($default_language, $language_list)) { if (array_key_exists('english', $language_list)) { $default_language = 'english'; } else { $language_keys = array_keys($language_list); $default_language = $language_keys[0]; } } // Displaying the box. echo "\t\t\n"; } /** * This function displays a language dropdown box so that the installatioin * can be done in the language of the user */ function display_language_selection() { ?>

:

, Ghent University */ function display_requirements($installType, $badUpdatePath, $updatePath = '', $update_from_version_8 = array(), $update_from_version_6 = array()) { global $_setting; echo '

'.display_step_sequence().get_lang('Requirements')."

"; echo '
'; echo ''.get_lang('ReadThoroughly').'
'; echo get_lang('MoreDetails').' '.get_lang('ReadTheInstallGuide').'.
'."\n"; if ($installType == 'update') { echo get_lang('IfYouPlanToUpgradeFromOlderVersionYouMightWantToHaveAlookAtTheChangelog').'
'; } echo '
'; // SERVER REQUIREMENTS echo '

'.get_lang('ServerRequirements').'

'; echo '
'.get_lang('ServerRequirementsInfo').'
'; echo '
'; echo '
'.get_lang('PHPVersion').' >= '.REQUIRED_PHP_VERSION.' '; if (phpversion() < REQUIRED_PHP_VERSION) { echo ''.get_lang('PHPVersionError').''; } else { echo ''.get_lang('PHPVersionOK'). ' '.phpversion().''; } echo '
Session '.get_lang('support').' '.check_extension('session', get_lang('Yes'), get_lang('ExtensionSessionsNotAvailable')).'
MySQL '.get_lang('support').' '.check_extension('mysql', get_lang('Yes'), get_lang('ExtensionMySQLNotAvailable')).'
Zlib '.get_lang('support').' '.check_extension('zlib', get_lang('Yes'), get_lang('ExtensionZlibNotAvailable')).'
Perl-compatible regular expressions '.get_lang('support').' '.check_extension('pcre', get_lang('Yes'), get_lang('ExtensionPCRENotAvailable')).'
XML '.get_lang('support').' '.check_extension('xml', get_lang('Yes'), get_lang('No')).'
Multibyte string '.get_lang('support').' ('.get_lang('Optional').') '.check_extension('mbstring', get_lang('Yes'), get_lang('ExtensionMBStringNotAvailable'), true).'
Iconv '.get_lang('support').' ('.get_lang('Optional').') '.check_extension('iconv', get_lang('Yes'), get_lang('No'), true).'
Internationalization '.get_lang('support').' ('.get_lang('Optional').') '.check_extension('intl', get_lang('Yes'), get_lang('No'), true).'
GD '.get_lang('support').' '.check_extension('gd', get_lang('Yes'), get_lang('ExtensionGDNotAvailable')).'
JSON '.get_lang('support').' '.check_extension('json', get_lang('Yes'), get_lang('No')).'
LDAP '.get_lang('support').' ('.get_lang('Optional').') '.check_extension('ldap', get_lang('Yes'), get_lang('ExtensionLDAPNotAvailable'), true).'
Xapian '.get_lang('support').' ('.get_lang('Optional').') '.check_extension('xapian', get_lang('Yes'), get_lang('No'), true).'
cURL '.get_lang('support').' ('.get_lang('Optional').') '.check_extension('curl', get_lang('Yes'), get_lang('No'), true).'
'; echo '
'; echo '
'; // RECOMMENDED SETTINGS // Note: these are the settings for Joomla, does this also apply for Chamilo? // Note: also add upload_max_filesize here so that large uploads are possible echo '

'.get_lang('RecommendedSettings').'

'; echo '
'.get_lang('RecommendedSettingsInfo').'
'; echo '
'; echo '
'.get_lang('Setting').' '.get_lang('Recommended').' '.get_lang('Actual').'
Safe Mode '.check_php_setting('safe_mode','OFF').'
Display Errors '.check_php_setting('display_errors','OFF').'
File Uploads '.check_php_setting('file_uploads','ON').'
Magic Quotes GPC '.check_php_setting('magic_quotes_gpc','OFF').'
Magic Quotes Runtime '.check_php_setting('magic_quotes_runtime','OFF').'
Register Globals '.check_php_setting('register_globals','OFF').'
Session auto start '.check_php_setting('session.auto_start','OFF').'
Short Open Tag '.check_php_setting('short_open_tag','OFF').'
Cookie HTTP Only '.check_php_setting('session.cookie_httponly','ON').'
Maximum upload file size '.compare_setting_values(ini_get('upload_max_filesize'), REQUIRED_MIN_UPLOAD_MAX_FILESIZE).'
Maximum post size '.compare_setting_values(ini_get('post_max_size'), REQUIRED_MIN_POST_MAX_SIZE).'
Memory Limit '.compare_setting_values(ini_get('memory_limit'), REQUIRED_MIN_MEMORY_LIMIT).'
'; echo '
'; echo '
'; // DIRECTORY AND FILE PERMISSIONS echo '

'.get_lang('DirectoryAndFilePermissions').'

'; echo '
'.get_lang('DirectoryAndFilePermissionsInfo').'
'; echo '
'; $course_attempt_name = '__XxTestxX__'; $course_dir = api_get_path(SYS_COURSE_PATH).$course_attempt_name; //Just in case @unlink($course_dir.'/test.txt'); @rmdir($course_dir); $perms_dir = array(0777, 0755, 0775, 0770, 0750, 0700); $perms_fil = array(0666, 0644, 0664, 0660, 0640, 0600); $course_test_was_created = false; $dir_perm_verified = 0777; foreach ($perms_dir as $perm) { $r = @mkdir($course_dir, $perm); if ($r === true) { $dir_perm_verified = $perm; $course_test_was_created = true; break; } } $fil_perm_verified = 0666; if (is_dir($course_dir)) { foreach ($perms_fil as $perm) { $r = @touch($course_dir.'/test.txt',$perm); if ($r === true) { $fil_perm_verified = $perm; break; } } } @unlink($course_dir.'/test.txt'); @rmdir($course_dir); $_SESSION['permissions_for_new_directories'] = $_setting['permissions_for_new_directories'] = $dir_perm_verified; $_SESSION['permissions_for_new_files'] = $_setting['permissions_for_new_files'] = $fil_perm_verified; $dir_perm = Display::label('0'.decoct($dir_perm_verified), 'info'); $file_perm = Display::label('0'.decoct($fil_perm_verified), 'info'); $course_test_was_created = $course_test_was_created == true ? Display::label(get_lang('Yes'), 'success') : Display::label(get_lang('No'), 'warning'); echo ''. //' // // //'. //' // // //'. ''; echo '
chamilo/main/inc/conf/ '.check_writable('inc/conf/').'
chamilo/main/upload/users/ '.check_writable('upload/users/').'
chamilo/main/default_course_document/images/ '.check_writable('default_course_document/images/').'
chamilo/archive/ '.check_writable('../archive/').'
chamilo/courses/ '.check_writable('../courses/').'
'.get_lang('CourseTestWasCreated').' '.$course_test_was_created.'
'.get_lang('PermissionsForNewDirs').' '.$dir_perm.'
'.get_lang('PermissionsForNewFiles').' '.$file_perm.'
chamilo/home/ '.check_writable('../home/').'
chamilo/main/css/ '.check_writable('css/', true).' ('.get_lang('SuggestionOnlyToEnableCSSUploadFeature').')
chamilo/main/lang/ '.check_writable('lang/', true).' ('.get_lang('SuggestionOnlyToEnableSubLanguageFeature').')
chamilo/searchdb/'.check_writable('../searchdb/').'
'.session_save_path().''.(is_writable(session_save_path()) // ? ''.get_lang('Writable').'' // : ''.get_lang('NotWritable').'').'
'; echo '
'; echo '
'; if ($installType == 'update' && (empty($updatePath) || $badUpdatePath)) { if ($badUpdatePath) { ?>
!
Chamilo .
'; } ?>
:
The user would have to adjust the permissions manually if (count($notwritable) > 0) { $error = true; echo '
'; echo '

'.get_lang('Warning').'

'; printf(get_lang('NoWritePermissionPleaseReadInstallGuide'), ' ', ' '); echo '
'; echo '
    '; foreach ($notwritable as $value) { echo '
  • '.$value.'
  • '; } echo '
'; } // Check wether a Chamilo configuration file already exists. elseif (file_exists(api_get_path(CONFIGURATION_PATH).'configuration.php')) { echo '

'; echo get_lang('WarningExistingDokeosInstallationDetected'); echo '

'; } // And now display the choice buttons (go back or install) ?>

'.get_lang('UpgradeFromDokeos18x').''; echo ' '; echo '

'; } } /** * Displays the license (GNU GPL) as step 2, with * - an "I accept" button named step3 to proceed to step 3; * - a "Back" button named step1 to go back to the first step. */ function display_license_agreement() { echo '

'.display_step_sequence().get_lang('Licence').'

'; echo '

'.get_lang('DokeosLicenseInfo').'

'; echo '

'.get_lang('PrintVers').'

'; echo '
'; ?>



*'.get_lang('CompanyActivity').'
*'.get_lang('PersonRole').'
*'.get_lang('CompanyCountry').'
'.get_countries_list_from_array(true).'
'.get_lang('CompanyCity').'
'.get_lang('WhichLanguageWouldYouLikeToUseWhenContactingYou').'
'.get_lang('HaveYouThePowerToTakeFinancialDecisions').'
'.get_lang('Yes').' '.get_lang('No').'
 
 
*'.get_lang('FieldRequired').'
'; return $html; } /** * Displays a parameter in a table row. * Used by the display_database_settings_form function. * @param string Type of install * @param string Name of parameter * @param string Field name (in the HTML form) * @param string Field value * @param string Extra notice (to show on the right side) * @param boolean Whether to display in update mode * @param string Additional attribute for the element * @return void Direct output */ function display_database_parameter($install_type, $parameter_name, $form_field_name, $parameter_value, $extra_notice, $display_when_update = true, $tr_attribute = '') { echo ""; echo "$parameter_name  "; if ($install_type == INSTALL_TYPE_UPDATE && $display_when_update) { echo ''.$parameter_value.""; } else { $inputtype = $form_field_name == 'dbPassForm' ? 'password' : 'text'; //Slightly limit the length of the database prefix to avoid having to cut down the databases names later on $maxlength = $form_field_name == 'dbPrefixForm' ? '15' : MAX_FORM_FIELD_LENGTH; if ($install_type == INSTALL_TYPE_UPDATE) { echo ''; echo ''.api_htmlentities($parameter_value).""; } else { echo ''.""; echo "$extra_notice"; } } echo ""; } /** * Displays step 3 - a form where the user can enter the installation settings * regarding the databases - login and password, names, prefixes, single * or multiple databases, tracking or not... */ function display_database_settings_form($installType, $dbHostForm, $dbUsernameForm, $dbPassForm, $dbPrefixForm, $enableTrackingForm, $singleDbForm, $dbNameForm, $dbStatsForm, $dbScormForm, $dbUserForm) { if ($installType == 'update') { global $_configuration, $update_from_version_6; if (in_array($_POST['old_version'], $update_from_version_6)) { $dbHostForm = get_config_param('dbHost'); $dbUsernameForm = get_config_param('dbLogin'); $dbPassForm = get_config_param('dbPass'); $dbPrefixForm = get_config_param('dbNamePrefix'); $enableTrackingForm = get_config_param('is_trackingEnabled'); $singleDbForm = get_config_param('singleDbEnabled'); $dbHostForm = get_config_param('mainDbName'); $dbStatsForm = get_config_param('statsDbName'); $dbScormForm = get_config_param('scormDbName'); $dbUserForm = get_config_param('user_personal_database'); $dbScormExists = true; } else { $dbHostForm = $_configuration['db_host']; $dbUsernameForm = $_configuration['db_user']; $dbPassForm = $_configuration['db_password']; $dbPrefixForm = $_configuration['db_prefix']; $enableTrackingForm = $_configuration['tracking_enabled']; $singleDbForm = $_configuration['single_database']; $dbNameForm = $_configuration['main_database']; $dbStatsForm = $_configuration['statistics_database']; $dbScormForm = $_configuration['scorm_database']; $dbUserForm = $_configuration['user_personal_database']; $dbScormExists = true; } if (empty($dbScormForm)) { if ($singleDbForm) { $dbScormForm = $dbNameForm; } else { $dbScormForm = $dbPrefixForm.'scorm'; $dbScormExists = false; } } if (empty($dbUserForm)) { $dbUserForm = $singleDbForm ? $dbNameForm : $dbPrefixForm.'chamilo_user'; } echo '

' . display_step_sequence() .get_lang('DBSetting') . '

'; echo '
'; echo get_lang('DBSettingUpgradeIntro'); echo '
'; } else { if (empty($dbPrefixForm)) { //make sure there is a default value for db prefix $dbPrefixForm = ''; } echo '

' . display_step_sequence() .get_lang('DBSetting') . '

'; echo '
'; echo get_lang('DBSettingIntro'); echo '
'; } ?> '; $style = ''; if ($installType == INSTALL_TYPE_UPDATE) { $style = ''; } //Database Name fix replace weird chars if ($installType != INSTALL_TYPE_UPDATE) { $dbNameForm = str_replace(array('-','*', '$', ' ', '.'), '', $dbNameForm); $dbNameForm = replace_dangerous_char($dbNameForm); } display_database_parameter($installType, get_lang('MainDB'), 'dbNameForm', $dbNameForm, ' ', null, 'id="optional_param1" '.$style); //Only for updates we show this options if ($installType == INSTALL_TYPE_UPDATE) { display_database_parameter($installType, get_lang('StatDB'), 'dbStatsForm', $dbStatsForm, ' ', null, 'id="optional_param2" '.$style); if ($installType == INSTALL_TYPE_UPDATE && in_array($_POST['old_version'], $update_from_version_6)) { display_database_parameter($installType, get_lang('ScormDB'), 'dbScormForm', $dbScormForm, ' ', null, 'id="optional_param3" '.$style); } display_database_parameter($installType, get_lang('UserDB'), 'dbUserForm', $dbUserForm, ' ', null, 'id="optional_param4" '.$style); } ?>
 
'.get_lang('ADatabaseWithTheSameNameAlreadyExists').''; } else { if ($dbConnect == -1) { $database_exists_text = '
'.sprintf(get_lang('UserXCantHaveAccessInTheDatabaseX'), $dbUsernameForm, $dbNameForm).'
'; } else { //Try to create the database $user_can_create_databases = false; $multipleDbCheck = @Database::query("CREATE DATABASE ".mysql_real_escape_string($dbNameForm)); if ($multipleDbCheck !== false) { $multipleDbCheck = @Database::query("DROP DATABASE IF EXISTS ".mysql_real_escape_string($dbNameForm)); $user_can_create_databases = true; } if ($user_can_create_databases) { $database_exists_text = '
'.sprintf(get_lang('DatabaseXWillBeCreated'), $dbNameForm, $dbUsernameForm).'
'; } else { $dbConnect = 0; $database_exists_text = '
'.sprintf(get_lang('DatabaseXCantBeCreatedUserXDoestHaveEnoughPermissions'), $dbNameForm, $dbUsernameForm).'
'; } } } if ($dbConnect == 1): ?>
Database host:
Database server version:
Database client version:
Database protocol version:

Database error:
'; ?>
 
"; echo "$parameter_name"; if ($install_type == INSTALL_TYPE_UPDATE && $display_when_update) { echo ''.$parameter_value."\n"; } else { echo ''."\n"; } echo ""; } /** * Displays step 4 of the installation - configuration settings about Chamilo itself. */ function display_configuration_settings_form($installType, $urlForm, $languageForm, $emailForm, $adminFirstName, $adminLastName, $adminPhoneForm, $campusForm, $institutionForm, $institutionUrlForm, $encryptPassForm, $allowSelfReg, $allowSelfRegProf, $loginForm, $passForm) { if ($installType != 'update' && empty($languageForm)) { $languageForm = $_SESSION['install_language']; } echo '
'; echo "

" . display_step_sequence() . get_lang("CfgSetting") . "

"; echo '
'; echo '
'; echo '

'.get_lang('ConfigSettingsInfo').' main/inc/conf/configuration.php

'; echo '
'; echo '
'; echo ''.get_lang('Administrator').''; echo ''; //Parameter 1: administrator's login display_configuration_parameter($installType, get_lang('AdminLogin'), 'loginForm', $loginForm, $installType == 'update'); //Parameter 2: administrator's password if ($installType != 'update') { display_configuration_parameter($installType, get_lang('AdminPass'), 'passForm', $passForm, false); } //Parameters 3 and 4: administrator's names if (api_is_western_name_order()) { display_configuration_parameter($installType, get_lang('AdminFirstName'), 'adminFirstName', $adminFirstName); display_configuration_parameter($installType, get_lang('AdminLastName'), 'adminLastName', $adminLastName); } else { display_configuration_parameter($installType, get_lang('AdminLastName'), 'adminLastName', $adminLastName); display_configuration_parameter($installType, get_lang('AdminFirstName'), 'adminFirstName', $adminFirstName); } //Parameter 3: administrator's email display_configuration_parameter($installType, get_lang('AdminEmail'), 'emailForm', $emailForm); //Parameter 6: administrator's telephone display_configuration_parameter($installType, get_lang('AdminPhone'), 'adminPhoneForm', $adminPhoneForm); echo '
'; echo '
'; echo '
'; echo ''.get_lang('Platform').''; echo ''; //First parameter: language echo ""; echo '"; if ($installType == 'update') { echo '"; } else { // new installation echo '\n"; } echo "\n"; //Second parameter: Chamilo URL echo ""; echo '"; if ($installType == 'update') { echo '\n"; } else { echo '"; } echo ""; //Parameter 9: campus name display_configuration_parameter($installType, get_lang('CampusName'), 'campusForm', $campusForm); //Parameter 10: institute (short) name display_configuration_parameter($installType, get_lang('InstituteShortName'), 'institutionForm', $institutionForm); //Parameter 11: institute (short) name display_configuration_parameter($installType, get_lang('InstituteURL'), 'institutionUrlForm', $institutionUrlForm); ?>
'.get_lang('MainLang')."  '.$languageForm."'; display_language_selection_box('languageForm', $languageForm); echo "
'.get_lang('ChamiloURL').' ('.get_lang('ThisFieldIsRequired').")  '.api_htmlentities($urlForm, ENT_QUOTES)."'."
:
:
:
'.get_lang('FirstUseTip').''; echo '
'; echo ''.get_lang('SecurityAdvice').''; echo ': '; printf(get_lang('ToProtectYourSiteMakeXReadOnlyAndDeleteY'), 'main/inc/conf/', 'main/install/'); echo '
'; ?>
'; $country_select .= ''; foreach ($a_countries as $country) { $country_select .= ''; } $country_select .= ''; return $country_select; } return $a_countries; } /** * Lockis settings that can't be changed in other portals */ function locking_settings() { $access_url_locked_settings = api_get_locked_settings(); $table = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT); foreach ($access_url_locked_settings as $setting) { $sql = "UPDATE $table SET access_url_locked = 1 WHERE variable = '$setting'"; Database::query($sql); } } function update_dir_and_files_permissions() { $table = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT); $permissions_for_new_directories = isset($_SESSION['permissions_for_new_directories']) ? $_SESSION['permissions_for_new_directories'] : 0770; $permissions_for_new_files = isset($_SESSION['permissions_for_new_files']) ? $_SESSION['permissions_for_new_files'] : 0660; // use decoct() to store as string $sql = "UPDATE $table SET selected_value = '0".decoct($permissions_for_new_directories)."' WHERE variable = 'permissions_for_new_directories'"; Database::query($sql); $sql = "UPDATE $table SET selected_value = '0".decoct($permissions_for_new_files)."' WHERE variable = 'permissions_for_new_files'"; Database::query($sql); unset($_SESSION['permissions_for_new_directories']); unset($_SESSION['permissions_for_new_files']); } function compare_setting_values($current_value, $wanted_value) { $current_value_string = $current_value; $current_value = (float)$current_value; $wanted_value = (float)$wanted_value; if ($current_value >= $wanted_value) { return Display::label($current_value_string, 'success'); } else { return Display::label($current_value_string, 'important'); } }