diff --git a/composer.json b/composer.json index 0a17947e..b1300e34 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,9 @@ "twig/twig": "^2.0", "erusev/parsedown": "^1.7", "nikic/fast-route": "^1.3", - "matomo/device-detector": "^6.0", + "matomo/device-detector": "^6.0" + }, + "require-dev": { "filp/whoops": "^2.15" } } diff --git a/system/exception.php b/system/exception.php index 9a233000..077d0f3f 100644 --- a/system/exception.php +++ b/system/exception.php @@ -1,6 +1,6 @@ @@ -8,13 +8,63 @@ * @link https://my-aac.org */ -$whoops = new \Whoops\Run; +if (class_exists(\Whoops\Run::class)) { + $whoops = new \Whoops\Run; + if(IS_CLI) { + $whoops->pushHandler(new \Whoops\Handler\PlainTextHandler); + } + else { + $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler); + } -if(IS_CLI) { - $whoops->pushHandler(new \Whoops\Handler\PlainTextHandler); -} -else { - $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler); + $whoops->register(); + return; } -$whoops->register(); +require LIBS . 'SensitiveException.php'; + +/** + * @param Exception $exception + */ +function exception_handler($exception) { + $message = $exception->getMessage(); + if($exception instanceof SensitiveException) { + $message = 'This error is sensitive and has been logged into ' . LOGS . 'error.log.
View this file for more information.'; + + // log error to file + $f = fopen(LOGS . 'error.log', 'ab'); + if(!$f) { + $message = 'We wanted to save detailed informations about this error, but file: ' . LOGS . "error.log couldn't be opened for writing.. so the detailed information couldn't be saved.. are you sure directory system/logs is writable by web server? Correct this, and then refresh this site."; + } + else { + fwrite($f, '[' . date(DateTime::RFC1123) . '] ' . $exception->getMessage() . PHP_EOL); + fclose($f); + } + } + + $backtrace_formatted = nl2br($exception->getTraceAsString()); + + $message = $message . "

File: {$exception->getFile()}
Line: {$exception->getLine()}"; + + // display basic error message without template + // template is missing, why? probably someone deleted templates dir, or it wasn't downloaded right + $template_file = SYSTEM . 'templates/exception.html.twig'; + if(!file_exists($template_file)) { + echo 'Something went terribly wrong..

'; + echo "$message

"; + echo 'Backtrace:
'; + echo $backtrace_formatted; + return; + } + + // display beautiful error message + // the file is .twig.html, but its not really parsed by Twig + // we just replace some values manually + // cause in case Twig throws exception, we can show it too + $content = file_get_contents($template_file); + $content = str_replace(array('{{ BASE_URL }}', '{{ exceptionClass }}', '{{ message }}', '{{ backtrace }}', '{{ powered_by }}'), array(BASE_URL, get_class($exception), $message, $backtrace_formatted, base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4=')), $content); + + echo $content; +} + +set_exception_handler('exception_handler'); diff --git a/system/libs/SensitiveException.php b/system/libs/SensitiveException.php new file mode 100644 index 00000000..58978198 --- /dev/null +++ b/system/libs/SensitiveException.php @@ -0,0 +1,3 @@ + + + + + + + Something went wrong... + + + + + + + + + + + +
+

Whoops something went wrong...

+
+ Exception class: {{ exceptionClass }}() +

+ {{ message }} +


+ Backtrace:

+ {{ backtrace }} +
+
+ + +