Filtro en server params

This commit is contained in:
Juan Pablo Vial
2025-06-03 11:37:14 -04:00
parent cb6fa73a21
commit 18fc9a76fd
8 changed files with 81 additions and 17 deletions

View File

@ -1,10 +1,10 @@
<?php
namespace Incoviba\Common\Implement\Log;
namespace Incoviba\Common\Implement\Log\Formatter;
use Monolog\Formatter\JsonFormatter;
use Monolog\LogRecord;
class PDOFormatter extends JsonFormatter
class PDO extends JsonFormatter
{
public function __construct(int $batchMode = self::BATCH_MODE_JSON, bool $appendNewline = false, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = true)
{

View File

@ -1,13 +1,13 @@
<?php
namespace Incoviba\Common\Implement\Log;
namespace Incoviba\Common\Implement\Log\Handler;
use PDOStatement;
use Monolog\Handler\AbstractProcessingHandler;
use Monolog\LogRecord;
use Monolog\Level;
use Incoviba\Common\Define\Connection;
use Monolog\Handler\AbstractProcessingHandler;
use Monolog\Level;
use Monolog\LogRecord;
use PDOStatement;
class MySQLHandler extends AbstractProcessingHandler
class MySQL extends AbstractProcessingHandler
{
private bool $initialized = false;
private PDOStatement $statement;

View File

@ -0,0 +1,32 @@
<?php
namespace Incoviba\Common\Implement\Log\Processor;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface;
use Monolog\LogRecord;
use Monolog\Processor\ProcessorInterface;
class Request implements ProcessorInterface
{
public function __construct(protected ContainerInterface $container) {}
public function __invoke(LogRecord $record): LogRecord
{
$request = $this->container->get(ServerRequestInterface::class);
$serverFilters = [
'HTTP_',
'QUERY_',
'REDIRECT_',
'REMOTE_',
'REQUEST_',
];
$serverParams = array_filter($request->getServerParams(),
fn($key) => count(array_filter($serverFilters, fn($prefix) => str_starts_with($key, $prefix))) > 0,
ARRAY_FILTER_USE_KEY);
$record->extra['request'] = [
'server' => $serverParams,
'headers' => $request->getHeaders(),
];
return $record;
}
}

View File

@ -1,11 +1,11 @@
<?php
namespace Incoviba\Common\Implement\Log;
namespace Incoviba\Common\Implement\Log\Processor;
use Incoviba\Service;
use Monolog\LogRecord;
use Monolog\Processor\ProcessorInterface;
use Incoviba\Service;
class UserProcessor implements ProcessorInterface
class User implements ProcessorInterface
{
public function __construct(protected Service\Login $loginService) {}
public function __invoke(LogRecord $record): LogRecord

View File

@ -1,4 +1,5 @@
<?php
use Psr\Container\ContainerInterface;
return [
@ -39,14 +40,14 @@ return [
($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development')
? (new Monolog\Handler\StreamHandler('/logs/notices.log'))
->setFormatter($container->get(Monolog\Formatter\LineFormatter::class))
: (new Incoviba\Common\Implement\Log\MySQLHandler($container->get(Incoviba\Common\Define\Connection::class)))
->setFormatter(new Incoviba\Common\Implement\Log\PDOFormatter()),
: (new Incoviba\Common\Implement\Log\Handler\MySQL($container->get(Incoviba\Common\Define\Connection::class)))
->setFormatter(new \Incoviba\Common\Implement\Log\Formatter\PDO()),
Monolog\Level::Notice,
Monolog\Level::Warning,
false
)
], [
$container->get(Incoviba\Common\Implement\Log\UserProcessor::class),
$container->get(Incoviba\Common\Implement\Log\Processor\User::class),
$container->get(Monolog\Processor\IntrospectionProcessor::class),
$container->get(Monolog\Processor\WebProcessor::class),
$container->get(Monolog\Processor\MemoryUsageProcessor::class),
@ -69,6 +70,7 @@ return [
return new Monolog\Logger('access', [
new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:access'),
], [
$container->get(Incoviba\Common\Implement\Log\Processor\Request::class),
$container->get(Monolog\Processor\IntrospectionProcessor::class),
$container->get(Monolog\Processor\WebProcessor::class),
$container->get(Monolog\Processor\MemoryUsageProcessor::class),

View File

@ -24,8 +24,18 @@ class Authentication
if ($this->service->isIn() or $this->isValid($request)) {
return $handler->handle($request);
}
$serverFilters = [
'HTTP_',
'QUERY_',
'REDIRECT_',
'REMOTE_',
'REQUEST_',
];
$serverParams = array_filter($request->getServerParams(),
fn($key) => count(array_filter($serverFilters, fn($prefix) => str_starts_with($key, $prefix))) > 0,
ARRAY_FILTER_USE_KEY);
$this->logger->notice("Not logged in.", [
'Server' => $request->getServerParams(),
'Server' => $serverParams,
'Headers' => $request->getHeaders(),
]);
$response = $this->responseFactory->createResponse(307, 'Not logged in')

View File

@ -19,8 +19,18 @@ class NotAllowed
try {
return $handler->handle($request);
} catch (HttpMethodNotAllowedException $exception) {
$serverFilters = [
'HTTP_',
'QUERY_',
'REDIRECT_',
'REMOTE_',
'REQUEST_',
];
$serverParams = array_filter($request->getServerParams(),
fn($key) => count(array_filter($serverFilters, fn($prefix) => str_starts_with($key, $prefix))) > 0,
ARRAY_FILTER_USE_KEY);
$this->logger->warning($exception, [
'Server' => $request->getServerParams(),
'Server' => $serverParams,
'Headers' => $request->getHeaders(),
]);
$response = $this->responseFactory->createResponse(405, 'Method Not Allowed');

View File

@ -21,8 +21,18 @@ class NotFound
return $handler->handle($request);
} catch (HttpNotFoundException |
EmptyRedis | EmptyResult | Read | Create | Update | Delete $exception) {
$serverFilters = [
'HTTP_',
'QUERY_',
'REDIRECT_',
'REMOTE_',
'REQUEST_',
];
$serverParams = array_filter($request->getServerParams(),
fn($key) => count(array_filter($serverFilters, fn($prefix) => str_starts_with($key, $prefix))) > 0,
ARRAY_FILTER_USE_KEY);
$this->logger->notice($exception, [
'Server' => $request->getServerParams(),
'Server' => $serverParams,
'Headers' => $request->getHeaders(),
]);
$response = $this->responseFactory->createResponse(404, 'Not Found');