Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chamilo-lms/plugin/maintenancemode/plugin.php

194 lines
5.5 KiB

<?php
/* For licensing terms, see /license.txt */
/**
* Maintenance mode facilitator plugin
* @package chamilo.plugin
*/
$plugin = MaintenanceModePlugin::create();
$plugin_info = $plugin->get_info();
$editFile = false;
$file = api_get_path(SYS_PATH).'.htaccess';
$maintenanceHtml = api_get_path(SYS_PATH).'maintenance.html';
if ($plugin->isEnabled()) {
if (!file_exists($file)) {
Display::addFlash(
Display::return_message(
"$file does not exists. ",
'warning'
)
);
} else {
if (is_readable($file) && is_writable($file)) {
$editFile = true;
} else {
if (!is_readable($file)) {
Display::addFlash(
Display::return_message("$file is not readable", 'warning')
);
}
if (!is_writable($file)) {
Display::addFlash(
Display::return_message("$file is not writable", 'warning')
);
}
}
}
}
if ($editFile && api_is_platform_admin()) {
$originalContent = file_get_contents($file);
$beginLine = '###@@ This part was generated by the edit_htaccess plugin @@##';
$endLine = '###@@ End @@##';
$handler = fopen($file, 'r');
$deleteLinesList = [];
$deleteLine = false;
$contentNoBlock = '';
$block = '';
while (!feof($handler)) {
$line = fgets($handler);
$lineTrimmed = trim($line);
if ($lineTrimmed == $beginLine) {
$deleteLine = true;
}
if ($deleteLine) {
$block .= $line;
} else {
$contentNoBlock .= $line;
}
if ($lineTrimmed == $endLine) {
$deleteLine = false;
}
}
fclose($handler);
$block = str_replace($beginLine, '', $block);
$block = str_replace($endLine, '', $block);
$form = new FormValidator('htaccess');
$form->addHtml('The following text will be added in the /.htaccess');
$element = $form->addText(
'ip',
[$plugin->get_lang('IPAdmin'), $plugin->get_lang('IPAdminDescription')]
);
$element->freeze();
$form->addTextarea('text', 'htaccess', ['rows' => '15']);
$config = [
'ToolbarSet' => 'Documents',
'Width' => '100%',
'Height' => '400',
'allowedContent' => true
];
$form->addHtmlEditor(
'maintenance',
'Maintenance',
true,
true,
$config
);
$form->addCheckBox('active', null, get_lang('Active'));
$form->addButtonSave(get_lang('Save'));
$content = '';
if (file_exists($maintenanceHtml)) {
$content = file_get_contents($maintenanceHtml);
}
if (empty($content)) {
$content = '<html><head><title></title></head><body></body></html>';
}
$isActive = api_get_plugin_setting('maintenancemode', 'active');
$ip = api_get_real_ip();
if ($ip == '::1') {
$ip = '127.0.0.1';
}
$ipSubList = explode('.', $ip);
$implode = implode('\.', $ipSubList);
$append = api_get_configuration_value('url_append');
8 years ago
$default = '
RewriteCond %{REQUEST_URI} !'.$append.'/maintenance.html$
RewriteCond %{REMOTE_HOST} !^'.$implode.'
8 years ago
RewriteRule \.*$ '.$append.'/maintenance.html [R=302,L]
';
if (empty($block)) {
$block = $default;
}
$form->setDefaults([
'text' => $block,
'maintenance' => $content,
'ip' => $ip,
'active' => $isActive,
]);
if ($form->validate()) {
$values = $form->getSubmitValues();
$text = $values['text'];
$active = isset($values['active']) ? true : false;
$content = $values['maintenance'];
// Restore htaccess with out the block
$newFileContent = $beginLine.PHP_EOL;
$newFileContent .= trim($text).PHP_EOL;
$newFileContent .= $endLine;
$newFileContent .= PHP_EOL;
$newFileContent .= $contentNoBlock;
// Remove ^m chars
$newFileContent = str_ireplace("\x0D", '', $newFileContent);
file_put_contents($file, $newFileContent);
$handle = curl_init(api_get_path(WEB_PATH));
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($handle);
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
curl_close($handle);
// Looks htaccess contains errors. Restore as it was.
if ($httpCode != 200) {
Display::addFlash(
Display::return_message(
'Check your htaccess instructions. The original file was restored.',
'warning'
)
);
$originalContent = str_replace("\x0D", '', $originalContent);
file_put_contents($file, $originalContent);
} else {
$result = file_put_contents($maintenanceHtml, $content);
if ($result === false) {
Display::addFlash(
Display::return_message(
sprintf($plugin->get_lang('MaintenanceFileNotPresent'), $maintenanceHtml),
'warning'
)
);
}
}
if ($active == false) {
$message = $plugin->get_lang('MaintenanceModeIsOff');
$contentNoBlock = str_replace("\x0D", '', $contentNoBlock);
file_put_contents($file, $contentNoBlock);
} else {
$message = $plugin->get_lang('MaintenanceModeIsOn');
}
Display::addFlash(Display::return_message($message));
}
$plugin_info['settings_form'] = $form;
}