PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); $stmt = $pdo->query(" SELECT `id`, `username`, `role` FROM `app_users` WHERE `is_active` = 1 AND `role` IN ('master', 'admin') ORDER BY CASE WHEN `role` = 'master' THEN 0 ELSE 1 END, `id` ASC LIMIT 1 "); $user = $stmt->fetch(); if (is_array($user)) { $_SESSION['user_id'] = (int) $user['id']; $_SESSION['username'] = (string) $user['username']; $_SESSION['role'] = (string) $user['role']; } } catch (Throwable $e) { return; } } function currentUserRole(): string { return trim((string) ($_SESSION['role'] ?? '')); } function isMasterRole(?string $role): bool { return trim((string) $role) === 'master'; } function isAdminLikeRole(?string $role): bool { $normalizedRole = trim((string) $role); return $normalizedRole === 'admin' || $normalizedRole === 'master'; } function currentUserIsAdminLike(): bool { return isAdminLikeRole(currentUserRole()); } function publicAccessAllowlist(): array { return [ 'login.php', 'register.php', 'logout.php', ]; } function currentPublicPageKey(): string { $scriptName = str_replace('\\', '/', (string) ($_SERVER['SCRIPT_NAME'] ?? '')); $scriptName = ltrim($scriptName, '/'); if ($scriptName === '') { return ''; } $publicMarker = 'public/'; $publicPosition = strpos($scriptName, $publicMarker); if ($publicPosition !== false) { return substr($scriptName, $publicPosition + strlen($publicMarker)); } return $scriptName; } function manageablePublicPages(): array { return [ 'index.php' => 'Startseite', 'settings.php' => 'Einstellungen', 'my_favorites.php' => 'Favoriten', 'moonphase.php' => 'Mondphase', 'planetensichtbarkeit.php' => 'Planetensichtbarkeit', 'ephemeriden.php' => 'Ephemeriden', 'comets.php' => 'Kometen', 'astronomical_conversions.php' => 'Astronomical Conversions', 'tcrb_lightcurve.php' => 'T CrB Lichtkurve', 'solarsystem.php' => 'Sonnensystem', 'mars.php' => 'Mars', 'jupitersystem.php' => 'Jupitersystem', 'tagbogen.php' => 'Tagbogen', 'daemmerungszeiten.php' => 'Dämmerungszeiten', 'sternenhimmel.php' => 'Sternenhimmel', 'drehbare_sternkarte.php' => 'Drehbare Sternkarte', 'meteorshowers.php' => 'Meteorströme', 'geocron/index.php' => 'Geocron', 'geocron3d.php' => 'Geocron 3D', 'geocron3d_C.php' => 'Geocron 3D Cesium', 'mondfinsternis.php' => 'Mondfinsternis', 'sonnenfinsternis.php' => 'Sonnenfinsternis', 'bedeckung.php' => 'Bedeckungsphänomene', 'sternbedeckungen.php' => 'Mond-Stern-Bedeckungen', 'monatsvorhersage.php' => 'Monatsvorhersage', 'moonyear.php' => 'Mondphasen-Jahresübersicht', 'wochenvorhersage.php' => 'Wochenvorhersage', 'satellitenhimmel.php' => 'Satellitenhimmel', 'asteroid_temp.php' => 'Asteroid-Temperatur', 'universesandbox.php' => 'Universe Sandbox', 'barycenter.php' => 'Baryzentrum', ]; }