diff --git a/test.php b/test.php index 472b59c..6beca36 100644 --- a/test.php +++ b/test.php @@ -84,6 +84,157 @@ echo "

7. Session

"; echo "Session Status: " . session_status() . " (1=disabled, 2=active)
"; echo "Session ID: " . session_id() . "
"; +// 8. UniFi API Diagnose +echo "

8. UniFi API Diagnose

"; +try { + $db2 = Database::getInstance(); + $site = $db2->fetchOne("SELECT * FROM sites WHERE is_active = 1 ORDER BY id ASC LIMIT 1"); + if (!$site) { + echo "✗ Keine aktive Site in der Datenbank gefunden
"; + } else { + echo "Site: " . htmlspecialchars($site['name']) . "
"; + echo "Controller URL: " . htmlspecialchars($site['unifi_controller_url']) . "
"; + echo "Site ID: " . htmlspecialchars($site['site_id']) . "
"; + echo "Username: " . htmlspecialchars($site['unifi_username']) . "
"; + echo "
"; + + // --- Raw Login Test --- + echo "Login-Test (raw cURL):
"; + $cookieFile = tempnam(sys_get_temp_dir(), 'UNIFI_TEST_'); + $csrfToken = null; + $controllerUrl = rtrim($site['unifi_controller_url'], '/'); + + $ch = curl_init(); + $responseHeaders = []; + curl_setopt_array($ch, [ + CURLOPT_URL => $controllerUrl . "/api/auth/login", + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => json_encode([ + 'username' => $site['unifi_username'], + 'password' => $site['unifi_password'] + ]), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_COOKIEJAR => $cookieFile, + CURLOPT_COOKIEFILE => $cookieFile, + CURLOPT_TIMEOUT => 10, + CURLOPT_CONNECTTIMEOUT => 5, + CURLOPT_FOLLOWLOCATION => false, + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json', + 'Origin: ' . $controllerUrl, + 'Referer: ' . $controllerUrl . '/login', + ], + CURLOPT_HEADERFUNCTION => function($ch, $header) use (&$csrfToken, &$responseHeaders) { + $responseHeaders[] = rtrim($header); + $parts = explode(':', $header, 2); + if (count($parts) === 2 && strtolower(trim($parts[0])) === 'x-csrf-token') { + $csrfToken = trim($parts[1]); + } + return strlen($header); + } + ]); + + $body = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curlErr = curl_error($ch); + $info = curl_getinfo($ch); + curl_close($ch); + + if ($curlErr) { + echo "✗ cURL Fehler: " . htmlspecialchars($curlErr) . "
"; + } else { + $icon = ($httpCode === 200) ? '✓' : '✗'; + echo "$icon HTTP Code: $httpCode
"; + echo "Effective URL: " . htmlspecialchars($info['url']) . "
"; + } + + // Response headers + echo "
Response-Header:
";
+        foreach ($responseHeaders as $h) {
+            if ($h !== '') echo htmlspecialchars($h) . "\n";
+        }
+        echo "
"; + + // CSRF token + if ($csrfToken !== null) { + echo "✓ X-CSRF-Token aus Header: " . htmlspecialchars($csrfToken) . "
"; + } else { + echo "✗ Kein X-CSRF-Token im Login-Response-Header gefunden
"; + // Check cookie file fallback + if (file_exists($cookieFile)) { + $tokenFromCookie = null; + foreach (file($cookieFile) as $line) { + $line = trim($line); + if ($line === '' || $line[0] === '#') continue; + $parts = explode("\t", $line); + if (count($parts) >= 7 && strtoupper($parts[5]) === 'TOKEN') { + $tokenFromCookie = $parts[6]; + } + } + if ($tokenFromCookie) { + echo "✓ CSRF-Token aus Cookie-Datei (Fallback): " . htmlspecialchars($tokenFromCookie) . "
"; + $csrfToken = $tokenFromCookie; + } else { + echo "✗ Auch kein TOKEN-Cookie in der Cookie-Datei gefunden
"; + } + } + } + + // Response body + echo "
Login Response Body:
";
+        echo htmlspecialchars(substr($body, 0, 2000));
+        echo "
"; + + // Cookie file contents + if (file_exists($cookieFile)) { + $cookieContents = file_get_contents($cookieFile); + echo "Cookie-Datei:
";
+            echo htmlspecialchars($cookieContents ?: '(leer)');
+            echo "
"; + } + + // --- API Test (only if login succeeded) --- + if ($httpCode === 200) { + echo "API-Test (stat/voucher GET):
"; + $apiHeaders = ['Content-Type: application/json']; + if ($csrfToken !== null) { + $apiHeaders[] = 'X-CSRF-Token: ' . $csrfToken; + } + + $ch2 = curl_init(); + curl_setopt_array($ch2, [ + CURLOPT_URL => $controllerUrl . "/proxy/network/api/s/" . $site['site_id'] . "/stat/voucher", + CURLOPT_HTTPGET => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_COOKIEFILE => $cookieFile, + CURLOPT_TIMEOUT => 10, + CURLOPT_CONNECTTIMEOUT => 5, + CURLOPT_HTTPHEADER => $apiHeaders, + ]); + $apiBody = curl_exec($ch2); + $apiCode = curl_getinfo($ch2, CURLINFO_HTTP_CODE); + $apiErr = curl_error($ch2); + curl_close($ch2); + + if ($apiErr) { + echo "✗ cURL Fehler: " . htmlspecialchars($apiErr) . "
"; + } else { + $icon2 = ($apiCode === 200) ? '✓' : '✗'; + echo "$icon2 HTTP Code: $apiCode
"; + } + echo "API Response Body:
";
+            echo htmlspecialchars(substr($apiBody, 0, 2000));
+            echo "
"; + } + + @unlink($cookieFile); + } +} catch (Exception $e) { + echo "✗ Diagnose-Fehler: " . htmlspecialchars($e->getMessage()) . "
"; +} + echo "
"; echo "

✓ Test abgeschlossen

"; echo "

Zum Login | Zur Startseite

";