39773-vm/forgot_password.php
2026-04-22 14:26:14 +00:00

59 lines
2.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
require_once __DIR__ . '/includes/app.php';
app_boot();
if (is_post()) {
verify_csrf();
$email = strtolower(trim((string) ($_POST['email'] ?? '')));
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$stmt = db()->prepare('SELECT id, email FROM users WHERE email = :email LIMIT 1');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
if ($user) {
$token = strtoupper(substr(bin2hex(random_bytes(8)), 0, 12));
$hash = hash('sha256', $token);
$expiresAt = date('Y-m-d H:i:s', time() + 900);
$update = db()->prepare('UPDATE users SET reset_token_hash = :hash, reset_expires_at = :expires_at WHERE id = :id');
$update->execute([
'hash' => $hash,
'expires_at' => $expiresAt,
'id' => (int) $user['id'],
]);
error_log('RJLRESAKA reset token for ' . $email . ': ' . $token);
set_flash('info', 'Token de démonstration généré : ' . $token . ' (également journalisé côté serveur, valide 15 min).');
} else {
set_flash('info', 'Si ce compte existe, un token de réinitialisation a été généré.');
}
} else {
set_flash('warning', 'Veuillez saisir un email valide.');
}
redirect('reset_password.php');
}
render_header('Mot de passe oublié', ['description' => 'Générer un token de réinitialisation pour laccès à RJLRESAKA.']);
?>
<main class="container py-5 auth-wrap">
<div class="row justify-content-center">
<div class="col-lg-5">
<div class="panel-card p-4 p-lg-5">
<p class="section-kicker mb-1">Réinitialisation</p>
<h1 class="h3 mb-3">Mot de passe oublié</h1>
<p class="text-secondary mb-4">Saisissez votre email. Pour ce MVP, le token apparaît en notification et dans les logs serveur.</p>
<form method="post" class="vstack gap-3">
<input type="hidden" name="csrf_token" value="<?= e(csrf_token()) ?>">
<div>
<label class="form-label" for="email">Email du compte</label>
<input class="form-control" id="email" type="email" name="email" required>
</div>
<button class="btn btn-dark" type="submit">Générer un token</button>
</form>
</div>
</div>
</div>
</main>
<?php render_footer(); ?>