<?php
/* For licensing terms, see /license.txt */
/**
==============================================================================
* Chamilo LMS
* This file contains functions used by the install and upgrade scripts.
*
* Ideas for future additions:
* - a function get_old_version_settings to retrieve the config file settings
* of older versions before upgrading.
==============================================================================
*/
/*
==============================================================================
CONSTANTS
==============================================================================
*/
define('SYSTEM_MAIN_DATABASE_FILE', 'dokeos_main.sql');
define('COUNTRY_DATA_FILENAME', 'country_data.csv');
define('COURSES_HTACCESS_FILENAME', 'htaccess.dist');
define('SYSTEM_CONFIG_FILENAME', 'configuration.dist.php');
/*
==============================================================================
COMMON PURPOSE FUNCTIONS
==============================================================================
*/
/**
* 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 < patrick.cool @ UGent . be > , Ghent University
* @author Yannick Warnier < yannick.warnier @ dokeos . com >
* @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 '< strong > < font color = "green" > '.$return_success.'< / font > < / strong > ';
} else {
if ($optional) {
return '< strong > < font color = "#ff9900" > '.$return_failure.'< / font > < / strong > ';
} else {
return '< strong > < font color = "red" > '.$return_failure.'< / font > < / strong > ';
}
}
}
/**
* This function checks whether a php setting matches the recommended value
*
* @author Patrick Cool < patrick.cool @ UGent . be > , 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 '< strong > < font color = "green" > '.$current_php_value.' '.$return_success.'< / font > < / strong > ';
} else {
return '< strong > < font color = "red" > '.$current_php_value.' '.$return_failure.'< / font > < / strong > ';
}
}
/**
* 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 < http: / / www . joomla . org >
*/
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' => 'euskera',
'fa' => 'persian',
'fr' => 'french',
'fur' => 'friulian',
'gl' => 'galician',
'ka' => 'georgian',
'hr' => 'croatian',
'he' => 'hebrew',
'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' => 'turkce',
'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('../'.$folder)) {
return '< strong > < font color = "green" > '.get_lang('Writable').'< / font > < / strong > ';
} else {
if ($suggestion) {
return '< strong > < font color = "#ff9900" > '.get_lang('NotWritable').'< / font > < / strong > ';
} else {
return '< strong > < font color = "red" > '.get_lang('NotWritable').'< / font > < / strong > ';
}
}
}
/**
* 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) {
$fp = fopen($filename, 'rb');
$buffer = fread($fp, filesize($filename));
fclose($fp);
return explode('< br / > ', 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) {
$file_path = dirname(__FILE__).'/'.COURSES_HTACCESS_FILENAME;
$content = file_get_contents($file_path);
$content = str_replace('{DOKEOS_URL_APPEND_PATH}', $url_append, $content);
$fp = @ fopen('../../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}'] = $dbPrefixForm;
$config['{DATABASE_MAIN}'] = $dbNameForm;
$config['{DATABASE_STATS}'] = (($singleDbForm & & empty($dbStatsForm)) ? $dbNameForm : $dbStatsForm);
$config['{DATABASE_SCORM}'] = (($singleDbForm & & empty($dbScormForm)) ? $dbNameForm : $dbScormForm);
$config['{DATABASE_PERSONAL}'] =(($singleDbForm & & empty($dbUserForm)) ? $dbNameForm : $dbUserForm);
$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 '< strong > < font color = "red" > Your script doesn\'t have write access to the config directory< / font > < / strong > < br / >
< em > ('.str_replace('\\', '/', realpath($path)).')< / em > < br / > < br / >
You probably do not have write access on Chamilo root directory,
i.e. you should < em > CHMOD 777< / em > or < em > 755< / em > or < em > 775< / em > .< br / > < br / >
Your problems can be related on two possible causes:< br / >
< ul >
< li > Permission problems.< br / > Try initially with < em > chmod -R 777< / em > and increase restrictions gradually.< / li >
< li > PHP is running in < a href = "http://www.php.net/manual/en/features.safe-mode.php" target = "_blank" > Safe-Mode< / a > . If possible, try to switch it off.< / li >
< / ul >
< a href = "http://forum.chamilo.org/" target = "_blank" > Read about this problem in Support Forum< / a > < br / > < br / >
Please go back to step 5.
< p > < input type = "submit" name = "step5" value = "< Back" / > < / p >
< / td > < / tr > < / table > < / form > < / body > < / html > ';
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'];
}
$updatePath = 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('Could not find config file in '.$updatePath.' in get_config_param()', 0);
return null;
}
}
if (file_exists($updatePath.'main/inc/installedVersion.inc.php')) {
$updateFromInstalledVersionFile = $updatePath.'main/inc/installedVersion.inc.php';
} elseif (file_exists($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 = $a[1];
if ($key_tmp == $param) {
$val = $value;
}
}
}
}
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 '< hr / > #'.$no.': '.$msg.'< hr / > ';
echo get_lang('DBServerDoesntWorkOrLoginPassIsWrong').'.< br / > < br / > '.
get_lang('PleaseCheckTheseValues').' :< br / > < br / > '.
'< strong > '.get_lang('DBHost').'< / strong > : '.$dbHostForm.'< br / > '.
'< strong > '.get_lang('DBLogin').'< / strong > : '.$dbUsernameForm.'< br / > '.
'< strong > '.get_lang('DBPassword').'< / strong > : '.$dbPassForm.'< br / > < br / > '.
get_lang('PleaseGoBackToStep').' '. (defined('SYSTEM_INSTALLATION') ? '3' : '1').'.'.
'< p > < button type = "submit" class = "back" name = "step'. (defined('SYSTEM_INSTALLATION') ? '3' : '1').'" value = "< '.get_lang('Back').'" > '.get_lang('Back').'< / button > < / p > '.
'< / td > < / tr > < / table > < / form > < / body > < / html > ';
exit ();
}
@Database::query("set session sql_mode='';"); // Disabling special SQL modes (MySQL 5)
}
/**
* In step 3. Tests establishing connection to the database server. Tests also the possibility for multiple databases configuration.
* @return int 1 when there is no problem;
* 0 when a new database is impossible to be created, then the multiple databases configuration is impossible too;
* -1 when there is no connection established.
*/
function test_db_connect($dbHostForm, $dbUsernameForm, $dbPassForm, $singleDbForm, $dbPrefixForm) {
$dbConnect = -1;
if ($singleDbForm == 1) {
if (@Database::connect(array('server' => $dbHostForm, 'username' => $dbUsernameForm, 'password' => $dbPassForm)) !== false) {
$dbConnect = 1;
} else {
$dbConnect = -1;
}
} elseif ($singleDbForm == 0) {
if (@Database::connect(array('server' => $dbHostForm, 'username' => $dbUsernameForm, 'password' => $dbPassForm)) !== false) {
@Database::query("set session sql_mode='';"); // Disabling special SQL modes (MySQL 5)
$multipleDbCheck = @Database::query("CREATE DATABASE ".$dbPrefixForm."test_chamilo_connection");
if ($multipleDbCheck !== false) {
$multipleDbCheck = @Database::query("DROP DATABASE IF EXISTS ".$dbPrefixForm."test_chamilo_connection");
if ($multipleDbCheck !== false) {
$dbConnect = 1;
} else {
$dbConnect = 0;
}
} else {
$dbConnect = 0;
}
} else {
$dbConnect = -1;
}
}
return $dbConnect; //return "1"if no problems, "0" if, in case of multiDB 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;
$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)) {
$sql_text = file_get_contents($db_script);
} else {
$sql_text = file_get_contents(SYSTEM_MAIN_DATABASE_FILE);
}
//replace symbolic parameters with user-specified values
foreach ($installation_settings as $key => $value) {
$sql_text = str_replace($key, Database::escape_string($value), $sql_text);
}
//split in array of sql strings
$sql_instructions = array();
$success = 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);
}
}
/**
* 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) {
$sql_text = file_get_contents($db_script);
//split in array of sql strings
$sql_instructions = array();
$success = 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);
}
}
/**
* 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
$file_contents = file($filepath);
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 < patrick.cool @ UGent . be > , 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;
global $total_steps;
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< select name = \"$name\" > \n";
foreach ($language_list as $key => $value) {
if ($key == $default_language) {
$option_end = ' selected="selected">';
} else {
$option_end = '>';
}
echo "\t\t\t< option value = \"$key\"$option_end";
echo $value;
echo "< / option > \n";
}
echo "\t\t< / select > \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() { ?>
< h1 > <?php get_lang ( 'WelcomeToTheDokeosInstaller' ); ?> </ h1 >
< h2 > <?php echo display_step_sequence (); ?><?php echo get_lang ( 'InstallationLanguage' ); ?> </ h2 >
< p > <?php echo get_lang ( 'PleaseSelectInstallationProcessLanguage' ); ?> :</ p >
< form id = "lang_form" method = "post" action = " <?php echo api_get_self (); ?> " >
<?php display_language_selection_box ( 'language_list' , api_get_interface_language ()); ?>
< button type = "submit" name = "step1" class = "next" value = " <?php get_lang ( 'Next' ); ?> >" > <?php echo get_lang ( 'Next' ); ?> </ button >
< input type = "hidden" name = "is_executable" id = "is_executable" value = "-" / >
< / form >
<?php
}
/**
* This function displays the requirements for installing Dokeos.
*
* @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 unknow
* @author Patrick Cool < patrick.cool @ UGent . be > , Ghent University
*/
function display_requirements($installType, $badUpdatePath, $updatePath = '', $update_from_version_8 = array(), $update_from_version_6 = array()) {
echo '< h2 > '.display_step_sequence().get_lang('Requirements')."< / h2 > \n";
echo '< strong > '.get_lang('ReadThoroughly').'< / strong > < br / > ';
echo get_lang('MoreDetails').' < a href = "../../documentation/installation_guide.html" target = "_blank" > '.get_lang('ReadTheInstallGuide').'< / a > .< br / > '."\n";
// SERVER REQUIREMENTS
echo '< div class = "RequirementHeading" > < h1 > '.get_lang('ServerRequirements').'< / h1 > ';
echo '< div class = "RequirementText" > '.get_lang('ServerRequirementsInfo').'< / div > ';
echo '< div class = "RequirementContent" > ';
echo '< table class = "requirements" >
< tr >
< td class = "requirements-item" > '.get_lang('PHPVersion').'>= 5.0< / td >
< td class = "requirements-value" > ';
if (phpversion() < '5.0') {
echo '< strong > < font color = "red" > '.get_lang('PHPVersionError').'< / font > < / strong > ';
} else {
echo '< strong > < font color = "green" > '.get_lang('PHPVersionOK'). ' '.phpversion().'< / font > < / strong > ';
}
echo ' < / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/en/book.session.php" target = "_blank" > Session< / a > '.get_lang('support').'< / td >
< td class = "requirements-value" > '.check_extension('session', get_lang('Yes'), get_lang('ExtensionSessionsNotAvailable')).'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/en/book.mysql.php" target = "_blank" > MySQL< / a > '.get_lang('support').'< / td >
< td class = "requirements-value" > '.check_extension('mysql', get_lang('Yes'), get_lang('ExtensionMySQLNotAvailable')).'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/en/book.zlib.php" target = "_blank" > Zlib< / a > '.get_lang('support').'< / td >
< td class = "requirements-value" > '.check_extension('zlib', get_lang('Yes'), get_lang('ExtensionZlibNotAvailable')).'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/en/book.pcre.php" target = "_blank" > Perl-compatible regular expressions< / a > '.get_lang('support').'< / td >
< td class = "requirements-value" > '.check_extension('pcre', get_lang('Yes'), get_lang('ExtensionPCRENotAvailable')).'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/en/book.xml.php" target = "_blank" > XML< / a > '.get_lang('support').'< / td >
< td class = "requirements-value" > '.check_extension('xml', get_lang('Yes'), get_lang('No')).'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/en/book.mbstring.php" target = "_blank" > Multibyte string< / a > '.get_lang('support').' ('.get_lang('Optional').')< / td >
< td class = "requirements-value" > '.check_extension('mbstring', get_lang('Yes'), get_lang('ExtensionMBStringNotAvailable'), true).'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/en/book.iconv.php" target = "_blank" > Iconv< / a > '.get_lang('support').' ('.get_lang('Optional').')< / td >
< td class = "requirements-value" > '.check_extension('iconv', get_lang('Yes'), get_lang('No'), true).'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/en/book.intl.php" target = "_blank" > Internationalization< / a > '.get_lang('support').' ('.get_lang('Optional').')< / td >
< td class = "requirements-value" > '.check_extension('intl', get_lang('Yes'), get_lang('No'), true).'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/en/book.image.php" target = "_blank" > GD< / a > '.get_lang('support').'< / td >
< td class = "requirements-value" > '.check_extension('gd', get_lang('Yes'), get_lang('ExtensionGDNotAvailable')).'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/en/book.json.php" target = "_blank" > JSON< / a > '.get_lang('support').'< / td >
< td class = "requirements-value" > '.check_extension('json', get_lang('Yes'), get_lang('No')).'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/en/book.ldap.php" target = "_blank" > LDAP< / a > '.get_lang('support').' ('.get_lang('Optional').')< / td >
< td class = "requirements-value" > '.check_extension('ldap', get_lang('Yes'), get_lang('ExtensionLDAPNotAvailable'), true).'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://xapian.org/" target = "_blank" > Xapian< / a > '.get_lang('support').' ('.get_lang('Optional').')< / td >
< td class = "requirements-value" > '.check_extension('xapian', get_lang('Yes'), get_lang('No'), true).'< / td >
< / tr >
< / table > ';
echo ' < / div > ';
echo '< / div > ';
// RECOMMENDED SETTINGS
// Note: these are the settings for Joomla, does this also apply for Dokeos?
// Note: also add upload_max_filesize here so that large uploads are possible
echo '< div class = "RequirementHeading" > < h1 > '.get_lang('RecommendedSettings').'< / h1 > ';
echo '< div class = "RequirementText" > '.get_lang('RecommendedSettingsInfo').'< / div > ';
echo '< div class = "RequirementContent" > ';
echo '< table class = "requirements" >
< tr >
< th > '.get_lang('Setting').'< / th >
< th > '.get_lang('Recommended').'< / th >
< th > '.get_lang('Actual').'< / th >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/features.safe-mode.php" > Safe Mode< / a > < / td >
< td class = "requirements-recommended" > OFF< / td >
< td class = "requirements-value" > '.check_php_setting('safe_mode','OFF').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/ref.errorfunc.php#ini.display-errors" > Display Errors< / a > < / td >
< td class = "requirements-recommended" > OFF< / td >
< td class = "requirements-value" > '.check_php_setting('display_errors','OFF').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/ini.core.php#ini.file-uploads" > File Uploads< / a > < / td >
< td class = "requirements-recommended" > ON< / td >
< td class = "requirements-value" > '.check_php_setting('file_uploads','ON').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/ref.info.php#ini.magic-quotes-gpc" > Magic Quotes GPC< / a > < / td >
< td class = "requirements-recommended" > OFF< / td >
< td class = "requirements-value" > '.check_php_setting('magic_quotes_gpc','OFF').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/ref.info.php#ini.magic-quotes-runtime" > Magic Quotes Runtime< / a > < / td >
< td class = "requirements-recommended" > OFF< / td >
< td class = "requirements-value" > '.check_php_setting('magic_quotes_runtime','OFF').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/security.globals.php" > Register Globals< / a > < / td >
< td class = "requirements-recommended" > OFF< / td >
< td class = "requirements-value" > '.check_php_setting('register_globals','OFF').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/ref.session.php#ini.session.auto-start" > Session auto start< / a > < / td >
< td class = "requirements-recommended" > OFF< / td >
< td class = "requirements-value" > '.check_php_setting('session.auto_start','OFF').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/ini.core.php#ini.short-open-tag" > Short Open Tag< / a > < / td >
< td class = "requirements-recommended" > OFF< / td >
< td class = "requirements-value" > '.check_php_setting('short_open_tag','OFF').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/ini.core.php#ini.upload-max-filesize" > Maximum upload file size< / a > < / td >
< td class = "requirements-recommended" > 10M-100M< / td >
< td class = "requirements-value" > '.ini_get('upload_max_filesize').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > < a href = "http://php.net/manual/ini.core.php#ini.post-max-size" > Maximum post size< / a > < / td >
< td class = "requirements-recommended" > 10M-100M< / td >
< td class = "requirements-value" > '.ini_get('post_max_size').'< / td >
< / tr >
< / table > ';
echo ' < / div > ';
echo '< / div > ';
// DIRECTORY AND FILE PERMISSIONS
echo '< div class = "RequirementHeading" > < h1 > '.get_lang('DirectoryAndFilePermissions').'< / h1 > ';
echo '< div class = "RequirementText" > '.get_lang('DirectoryAndFilePermissionsInfo').'< / div > ';
echo '< div class = "RequirementContent" > ';
echo '< table class = "requirements" >
< tr >
< td class = "requirements-item" > chamilo/main/inc/conf/< / td >
< td class = "requirements-value" > '.check_writable('inc/conf/').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > chamilo/main/upload/users/< / td >
< td class = "requirements-value" > '.check_writable('upload/users/').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > chamilo/main/default_course_document/images/< / td >
< td class = "requirements-value" > '.check_writable('default_course_document/images/').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > chamilo/archive/< / td >
< td class = "requirements-value" > '.check_writable('../archive/').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > chamilo/courses/< / td >
< td class = "requirements-value" > '.check_writable('../courses/').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > chamilo/home/< / td >
< td class = "requirements-value" > '.check_writable('../home/').'< / td >
< / tr >
< tr >
< td class = "requirements-item" > chamilo/main/css/< / td >
< td class = "requirements-value" > '.check_writable('css/',true).' ('.get_lang('SuggestionOnlyToEnableCSSUploadFeature').')< / td >
< / tr >
< tr >
< td class = "requirements-item" > chamilo/main/lang/< / td >
< td class = "requirements-value" > '.check_writable('lang/',true).' ('.get_lang('SuggestionOnlyToEnableSubLanguageFeature').')< / td >
< / tr > '.
//'< tr >
// < td class = "requirements-item" > dokeos/searchdb/< / td >
// < td class = "requirements-value" > '.check_writable('../searchdb/').'< / td >
//< / tr > '.
//'< tr >
// < td class = "requirements-item" > '.session_save_path().'< / td >
// < td class = "requirements-value" > '.(is_writable(session_save_path())
// ? '< strong > < font color = "green" > '.get_lang('Writable').'< / font > < / strong > '
// : '< strong > < font color = "red" > '.get_lang('NotWritable').'< / font > < / strong > ').'< / td >
//< / tr > '.
'';
echo ' < / table > ';
echo ' < / div > ';
echo '< / div > ';
if ($installType == 'update' & & (empty($updatePath) || $badUpdatePath)) {
if ($badUpdatePath) { ?>
< div style = "color:red; background-color:white; font-weight:bold; text-align:center;" >
<?php echo get_lang ( 'Error' ); ?> !< br />
Chamilo <?php echo ( isset ( $_POST [ 'step2_update_6' ]) ? implode ( '|' , $update_from_version_6 ) : implode ( '|' , $update_from_version_8 )) . ' ' . get_lang ( 'HasNotBeenFoundInThatDir' ); ?> .
< / div >
<?php }
else {
echo '< br / > ';
}
?>
< table border = "0" cellpadding = "5" align = "center" >
< tr >
< td > <?php echo get_lang ( 'OldVersionRootPath' ); ?> :</ td >
< td >< input type = "text" name = "updatePath" size = "50" value = " <?php echo ( $badUpdatePath && ! empty ( $updatePath )) ? htmlentities ( $updatePath ) : $_SERVER [ 'DOCUMENT_ROOT' ] . '/old_version/' ; ?> " /></ td >
< / tr >
< tr >
< td colspan = "2" align = "center" >
< button type = "submit" class = "back" name = "step1" value = "< <?php echo get_lang ( 'Back' ); ?> " > <?php echo get_lang ( 'Back' ); ?> </ button >
< input type = "hidden" name = "is_executable" id = "is_executable" value = "-" / >
< button type = "submit" class = "next" name = " <?php echo ( isset ( $_POST [ 'step2_update_6' ]) ? 'step2_update_6' : 'step2_update_8' ); ?> " value = " <?php echo get_lang ( 'Next' ); ?> >" > <?php echo get_lang ( 'Next' ); ?> </ button >
< / td >
< / tr >
< / table >
<?php
} else {
$error = false;
// First, attempt to set writing permissions if we don't have them yet
$perm = api_get_permissions_for_new_directories();
$perm_file = api_get_permissions_for_new_files();
$notwritable = array();
$curdir = getcwd();
if (!is_writable('../inc/conf')) {
$notwritable[] = realpath($curdir.'/../inc/conf');
@chmod('../inc/conf',$perm);
}
if (!is_writable('../upload/users')) {
$notwritable[] = realpath($curdir.'/../upload/users');
@chmod('../upload/users', $perm);
}
if (!is_writable('../default_course_document/images/')) {
$notwritable[] = realpath($curdir.'/../default_course_document/images/');
@chmod('../default_course_document/images/', $perm);
}
if (!is_writable('../../archive')) {
$notwritable[] = realpath($curdir.'/../../archive');
@chmod('../../archive',$perm);
}
if (!is_writable('../../courses')) {
$notwritable[] = realpath($curdir.'/../../courses');
@chmod('../../courses',$perm);
}
if (!is_writable('../../home')) {
$notwritable[] = realpath($curdir.'/../../home');
@chmod('../../home',$perm);
}
if (file_exists('../inc/conf/configuration.php') & & !is_writable('../inc/conf/configuration.php')) {
$notwritable[]= realpath($curdir.'/../inc/conf/configuration.php');
@chmod('../inc/conf/configuration.php',$perm_file);
}
//Second, if this fails, report an error
//--> the user will have to adjust the permissions manually
if (count($notwritable) > 0) {
$error = true;
echo '< div style = "color:red; background-color:white; font-weight:bold; text-align:center;" > ';
echo get_lang('Warning').':< br / > ';
printf(get_lang('NoWritePermissionPleaseReadInstallGuide'), '< / font > < a href = "../../documentation/installation_guide.html" target = "blank" > ', '< / a > < font color = "red" > ');
echo '< ul > ';
foreach ($notwritable as $value) {
echo '< li > '.$value.'< / li > ';
}
echo '< / ul > ';
echo '< / div > ';
}
// check wether a Chamilo configuration file already exists.
elseif (file_exists('../inc/conf/configuration.php')) {
echo '< div style = "color:red; background-color:white; font-weight:bold; text-align:center;" > ';
echo get_lang('WarningExistingDokeosInstallationDetected');
echo '< / div > ';
}
//and now display the choice buttons (go back or install)
?>
< p align = "center" >
< button type = "submit" name = "step1" class = "back" onclick = "javascript: window.location='index.php'; return false;" value = "< <?php echo get_lang ( 'Previous' ); ?> " > <?php echo get_lang ( 'Previous' ); ?> </ button >
< button type = "submit" name = "step2_install" class = "add" value = " <?php echo get_lang ( "NewInstallation" ); ?> " <?php if ( $error ) echo 'disabled="disabled"' ; ?> > <?php echo get_lang ( 'NewInstallation' ); ?> </ button >
< input type = "hidden" name = "is_executable" id = "is_executable" value = "-" / >
<?php
//real code
echo '< button type = "submit" class = "save" name = "step2_update_8" value = "Upgrade from Dokeos 1.8.x" ' ;
if ($error) echo ' disabled="disabled"';
//temporary code for alpha version, disabling upgrade
//echo '< input type = "submit" name = "step2_update" value = "Upgrading is not possible in this beta version" ' ;
//echo ' disabled="disabled"';
//end temp code
echo ' >'.get_lang('UpgradeFromDokeos18x').'< / button > ';
echo '< button type = "submit" class = "save" name = "step2_update_6" value = "Upgrade from Dokeos 1.6.x" ' ;
if ($error) echo ' disabled="disabled"';
echo ' >'.get_lang('UpgradeFromDokeos16x').'< / button > ';
echo '< / p > ';
}
}
/**
* 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 '< h2 > '.display_step_sequence().get_lang('Licence').'< / h2 > ';
echo '< p > '.get_lang('DokeosLicenseInfo').'< / p > ';
echo '< p > < a href = "../../documentation/license.html" target = "_blank" > '.get_lang('PrintVers').'< / a > < / p > ';
?>
< table > < tr > < td >
< p >< textarea cols = "75" rows = "15" > <?php htmlentities ( include ( '../../documentation/license.txt' )); ?> </ textarea ></ p >
< / td >
< / tr >
< tr >
< td >
< p > <?php echo get_lang ( 'DokeosArtLicense' ); ?> </ p >
< / td >
< / tr >
< td >
< table width = "100%" >
< tr >
< td > < / td >
< td align = "center" >
< button type = "submit" class = "back" name = "step1" value = "< <?php echo get_lang ( 'Previous' ); ?> " > <?php echo get_lang ( 'Previous' ); ?> </ button >
< input type = "hidden" name = "is_executable" id = "is_executable" value = "-" / >
< button type = "submit" class = "next" name = "step3" value = " <?php echo get_lang ( 'IAccept' ); ?> >" > <?php echo get_lang ( 'IAccept' ); ?> </ button >
< / td >
< / tr >
< / table >
< / td > < / tr > < / table >
<?php
}
/**
* 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 < tr > 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 "< tr " . $ tr_attribute . " > \n";
echo "< td > $parameter_name < / td > \n";
if ($install_type == INSTALL_TYPE_UPDATE & & $display_when_update) {
echo '< td > < input type = "hidden" name = "'.$form_field_name.'" id = "'.$form_field_name.'" value = "'.api_htmlentities($parameter_value).'" / > '.$parameter_value."< / td > \n";
} 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;
echo '< td > < input type = "'.$inputtype.'" size = "'.DATABASE_FORM_FIELD_DISPLAY_LENGTH.'" maxlength = "'.$maxlength.'" name = "'.$form_field_name.'" id = "'.$form_field_name.'" value = "'.api_htmlentities($parameter_value).'" / > '."< / td > \n";
echo "< td > $extra_notice< / td > \n";
}
echo "< / tr > \n";
}
/**
* 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');
$dbNameForm = 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 '< h2 > ' . display_step_sequence() .get_lang('DBSetting') . '< / h2 > ';
echo get_lang('DBSettingUpgradeIntro');
} else {
if (empty($dbPrefixForm)) { //make sure there is a default value for db prefix
$dbPrefixForm = 'chamilo_';
}
echo '< h2 > ' . display_step_sequence() .get_lang('DBSetting') . '< / h2 > ';
echo get_lang('DBSettingIntro');
}
?>
< br / > < br / >
< / td >
< / tr >
< tr >
< td >
< table width = "100%" >
< tr >
< td width = "40%" > <?php echo get_lang ( 'DBHost' ); ?> </ td >
<?php if ( $installType == 'update' ) : ?>
< td width = "30%" >< input type = "hidden" name = "dbHostForm" value = " <?php echo htmlentities ( $dbHostForm ); ?> " /> <?php echo $dbHostForm ; ?> </ td >
< td width = "30%" > < / td >
<?php else : ?>
< td width = "30%" >< input type = "text" size = "25" maxlength = "50" name = "dbHostForm" value = " <?php echo htmlentities ( $dbHostForm ); ?> " /></ td >
< td width = "30%" > <?php echo get_lang ( 'EG' ) . ' localhost' ; ?> </ td >
<?php endif ; ?>
< / tr >
<?php
//database user username
$example_login = get_lang('EG').' root';
display_database_parameter($installType, get_lang('DBLogin'), 'dbUsernameForm', $dbUsernameForm, $example_login);
//database user password
$example_password = get_lang('EG').' '.api_generate_password();
display_database_parameter($installType, get_lang('DBPassword'), 'dbPassForm', $dbPassForm, $example_password);
//database prefix
display_database_parameter($installType, get_lang('DbPrefixForm'), 'dbPrefixForm', $dbPrefixForm, get_lang('DbPrefixCom'));
//fields for the four standard Chamilo databases
echo '< tr > < td colspan = "3" > < a href = "" onclick = "javascript: show_hide_option();return false;" id = "optionalparameters" > < img style = "vertical-align:middle;" src = "../img/div_show.gif" alt = "show-hide" / > '.get_lang('OptionalParameters', '').'< / a > < / td > < / tr > ';
display_database_parameter($installType, get_lang('MainDB'), 'dbNameForm', $dbNameForm, ' ', null, 'id="optional_param1" style="display:none;"');
display_database_parameter($installType, get_lang('StatDB'), 'dbStatsForm', $dbStatsForm, ' ', null, 'id="optional_param2" style="display:none;"');
if ($installType == '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:none;"');
}
display_database_parameter($installType, get_lang('UserDB'), 'dbUserForm', $dbUserForm, ' ', null, 'id="optional_param4" style="display:none;"');
?>
< tr id = "optional_param5" style = "display:none;" >
< td > <?php echo get_lang ( 'EnableTracking' ); ?> </ td >
<?php if ( $installType == 'update' ) : ?>
< td >< input type = "hidden" name = "enableTrackingForm" value = " <?php echo $enableTrackingForm ; ?> " /> <?php echo $enableTrackingForm ? get_lang ( 'Yes' ) : get_lang ( 'No' ); ?> </ td >
<?php else : ?>
< td >
< input class = "checkbox" type = "radio" name = "enableTrackingForm" value = "1" id = "enableTracking1" <?php echo $enableTrackingForm ? 'checked="checked" ' : '' ; ?> /> < label for = "enableTracking1" > <?php echo get_lang ( 'Yes' ); ?> </ label >
< input class = "checkbox" type = "radio" name = "enableTrackingForm" value = "0" id = "enableTracking0" <?php echo $enableTrackingForm ? '' : 'checked="checked" ' ; ?> /> < label for = "enableTracking0" > <?php echo get_lang ( 'No' ); ?> </ label >
< / td >
<?php endif ; ?>
< td > < / td >
< / tr >
< tr id = "optional_param6" style = "display:none;" >
< td > <?php echo get_lang ( 'SingleDb' ); ?> </ td >
<?php if ( $installType == 'update' ) : ?>
< td >< input type = "hidden" name = "singleDbForm" value = " <?php echo $singleDbForm ; ?> " /> <?php echo $singleDbForm ? get_lang ( 'One' ) : get_lang ( 'Several' ); ?> </ td >
<?php else : ?>
< td >
< input class = "checkbox" type = "radio" name = "singleDbForm" value = "1" id = "singleDb1" <?php echo $singleDbForm ? 'checked="checked" ' : '' ; ?> onclick = "javascript: show_hide_tracking_and_user_db(this.id);" /> < label for = "singleDb1" > <?php echo get_lang ( 'One' ); ?> </ label >
< input class = "checkbox" type = "radio" name = "singleDbForm" value = "0" id = "singleDb0" <?php echo $singleDbForm ? '' : 'checked="checked" ' ; ?> onclick = "javascript: show_hide_tracking_and_user_db(this.id);" /> < label for = "singleDb0" > <?php echo get_lang ( 'Several' ); ?> </ label >
< / td >
<?php endif ; ?>
< td > < / td >
< / tr >
< / div >
< tr >
< td >< button type = "submit" class = "login" name = "step3" value = " <?php echo get_lang ( 'CheckDatabaseConnection' ); ?> " > <?php echo get_lang ( 'CheckDatabaseConnection' ); ?> </ button ></ td >
<?php
$dbConnect = test_db_connect($dbHostForm, $dbUsernameForm, $dbPassForm, $singleDbForm, $dbPrefixForm);
if ($dbConnect == 1): ?>
< td colspan = "2" >
< div class = "confirmation-message" >
<!-- <div style="float:left; margin - right:10px;">
< img src = "../img/message_confirmation.png" alt = "Confirmation" / >
< / div > -->
<!-- <div style="float:left;"> -->
Database host info: < strong > <?php echo Database :: get_host_info (); ?> </ strong >< br />
Database server version: < strong > <?php echo Database :: get_server_info (); ?> </ strong >< br />
Database client version: < strong > <?php echo Database :: get_client_info (); ?> </ strong >< br />
Database protocol version: < strong > <?php echo Database :: get_proto_info (); ?> </ strong >
<!-- </div> -->
< div style = "clear:both;" > < / div >
< / div >
< / td >
<?php else : ?>
< td colspan = "2" >
< div style = "float:left;" class = "error-message" >
<!-- <div style="float:left; margin - right:10px;">
< img src = "../img/message_error.png" alt = "Error" / >
< / div > -->
< div style = "float:left;" >
< strong > Database error: <?php echo Database :: errno (); ?> </ strong >< br />
<?php echo Database :: error () . '<br />' ; ?>
< strong > <?php echo get_lang ( 'Details' ) . ': ' . get_lang ( 'FailedConectionDatabase' ); ?> </ strong >< br />
< / div >
< / div >
< / td >
<?php endif ; ?>
< / tr >
< tr >
< td >< button type = "submit" name = "step2" class = "back" value = "< <?php echo get_lang ( 'Previous' ); ?> " > <?php echo get_lang ( 'Previous' ); ?> </ button ></ td >
< td > < / td >
< td align = "right" >< input type = "hidden" name = "is_executable" id = "is_executable" value = "-" />< button type = "submit" class = "next" name = "step4" value = " <?php echo get_lang ( 'Next' ); ?> >" /> <?php echo get_lang ( 'Next' ); ?> </ button ></ td >
< / tr >
< / table >
<?php
}
/**
* Displays a parameter in a table row.
* Used by the display_configuration_settings_form function.
*/
function display_configuration_parameter($install_type, $parameter_name, $form_field_name, $parameter_value, $display_when_update = 'true') {
echo "< tr > \n";
echo "< td > $parameter_name < / td > \n";
if ($install_type == INSTALL_TYPE_UPDATE & & $display_when_update) {
echo '< td > < input type = "hidden" name = "'.$form_field_name.'" value = "'.api_htmlentities($parameter_value, ENT_QUOTES).'" / > '.$parameter_value."< / td > \n";
} else {
echo '< td > < input type = "text" size = "'.FORM_FIELD_DISPLAY_LENGTH.'" maxlength = "'.MAX_FORM_FIELD_LENGTH.'" name = "'.$form_field_name.'" value = "'.api_htmlentities($parameter_value, ENT_QUOTES).'" / > '."< / td > \n";
}
echo "< / tr > \n";
}
/**
* 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 "< h2 > " . display_step_sequence() . get_lang("CfgSetting") . "< / h2 > ";
echo '< p > '.get_lang('ConfigSettingsInfo').' < strong > main/inc/conf/configuration.php< / strong > < / p > ';
echo "< / td > < / tr > \n< tr > < td > ";
echo "< table width = \"100%\" > ";
//First parameter: language
echo "< tr > \n";
echo '< td > '.get_lang('MainLang')." < / td > \n";
if ($installType == 'update') {
echo '< td > < input type = "hidden" name = "languageForm" value = "'.api_htmlentities($languageForm, ENT_QUOTES).'" / > '.$languageForm."< / td > \n";
} else { // new installation
echo '< td > ';
display_language_selection_box('languageForm', $languageForm);
echo "< / td > \n";
}
echo "< / tr > \n";
//Second parameter: Chamilo URL
echo "< tr > \n";
echo '< td > '.get_lang('ChamiloURL').' (< font color = "red" > '.get_lang('ThisFieldIsRequired')."< / font > ) < / td > \n";
if ($installType == 'update') {
echo '< td > '.api_htmlentities($urlForm, ENT_QUOTES)."< / td > \n";
} else {
echo '< td > < input type = "text" size = "40" maxlength = "100" name = "urlForm" value = "'.api_htmlentities($urlForm, ENT_QUOTES).'" / > '."< / td > \n";
}
echo "< / tr > \n";
//Parameter 3: administrator's email
display_configuration_parameter($installType, get_lang('AdminEmail'), 'emailForm', $emailForm);
//Parameters 4 and 5: 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 6: administrator's telephone
display_configuration_parameter($installType, get_lang('AdminPhone'), 'adminPhoneForm', $adminPhoneForm);
//Parameter 7: administrator's login
display_configuration_parameter($installType, get_lang('AdminLogin'), 'loginForm', $loginForm, $installType == 'update');
//Parameter 8: administrator's password
if ($installType != 'update') {
display_configuration_parameter($installType, get_lang('AdminPass'), 'passForm', $passForm, false);
}
//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);
/*
//old method
< tr >
< td > <?php echo get_lang ( 'EncryptUserPass' ); ?> :</ td >
<?php if ( $installType == 'update' ) : ?>
< td >< input type = "hidden" name = "encryptPassForm" value = " <?php echo $encryptPassForm ; ?> " /> <?php echo $encryptPassForm ? get_lang ( 'Yes' ) : get_lang ( 'No' ); ?> </ td >
<?php else : ?>
< td >
< input class = "checkbox" type = "radio" name = "encryptPassForm" value = "1" id = "encryptPass1" <?php echo $encryptPassForm ? 'checked="checked" ' : '' ; ?> /> < label for = "encryptPass1" > <?php echo get_lang ( 'Yes' ); ?> </ label >
< input class = "checkbox" type = "radio" name = "encryptPassForm" value = "0" id = "encryptPass0" <?php echo $encryptPassForm ? '' : 'checked="checked" ' ; ?> /> < label for = "encryptPass0" > <?php echo get_lang ( 'No' ); ?> </ label >
< / td >
<?php endif ; ?>
< / tr >
*/
?>
< tr >
< td > <?php echo get_lang ( "EncryptMethodUserPass" ); ?> :</ td >
<?php if ( $installType == 'update' ) : ?>
< td >< input type = "hidden" name = "encryptPassForm" value = " <?php echo $encryptPassForm ; ?> " /> <?php echo $encryptPassForm ; ?> </ td >
<?php else : ?>
< td >
< input class = "checkbox" type = "radio" name = "encryptPassForm" value = "md5" id = "encryptPass0" <?php echo $encryptPassForm ? 'checked="checked" ' : '' ; ?> /> < label for = "encryptPass0" > <?php echo 'md5' ; ?> </ label >
< input class = "checkbox" type = "radio" name = "encryptPassForm" value = "sha1" id = "encryptPass1" <?php echo $encryptPassForm ? '' : 'checked="checked" ' ; ?> /> < label for = "encryptPass1" > <?php echo 'sha1' ; ?> </ label >
< input class = "checkbox" type = "radio" name = "encryptPassForm" value = "none" id = "encryptPass2" <?php echo $encryptPassForm ? '' : 'checked="checked" ' ; ?> /> < label for = "encryptPass2" > <?php echo get_lang ( 'None' ); ?> </ label >
< / td >
<?php endif ; ?>
< / tr >
< tr >
< td > <?php echo get_lang ( 'AllowSelfReg' ); ?> :</ td >
<?php if ( $installType == 'update' ) : ?>
< td >< input type = "hidden" name = "allowSelfReg" value = " <?php echo $allowSelfReg ; ?> " /> <?php echo $allowSelfReg ? get_lang ( 'Yes' ) : get_lang ( 'No' ); ?> </ td >
<?php else : ?>
< td >
< input class = "checkbox" type = "radio" name = "allowSelfReg" value = "1" id = "allowSelfReg1" <?php echo $allowSelfReg ? 'checked="checked" ' : '' ; ?> /> < label for = "allowSelfReg1" > <?php echo get_lang ( 'Yes' ) . ' ' . get_lang ( 'Recommended' ); ?> </ label >
< input class = "checkbox" type = "radio" name = "allowSelfReg" value = "0" id = "allowSelfReg0" <?php echo $allowSelfReg ? '' : 'checked="checked" ' ; ?> /> < label for = "allowSelfReg0" > <?php echo get_lang ( 'No' ); ?> </ label >
< / td >
<?php endif ; ?>
< / tr >
< tr >
< td > <?php echo get_lang ( 'AllowSelfRegProf' ); ?> :</ td >
<?php if ( $installType == 'update' ) : ?>
< td >< input type = "hidden" name = "allowSelfRegProf" value = " <?php echo $allowSelfRegProf ; ?> " /> <?php echo $allowSelfRegProf ? get_lang ( 'Yes' ) : get_lang ( 'No' ); ?> </ td >
<?php else : ?>
< td >
< input class = "checkbox" type = "radio" name = "allowSelfRegProf" value = "1" id = "allowSelfRegProf1" <?php echo $allowSelfRegProf ? 'checked="checked" ' : '' ; ?> /> < label for = "allowSelfRegProf1" > <?php echo get_lang ( 'Yes' ); ?> </ label >
< input class = "checkbox" type = "radio" name = "allowSelfRegProf" value = "0" id = "allowSelfRegProf0" <?php echo $allowSelfRegProf ? '' : 'checked="checked" ' ; ?> /> < label for = "allowSelfRegProf0" > <?php echo get_lang ( 'No' ); ?> </ label >
< / td >
<?php endif ; ?>
< / tr >
< tr >
< td >< button type = "submit" class = "back" name = "step3" value = "< <?php echo get_lang ( 'Previous' ); ?> " /> <?php echo get_lang ( 'Previous' ); ?> </ button ></ td >
< td align = "right" >< input type = "hidden" name = "is_executable" id = "is_executable" value = "-" />< button class = "next" type = "submit" name = "step5" value = " <?php echo get_lang ( 'Next' ); ?> >" /> <?php echo get_lang ( 'Next' ); ?> </ button ></ td >
< / tr >
< / table >
<?php
}
/**
* After installation is completed (step 6), this message is displayed.
*/
function display_after_install_message($installType, $nbr_courses) {
?>
< h2 > <?php echo display_step_sequence () . get_lang ( 'CfgSetting' ); ?> </ h2 >
<?php echo get_lang ( 'FirstUseTip' ); ?>
<?php if ( $installType == 'update' && $nbr_courses > MAX_COURSE_TRANSFER ) : ?>
< br / > < br / >
< font color = "red" >< strong > <?php echo get_lang ( 'Warning' ); ?> :</ strong > <?php printf ( get_lang ( 'YouHaveMoreThanXCourses' ), MAX_COURSE_TRANSFER , MAX_COURSE_TRANSFER , '<a href="update_courses.php"><font color="red">' , '</font></a>' ); ?> </ font >
<?php endif ; ?>
< br / > < br / >
<?php
echo '< div class = "warning-message" > ';
//echo '< img src = "../img/message_warning.png" style = "float:left; margin-right:10px;" alt = "'.get_lang('Warning').'" / > ';
echo '< strong > '.get_lang('SecurityAdvice').'< / strong > ';
echo ': ';
printf(get_lang('ToProtectYourSiteMakeXAndYReadOnly'), 'main/inc/conf/configuration.php', 'main/install/index.php');
echo '< / div > ';
?>
< / form >
< a class = "portal" href = "../../index.php" > <?php echo get_lang ( 'GoToYourNewlyCreatedPortal' ); ?> </ a >
<?php
}