request->get('language_list')) { $search = ['../', '\\0']; $installationLanguage = str_replace($search, '', urldecode($httpRequest->request->get('language_list'))); ChamiloSession::write('install_language', $installationLanguage); } elseif (ChamiloSession::has('install_language')) { $installationLanguage = ChamiloSession::read('install_language'); } else { $installationLanguage = $httpRequest->getPreferredLanguage(); } // Set translation $translator = new Translator($installationLanguage); $translator->addLoader('po', new PoFileLoader()); Container::$translator = $translator; // The function api_get_setting() might be called within the installation scripts. // We need to provide some limited support for it through initialization of the // global array-type variable $_setting. $_setting = [ 'platform_charset' => 'UTF-8', 'server_type' => 'production', // 'production' | 'test' 'permissions_for_new_directories' => '0770', 'permissions_for_new_files' => '0660', 'stylesheets' => 'chamilo', ]; $encryptPassForm = 'bcrypt'; $urlAppendPath = ''; $urlForm = ''; $pathForm = ''; $emailForm = ''; $dbHostForm = 'localhost'; $dbUsernameForm = 'root'; $dbPassForm = ''; $dbNameForm = 'chamilo'; $dbPortForm = 3306; $allowSelfReg = 'approval'; $allowSelfRegProf = 1; $adminLastName = get_lang('Doe'); $adminFirstName = get_lang('John'); $loginForm = 'admin'; $passForm = ''; $institutionUrlForm = 'https://chamilo.org'; $languageForm = $installationLanguage; $campusForm = 'My campus'; $educationForm = 'Albert Einstein'; $adminPhoneForm = '(000) 001 02 03'; $institutionForm = 'My Organisation'; $session_lifetime = 360000; $installationGuideLink = '../../documentation/installation_guide.html'; // Setting the error reporting levels. error_reporting(E_ALL); // Upgrading from any subversion of 1.11.x $upgradeFromVersion = [ '1.11.0', '1.11.1', '1.11.2', '1.11.4', '1.11.6', '1.11.8', '1.11.10', '1.11.11', '1.11.12', '1.11.14', '1.11.16', '1.11.18', '1.11.20', '1.11.22', '1.11.24', '1.11.26', '1.11.28', ]; $my_old_version = ''; if (empty($tmp_version)) { $tmp_version = get_config_param('system_version'); } if (!empty($_POST['old_version'])) { $my_old_version = $_POST['old_version']; } elseif (!empty($tmp_version)) { $my_old_version = $tmp_version; } $versionData = require __DIR__.'/version.php'; $new_version = $versionData['new_version']; // A protection measure for already installed systems. /*if (isAlreadyInstalledSystem()) { echo 'Portal already installed'; exit; }*/ /* STEP 1 : INITIALIZES FORM VARIABLES IF IT IS THE FIRST VISIT */ $badUpdatePath = false; $emptyUpdatePath = true; $proposedUpdatePath = ''; if (!empty($_POST['updatePath'])) { $proposedUpdatePath = $_POST['updatePath']; } $checkMigrationStatus = []; $isUpdateAvailable = isUpdateAvailable(); if (isset($_POST['step2_install']) || isset($_POST['step2_update_8']) || isset($_POST['step2_update_6'])) { if (isset($_POST['step2_install'])) { $installType = 'new'; $_POST['step2'] = 1; } else { $installType = 'update'; if (isset($_POST['step2_update_8'])) { $emptyUpdatePath = false; $proposedUpdatePath = api_add_trailing_slash(empty($_POST['updatePath']) ? api_get_path(SYMFONY_SYS_PATH) : $_POST['updatePath']); if (file_exists($proposedUpdatePath)) { if (in_array($my_old_version, $upgradeFromVersion)) { $_POST['step2'] = 1; } else { $badUpdatePath = true; } } else { $badUpdatePath = true; } } } } elseif (isset($_POST['step1'])) { $_POST['updatePath'] = ''; $installType = $_GET['installType'] ?? ''; $updateFromConfigFile = ''; unset($_GET['running']); } else { $installType = $_GET['installType'] ?? ''; $updateFromConfigFile = $_GET['updateFromConfigFile'] ?? false; } $showEmailNotCheckedToStudent = 1; $userMailCanBeEmpty = null; $checkEmailByHashSent = null; if (!isset($_GET['running'])) { // Extract the path to append to the url if Chamilo is not installed on the web root directory. $urlAppendPath = api_remove_trailing_slash(api_get_path(REL_PATH)); $urlForm = api_get_path(WEB_PATH); $pathForm = api_get_path(SYS_PATH); $emailForm = 'webmaster@localhost'; if (!empty($_SERVER['SERVER_ADMIN'])) { $emailForm = $_SERVER['SERVER_ADMIN']; } $email_parts = explode('@', $emailForm); if (isset($email_parts[1]) && 'localhost' === $email_parts[1]) { $emailForm .= '.localdomain'; } $loginForm = 'admin'; $passForm = api_generate_password(12, false); $institutionUrlForm = 'https://chamilo.org'; $checkEmailByHashSent = 0; $userMailCanBeEmpty = 1; $allowSelfReg = 'approval'; $allowSelfRegProf = 1; //by default, a user can register as teacher (but moderation might be in place) if (!empty($_GET['profile'])) { $installationProfile = api_htmlentities($_GET['profile'], ENT_QUOTES); } } else { foreach ($_POST as $key => $val) { if (is_string($val)) { $val = trim($val); $_POST[$key] = $val; } elseif (is_array($val)) { foreach ($val as $key2 => $val2) { $val2 = trim($val2); $_POST[$key][$key2] = $val2; } } $GLOBALS[$key] = $_POST[$key]; } } /* NEXT STEPS IMPLEMENTATION */ $total_steps = 7; $current_step = 1; if (!$_POST) { $current_step = 1; } elseif ($httpRequest->request->get('language_list') || !empty($_POST['step1']) || ((!empty($_POST['step2_update_8']) || (!empty($_POST['step2_update_6']))) && ($emptyUpdatePath || $badUpdatePath))) { $current_step = 2; } elseif (!empty($_POST['step2']) || (!empty($_POST['step2_update_8']) || (!empty($_POST['step2_update_6'])))) { $current_step = 3; } elseif (!empty($_POST['step3'])) { $current_step = 4; } elseif (!empty($_POST['step4'])) { $current_step = 5; } elseif (!empty($_POST['step5'])) { $current_step = 6; } elseif (isset($_POST['step6'])) { $current_step = 7; } error_log("Step: $current_step"); if (empty($installationProfile)) { $installationProfile = ''; if (!empty($_POST['installationProfile'])) { $installationProfile = api_htmlentities($_POST['installationProfile']); } } $institutionUrlFormResult = ''; $institutionUrlFormResult = api_htmlentities($institutionUrlForm, ENT_QUOTES); $stepData = []; if (isset($_POST['step2'])) { // STEP 3 : LICENSE $current_step = 3; $stepData = display_license_agreement(); } elseif (isset($_POST['step3'])) { $current_step = 4; // STEP 4 : MYSQL DATABASE SETTINGS $stepData = display_database_settings_form( $installType, $dbHostForm, $dbUsernameForm, $dbPassForm, $dbNameForm, $dbPortForm ); } elseif (isset($_POST['step4'])) { $current_step = 5; // STEP 5 : CONFIGURATION SETTINGS if ('update' === $installType) { // Create .env file $envFile = api_get_path(SYMFONY_SYS_PATH) . '.env'; $distFile = api_get_path(SYMFONY_SYS_PATH) . '.env.dist'; $params = [ '{{DATABASE_HOST}}' => $dbHostForm, '{{DATABASE_PORT}}' => $dbPortForm, '{{DATABASE_NAME}}' => $dbNameForm, '{{DATABASE_USER}}' => $dbUsernameForm, '{{DATABASE_PASSWORD}}' => $dbPassForm, '{{APP_INSTALLED}}' => 1, '{{APP_ENCRYPT_METHOD}}' => $encryptPassForm, '{{APP_SECRET}}' => generateRandomToken(), '{{DB_MANAGER_ENABLED}}' => '0', '{{SOFTWARE_NAME}}' => 'Chamilo', '{{SOFTWARE_URL}}' => $institutionUrlForm, '{{DENY_DELETE_USERS}}' => '0', '{{HOSTING_TOTAL_SIZE_LIMIT}}' => '0', '{{THEME_FALLBACK}}' => 'chamilo', '{{PACKAGER}}' => 'chamilo', '{{DEFAULT_TEMPLATE}}' => 'default', '{{ADMIN_CHAMILO_ANNOUNCEMENTS_DISABLE}}' => '0', ]; error_log('Update env file'); updateEnvFile($distFile, $envFile, $params); (new Dotenv())->load($envFile); $db_name = $dbNameForm; connectToDatabase( $dbHostForm, $dbUsernameForm, $dbPassForm, $dbNameForm, $dbPortForm ); $manager = Database::getManager(); $tmp = get_config_param_from_db('platformLanguage'); if (!empty($tmp)) { $languageForm = $tmp; } $tmp = get_config_param_from_db('emailAdministrator'); if (!empty($tmp)) { $emailForm = $tmp; } $tmp = get_config_param_from_db('administratorName'); if (!empty($tmp)) { $adminFirstName = $tmp; } $tmp = get_config_param_from_db('administratorSurname'); if (!empty($tmp)) { $adminLastName = $tmp; } $tmp = get_config_param_from_db('administratorTelephone'); if (!empty($tmp)) { $adminPhoneForm = $tmp; } $tmp = get_config_param_from_db('siteName'); if (!empty($tmp)) { $campusForm = $tmp; } $tmp = get_config_param_from_db('Institution'); if (!empty($tmp)) { $institutionForm = $tmp; } $tmp = get_config_param_from_db('InstitutionUrl'); if (!empty($tmp)) { $institutionUrlForm = $tmp; } // For version 1.9 $encryptPassForm = get_config_param('password_encryption'); // Managing the $encryptPassForm if ('1' == $encryptPassForm) { $encryptPassForm = 'sha1'; } elseif ('0' == $encryptPassForm) { $encryptPassForm = 'none'; } $allowSelfReg = 'approval'; $tmp = get_config_param_from_db('allow_registration'); if (!empty($tmp)) { $allowSelfReg = $tmp; } $allowSelfRegProf = false; $tmp = get_config_param_from_db('allow_registration_as_teacher'); if (!empty($tmp)) { $allowSelfRegProf = $tmp; } } $stepData = display_configuration_settings_form( $installType, $urlForm, $languageForm, $emailForm, $adminFirstName, $adminLastName, $adminPhoneForm, $campusForm, $institutionForm, $institutionUrlForm, $encryptPassForm, $allowSelfReg, $allowSelfRegProf, $loginForm, $passForm ); } elseif (isset($_POST['step5'])) { $current_step = 6; //STEP 6 : LAST CHECK BEFORE INSTALL if ('new' === $installType) { $stepData['loginForm'] = $loginForm; $stepData['passForm'] = $passForm; } $stepData['adminFirstName'] = $adminFirstName; $stepData['adminLastName'] = $adminLastName; $stepData['emailForm'] = $emailForm; $stepData['adminPhoneForm'] = $adminPhoneForm; $allowSelfRegistrationLiteral = match ($allowSelfReg) { 'true' => get_lang('Yes'), 'approval' => get_lang('Approval'), default => get_lang('No'), }; if ('update' === $installType) { $urlForm = get_config_param('root_web'); } $stepData['campusForm'] = $campusForm; $stepData['languageForm'] = $languageForm; $stepData['allowSelfRegistrationLiteral'] = $allowSelfRegistrationLiteral; $stepData['institutionForm'] = $institutionForm; $stepData['institutionUrlForm'] = $institutionUrlForm; $stepData['encryptPassForm'] = $encryptPassForm; if ($isUpdateAvailable) { $envFile = api_get_path(SYMFONY_SYS_PATH) . '.env'; $dotenv = new Dotenv(); $envFile = api_get_path(SYMFONY_SYS_PATH) . '.env'; $dotenv->loadEnv($envFile); $stepData['dbHostForm'] = $_ENV['DATABASE_HOST']; $stepData['dbPortForm'] = $_ENV['DATABASE_PORT']; $stepData['dbUsernameForm'] = $_ENV['DATABASE_USER']; $stepData['dbPassForm'] = str_repeat('*', api_strlen($_ENV['DATABASE_PASSWORD'])); $stepData['dbNameForm'] = $_ENV['DATABASE_NAME']; } else { $stepData['dbHostForm'] = $dbHostForm; $stepData['dbPortForm'] = $dbPortForm; $stepData['dbUsernameForm'] = $dbUsernameForm; $stepData['dbPassForm'] = str_repeat('*', api_strlen($dbPassForm)); $stepData['dbNameForm'] = $dbNameForm; } } elseif (isset($_POST['step6'])) { //STEP 6 : INSTALLATION PROCESS $current_step = 7; if ('update' === $installType) { // The migration process for updates has been moved to migrate.php and is now // handled via AJAX requests from Vue.js. This section of the code is no longer // necessary and has been removed to streamline the update process. error_log('Migration process moved to migrate.php'); error_log('Upgrade 2.0.0 process concluded! ('.date('Y-m-d H:i:s').')'); } else { error_log('------------------------------'); $start = date('Y-m-d H:i:s'); error_log('Chamilo installation starts: ('.$start.')'); set_file_folder_permissions(); error_log("connectToDatabase as user $dbUsernameForm"); connectToDatabase( $dbHostForm, $dbUsernameForm, $dbPassForm, null, $dbPortForm ); $manager = Database::getManager(); $dbNameForm = preg_replace('/[^a-zA-Z0-9_\-]/', '', $dbNameForm); // Drop and create the database anyways error_log("Drop database $dbNameForm"); $schemaManager = $manager->getConnection()->createSchemaManager(); try { $schemaManager->dropDatabase($dbNameForm); } catch (\Doctrine\DBAL\Exception $e) { error_log("Database ".$dbNameForm." does not exists"); } $schemaManager->createDatabase($dbNameForm); error_log("Connect to database $dbNameForm with user $dbUsernameForm"); connectToDatabase( $dbHostForm, $dbUsernameForm, $dbPassForm, $dbNameForm, $dbPortForm ); $manager = Database::getManager(); // Create .env file $envFile = api_get_path(SYMFONY_SYS_PATH).'.env'; $distFile = api_get_path(SYMFONY_SYS_PATH).'.env.dist'; $params = [ '{{DATABASE_HOST}}' => $dbHostForm, '{{DATABASE_PORT}}' => $dbPortForm, '{{DATABASE_NAME}}' => $dbNameForm, '{{DATABASE_USER}}' => $dbUsernameForm, '{{DATABASE_PASSWORD}}' => $dbPassForm, '{{APP_INSTALLED}}' => 1, '{{APP_ENCRYPT_METHOD}}' => $encryptPassForm, '{{APP_SECRET}}' => generateRandomToken(), '{{DB_MANAGER_ENABLED}}' => '0', '{{SOFTWARE_NAME}}' => 'Chamilo', '{{SOFTWARE_URL}}' => $institutionUrlForm, '{{DENY_DELETE_USERS}}' => '0', '{{HOSTING_TOTAL_SIZE_LIMIT}}' => '0', '{{THEME_FALLBACK}}' => 'chamilo', '{{PACKAGER}}' => 'chamilo', '{{DEFAULT_TEMPLATE}}' => 'default', '{{ADMIN_CHAMILO_ANNOUNCEMENTS_DISABLE}}' => '0', ]; updateEnvFile($distFile, $envFile, $params); (new Dotenv())->load($envFile); error_log('Load kernel'); // Load Symfony Kernel $kernel = new Kernel('dev', true); $application = new Application($kernel); // Create database error_log('Create database'); $input = new ArrayInput([]); $command = $application->find('doctrine:schema:create'); $result = $command->run($input, new ConsoleOutput()); // No errors if (0 === $result) { $input = new ArrayInput([]); $input->setInteractive(false); $command = $application->find('doctrine:fixtures:load'); $result = $command->run($input, new ConsoleOutput()); error_log('Delete PHP Session'); session_unset(); $_SESSION = []; session_destroy(); error_log('Boot kernel'); // Boot kernel and get the doctrine from Symfony container $kernel->boot(); $containerDatabase = $kernel->getContainer(); $sysPath = api_get_path(SYMFONY_SYS_PATH); finishInstallationWithContainer( $containerDatabase, $sysPath, $encryptPassForm, $passForm, $adminLastName, $adminFirstName, $loginForm, $emailForm, $adminPhoneForm, $languageForm, $institutionForm, $institutionUrlForm, $campusForm, $allowSelfReg, $allowSelfRegProf, $installationProfile, $kernel ); error_log('Finish installation'); } else { error_log('ERROR during installation.'); } } } elseif (isset($_POST['step1']) || $badUpdatePath) { //STEP 1 : REQUIREMENTS //make sure that proposed path is set, shouldn't be necessary but... if (empty($proposedUpdatePath)) { $proposedUpdatePath = $_POST['updatePath']; } $stepData = display_requirements( $installType, $badUpdatePath, $proposedUpdatePath, $upgradeFromVersion ); } else { // This is the start screen. if (!empty($_GET['profile'])) { $installationProfile = api_htmlentities($_GET['profile'], ENT_QUOTES); } $stepData['installationProfile'] = $installationProfile; } if ($isUpdateAvailable) { $installType = 'update'; } $installerData = [ 'poweredBy' => 'Powered by Chamilo © '.date('Y'), 'phpRequiredVersion' => REQUIRED_PHP_VERSION, 'installType' => $installType, 'badUpdatePath' => $badUpdatePath, 'upgradeFromVersion' => $upgradeFromVersion, 'langIso' => api_get_language_isocode(), 'formAction' => api_get_self().'?'.http_build_query([ 'running' => 1, 'installType' => $installType, 'updateFromConfigFile' => $updateFromConfigFile, ]), 'updatePath' => !$badUpdatePath ? api_htmlentities($proposedUpdatePath, ENT_QUOTES) : '', 'urlAppendPath' => api_htmlentities($urlAppendPath, ENT_QUOTES), 'pathForm' => api_htmlentities($pathForm, ENT_QUOTES), 'urlForm' => api_htmlentities($urlForm, ENT_QUOTES), 'dbHostForm' => api_htmlentities($dbHostForm, ENT_QUOTES), 'dbPortForm' => api_htmlentities((string) $dbPortForm, ENT_QUOTES), 'dbUsernameForm' => api_htmlentities($dbUsernameForm, ENT_QUOTES), 'dbPassForm' => api_htmlentities($dbPassForm, ENT_QUOTES), 'dbNameForm' => api_htmlentities($dbNameForm, ENT_QUOTES), 'allowSelfReg' => api_htmlentities($allowSelfReg, ENT_QUOTES), 'allowSelfRegProf' => api_htmlentities((string) $allowSelfRegProf, ENT_QUOTES), 'emailForm' => api_htmlentities($emailForm, ENT_QUOTES), 'adminLastName' => api_htmlentities($adminLastName, ENT_QUOTES), 'adminFirstName' => api_htmlentities($adminFirstName, ENT_QUOTES), 'adminPhoneForm' => api_htmlentities($adminPhoneForm, ENT_QUOTES), 'loginForm' => api_htmlentities($loginForm, ENT_QUOTES), 'passForm' => api_htmlentities($passForm, ENT_QUOTES), 'languageForm' => api_htmlentities($languageForm, ENT_QUOTES), 'campusForm' => api_htmlentities($campusForm, ENT_QUOTES), 'educationForm' => api_htmlentities($educationForm, ENT_QUOTES), 'institutionForm' => api_htmlentities($institutionForm, ENT_QUOTES), 'institutionUrlForm' => $institutionUrlFormResult, 'checkEmailByHashSent' => api_htmlentities((string) $checkEmailByHashSent, ENT_QUOTES), 'showEmailNotCheckedToStudent' => api_htmlentities((string) $showEmailNotCheckedToStudent, ENT_QUOTES), 'userMailCanBeEmpty' => api_htmlentities((string) $userMailCanBeEmpty, ENT_QUOTES), 'encryptPassForm' => api_htmlentities($encryptPassForm, ENT_QUOTES), 'session_lifetime' => api_htmlentities((string) $session_lifetime, ENT_QUOTES), 'old_version' => api_htmlentities($my_old_version, ENT_QUOTES), 'new_version' => api_htmlentities($new_version, ENT_QUOTES), 'installationProfile' => api_htmlentities($installationProfile, ENT_QUOTES), 'currentStep' => $current_step, 'isUpdateAvailable' => $isUpdateAvailable, 'checkMigrationStatus' => $checkMigrationStatus, 'logUrl' => '/main/install/get_migration_status.php', 'stepData' => $stepData, ]; ?>