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 @@
+
+
+
+