Capacidades y seguridad

En esta página

Los plugins sandboxed están aislados por defecto. Para hacer algo más allá de leer y escribir su propio KV y almacenamiento, un plugin debe declarar una capacidad en su manifiesto.

Declarar capacidades

{
	"slug": "plugin-hello",
	"capabilities": ["content:read", "network:request"],
	"allowedHosts": ["api.example.com"]
}

Referencia de capacidades

CapacidadOtorga acceso a
content:readctx.content.get(), ctx.content.list()
content:writectx.content.create(), ctx.content.update(), ctx.content.delete()
taxonomies:readctx.taxonomies.getAll(), ctx.taxonomies.getTerms()
media:readctx.media.get(), ctx.media.list()
media:writectx.media.getUploadUrl(), ctx.media.upload(), ctx.media.delete()
network:requestctx.http.fetch() — restringido a allowedHosts
network:request:unrestrictedctx.http.fetch() sin restricción de host
users:readctx.users.get(), ctx.users.getByEmail(), ctx.users.list()
email:sendctx.email.send()

Allowlists de hosts de red

"capabilities": ["network:request"],
"allowedHosts": ["api.example.com", "*.cdn.example.com"]

Lo que el sandbox impone

  1. Control de capacidades. El PluginContext solo llena las capacidades declaradas.
  2. Alcance de Storage y KV. Cada operación está limitada al slug del plugin.
  3. Aislamiento de red. fetch() directo está bloqueado.
  4. Sin bindings del host. Los plugins sandboxed no ven variables de entorno.
  5. Límites de recursos. El runner puede imponer límites de CPU, subrequests, tiempo y memoria.

Lo que el sandbox no impone

  • Comportamiento dentro de una capacidad otorgada.
  • Confianza del operador en Node.js.
  • Canales laterales.

Consentimiento de capacidades

Al instalar un plugin, EmDash muestra un diálogo de consentimiento con las capacidades declaradas.

Validación en tiempo de build

Véase Bundling y publicación.