using System; using System.Windows; using System.Windows.Controls; using System.Windows.Navigation; using MySql.Data.MySqlClient; using BCrypt.Net; namespace SkyTeam { public partial class AdminLoginPage : Page { // Quelle: Microsoft Learn // Nutzung eines "Expression bodied members" (=>) für den Konstruktor // Das macht Methoden oder Konstruktoren, die nur aus einer einzigen Zeile bestehen, // deutlich kompakter und besser lesbar public AdminLoginPage() => InitializeComponent(); private void AdminLogin_Click(object sender, RoutedEventArgs e) { string query = "SELECT Id, PasswortHash FROM users WHERE Email = @email AND Vorname = @user AND Rolle = @role"; try { using (MySqlConnection conn = new MySqlConnection(DatenbankServices.GetConnection())) { conn.Open(); using (MySqlCommand cmd = new MySqlCommand(query, conn)) { cmd.Parameters.AddWithValue("@email", AdminEmailBox.Text); cmd.Parameters.AddWithValue("@user", AdminUserBox.Text); cmd.Parameters.AddWithValue("@role", AdminRoleBox.Text); using (MySqlDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { string storedHash = reader.GetString("PasswortHash"); int dbId = reader.GetInt32("Id"); // Quelle: Stack Overflow // Genau wie beim normalen User-Login prüfen wir das Passwort lokal // über die BCrypt-Bibliothek. Ein direkter Abgleich in der SQL-Datenbank // (WHERE PasswortHash = @hash) ist unmöglich, da BCrypt dynamische Salts verwendet if (BCrypt.Net.BCrypt.Verify(AdminPassBox.Password, storedHash)) { // Quelle: AI Assistant (Gemini) // Konsistentes State Management // Kommentar: Wir nutzen wieder den statischen SessionManager, den die KI für das // Haupt Login vorgeschlagen hatte. So weiß das AdminDashboard sofort, wer eingeloggt ist SessionManager.CurrentUserId = dbId; SessionManager.CurrentUserName = AdminUserBox.Text; MessageBox.Show("Admin-Zugriff gewährt!"); NavigationService.Navigate(new AdminDashboard()); } else { MessageBox.Show("Ungültiges Passwort."); } } else { MessageBox.Show("Kein Admin mit diesen Daten gefunden."); } } } } } catch (Exception ex) { MessageBox.Show("Fehler: " + ex.Message); } } private void Back_Click(object sender, RoutedEventArgs e) => NavigationService.Navigate(new LogInPage()); } }