59 lines
2.5 KiB
PHP
59 lines
2.5 KiB
PHP
<?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 l’accè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(); ?>
|