SecretScrubbingProcessorTest.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Tests\Unit\Logging;
  4. use App\Logging\SecretScrubbingProcessor;
  5. use Monolog\Formatter\JsonFormatter;
  6. use Monolog\Level;
  7. use Monolog\LogRecord;
  8. use PHPUnit\Framework\TestCase;
  9. final class SecretScrubbingProcessorTest extends TestCase
  10. {
  11. public function testBearerTokenInContextIsScrubbed(): void
  12. {
  13. $processor = new SecretScrubbingProcessor();
  14. $record = $this->record('outbound api call', [
  15. 'authorization' => 'Bearer irdb_svc_ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',
  16. ]);
  17. $out = $processor($record);
  18. self::assertSame('***', $out->context['authorization']);
  19. }
  20. public function testFormattedOutputDoesNotLeakBearerToken(): void
  21. {
  22. $processor = new SecretScrubbingProcessor();
  23. $record = $this->record('outbound', [
  24. 'headers' => ['Authorization' => 'Bearer irdb_svc_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'],
  25. ]);
  26. $out = $processor($record);
  27. $line = (new JsonFormatter())->format($out);
  28. self::assertStringNotContainsString('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', $line);
  29. self::assertStringContainsString('***', $line);
  30. }
  31. public function testLocalAdminPasswordHashKeyScrubbed(): void
  32. {
  33. $processor = new SecretScrubbingProcessor();
  34. $record = $this->record('config', [
  35. 'LOCAL_ADMIN_PASSWORD_HASH' => '$argon2id$v=19$abc$def',
  36. 'OIDC_CLIENT_SECRET' => 'oidc-secret',
  37. ]);
  38. $out = $processor($record);
  39. self::assertSame('***', $out->context['LOCAL_ADMIN_PASSWORD_HASH']);
  40. self::assertSame('***', $out->context['OIDC_CLIENT_SECRET']);
  41. }
  42. public function testNonSensitiveLeftAlone(): void
  43. {
  44. $processor = new SecretScrubbingProcessor();
  45. $record = $this->record('search ok', ['count' => 42, 'q' => '203.0.113.42']);
  46. $out = $processor($record);
  47. self::assertSame(42, $out->context['count']);
  48. self::assertSame('203.0.113.42', $out->context['q']);
  49. }
  50. /**
  51. * @param array<string, mixed> $context
  52. */
  53. private function record(string $message, array $context): LogRecord
  54. {
  55. return new LogRecord(
  56. datetime: new \DateTimeImmutable(),
  57. channel: 'test',
  58. level: Level::Info,
  59. message: $message,
  60. context: $context,
  61. );
  62. }
  63. }