跳转到内容

发布和安全

终端窗口
yonto-plugin bundle

生成可发布的文件 dist/<id>-<version>.js 和对应的 zip 包 dist/<id>-<version>.zip,并打印 zip 的大小和 SHA-256。 zip 里只有一个条目,就是压缩后的同一个文件。

把 zip 放在任何支持 HTTPS 下载的地方,比如 GitHub 的 release。 观众在设置、插件、从网址安装里安装它。

某个版本一旦公开,就不要再替换它地址上的文件。 仓库用 SHA-256 锁定每个插件,同一个地址上的文件一变就会被拒绝,这是应有的行为。 要修复插件,就提高 version,重新打包,发布到新的地址。

仓库是一个列出许多插件的地址,观众可以一次全部添加。 把插件放进同一个目录,每个插件一个文件夹,然后运行:

终端窗口
yonto-plugin index plugins --base-url https://plugins.example.com > index.json

它会打包每个插件并写出索引,每个插件一条记录,地址是 <base-url>/<id>/<id>-<version>.zip#sha256=…。 把 zip 上传到索引里写的地址,再把 index.json 放到你打算告诉观众的那个地址上。

然后像观众的杨桃那样,从外部检查你发布的内容:

终端窗口
yonto-plugin index --check https://plugins.example.com/index.json

它会下载索引和索引里的每个插件,逐个核对 SHA-256、清单和上面的各项规则。 它会报告所有问题,不会只报第一个。

观众在设置、仓库、添加仓库里添加这个仓库。

安装对话框会显示插件的名称、版本和它能访问的范围,这些信息都来自清单。 所以清单就是插件的承诺,观众同意的就是这份承诺。

  • 访问的主机越少越好,并且写确切的主机名。 通配符一旦覆盖了你用不到的主机,就等于要观众多信任一些。
  • 声明了 hostsFromConfig 的插件,会多问观众一个问题,观众答复之前杨桃不会运行它。 只有读取观众自己提供的地址的插件,才有理由用它。
  • 绝不要把观众的密钥、令牌或输入的文字发给观众没有选定的主机。
  • 插件自己永远不能访问内网地址,比如 localhost、192.168.x.x 或 *.local。 只有观众在 url 字段里输入的地址例外。 面向观众家里服务器的插件就是这样工作的,它的 allowedHosts 因此是空的。

插件是代码,运行在沙盒里,没有文件、套接字和定时器,所以对外的唯一出口是 yonto.fetch。 观众仍然应该只从信任的地址安装插件。 而你写插件时,要保证没读过代码的人用了也不会受到伤害。

  1. lint 和 doctor --replay 都通过。
  2. contractVersion 是 lint 要求的版本,不多不少。
  3. allowedHosts 尽可能小。
  4. 抛出的每个 reason 都用一句话说明是哪一部分出了问题,日志里没有网址、密钥或搜索词。
  5. doctor.json 和 fixtures/ 里没有密钥,也没有 cookie。
  6. version 是新的。