From 174146fb7a6559a28676e29f1167e62529f071c7 Mon Sep 17 00:00:00 2001 From: Flik Date: Mon, 29 Dec 2025 23:33:16 +0800 Subject: [PATCH] 1 --- README.md | 266 +++++++++++++++++++++++++++-- icons/file-manager.svg | 5 + plugins/file-manager/manifest.json | 3 +- store.json | 4 +- 4 files changed, 261 insertions(+), 17 deletions(-) create mode 100644 icons/file-manager.svg diff --git a/README.md b/README.md index 476288c..a3bdca5 100644 --- a/README.md +++ b/README.md @@ -2,24 +2,260 @@ GoTunnel 官方插件仓库,所有插件均经过官方签名验证。 -## 目录结构 +## 安装插件 -``` -plugins/ - ├── file-manager/ # 文件管理器插件 - │ ├── plugin.js # 插件源码 - │ ├── plugin.js.sig # 签名文件(CI自动生成) - │ └── manifest.json # 插件元数据 - └── ... -``` +### 方式一:Web 控制台 + +1. 打开 GoTunnel Web 控制台 +2. 进入「扩展商店」标签页 +3. 浏览可用插件,点击「安装」 +4. 选择目标客户端完成安装 + +### 方式二:客户端管理页面 + +1. 进入客户端详情页 +2. 点击「从商店安装」按钮 +3. 选择插件直接安装 + +--- + +## 可用插件 + +| 插件 | 版本 | 类型 | 说明 | +|------|------|------|------| +| [file-manager](plugins/file-manager/) | 1.0.0 | app | 文件管理器,远程浏览和管理文件 | + +--- ## 插件开发 -1. 在 `plugins/` 下创建插件目录 -2. 编写 `plugin.js` 和 `manifest.json` -3. 提交 PR,CI 会自动验证格式 -4. 合并后 CI 自动签名并发布 +### 目录结构 -## 签名验证 +``` +gotunnel-plugins/ +├── icons/ # 插件图标目录 +│ └── your-plugin.svg # SVG 格式图标 +├── plugins/ +│ └── your-plugin/ +│ ├── plugin.js # 插件源码 (必须) +│ ├── plugin.js.sig # 签名文件 (CI 自动生成) +│ └── manifest.json # 插件元数据 (必须) +└── store.json # 插件商店索引 +``` -所有插件由 GoTunnel 官方私钥签名,客户端内置公钥验证。 +### manifest.json 格式 + +```json +{ + "name": "your-plugin", + "version": "1.0.0", + "type": "app", + "description": "插件描述", + "author": "Your Name", + "icon": "icons/your-plugin.svg", + "homepage": "https://github.com/...", + "config_schema": [ + { + "key": "port", + "label": "端口", + "type": "number", + "default": "8080" + } + ] +} +``` + +### plugin.js 基本结构 + +```javascript +// 定义插件元数据 +function metadata() { + return { + name: "your-plugin", + version: "1.0.0", + type: "app", + description: "插件描述", + author: "Your Name" + }; +} + +// 插件启动 +function start() { + log("Plugin started"); +} + +// 处理连接 (必须实现) +function handleConn(conn) { + // 处理逻辑 + conn.Close(); +} + +// 插件停止 +function stop() { + log("Plugin stopped"); +} +``` + +--- + +## API 参考 + +### 基础 API + +| 函数 | 说明 | 示例 | +|------|------|------| +| `log(msg)` | 输出日志 | `log("Hello")` | +| `config(key)` | 获取配置 | `config("port")` | + +### 连接 API (conn) + +| 方法 | 说明 | 返回值 | +|------|------|--------| +| `conn.Read(size)` | 读取数据 | `[]byte` 或 `null` | +| `conn.Write(data)` | 写入数据 | 写入字节数 | +| `conn.Close()` | 关闭连接 | - | + +### 文件系统 API (fs) + +| 方法 | 说明 | +|------|------| +| `fs.readFile(path)` | 读取文件 → `{data, error}` | +| `fs.writeFile(path, content)` | 写入文件 → `{ok, error}` | +| `fs.readDir(path)` | 读取目录 → `{entries, error}` | +| `fs.stat(path)` | 文件信息 → `{name, size, isDir, modTime, error}` | +| `fs.exists(path)` | 是否存在 → `{exists, error}` | +| `fs.mkdir(path)` | 创建目录 → `{ok, error}` | +| `fs.remove(path)` | 删除文件 → `{ok, error}` | + +### HTTP API (http) + +| 方法 | 说明 | +|------|------| +| `http.serve(conn, handler)` | 处理 HTTP 请求 | +| `http.json(data)` | 对象转 JSON 字符串 | +| `http.sendFile(conn, path)` | 发送文件响应 | + +**HTTP Handler 示例:** + +```javascript +function handleConn(conn) { + http.serve(conn, function(req) { + // req: {method, path, body} + return { + status: 200, + contentType: "application/json", + body: http.json({message: "OK"}) + }; + }); +} +``` + +--- + +## 示例插件 + +### Echo 服务 + +```javascript +function metadata() { + return { name: "echo", version: "1.0.0", type: "app" }; +} + +function handleConn(conn) { + var data = conn.Read(4096); + if (data) conn.Write(data); + conn.Close(); +} +``` + +### HTTP API 服务 + +```javascript +function metadata() { + return { name: "api", version: "1.0.0", type: "app" }; +} + +function handleConn(conn) { + http.serve(conn, function(req) { + if (req.path === "/health") { + return { status: 200, body: '{"status":"ok"}' }; + } + return { status: 404, body: '{"error":"not found"}' }; + }); +} +``` + +--- + +## 提交插件 + +### 步骤 + +1. Fork 本仓库 +2. 在 `plugins/` 下创建插件目录 +3. 添加 `plugin.js` 和 `manifest.json` +4. 更新 `store.json` 添加插件信息 +5. 提交 Pull Request + +### store.json 格式 + +```json +[ + { + "name": "your-plugin", + "version": "1.0.0", + "type": "app", + "description": "插件描述", + "author": "Your Name", + "icon": "icons/your-plugin.svg", + "download_url": "https://raw.githubusercontent.com/.../plugin.js" + } +] +``` + +### 图标规范 + +- **格式**: SVG (推荐) 或 PNG +- **尺寸**: 24x24 或 48x48 +- **位置**: `icons/` 目录下 +- **命名**: 与插件名称一致,如 `your-plugin.svg` + +**SVG 图标示例:** + +```xml + + + +``` + +### CI 自动化 + +- PR 提交后自动验证插件格式 +- 合并后自动签名并更新 `store.json` + +--- + +## 签名机制 + +所有插件必须经过官方签名才能在 GoTunnel 中运行。 + +- 签名算法:Ed25519 +- 公钥内置于 GoTunnel 客户端 +- 签名文件:`plugin.js.sig` + +--- + +## 沙箱限制 + +| 限制项 | 默认值 | +|--------|--------| +| 最大读取文件 | 10 MB | +| 最大写入文件 | 10 MB | +| 文件访问路径 | 插件数据目录 | + +--- + +## 许可证 + +MIT License diff --git a/icons/file-manager.svg b/icons/file-manager.svg new file mode 100644 index 0000000..6389a9e --- /dev/null +++ b/icons/file-manager.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/plugins/file-manager/manifest.json b/plugins/file-manager/manifest.json index 49b0753..1a8ecfd 100644 --- a/plugins/file-manager/manifest.json +++ b/plugins/file-manager/manifest.json @@ -4,5 +4,6 @@ "description": "文件管理器插件,提供远程文件浏览和管理功能", "author": "GoTunnel Official", "run_at": "client", - "type": "app" + "type": "app", + "icon": "icons/file-manager.svg" } diff --git a/store.json b/store.json index 92967ca..d03ef97 100644 --- a/store.json +++ b/store.json @@ -4,6 +4,8 @@ "version": "1.0.0", "type": "app", "description": "文件管理器插件,提供远程文件浏览和管理功能", - "author": "GoTunnel Official" + "author": "GoTunnel Official", + "icon": "icons/file-manager.svg", + "download_url": "https://git.92coco.cn:8443/flik/gotunnel-plugins/raw/branch/main/plugins/file-manager/plugin.js" } ]