0,'B'=>1,'C'=>2,'D'=>3,'E'=>4,'F'=>5,'G'=>6,'H'=>7,'I'=>8,'J'=>9,'K'=>10,'L'=>11,'M'=>12,'N'=>13,'O'=>14,'P'=>15,'Q'=>16,'R'=>17,'S'=>18,'T'=>19,'U'=>20,'V'=>21,'W'=>22,'X'=>23,'Y'=>24,'Z'=>25,'2'=>26,'3'=>27,'4'=>28,'5'=>29,'6'=>30,'7'=>31]; $decoded = ''; $buffer = 0; $bits = 0; for ($i = 0; $i < strlen($b32); $i++) { $char = $b32[$i]; if (!isset($map[$char])) continue; $buffer = ($buffer << 5) | $map[$char]; $bits += 5; if ($bits >= 8) { $bits -= 8; $decoded .= chr(($buffer >> $bits) & 0xFF); } } return $decoded; } public static function generateSecret($length = 16) { $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'; $secret = ''; for ($i = 0; $i < $length; $i++) $secret .= $chars[random_int(0, 31)]; return $secret; } public static function getQRCodeUrl($username, $secret) { $issuer = urlencode("SG 07 St.Leon"); $account = urlencode($username); $otpauth = "otpauth://totp/{$issuer}:{$account}?secret={$secret}&issuer={$issuer}"; return "https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=" . urlencode($otpauth); } } // ============================================================================ // 2. DATENBANK SETUP (News & Benutzer) // ============================================================================ try { $db = new PDO('sqlite:news_database.sqlite'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // News Tabelle initialisieren $db->exec("CREATE TABLE IF NOT EXISTS news ( id INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT, department TEXT, title TEXT, content TEXT, full_text TEXT, image TEXT, link TEXT )"); // DB-Schema Updates (Falls noch alte Version) try { $db->exec("ALTER TABLE news ADD COLUMN full_text TEXT"); } catch(PDOException $e) {} try { $db->exec("ALTER TABLE news ADD COLUMN image2 TEXT"); } catch(PDOException $e) {} try { $db->exec("ALTER TABLE news ADD COLUMN image3 TEXT"); } catch(PDOException $e) {} try { $db->exec("ALTER TABLE news ADD COLUMN image4 TEXT"); } catch(PDOException $e) {} try { $db->exec("ALTER TABLE news ADD COLUMN title_index INTEGER DEFAULT 1"); } catch(PDOException $e) {} $db->exec("CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE, password_hash TEXT, totp_secret TEXT )"); } catch(PDOException $e) { die("Datenbankfehler: " . $e->getMessage()); } $userCount = $db->query("SELECT COUNT(*) FROM users")->fetchColumn(); // ============================================================================ // 3. ERSTEINRICHTUNG // ============================================================================ if ($userCount == 0) { $new_secret = MiniTOTP::generateSecret(); if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['do_setup'])) { $user = trim($_POST['username']); $pass = $_POST['password']; $secret = $_POST['totp_secret']; if (!empty($user) && !empty($pass)) { $stmt = $db->prepare("INSERT INTO users (username, password_hash, totp_secret) VALUES (?, ?, ?)"); $stmt->execute([$user, password_hash($pass, PASSWORD_DEFAULT), $secret]); header("Location: admin.php"); exit; } } ?>
1. Scanne diesen QR-Code mit dem Google Authenticator oder Authy.
Das Titelbild wird immer auf der Startseite in der kleinen Karte angezeigt.
Wenn jemand auf "Weiterlesen" klickt, werden alle Bilder, die du hier hinterlegst, im Artikel angezeigt.
Tipp: Bilder werden nun automatisch vom System im perfekten Format zugeschnitten (CSS object-fit). Du sparst dir das nervige manuelle Zurechtschneiden!
| Datum | Abteilung | Titel | Aktion |
|---|---|---|---|
| = htmlspecialchars($news_item['date']) ?> | = htmlspecialchars($news_item['department']) ?> | = htmlspecialchars($news_item['title']) ?> | Ändern |