|
|
|
<?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');
|
|
|
|
|
|
|
|
$default = '
|
|
|
|
RewriteCond %{REQUEST_URI} !'.$append.'/maintenance.html$
|
|
|
|
RewriteCond %{REMOTE_HOST} !^'.$implode.'
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|