Implementación local, desactivada. Falta observar la contratación real; este informe no es una aceptación de producción.
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.
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 + 137 nuevas |
Después: node tests/frontend.cjs |
PASS: 24 aserciones |
Diagnóstico separado: php -n test-diagnostico.php /ruta/checkout |
PASS: 35 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, lista estricta sintética, 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.
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.
optiontype=3 no cubren esta verificación.products, CurrentUser, enrutamiento, propietario/delegados e IDOR, formato horario y semántica del campo exclusivamente administrativo, ausencia en emails/pedido/factura/página completa.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 y no se considera terminada la validación de contratación.