<?php
/**
 * Mini-projet 05 — Système de Login Sécurisé
 * Identifiants : alice/1234 · bob/secret
 * Démarrage : php -S localhost:8000 puis http://localhost:8000/solution.php
 */
session_start();

// ── Utilisateurs (en prod : table SQL + password_hash stocké) ──
$USERS = [
    'alice' => password_hash('1234',   PASSWORD_DEFAULT),
    'bob'   => password_hash('secret', PASSWORD_DEFAULT),
];

// ── Token CSRF ─────────────────────────────────────────────────
if (empty($_SESSION['csrf_login'])) {
    $_SESSION['csrf_login'] = bin2hex(random_bytes(32));
}

// ── Vérification fingerprint (anti-hijacking) ──────────────────
function getFingerprint(): string {
    // Hash de l'User-Agent et de l'IP pour lier la session au client
    return hash('sha256', ($_SERVER['HTTP_USER_AGENT'] ?? '') . '|' . ($_SERVER['REMOTE_ADDR'] ?? ''));
}

if (isset($_SESSION['user']) && isset($_SESSION['fingerprint'])) {
    if ($_SESSION['fingerprint'] !== getFingerprint()) {
        // Session compromise : forcer déconnexion
        session_destroy();
        session_start();
        $_SESSION['error'] = "Session expirée pour raison de sécurité.";
    }
}

$error   = '';
$success = '';

// ── Traitement POST ────────────────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $action = $_POST['action'] ?? '';

    // ── Connexion ──────────────────────────────────────────────
    if ($action === 'login') {
        $tokenRecu = $_POST['csrf_token'] ?? '';
        if (!hash_equals($_SESSION['csrf_login'], $tokenRecu)) {
            $error = "Requête invalide (CSRF).";
        } else {
            $username = trim($_POST['username'] ?? '');
            $password = $_POST['password'] ?? '';

            if (isset($USERS[$username]) && password_verify($password, $USERS[$username])) {
                // Régénérer l'ID après connexion — OBLIGATOIRE contre la session fixation
                session_regenerate_id(true);
                $_SESSION['user']        = $username;
                $_SESSION['fingerprint'] = getFingerprint();
                $_SESSION['login_time']  = time();
                // Nouveau token CSRF
                $_SESSION['csrf_login']  = bin2hex(random_bytes(32));

                // Remember me : cookie sécurisé 7 jours
                if (!empty($_POST['remember'])) {
                    $token = bin2hex(random_bytes(32));
                    setcookie('remember_token', $token, [
                        'expires'  => time() + 86400 * 7,
                        'path'     => '/',
                        'secure'   => isset($_SERVER['HTTPS']), // HTTPS si disponible
                        'httponly' => true,                      // inaccessible en JS
                        'samesite' => 'Strict',
                    ]);
                }
            } else {
                // Message générique : ne jamais préciser si c'est le username ou le mdp qui est faux
                $error = "Identifiants incorrects.";
            }
        }
    }

    // ── Déconnexion ────────────────────────────────────────────
    if ($action === 'logout') {
        // Étape 1 : vider toutes les variables de session
        $_SESSION = [];
        // Étape 2 : supprimer le cookie de session côté client
        if (ini_get('session.use_cookies')) {
            $p = session_get_cookie_params();
            setcookie(session_name(), '', time() - 42000, $p['path'], $p['domain'], $p['secure'], $p['httponly']);
        }
        // Étape 3 : supprimer le cookie remember_me
        setcookie('remember_token', '', time() - 3600, '/');
        // Étape 4 : détruire le fichier de session côté serveur
        session_destroy();
        session_start();
        $_SESSION['csrf_login'] = bin2hex(random_bytes(32));
        $success = "Vous avez été déconnecté.";
    }
}

