Geizkragen/lib/bootstrap.php

135 lines
4.4 KiB
PHP

<?php
/**
* @file bootstrap.php
* @brief Zentrale Initialisierungsdatei der Anwendung.
*
* @details Diese Datei dient als Bootstrap-Skript für die gesamte Webanwendung.
* Sie ist dafür verantwortlich, grundlegende Konfigurationen vorzunehmen,
* die Session-Verwaltung zu initiieren und die Datenbankverbindung herzustellen.
* Zudem werden hier die Rollen eines aktuell angemeldeten Benutzers bei jedem
* Request frisch aus der Datenbank geladen und in der Session gespeichert,
* um eine konsistente und sichere Rechteverwaltung zu gewährleisten.
*
* @author Automatisch generierter Doxygen-Header / Erweitert durch Entwickler
* @date 2026-04-04
*/
/**
* Einbinden der grundlegenden Datenbankfunktionen.
*
* Beinhaltet die Funktion db_connect() und weitere für den Datenbankzugriff
* notwendige Konfigurationen.
*/
require_once __DIR__ . '/db.php';
/**
* Aktivierung der Fehlerausgabe für Entwicklungszwecke.
*
* Diese Einstellungen sorgen dafür, dass alle Arten von Fehlern, Warnungen
* und Parse-Fehlern direkt im Browser angezeigt werden. Dies ist besonders
* nützlich während der Entwicklung, sollte aber in einer Produktionsumgebung
* idealerweise deaktiviert oder durch ein entsprechendes Logging ersetzt werden.
*/
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
/**
* Initialisierung der PHP-Session.
*
* Es wird geprüft, ob bereits eine aktive Session existiert. Falls nicht,
* werden spezifische Cookie-Parameter gesetzt (z.B. eine Lebensdauer von 30 Tagen)
* und die Session wird gestartet. Diese Konfiguration erhöht die Sicherheit
* (mittels httponly und samesite=Lax) und verbessert das Benutzererlebnis
* durch ein langlebiges Session-Cookie.
*/
if (session_status() !== PHP_SESSION_ACTIVE)
{
// Session-Cookie Lifetime auf 30 Tage setzen
session_set_cookie_params([
'lifetime' => 60 * 60 * 24 * 30, // 30 days
'path' => '/',
'domain' => '',
'secure' => false,
'httponly' => true,
'samesite' => 'Lax'
]);
session_start();
}
/**
* @brief Aktualisierung der Benutzerrollen aus der Datenbank.
*
* @details Dieser Block wird ausgeführt, um zu Beginn jedes HTTP-Requests
* die aktuellen Rechte/Rollen des eingeloggten Nutzers zu evaluieren.
* Ist eine `user_id` in der Session vorhanden, wird eine Datenbankabfrage
* durchgeführt, um alle verknüpften Rollen des entsprechenden Nutzers zu ermitteln.
* Die gefundenen Rollen werden danach als Array in `$_SESSION['user_roles']` gespeichert.
* Ist kein Benutzer eingeloggt, wird das Array leer gelassen.
*/
if (!empty($_SESSION['user_id']))
{
/**
* @var mysqli $__bsConn
* @brief Die aktive Datenbankverbindung für den Bootstrap-Prozess.
*/
$__bsConn = db_connect();
/**
* @var mysqli_stmt|false $__bsStmt
* @brief Prepared Statement zum Abfragen der Benutzerrollen.
*
* Hierbei werden die Tabellen `userRoles` (ur) und `roles` (r) miteinander verknüpft,
* um anhand der `userID` die textuellen Namen der Rollen zu selektieren.
*/
$__bsStmt = $__bsConn->prepare('SELECT r.name FROM userRoles ur JOIN roles r ON r.roleID = ur.roleID WHERE ur.userID = ?');
if ($__bsStmt)
{
/**
* @var int $__bsUid
* @brief Typisierte Benutzer-ID, gecastet aus der Session.
*/
$__bsUid = (int)$_SESSION['user_id'];
// Parameterbindung (Interger) an das Prepared Statement
$__bsStmt->bind_param('i', $__bsUid);
// Ausführung der Abfrage
$__bsStmt->execute();
/**
* @var mysqli_result $__bsResult
* @brief Das Resultset der ausgeführten Datenbankabfrage.
*/
$__bsResult = $__bsStmt->get_result();
// Reset des Rollen-Arrays in der Session
$_SESSION['user_roles'] = [];
/**
* Iteration durch die zurückgegebenen Datensätze und Speicherung in der Session.
*/
while ($__bsRow = $__bsResult->fetch_assoc())
{
$_SESSION['user_roles'][] = $__bsRow['name'];
}
// Schließen des Statements, um Ressourcen freizugeben
$__bsStmt->close();
}
// Schließen der Datenbankverbindung nach erfolgreicher Abfrage
$__bsConn->close();
}
else
{
/**
* Für Gäste (nicht eingeloggte Benutzer) wird das Rollen-Array explizit geleert.
*/
$_SESSION['user_roles'] = [];
}
?>