125 lines
4.4 KiB
C#
125 lines
4.4 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Interactivity;
|
|
using ChronoFlow.Controller;
|
|
using ChronoFlow.Persistence;
|
|
using ChronoFlow.Security;
|
|
using ChronoFlow.View.Security;
|
|
|
|
namespace ChronoFlow.View
|
|
{
|
|
/// <summary>
|
|
/// Das Fenster für den Benutzer-Login.
|
|
/// </summary>
|
|
public partial class LoginWindow : Window
|
|
{
|
|
private readonly LoginController _loginController;
|
|
|
|
public LoginWindow()
|
|
{
|
|
InitializeComponent();
|
|
_loginController = new LoginController();
|
|
|
|
var service = new SqliteZeiterfassungsService();
|
|
service.ErstelleStandardAdmin();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Wird ausgeführt, wenn der Benutzer auf "Anmelden" klickt.
|
|
/// </summary>
|
|
private async void LoginButton_Click(object? sender, RoutedEventArgs e)
|
|
{
|
|
var username = UsernameBox.Text?.Trim();
|
|
var password = PasswordBox.Text?.Trim();
|
|
|
|
if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
|
|
{
|
|
ErrorText.Text = "Bitte Benutzername und Passwort eingeben.";
|
|
ErrorText.IsVisible = true;
|
|
return;
|
|
}
|
|
|
|
var service = new SqliteZeiterfassungsService();
|
|
var benutzerListe = service.LadeAlleBenutzer();
|
|
|
|
var matchingUsers = benutzerListe.Where(u => u.Username == username).ToList();
|
|
|
|
if (matchingUsers.Count == 0)
|
|
{
|
|
ErrorText.Text = "Benutzername nicht gefunden.";
|
|
ErrorText.IsVisible = true;
|
|
return;
|
|
}
|
|
|
|
if (matchingUsers.Count > 1)
|
|
{
|
|
Console.WriteLine("[WARNUNG] Mehrere Benutzer mit gleichem Namen gefunden! Bitte Datenbank prüfen.");
|
|
ErrorText.Text = "Interner Fehler: Mehrere Benutzer mit gleichem Namen.";
|
|
ErrorText.IsVisible = true;
|
|
return;
|
|
}
|
|
|
|
var user = matchingUsers.First();
|
|
|
|
Console.WriteLine($"[DEBUG] Benutzer gefunden: {user.Username}");
|
|
Console.WriteLine($"[DEBUG] Gespeicherter Hash in DB: {user.Password}");
|
|
Console.WriteLine($"[DEBUG] Eingegebenes Passwort: {password}");
|
|
|
|
bool isMatch = PasswordHasher.VerifyPassword(password, user.Password);
|
|
Console.WriteLine($"[DEBUG] Passwortprüfung erfolgreich: {isMatch}");
|
|
|
|
if (!isMatch)
|
|
{
|
|
ErrorText.Text = "Falsches Passwort. Bitte erneut versuchen.";
|
|
ErrorText.IsVisible = true;
|
|
return;
|
|
}
|
|
|
|
// Wenn Passwortänderung erforderlich, Dialog anzeigen
|
|
if (user.MussPasswortAendern)
|
|
{
|
|
var dialog = new PasswortAendernDialog(user);
|
|
var neuesPasswort = await dialog.ShowDialog<string>(this);
|
|
|
|
if (!string.IsNullOrEmpty(neuesPasswort))
|
|
{
|
|
string neuerHash = PasswordHasher.HashPassword(neuesPasswort);
|
|
Console.WriteLine($"[DEBUG] Neues Passwort (klar): {neuesPasswort}");
|
|
Console.WriteLine($"[DEBUG] Neuer gespeicherter Hash: {neuerHash}");
|
|
|
|
user.Password = neuerHash;
|
|
user.MussPasswortAendern = false;
|
|
|
|
service.UpdateBenutzer(user);
|
|
Console.WriteLine("✅ Passwort wurde erfolgreich geändert.");
|
|
}
|
|
else
|
|
{
|
|
ErrorText.Text = "Sie müssen ein neues Passwort setzen!";
|
|
ErrorText.IsVisible = true;
|
|
return;
|
|
}
|
|
}
|
|
|
|
// 🚀 Login erfolgreich → MainWindow starten
|
|
try
|
|
{
|
|
Console.WriteLine("🚀 Öffne MainWindow...");
|
|
var main = new MainWindow(user);
|
|
main.Show();
|
|
Console.WriteLine("✅ MainWindow wurde geöffnet.");
|
|
|
|
this.Close();
|
|
Console.WriteLine("✅ LoginWindow wurde geschlossen.");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"[ERROR] MainWindow konnte nicht geöffnet werden: {ex.Message}");
|
|
ErrorText.Text = "Interner Fehler beim Starten des Hauptfensters.";
|
|
ErrorText.IsVisible = true;
|
|
}
|
|
}
|
|
}
|
|
}
|