Ir al contenido

Publicación y seguridad

Ventana de terminal
yonto-plugin bundle

Genera el archivo publicable, dist/<id>-<version>.js, y un zip de ese archivo, dist/<id>-<version>.zip, e imprime el tamaño del zip y su SHA-256. El zip contiene una sola entrada, el mismo archivo, comprimido.

Pon el zip en cualquier lugar que lo sirva por HTTPS, como una release de GitHub. Un usuario lo instala con Ajustes, Plugins, Instalar desde una URL.

Cuando una versión es pública, nunca reemplaces el archivo en su dirección. Un repositorio fija cada plugin por su SHA-256, así que un archivo que cambió en la misma dirección se rechaza, y con razón. Para corregir un plugin, sube version, vuelve a empaquetar y publica en una dirección nueva.

Un repositorio es una dirección que lista muchos plugins, para que un usuario los añada todos a la vez. Pon tus plugins en un directorio, una carpeta para cada uno, y ejecuta:

Ventana de terminal
yonto-plugin index plugins --base-url https://plugins.example.com > index.json

Empaqueta cada plugin y escribe el índice: para cada uno, una entrada cuya dirección es <base-url>/<id>/<id>-<version>.zip#sha256=…. Sube los zips donde dicen las direcciones, y index.json a la dirección que vas a dar a los usuarios.

Luego comprueba lo que publicaste, desde fuera, como lo hará el Yonto de un usuario:

Ventana de terminal
yonto-plugin index --check https://plugins.example.com/index.json

Descarga el índice y cada plugin que lista, y comprueba de cada uno su SHA-256, su manifiesto y las reglas anteriores. Informa de todos los problemas, no solo del primero.

Un usuario añade el repositorio en Ajustes, Repositorios, Añadir un repositorio.

El cuadro de diálogo de instalación muestra el nombre del plugin, su versión y adónde puede acceder, información que sale del manifiesto. Así que el manifiesto es la promesa del plugin, y el usuario es quien la acepta.

  • Accede a los menos hosts posibles y escríbelos como hosts exactos. Un comodín que cubra un host que no necesitas le pide al usuario que confíe en más.
  • Un plugin que define hostsFromConfig le hace al usuario una pregunta adicional, y Yonto no lo ejecuta antes de la respuesta. Solo el tipo de plugin que lee direcciones que aporta el usuario puede justificar uno.
  • Nunca envíes la clave, el token o el texto escrito por un usuario a un host que el usuario no eligió.
  • Un plugin nunca puede acceder por sí mismo a una dirección privada, como localhost, 192.168.x.x o *.local. Solo se permite una dirección que el usuario escribió en un campo url. Así es como funciona un plugin para un servidor de la propia red del usuario, y por eso su allowedHosts está vacío.

Los plugins son código y se ejecutan en un entorno aislado, sin archivos, sin sockets y sin temporizadores, por lo que la única salida es yonto.fetch. Aun así, un usuario solo debería instalar uno desde una dirección de confianza, y tú debes escribir el tuyo de modo que quien no lo haya leído no pueda salir perjudicado.

  1. lint y doctor --replay están en verde.
  2. contractVersion es el que pide lint, y no más.
  3. allowedHosts es lo más pequeño posible.
  4. Cada reason que lanzas nombra la parte que falló, en una frase, y los registros no contienen ninguna URL, clave ni consulta.
  5. doctor.json y fixtures/ no contienen ninguna clave ni cookie.
  6. version es nueva.