Plugins (avanzado)
Un plugin de tile es el tile personalizado más potente: un widget autocontenido de HTML + JavaScript que se dibuja dentro de un iframe blindado en sandbox, mientras Saiku le va pasando las filas de la consulta del tile. Úselo cuando ni los tiles integrados ni los renderizadores personalizados declarativos puedan dibujar lo que necesita — un indicador a medida, una disposición inusual, un widget hecho para un propósito concreto.
Los plugins son una función avanzada y controlada por el administrador. Esta página trata sobre todo de su modelo de confianza, porque acertar en eso importa más que la mecánica.
Cómo se instala un plugin
Un operador (no un usuario de dashboards) deja un bundle en una carpeta del servidor de Saiku:
${saiku.home}/tile-plugins/ records-bars/ plugin.json # id, label, and an optional option schema plugin.html # self-contained widget: inline CSS/JS, data: images onlyplugin.jsondeclara eliddel plugin (un slug comorecords-bars), unlabelde visualización y, opcionalmente, unoptionSchemaque describe las opciones configurables por el autor.plugin.htmles el widget en sí — un único documento HTML autocontenido con CSS y JavaScript en línea (sin scripts, estilos ni fuentes remotos; las imágenes deben ser URIsdata:).
El servidor escanea la carpeta y deja los plugins instalados
disponibles para elegir. Un autor de dashboards añade uno desde
+ Añadir tile, donde cada plugin instalado aparece como su propia
entrada; el tile persistido guarda solo el id del plugin, nunca
marcado.
Saiku incluye un ejemplo semilla — records-bars, un gráfico de
barras de registros sencillo — para que una instalación recién hecha
tenga un plugin que funcione, que mirar y copiar.
Qué contiene el sandbox — y qué no
Cada frame de plugin corre tras dos capas de contención.
1. Un iframe sandbox="allow-scripts" (deliberadamente sin
allow-same-origin). El frame corre en el origen opaco null, así que
el código del plugin no puede:
- leer el DOM, las cookies ni el
localStoragede la página padre; - ver la sesión de Saiku, un token de incrustación ni datos de ningún otro origen;
- abrir popups, enviar formularios, navegar la ventana superior ni disparar descargas.
2. Una Content-Security-Policy estricta sobre el frame
(default-src 'none', sin connect-src). Esto bloquea la salida de
red en segundo plano — fetch, XHR, WebSocket, EventSource,
sendBeacon, subrecursos remotos y el clásico beacon
<img src="https://evil…">.
Cerrar el canal de autonavegación
Si quiere cerrar también el canal de exfiltración por autonavegación, un
operador define un frame-src restrictivo en la CSP del despliegue
mediante saiku.security.csp (en el proxy inverso o en la
configuración de CSP del launcher). Restringir a dónde pueden navegar
los frames de plugin es la única forma de gobernar la navegación — el
sandbox por tile y la CSP no pueden, por diseño.
El protocolo entre plugin y anfitrión
El anfitrión y el plugin se comunican únicamente por
window.postMessage. Al montar, el anfitrión inyecta un nonce
criptográfico por frame; todo mensaje que envíe un plugin debe
devolver ese nonce o se descarta (el origen de un frame en sandbox es la
cadena "null", así que el nonce es el único autenticador fiable).
- Anfitrión → plugin:
init(las opciones del autor),data(los registros de la consulta),themeyresize. - Plugin → anfitrión:
ready(ya cargué),resize(fija mi altura, por favor — acotada por el anfitrión),filter(una selección, que el anfitrión vuelve a resolver contra el cubo vivo — un plugin no puede inyectar MDX) yerror(renderizado solo como texto plano).
El anfitrión valida y acota todo lo que un plugin envía; un mensaje mal formado o sin autenticar se ignora en lugar de ejecutarse.
Plugins en Apps incrustadas
Cuando una App se incrusta, sus tiles de
plugin se sirven con alcance de token: un invitado puede cargar
exactamente los plugins referenciados por los tiles de la App incrustada
y nada más. Se aplica la misma contención de sandbox + CSP, y sigue en
pie la misma salvedad de autonavegación — así que la recomendación de
frame-src de arriba es también el control del operador para las Apps
incrustadas.
Relacionado
- Tiles personalizados — los renderizadores declarativos, más seguros y sin código; recurra a un plugin solo cuando aquellos no basten.
- Incrustar una App — cómo se aplica el alcance por token a los tiles de plugin.
- Cómo se manejan sus datos — el modelo más amplio de manejo de datos.