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
/
aircan.me
/
public_html
/
piscina
/
app
/
models
/
Viewing: Configuracion.php
<?php namespace App\Models; require_once dirname(__DIR__, 2) . '/config/database.php'; use mysqli; class Configuracion { private const BACKUP_PATH = __DIR__ . '/../../storage/backups'; private static array $horarioDefault = [ 'apertura' => '08:00', 'cierre' => '18:00', 'dias' => ['Lunes', 'Martes', 'MiƩrcoles', 'Jueves', 'Viernes'], ]; private static ?mysqli $conn = null; public static function horario(): array { self::asegurarRegistro(); $conn = self::connection(); $resultado = $conn->query('SELECT horario_apertura, horario_cierre, dias_laborales FROM configuracion ORDER BY id ASC LIMIT 1'); if (!$resultado) { return self::$horarioDefault; } $fila = $resultado->fetch_assoc(); if (!$fila) { return self::$horarioDefault; } $dias = $fila['dias_laborales'] ? json_decode($fila['dias_laborales'], true) : null; if (!is_array($dias) || empty($dias)) { $dias = self::$horarioDefault['dias']; } return [ 'apertura' => $fila['horario_apertura'] ?? self::$horarioDefault['apertura'], 'cierre' => $fila['horario_cierre'] ?? self::$horarioDefault['cierre'], 'dias' => $dias, ]; } public static function guardarHorario(array $datos): void { self::asegurarRegistro(); $conn = self::connection(); $dias = json_encode(array_values($datos['dias']), JSON_UNESCAPED_UNICODE); $stmt = $conn->prepare('UPDATE configuracion SET horario_apertura = ?, horario_cierre = ?, dias_laborales = ? WHERE id = 1'); $stmt->bind_param('sss', $datos['apertura'], $datos['cierre'], $dias); $stmt->execute(); } public static function ultimoBackup(): ?array { $conn = self::connection(); $stmt = $conn->prepare("SELECT archivo, ruta, tamano, usuario, fecha FROM configuracion_historial WHERE tipo = 'backup' ORDER BY fecha DESC, id DESC LIMIT 1"); $stmt->execute(); $resultado = $stmt->get_result()->fetch_assoc(); return $resultado ?: null; } public static function crearBackup(): array { self::asegurarRegistro(); $conn = self::connection(); $timestamp = date('Ymd_His'); $nombreArchivo = 'backup_' . $timestamp . '.sql'; $usuario = self::usuarioActual(); $tablas = [ 'configuracion', 'configuracion_historial', 'empleados', 'empleados_asistencias', 'empleados_tareas', 'servicios', 'servicios_uso', 'ventas', 'venta_detalle', 'clientes', 'clientes_historial', 'movimientos_caja', 'entradas', 'productos', 'usuarios', 'roles', 'roles_permisos', 'permisos', ]; $lines = []; $lines[] = '-- Backup generado en ' . date('Y-m-d H:i:s'); $lines[] = '-- Usuario: ' . $usuario; $lines[] = 'SET FOREIGN_KEY_CHECKS=0;'; foreach ($tablas as $tabla) { if (!self::tablaExiste($conn, $tabla)) { continue; } $schema = self::dumpTableSchema($conn, $tabla); if ($schema !== null) { $lines[] = $schema; } $data = self::dumpTableData($conn, $tabla); if ($data !== null) { $lines[] = $data; } } $lines[] = 'SET FOREIGN_KEY_CHECKS=1;'; $contenido = implode(PHP_EOL . PHP_EOL, array_filter($lines, fn ($line) => $line !== null && $line !== '')) . PHP_EOL; $tamano = self::tamanoHumano(strlen($contenido)); $stmt = $conn->prepare('INSERT INTO configuracion_historial (configuracion_id, tipo, archivo, tamano, usuario) VALUES (1, "backup", ?, ?, ?)'); $stmt->bind_param('sss', $nombreArchivo, $tamano, $usuario); $stmt->execute(); return [ 'fecha' => date('Y-m-d H:i:s'), 'archivo' => $nombreArchivo, 'tamano' => $tamano, 'usuario' => $usuario, 'contenido' => $contenido, ]; } public static function restaurarBackup(string $contenido, string $archivo): array { self::asegurarRegistro(); $conn = self::connection(); $conn->begin_transaction(); try { self::ejecutarDumpSql($conn, $contenido); $conn->commit(); } catch (\Throwable $e) { $conn->rollback(); throw $e; } $usuario = self::usuarioActual(); $stmt = $conn->prepare('INSERT INTO configuracion_historial (configuracion_id, tipo, archivo, usuario) VALUES (1, "restore", ?, ?)'); $stmt->bind_param('ss', $archivo, $usuario); $stmt->execute(); return [ 'archivo' => $archivo, 'fecha' => date('Y-m-d H:i:s'), 'usuario' => $usuario, ]; } public static function ultimaRestauracion(): ?array { $conn = self::connection(); $stmt = $conn->prepare("SELECT archivo, ruta, usuario, fecha FROM configuracion_historial WHERE tipo = 'restore' ORDER BY fecha DESC, id DESC LIMIT 1"); $stmt->execute(); $resultado = $stmt->get_result()->fetch_assoc(); return $resultado ?: null; } private static function usuarioActual(): string { if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } return $_SESSION['user']['nombre'] ?? 'Administrador'; } private static function asegurarRegistro(): void { $conn = self::connection(); $resultado = $conn->query('SELECT id FROM configuracion LIMIT 1'); if ($resultado && $resultado->fetch_assoc()) { return; } $dias = json_encode(self::$horarioDefault['dias'], JSON_UNESCAPED_UNICODE); $stmt = $conn->prepare('INSERT INTO configuracion (horario_apertura, horario_cierre, dias_laborales) VALUES (?, ?, ?)'); $stmt->bind_param('sss', self::$horarioDefault['apertura'], self::$horarioDefault['cierre'], $dias); $stmt->execute(); } private static function asegurarDirectorio(string $ruta): void { if (!is_dir($ruta)) { mkdir($ruta, 0775, true); } } private static function tamanoHumano(int $bytes): string { if ($bytes >= 1048576) { return round($bytes / 1048576, 2) . ' MB'; } if ($bytes >= 1024) { return round($bytes / 1024, 2) . ' KB'; } return $bytes . ' B'; } private static function dumpTableSchema(mysqli $conn, string $tabla): ?string { $resultado = $conn->query('SHOW CREATE TABLE `' . $conn->real_escape_string($tabla) . '`'); if (!$resultado) { return null; } $fila = $resultado->fetch_assoc(); if (!$fila || !isset($fila['Create Table'])) { return null; } return 'DROP TABLE IF EXISTS `' . $tabla . '`;' . PHP_EOL . $fila['Create Table'] . ';'; } private static function dumpTableData(mysqli $conn, string $tabla): ?string { $resultado = $conn->query('SELECT * FROM `' . $conn->real_escape_string($tabla) . '`'); if (!$resultado || $resultado->num_rows === 0) { return null; } $columnas = array_map(fn ($meta) => '`' . $meta->name . '`', $resultado->fetch_fields()); $columnasSQL = implode(', ', $columnas); $values = []; while ($fila = $resultado->fetch_assoc()) { $registro = []; foreach ($fila as $valor) { if ($valor === null) { $registro[] = 'NULL'; continue; } $registro[] = "'" . $conn->real_escape_string((string) $valor) . "'"; } $values[] = '(' . implode(', ', $registro) . ')'; } if (empty($values)) { return null; } $chunks = array_chunk($values, 100); $inserts = []; foreach ($chunks as $chunk) { $inserts[] = 'INSERT INTO `' . $tabla . '` (' . $columnasSQL . ') VALUES ' . implode(', ', $chunk) . ';'; } return implode(PHP_EOL, $inserts); } private static function tablaExiste(mysqli $conn, string $tabla): bool { $tablaEscapada = $conn->real_escape_string($tabla); $resultado = $conn->query("SHOW TABLES LIKE '" . $tablaEscapada . "'"); if (!$resultado) { return false; } $existe = $resultado->num_rows > 0; $resultado->free(); return $existe; } private static function ejecutarDumpSql(mysqli $conn, string $sqlDump): void { $sql = trim($sqlDump); if ($sql === '') { throw new \RuntimeException('El archivo SQL no contiene instrucciones para ejecutar.'); } if (!$conn->multi_query($sql)) { throw new \RuntimeException('Error al ejecutar el respaldo: ' . $conn->error); } do { $resultado = $conn->store_result(); if ($resultado instanceof \mysqli_result) { $resultado->free(); } } while ($conn->more_results() && $conn->next_result()); if ($conn->errno) { throw new \RuntimeException('Error tras procesar el respaldo: ' . $conn->error); } } private static function connection(): mysqli { if (self::$conn instanceof mysqli) { return self::$conn; } $db = new \Database(); self::$conn = $db->getConnection(); return self::$conn; } }
Coded With 💗 by
0x6ick