100 lines
3.4 KiB
PHP
100 lines
3.4 KiB
PHP
<?php
|
|
require_once __DIR__ . '/../../core/Controller.php';
|
|
|
|
class ResetPasswordController extends Controller {
|
|
public function index($urlToken = null) {
|
|
if (isset($_SESSION['user_email'])) {
|
|
header('Location: ' . Config::get('BASE_URL', '/'));
|
|
exit;
|
|
}
|
|
|
|
$token = trim($_GET['token'] ?? $_GET['TOKEN'] ?? $urlToken ?? '');
|
|
|
|
if (empty($token)) {
|
|
$this->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;
|
|
}
|
|
}
|
|
}
|