ErrorPage: display debug info in separate box

This commit is contained in:
Aaron van Geffen 2025-02-26 15:33:18 +01:00
parent 13cbe08219
commit 041b56ff8c
3 changed files with 74 additions and 34 deletions

View File

@ -44,6 +44,19 @@ class Dispatcher
} }
} }
public static function errorPage($title, $body)
{
$page = new MainTemplate($title);
$page->adopt(new ErrorPage($title, $body));
if (Registry::get('user')->isAdmin())
{
$page->appendStylesheet(BASEURL . '/css/admin.css');
}
$page->html_main();
}
/** /**
* Kicks a guest to a login form, redirecting them back to this page upon login. * Kicks a guest to a login form, redirecting them back to this page upon login.
*/ */
@ -60,37 +73,24 @@ class Dispatcher
exit; exit;
} }
public static function trigger400() private static function trigger400()
{ {
header('HTTP/1.1 400 Bad Request'); http_response_code(400);
$page = new MainTemplate('Bad request'); self::errorPage('Bad request', 'The server does not understand your request.');
$page->adopt(new DummyBox('Bad request', '<p>The server does not understand your request.</p>'));
$page->html_main();
exit; exit;
} }
public static function trigger403() private static function trigger403()
{ {
header('HTTP/1.1 403 Forbidden'); http_response_code(403);
$page = new MainTemplate('Access denied'); self::errorPage('Forbidden', 'You do not have access to this page.');
$page->adopt(new DummyBox('Forbidden', '<p>You do not have access to the page you requested.</p>'));
$page->html_main();
exit; exit;
} }
public static function trigger404() private static function trigger404()
{ {
header('HTTP/1.1 404 Not Found'); http_response_code(404);
$page = new MainTemplate('Page not found'); $page = new ViewErrorPage('Page not found!');
$page->showContent();
if (Registry::has('user') && Registry::get('user')->isAdmin())
{
$page->appendStylesheet(BASEURL . '/css/admin.css');
}
$page->adopt(new DummyBox('Well, this is a bit embarrassing!', '<p>The page you requested could not be found. Don\'t worry, it\'s probably not your fault. You\'re welcome to browse the website, though!</p>', 'errormsg'));
$page->addClass('errorpage');
$page->html_main();
exit;
} }
} }

View File

@ -3,7 +3,7 @@
* ErrorHandler.php * ErrorHandler.php
* Contains key class ErrorHandler. * Contains key class ErrorHandler.
* *
* Kabuki CMS (C) 2013-2016, Aaron van Geffen * Kabuki CMS (C) 2013-2025, Aaron van Geffen
*****************************************************************************/ *****************************************************************************/
class ErrorHandler class ErrorHandler
@ -47,10 +47,8 @@ class ErrorHandler
// Log the error in the database. // Log the error in the database.
self::logError($error_message, $debug_info, $file, $line); self::logError($error_message, $debug_info, $file, $line);
// Are we considering this fatal? Then display and exit. // Display error and exit.
// !!! TODO: should we consider warnings fatal? self::display($error_message, $file, $line, $debug_info);
if (true) // DEBUG || (!DEBUG && $error_level === E_WARNING || $error_level === E_USER_WARNING))
self::display($file . ' (' . $line . ')<br>' . $error_message, $debug_info);
// If it wasn't a fatal error, well... // If it wasn't a fatal error, well...
self::$handling_error = false; self::$handling_error = false;
@ -118,7 +116,7 @@ class ErrorHandler
} }
// Logs an error into the database. // Logs an error into the database.
private static function logError($error_message = '', $debug_info = '', $file = '', $line = 0) public static function logError($error_message = '', $debug_info = '', $file = '', $line = 0)
{ {
if (!ErrorLog::log([ if (!ErrorLog::log([
'message' => $error_message, 'message' => $error_message,
@ -130,7 +128,7 @@ class ErrorHandler
'request_uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '', 'request_uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '',
])) ]))
{ {
header('HTTP/1.1 503 Service Temporarily Unavailable'); http_response_code(503);
echo '<h2>An Error Occurred</h2><p>Our software could not connect to the database. We apologise for any inconvenience and ask you to check back later.</p>'; echo '<h2>An Error Occurred</h2><p>Our software could not connect to the database. We apologise for any inconvenience and ask you to check back later.</p>';
exit; exit;
} }
@ -138,7 +136,7 @@ class ErrorHandler
return $error_message; return $error_message;
} }
public static function display($message, $debug_info, $is_sensitive = true) public static function display($message, $file, $line, $debug_info, $is_sensitive = true)
{ {
$is_admin = Registry::has('user') && Registry::get('user')->isAdmin(); $is_admin = Registry::has('user') && Registry::get('user')->isAdmin();
@ -167,7 +165,8 @@ class ErrorHandler
$is_admin = Registry::has('user') && Registry::get('user')->isAdmin(); $is_admin = Registry::has('user') && Registry::get('user')->isAdmin();
if (DEBUG || $is_admin) if (DEBUG || $is_admin)
{ {
$page->adopt(new DummyBox('An error occurred!', '<p>' . $message . '</p><pre>' . $debug_info . '</pre>')); $debug_info = sprintf("Trigger point:\n%s (L%d)\n\n%s", $file, $line, $debug_info);
$page->adopt(new ErrorPage('An error occurred!', $message, $debug_info));
// Let's provide the admin navigation despite it all! // Let's provide the admin navigation despite it all!
if ($is_admin) if ($is_admin)
@ -176,9 +175,9 @@ class ErrorHandler
} }
} }
elseif (!$is_sensitive) elseif (!$is_sensitive)
$page->adopt(new DummyBox('An error occurred!', '<p>' . $message . '</p>')); $page->adopt(new ErrorPage('An error occurred!', '<p>' . $message . '</p>'));
else else
$page->adopt(new DummyBox('An error occurred!', '<p>Our apologies, an error occurred while we were processing your request. Please try again later, or contact us if the problem persists.</p>')); $page->adopt(new ErrorPage('An error occurred!', 'Our apologies, an error occurred while we were processing your request. Please try again later, or contact us if the problem persists.'));
// If we got this far, make sure we're not showing stuff twice. // If we got this far, make sure we're not showing stuff twice.
ob_end_clean(); ob_end_clean();

41
templates/ErrorPage.php Normal file
View File

@ -0,0 +1,41 @@
<?php
/*****************************************************************************
* ErrorPage.php
* Defines the template class ErrorPage.
*
* Kabuki CMS (C) 2013-2025, Aaron van Geffen
*****************************************************************************/
class ErrorPage extends Template
{
private $debug_info;
private $message;
private $title;
public function __construct($title, $message, $debug_info = null)
{
$this->title = $title;
$this->message = $message;
$this->debug_info = $debug_info;
}
public function html_main()
{
echo '
<div class="content-box container">
<h2>', $this->title, '</h2>
<p>', nl2br(htmlspecialchars($this->message)), '</p>';
if (isset($this->debug_info))
{
echo '
</div>
<div class="content-box container">
<h4>Debug Info</h4>
<pre>', htmlspecialchars($this->debug_info), '</pre>';
}
echo '
</div>';
}
}