Inter, Font Awesome, Chart.js, qrcodejs und TinyMCE liegen jetzt unter assets/vendor/ und werden vom eigenen Server ausgeliefert. Warum: - Datenschutz: bisher ging bei jedem Seitenaufruf die IP der Nutzer an Google Fonts, cdnjs, jsDelivr und Tiny Cloud - Funktion: UniFi-Installationen stehen oft in abgeschotteten Netzen – dort fehlten bisher Schrift, Icons, Diagramme und Editor Neu: includes/Ui.php - Ui::head()/Ui::script() binden die Assets ein und hängen einen Versionsstempel an (?v=filemtime), damit Browser nach einem Update nicht das alte CSS aus dem Cache nehmen - Ui::themeScript() setzt das Theme aus der gespeicherten Auswahl oder – wenn keine vorliegt – aus prefers-color-scheme; global.js folgt Systemwechseln live, solange nichts manuell gewählt wurde - <meta name="color-scheme"> ergänzt, damit Formularelemente passen Der TinyMCE-API-Key entfällt: der Editor läuft immer lokal (GPL-Variante), inklusive deutscher Oberfläche, wenn die App auf Deutsch steht. Neu: tools/demo/build.py – baut aus dem Projekt eine Demo-Instanz ohne Datenbank (Stubs für Database/Auth, feste Beispieldaten). Damit lassen sich Screenshots reproduzierbar erzeugen und alle Seiten einmal rendern (Smoke-Test), ohne eine MySQL-Instanz aufzusetzen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
31 lines
1.8 KiB
PHP
31 lines
1.8 KiB
PHP
<?php
|
|
/** Demo-Stub: angemeldeter Admin ohne echte Sitzungspruefung. */
|
|
require_once __DIR__ . '/Database.php';
|
|
require_once __DIR__ . '/Totp.php';
|
|
class Auth {
|
|
private $user = ['id'=>1,'name'=>'Marie Sander','email'=>'marie.sander@example.com','is_admin'=>1,
|
|
'role'=>'admin','is_active'=>1,'password_hash'=>'x','totp_enabled'=>0,'auth_source'=>'local'];
|
|
public function __construct() { if (session_status() === PHP_SESSION_NONE) @session_start(); $_SESSION['user_id'] = 1; }
|
|
public function clientIp() { return '192.168.10.42'; }
|
|
public function login($e, $p) { return false; }
|
|
public function isTotpPending() { return isset($_GET['totp']); }
|
|
public function verifyTotpLogin($c) { return false; }
|
|
public function enableTotp($u, $s) { return true; }
|
|
public function disableTotp($u) { return true; }
|
|
public function generateBackupCodes($n = 8) { return ['A1B2-C3D4','E5F6-G7H8','J9K0-L1M2','N3P4-Q5R6']; }
|
|
public function regenerateBackupCodes($u) { return $this->generateBackupCodes(); }
|
|
public function backupCodesRemaining($u) { return 6; }
|
|
public function writeAuditLog(...$a) { return true; }
|
|
public function logout() {}
|
|
public function isLoggedIn() { return !isset($_GET['anon']); }
|
|
public function isAdmin() { return $this->isLoggedIn(); }
|
|
public function getCurrentUser() { return $this->isLoggedIn() ? $this->user : null; }
|
|
public function hasAccessToSite($id) { return true; }
|
|
public function validateCsrfToken($t) { return true; }
|
|
public function getCsrfToken() { return 'demo-csrf-token'; }
|
|
public function registerUser(...$a) { return true; }
|
|
public function requireAdmin() {}
|
|
public function requireLogin() {}
|
|
public function activeSessionCount() { return 3; }
|
|
public function logoutOtherSessions() { return 2; }
|
|
}
|