Improved CP error handling and audit log

This commit is contained in:
Pinga 2025-03-31 13:00:34 +03:00
parent 0c6cb72852
commit 18e6eafb41
5 changed files with 113 additions and 3 deletions

View file

@ -128,6 +128,35 @@ class Logger extends \Monolog\Logger
} else {
$logger = new Logger('errors');
ErrorHandler::register($logger);
set_exception_handler(function ($e) use ($logger) {
http_response_code(500);
$logger->error("Unhandled exception", [
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTraceAsString()
]);
include '/var/www/cp/resources/error.html';
});
register_shutdown_function(function () use ($logger) {
$error = error_get_last();
if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
http_response_code(500);
$logger->error("Fatal error", [
'message' => $error['message'],
'file' => $error['file'],
'line' => $error['line'],
'type' => $error['type']
]);
include '/var/www/cp/resources/error.html';
}
});
}
}

View file

@ -0,0 +1,22 @@
<?php
namespace App\Middleware;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Pinga\Session;
class AuditMiddleware extends Middleware
{
public function __invoke(Request $request, RequestHandler $handler)
{
if (isset($_SESSION['auth_user_id'])) {
$userId = (int)$_SESSION['auth_user_id'];
$this->container->get('db')->exec("SET @audit_usr_id = $userId");
$this->container->get('db')->exec("SET @audit_ses_id = " . crc32(\Pinga\Session\Session::id()));
}
return $handler->handle($request);
}
}

View file

@ -261,6 +261,7 @@ $container->set('csrf', function($container) use ($responseFactory) {
return new Slim\Csrf\Guard($responseFactory);
});
$app->add(new \App\Middleware\AuditMiddleware($container));
$app->add(new \App\Middleware\ValidationErrorsMiddleware($container));
$app->add(new \App\Middleware\OldInputMiddleware($container));
$app->add(new \App\Middleware\CsrfViewMiddleware($container));

60
cp/resources/error.html Normal file
View file

@ -0,0 +1,60 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Something went wrong | Namingo</title>
<meta name="theme-color" content="#066fd1">
<!-- CSS files -->
<link href="/assets/css/tabler.min.css" rel="stylesheet"/>
<link href="/assets/css/tabler-flags.min.css" rel="stylesheet"/>
<link href="/assets/css/tabler-payments.min.css" rel="stylesheet"/>
<link href="/assets/css/tabler-vendors.min.css" rel="stylesheet"/>
<style>
@import url('/assets/fonts/inter/inter.css');
:root {
--tblr-font-sans-serif: "Inter", -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif;
}
@supports (font-variation-settings: normal) {
:root {
--tblr-font-sans-serif: "InterVariable", -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif;
font-optical-sizing: auto;
}
}
</style>
</head>
<body class="border-top-wide border-primary">
<div class="page page-center">
<div class="container py-4">
<div class="empty">
<div class="empty-header">Something went wrong</div>
<p class="empty-title">Please try again shortly</p>
<p class="empty-subtitle text-secondary">If the problem persists, please contact support.</p>
<div class="empty-action">
<a href="/." class="btn btn-primary btn-4">
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="icon icon-2"
>
<path d="M5 12l14 0" />
<path d="M5 12l6 6" />
<path d="M5 12l6 -6" />
</svg>
Take me home
</a>
</div>
</div>
</div>
</div>
<script src="/assets/js/tabler.min.js" defer></script>
</body>
</html>

View file

@ -384,6 +384,4 @@ $app->add(function (Psr\Http\Message\ServerRequestInterface $request, Psr\Http\S
->withHeader('Location', '/')
->withStatus(302);
}
});
$app->addErrorMiddleware(false, true, true);
});