From ce2da24b1bc213c581172970ba01dfe35e9d219e Mon Sep 17 00:00:00 2001 From: Daniel Thee Roperto Date: Wed, 9 Nov 2016 16:21:46 +1100 Subject: [PATCH] Issue #22 - Split maintenance.php into preview.php and file.php --- .../controllers/maintenance_static_page.php | 12 +-- file.php | 63 +++++++++++++++ maintenance.php | 79 ------------------- preview.php | 41 ++++++++++ views/info/content.php | 2 +- 5 files changed, 112 insertions(+), 85 deletions(-) create mode 100644 file.php delete mode 100644 maintenance.php create mode 100644 preview.php diff --git a/classes/local/controllers/maintenance_static_page.php b/classes/local/controllers/maintenance_static_page.php index 28753cf..cb4a406 100644 --- a/classes/local/controllers/maintenance_static_page.php +++ b/classes/local/controllers/maintenance_static_page.php @@ -132,12 +132,14 @@ class maintenance_static_page { */ public function get_resources_folder() { global $CFG; - // If you change the path, also change file auth/outage/maintenance.php as it does not use this reference. + + // If you change the path, also change file auth/outage/file.php as it does not use this reference. + $dir = $CFG->dataroot.'/auth_outage/climaintenance'; + if ($this->preview) { - return $CFG->dataroot.'/auth_outage/climaintenance/preview'; - } else { - return $CFG->dataroot.'/auth_outage/climaintenance'; + $dir = $dir.'/preview'; } + return $dir; } /** @@ -319,7 +321,7 @@ class maintenance_static_page { if ($this->preview) { $filename = 'preview/'.$filename; } - $url = (string)new moodle_url('/auth/outage/maintenance.php', ['file' => $filename]); + $url = (string)new moodle_url('/auth/outage/file.php', ['file' => $filename]); return $url; } } diff --git a/file.php b/file.php new file mode 100644 index 0000000..2f6e215 --- /dev/null +++ b/file.php @@ -0,0 +1,63 @@ +. + +/** + * This page is used to fetch files while in maintenance mode. + * + * It should avoid as much as possible using code Moodle API. + * + * @package auth_outage + * @author Daniel Thee Roperto + * @copyright 2016 Catalyst IT + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * + * @var stdClass $CFG + */ + +if (!isset($_GET['file'])) { + http_response_code(400); + die('Missing file parameter.'); +} + +define('NO_DEBUG_DISPLAY', true); +define('ABORT_AFTER_CONFIG', true); +require_once(__DIR__.'/../../config.php'); + +// We are not using any external libraries or references in this file (cli maintenance is active). +// If you change the path below maybe you need to change maintenance_static_page::get_resources_folder() as well. +$resourcedir = $CFG->dataroot.'/auth_outage/climaintenance'; + +// Protect against path traversal attacks. +$file = $resourcedir.'/'.$_GET['file']; +if (realpath($file) !== $file) { + // @codingStandardsIgnoreStart + error_log('Invalid file: '.$_GET['file']); + // @codingStandardsIgnoreEnd + http_response_code(404); + die('Not found.'); +} + +// Detect type, we only support css or PNG images. +header('Content-Type: '.(substr($file, -3) == 'css' ? 'text/css' : 'image/png')); + +// Use cache. +$lifetime = 60 * 60 * 24; // 1 day. +header('Expires: '.gmdate('D, d M Y H:i:s', time() + $lifetime).' GMT'); +header('Pragma: '); +header('Cache-Control: public, max-age='.$lifetime); +header('Accept-Ranges: none'); + +readfile($file); diff --git a/maintenance.php b/maintenance.php deleted file mode 100644 index dc13028..0000000 --- a/maintenance.php +++ /dev/null @@ -1,79 +0,0 @@ -. - -/** - * This page is used to regenerate and preview a maintenance mode static page. - * - * @package auth_outage - * @author Daniel Thee Roperto - * @copyright 2016 Catalyst IT - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - * - * @var stdClass $CFG - */ - -use auth_outage\dml\outagedb; -use auth_outage\local\controllers\maintenance_static_page; - -if (isset($_GET['file'])) { - define('NO_DEBUG_DISPLAY', true); - define('ABORT_AFTER_CONFIG', true); - require_once(__DIR__.'/../../config.php'); - - // We are not using any external libraries or references in this file (cli maintenance is active). - // If you change the path below maybe you need to change maintenance_static_page::get_resources_folder() as well. - $resourcedir = $CFG->dataroot.'/auth_outage/climaintenance'; - - // Protect against path traversal attacks. - $file = $resourcedir.'/'.$_GET['file']; - if (realpath($file) !== $file) { - // @codingStandardsIgnoreStart - error_log('Invalid file: '.$_GET['file']); - // @codingStandardsIgnoreEnd - http_response_code(404); - die('Not found.'); - } - - // Detect type, we only support css or PNG images. - header('Content-Type: '.(substr($file, -3) == 'css' ? 'text/css' : 'image/png')); - - // Use cache. - $lifetime = 60 * 60 * 24; // 1 day. - header('Expires: '.gmdate('D, d M Y H:i:s', time() + $lifetime).' GMT'); - header('Pragma: '); - header('Cache-Control: public, max-age='.$lifetime); - header('Accept-Ranges: none'); - - readfile($file); - return; -} - -if (isset($_GET['debug'])) { - // Use auth/outage/maintenance.php?debug to preview how it will render without triggering maintenance mode. - - require_once(__DIR__.'/../../config.php'); - $id = optional_param('id', null, PARAM_INT); - $outage = is_null($id) ? outagedb::get_next_starting() : outagedb::get_by_id($id); - if (is_null($outage)) { - throw new invalid_parameter_exception('Outage not found.'); - } - - $page = maintenance_static_page::create_from_outage($outage); - $page->set_preview(true); - $page->generate(); - readfile($page->get_template_file()); - return; -} \ No newline at end of file diff --git a/preview.php b/preview.php new file mode 100644 index 0000000..7ba4625 --- /dev/null +++ b/preview.php @@ -0,0 +1,41 @@ +. + +/** + * This page is used to regenerate and preview a maintenance mode static page. + * + * @package auth_outage + * @author Daniel Thee Roperto + * @copyright 2016 Catalyst IT + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * + * @var stdClass $CFG + */ + +use auth_outage\dml\outagedb; +use auth_outage\local\controllers\maintenance_static_page; + +require_once(__DIR__.'/../../config.php'); +$id = optional_param('id', null, PARAM_INT); +$outage = is_null($id) ? outagedb::get_next_starting() : outagedb::get_by_id($id); +if (is_null($outage)) { + throw new invalid_parameter_exception('Outage not found.'); +} + +$page = maintenance_static_page::create_from_outage($outage); +$page->set_preview(true); +$page->generate(); +readfile($page->get_template_file()); diff --git a/views/info/content.php b/views/info/content.php index 542d01f..76a6767 100644 --- a/views/info/content.php +++ b/views/info/content.php @@ -58,7 +58,7 @@ if ($viewbag['admin']) { get_string('infohidewarning', 'auth_outage') ); $adminlinks[] = html_writer::link( - new moodle_url('/auth/outage/maintenance.php', ['debug' => '', 'id' => $viewbag['outage']->id]), + new moodle_url('/auth/outage/preview.php', ['id' => $viewbag['outage']->id]), get_string('infostaticpage', 'auth_outage') );