Módulo VPSManager para WHMCS con configuración externa, acceso seguro al panel y métricas Graphite para LX.
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

6.8 KiB

Informe de regresión — 19/09/2026

Implementación local, desactivada. Contrato de activación observado en la instalación real; backend y página cliente completa siguen pendientes. Este informe no es una aceptación de producción.

Base y cambios

Base local y HEAD remoto consultado: 1174c120dec0982b4c628a353c66cdaeab894b1e (main, limpio). Worktree separado en rama feature/client-backups-summary; el checkout original permanece en main. Sin push, merge ni despliegue.

Archivos de runtime añadidos: lib/BackupAccess.php, BackupOption.php, BackupCache.php, BackupHttp.php, BackupParser.php, Backups.php, templates/backups.php, templates/backups.tpl. Cambios de integración: require del componente, parámetro opcional en registro de botones, botón condicional y callback Backups; nueva sección privada en config.example.php. Pruebas y fixtures saneados bajo tests/; documentación bajo docs/. El auditor extiende a tests/backups.php las excepciones existentes para sentinelas FAKE_ y URLs inválidas de pruebas con dominio example.invalid; no se han eximido archivos de runtime.

La opción configurable del módulo, sus posiciones y las implementaciones existentes de provisioning, suspensión/reactivación, panel, Graphite, snapshots, firewall y reinicio/parada/arranque no se modifican. Los cinco botones anteriores siguen registrados incluso sin parámetros/configuración. Las dependencias nuevas fallan de forma aislada/cerrada para copias.

Verificaciones ejecutadas

Runtime: PHP CLI 8.1.2-1ubuntu2.26, DOM/libxml del paquete Ubuntu php8.1-xml, Node.js v22.11.0. PHP no estaba en PATH; se reutilizó el binario local de la entrega anterior y se extrajo DOM bajo work/, sin instalar paquetes del sistema. Las suites PHP usan -n, con DOM cargado expresamente para backups, sin cURL real. Los comandos siguientes usan php como abreviatura de ese runtime.

Comprobación Resultado
Antes del cambio: php -n tests/run.php PASS: 192 aserciones, HTTP simulado
Antes del cambio: node tests/frontend.cjs PASS: 24 aserciones
Después: php -n -d extension=/ruta/dom.so tests/backups.php PASS: 192 existentes + 142 nuevas
Después: node tests/frontend.cjs PASS: 24 aserciones
Diagnóstico separado: php -n test-diagnostico.php /ruta/checkout PASS: 51 aserciones
php -l en los 22 PHP del checkout y del diagnóstico PASS
node --check assets/metrics.js PASS, JS sin cambios
git diff --check PASS
python3 tools/audit.py PASS heurístico; revisión manual descrita abajo

Cobertura nueva ejecutada: claves exactas y grupos aplicables, no herencia de opciones de otros grupos, duplicados ambiguos, conflicto de ambas claves/tipos con incidencia segura, regla estricta con valores observados integer 1/0, valores ausentes/nulos/desconocidos, host y límites; detalle correcto/equivocado/resumen/login; tablas y filas reordenadas/unión por ID; contadores/tamaños ausentes; cinco/seis/cero filas; Filled, idle y estado desconocido; fechas y DST ambiguo/inexistente; HTTP 200/301/302/401/403/404/500, retorno falso cURL para fallo TLS/timeout y aborto por tamaño; URL fija y política TLS/redirect; propietario/sin sesión/permiso delegado denegado y permitido con mocks; alteración de ID desde callback real; no consultas denegadas; caché aislada por servicio/host/configuración, revocación, TTL, stale y caducidad; escape y sentinelas públicos.

El caso TLS simula el retorno de error de cURL y verifica sus opciones; no realiza un handshake real. El caso de delegado simula el contrato de CurrentUser/permiso; no ejecuta WHMCS. La prueba de integración llama al callback de producción con la frontera de sesión y consultas Capsule simuladas, incluyendo servicio ajeno: no se limita a pasar parámetros que ya se suponen autorizados, pero no ejecuta el router cifrado real.

Renderizado y privacidad

Se ejecutó Backups::render desde el callback y se guardó la evidencia sintética vista-backups-fixture.html junto a la entrega. Contiene la vista propia dentro de un contenedor HTML representativo, no el tema completo de WHMCS. Se comprueba ausencia de proveedor, hosts, URL privada, credencial falsa, número interno, enlaces y conteos de ficheros; el contenido malicioso queda escapado. Smarty recibe un único campo HTML propio. No se ha ejecutado Smarty ni una sesión de navegador sobre WHMCS: no se declara validada la página completa real.

Los tres fixtures se copiaron exclusivamente del ZIP saneado proporcionado. Revisión manual: hosts .invalid, usuario de prueba e IP documental; referencias públicas al proyecto del proveedor conservadas solo como material de parser. No se han copiado exportaciones originales, capturas de clientes, configuración privada ni credenciales reales. El escáner inicialmente señaló dos sentinelas de pruebas, revisados y cubiertos con las mismas excepciones acotadas que la suite existente. No publicar ni desplegar fixtures bajo una ruta HTTP.

Pendientes reales — no son PASS

  • Ya ejecutado (no pendiente): observación administrativa de casilla marcada/desmarcada, ambas con clave Backup diario presente, tipo integer, valores 1 y 0. Regla exacta y tests incorporados. Diagnóstico deshabilitado y retirado; checksum del módulo original restaurado: 7bc076e93636f2126b28ddf79e24759e88b20da7abe4c700d581c2a13bfc1f5d.
  • Ya ejecutado: WHMCS 8.13.3-release.1, PHP real 8.1.22, autenticación administrativa real en el callback, ausencia de tabla con enabled=false, enlaces administrativos conservados y log PHP sin nuevas entradas durante las comprobaciones. No equivale a validar la autorización cliente/delegada.
  • WHMCS/tema/Smarty reales: firma efectiva del callback de botones, permiso products, CurrentUser, enrutamiento, propietario/delegados e IDOR, formato horario y semántica del campo exclusivamente administrativo, ausencia en emails/pedido/factura/página completa.
  • Cuenta del origen, permisos de solo lectura efectivos, mecanismo de autenticación, endpoint, TLS real, zona horaria y estructura de detalle de un host realmente sin copias.
  • Caché fuera de todos los alias HTTP, permisos del usuario PHP, exclusión del CDN/caché de página y verificación entre sesiones.
  • Regresión operativa en staging: Graphite/panel/snapshots/firewall/reiniciar/detener/iniciar/suspensión/reactivación. El código existente se conserva y sus pruebas simuladas pasan, pero no se han ejecutado órdenes reales ni se garantiza desde este entorno la instalación productiva.

Instalación y rollback: BACKUPS.md. Diagnóstico temporal separado y no integrado en runtime: carpeta diagnostico de la entrega, con instrucciones para revisión. La implementación no está habilitada para clientes. La pareja activo/inactivo queda confirmada; permanecen pendientes las verificaciones reales enumeradas del backend, permisos y superficie cliente.