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
";