跳转至

插件

本页面向管理员:怎样安装插件或主题,安装时您接受了什么,以及服务器允许它访问您主机上的哪些资源。 所有操作都在管理 → 插件里进行;写给插件作者的页面列在本页末尾。

插件为 Evey 添加它本身不具备的功能:首页上的一个栏目、播放器上的一层叠加内容、一个元数据来源、一个主题。 每个插件都是一个单独的进程,通过本机的套接字和服务器通信,受沙箱限制,并且只能使用它的清单(manifest)里声明的权限。 如果插件有界面,界面在页面里一个隔离的框架中运行。

没有插件的首页
没有插件(界面为英文)。
装了天气插件的首页
装了示例天气插件:最上面多了一个栏目,在它自己的框架里绘制(界面为英文)。

安装插件

  1. 在管理 → 插件里,打开安装插件,选择插件文件 (.zip)。如果作者提供了签名, 把它加到签名文件(.zip.sig,可选)里。从 URL 安装选项卡则是通过链接安装; 在 URL 后面加上 #sha256:<hash>,下载的文件就会被核对。
  2. 预览并安装会分析这个安装包,但不安装它。预览显示插件请求的权限和能力、 静态分析的结果,以及(如果提供了签名)带有发布者的签名结论。插槽和主机会在更新时以及安全仪表板里显示。
  3. 请把这份清单视为插件的约定范围:插件能做的事,只有这些。确认后,插件就会启动。
演示服务器上的管理 → 插件
管理 → 插件:可用的运行时、资源限制,以及每个插件各一张卡片(界面为英文)。

如果分析在安装包里发现了严重的问题,不管您怎么回答,安装都会被拒绝。警告会显示出来,由您决定。 插件使用的语言必须在服务器的可用运行时里:默认镜像带有 Python、Node.js、PHP、Ruby 和 Lua,-nodejs 镜像保留 Python 和 Node.js, -lean 镜像只保留 Python。

签名的插件

插件作者可以用 cosign 给 ZIP 签名, 作者的公钥随包一起分发。Evey 自己检查签名(不需要 cosign 程序):密钥在您的受信任的发布者列表里时显示由 <发布者> 签名,否则显示已签名,未知密钥和它的指纹(点一下即可信任),或者未签名、无效。 更换密钥或去掉签名的更新,要等您明确接受。其余由策略决定:

EVEY_PLUGINS_COSIGN_POLICY=warn      # off | warn(默认)| enforce

设为 warn 时,只显示结论,不阻止任何东西;设为 enforce 时,只有受信任的发布者才能安装。插件作者请看 编写插件。

更新插件

在插件的卡片上,从源更新…接收新的 ZIP(一个路径或一个 URL),并显示同样的预览。 更新的版本号必须比已安装的高。如果更新请求了新的权限、能力、插槽或主机,预览会显示此更新请求新权限, 并列出差别:在您选择批准并安装之前,什么都不会生效。被分析的安装包就是被安装的安装包: 真正应用更新时,会再核对一次它的哈希值。

管理已安装的插件

每张卡片都显示插件的状态(已启用或已禁用),并提供:

操作 作用
已启用 / 已禁用 启动或停止插件的进程。被禁用的插件保留它的文件和配置。
配置 插件声明的设置(一个 API 密钥、一个城市、一个单位……)。机密字段以遮盖的方式显示,永远不会再发回浏览器。
日志 插件通过主机写下的最后几行。
卸载 删除插件的进程、文件和它保存的数据。

页面顶部的资源限制为每个插件进程设定上限。面板里的值就是默认值; 如果面板从来没有保存过,就由环境变量来设定它们。

字段 默认值 环境变量
最大内存(MiB) 256 EVEY_PLUGINS_MEMORY_MB
最大进程数 64 EVEY_PLUGINS_PIDS_MAX
最大磁盘 (MiB) 100 EVEY_PLUGINS_DISK_MAX_MB
CPU 优先级(nice,0-19) 10 EVEY_PLUGINS_CPU_NICE
沙箱模式 auto EVEY_PLUGINS_SANDBOX_MODE

内存、进程和磁盘的限制在监控程序下一次检查时生效,超出限制的插件会被停止; CPU 优先级和沙箱模式对之后启动的插件生效。0 会为内存和进程恢复默认值;只有磁盘限制把 0 当作关闭。

安全仪表板按插件保存分析发现的问题、签名结果和最近一次错误。它的主机沙箱一行显示这台机器上实际生效的沙箱模式: 如果显示 basic,说明主机无法按路径隔离文件系统,插件沙箱设置说明了要改什么。

插件默认是开启的。EVEY_PLUGINS_ENABLED=false 会关闭整个插件子系统。

插件在您的主机上能做什么

不管它的清单怎么写,一个插件:

  • 只看得到它自己的目录,看不到服务器的数据,也看不到媒体文件;
  • 没有直接的网络访问:有 network 权限的插件,也只能经过服务器、用 GET 和 HEAD 访问它声明过的主机;
  • 不能启动子进程,除非它声明了 subprocess;
  • 受上面那些资源限制的约束;如果主机允许,还会以一个单独的用户运行。

它的界面只能出现在清单声明的插槽里:首页的一个栏目或顶部的大图区域、媒体库或详情页的一个侧边面板、 播放器上的一层叠加内容、外观设置、导航侧栏的底部,或者管理菜单里的一个条目(点开是插件自己的页面)。 插件永远不能在登录、初始设置、安全相关的页面或现有的管理页面里绘制任何东西。在它的框架里, 它无法访问页面、您的 Cookie 或您的会话:它从服务器读取的内容,都要经过一个短时有效的令牌, 这个令牌只限于它可以申请的两种权限(public:媒体标题和海报的安全视图;prefs:当前用户在它自己命名空间里的偏好设置)。

插件可以申请的权限列在权限与插槽里。沙箱怎样工作,以及它仍然无法防止什么, 见插件沙箱与威胁模型。

服务器检查插件连接的目标,而不检查它发送的内容

一旦某个主机出现在插件的列表里,服务器就无法检查插件发给它的内容。安装第三方插件之前, 请像对待任何软件一样先审查它,并把它的主机列表看作可能收到您媒体库标题的各方的名单。

主题

主题是一个 kind: theme 的安装包,没有进程:一个样式表,还可以带一个在隐藏框架中受限运行的脚本。 它也是通过同一个安装插件对话框安装的;样式表在安装时会被清理。之后,每个用户在设置 → 外观 → 主题里选择它。 主题可以包含什么,见主题。

编写插件

页面 内容
编写插件 一步一步做出第一个插件,安装调试循环、签名、发布。从这里开始。
插件 API 参考 清单、后端调用和数据存储、界面的 evey.* 桥接接口。
权限与插槽 清单可以声明什么,安装时检查什么,访问外部的规则,各个插槽。
主题 用 CSS 和一个沙箱里的脚本重新设计界面的样式。
Webhook 与 API 密钥 不写插件,也能把 Evey 和其他工具集成起来。