71 lines
3.1 KiB
PHP
71 lines
3.1 KiB
PHP
<?php
|
||
require_once __DIR__ . '/includes/bootstrap.php';
|
||
|
||
if (current_user()) {
|
||
redirect('/home.php');
|
||
}
|
||
|
||
$errors = [];
|
||
$sent = false;
|
||
|
||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||
verify_csrf();
|
||
$email = trim($_POST['email'] ?? '');
|
||
|
||
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||
$errors[] = 'Bitte geben Sie eine gültige E-Mail-Adresse an.';
|
||
} elseif (!rate_limit_check('password_reset_request', client_ip(), 3, 15)) {
|
||
$errors[] = 'Zu viele Anfragen. Bitte versuchen Sie es in einigen Minuten erneut.';
|
||
} elseif (!rate_limit_check('password_reset_request_email', $email, 2, 60)) {
|
||
// Gleiche Fehlermeldung – verrät nicht ob die E-Mail bekannt ist
|
||
$errors[] = 'Zu viele Anfragen. Bitte versuchen Sie es in einigen Minuten erneut.';
|
||
} else {
|
||
$stmt = get_db()->prepare('SELECT * FROM users WHERE LOWER(email) = LOWER(?)');
|
||
$stmt->execute([$email]);
|
||
$user = $stmt->fetch();
|
||
|
||
// Immer dieselbe Erfolgsmeldung anzeigen, unabhängig davon, ob das Konto existiert
|
||
// (verhindert, dass Angreifer registrierte E-Mail-Adressen erraten können).
|
||
if ($user) {
|
||
$token = create_password_reset('customer', $email);
|
||
$link = base_url() . '/reset_password.php?token=' . urlencode($token);
|
||
email_send_and_log($email, 'Passwort zurücksetzen', email_password_reset_body($link), null, 'Passwort-zurücksetzen-Mail (Kunde)');
|
||
}
|
||
$sent = true;
|
||
}
|
||
}
|
||
|
||
$pageTitle = 'Passwort vergessen';
|
||
$activePage = 'login';
|
||
require __DIR__ . '/includes/header_customer.php';
|
||
?>
|
||
<style>.page-content{padding:0!important;margin:0!important}</style>
|
||
</div><!-- page-content -->
|
||
<?php $__banner = get_setting('banner_path'); ?>
|
||
<div class="auth-wrap<?= $__banner ? ' has-image' : '' ?>"<?= $__banner ? ' style="background-image:url(' . e($__banner) . ')"' : '' ?>>
|
||
<div class="auth-card">
|
||
<?php require __DIR__ . '/includes/brand_block.php'; ?>
|
||
<h1>Passwort vergessen</h1>
|
||
<div class="sub">Wir senden Ihnen einen Link zum Zurücksetzen.</div>
|
||
<?php foreach ($errors as $err): ?>
|
||
<div class="flash error"><?= e($err) ?></div>
|
||
<?php endforeach; ?>
|
||
<?php if ($sent): ?>
|
||
<div class="flash success">Falls ein Konto mit dieser E-Mail-Adresse existiert, wurde soeben ein Link zum Zurücksetzen versendet.</div>
|
||
<p style="margin-top:18px;font-size:.85rem"><a href="/login.php">← Zur Anmeldung</a></p>
|
||
<?php else: ?>
|
||
<form method="post">
|
||
<?= csrf_field() ?>
|
||
<label for="email">E-Mail-Adresse</label>
|
||
<input type="email" id="email" name="email" required autofocus autocapitalize="none" autocorrect="off" spellcheck="false">
|
||
<div class="btn-row">
|
||
<button type="submit" class="btn" style="width:100%">Link anfordern</button>
|
||
</div>
|
||
</form>
|
||
<p style="margin-top:18px;font-size:.85rem"><a href="/login.php">← Zur Anmeldung</a></p>
|
||
<?php endif; ?>
|
||
</div>
|
||
</div>
|
||
|
||
<footer class="public-footer">Copyright © <?= date('Y') ?> <?= e(get_setting('display_name', config()['site']['name'])) ?> – Alle Rechte vorbehalten.</footer>
|