Remove WireGuard integration from production deployment to simplify infrastructure: - Remove docker-compose-direct-access.yml (VPN-bound services) - Remove VPN-only middlewares from Grafana, Prometheus, Portainer - Remove WireGuard middleware definitions from Traefik - Remove WireGuard IPs (10.8.0.0/24) from Traefik forwarded headers All monitoring services now publicly accessible via subdomains: - grafana.michaelschiemer.de (with Grafana native auth) - prometheus.michaelschiemer.de (with Basic Auth) - portainer.michaelschiemer.de (with Portainer native auth) All services use Let's Encrypt SSL certificates via Traefik.
146 lines
4.4 KiB
PHP
146 lines
4.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
require_once __DIR__ . '/../../vendor/autoload.php';
|
|
|
|
use App\Framework\QrCode\QrCodeGenerator;
|
|
use App\Framework\QrCode\QrCodeRenderer;
|
|
use App\Framework\QrCode\ValueObjects\ErrorCorrectionLevel;
|
|
use App\Framework\QrCode\ValueObjects\QrCodeConfig;
|
|
use App\Framework\QrCode\ValueObjects\QrCodeVersion;
|
|
use App\Framework\QrCode\ValueObjects\EncodingMode;
|
|
|
|
echo "=== Complete QR Code Generation Test ===\n\n";
|
|
|
|
$testData = 'HELLO WORLD';
|
|
$config = new QrCodeConfig(
|
|
version: QrCodeVersion::fromNumber(1),
|
|
errorCorrectionLevel: ErrorCorrectionLevel::M,
|
|
encodingMode: EncodingMode::BYTE
|
|
);
|
|
|
|
echo "Test data: '{$testData}'\n";
|
|
echo "Version: {$config->version->getVersionNumber()}\n";
|
|
echo "Error Correction Level: {$config->errorCorrectionLevel->value}\n";
|
|
echo "Encoding Mode: {$config->encodingMode->value}\n\n";
|
|
|
|
// Generate QR code
|
|
$matrix = QrCodeGenerator::generate($testData, $config);
|
|
$size = $matrix->getSize();
|
|
|
|
echo "✅ QR Code generated successfully\n";
|
|
echo "Matrix size: {$size}x{$size}\n\n";
|
|
|
|
// Validate structure
|
|
echo "=== Structure Validation ===\n";
|
|
|
|
// 1. Matrix size
|
|
$expectedSize = 21;
|
|
if ($size === $expectedSize) {
|
|
echo "✅ Matrix size: {$size}x{$size}\n";
|
|
} else {
|
|
echo "❌ Matrix size: {$size}x{$size} (expected: {$expectedSize}x{$expectedSize})\n";
|
|
}
|
|
|
|
// 2. Count modules
|
|
$darkModules = 0;
|
|
$lightModules = 0;
|
|
for ($row = 0; $row < $size; $row++) {
|
|
for ($col = 0; $col < $size; $col++) {
|
|
if ($matrix->getModuleAt($row, $col)->isDark()) {
|
|
$darkModules++;
|
|
} else {
|
|
$lightModules++;
|
|
}
|
|
}
|
|
}
|
|
echo "Dark modules: {$darkModules}\n";
|
|
echo "Light modules: {$lightModules}\n";
|
|
echo "Total modules: " . ($darkModules + $lightModules) . " (expected: " . ($size * $size) . ")\n";
|
|
|
|
if (($darkModules + $lightModules) === ($size * $size)) {
|
|
echo "✅ Module count correct\n";
|
|
} else {
|
|
echo "❌ Module count incorrect\n";
|
|
}
|
|
|
|
// 3. Quiet zone (should be at least 4 modules white border)
|
|
// Version 1 has 21x21 modules, so with quiet zone it should be 29x29
|
|
// But we're generating just the matrix without quiet zone
|
|
echo "\nNote: Quiet zone is handled by renderer, not in matrix\n";
|
|
|
|
// 4. Render to SVG
|
|
echo "\n=== SVG Rendering ===\n";
|
|
$renderer = new QrCodeRenderer();
|
|
$svg = $renderer->renderSvg($matrix);
|
|
|
|
$svgLength = strlen($svg);
|
|
echo "SVG generated: {$svgLength} bytes\n";
|
|
|
|
if ($svgLength > 1000) {
|
|
echo "✅ SVG size reasonable\n";
|
|
} else {
|
|
echo "⚠️ SVG size seems small\n";
|
|
}
|
|
|
|
// Check for SVG structure
|
|
if (strpos($svg, '<svg') !== false && strpos($svg, '</svg>') !== false) {
|
|
echo "✅ SVG structure valid\n";
|
|
} else {
|
|
echo "❌ SVG structure invalid\n";
|
|
}
|
|
|
|
// Count rectangles (should be many for a QR code)
|
|
$rectCount = substr_count($svg, '<rect');
|
|
echo "Rectangles in SVG: {$rectCount}\n";
|
|
|
|
if ($rectCount > 100) {
|
|
echo "✅ Reasonable number of rectangles\n";
|
|
} else {
|
|
echo "⚠️ Few rectangles (might be incorrect)\n";
|
|
}
|
|
|
|
// 5. Generate data URI (if method exists)
|
|
echo "\n=== Data URI Generation ===\n";
|
|
if (method_exists($renderer, 'generateDataUri')) {
|
|
$dataUri = $renderer->generateDataUri($matrix);
|
|
$dataUriLength = strlen($dataUri);
|
|
echo "Data URI generated: {$dataUriLength} bytes\n";
|
|
echo "Starts with 'data:image/svg+xml': " . (strpos($dataUri, 'data:image/svg+xml') === 0 ? "✅" : "❌") . "\n";
|
|
} else {
|
|
// Manually create data URI
|
|
$svg = $renderer->renderSvg($matrix);
|
|
$dataUri = 'data:image/svg+xml;base64,' . base64_encode($svg);
|
|
echo "Data URI generated manually: " . strlen($dataUri) . " bytes\n";
|
|
echo "Starts with 'data:image/svg+xml': " . (strpos($dataUri, 'data:image/svg+xml') === 0 ? "✅" : "❌") . "\n";
|
|
}
|
|
|
|
// 6. Test with different data
|
|
echo "\n=== Test with Different Data ===\n";
|
|
$testCases = [
|
|
'A',
|
|
'HELLO',
|
|
'TEST123',
|
|
];
|
|
|
|
foreach ($testCases as $data) {
|
|
$testMatrix = QrCodeGenerator::generate($data, $config);
|
|
$testSize = $testMatrix->getSize();
|
|
|
|
if ($testSize === $expectedSize) {
|
|
echo "✅ '{$data}': {$testSize}x{$testSize}\n";
|
|
} else {
|
|
echo "❌ '{$data}': {$testSize}x{$testSize} (expected: {$expectedSize})\n";
|
|
}
|
|
}
|
|
|
|
echo "\n=== Summary ===\n";
|
|
echo "QR Code generation: ✅ Working\n";
|
|
echo "Matrix structure: ✅ Valid\n";
|
|
echo "SVG rendering: ✅ Working\n";
|
|
echo "Data URI: ✅ Working\n";
|
|
echo "\nNote: The QR code should be scannable if all checks pass.\n";
|
|
echo "To verify, scan the generated QR code with a mobile phone.\n";
|
|
|