Apariencia
Licencias y precios
La firma del paquete solo garantiza que no se ha manipulado y de quién viene. La licencia decide quién puede usarlo.
Precios de catálogo
priceMonthly en plugin.json es el precio de lista en EUR al mes sin IVA, junto con description, category e icon para el escaparate. Son orientativos: no se cobra nada; no hay contratación ni facturación conectadas, y el panel lo dice.
Licencia
- Token:
<payload base64url>.<firma>, firmado con Ed25519 con la clave de licencias de Hury Studio (PLUGIN_LICENSE_PUBLIC_KEY) o con la de paquetes de Hury (PLUGIN_PUBLIC_KEY). Contenido:{ v, installId | "*", plugins: [claves] | "*", exp, iat, jti? }. - Atada al
installIdde la instalación (Ajustes → Módulos → Licencias lo muestra) o*(licencia interna de la casa). Un paquete se licencia con las claves que reúne. - Exigirla: con
PLUGINS_LICENSE=required(por defectooff), un plugin conpriceMonthly > 0no se instala sin licencia válida para esta instalación (402PLUGIN_UNLICENSED) y, al arrancar, no se carga si no la tiene o ha caducado. Los gratuitos no la necesitan. - Añadirla: Ajustes → Módulos → Licencias, o
node dist/plugin-license.mjs <fichero>. - Revocación: la licencia puede llevar un
jtiy revocarse desde Hury Studio. ConPLUGINS_REVOCATION_URL(https) la API consulta una lista firmada al arrancar y cada 10 minutos. Nunca se revoca por no poder consultar.
Qué significa para un plugin propio
Las licencias las emiten las claves de Hury, no la clave de confianza de un desarrollador. Por tanto:
- Un plugin propio firmado con una clave de confianza debe publicarse con
priceMonthlyen0(o sin el campo) si la instalación usaPLUGINS_LICENSE=required; de lo contrario no se instalaría sin una licencia que tú no puedes emitir. - Un plugin firmado con una clave de confianza no cuenta como oficial y no puede usar el catálogo privado de Hury.
- La licencia protege el uso comercial (instalar, cargar, descargar); no oculta el código: el del servidor va dentro del
.zipy el del panel llega al navegador.
Bloqueo de módulos
La API, no la interfaz, bloquea un módulo (lib/moduleBlocks.ts): se ve apagado para todo el sistema aunque su interruptor esté encendido, y no se puede encender. Motivos:
| Motivo | Cuándo |
|---|---|
not_installed | La clave es de un plugin y no está instalado. Siempre, con o sin PLUGINS_LICENSE. |
unlicensed | Solo con PLUGINS_LICENSE=required y sin licencia válida que cubra la clave. |
PUT /settings/features y POST /modules/:key/enable responden 422 MODULE_BLOCKED si se intenta encender uno bloqueado. Apagar siempre se permite.