= $maxRequests) { $_SESSION['voucher_create_times'] = $timestamps; return true; } $timestamps[] = $now; $_SESSION['voucher_create_times'] = $timestamps; return false; } // Settings laden $appTitle = $db->getSetting('app_title', 'UniFi Voucher System'); $logoUrl = $db->getSetting('logo_url', ''); $instructionHeader = $db->getSetting('instruction_header', 'So verwenden Sie Ihren Code'); $instructionText = $db->getSetting('instruction_text', ''); $publicAccess = $db->getSetting('public_access', 0); $printTemplate = $db->getSetting('print_template', '

{APP_TITLE}

WLAN Zugangscode

{VOUCHER_CODE}

Gültig bis: {EXPIRY_DATE} um {EXPIRY_TIME} Uhr

Standort: {SITE_NAME}

Maximale Geräte: {MAX_USES}


{INSTRUCTIONS}
'); // Prüfen ob Login erforderlich - aber nur wenn nicht auf login.php if (!$publicAccess && !$auth->isLoggedIn()) { header('Location: login.php'); exit; } $error = ''; $success = ''; $voucherCode = ''; $voucherCreated = false; $voucherData = []; // Sites abrufen if ($auth->isLoggedIn()) { if ($auth->isAdmin()) { $sites = $db->fetchAll("SELECT * FROM sites WHERE is_active = 1 ORDER BY name"); } else { $sites = $db->fetchAll( "SELECT s.* FROM sites s INNER JOIN user_site_access usa ON s.id = usa.site_id WHERE s.is_active = 1 AND usa.user_id = ? ORDER BY s.name", [$_SESSION['user_id']] ); } } else { // Öffentlicher Zugriff - nur Sites mit public_access $sites = $db->fetchAll("SELECT * FROM sites WHERE is_active = 1 AND public_access = 1 ORDER BY name"); } // Voucher erstellen // WICHTIG: create_voucher kommt jetzt aus einem hidden input, nicht vom Button (disabled Buttons werden teils nicht gesendet) if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['create_voucher'])) { if (!$publicAccess && !$auth->isLoggedIn()) { $error = 'Sie müssen angemeldet sein'; } elseif (!$auth->validateCsrfToken($_POST['csrf_token'] ?? '')) { // CSRF wird jetzt fuer ALLE geprueft – auch fuer anonyme oeffentliche // Erstellung (Token wird per Session auch ohne Login vergeben). $error = 'Ungültiges Sicherheits-Token'; } elseif (!$auth->isLoggedIn() && isVoucherRateLimited()) { // Einfacher Session-basierter Throttle gegen Missbrauch/Spam im // oeffentlichen Modus (kein Login = kein Benutzerkontext). $error = 'Zu viele Anfragen. Bitte warten Sie einen Moment.'; } else { try { $siteId = (int)($_POST['site_id'] ?? 0); $voucherName = trim((string)($_POST['voucher_name'] ?? '')); $maxUses = (int)($_POST['max_uses'] ?? 0); $sendEmail = isset($_POST['send_email']) && !empty($_POST['recipient_email']); $recipientEmail = trim((string)($_POST['recipient_email'] ?? '')); // Validierung if (empty($voucherName)) { throw new Exception('Bitte geben Sie einen Voucher-Namen ein'); } if ($maxUses < 1 || $maxUses > 10) { throw new Exception('Anzahl der Geräte muss zwischen 1 und 10 liegen'); } if ($siteId <= 0) { throw new Exception('Bitte wählen Sie einen Standort'); } if ($sendEmail && !filter_var($recipientEmail, FILTER_VALIDATE_EMAIL)) { throw new Exception('Ungültige E-Mail-Adresse'); } // Site-Zugriff prüfen if ($auth->isLoggedIn() && !$auth->hasAccessToSite($siteId)) { throw new Exception('Keine Berechtigung für diese Site'); } // Site-Daten abrufen $site = $db->fetchOne("SELECT * FROM sites WHERE id = ? AND is_active = 1", [$siteId]); if (!$site) { throw new Exception('Site nicht gefunden'); } // Voucher-Namen formatieren $datum = date('Y-m-d'); $fullVoucherName = $datum . '_' . $voucherName; // UniFi Controller initialisieren $controller = new UniFiController( $site['unifi_controller_url'], $site['unifi_username'], Crypto::decrypt($site['unifi_password']), $site['site_id'] ); // Voucher erstellen $voucher = $controller->createVoucher($fullVoucherName, $maxUses, 480); if (!is_array($voucher) || empty($voucher['formatted_code']) || empty($voucher['code'])) { throw new Exception('UniFi hat keinen gültigen Voucher zurückgegeben'); } $voucherCode = $voucher['formatted_code']; // In Datenbank speichern $userId = $auth->isLoggedIn() ? ($_SESSION['user_id'] ?? null) : null; $db->execute( "INSERT INTO vouchers (site_id, user_id, voucher_code, voucher_name, max_uses, expire_minutes, unifi_voucher_id) VALUES (?, ?, ?, ?, ?, 480, ?)", [$siteId, $userId, $voucher['code'], $fullVoucherName, $maxUses, ($voucher['unifi_id'] ?? null)] ); // Voucher-Daten für Druck speichern $expiryTimestamp = time() + (480 * 60); $voucherData = [ 'code' => $voucherCode, 'site_name' => $site['name'], 'max_uses' => $maxUses, 'expiry_date' => date('d.m.Y', $expiryTimestamp), 'expiry_time' => date('H:i', $expiryTimestamp) ]; // E-Mail versenden falls gewünscht if ($sendEmail && !empty($recipientEmail)) { if ($mailer->sendVoucherEmail($recipientEmail, $voucherCode, $site['name'], $maxUses)) { $success .= ' E-Mail wurde erfolgreich versendet!'; } else { $success .= ' (E-Mail konnte nicht versendet werden)'; } } $voucherCreated = true; $success = 'Voucher erfolgreich erstellt!' . ($sendEmail ? ' E-Mail wurde versendet.' : ''); } catch (Exception $e) { $error = 'Fehler: ' . $e->getMessage(); } } } $currentUser = $auth->isLoggedIn() ? $auth->getCurrentUser() : null; // Auto-select wenn nur eine Site $autoSelectSite = (count($sites) === 1) ? $sites[0]['id'] : 0; ?> <?= htmlspecialchars($appTitle) ?>
👋 Hallo,
isAdmin()): ?> ⚙️ Administration Abmelden
🔐 Anmelden

✓ Ihr Zugangs-Code
Der Code ist 8 Stunden ab Erstellung gültig
QR-Code scannen zum Verbinden

Keine verfügbaren Sites gefunden.
isAdmin()): ?> Klicken Sie hier, um Sites anzulegen Bitte kontaktieren Sie Ihren Administrator.