Fase 0 del instalador de plugins (docs/plugins/fase0-instalador-diseno.md del
repo de Forge). Un plugin puede llevar install.php, uninstall.php, enable.php,
disable.php y status.php; los ejecuta runPluginLifecycle() dentro de la web
por action_ws=pluginLifecycle, sea Forge o el CMS legacy quien instale.
showInstall() reutiliza el mismo nucleo (installPluginArtifacts) en vez de
duplicar install.sql/schemaPresets.
Checkpoints nuevos, sin efecto hasta que un plugin los declare:
- boot_plugins: en init.php, con la BD ya conectada.
- post_variables: tras cada require de lib/variables.php (slug.php, sesion.php,
lib/recursos.php), una vez por peticion. Un plugin llega DESPUES del bloque
de cache de variables.php y puede pisarlo.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HPL66q9F33YZxbLPUT7KW8
Anade la llamada a addPlugins("cache", ...) al final del bloque CACHE HANDLER,
para que el plugin `cache_handler` pueda gobernar la cache de una web recien
creada sin tener que editarle el variables.php a mano.
El orden es deliberado: el checkpoint va DESPUES del default cableado, asi el
plugin puede apagar tambien lo que se encienda arriba (cache.php fija los
flags de CocoDB explicitamente, no solo cuando activa).
`CocoDB::localCache()` se queda como estaba: es el comportamiento actual de
toda web nueva y quitarlo seria una regresion de rendimiento para quien no
tenga el plugin instalado. Sin plugin, la web se comporta igual que antes de
este commit.
Nota: `lib/variables.php` esta en los excludes del rsync de web-base
(server/handlers/acai.py), asi que esto NO toca ninguna web existente — solo
las que se creen a partir de ahora.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FsEzft5j5tZqxPdTdUXxLK
El parametro ?idioma= llegaba crudo (la query string se reenvia entera a
slug.php via .htaccess) y se reflejaba sin escapar en RUTA_RAIZ/ROOT,
lang="..." y variables JS de las plantillas -> XSS reflejado explotable
en cualquier web (p.ej. ?idioma=';alert(document.cookie);// en contexto JS).
- variables.php: allowlist de idiomas antes de definir constantes/render;
cualquier valor desconocido se descarta.
- footer.tpl/header.tpl: json_encode en los sinks JS (defensa en profundidad).