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; } } ?> Setup | SG 07

Ersteinrichtung

QR Code

1. Scanne diesen QR-Code mit dem Google Authenticator oder Authy.

prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([trim($_POST['username'])]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if ($user && password_verify($_POST['password'], $user['password_hash'])) { if (MiniTOTP::verify($user['totp_secret'], $_POST['totp_code'])) { $_SESSION['logged_in'] = true; $_SESSION['username'] = $user['username']; header("Location: admin.php"); exit; } else { $login_error = "Der 2FA Code ist falsch oder abgelaufen."; } } else { $login_error = "Benutzername oder Passwort falsch."; } } if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { ?> Login | SG 07
đź”’

Admin Login

$login_error
"; ?>
prepare("UPDATE news SET date=?, department=?, title=?, content=?, full_text=?, image=?, image2=?, image3=?, image4=?, title_index=?, link=? WHERE id=?"); if ($stmt->execute([$_POST['date'], $_POST['department'], $_POST['title'], $_POST['content'], $_POST['full_text'], $img1, $img2, $img3, $img4, $title_idx, $_POST['link'], $_POST['news_id']])) { $message = "
âś“ News (inkl. Galerie) erfolgreich aktualisiert!
"; } } // --- AKTION: NEWS SPEICHERN (NEU) --- if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_news'])) { $img1 = handleSingleImage(1); $img2 = handleSingleImage(2); $img3 = handleSingleImage(3); $img4 = handleSingleImage(4); $title_idx = (int)$_POST['title_index']; $stmt = $db->prepare("INSERT INTO news (date, department, title, content, full_text, image, image2, image3, image4, title_index, link) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); if ($stmt->execute([$_POST['date'], $_POST['department'], $_POST['title'], $_POST['content'], $_POST['full_text'], $img1, $img2, $img3, $img4, $title_idx, $_POST['link']])) { $message = "
✓ News (inkl. Galerie) erfolgreich veröffentlicht!
"; } } // --- AKTION: NEWS LĂ–SCHEN --- if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_news'])) { $stmt = $db->prepare("DELETE FROM news WHERE id = ?"); if ($stmt->execute([$_POST['delete_id']])) { $message = "
✓ Die News wurde unwiderruflich gelöscht!
"; } } // Edit-Modus prĂĽfen $is_edit = false; $edit_news = null; if (isset($_GET['edit_id'])) { $stmt = $db->prepare("SELECT * FROM news WHERE id = ?"); $stmt->execute([$_GET['edit_id']]); $edit_news = $stmt->fetch(PDO::FETCH_ASSOC); if ($edit_news) $is_edit = true; } $existing_news = $db->query("SELECT id, date, department, title FROM news ORDER BY id DESC")->fetchAll(PDO::FETCH_ASSOC); // HTML Block fĂĽr einen der 4 Bilder-Uploads function renderImageSlot($index, $is_edit, $edit_news) { $img_key = $index === 1 ? 'image' : 'image'.$index; $current_val = $is_edit ? ($edit_news[$img_key] ?? '') : ''; $title_idx = $is_edit ? (int)($edit_news['title_index'] ?? 1) : 1; $is_title = ($title_idx === $index); echo "
"; echo "

Bild Slot $index

"; // Radio fĂĽr Titelbild echo "
"; if($is_edit && $current_val) { echo ""; echo "
"; } echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo "
"; } ?> Admin Dashboard | SG 07 St. Leon

SG 07 Dashboard MULTIMEDIA EDITION

Hallo, Abmelden

Bilder-Galerie (Maximal 4)

Du musst nicht alle Slots füllen. Vergiss nicht das Titelbild auszuwählen!

Abbrechen

Tipps zur Galerie

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!

Bestehende News verwalten

Datum Abteilung Titel Aktion
Ändern