Erweiterte Features (1/2): Trusted-Proxy-IP, Bandbreitenlimits, 2FA

- Schema: updater/migrations/0002 + database.sql (users.totp_*, voucher_templates
  qos_*, neue Tabelle api_keys)
- Trusted-Proxy-IP: Auth::clientIp() wertet X-Forwarded-For nur hinter
  konfiguriertem trusted_proxy aus (korrektes Rate-Limit/Audit hinter Proxy)
- Bandbreiten-/Datenlimits: UniFiController::createVoucher akzeptiert QoS
  (down/up kbit/s, Datenkontingent MB); Voucher-Profile speichern Limits,
  Voucher-Formular reicht sie via Template-Quick-Select durch
- 2FA (TOTP, RFC 6238): includes/Totp.php (gegen RFC-Testvektoren verifiziert),
  zweistufiger Login, admin/security.php zum Aktivieren/Deaktivieren mit QR,
  Nav-Link + i18n
This commit is contained in:
Claude 2026-06-05 19:39:28 +00:00
parent 51485810b4
commit eec28f77b8
No known key found for this signature in database
12 changed files with 458 additions and 16 deletions

View file

@ -156,7 +156,8 @@ class UniFiController {
}
// Voucher erstellen
public function createVoucher($voucherName, $maxUses, $expireMinutes = 480) {
// $options: optionale QoS-Limits ['down' => kbps, 'up' => kbps, 'quota_mb' => MB]
public function createVoucher($voucherName, $maxUses, $expireMinutes = 480, $options = []) {
$data = [
'cmd' => 'create-voucher',
'expire' => (int)$expireMinutes,
@ -164,7 +165,18 @@ class UniFiController {
'note' => $voucherName,
'quota' => (int)$maxUses
];
// Bandbreiten-/Datenlimits (UniFi QoS) optional setzen
$down = isset($options['down']) ? (int)$options['down'] : 0;
$up = isset($options['up']) ? (int)$options['up'] : 0;
$bytes = isset($options['quota_mb']) ? (int)$options['quota_mb'] : 0;
if ($down > 0 || $up > 0 || $bytes > 0) {
$data['qos_overwrite'] = true;
if ($down > 0) $data['down'] = $down; // kbit/s
if ($up > 0) $data['up'] = $up; // kbit/s
if ($bytes > 0) $data['bytes'] = $bytes; // Megabyte
}
$response = $this->apiRequest("/proxy/network/api/s/{$this->siteId}/cmd/hotspot", $data);
if (!isset($response['data'][0]['create_time'])) {