Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/i18n.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ jobs:
cache: npm
- run: npm ci
- run: node scripts/prepare-production.mjs
- run: npm run typecheck && npm run typecheck:client && npm run test:i18n
- run: npm run typecheck && npm run typecheck:client && npm run test:i18n && npm run test:permissions && npm run test:git
- run: npm run build
- run: I18N_CHECK_BUILD=1 npm run test:i18n
25 changes: 25 additions & 0 deletions GIT_EDITING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# 使用 Git 编辑文档

登录 Wiki,在一篇文档的“更多 → Git 提交”中获取仓库地址并生成 Git 专用令牌。每篇文档对应一个 HTTPS Git 仓库,只有 `main` 分支与 `page.md` 文件。用户名可任意填写,密码使用令牌;不要把令牌写入仓库或远程 URL。令牌只显示一次,30 天后失效,可随时撤销或更换。

```sh
git clone https://www.nodeloc.wiki/git/pages/<文档ID>.git
cd <文档ID>
# 编辑 page.md
git add page.md
git commit -m "补充安装步骤"
git pull --rebase
git push origin main
```

服务器同时检查 `git:push`、`wiki:edit`、文档 ACL、私有文档访问权限、封禁状态和最新版本。只有密码认证的 Git 写入才会跳过浏览器 Turnstile;同样的编辑内容仍经过 Wiki 编辑器的校验、审批规则与缓存更新。需要审批的提交可在网页处理;Git 不会提前更新分支。

远端只接受当前 `main` 的线性快进提交。所有用户,包括最高管理员,都不能通过 Git 覆盖历史、删除或创建分支、写入标签、上传符号链接或提交合并节点。过期的基准会被拒绝,请先 pull/rebase。Git 协议不传递客户端的 `--force` 标志,因此服务器禁止的是它所尝试的非快进覆盖;即使带上 `--force` 也不能改写远端历史。

网页修订在 Git 访问时追加为提交,Git 原始提交及其 SHA 在仓库中保留。一次包含多个 Git 提交的推送生成一条 Wiki 修订,摘要带上最终提交 SHA,Wiki 作者始终为认证的账号。Git 的 author/email 是用户提供的信息,不代表已验证身份。

第一版限制每次推送最多 40 个提交、200 个 pack 对象、4 MiB 压缩数据,`page.md` 最大 512 KiB;服务端会进一步检查膨胀后的对象与 delta 大小。首次接入导入最多 20 条可见修订,每次读取最多 100 条提交及 8 MiB 正文,较旧历史成为 shallow 边界。只支持标准 HTTPS smart HTTP,暂不支持 SSH、客户端指定 depth、其他文件或批量新建文档。

私有页面要求相应权限,删除的页面停止提供仓库。隐藏、永久清除或已物理删除的修订会截断下载的历史,Git 对象不能通过公共媒体接口读取。已经下载到用户电脑上的内容无法远程撤回。

开发验证:`npm run test:git` 使用真实 Git CLI 验证 clone、push、网页修改后的 pull、拒绝 force/delete、权限撤销、私有访问与隐藏修订边界。
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,11 @@ Markdown 页面、分类、重定向、模板引用、修订历史、Diff、回
## 开源与来源

VireoWiki 当前版本采用 [Mozilla Public License 2.0](LICENSE)(MPL-2.0);所引入 CloudWiki 代码的原始 [MIT 许可证与版权声明](LICENSE-UPSTREAM) 单独保存。此前已发布版本所授予的权利不受此次调整影响。原作者的说明保存在 [UPSTREAM_README.md](UPSTREAM_README.md)。VireoWiki 的改动包括 NodeLoc OAuth 提供方、独立项目配置与构建修复。尚未在真实 NodeLoc 账号和 Cloudflare 资源上完成端到端部署验证。

## 权限组、站点协议与 Git 编辑

最高管理员可在后台“权限组”分别配置普通用户、讨论管理员、管理员的创建、编辑、删除、恢复、移动、回退、隐藏修订、媒体及 Git 提交权限。各组独立保存,撤销普通用户权限不会改变其他组。最高管理员、后台访问资格及永久删除权限保持固定。

后台“服务条款与隐私政策”提供两份可编辑的 Markdown 初始模板,发布后作为普通 Wiki 文档保留修订历史。页脚入口为 `/terms`、`/privacy`,使用站点配置中的协议文档地址;请按本站实际服务修改模板。

文档的“更多 → Git 提交”支持使用标准 Git 客户端提交 `page.md`,详见 [Git 编辑说明](GIT_EDITING.md)。网页与 Git 共用 Wiki 权限和编辑校验,服务器拒绝所有非快进覆盖及分支删除。
16 changes: 16 additions & 0 deletions migrations/schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -664,3 +664,19 @@ CREATE TABLE IF NOT EXISTS mcp_api_keys (
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_mcp_api_keys_expires ON mcp_api_keys(expires_at);

CREATE TABLE IF NOT EXISTS permission_groups (id INTEGER PRIMARY KEY CHECK (id = 1), permissions TEXT NOT NULL, version INTEGER NOT NULL DEFAULT 0, updated_by INTEGER, updated_at INTEGER);

-- Git smart HTTP credentials and append-only page repository references.
CREATE TABLE IF NOT EXISTS git_tokens (
user_id INTEGER PRIMARY KEY, token_hash TEXT NOT NULL UNIQUE,
masked_token TEXT NOT NULL, expires_at INTEGER NOT NULL, created_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS git_page_heads (
page_id INTEGER PRIMARY KEY, head TEXT, version INTEGER NOT NULL DEFAULT 0,
lease TEXT, lease_until INTEGER NOT NULL DEFAULT 0
);
CREATE TABLE IF NOT EXISTS git_commit_links (
page_id INTEGER NOT NULL, oid TEXT NOT NULL, revision_id INTEGER, user_id INTEGER,
PRIMARY KEY(page_id, oid)
);
Loading
Loading