Skip to content

Commit 7d408e3

Browse files
committed
Issue #43: Control the contents of 'extra' in error log.
Signed-off-by: alexmerlin <alex.merlin.1985@gmail.com>
1 parent c0dcf58 commit 7d408e3

18 files changed

+482
-11
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"php": "~8.2.0 || ~8.3.0 || ~8.4.0",
3030
"dotkernel/dot-log": "^4.1.0",
3131
"laminas/laminas-diactoros": "^3.3",
32+
"laminas/laminas-stdlib": "^3.20",
3233
"laminas/laminas-stratigility": "^3.11",
3334
"mezzio/mezzio": "^3.19",
3435
"psr/http-message": "^1.0 || ^2.0",
Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,55 @@
11
<?php
22

3+
declare(strict_types=1);
4+
35
use Dot\ErrorHandler\ErrorHandlerInterface;
6+
use Dot\ErrorHandler\Extra\Processor\CookieProcessor;
7+
use Dot\ErrorHandler\Extra\Processor\HeaderProcessor;
8+
use Dot\ErrorHandler\Extra\Processor\RequestProcessor;
9+
use Dot\ErrorHandler\Extra\Processor\SessionProcessor;
10+
use Dot\ErrorHandler\Extra\Processor\TraceProcessor;
11+
use Dot\ErrorHandler\Extra\Provider\CookieProvider;
12+
use Dot\ErrorHandler\Extra\Provider\HeaderProvider;
13+
use Dot\ErrorHandler\Extra\Provider\RequestProvider;
14+
use Dot\ErrorHandler\Extra\Provider\ServerProvider;
15+
use Dot\ErrorHandler\Extra\Provider\SessionProvider;
16+
use Dot\ErrorHandler\Extra\Provider\TraceProvider;
417
use Dot\ErrorHandler\LogErrorHandler;
518

619
return [
7-
'dependencies' => [
20+
'dependencies' => [
821
'aliases' => [
922
ErrorHandlerInterface::class => LogErrorHandler::class,
10-
]
23+
],
1124
],
1225
'dot-errorhandler' => [
1326
'loggerEnabled' => true,
14-
'logger' => 'dot-log.default_logger'
15-
]
27+
'logger' => 'dot-log.default_logger',
28+
'loggerExtra' => [
29+
CookieProvider::class => [
30+
'enabled' => true,
31+
'processor' => CookieProcessor::class,
32+
],
33+
HeaderProvider::class => [
34+
'enabled' => true,
35+
'processor' => HeaderProcessor::class,
36+
],
37+
RequestProvider::class => [
38+
'enabled' => true,
39+
'processor' => RequestProcessor::class,
40+
],
41+
ServerProvider::class => [
42+
'enabled' => true,
43+
'processor' => null,
44+
],
45+
SessionProvider::class => [
46+
'enabled' => true,
47+
'processor' => SessionProcessor::class,
48+
],
49+
TraceProvider::class => [
50+
'enabled' => true,
51+
'processor' => TraceProcessor::class,
52+
],
53+
],
54+
],
1655
];

