Tul xxx Tul
User / IP
:
216.73.216.217
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
/
emprendo.com.co
/
public_html
/
cynea2
/
Viewing: router.php
<?php require_once __DIR__ . '/config.php'; require_once __DIR__ . '/utils/session.php'; require_once __DIR__ . '/utils/helpers.php'; ini_set('upload_max_filesize', '128M'); ini_set('post_max_size', '128M'); ini_set('max_execution_time', '300'); function isJsonRequest() { if (!empty($_SERVER['HTTP_ACCEPT']) && stripos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false) { return true; } if (!empty($_SERVER['CONTENT_TYPE']) && stripos($_SERVER['CONTENT_TYPE'], 'application/json') !== false) { return true; } return false; } function enforceMethod($method, $forceJson = false) { $requestMethod = strtoupper($_SERVER['REQUEST_METHOD'] ?? ''); if ($requestMethod !== strtoupper($method)) { if ($forceJson || isJsonRequest()) { jsonResponse(['error' => 'Método no permitido'], 405); } else { http_response_code(405); } exit; } } function requireCsrfToken() { $token = $_POST['_token'] ?? $_SERVER['HTTP_X_CSRF_TOKEN'] ?? null; if (!SessionManager::validateCsrfToken($token)) { jsonResponse(['error' => 'Token CSRF inválido o expirado'], 419); } } SessionManager::start(); SessionManager::regenerateIfNeeded(); require_once 'controllers/UserController.php'; if (isset($_GET['action']) && $_GET['action'] === 'getUserJson') { enforceMethod('GET', true); ob_clean(); SessionManager::start(); $controller = new UserController($pdo); if (!isset($_SESSION['user_id'])) { jsonResponse(['error' => 'Sesión expirada'], 401); } $id = $_GET['id'] ?? null; if ($id) { $user = $controller->userModel->find($id); if ($user) { jsonResponse($user); } else { jsonResponse(['error' => 'Usuario no encontrado'], 404); } } else { jsonResponse(['error' => 'ID de usuario no especificado'], 400); } exit; } require_once 'controllers/ProductController.php'; require_once 'controllers/ClientController.php'; require_once 'controllers/ProjectController.php'; require_once 'models/Accion.php'; require_once 'models/Project.php'; require_once __DIR__ . '/controllers/ContenidoController.php'; require_once 'models/Chat.php'; $action = $_GET['action'] ?? 'index'; $publicActions = ['login', 'register']; $publicApiActions = [ 'getAcciones', 'getFacturaProyecto', 'getContenidos', 'getChat', 'sendChat', 'iniciarConversacion', 'marcarLeidosAdmin', 'guardarFirmaProyecto' ]; $token = $_GET['token'] ?? ($_POST['token'] ?? null); $clientePublicAuth = false; if (!in_array($action, $publicActions, true)) { if (in_array($action, $publicApiActions, true) && $token) { require_once __DIR__ . '/models/Client.php'; $clientModelAuth = new Client($pdo); $clienteByToken = $clientModelAuth->findByToken($token); if ($clienteByToken) { $clientePublicAuth = true; $_GET['cliente_id'] = $_GET['cliente_id'] ?? $clienteByToken['id']; $_POST['cliente_id'] = $_POST['cliente_id'] ?? $clienteByToken['id']; } } if (!$clientePublicAuth) { SessionManager::requireAuthenticated(); } } $controller = new UserController($pdo); $productController = new ProductController($pdo); $clientController = new ClientController($pdo); $contenidoController = new ContenidoController($pdo); $chatModel = new Chat($pdo); switch($action) { case 'index': $controller->index(); break; case 'create': $controller->create(); break; case 'edit': $controller->edit(); break; case 'store': enforceMethod('POST'); $controller->store(); break; case 'update': enforceMethod('POST'); $controller->update(); break; case 'products': $productController->index(); break; case 'createProduct': enforceMethod('POST'); $productController->createProduct(); break; case 'updateProduct': enforceMethod('POST'); $productController->updateProduct(); break; case 'deleteProduct': enforceMethod('POST'); $productController = new ProductController($pdo); $productController->deleteProduct(); break; case 'deleteUser': enforceMethod('POST'); $controller->deleteUser(); break; case 'clients': $clientController->index(); break; case 'createClient': enforceMethod('POST'); $clientController->createClient(); break; case 'updateClient': enforceMethod('POST'); $clientController->updateClient(); break; case 'deleteClient': enforceMethod('POST'); $clientController->deleteClient(); break; case 'projects': $projectController = new ProjectController($pdo); $projectController->index(); break; case 'createProject': enforceMethod('POST'); $projectController = new ProjectController($pdo); $projectController->createProject(); break; case 'updateProject': enforceMethod('POST', true); header('Content-Type: application/json; charset=utf-8'); $projectModel = new Project($pdo); $data = $_POST; // Validar que el ID esté presente if (!isset($data['id'])) { echo json_encode(['success' => false, 'message' => 'ID de proyecto no proporcionado.']); exit; } try { $success = $projectModel->update($data); if ($success) { echo json_encode(['success' => true]); } else { echo json_encode(['success' => false, 'message' => 'Error al actualizar el proyecto en la base de datos.']); } } catch (Exception $e) { echo json_encode(['success' => false, 'message' => 'Excepción al actualizar proyecto: ' . $e->getMessage()]); } exit; break; case 'deleteProject': enforceMethod('POST'); $projectController = new ProjectController($pdo); $projectController->deleteProject(); break; case 'addDetalle': enforceMethod('POST'); $projectController = new ProjectController($pdo); $projectController->addDetalle(); break; case 'deleteDetalle': enforceMethod('POST'); $projectController = new ProjectController($pdo); $projectController->deleteDetalle(); break; case 'getAcciones': header('Content-Type: application/json; charset=utf-8'); $accion = new Accion($pdo); $acciones = $accion->getAccionesByProyecto($_GET['proyecto_id']); echo json_encode($acciones); exit; break; case 'getAccion': header('Content-Type: application/json; charset=utf-8'); $accion = new Accion($pdo); $accion_data = $accion->getAccion($_GET['id']); echo json_encode($accion_data); exit; break; case 'saveAccion': enforceMethod('POST', true); header('Content-Type: application/json; charset=utf-8'); $accion = new Accion($pdo); $data = [ 'id' => $_POST['id'] ?? null, 'accion' => $_POST['accion'], 'inicio' => $_POST['inicio'], 'fin' => $_POST['fin'] ?: null, 'status' => $_POST['status'], 'responsable_tipo' => explode('_', $_POST['responsable_id'])[0], 'responsable_id' => explode('_', $_POST['responsable_id'])[1], 'proyecto_id' => $_POST['proyecto_id'], 'participantes' => $_POST['participantes'] ?? [], 'producto_id' => $_POST['producto_id'] ?? null, 'cantidad' => $_POST['cantidad'] ?? null ]; try { $accion->saveAccion($data); echo json_encode(['success' => true]); } catch (Exception $e) { echo json_encode(['success' => false, 'message' => $e->getMessage()]); } exit; break; case 'deleteAccion': enforceMethod('POST', true); header('Content-Type: application/json; charset=utf-8'); $accion = new Accion($pdo); $id = $_POST['id'] ?? null; if (!$id) { echo json_encode(['success' => false, 'message' => 'ID de acción no proporcionado']); exit; } $success = $accion->deleteAccion($id); echo json_encode(['success' => $success]); exit; break; case 'getProjectDetails': header('Content-Type: application/json; charset=utf-8'); $projectModel = new Project($pdo); $proyecto_id = $_GET['proyecto_id'] ?? null; $details = ['detalles' => [], 'descuento_porcentaje' => 0, 'descuento_monto' => 0, 'total_proyecto' => 0]; if ($proyecto_id) { // Asumimos que getProjectDetails en el modelo Project // ya obtiene y estructura los detalles, descuento y total. $projectDetails = $projectModel->getProjectDetails($proyecto_id); if ($projectDetails) { // Asegurarnos de que 'detalles' sea un array incluso si no hay productos $details['detalles'] = $projectDetails['detalles'] ?? []; $details['descuento_porcentaje'] = $projectDetails['descuento_porcentaje'] ?? 0; $details['descuento_monto'] = $projectDetails['descuento_monto'] ?? 0; $details['total_proyecto'] = $projectDetails['total_proyecto'] ?? 0; // Asegurarnos de incluir el subtotal general calculado $details['subtotal_general'] = $projectDetails['subtotal_general'] ?? 0; } } echo json_encode($details); exit; break; case 'saveProjectDetalles': enforceMethod('POST', true); header('Content-Type: application/json; charset=utf-8'); if (isset($_SERVER['CONTENT_TYPE']) && stripos($_SERVER['CONTENT_TYPE'], 'application/json') !== false) { $json_data = file_get_contents('php://input'); $data = json_decode($json_data, true); if ($data === null) { echo json_encode(['success' => false, 'message' => 'Datos JSON inválidos.']); exit; } $proyecto_id = $data['proyecto_id'] ?? null; $detalles = $data['detalles'] ?? []; $descuento_porcentaje = $data['descuento_porcentaje'] ?? 0; $total_proyecto = $data['total_proyecto'] ?? 0; if ($proyecto_id === null) { echo json_encode(['success' => false, 'message' => 'ID de proyecto no proporcionado.']); exit; } $projectModel = new Project($pdo); try { // Llamar a un método en el modelo para guardar los detalles y actualizar el proyecto // Debes implementar saveProjectDetails en tu clase models/Project.php $success = $projectModel->saveProjectDetails($proyecto_id, $detalles, $descuento_porcentaje, $total_proyecto); if ($success) { echo json_encode(['success' => true]); } else { echo json_encode(['success' => false, 'message' => 'Error al guardar los detalles del proyecto en la base de datos.']); } } catch (Exception $e) { // Capturar cualquier excepción que ocurra en el modelo o aquí echo json_encode(['success' => false, 'message' => 'Excepción al guardar detalles: ' . $e->getMessage()]); } } else { // Si no es una solicitud POST con JSON, devolver un error echo json_encode(['success' => false, 'message' => 'Solicitud no válida. Se esperaba POST con Content-Type: application/json.']); } exit; break; case 'getPagosJson': $projectController = new ProjectController($pdo); $projectController->getPagosJson($_GET['proyecto_id'] ?? null); exit; break; case 'addPagoAjax': enforceMethod('POST', true); $projectController = new ProjectController($pdo); $data = $_POST; $projectController->addPagoAjax($data); exit; break; case 'deletePagoAjax': enforceMethod('POST', true); $projectController = new ProjectController($pdo); $pago_id = $_POST['id'] ?? null; $projectController->deletePagoAjax($pago_id); exit; break; case 'getContenidos': echo json_encode($contenidoController->index($_GET['proyecto_id'])); exit; break; case 'addContenido': enforceMethod('POST', true); // Manejo de archivo y datos $archivoNombre = null; if (!empty($_FILES['archivo']['tmp_name'])) { $archivoNombre = uniqid('contenido_') . '_' . basename($_FILES['archivo']['name']); $destino = __DIR__ . '/uploads/contenidos/' . $archivoNombre; if (!is_dir(__DIR__ . '/uploads/contenidos/')) { mkdir(__DIR__ . '/uploads/contenidos/', 0777, true); } move_uploaded_file($_FILES['archivo']['tmp_name'], $destino); } $data = [ 'proyecto_id' => $_POST['proyecto_id'], 'contenido' => $_POST['contenido'], 'archivo' => $archivoNombre, 'url' => $_POST['url'] ?? null ]; $contenidoController->store($data); echo json_encode(['success' => true]); exit; break; case 'deleteContenido': enforceMethod('POST', true); $contenidoController->destroy($_POST['id']); echo json_encode(['success' => true]); exit; break; case 'changeAccionStatus': enforceMethod('POST', true); header('Content-Type: application/json; charset=utf-8'); $id = $_POST['id'] ?? null; $status = $_POST['status'] ?? null; if ($id && $status) { $accion = new Accion($pdo); $success = $accion->updateStatus($id, $status); echo json_encode(['success' => $success]); } else { echo json_encode(['success' => false, 'message' => 'Datos incompletos']); } exit; break; case 'changeProjectStatus': enforceMethod('POST', true); header('Content-Type: application/json; charset=utf-8'); $id = $_POST['id'] ?? null; $status = $_POST['status'] ?? null; if ($id && $status) { $projectModel = new Project($pdo); try { $stmt = $pdo->prepare('UPDATE proyectos SET status = ? WHERE id = ?'); $success = $stmt->execute([$status, $id]); echo json_encode(['success' => $success]); } catch (Exception $e) { echo json_encode(['success' => false, 'message' => $e->getMessage()]); } } else { echo json_encode(['success' => false, 'message' => 'Datos incompletos']); } exit; break; case 'getChat': if (isset($_GET['cliente_id'])) { echo json_encode($chatModel->getMensajes($_GET['cliente_id'])); exit; } break; case 'sendChat': enforceMethod('POST', true); if (isset($_POST['cliente_id'], $_POST['remitente'], $_POST['mensaje'])) { $chatModel->enviarMensaje($_POST['cliente_id'], $_POST['remitente'], $_POST['mensaje']); echo json_encode(['success' => true]); exit; } break; case 'getChatsRecientes': header('Content-Type: application/json; charset=utf-8'); echo json_encode($chatModel->getChatsRecientes()); exit; break; case 'iniciarConversacion': enforceMethod('POST', true); if (isset($_POST['cliente_id'])) { $chatModel->iniciarConversacion($_POST['cliente_id']); echo json_encode(['success' => true]); exit; } break; case 'marcarLeidosAdmin': enforceMethod('POST', true); if (isset($_POST['cliente_id'])) { $chatModel->marcarLeidosAdmin($_POST['cliente_id']); echo json_encode(['success' => true]); exit; } break; case 'getAllClientesBasic': require_once 'models/Client.php'; $clientModel = new Client($pdo); header('Content-Type: application/json; charset=utf-8'); echo json_encode($clientModel->allBasic()); exit; break; case 'getAllAcciones': header('Content-Type: application/json; charset=utf-8'); $acciones = $pdo->query('SELECT * FROM acciones')->fetchAll(PDO::FETCH_ASSOC); foreach ($acciones as &$a) { // Obtener cliente_id a partir del proyecto_id $stmt = $pdo->prepare('SELECT cliente_id FROM proyectos WHERE id = ?'); $stmt->execute([$a['proyecto_id']]); $a['cliente_id'] = $stmt->fetchColumn(); // Responsable if ($a['responsable_tipo'] === 'user') { $stmt = $pdo->prepare('SELECT nombre FROM users WHERE id = ?'); $stmt->execute([$a['responsable_id']]); $a['responsable_nombre'] = $stmt->fetchColumn(); } else if ($a['responsable_tipo'] === 'client') { $stmt = $pdo->prepare('SELECT nombre FROM clientes WHERE id = ?'); $stmt->execute([$a['responsable_id']]); $a['responsable_nombre'] = $stmt->fetchColumn(); } else { $a['responsable_nombre'] = null; } // Participantes $sqlP = "SELECT ap.participante_tipo, ap.participante_id, CASE WHEN ap.participante_tipo = 'user' THEN u.nombre ELSE c.nombre END as nombre FROM accion_participantes ap LEFT JOIN users u ON ap.participante_tipo = 'user' AND ap.participante_id = u.id LEFT JOIN clientes c ON ap.participante_tipo = 'client' AND ap.participante_id = c.id WHERE ap.accion_id = ?"; $stmtP = $pdo->prepare($sqlP); $stmtP->execute([$a['id']]); $participantes = $stmtP->fetchAll(PDO::FETCH_ASSOC); $a['participantes_nombres'] = array_map(function($p) { return $p['nombre']; }, $participantes); } echo json_encode($acciones); exit; break; case 'getFacturaProyecto': header('Content-Type: application/json; charset=utf-8'); $proyecto_id = $_GET['proyecto_id'] ?? null; if (!$proyecto_id) { echo json_encode(['success' => false, 'message' => 'ID de proyecto no proporcionado.']); exit; } $projectModel = new Project($pdo); $clientModel = new Client($pdo); $userModel = new User($pdo); $proyecto = $projectModel->find($proyecto_id); if (!$proyecto) { echo json_encode(['success' => false, 'message' => 'Proyecto no encontrado.']); exit; } $cliente = $clientModel->find($proyecto['cliente_id']); $manager = $userModel->find($proyecto['project_manager']); $detalles = $projectModel->detalles($proyecto_id); $pagos = $projectModel->pagos($proyecto_id); $abonado = 0; foreach ($pagos as $p) $abonado += $p['monto']; $subtotal = 0; foreach ($detalles as $d) $subtotal += $d['precio'] * $d['cantidad']; $descuento = isset($proyecto['descuento']) ? floatval($proyecto['descuento']) : 0; $descuento_monto = $subtotal * ($descuento / 100); $total = $subtotal - $descuento_monto; $pendiente = $total - $abonado; echo json_encode([ 'success' => true, 'proyecto' => $proyecto, 'cliente' => $cliente, 'manager' => $manager, 'detalles' => $detalles, 'pagos' => $pagos, 'subtotal' => $subtotal, 'descuento' => $descuento, 'descuento_monto' => $descuento_monto, 'total' => $total, 'abonado' => $abonado, 'pendiente' => $pendiente ]); exit; break; case 'guardarFirmaProyecto': enforceMethod('POST', true); header('Content-Type: application/json; charset=utf-8'); $proyecto_id = $_POST['proyecto_id'] ?? null; $tipo = $_POST['tipo'] ?? null; // 'cliente' o 'manager' $imagen = $_POST['imagen'] ?? null; // base64 if (!$proyecto_id || !$tipo || !$imagen) { echo json_encode(['success' => false, 'message' => 'Datos incompletos.']); exit; } $nombreArchivo = uniqid('firma_') . '.png'; $ruta = __DIR__ . '/uploads/firmas/' . $nombreArchivo; if (!is_dir(__DIR__ . '/uploads/firmas/')) { mkdir(__DIR__ . '/uploads/firmas/', 0777, true); } $imagen = preg_replace('#^data:image/\w+;base64,#i', '', $imagen); $data = base64_decode($imagen); if (file_put_contents($ruta, $data) === false) { echo json_encode(['success' => false, 'message' => 'No se pudo guardar la firma.']); exit; } $campo = $tipo === 'cliente' ? 'firma_cliente' : 'firma_manager'; $stmt = $pdo->prepare("UPDATE proyectos SET $campo = ? WHERE id = ?"); $stmt->execute([$nombreArchivo, $proyecto_id]); echo json_encode(['success' => true, 'archivo' => $nombreArchivo]); exit; break; case 'login': $controller->login(); break; case 'logout': $controller->logout(); break; case 'register': $controller->register(); break; default: $controller->index(); break; } ?>
Coded With 💗 by
0x6ick