login change

This commit is contained in:
2025-11-22 01:44:03 +01:00
parent a5ce6a079a
commit b3a3d25502
9 changed files with 474 additions and 35 deletions

136
src/auth/login.php Normal file
View File

@@ -0,0 +1,136 @@
<?php
// public/auth/login.php
// Gemeinsame Bootstrap-/Config-Datei laden
require __DIR__ . '/../../config/fileload.php'; // Pfad ggf. anpassen
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
// Direktzugriff per GET → einfach zurück zur Login-Seite
$lang = $_GET['lang'] ?? 'de';
header('Location: /login/?lang=' . urlencode($lang) . '&view=login#auth');
exit;
}
// Daten einsammeln
$lang = $_POST['lang'] ?? 'de';
$email = trim((string)($_POST['email'] ?? ''));
$password = (string)($_POST['password'] ?? '');
$redirect = $_POST['redirect'] ?? '/';
// Minimale Validierung
if ($email === '' || !filter_var($email, FILTER_VALIDATE_EMAIL) || $password === '') {
flash_set('error', 'Bitte E-Mail-Adresse und Passwort eingeben.', 'login');
header('Location: /login/?lang=' . urlencode($lang) . '&view=login#auth');
exit;
}
// Annahme: $pdo ist in fileload.php / db.php gesetzt (PDO-Instanz)
try {
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email LIMIT 1');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
} catch (Throwable $e) {
// DB-Fehler → generische Meldung
flash_set('error', 'Es ist ein Fehler beim Login aufgetreten. Bitte versuche es später erneut.', 'login');
header('Location: /login/?lang=' . urlencode($lang) . '&view=login#auth');
exit;
}
if (!$user) {
flash_set('error', 'E-Mail oder Passwort ist falsch.', 'login');
header('Location: /login/?lang=' . urlencode($lang) . '&view=login#auth');
exit;
}
// Account gesperrt?
if (!empty($user['is_locked'])) {
flash_set('error', 'Dein Konto ist gesperrt. Bitte kontaktiere den Support.', 'login');
header('Location: /login/?lang=' . urlencode($lang) . '&view=login#auth');
exit;
}
// Passwort prüfen
if (!password_verify($password, $user['password_hash'])) {
// Fehlversuche hochzählen (optional)
try {
$failed = (int)($user['failed_logins'] ?? 0) + 1;
$lock = 0;
if ($failed >= 5) {
$lock = 1;
}
$upd = $pdo->prepare('UPDATE users SET failed_logins = :failed, is_locked = :locked WHERE id = :id');
$upd->execute([
':failed' => $failed,
':locked' => $lock,
':id' => $user['id'],
]);
} catch (Throwable $e) {
// Ignorieren, Login-Fehler reicht
}
$msg = 'E-Mail oder Passwort ist falsch.';
if (($user['failed_logins'] ?? 0) + 1 >= 5) {
$msg = 'Zu viele Fehlversuche. Dein Konto wurde vorübergehend gesperrt.';
}
flash_set('error', $msg, 'login');
header('Location: /login/?lang=' . urlencode($lang) . '&view=login#auth');
exit;
}
// Passwort korrekt → Fehlversuche zurücksetzen & letztes Login speichern
try {
$upd = $pdo->prepare('UPDATE users SET failed_logins = 0, last_login_at = NOW() WHERE id = :id');
$upd->execute([':id' => $user['id']]);
} catch (Throwable $e) {
// Nicht kritisch für den Nutzer
}
// Session füllen
if (session_status() !== PHP_SESSION_ACTIVE) {
@session_start();
}
// Initialen bauen
$firstName = $user['first_name'] ?? '';
$lastName = $user['last_name'] ?? '';
$initials = '';
if ($firstName !== '') {
$initials .= mb_substr($firstName, 0, 1);
}
if ($lastName !== '') {
$initials .= mb_substr($lastName, 0, 1);
}
if ($initials === '') {
$initials = mb_substr($user['username'] ?? $user['email'], 0, 2);
}
$initials = mb_strtoupper($initials);
$_SESSION['user'] = [
'id' => $user['id'],
'email' => $user['email'],
'username' => $user['username'],
'first_name' => $user['first_name'],
'last_name' => $user['last_name'],
'plan' => $user['plan'] ?? 'free',
'initials' => $initials,
];
// Flash für „Willkommen“
flash_set('success', 'Willkommen zurück, ' . ($user['first_name'] ?: 'User') . '!', 'login');
// Redirect-Ziel prüfen (nur interne Pfade erlauben)
$target = is_string($redirect) ? trim($redirect) : '/';
if ($target === '' || $target[0] !== '/') {
$target = '/';
}
// Sprache ggf. anfügen, wenn noch nicht als Parameter vorhanden
$sep = (strpos($target, '?') === false) ? '?' : '&';
$target = $target . $sep . 'lang=' . urlencode($lang);
header('Location: ' . $target);
exit;