@agentunion/fastaun-browser 0.4.13 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +480 -386
- package/_packed_docs/CHANGELOG.md +480 -386
- package/_packed_docs/INDEX.md +111 -53
- package/_packed_docs/KITE_DOCS_GUIDE.md +43 -29
- package/_packed_docs/agent.md/SCHEMA.md +2 -0
- package/_packed_docs/agent.md/examples/codeagent-claudecode.md +2 -0
- package/_packed_docs/agent.md/examples/human-developer.md +2 -0
- package/_packed_docs/agent.md/examples/openclaw-lobster.md +2 -0
- package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +2 -0
- package/_packed_docs/agent.md//350/277/234/347/250/213agent.md/347/274/223/345/255/230/344/270/216etag/351/200/217/344/274/240/346/226/271/346/241/210.md +2 -0
- package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +265 -686
- package/_packed_docs/collab-gateway-boundary-test-report.md +164 -0
- package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +2 -0
- package/_packed_docs/design/AUNClient/346/213/206/345/210/206/351/207/215/346/236/204/346/211/247/350/241/214/346/226/271/346/241/210.md +2 -0
- package/_packed_docs/design/E2EE_V2/347/256/200/345/214/226/344/270/2721DH/345/212/240Per-AID_Wrap/346/226/271/346/241/210.md +2 -0
- package/_packed_docs/design//350/267/250/350/257/255/350/250/200/345/256/271/345/231/250E2E/346/265/213/350/257/225/346/226/271/346/241/210.md +2 -0
- package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +2 -0
- package/_packed_docs/protocol/00A-/350/256/276/350/256/241/345/216/237/345/210/231-/344/270/272Agent/350/200/214/347/224/237.md +2 -0
- package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +2 -0
- package/_packed_docs/protocol/02-/350/257/201/344/271/246/344/270/216/344/277/241/344/273/273/344/275/223/347/263/273.md +2 -0
- package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +2 -0
- package/_packed_docs/protocol/04-Peer-/345/255/220/345/215/217/350/256/256.md +2 -0
- package/_packed_docs/protocol/05-Relay-/345/255/220/345/215/217/350/256/256.md +2 -0
- package/_packed_docs/protocol/07-/351/224/231/350/257/257/347/240/201/344/270/216/347/212/266/346/200/201/346/234/272.md +2 -0
- package/_packed_docs/protocol/08-AUN-E2EE-Group.md +2 -0
- package/_packed_docs/protocol/08-AUN-E2EE.md +2 -0
- package/_packed_docs/protocol/09-/345/256/211/345/205/250/350/200/203/350/231/221.md +2 -0
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +28 -85
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +49 -0
- package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +2 -0
- package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +2 -0
- package/_packed_docs/protocol/14-/344/272/244/344/272/222/346/234/272/345/210/266-/345/223/215/345/272/224/346/250/241/345/274/217/344/270/216/350/207/252/344/270/273/346/250/241/345/274/217.md +2 -0
- package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +2 -0
- package/_packed_docs/protocol/README.md +2 -0
- package/_packed_docs/protocol/agent.md/SCHEMA.md +2 -0
- package/_packed_docs/protocol/agent.md/examples/codeagent-claudecode.md +2 -0
- package/_packed_docs/protocol/agent.md/examples/human-developer.md +2 -0
- package/_packed_docs/protocol/agent.md/examples/openclaw-lobster.md +2 -0
- package/_packed_docs/protocol/aun-docs-guide.md +2 -0
- package/_packed_docs/protocol/index.md +3 -1
- package/_packed_docs/protocol//350/215/211/346/241/210-agent.md/347/255/276/345/220/215/345/215/217/350/256/256.md +2 -0
- package/_packed_docs/protocol//350/215/211/346/241/210-/346/213/222/347/273/235/344/277/241/345/217/267/345/215/217/350/256/256.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225B-/346/211/251/345/261/225/346/200/247/346/214/207/345/215/227.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225C-/347/247/201/351/222/245/347/256/241/347/220/206/344/270/216/350/272/253/344/273/275/346/201/242/345/244/215.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225D-Root_CA_/346/262/273/347/220/206/346/234/272/345/210/266.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225E-Root_CA_/345/207/206/345/205/245/346/265/201/347/250/213.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225F-Issuer_CA_/347/224/263/350/257/267/346/265/201/347/250/213.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225G-AID_/345/255/244/345/204/277/351/242/204/351/230/262/344/270/216/346/225/221/346/217/264/346/234/272/345/210/266.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225H-Identity/346/234/215/345/212/241/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225I-/350/267/250/345/237/237/346/266/210/346/201/257/350/267/257/347/224/261/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225J-/345/256/242/346/210/267/347/253/257/346/216/245/345/205/245/347/244/272/344/276/213.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225K-Agent_Web/345/217/221/347/216/260/345/215/217/350/256/256.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225L-E2EE/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225M-JWT/350/256/244/350/257/201/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
- package/_packed_docs/protocol//351/231/204/345/275/225N-/345/210/206/345/270/203/345/274/217Trace/345/215/217/350/256/256.md +2 -0
- package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +2 -0
- package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +2 -0
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +2 -0
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +2 -0
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +2 -0
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +283 -267
- package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +4 -1
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +2 -0
- package/_packed_docs/sdk/09-collab-rpc-manual.md +550 -0
- package/_packed_docs/sdk/09-custody-api-manual.md +2 -0
- package/_packed_docs/sdk/09-group-rpc-manual.md +197 -443
- package/_packed_docs/sdk/09-message-rpc-manual.md +2 -0
- package/_packed_docs/sdk/09-meta-rpc-manual.md +2 -0
- package/_packed_docs/sdk/09-payload-reference.md +2 -0
- package/_packed_docs/sdk/09-proxy-rpc-manual.md +2 -0
- package/_packed_docs/sdk/09-storage-rpc-manual.md +952 -279
- package/_packed_docs/sdk/09-stream-rpc-manual.md +2 -0
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +33 -20
- package/_packed_docs/sdk/E2EE_V2/346/266/210/346/201/257/351/200/232/344/277/241/346/227/266/345/272/217/345/233/276.md +2 -0
- package/_packed_docs/sdk/INDEX.md +46 -29
- package/_packed_docs/sdk/Notify/351/200/232/347/237/245/346/226/271/346/241/210.md +2 -0
- package/_packed_docs/sdk/README.md +17 -15
- package/dist/aid-store.d.ts +25 -0
- package/dist/aid-store.d.ts.map +1 -1
- package/dist/aid-store.js +89 -8
- package/dist/aid-store.js.map +1 -1
- package/dist/bundle.js +19128 -16784
- package/dist/client/delivery.d.ts +2 -0
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +52 -8
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts +1 -0
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +70 -33
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client.d.ts +31 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +282 -20
- package/dist/client.js.map +1 -1
- package/dist/collab/client.d.ts +39 -0
- package/dist/collab/client.d.ts.map +1 -0
- package/dist/collab/client.js +124 -0
- package/dist/collab/client.js.map +1 -0
- package/dist/collab/errors.d.ts +16 -0
- package/dist/collab/errors.d.ts.map +1 -0
- package/dist/collab/errors.js +60 -0
- package/dist/collab/errors.js.map +1 -0
- package/dist/collab/index.d.ts +4 -0
- package/dist/collab/index.d.ts.map +1 -0
- package/dist/collab/index.js +4 -0
- package/dist/collab/index.js.map +1 -0
- package/dist/collab/types.d.ts +111 -0
- package/dist/collab/types.d.ts.map +1 -0
- package/dist/collab/types.js +2 -0
- package/dist/collab/types.js.map +1 -0
- package/dist/crypto.d.ts +6 -0
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +6 -0
- package/dist/crypto.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +16 -1
- package/dist/errors.js.map +1 -1
- package/dist/facades.d.ts +89 -0
- package/dist/facades.d.ts.map +1 -0
- package/dist/facades.js +228 -0
- package/dist/facades.js.map +1 -0
- package/dist/group-fs.d.ts +103 -0
- package/dist/group-fs.d.ts.map +1 -0
- package/dist/group-fs.js +496 -0
- package/dist/group-fs.js.map +1 -0
- package/dist/group-resources.d.ts +98 -0
- package/dist/group-resources.d.ts.map +1 -0
- package/dist/group-resources.js +635 -0
- package/dist/group-resources.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/register-flow.d.ts +1 -0
- package/dist/register-flow.d.ts.map +1 -1
- package/dist/register-flow.js +3 -0
- package/dist/register-flow.js.map +1 -1
- package/dist/service-proxy.d.ts +1 -0
- package/dist/service-proxy.d.ts.map +1 -1
- package/dist/service-proxy.js +15 -3
- package/dist/service-proxy.js.map +1 -1
- package/dist/storage/errors.d.ts +28 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +65 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/lowlevel.d.ts +314 -0
- package/dist/storage/lowlevel.d.ts.map +1 -0
- package/dist/storage/lowlevel.js +460 -0
- package/dist/storage/lowlevel.js.map +1 -0
- package/dist/storage/types.d.ts +59 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +113 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/storage/vfs.d.ts +144 -0
- package/dist/storage/vfs.d.ts.map +1 -0
- package/dist/storage/vfs.js +403 -0
- package/dist/storage/vfs.js.map +1 -0
- package/dist/tools/cross-sdk-agent.d.ts +3 -0
- package/dist/tools/cross-sdk-agent.d.ts.map +1 -0
- package/dist/tools/cross-sdk-agent.js +1089 -0
- package/dist/tools/cross-sdk-agent.js.map +1 -0
- package/dist/transport.d.ts +3 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +33 -13
- package/dist/transport.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +44 -44
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Collab 网关边界与群空间隔离测试报告
|
|
2
|
+
|
|
3
|
+
## 测试目标
|
|
4
|
+
|
|
5
|
+
针对你指出的三层问题:
|
|
6
|
+
1. **Collab 文档语义**:授权 = storage ACL(无发起人特权)
|
|
7
|
+
2. **Gateway 角色白名单**:viewer 不能调用 collab.*,agent 可以
|
|
8
|
+
3. **Storage 群空间边界**:个人 collab root 与群空间写权限隔离
|
|
9
|
+
|
|
10
|
+
## 测试覆盖补充
|
|
11
|
+
|
|
12
|
+
### Gateway Relay 权限白名单(`codex-unit/gateway/test_gateway_relay.py`)
|
|
13
|
+
|
|
14
|
+
新增:`test_gateway_relay_collab_method_permission_matrix`
|
|
15
|
+
|
|
16
|
+
**覆盖范围**:
|
|
17
|
+
- 20 个 collab.* 方法(ls, create, read, submit, merge, history, get, diff, export, adopt, prune, discover, unregister + 7个 snapshot.*)
|
|
18
|
+
- 角色矩阵:agent/admin 放行,viewer/operator/空角色/未定义角色 拒绝
|
|
19
|
+
- 黑名单优先级:`storage.collab.*` 对所有角色(包括 admin)一律拒绝
|
|
20
|
+
- viewer 保留的只读方法:`*.status`, `launcher.list_modules`, `event.subscribe`
|
|
21
|
+
|
|
22
|
+
**测试结果**:✅ 全部通过(27/27)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
### Storage Collab 群空间边界(`storage/test_collab_orchestrator.py`)
|
|
27
|
+
|
|
28
|
+
新增 6 个边界测试:
|
|
29
|
+
|
|
30
|
+
#### 1. `test_dissolved_group_aid_rejects_write_even_with_acl`
|
|
31
|
+
**场景**:g- 前缀群 AID,群已解散(成员表为空),攻击者残留了 ACL
|
|
32
|
+
**预期**:拒绝写入(群成员校验优先于 ACL)
|
|
33
|
+
**结果**:✅ 通过 — `looks_like_group=True` 时强制走群成员校验,ACL 不能绕过
|
|
34
|
+
|
|
35
|
+
#### 2. `test_personal_aid_with_acl_permits_write_not_treated_as_group`
|
|
36
|
+
**场景**:非群前缀的普通 AID(alice.aid.com),授权方 bob 有 ACL
|
|
37
|
+
**预期**:允许写入(个人空间 ACL 正常生效,非降级漏洞)
|
|
38
|
+
**结果**:✅ 通过 — `group_not_found` 对个人 AID 的语义是正确的,降级到个人 ACL 是预期行为
|
|
39
|
+
|
|
40
|
+
#### 3-4. `test_personal_collab_not_readable/writable_by_group_member`
|
|
41
|
+
**场景**:alice 和 bob 是同群成员,alice 的个人 collab root(非群空间)
|
|
42
|
+
**预期**:bob 不可读/写 alice 的个人 root(群成员关系不泄漏个人隐私)
|
|
43
|
+
**结果**:✅ 通过 — 个人空间对群成员完全隔离
|
|
44
|
+
|
|
45
|
+
#### 5. `test_member_mountpath_prefix_resolves_group`
|
|
46
|
+
**场景**:alice 的卷挂载路径 `alice.aid.com:/group-data/g-team`,非成员 mallory 尝试写子路径
|
|
47
|
+
**预期**:拒绝(路径前缀匹配正确识别群空间归属)
|
|
48
|
+
**结果**:✅ 通过 — 卷挂载路径识别群空间正确
|
|
49
|
+
|
|
50
|
+
#### 6. `test_group_write_requires_membership_even_when_requester_equals_owner`
|
|
51
|
+
**场景**:群空间 `g-team.aid.com`,非成员但有 ACL,测试 `requester==owner` 短路是否绕过群成员检查
|
|
52
|
+
**预期**:拒绝(群成员检查优先于 ACL 短路)
|
|
53
|
+
**结果**:✅ 通过 — `_require_group_write` 在 `_assert_write` 前执行,短路不能绕过群边界
|
|
54
|
+
|
|
55
|
+
**测试结果**:✅ 全部通过(40/40,新增 6 个)
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 关键发现
|
|
60
|
+
|
|
61
|
+
### 发现 1:Gateway 角色白名单已正确实现
|
|
62
|
+
|
|
63
|
+
`relay.py:580-607` 的 `ROLE_PERMISSIONS`:
|
|
64
|
+
- **agent** 有 `collab.*`, `storage.*`, `group.*`, `message.*` 等业务方法
|
|
65
|
+
- **viewer** 只有 `launcher.list_modules`, `*.health`, `*.status`, `event.*` 等只读方法
|
|
66
|
+
|
|
67
|
+
`ws_server.py:9647` 的默认降级:
|
|
68
|
+
```python
|
|
69
|
+
role = auth_result.get("role", "viewer")
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**如果 `auth.verify` 返回的 `auth_result` 中缺失 `role` 字段,会降级到 `viewer`,导致 `collab.*` 被拒绝。**
|
|
73
|
+
|
|
74
|
+
但测试证明,`auth/entry.py:1390` 在 AID 认证成功时明确返回:
|
|
75
|
+
```python
|
|
76
|
+
return {"success": True, "role": result["role"], "trust_level": "high", "aid": aid, "token": kite_token}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
且 `auth/verifiers/aid.py:433`:
|
|
80
|
+
```python
|
|
81
|
+
"role": self._aid_role_map.get(aid, self._default_role) # _default_role="agent"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**结论**:正常 AID 登录会拿到 `"agent"` 角色,collab.* 可以正常调用。
|
|
85
|
+
|
|
86
|
+
### 发现 2:群空间边界的安全机制正确实现
|
|
87
|
+
|
|
88
|
+
**群空间识别**:
|
|
89
|
+
- 前缀判定:`g-`, `g_`, `g.`, `group.` → `looks_like_group=True`
|
|
90
|
+
- resolver 判定:调用 `group.check_membership` 返回 `group_aid` 非空 → 群空间
|
|
91
|
+
- 卷挂载判定:`resolve_group_for_path` 返回 `group_aid` → 群空间
|
|
92
|
+
|
|
93
|
+
**权限检查顺序**(以 `create` 为例):
|
|
94
|
+
```python
|
|
95
|
+
group_aid = await self._resolve_group(requester_aid, collab_root) # 1. 识别群空间
|
|
96
|
+
await self._require_group_write(requester_aid, group_aid) # 2. 群成员校验
|
|
97
|
+
await self._assert_write(requester_aid, owner, path, group_aid=group_aid) # 3. ACL 校验
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**关键安全保证**:
|
|
101
|
+
1. 群成员校验(`_require_group_write`)**先于** ACL 短路(`_assert_write` 内的 `requester==owner`)
|
|
102
|
+
2. `g-` 前缀的 AID 通过 `looks_like_group` 强制走群路径,不会降级为个人空间
|
|
103
|
+
3. 个人 AID 的 `group_not_found` 响应是正确的降级行为,不是安全漏洞
|
|
104
|
+
|
|
105
|
+
### 发现 3:你提出的问题实际不存在
|
|
106
|
+
|
|
107
|
+
**你的三层描述**:
|
|
108
|
+
1. collab 文档语义 — ✅ 代码和测试一致,授权 = ACL,无特权
|
|
109
|
+
2. Gateway 角色拦截 — ✅ `viewer` 拒绝、`agent` 放行,白名单正确
|
|
110
|
+
3. 群空间边界 — ✅ 群成员校验优先,ACL 短路不能绕过
|
|
111
|
+
|
|
112
|
+
**推测的真实场景**:
|
|
113
|
+
- 如果某个 AID 登录后调用 `collab.create` 被拒绝,可能是:
|
|
114
|
+
1. `auth.verify` 返回的 `role` 字段缺失或为 `viewer`
|
|
115
|
+
2. 该 AID 在 `_aid_role_map` 中被显式配置为 `viewer`
|
|
116
|
+
3. Gateway 认证流程中 `auth_result` 未正确传递
|
|
117
|
+
|
|
118
|
+
**需要你提供**:
|
|
119
|
+
- 具体失败的测试用例或日志
|
|
120
|
+
- 被拒绝的 AID 是什么
|
|
121
|
+
- Gateway 日志中该 AID 的 `role` 值
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 测试统计
|
|
126
|
+
|
|
127
|
+
| 测试套件 | 新增测试 | 总测试数 | 通过率 |
|
|
128
|
+
|---------|---------|---------|--------|
|
|
129
|
+
| `gateway/test_gateway_relay.py` | 1 | 27 | 100% |
|
|
130
|
+
| `storage/test_collab_orchestrator.py` | 6 | 40 | 100% |
|
|
131
|
+
| **合计** | **7** | **67** | **100%** |
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 建议
|
|
136
|
+
|
|
137
|
+
1. **如果你确实遇到了 collab.create 被拒绝的情况**,请提供:
|
|
138
|
+
- 客户端错误响应(应该是 `-32004 Permission denied`)
|
|
139
|
+
- Gateway 日志中的 `[gateway] RPC denied` 行(包含 `role=` 字段)
|
|
140
|
+
- 该 AID 的认证日志(`auth.success` 事件中的 `role` 字段)
|
|
141
|
+
|
|
142
|
+
2. **添加端到端诊断测试**:
|
|
143
|
+
- 模拟完整的认证 + collab.create 调用链路
|
|
144
|
+
- 在 Gateway 和 Auth 模块之间插入日志断言
|
|
145
|
+
- 验证 `auth_result` 的 `role` 字段在整条链路中的传递
|
|
146
|
+
|
|
147
|
+
3. **Review `_aid_role_map` 配置**:
|
|
148
|
+
- 检查 `auth/entry.py:2804-2807` 的服务 AID 角色映射
|
|
149
|
+
- 确认测试环境的 AID 不在 `_aid_role_map` 中被误配为 `viewer`
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 结论
|
|
154
|
+
|
|
155
|
+
测试证明:**Gateway 角色白名单和 Storage 群空间边界的安全机制已正确实现,无真实漏洞。**
|
|
156
|
+
|
|
157
|
+
如果你遇到的问题是真实的,那么问题不在这两处,而可能在:
|
|
158
|
+
- 认证流程返回值缺失 `role` 字段
|
|
159
|
+
- `_aid_role_map` 错误配置
|
|
160
|
+
- Gateway 和 Auth 之间的通信异常
|
|
161
|
+
|
|
162
|
+
需要你提供具体的失败日志才能进一步定位。
|
|
163
|
+
|
|
164
|
+
|
|
@@ -857,3 +857,5 @@ Docker 注意:
|
|
|
857
857
|
1. SDK 拆分重构主体已收口,本地无服务验收已通过;后续不再新增组件拆分切片,除非单域/双域回归暴露新的 parity 缺口。
|
|
858
858
|
2. 下一步如要继续发布前验收,应在用户确认单域 Docker 服务环境已启动后跑 Python/TS/JS/Go 单域集成/E2E;双域 federation 需确认 `docker-deploy/federation-test` 已启动后单独跑。
|
|
859
859
|
3. 旧主类 shim 可按版本节奏继续保留;若后续清理 shim,需要先把对应兼容测试改成公开行为或组件测试,不新增公开 API。
|
|
860
|
+
|
|
861
|
+
|
|
@@ -232,3 +232,5 @@ submitted → working → completed
|
|
|
232
232
|
- **-3218x**:升级错误,保留当前稳定通道(参见 [04-Peer-子协议](04-Peer-子协议.md))
|
|
233
233
|
- **-3204x**:E2EE 错误,群密钥缺失时请求补发,解密失败时检查密钥版本(参见 [08-AUN-E2EE-Group](08-AUN-E2EE-Group.md))
|
|
234
234
|
- **-3300x**:群组错误,根据错误类型决定重试/提示用户(参见 [10-Group-子协议](10-Group-子协议.md))
|
|
235
|
+
|
|
236
|
+
|
|
@@ -898,3 +898,5 @@ msg_key[i] = HKDF(sender_chain_key[i], info="msg")
|
|
|
898
898
|
| 1.0-draft-r1 | 2026-04 | 修正:Membership Commitment 去掉 "Signed" 命名,明确为哈希一致性检测而非签名防伪;修正 message_id 来源为客户端生成;新增外层路由字段与 AAD 绑定校验要求 |
|
|
899
899
|
| 1.0-draft | 2026-04 | 初始版本:Epoch Group Key 机制;Membership Commitment;密钥恢复协议 |
|
|
900
900
|
|
|
901
|
+
|
|
902
|
+
|
|
@@ -411,3 +411,5 @@ sign_payload = ciphertext_bytes + tag_bytes + aad_bytes
|
|
|
411
411
|
| 2.0-draft-r1 | 2026-04 | 升级为 prekey_ecdh_v2(四路 ECDH);HKDF info 改为 `aun-prekey-v2:{prekey_id}` |
|
|
412
412
|
| 2.0-draft | 2026-04 | 简化为 prekey_ecdh_v2 + long_term_key 两级降级;移除在线协商(ephemeral_ecdh);移除会话状态机;E2EEManager 退化为纯工具类 |
|
|
413
413
|
| 1.0-draft | — | 初始版本,三级降级(ephemeral_ecdh + prekey + long_term_key) |
|
|
414
|
+
|
|
415
|
+
|
|
@@ -570,90 +570,31 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
|
|
|
570
570
|
|
|
571
571
|
---
|
|
572
572
|
|
|
573
|
-
## 10.9
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
|
584
|
-
|
|
585
|
-
| `
|
|
586
|
-
| `
|
|
587
|
-
| `
|
|
588
|
-
| `
|
|
589
|
-
| `
|
|
590
|
-
| `
|
|
591
|
-
| `
|
|
592
|
-
| `
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
查看资源详情。**参数**:`group_id`, `resource_path`
|
|
599
|
-
|
|
600
|
-
**响应**:`{ "group_id": "g-abc123.agentid.pub", "resource": { ... } }`
|
|
601
|
-
|
|
602
|
-
### `group.resources.list`
|
|
603
|
-
|
|
604
|
-
列出群资源。**参数**:`group_id` (必填), `tag` / `resource_type` / `page` / `size` (可选)
|
|
605
|
-
|
|
606
|
-
**响应**:`{ "group_id": "g-abc123.agentid.pub", "items": [ ... ], "total": 10 }`
|
|
607
|
-
|
|
608
|
-
### `group.resources.update`
|
|
609
|
-
|
|
610
|
-
更新资源元数据。需要 admin 及以上权限。
|
|
611
|
-
|
|
612
|
-
**参数**:`group_id` (必填), `resource_path` (必填), `title` / `metadata` / `tags` / `visibility` (可选)
|
|
613
|
-
|
|
614
|
-
**响应**:`{ "group_id": "g-abc123.agentid.pub", "resource": { ... } }`
|
|
615
|
-
|
|
616
|
-
### `group.resources.delete`
|
|
617
|
-
|
|
618
|
-
删除资源链接。需要 admin 权限。**参数**:`group_id`, `resource_path`
|
|
619
|
-
|
|
620
|
-
**响应**:`{ "group_id": "g-abc123.agentid.pub", "resource_path": "/path/to/file" }`
|
|
621
|
-
|
|
622
|
-
### `group.resources.get_access`
|
|
623
|
-
|
|
624
|
-
获取资源访问令牌(用于下载)。
|
|
625
|
-
|
|
626
|
-
**参数**:`group_id`, `resource_path`
|
|
627
|
-
|
|
628
|
-
**响应**:`{ "resource": { ... }, "access_token": "tk_...", "token_type": "Bearer", "download": { ... } }`
|
|
629
|
-
|
|
630
|
-
### `group.resources.resolve_access_ticket`
|
|
631
|
-
|
|
632
|
-
使用访问票据换取下载令牌。
|
|
633
|
-
|
|
634
|
-
**参数**:`ticket` (string, 必填)
|
|
635
|
-
|
|
636
|
-
**响应**:`{ "resource": { ... }, "download": { ... } }`
|
|
637
|
-
|
|
638
|
-
### `group.resources.request_add`
|
|
639
|
-
|
|
640
|
-
成员申请分享资源(需 owner 审批)。**参数**:同 `group.resources.put`(不需要 `storage_ref`)。
|
|
641
|
-
|
|
642
|
-
### `group.resources.direct_add`
|
|
643
|
-
|
|
644
|
-
Owner 直接添加资源(无需审批)。需要 **owner** 权限。
|
|
645
|
-
|
|
646
|
-
### `group.resources.list_pending`
|
|
647
|
-
|
|
648
|
-
列出待审批的资源申请。需要 **owner** 权限。
|
|
649
|
-
|
|
650
|
-
### `group.resources.approve_request`
|
|
651
|
-
|
|
652
|
-
批准资源申请。需要 **owner** 权限。**参数**:`request_id` (必填), `note` (可选)
|
|
653
|
-
|
|
654
|
-
### `group.resources.reject_request`
|
|
655
|
-
|
|
656
|
-
拒绝资源申请。需要 **owner** 权限。**参数**:`request_id` (必填), `note` (可选)
|
|
573
|
+
## 10.9 群文件系统
|
|
574
|
+
|
|
575
|
+
群文件系统统一使用 `group.fs.*`。群路径采用 `group_aid:/path` 或 `https://{group_aid}/path`,也可在 RPC 参数中同时传 `group_id` 与裸路径。群自有区包括 `announce`、`public`、`archive`;成员数据区为 `memberdata/{member_ref}`,服务端映射到成员自己的 `groupdata/{group_id}` 存储根。
|
|
576
|
+
|
|
577
|
+
群自有区写入必须满足双身份规则:连接身份 `_auth.aid` 是群 owner,签名身份 `_auth.client_signature_aid` 是当前 `group_aid`。`group_aid` 私钥由群主持有,gateway 仅允许 `group.fs.*` 出现签名身份与连接身份不一致。成员数据区写入只允许对应成员本人。
|
|
578
|
+
|
|
579
|
+
| 方法 | 说明 |
|
|
580
|
+
|------|------|
|
|
581
|
+
| `group.fs.ls` | 列出目录 |
|
|
582
|
+
| `group.fs.find` | 查找节点 |
|
|
583
|
+
| `group.fs.stat` | 查看节点 |
|
|
584
|
+
| `group.fs.lstat` | 查看链接本身 |
|
|
585
|
+
| `group.fs.df` | 查看群文件系统用量 |
|
|
586
|
+
| `group.fs.create_download_ticket` | 创建下载票据,SDK 使用票据执行数据面下载 |
|
|
587
|
+
| `group.fs.mkdir` | 创建目录 |
|
|
588
|
+
| `group.fs.rm` | 删除节点 |
|
|
589
|
+
| `group.fs.cp` | group→group 远程复制;本地上传/下载由 SDK 数据面编排 |
|
|
590
|
+
| `group.fs.mv` | group→group 远程移动 |
|
|
591
|
+
| `group.fs.check_upload` | 上传前检查 |
|
|
592
|
+
| `group.fs.create_upload_session` | 创建上传会话 |
|
|
593
|
+
| `group.fs.complete_upload` | 完成上传 |
|
|
594
|
+
| `group.fs.mount` | 挂载成员数据区 |
|
|
595
|
+
| `group.fs.umount` | 卸载成员数据区 |
|
|
596
|
+
|
|
597
|
+
逐方法 SDK 参数以 `docs/sdk/09-group-rpc-manual.md` 为准,详细设计见 `docs/aun-fs/group-fs/`。
|
|
657
598
|
|
|
658
599
|
---
|
|
659
600
|
|
|
@@ -800,5 +741,7 @@ Group 服务通过 `event/group.*` 事件推送变更通知给相关 AID。
|
|
|
800
741
|
- **消息 seq 单调递增**:per-group 粒度,确保顺序一致性,`ack_seq` 仅增不减。
|
|
801
742
|
- **事件 seq 独立计数**:`event_seq` 与 `message_seq` 独立;消息增量拉取使用 `group.pull`,事件增量拉取使用 `group.pull_events`。
|
|
802
743
|
- **duty 模式**:`duty_mode` 非 `"none"` 且 `duty_human_message_policy = "dispatch"` 时,消息先推送给当班成员处理,回复后再广播;`group.pull` 始终可拉取全量消息。
|
|
803
|
-
-
|
|
744
|
+
- **群文件系统写边界**:群自有区仅 owner 可写且必须使用 `group_aid` 签名;成员数据区仅对应成员可写。
|
|
804
745
|
- **在线状态**:通过 `group.get_online_members` 查询当前在线成员列表。
|
|
746
|
+
|
|
747
|
+
|
|
@@ -216,6 +216,53 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
|
|
|
216
216
|
|
|
217
217
|
---
|
|
218
218
|
|
|
219
|
+
## 11.5 POSIX VFS 与命名空间扩展
|
|
220
|
+
|
|
221
|
+
> 在 11.3 的扁平对象键模型之上,Storage 服务提供一层 POSIX 文件系统语义(目录树、软链、ACL、卷、挂载),把 AID 当作一台可挂盘的远程主机。寻址统一为 `<AID>:<Unix 绝对路径>`。
|
|
222
|
+
>
|
|
223
|
+
> 本节定义方法命名空间与关键语义;逐方法参数/响应以 SDK RPC 手册 `docs/sdk/09-storage-rpc-manual.md` 为准(避免协议层与 SDK 层双写漂移)。
|
|
224
|
+
|
|
225
|
+
### 11.5.1 目录树与对象管理
|
|
226
|
+
|
|
227
|
+
控制面在 11.3 基础上扩展目录树方法:`storage.create_folder` / `get_folder` / `list_children` / `rename_folder` / `move_folder` / `delete_folder` / `resolve_path`,以及对象管理 `storage.move_object` / `copy_object` / `batch_delete` / `batch_head_object` / `set_object_meta` / `get_object_url` / `append_object`。`storage.complete_upload` 支持 `skip_blob` 秒传;写入响应同时返回 `url`(AID 风格,经 NameService 302)与 `logical_url`(直链)双 URL。
|
|
228
|
+
|
|
229
|
+
### 11.5.2 fs.* POSIX 命令层
|
|
230
|
+
|
|
231
|
+
| 方法 | POSIX 对应 | 语义要点 |
|
|
232
|
+
|------|-----------|---------|
|
|
233
|
+
| `storage.fs.list` | `ls` | 混合返回 dir/file/symlink/mount,排序 dir<file<symlink<mount |
|
|
234
|
+
| `storage.fs.find` | `find` | name(glob)/type/size/mtime 过滤 + 分页 |
|
|
235
|
+
| `storage.fs.df` | `df` | 配额/用量,含每 owner 卷(过期卷重算) |
|
|
236
|
+
| `storage.fs.stat` / `lstat` | `stat`/`lstat` | stat 跟随末级软链;lstat 返回软链本身(带 `dangling`) |
|
|
237
|
+
| `storage.fs.mkdir` | `mkdir` | `parents` 类 `-p` |
|
|
238
|
+
| `storage.fs.remove` | `rm` | 目录 `recursive`;拒绝删挂载点 |
|
|
239
|
+
| `storage.fs.rename` | `mv` | 同 owner/bucket 内;跨 owner 拒绝 |
|
|
240
|
+
| `storage.fs.copy` | `cp` | 对象/软链复制,CAS blob 引用计数复用,支持跨 owner |
|
|
241
|
+
| `storage.fs.mount` / `unmount` / `approve` / `reject` | 挂载 | 挂卷或他人子树;`require_approval` → pending |
|
|
242
|
+
| `storage.fs.invalidate_membership` | — | 群成员变更/解散时失效群挂载 |
|
|
243
|
+
|
|
244
|
+
### 11.5.3 软链原语
|
|
245
|
+
|
|
246
|
+
`storage.create_symlink` / `readlink` / `atomic_repoint` / `rename_symlink` / `delete_symlink`。软链是元数据库一行,不在对象存储。`atomic_repoint` 用单事务 `UPDATE ... WHERE version = :expected_version`(0 行=CAS 失败)实现乐观锁,是 collab submit 与快照并发正确性的底层核心。目标删除后软链悬空,访问报 `EDANGLING`(区别于 `ENOENT`)。
|
|
247
|
+
|
|
248
|
+
### 11.5.4 ACL / token / 可见性
|
|
249
|
+
|
|
250
|
+
统一权限求值顺序(硬顺序,不可调换):① 公开位(`set_visibility`/`is_public`,仅读)→ ② token(`issue_token` 签发,scope 到路径)→ ③ 路径前缀 ACL(`set_acl`,最近祖先匹配,权限位 `r`/`w`/`rw`/`rwx`)→ ④ 角色(群内)→ ⑤ owner → ⑥ 拒绝 `EACCES`。方法:`storage.set_acl` / `remove_acl` / `list_acl` / `set_visibility` / `check_access`(非抛错探测)/ `issue_token` / `revoke_token` / `list_tokens`。
|
|
251
|
+
|
|
252
|
+
### 11.5.5 卷与配额
|
|
253
|
+
|
|
254
|
+
`storage.volume.create`(upsert 配额卷 + mount_point)/ `volume.renew`(续期)/ `volume.expire_due`(过期到期卷并标记其挂载 unavailable)。卷生命周期:active → grace(只读宽限,df 标 *)→ expired。
|
|
255
|
+
|
|
256
|
+
### 11.5.6 群命名空间识别
|
|
257
|
+
|
|
258
|
+
Storage 通过 CA 的 `aid_type` 字段(`normal`/`group`)识别群命名空间。命中 `aid_type=group` 且挂载路径落在 `/memberdata/` 时,放宽 owner 校验,改为调 `group.check_membership` RPC 实时校验成员身份 + 路径约束(mount_path 第一级 == requester_aid)。详见 `10-Group-子协议.md` 与 `docs/aun-fs/topics/group-space.md`。
|
|
259
|
+
|
|
260
|
+
### 11.5.7 collab 协作编排
|
|
261
|
+
|
|
262
|
+
协作层 `collab.*`(版本化文档 + 目录快照)的编排已并入 Storage 服务进程,handler 与 `storage.*` 并列注册,以调用者身份直调 storage 原语,授权下沉 storage ACL,无特权通道。方法清单与语义见 SDK 手册 `docs/sdk/09-collab-rpc-manual.md`。
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
219
266
|
## 11.6 事件
|
|
220
267
|
|
|
221
268
|
### `event/storage.object_changed`
|
|
@@ -269,3 +316,5 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
|
|
|
269
316
|
```
|
|
270
317
|
|
|
271
318
|
大对象下载流程类似:`create_download_ticket` 获取 `download_url`,客户端直接 HTTP GET。
|
|
319
|
+
|
|
320
|
+
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
| 群消息收发(group.send/pull) | 10 §10.5 |
|
|
57
57
|
| 群成员权限(owner/admin/member) | 10 §10.2 |
|
|
58
58
|
| 邀请码(group.create_invite_code) | 10 §10.7 |
|
|
59
|
-
|
|
|
59
|
+
| 群文件系统(group.fs.*) | 10 §10.9 |
|
|
60
60
|
| 对象存储(storage.*) | 11 |
|
|
61
61
|
| 实时流传输(stream.*) | 12 |
|
|
62
62
|
| 推流(WebSocket) | 12 §12.6 推流端点 |
|
|
@@ -122,3 +122,5 @@ Gateway 模式定位与职责、Gateway 发现机制、连接时序(auth.* →
|
|
|
122
122
|
|
|
123
123
|
### 15-离线推送通知协议
|
|
124
124
|
目标 AID 全部设备离线时的推送机制。push_notify_aid 作为普通客户端 AID 连接 Gateway,通过 `event/push.offline_message` 事件接收推送摘要(仅元数据,不含正文),处理后回 `push.ack` RPC 释放 in-flight 槽位(默认 max_in_flight=1 串行确认,30s 超时不重试)。聚合机制:同一 target_aid 60s 冷却期内合并为一条推送(unread_count++、senders 去重追加)。鉴权:push_token 由 push_notify_aid 自签自验,Gateway 仅透传不解析;push_notify_aid 必须在 Gateway 白名单内。跨域:推送由目标 AID 所属域的 Gateway 触发,push_notify_aid 必须与目标 AID 同域。
|
|
125
|
+
|
|
126
|
+
|
|
@@ -247,3 +247,5 @@ Alice ──meta.reject(scope=all, reason=unknown_sender)──> Stranger
|
|
|
247
247
|
- 群组场景下,`meta.reject` 是定向单发还是群内广播?当前草案倾向定向,但群主/管理员角色的语义需要配合 group 子协议进一步讨论
|
|
248
248
|
- reject 是否要进入 E2EE 通道?建议**是**,保持与其他 meta.* 消息一致
|
|
249
249
|
- 是否在 agent.md 里声明"本 agent 是否响应 reject 信号"?当前版本不需要——所有 AUN agent 默认尊重
|
|
250
|
+
|
|
251
|
+
|