$loggedIn = isset($_SESSION['user']);
$user     = $_SESSION['user'] ?? null;
$loginDuration = $loggedIn ? gmdate('i\m s\s', time() - ($_SESSION['login_time'] ?? time())) : null;
?>
<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title><?= $loggedIn ? 'Dashboard — ' . htmlspecialchars($user) : 'Connexion' ?></title>
  <style>
    *{margin:0;padding:0;box-sizing:border-box}
    body{background:#0a0e1a;color:#e6edf3;font-family:'Segoe UI',sans-serif;min-height:100vh;display:flex;align-items:center;justify-content:center;padding:2rem 1rem}
    .card{background:rgba(22,27,34,.85);border:1px solid rgba(255,255,255,.08);border-radius:16px;padding:2rem;width:100%;max-width:420px;backdrop-filter:blur(20px)}
    h1{font-size:1.4rem;font-weight:700;margin-bottom:.3rem}
    .subtitle{color:#8b949e;font-size:.85rem;margin-bottom:1.5rem}
    .field{margin-bottom:1rem}
    label{display:block;font-size:.8rem;color:#8b949e;margin-bottom:.3rem;font-weight:600}
    input[type=text],input[type=password]{width:100%;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.1);border-radius:8px;color:#e6edf3;padding:.6rem .9rem;font-size:.88rem;outline:none;transition:border-color .2s;font-family:inherit}
    input:focus{border-color:rgba(247,129,102,.5);box-shadow:0 0 0 3px rgba(247,129,102,.08)}
    .remember{display:flex;align-items:center;gap:.5rem;font-size:.82rem;color:#8b949e;margin-bottom:1rem}
    .btn{width:100%;padding:.75rem;background:linear-gradient(135deg,#f78166,#f0c419);color:#0d1117;border:none;border-radius:8px;font-weight:700;font-size:.92rem;cursor:pointer;transition:opacity .2s}
    .btn:hover{opacity:.85}
    .btn-danger{background:rgba(248,81,73,.15);color:#f85149;border:1px solid rgba(248,81,73,.3)}
    .btn-danger:hover{background:rgba(248,81,73,.25)}
    .alert{border-radius:10px;padding:.9rem 1rem;margin-bottom:1rem;font-size:.85rem}
    .alert-error{background:rgba(248,81,73,.1);border:1px solid rgba(248,81,73,.3);color:#f85149}
    .alert-success{background:rgba(63,185,80,.1);border:1px solid rgba(63,185,80,.3);color:#3fb950}
    .dashboard-info{background:rgba(247,129,102,.06);border:1px solid rgba(247,129,102,.2);border-radius:10px;padding:1rem;margin-bottom:1.2rem}
    .user-badge{display:inline-flex;align-items:center;gap:.5rem;background:linear-gradient(135deg,rgba(247,129,102,.15),rgba(240,196,25,.1));border:1px solid rgba(247,129,102,.3);border-radius:8px;padding:.5rem .9rem;font-weight:700;color:#f78166;margin-bottom:1rem}
    .meta{color:#6e7681;font-size:.76rem;margin-top:.3rem}
    .divider{border:none;border-top:1px solid rgba(255,255,255,.07);margin:1rem 0}
    .hint{font-size:.75rem;color:#6e7681;text-align:center;margin-top:1rem}
  </style>
</head>
<body>
<div class="card">
  <?php if (!$loggedIn): ?>
    <!-- ── Page de connexion ─────────────────────────────── -->
    <h1>🔐 Connexion</h1>
    <p class="subtitle">Mini-projet 05 · Sessions PHP</p>

    <?php if ($error): ?>
      <div class="alert alert-error">❌ <?= htmlspecialchars($error) ?></div>
    <?php endif; ?>
    <?php if ($success): ?>
      <div class="alert alert-success">✅ <?= htmlspecialchars($success) ?></div>
    <?php endif; ?>

    <form method="POST" novalidate>
      <input type="hidden" name="action" value="login">
      <input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['csrf_login'], ENT_QUOTES) ?>">

      <div class="field">
        <label for="username">Nom d'utilisateur</label>
        <input type="text" id="username" name="username" required autocomplete="username"
               value="<?= htmlspecialchars($_POST['username'] ?? '') ?>">
      </div>
      <div class="field">
        <label for="password">Mot de passe</label>
        <input type="password" id="password" name="password" required autocomplete="current-password">
      </div>
      <div class="remember">
        <input type="checkbox" id="remember" name="remember" value="1">
        <label for="remember" style="margin:0;font-size:.82rem;color:#8b949e;cursor:pointer">Se souvenir de moi (7 jours)</label>
      </div>
      <button type="submit" class="btn">Se connecter →</button>
    </form>
    <p class="hint">Identifiants : <strong>alice / 1234</strong> &nbsp;·&nbsp; <strong>bob / secret</strong></p>

  <?php else: ?>
    <!-- ── Dashboard ────────────────────────────────────── -->
    <h1>🏠 Dashboard</h1>
    <p class="subtitle">Espace personnel</p>

    <div class="user-badge">👤 <?= htmlspecialchars($user) ?></div>

    <div class="dashboard-info">
      <strong style="color:#f78166">Informations de session</strong>
      <div class="meta">Session ID : <?= substr(session_id(), 0, 16) ?>...</div>
      <div class="meta">Connecté depuis : <?= htmlspecialchars($loginDuration) ?></div>
      <div class="meta">Empreinte : <?= substr($_SESSION['fingerprint'] ?? '', 0, 16) ?>...</div>
    </div>

    <hr class="divider">

    <p style="color:#8b949e;font-size:.85rem;margin-bottom:1rem">
      Vous êtes connecté en tant que <strong style="color:#e6edf3"><?= htmlspecialchars($user) ?></strong>.
      Cette page est protégée — seul un utilisateur authentifié peut la voir.
    </p>

    <form method="POST">
      <input type="hidden" name="action" value="logout">
      <button type="submit" class="btn btn-danger">Se déconnecter</button>
    </form>
  <?php endif; ?>
</div>
</body>
</html>
