Tul xxx Tul
User / IP
:
216.73.217.33
Host / Server
:
45.84.207.204 / aircan.me
System
:
Linux lt-bnk-web1726.main-hosting.eu 5.14.0-611.36.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Mar 3 11:23:52 EST 2026 x86_64
Command
|
Upload
|
Create
Mass Deface
|
Jumping
|
Symlink
|
Reverse Shell
Ping
|
Port Scan
|
DNS Lookup
|
Whois
|
Header
|
cURL
:
/
home
/
u931257429
/
domains
/
aircan.me
/
public_html
/
siscaps
/
controllers
/
Viewing: UsuariosController.php
<?php class UsuariosController extends BaseController { public function index(): void { $csrf = $this->generateCsrf(); $filters = [ 'q' => trim($_GET['q'] ?? ''), 'role' => in_array(($_GET['role'] ?? ''), ['ADMIN','CAJERO','LECTOR'], true) ? (string)$_GET['role'] : '', 'status' => isset($_GET['status']) && $_GET['status'] !== '' ? (int)$_GET['status'] : '', ]; $items = User::getAll($filters); $roles = User::getAllowedRoles(); $this->renderView('usuarios/index', [ 'csrf' => $csrf, 'filters' => $filters, 'items' => $items, 'roles' => $roles, ]); } public function create(): void { $csrf = $this->generateCsrf(); $roles = User::getAllowedRoles(); $this->renderView('usuarios/create', [ 'csrf' => $csrf, 'roles' => $roles, ]); } public function store(): void { if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') { redirect('usuarios.index'); } $token = $_POST['csrf'] ?? ''; if (!$token || !isset($_SESSION['csrf']) || !hash_equals($_SESSION['csrf'], $token)) { http_response_code(400); echo 'CSRF inválido'; return; } $username = trim((string)($_POST['username'] ?? '')); $email = trim((string)($_POST['email'] ?? '')); $first_name = trim((string)($_POST['first_name'] ?? '')); $last_name = trim((string)($_POST['last_name'] ?? '')); $role_id = (int)($_POST['role_id'] ?? 0); $is_active = isset($_POST['is_active']) ? 1 : 0; $password = (string)($_POST['password'] ?? ''); $password_confirm = (string)($_POST['password_confirm'] ?? ''); $errors = []; $len = mb_strlen($username); if ($len < 3 || $len > 50) { $errors[] = 'El usuario debe tener entre 3 y 50 caracteres.'; } if (User::usernameExists($username)) { $errors[] = 'El nombre de usuario ya está en uso.'; } if ($email === '') { $errors[] = 'El correo es obligatorio.'; } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = 'El correo electrónico no es válido.'; } elseif (User::emailExists($email)) { $errors[] = 'El correo ya está en uso.'; } if ($first_name === '' || $last_name === '') { $errors[] = 'Nombre y Apellido son obligatorios.'; } // Validar role_id permitido $allowed = array_map(fn($r) => (int)$r['id'], User::getAllowedRoles()); if (!in_array($role_id, $allowed, true)) { $errors[] = 'Rol seleccionado inválido.'; } if (strlen($password) < 6) { $errors[] = 'La contraseña debe tener al menos 6 caracteres.'; } if ($password !== $password_confirm) { $errors[] = 'Las contraseñas no coinciden.'; } if (!empty($errors)) { setFlashMessage('error', implode(' ', $errors)); redirect('usuarios.create'); } try { $newId = User::create([ 'username' => $username, 'email' => $email, 'password_hash' => password_hash($password, PASSWORD_DEFAULT), 'first_name' => $first_name, 'last_name' => $last_name, 'role_id' => $role_id, 'is_active' => $is_active, ]); if ($newId > 0) { setFlashMessage('success', 'Usuario creado correctamente.'); redirect('usuarios.index'); } setFlashMessage('error', 'No se pudo crear el usuario.'); redirect('usuarios.create'); } catch (Throwable $e) { setFlashMessage('error', 'Error al crear usuario: ' . $e->getMessage()); redirect('usuarios.create'); } } public function edit(): void { $csrf = $this->generateCsrf(); $id = (int)($_GET['id'] ?? 0); if ($id <= 0) { http_response_code(400); echo 'ID inválido'; return; } $user = User::findById($id); if (!$user) { http_response_code(404); echo 'Usuario no encontrado'; return; } // Restringir edición a roles permitidos (ADMIN/CAJERO/LECTOR) if (!in_array(($user['role'] ?? ''), ['ADMIN','CAJERO','LECTOR'], true)) { http_response_code(403); echo 'Operación no permitida'; return; } $roles = User::getAllowedRoles(); $this->renderView('usuarios/edit', [ 'csrf' => $csrf, // Usar un nombre que no colisione con $user del layout 'editUser' => $user, 'roles' => $roles, ]); } public function update(): void { if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') { redirect('usuarios.index'); } $token = $_POST['csrf'] ?? ''; if (!$token || !isset($_SESSION['csrf']) || !hash_equals($_SESSION['csrf'], $token)) { http_response_code(400); echo 'CSRF inválido'; return; } $id = (int)($_POST['id'] ?? 0); if ($id <= 0) { setFlashMessage('error', 'ID inválido.'); redirect('usuarios.index'); } $username = trim((string)($_POST['username'] ?? '')); $email = trim((string)($_POST['email'] ?? '')); $first_name = trim((string)($_POST['first_name'] ?? '')); $last_name = trim((string)($_POST['last_name'] ?? '')); $role_id = (int)($_POST['role_id'] ?? 0); $is_active = isset($_POST['is_active']) ? 1 : 0; $password = (string)($_POST['password'] ?? ''); $password_confirm = (string)($_POST['password_confirm'] ?? ''); $errors = []; $len = mb_strlen($username); if ($len < 3 || $len > 50) { $errors[] = 'El usuario debe tener entre 3 y 50 caracteres.'; } if (User::usernameExists($username, $id)) { $errors[] = 'El nombre de usuario ya está en uso.'; } if ($email === '') { $errors[] = 'El correo es obligatorio.'; } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = 'El correo electrónico no es válido.'; } elseif (User::emailExists($email, $id)) { $errors[] = 'El correo ya está en uso.'; } if ($first_name === '' || $last_name === '') { $errors[] = 'Nombre y Apellido son obligatorios.'; } $allowed = array_map(fn($r) => (int)$r['id'], User::getAllowedRoles()); if (!in_array($role_id, $allowed, true)) { $errors[] = 'Rol seleccionado inválido.'; } $password_hash = ''; if ($password !== '' || $password_confirm !== '') { if (strlen($password) < 6) { $errors[] = 'La contraseña debe tener al menos 6 caracteres.'; } if ($password !== $password_confirm) { $errors[] = 'Las contraseñas no coinciden.'; } if (empty($errors)) { $password_hash = password_hash($password, PASSWORD_DEFAULT); } } if (!empty($errors)) { setFlashMessage('error', implode(' ', $errors)); header('Location: ' . BASE_URL . '?route=usuarios.edit&id=' . $id); exit; } try { $ok = User::update($id, [ 'username' => $username, 'email' => $email, 'first_name' => $first_name, 'last_name' => $last_name, 'role_id' => $role_id, 'is_active' => $is_active, 'password_hash' => $password_hash, ]); if ($ok) { // Si el usuario actualizado es el mismo que está logueado, refrescar la sesión $currentId = (int)($_SESSION['user']['id'] ?? 0); if ($currentId === $id) { $updated = User::findById($id); if ($updated) { $fullName = trim(($updated['first_name'] ?? '') . ' ' . ($updated['last_name'] ?? '')); $_SESSION['user']['name'] = $fullName !== '' ? $fullName : ($updated['email'] ?? ($_SESSION['user']['email'] ?? '')); if (!empty($updated['email'])) { $_SESSION['user']['email'] = $updated['email']; } if (!empty($updated['role'])) { $_SESSION['user']['role'] = $updated['role']; } // Mantener sincronizada la sesión del usuario interno si aplica if (!empty($_SESSION['internal_user']) && (int)($_SESSION['internal_user']['id'] ?? 0) === $id) { $_SESSION['internal_user']['name'] = $_SESSION['user']['name']; if (!empty($updated['email'])) { $_SESSION['internal_user']['email'] = $updated['email']; } if (!empty($updated['role'])) { $_SESSION['internal_user']['role'] = $updated['role']; } } } } setFlashMessage('success', 'Usuario actualizado correctamente.'); redirect('usuarios.index'); } setFlashMessage('error', 'No se pudo actualizar el usuario.'); header('Location: ' . BASE_URL . '?route=usuarios.edit&id=' . $id); exit; } catch (Throwable $e) { setFlashMessage('error', 'Error al actualizar usuario: ' . $e->getMessage()); header('Location: ' . BASE_URL . '?route=usuarios.edit&id=' . $id); exit; } } public function delete(): void { if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') { redirect('usuarios.index'); } $token = $_POST['csrf'] ?? ''; if (!$token || !isset($_SESSION['csrf']) || !hash_equals($_SESSION['csrf'], $token)) { http_response_code(400); echo 'CSRF inválido'; return; } $id = (int)($_POST['id'] ?? 0); if ($id <= 0) { setFlashMessage('error', 'ID inválido.'); redirect('usuarios.index'); } $currentId = (int)($_SESSION['user']['id'] ?? 0); if ($id === $currentId) { setFlashMessage('error', 'No puedes eliminar tu propia cuenta.'); redirect('usuarios.index'); } try { if (User::delete($id)) { setFlashMessage('success', 'Usuario eliminado.'); } else { setFlashMessage('error', 'No se pudo eliminar el usuario.'); } } catch (Throwable $e) { // Manejo amable de restricciones de integridad (p.ej., pagos vinculados al usuario) $code = (string)$e->getCode(); $msg = $e->getMessage(); if ($code === '23000' || stripos($msg, 'Integrity constraint violation') !== false) { setFlashMessage('error', 'No se puede eliminar este usuario porque tiene registros asociados (por ejemplo, pagos). En su lugar, desactívelo usando el interruptor de estado.'); } else { setFlashMessage('error', 'No se pudo eliminar el usuario.'); } } redirect('usuarios.index'); } public function toggleStatus(): void { if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') { redirect('usuarios.index'); } $token = $_POST['csrf'] ?? ''; if (!$token || !isset($_SESSION['csrf']) || !hash_equals($_SESSION['csrf'], $token)) { http_response_code(400); echo 'CSRF inválido'; return; } $id = (int)($_POST['id'] ?? 0); if ($id <= 0) { setFlashMessage('error', 'ID inválido.'); redirect('usuarios.index'); } $currentId = (int)($_SESSION['user']['id'] ?? 0); if ($id === $currentId) { setFlashMessage('error', 'No puedes cambiar el estado de tu propia cuenta.'); redirect('usuarios.index'); } try { if (User::toggleStatus($id)) { setFlashMessage('success', 'Estado de usuario actualizado.'); } else { setFlashMessage('error', 'No se pudo cambiar el estado.'); } } catch (Throwable $e) { setFlashMessage('error', 'Error al cambiar estado: ' . $e->getMessage()); } redirect('usuarios.index'); } }
Coded With 💗 by
0x6ick