forked from Public/pics
		
	ErrorPage: display debug info in separate box
This commit is contained in:
		
							parent
							
								
									13cbe08219
								
							
						
					
					
						commit
						041b56ff8c
					
				@ -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.
 | 
			
		||||
	 */
 | 
			
		||||
@ -60,37 +73,24 @@ class Dispatcher
 | 
			
		||||
		exit;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static function trigger400()
 | 
			
		||||
	private static function trigger400()
 | 
			
		||||
	{
 | 
			
		||||
		header('HTTP/1.1 400 Bad Request');
 | 
			
		||||
		$page = new MainTemplate('Bad request');
 | 
			
		||||
		$page->adopt(new DummyBox('Bad request', '<p>The server does not understand your request.</p>'));
 | 
			
		||||
		$page->html_main();
 | 
			
		||||
		http_response_code(400);
 | 
			
		||||
		self::errorPage('Bad request', 'The server does not understand your request.');
 | 
			
		||||
		exit;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static function trigger403()
 | 
			
		||||
	private static function trigger403()
 | 
			
		||||
	{
 | 
			
		||||
		header('HTTP/1.1 403 Forbidden');
 | 
			
		||||
		$page = new MainTemplate('Access denied');
 | 
			
		||||
		$page->adopt(new DummyBox('Forbidden', '<p>You do not have access to the page you requested.</p>'));
 | 
			
		||||
		$page->html_main();
 | 
			
		||||
		http_response_code(403);
 | 
			
		||||
		self::errorPage('Forbidden', 'You do not have access to this page.');
 | 
			
		||||
		exit;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static function trigger404()
 | 
			
		||||
	private static function trigger404()
 | 
			
		||||
	{
 | 
			
		||||
		header('HTTP/1.1 404 Not Found');
 | 
			
		||||
		$page = new MainTemplate('Page not found');
 | 
			
		||||
 | 
			
		||||
		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;
 | 
			
		||||
		http_response_code(404);
 | 
			
		||||
		$page = new ViewErrorPage('Page not found!');
 | 
			
		||||
		$page->showContent();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@
 | 
			
		||||
 * ErrorHandler.php
 | 
			
		||||
 * Contains key class ErrorHandler.
 | 
			
		||||
 *
 | 
			
		||||
 * Kabuki CMS (C) 2013-2016, Aaron van Geffen
 | 
			
		||||
 * Kabuki CMS (C) 2013-2025, Aaron van Geffen
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
 | 
			
		||||
class ErrorHandler
 | 
			
		||||
@ -47,10 +47,8 @@ class ErrorHandler
 | 
			
		||||
		// Log the error in the database.
 | 
			
		||||
		self::logError($error_message, $debug_info, $file, $line);
 | 
			
		||||
 | 
			
		||||
		// Are we considering this fatal? Then display and exit.
 | 
			
		||||
		// !!! TODO: should we consider warnings fatal?
 | 
			
		||||
		if (true) // DEBUG || (!DEBUG && $error_level === E_WARNING || $error_level === E_USER_WARNING))
 | 
			
		||||
			self::display($file . ' (' . $line . ')<br>' . $error_message, $debug_info);
 | 
			
		||||
		// Display error and exit.
 | 
			
		||||
		self::display($error_message, $file, $line, $debug_info);
 | 
			
		||||
 | 
			
		||||
		// If it wasn't a fatal error, well...
 | 
			
		||||
		self::$handling_error = false;
 | 
			
		||||
@ -118,7 +116,7 @@ class ErrorHandler
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 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([
 | 
			
		||||
			'message' => $error_message,
 | 
			
		||||
@ -130,7 +128,7 @@ class ErrorHandler
 | 
			
		||||
			'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>';
 | 
			
		||||
			exit;
 | 
			
		||||
		}
 | 
			
		||||
@ -138,7 +136,7 @@ class ErrorHandler
 | 
			
		||||
		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();
 | 
			
		||||
 | 
			
		||||
@ -167,7 +165,8 @@ class ErrorHandler
 | 
			
		||||
		$is_admin = Registry::has('user') && Registry::get('user')->isAdmin();
 | 
			
		||||
		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!
 | 
			
		||||
			if ($is_admin)
 | 
			
		||||
@ -176,9 +175,9 @@ class ErrorHandler
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		elseif (!$is_sensitive)
 | 
			
		||||
			$page->adopt(new DummyBox('An error occurred!', '<p>' . $message . '</p>'));
 | 
			
		||||
			$page->adopt(new ErrorPage('An error occurred!', '<p>' . $message . '</p>'));
 | 
			
		||||
		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.
 | 
			
		||||
		ob_end_clean();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										41
									
								
								templates/ErrorPage.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								templates/ErrorPage.php
									
									
									
									
									
										Normal 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>';
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user