, 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(translate('Writable'), 'success'); } else { if ($suggestion) { return Display::label(translate('NotWritable'), 'info'); } else { return Display::label(translate('NotWritable'), 'important'); } } } /** * This function checks if the given folder is writable */ function check_writable_root_path($folder, $suggestion = false) { if (is_writable(api_get_path(SYS_PATH).$folder)) { return Display::label(translate('Writable'), 'success'); } else { if ($suggestion) { return Display::label(translate('NotWritable'), 'info'); } else { return Display::label(translate('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)); } /** * 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 $singleDbForm; global $dbPrefixForm; global $dbNameForm; 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['SINGLE_DATABASE'] = true_false($singleDbForm); $config['{COURSE_TABLE_PREFIX}'] = ($singleDbForm ? 'crs_' : ''); $config['{DATABASE_GLUE}'] = ($singleDbForm ? '_' : '`.`'); $config['{DATABASE_PREFIX}'] = ''; $config['{DATABASE_MAIN}'] = $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, $_configuration; if (isset($_configuration[$param])) { return $_configuration[$param]; } else { 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 translate('DBServerDoesntWorkOrLoginPassIsWrong').'.

'. translate('PleaseCheckTheseValues').' :

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

'. translate('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 testDatabaseConnect($dbHostForm, $dbUsernameForm, $dbPassForm, $singleDbForm, $dbPrefixForm, $dbNameForm) { $connection = array( 'driver' => 'pdo_mysql', 'dbname' => $dbNameForm, 'user' => $dbUsernameForm, 'password' => $dbPassForm, 'host' => $dbHostForm, ); $config = new \Doctrine\DBAL\Configuration(); $conn = \Doctrine\DBAL\DriverManager::getConnection($connection, $config); try { $connect = $conn->connect(); $sm = $conn->getSchemaManager(); $databases = $sm->listDatabases(); if (in_array($dbNameForm, $databases)) { echo '
'.translate('ADatabaseWithTheSameNameAlreadyExists').'
'; } $database = new Database($conn); return $connect; } catch (Exception $e) { /*echo '
'; echo $e->getMessage(); echo '
';*/ return -1; } } /** * 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 = '') { $sql_text = null; 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']; //UTF8 fix see #5678 if (strpos(strtolower($this_sql_query), 'create table') === false) { iDatabase::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 '; iDatabase::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 translate('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(); // 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() { ?>

:

trans($variable); } /** * This function displays the requirements for installing Chamilo. * * @param string $installType * @param boolean $badUpdatePath * @param string The updatePath given (if given) * @param array $update_from_version_8 The different subversions from version 1.8 * @param array $update_from_version_6 The different subversions from version 1.6 * * @author Julio Montoya * @author Patrick Cool , Ghent University */ function display_requirements($app, $installType) { $html = null; $html .= '
'; $html .= ''.translate('ReadThoroughly').'
'; $html .= translate('MoreDetails').' '.translate('ReadTheInstallGuide').'.
'; if ($installType == 'update') { $html .= translate('IfYouPlanToUpgradeFromOlderVersionYouMightWantToHaveAlookAtTheChangelog').'
'; } $html .= '
'; // SERVER REQUIREMENTS $html .= '

'.translate('ServerRequirements').'

'; $html .= '
'.translate('ServerRequirementsInfo').'
'; $html .= '
'; $html .= '
'.translate('PHPVersion').' >= '.REQUIRED_PHP_VERSION.' '; if (phpversion() < REQUIRED_PHP_VERSION) { $html .= ''.translate('PHPVersionError').''; } else { $html .= ''.translate('PHPVersionOK').' '.phpversion().''; } $html .= '
Session '.translate('support').' '.check_extension('session',translate('Yes'), translate('ExtensionSessionsNotAvailable')).'
MySQL '.translate('support').' '.check_extension('mysql', translate('Yes'), translate('ExtensionMySQLNotAvailable') ).'
Zlib '.translate('support').' '.check_extension('zlib', translate('Yes'), translate('ExtensionZlibNotAvailable') ).'
Perl-compatible regular expressions '.translate( 'support' ).' '.check_extension( 'pcre', translate('Yes'), translate('ExtensionPCRENotAvailable') ).'
XML '.translate( 'support' ).' '.check_extension('xml', translate('Yes'), translate('No')).'
Multibyte string '.translate( 'support' ).' ('.translate('Optional').') '.check_extension( 'mbstring', translate('Yes'), translate('ExtensionMBStringNotAvailable'), true ).'
Iconv '.translate( 'support' ).' ('.translate('Optional').') '.check_extension('iconv', translate('Yes'), translate('No'), true).'
Internationalization '.translate( 'support' ).' ('.translate('Optional').') '.check_extension('intl', translate('Yes'), translate('No'), true).'
GD '.translate( 'support' ).' '.check_extension( 'gd', translate('Yes'), translate('ExtensionGDNotAvailable') ).'
ImageMagick '.translate( 'support' ).' ('.translate('Optional').') '.check_extension('imagick', translate('Yes'), translate('No'), true).'
JSON '.translate('support').' '.check_extension('json', translate('Yes'), translate('No')).'
LDAP '.translate( 'support' ).' ('.translate('Optional').') '.check_extension( 'ldap', translate('Yes'), translate('ExtensionLDAPNotAvailable'), true ).'
Xapian '.translate( 'support' ).' ('.translate('Optional').') '.check_extension('xapian', translate('Yes'), translate('No'), true).'
cURL '.translate( 'support' ).' ('.translate('Optional').') '.check_extension('curl', translate('Yes'), translate('No'), true).'
'; $html .= '
'; $html .= '
'; // 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 $html .= '

'.translate('RecommendedSettings').'

'; $html .= '
'.translate('RecommendedSettingsInfo').'
'; $html .= '
'; $html .= '
'.translate('Setting').' '.translate('Recommended').' '.translate('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 ).'
'; $html .= '
'; $html .= '
'; // DIRECTORY AND FILE PERMISSIONS $html .= '

'.translate('DirectoryAndFilePermissions').'

'; $html .= '
'.translate('DirectoryAndFilePermissionsInfo').'
'; $html .= '
'; $course_attempt_name = '__XxTestxX__'; $course_dir = api_get_path(SYS_COURSE_PATH).$course_attempt_name; // Just in case. if (is_file($course_dir.'/test.txt')) { unlink($course_dir.'/test.txt'); } if (is_dir($course_dir)) { 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; $file_course_test_was_created = false; if (is_dir($course_dir)) { foreach ($perms_fil as $perm) { if ($file_course_test_was_created == true) { break; } $r = touch($course_dir.'/test.php', $perm); if ($r === true) { $fil_perm_verified = $perm; if (check_course_script_interpretation($course_dir, $course_attempt_name, 'test.php')) { $file_course_test_was_created = true; } } } } @unlink($course_dir.'/test.php'); @rmdir($course_dir); $app['session']->set('permissions_for_new_directories', decoct($dir_perm_verified)); $app['session']->set('permissions_for_new_files', decoct($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 && $file_course_test_was_created == true) ? Display::label(translate('Yes'), 'success') : Display::label(translate('No'), 'important'); $html .= ''; $html .= '
[chamilo]/config '.check_writable_root_path('config/').'
[chamilo]/data '.check_writable_root_path('data').'
[chamilo]/logs '.check_writable_root_path('logs').'
'.translate('CourseTestWasCreated').' '.$course_test_was_created.'
'.translate('PermissionsForNewDirs').' '.$dir_perm.'
'.translate('PermissionsForNewFiles').' '.$file_perm.'
'; $html .= '
'; $html .= '
'; $error = false; // First, attempt to set writing permissions if we don't have them yet $perm = $app['session']->get('permissions_for_new_directories'); $perm_file = $app['session']->get('permissions_for_new_files'); $notwritable = array(); $checked_writable = api_get_path(SYS_CONFIG_PATH); if (!is_writable($checked_writable)) { $notwritable[] = $checked_writable; @chmod($checked_writable, $perm); } $checked_writable = api_get_path(SYS_DATA_PATH); if (!is_writable($checked_writable)) { $notwritable[] = $checked_writable; @chmod($checked_writable, $perm); } $checked_writable = api_get_path(SYS_DEFAULT_COURSE_DOCUMENT_PATH).'images/'; if (!is_writable($checked_writable)) { $notwritable[] = $checked_writable; @chmod($checked_writable, $perm); } $checked_writable = api_get_path(SYS_ARCHIVE_PATH); if (!is_writable($checked_writable)) { $notwritable[] = $checked_writable; @chmod($checked_writable, $perm); } $checked_writable = api_get_path(SYS_LOG_PATH); if (!is_writable($checked_writable)) { $notwritable[] = $checked_writable; @chmod($checked_writable, $perm); } /*$checked_writable = api_get_path(SYS_COURSE_PATH); if (!is_writable($checked_writable)) { $notwritable[] = $checked_writable; @chmod($checked_writable, $perm); }*/ if ($course_test_was_created == false || $file_course_test_was_created == false) { $error = true; } /*$checked_writable = api_get_path(SYS_PATH).'home/'; if (!is_writable($checked_writable)) { $notwritable[] = realpath($checked_writable); @chmod($checked_writable, $perm); }*/ /*$checked_writable = api_get_path(CONFIGURATION_PATH).'configuration.php'; if (file_exists($checked_writable) && !is_writable($checked_writable)) { $notwritable[] = $checked_writable; @chmod($checked_writable, $perm_file); }*/ // Second, if this fails, report an error // The user would have to adjust the permissions manually if (count($notwritable) > 0) { $html .= '
'; $html .= '

'.translate('Warning').'

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

'; $html .= translate('WarningExistingDokeosInstallationDetected'); $html .= '

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

'.translate('UpgradeFromDokeos18x').''; echo ' '; echo '

';*/ return $html; } /** * 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().translate('Licence').'

'; echo '

'.translate('DokeosLicenseInfo').'

'; echo '

'.translate('PrintVers').'

'; echo '
'; ?>



*'.translate('CompanyActivity').'
*'.translate('PersonRole').'
*'.translate('CompanyCountry').'
'.get_countries_list_from_array(true).'
'.translate('CompanyCity').'
'.translate('WhichLanguageWouldYouLikeToUseWhenContactingYou').'
'.translate('HaveYouThePowerToTakeFinancialDecisions').'
'.translate( 'Yes' ).' '.translate('No').'
 
 
*'.translate('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 ) { 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 = isset($_configuration['tracking_enabled']) ? $_configuration['tracking_enabled'] : null; $singleDbForm = isset($_configuration['single_database']) ? $_configuration['single_database'] : null; $dbNameForm = $_configuration['main_database']; $dbStatsForm = isset($_configuration['statistics_database']) ? $_configuration['statistics_database'] : null; $dbScormForm = isset($_configuration['scorm_database']) ? $_configuration['scorm_database'] : null; $dbUserForm = isset($_configuration['user_personal_database']) ? $_configuration['user_personal_database'] : null; $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().translate('DBSetting').'

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

'.display_step_sequence().translate('DBSetting').'

'; echo '
'; echo translate('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 = api_replace_dangerous_char($dbNameForm); } display_database_parameter( $installType, translate('MainDB'), 'dbNameForm', $dbNameForm, ' ', null, 'id="optional_param1" '.$style ); ?>
 
'.sprintf( translate('DatabaseXWillBeCreated'), $dbNameForm, $dbUsernameForm ).''; } else { $dbConnect = 0; $database_exists_text = '
'.sprintf( translate('DatabaseXCantBeCreatedUserXDoestHaveEnoughPermissions'), $dbNameForm, $dbUsernameForm ).'
'; } } else { echo '
'.sprintf( translate('UserXCantHaveAccessInTheDatabaseX'), $dbUsernameForm, $dbNameForm ).'
'; } if ($dbConnect == 1): ?>

 
"; 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().translate("CfgSetting")."

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

'.translate('ConfigSettingsInfo').' '.Display::label('config/configuration.php', 'info').'

'; echo '
'; echo '
'; echo ''.translate('Administrator').''; echo ''; //Parameter 1: administrator's login display_configuration_parameter( $installType, translate('AdminLogin'), 'loginForm', $loginForm, $installType == 'update' ); //Parameter 2: administrator's password if ($installType != 'update') { display_configuration_parameter($installType, translate('AdminPass'), 'passForm', $passForm, false); } //Parameters 3 and 4: administrator's names if (api_is_western_name_order()) { display_configuration_parameter($installType, translate('AdminFirstName'), 'adminFirstName', $adminFirstName); display_configuration_parameter($installType, translate('AdminLastName'), 'adminLastName', $adminLastName); } else { display_configuration_parameter($installType, translate('AdminLastName'), 'adminLastName', $adminLastName); display_configuration_parameter($installType, translate('AdminFirstName'), 'adminFirstName', $adminFirstName); } //Parameter 3: administrator's email display_configuration_parameter($installType, translate('AdminEmail'), 'emailForm', $emailForm); //Parameter 6: administrator's telephone display_configuration_parameter($installType, translate('AdminPhone'), 'adminPhoneForm', $adminPhoneForm); echo '
'; echo '
'; echo '
'; echo ''.translate('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, translate('CampusName'), 'campusForm', $campusForm); //Parameter 10: institute (short) name display_configuration_parameter($installType, translate('InstituteShortName'), 'institutionForm', $institutionForm); //Parameter 11: institute (short) name display_configuration_parameter($installType, translate('InstituteURL'), 'institutionUrlForm', $institutionUrlForm); ?>
'.translate('MainLang')."  '.$languageForm."'; display_language_selection_box('languageForm', $languageForm); echo "
'.translate('ChamiloURL').' ('.translate( 'ThisFieldIsRequired' ).")  '.api_htmlentities($urlForm, ENT_QUOTES)."'."
:
:
:
'.translate('FirstUseTip').''; echo '
'; echo ''.translate('SecurityAdvice').''; echo ': '; printf(translate('ToProtectYourSiteMakeXReadOnlyAndDeleteY'), 'main/inc/conf/', 'main/install/'); echo '
'; ?>
'; $country_select .= ''; foreach ($a_countries as $country) { $country_select .= ''; } $country_select .= ''; return $country_select; } return $a_countries; } /** * Locking 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'); } } function check_course_script_interpretation($course_dir, $course_attempt_name, $file = 'test.php'){ $output = false; //Write in file $file_name = $course_dir.'/'.$file; $content = ' api_get_path(SYS_DATA_PATH).'searchdb', $sysPath.'home' => api_get_path(SYS_DATA_PATH).'home', $sysPath.'courses' => api_get_path(SYS_DATA_PATH).'courses', $sysPath.'main/upload/users' => api_get_path(SYS_DATA_PATH).'upload/users', ); error_log("Copying files to the new data folder"); foreach ($moveDirs as $from => $to) { if (is_dir($from)) { $copy = "cp -r $from/* $to"; error_log($copy); system($copy); } } }