view('reset_password', [ 'title' => 'Link ungültig', 'valid' => false, 'errorMessage' => 'Kein Reset-Token übergeben.' ]); return; } require_once __DIR__ . '/../models/PasswordReset.php'; $pwdResetModel = new PasswordReset(); $record = $pwdResetModel->getByToken($token); if (!$record) { $this->view('reset_password', [ 'title' => 'Link abgelaufen oder ungültig', 'valid' => false, 'errorMessage' => 'Dieser Link zum Zurücksetzen des Passworts ist ungültig oder abgelaufen.' ]); return; } $this->view('reset_password', [ 'title' => 'Neues Passwort vergeben', 'valid' => true, 'token' => $token, 'email' => $record['email'] ]); } public function submit() { if ($_SERVER['REQUEST_METHOD'] !== 'POST') { header('Location: ' . Config::get('BASE_URL', '/')); exit; } $token = trim($_POST['token'] ?? $_POST['TOKEN'] ?? ''); $password = $_POST['password'] ?? ''; $passwordConfirm = $_POST['password_confirm'] ?? ''; $redirectUrl = Config::get('BASE_URL', '/') . 'reset-password?token=' . urlencode($token); try { Security::checkCsrf($_POST['csrf_token'] ?? ''); if (empty($token)) { throw new Exception('Token fehlt.'); } require_once __DIR__ . '/../models/PasswordReset.php'; $pwdResetModel = new PasswordReset(); $record = $pwdResetModel->getByToken($token); if (!$record) { throw new Exception('Dieser Link ist ungültig oder abgelaufen. Bitte fordere einen neuen an.'); } if (strlen($password) < 8) { throw new Exception('Das neue Passwort muss mindestens 8 Zeichen lang sein.'); } if ($password !== $passwordConfirm) { throw new Exception('Die eingegebenen Passwörter stimmen nicht überein.'); } $userModel = $this->model('User'); $user = $userModel->findByEmail($record['email']); if (!$user) { throw new Exception('Der zugehörige Benutzeraccount wurde nicht gefunden.'); } $newHash = password_hash($password, PASSWORD_DEFAULT); $userModel->updatePassword((int)$user['id'], $newHash); // Invalidate token $pwdResetModel->deleteByEmail($record['email']); Flash::set('Dein Passwort wurde erfolgreich aktualisiert! Du kannst dich jetzt einloggen.', 'success'); header('Location: ' . Config::get('BASE_URL', '/')); exit; } catch (Exception $e) { Flash::set($e->getMessage(), 'error'); header('Location: ' . $redirectUrl); exit; } } }