99 lines
3.0 KiB
PHP
99 lines
3.0 KiB
PHP
<?php
|
|
include_once(__DIR__ . '/controller/DatabaseController.php');
|
|
include_once(__DIR__ . '/controller/RoutesController.php');
|
|
|
|
$error = null;
|
|
$success = false;
|
|
|
|
$selector = $_GET['selector'] ?? $_POST['selector'] ?? '';
|
|
$validator = $_GET['validator'] ?? $_POST['validator'] ?? '';
|
|
|
|
$tokenGueltig = false;
|
|
$tokenRow = null;
|
|
|
|
if ($selector !== '' && $validator !== '') {
|
|
$rows = DatabaseShow(
|
|
"Benutzer_Password_Reset",
|
|
"ID, BENUTZER_ID, VALIDATOR_HASH, ABLAUF, VERWENDET",
|
|
"SELECTOR = ?",
|
|
$selector
|
|
);
|
|
|
|
if (!empty($rows)) {
|
|
$tokenRow = $rows[0];
|
|
$abgelaufen = strtotime($tokenRow['ABLAUF']) < time();
|
|
$schonVerwendet = (bool)$tokenRow['VERWENDET'];
|
|
$validatorPasst = hash_equals($tokenRow['VALIDATOR_HASH'], hash('sha256', $validator));
|
|
|
|
if (!$abgelaufen && !$schonVerwendet && $validatorPasst) {
|
|
$tokenGueltig = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!$tokenGueltig) {
|
|
$error = 'Dieser Link ist ungültig oder abgelaufen.';
|
|
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['password'])) {
|
|
$password = $_POST['password'] ?? '';
|
|
$passwordConfirm = $_POST['password_confirm'] ?? '';
|
|
|
|
if ($password === '' || $password !== $passwordConfirm) {
|
|
$error = 'Passwörter stimmen nicht überein.';
|
|
} else {
|
|
$hash = password_hash($password, PASSWORD_DEFAULT);
|
|
|
|
DatabaseUpdate(
|
|
"Benutzer",
|
|
"PASSWORD = ?",
|
|
"ID = ?",
|
|
$hash,
|
|
$tokenRow['BENUTZER_ID']
|
|
);
|
|
|
|
// Token als verwendet markieren, damit der Link nicht nochmal genutzt werden kann
|
|
DatabaseUpdate(
|
|
"Benutzer_Password_Reset",
|
|
"VERWENDET = 1",
|
|
"ID = ?",
|
|
$tokenRow['ID']
|
|
);
|
|
|
|
$success = true;
|
|
}
|
|
}
|
|
?>
|
|
|
|
<!DOCTYPE html>
|
|
<html lang="de">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>Passwort zurücksetzen</title>
|
|
<link rel="stylesheet" href="style.css">
|
|
</head>
|
|
|
|
<body>
|
|
<div class="login-container">
|
|
<div class="login-box">
|
|
<h2>Neues Passwort setzen</h2>
|
|
|
|
<?php if ($error): ?>
|
|
<p class="login-error"><?= htmlspecialchars($error) ?></p>
|
|
<?php elseif ($success): ?>
|
|
<p class="login-error" style="color:#28a745;">
|
|
Passwort erfolgreich geändert. <a href="login.php">Jetzt einloggen</a>
|
|
</p>
|
|
<?php else: ?>
|
|
<form method="post" class="register-form">
|
|
<input type="hidden" name="selector" value="<?= htmlspecialchars($selector) ?>">
|
|
<input type="hidden" name="validator" value="<?= htmlspecialchars($validator) ?>">
|
|
<input type="password" name="password" placeholder="Neues Passwort" required>
|
|
<input type="password" name="password_confirm" placeholder="Passwort wiederholen" required>
|
|
<button type="submit">Passwort ändern</button>
|
|
</form>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
|
|
</html>
|