src/Extra/ExtraProvider.php

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Dot\ErrorHandler\Extra;
6+
7+
use Dot\ErrorHandler\Extra\Processor\ProcessorInterface;
8+
use Dot\ErrorHandler\Extra\Provider\CookieProvider;
9+
use Dot\ErrorHandler\Extra\Provider\HeaderProvider;
10+
use Dot\ErrorHandler\Extra\Provider\RequestProvider;
11+
use Dot\ErrorHandler\Extra\Provider\ServerProvider;
12+
use Dot\ErrorHandler\Extra\Provider\SessionProvider;
13+
use Dot\ErrorHandler\Extra\Provider\TraceProvider;
14+
15+
use function array_key_exists;
16+
use function class_exists;
17+
use function is_bool;
18+
use function is_string;
19+
20+
class ExtraProvider
21+
{
22+
private CookieProvider $cookie;
23+
private HeaderProvider $header;
24+
private RequestProvider $request;
25+
private ServerProvider $server;
26+
private SessionProvider $session;
27+
private TraceProvider $trace;
28+
29+
public function __construct(array $options = [])
30+
{
31+
$extras = [
32+
'cookie' => CookieProvider::class,
33+
'header' => HeaderProvider::class,
34+
'request' => RequestProvider::class,
35+
'server' => ServerProvider::class,
36+
'session' => SessionProvider::class,
37+
'trace' => TraceProvider::class,
38+
];
39+
40+
foreach ($extras as $logKey => $logClass) {
41+
$enabled = false;
42+
$processor = null;
43+
if (array_key_exists($logClass, $options)) {
44+
if (isset($options[$logClass]['enabled']) && is_bool($options[$logClass]['enabled'])) {
45+
$enabled = $options[$logClass]['enabled'];
46+
}
47+
if (
48+
isset($options[$logClass]['processor'])
49+
&& is_string($options[$logClass]['processor'])
50+
&& class_exists($options[$logClass]['processor'])
51+
) {
52+
$processor = new $options[$logClass]['processor']();
53+
if (! $processor instanceof ProcessorInterface) {
54+
$processor = null;
55+
}
56+
}
57+
}
58+
59+
$this->$logKey = new $logClass($enabled, $processor);
60+
}
61+
}
62+
63+
public function getCookie(): CookieProvider
64+
{
65+
return $this->cookie;
66+
}
67+
68+
public function getHeader(): HeaderProvider
69+
{
70+
return $this->header;
71+
}
72+
73+
public function getRequest(): RequestProvider
74+
{
75+
return $this->request;
76+
}
77+
78+
public function getServer(): ServerProvider
79+
{
80+
return $this->server;
81+
}
82+
83+
public function getSession(): SessionProvider
84+
{
85+
return $this->session;
86+
}
87+
88+
public function getTrace(): TraceProvider
89+
{
90+
return $this->trace;
91+
}
92+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Dot\ErrorHandler\Extra\Processor;
6+
7+
use function array_map;
8+
use function str_pad;
9+
use function strlen;
10+
use function substr;
11+
12+
class CookieProcessor implements ProcessorInterface
13+
{
14+
public function process(array $data): array
15+
{
16+
return array_map(fn (string $cookie): string => str_pad(substr($cookie, 0, 8), strlen($cookie), '.'), $data);
17+
}
18+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Dot\ErrorHandler\Extra\Processor;
6+
7+
use function array_map;
8+
use function implode;
9+
10+
class HeaderProcessor implements ProcessorInterface
11+
{
12+
public function process(array $data): array
13+
{
14+
return array_map(fn (array $headerSet): string => implode("; ", $headerSet), $data);
15+
}
16+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Dot\ErrorHandler\Extra\Processor;
6+
7+
interface ProcessorInterface
8+
{
9+
public function process(array $data): array;
10+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Dot\ErrorHandler\Extra\Processor;
6+
7+
use function is_array;
8+
use function is_string;
9+
use function preg_replace;
10+
use function str_contains;
11+
use function strtolower;
12+
13+
class RequestProcessor implements ProcessorInterface
14+
{
15+
public function process(array $data): array
16+
{
17+
$return = [];
18+
foreach ($data as $key => $value) {
19+
if (is_array($value)) {
20+
$return[$key] = $this->process($value);
21+
} elseif (is_string($value)) {
22+
$lowerKey = strtolower($key);
23+
if (
24+
str_contains($lowerKey, 'password') ||
25+
str_contains($lowerKey, 'key') ||
26+
str_contains($lowerKey, 'csrf') ||
27+
str_contains($lowerKey, 'token')
28+
) {
29+
$return[$key] = preg_replace('/[\da-z]/i', 'x', $value);
30+
} else {
31+
$return[$key] = $value;
32+
}
33+
} else {
34+
$return[$key] = $value;
35+
}
36+
}
37+
38+
return $return;
39+
}
40+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Dot\ErrorHandler\Extra\Processor;
6+
7+
class ServerProcessor implements ProcessorInterface
8+
{
9+
public function process(array $data): array
10+
{
11+
return $data;
12+
}
13+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Dot\ErrorHandler\Extra\Processor;
6+
7+
use Laminas\Stdlib\ArrayUtils;
8+
9+
use function array_map;
10+
11+
class SessionProcessor implements ProcessorInterface
12+
{
13+
public function process(array $data): array
14+
{
15+
return array_map(fn ($container): array => ArrayUtils::iteratorToArray($container), $data);
16+
}
17+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Dot\ErrorHandler\Extra\Processor;
6+
7+
use function array_map;
8+
use function sprintf;
9+
10+
class TraceProcessor implements ProcessorInterface
11+
{
12+
public function process(array $data): array
13+
{
14+
return array_map(
15+
fn ($trace): string => sprintf(
16+
'%s%s%s:%d',
17+
$trace['class'] ?? $trace['file'] ?? 'unknown',
18+
$trace['type'] ?? '->',
19+
$trace['function'] ?? 'unknown',
20+
$trace['line'] ?? 0
21+
),
22+
$data
23+
);
24+
}
25+
}

0 commit comments

Comments
 (0)