prepare(" SELECT u.id, u.username, u.password_hash, u.display_name, u.family_id, u.is_admin, u.is_active, u.lang, u.remember_token, f.db_name, f.is_active as family_active, f.enabled_modules, f.enabled_views FROM users u LEFT JOIN families f ON f.id = u.family_id WHERE u.username = ? "); $stmt->execute([$username]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if ($user && password_verify($password, $user['password_hash'])) { if (!$user['is_active']) { $error = "Compte désactivé. Contactez l'administrateur."; } elseif ($user['family_id'] && !$user['family_active']) { $error = "Espace familial désactivé. Contactez l'administrateur."; } else { session_regenerate_id(true); $_SESSION['user'] = [ 'id' => (int)$user['id'], 'username' => $user['username'], 'display_name' => $user['display_name'], 'family_id' => (int)$user['family_id'], 'is_admin' => (bool)$user['is_admin'], ]; $_SESSION['family_db'] = $user['db_name']; $_SESSION['app_lang'] = $user['lang'] ?? 'fr'; $_SESSION['enabled_modules'] = json_decode($user['enabled_modules'] ?? '["calendar","budget","holidays","gifts","calendar_ios"]', true); $_SESSION['enabled_views'] = json_decode($user['enabled_views'] ?? '["food_meals","food_liste"]', true); // --- NOUVEAU : Logique "Se souvenir de moi" --- if (isset($_POST['remember_me']) && $_POST['remember_me'] === '1') { $token = bin2hex(random_bytes(32)); // Token aléatoire sécurisé $hashedToken = hash('sha256', $token); // On stocke le hash en BDD $meta_pdo->prepare("UPDATE users SET remember_token = ? WHERE id = ?")->execute([$hashedToken, $user['id']]); // Création du cookie sécurisé (Expire dans 30 jours, HTTPOnly) $cookieValue = $user['id'] . ':' . $token; setcookie('hh_remember', $cookieValue, time() + (86400 * 30), '/', '', isset($_SERVER['HTTPS']), true); } // ---------------------------------------------- $redirectTo = $_GET['redirect'] ?? '/index.php'; header('Location: ' . $redirectTo); exit; } } else { $error = tr('error_invalid_credentials'); } } } } require __DIR__ . '/header.php'; ?>

Pas encore de compte ? Créer un espace