diff --git a/cabecera.php b/cabecera.php index 12a68a4..8ea7501 100644 --- a/cabecera.php +++ b/cabecera.php @@ -21,9 +21,9 @@ diff --git a/clases/ClaseUsuario.php b/clases/ClaseUsuario.php index 47a8a1f..d3cf852 100644 --- a/clases/ClaseUsuario.php +++ b/clases/ClaseUsuario.php @@ -269,6 +269,60 @@ class Usuario return null; } + // Cookies + + public static function guardarCookieToken($idUsuario, $token) + { + $conexion = conexionBD(); + if (is_array($conexion)) return false; + + try { + $sql = "UPDATE usuario SET cookie = :token WHERE idUsuario = :id"; + $stmt = $conexion->prepare($sql); + return $stmt->execute([ + ':token' => $token, + ':id' => $idUsuario + ]); + } catch (PDOException $e) { + return false; + } + } + + public static function buscarPorCookie($token) + { + if (empty($token)) return null; + + $conexion = conexionBD(); + if (is_array($conexion)) return null; + + try { + $sql = "SELECT * FROM usuario WHERE cookie = :token AND cookie IS NOT NULL"; + $stmt = $conexion->prepare($sql); + $stmt->execute([':token' => $token]); + + $datos = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($datos) { + return new Usuario( + $datos['nombreUsuario'], + $datos['contrasena'], + $datos['email'], + $datos['avatar'], + $datos['cookie'], + (int)$datos['aciertos'], + (int)$datos['victorias'], + (int)$datos['derrotas'], + (int)$datos['idUsuario'] + ); + } + return null; + } catch (PDOException $e) { + return null; + } + } + + + public function cambiarNombre($nuevoNombre) { $conexion = conexionBD(); @@ -384,16 +438,17 @@ class Usuario } } - public static function obtenerRanking($limite = 10) { - try { - $conexion = conexionBD(); + public static function obtenerRanking($limite = 10) + { + try { + $conexion = conexionBD(); - if (is_array($conexion)) { - return []; - } + if (is_array($conexion)) { + return []; + } - - $sql = "SELECT + + $sql = "SELECT idUsuario, nombreUsuario, avatar, @@ -408,12 +463,12 @@ class Usuario FROM usuario ORDER BY victorias DESC, aciertos DESC LIMIT " . (int)$limite; - - $stmt = $conexion->prepare($sql); - $stmt->execute(); - return $stmt->fetchAll(PDO::FETCH_ASSOC); - } catch (PDOException $e) { - return []; + + $stmt = $conexion->prepare($sql); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + return []; + } } -} -} +} \ No newline at end of file diff --git a/controladores/ControladorUsuario.php b/controladores/ControladorUsuario.php index a7647e3..4e9c056 100644 --- a/controladores/ControladorUsuario.php +++ b/controladores/ControladorUsuario.php @@ -47,24 +47,40 @@ switch ($_POST['orden']) { case 'comprobarUsuario': - + $email = trim($_POST['email'] ?? ''); $contrasena = $_POST['contrasena'] ?? ''; + $recuerdame = isset($_POST['recuerdame']) && ($_POST['recuerdame'] === 'true' || $_POST['recuerdame'] === true); $resultado = Usuario::login($email, $contrasena); if ($resultado instanceof Usuario) { - // === AÑADIR ESTAS LÍNEAS PARA GUARDAR EN SESIÓN === + // Guardamos la sesión $_SESSION['idUsuario'] = $resultado->getIdUsuario(); $_SESSION['nombreUsuario'] = $resultado->getNombreUsuario(); $_SESSION['email'] = $resultado->getEmail(); - // ================================================= + $_SESSION['avatar'] = $resultado->getAvatar(); + + // Si ha marcado "Recuérdame durante 10 días" + if ($recuerdame) { + $token = bin2hex(random_bytes(32)); // Token único de 64 caracteres + $duracion = time() + (10 * 24 * 60 * 60); // 10 días + setcookie('recuerdame_token', $token, $duracion, "/"); + Usuario::guardarCookieToken($resultado->getIdUsuario(), $token); + } else { + // Si entra sin marcar recuérdame, limpiamos la cookie + if (isset($_COOKIE['recuerdame_token'])) { + setcookie('recuerdame_token', '', time() - 3600, "/"); + } + Usuario::guardarCookieToken($resultado->getIdUsuario(), null); + } echo json_encode([ 'exito' => 'Login correcto', 'idUsuario' => $resultado->getIdUsuario(), - 'nombreUsuario' => $resultado->getNombreUsuario() + 'nombreUsuario' => $resultado->getNombreUsuario(), + 'avatar' => $resultado->getAvatar() ]); } else { @@ -76,13 +92,23 @@ switch ($_POST['orden']) { break; - case 'cerrarSesion': + // Si el usuario tenía token en la BD, lo eliminamos + if (isset($_SESSION['idUsuario'])) { + Usuario::guardarCookieToken($_SESSION['idUsuario'], null); + } + + // Borramos la cookie del navegador + if (isset($_COOKIE['recuerdame_token'])) { + setcookie('recuerdame_token', '', time() - 3600, "/"); + } + // Limpiamos las variables de sesión unset($_SESSION['idUsuario']); unset($_SESSION['email']); unset($_SESSION['nombreUsuario']); + unset($_SESSION['avatar']); // Destruimos la sesión session_destroy(); @@ -228,25 +254,55 @@ switch ($_POST['orden']) { break; - case 'obtenerRanking': - $ranking = Usuario::obtenerRanking(5); //Cambiar para mostrar X jugadores en index - echo json_encode([ - 'exito' => true, - 'ranking' => $ranking - ]); - break; + case 'obtenerRanking': + $ranking = Usuario::obtenerRanking(5); //Cambiar para mostrar X jugadores en index + echo json_encode([ + 'exito' => true, + 'ranking' => $ranking + ]); + break; case 'comprobarSesion': - if (isset($_SESSION['idUsuario']) && !empty($_SESSION['idUsuario'])) { - echo json_encode([ - 'activa' => true, - 'usuario' => [ - 'idUsuario' => $_SESSION['idUsuario'], - 'nombreUsuario' => $_SESSION['nombreUsuario'] ?? '' - ] - ]); - } else { + + //Si hay sesión: + + if (isset($_SESSION['idUsuario']) && !empty($_SESSION['idUsuario'])) { + echo json_encode([ + 'activa' => true, + 'usuario' => [ + 'idUsuario' => $_SESSION['idUsuario'], + 'nombreUsuario' => $_SESSION['nombreUsuario'] ?? '', + 'avatar' => $_SESSION['avatar'] ?? '' + ] + ]); + break; + } + + // Si no hay sesión, comprobamos si hay cookie: + + if (isset($_COOKIE['recuerdame_token'])) { + $usuarioCookie = Usuario::buscarPorCookie($_COOKIE['recuerdame_token']); + + if ($usuarioCookie instanceof Usuario) { + + $_SESSION['idUsuario'] = $usuarioCookie->getIdUsuario(); + $_SESSION['email'] = $usuarioCookie->getEmail(); + $_SESSION['nombreUsuario'] = $usuarioCookie->getNombreUsuario(); + $_SESSION['avatar'] = $usuarioCookie->getAvatar(); + + echo json_encode([ + 'activa' => true, + 'usuario' => [ + 'idUsuario' => $usuarioCookie->getIdUsuario(), + 'nombreUsuario' => $usuarioCookie->getNombreUsuario(), + 'avatar' => $usuarioCookie->getAvatar() + ] + ]); + break; + } + } + + //No hay sesión ni hay cookie: echo json_encode(['activa' => false]); - } - break; -} + break; +} \ No newline at end of file diff --git a/js/cabecera.js b/js/cabecera.js index f046a1c..a04cd35 100644 --- a/js/cabecera.js +++ b/js/cabecera.js @@ -2,9 +2,11 @@ $(document).ready(function () { comprobarSesion(); }); -// Función auxiliar para escapar texto HTML y evitar XSS +// Función auxiliar para escapar texto HTML function escapeHTML(str) { - return $("
").text(str ?? "").html(); + return $("
") + .text(str ?? "") + .html(); } // Comprobar estado de sesión al cargar la página @@ -23,12 +25,16 @@ function comprobarSesion() { contenedor.empty(); if (respuesta.activa && respuesta.usuario) { - // Usuario autenticado: Mostrar Menú Dropdown + // Obtenemos la ruta del avatar o la de por defecto + const avatarUrl = + respuesta.usuario.avatar || "img/avatars/defaultProfile.jpeg"; + + // Usuario autenticado: Mostrar Menú Dropdown con el avatar const htmlUsuario = `