Mejoras de seguridad y nueva tabla de turnos para ayudantes

- Agregado sistema de protección CSRF con tokens
- Creada clase Session para gestión centralizada de sesiones
- Mejorado manejo de errores en Database (sin die())
- Refactorizado Auth para usar nueva clase Session
- Agregada validación CSRF a formularios de login y admin
- Agregada validación de roles en modelo User
- Mejorada vista de ayudante con tabla de horarios por semana
- Agregada tabla de Turnos de Ayudantes con fechas en columnas
This commit is contained in:
nickpons666
2026-01-20 15:24:07 -06:00
parent dc8e83db6c
commit 05631e4a63
10 changed files with 467 additions and 254 deletions

View File

@@ -5,6 +5,8 @@ if (!defined('BASE_PATH')) {
require_once BASE_PATH . '/config/config.php';
require_once BASE_PATH . '/src/Auth.php';
require_once BASE_PATH . '/src/User.php';
require_once BASE_PATH . '/src/CSRF.php';
require_once BASE_PATH . '/src/Session.php';
$auth = new Auth();
$auth->requireAdmin();
@@ -14,59 +16,64 @@ $message = '';
$messageType = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$action = $_POST['action'] ?? '';
if (!CSRF::isValidRequest()) {
$message = 'Error de validación del formulario';
$messageType = 'danger';
} else {
$action = $_POST['action'] ?? '';
if ($action === 'create') {
$nombre = trim($_POST['nombre'] ?? '');
$email = trim($_POST['email'] ?? '');
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? '';
$rol = $_POST['rol'] ?? 'ayudante';
if ($action === 'create') {
$nombre = trim($_POST['nombre'] ?? '');
$email = trim($_POST['email'] ?? '');
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? '';
$rol = $_POST['rol'] ?? 'ayudante';
if (empty($nombre) || empty($email) || empty($password)) {
$message = 'Todos los campos son obligatorios';
$messageType = 'danger';
} elseif ($userModel->getByEmail($email)) {
$message = 'El email ya está registrado';
$messageType = 'danger';
} elseif ($username && $userModel->usernameExists($username)) {
$message = 'El username ya está en uso';
$messageType = 'danger';
} else {
$userModel->create(compact('nombre', 'email', 'username', 'password', 'rol'));
$message = 'Usuario creado exitosamente';
$messageType = 'success';
}
} elseif ($action === 'update') {
$id = $_POST['id'] ?? 0;
$nombre = trim($_POST['nombre'] ?? '');
$email = trim($_POST['email'] ?? '');
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? '';
$rol = $_POST['rol'] ?? 'ayudante';
if (empty($nombre) || empty($email)) {
$message = 'Nombre y email son obligatorios';
$messageType = 'danger';
} elseif ($userModel->usernameExists($username, $id)) {
$message = 'El username ya está en uso';
$messageType = 'danger';
} else {
$userModel->update($id, compact('nombre', 'email', 'username', 'password', 'rol'));
$message = 'Usuario actualizado exitosamente';
$messageType = 'success';
}
} elseif ($action === 'toggle') {
$id = $_POST['id'] ?? 0;
$user = $userModel->getById($id);
if ($user) {
if ($user['activo']) {
$userModel->deactivate($id);
if (empty($nombre) || empty($email) || empty($password)) {
$message = 'Todos los campos son obligatorios';
$messageType = 'danger';
} elseif ($userModel->getByEmail($email)) {
$message = 'El email ya está registrado';
$messageType = 'danger';
} elseif ($username && $userModel->usernameExists($username)) {
$message = 'El username ya está en uso';
$messageType = 'danger';
} else {
$userModel->activate($id);
$userModel->create(compact('nombre', 'email', 'username', 'password', 'rol'));
$message = 'Usuario creado exitosamente';
$messageType = 'success';
}
} elseif ($action === 'update') {
$id = $_POST['id'] ?? 0;
$nombre = trim($_POST['nombre'] ?? '');
$email = trim($_POST['email'] ?? '');
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? '';
$rol = $_POST['rol'] ?? 'ayudante';
if (empty($nombre) || empty($email)) {
$message = 'Nombre y email son obligatorios';
$messageType = 'danger';
} elseif ($userModel->usernameExists($username, $id)) {
$message = 'El username ya está en uso';
$messageType = 'danger';
} else {
$userModel->update($id, compact('nombre', 'email', 'username', 'password', 'rol'));
$message = 'Usuario actualizado exitosamente';
$messageType = 'success';
}
} elseif ($action === 'toggle') {
$id = $_POST['id'] ?? 0;
$user = $userModel->getById($id);
if ($user) {
if ($user['activo']) {
$userModel->deactivate($id);
} else {
$userModel->activate($id);
}
$message = 'Estado actualizado';
$messageType = 'success';
}
$message = 'Estado actualizado';
$messageType = 'success';
}
}
}
@@ -133,15 +140,16 @@ $pageTitle = 'Gestión de Usuarios';
onclick="editUser(<?= $u['id'] ?>, '<?= htmlspecialchars($u['nombre']) ?>', '<?= htmlspecialchars($u['email']) ?>', '<?= htmlspecialchars($u['username'] ?? '') ?>', '<?= $u['rol'] ?>')">
Editar
</button>
<?php if ($u['id'] != $_SESSION['user_id']): ?>
<form method="POST" class="d-inline">
<input type="hidden" name="action" value="toggle">
<input type="hidden" name="id" value="<?= $u['id'] ?>">
<button type="submit" class="btn btn-sm btn-<?= $u['activo'] ? 'outline-warning' : 'outline-success' ?>">
<?= $u['activo'] ? 'Desactivar' : 'Activar' ?>
</button>
</form>
<?php endif; ?>
<?php if ($u['id'] != Session::get('user_id')): ?>
<form method="POST" class="d-inline">
<?= CSRF::getTokenField() ?>
<input type="hidden" name="action" value="toggle">
<input type="hidden" name="id" value="<?= $u['id'] ?>">
<button type="submit" class="btn btn-sm btn-<?= $u['activo'] ? 'outline-warning' : 'outline-success' ?>">
<?= $u['activo'] ? 'Desactivar' : 'Activar' ?>
</button>
</form>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
@@ -160,6 +168,7 @@ $pageTitle = 'Gestión de Usuarios';
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<form method="POST" id="userForm">
<?= CSRF::getTokenField() ?>
<input type="hidden" name="action" value="create" id="formAction">
<input type="hidden" name="id" value="" id="userId">
<div class="modal-body">