跳到主要内容

ARC 2.0.0-beta.28

用户、临时与 space 视图

session 收到受约束的 AFS 视图:自己的用户数据、session 本地临时数据,以及可选的调用者 space 视图。

SessionUserAFS 把调用者专用与临时 provider 叠在共享的 per-instance 世界上。它故意不是一个包含所有用户数据的目录。

构造在运行时是单点的(buildSessionView / daemon join 路径)。不要发明第二条构造路径去挂载另一个调用者的 /user

视图合同

视图当前已测行为
/user解析到当前已认证调用者的 user provider。没有该 provider 时,/user 不存在;写入被拒绝。
/tmp解析到为当前 session 创建的 provider。每个已 join 的 session 都有。
/space可选。当运行时为 scope:user 启用时,已认证调用者可在此看到自己的整个 DID Space 根。匿名调用者不会得到替代的 /space

根叠加是一等的:可通过 list("/") 枚举,可 stat,并按各叠加策略路由读/写/删/exec。

隔离(测试钉住的部分)

Daemon 测试钉住了 todo 风格路径上的双用户隔离:

  • 调用者 A 与 B 各自写入并读回自己的 /user/app/x
  • 试图经 /blocklets/<name>/users/<other-did>/… 等 host 布局,或 /user 下的穿越变体访问另一用户的路径,会在该 session 中被拒绝。
  • 隔离是结构性的,因为 session 只为已解析调用者挂载单数 /user

这是 session 视图边界,不是「每个 Blocklet 的任意路径都有同一 ACL」的承诺。

写入与 base 数据门控

落到共享 base 的网络源写入与删除会被拒绝。针对允许叠加(例如当前调用者的 /user provider)的写入,由该叠加的策略评估。内部代码与网络请求不是可互换上下文。

/space 特别说明:

  • 在当前 user-scope daemon 覆盖中,投影为 readonly 时,/space 下的一般写入会被拒绝。
  • 当运行时接入固定 write-guard 时,可仅在 blocklets/<app>/user/collections/** 以及规范 provenance sibling blocklets/<app>/user/.provenance/collections/** 下允许写入。在这些根之外,不要假定可写。
  • 需要 collections 写通道的消费者应检查已发布的 collections + provenance 能力标记,而不是只凭路径形状推断。

不要

  • /user 别名、隐藏组件或客户端路由当作访问控制机制。
  • 在 session 内枚举其他用户的数据并称之为受支持 API。
  • ~/.afs/spaces 或隔离 --root-path 下的物理存储,与 session 路径 /user/space 当成同一件事。CLI 检查看到的是逻辑 space 片段;session 视图是另一种组合。

证据

主张证据
/user/tmp/space 叠加设计packages/aos/src/session/session-user-afs.ts
双用户 /user 隔离runtimes/node/test/daemon/two-user-space-isolation.test.ts
scope:user/space 叠加(自己的根、跨调用者拒绝)runtimes/node/test/daemon/scope-user-space-overlay.test.ts
网络 base 写入门控packages/aos/test/session/session-user-afs-base-write-gate.test.ts
/space collections 写守卫策略packages/aos/src/session/space-write-gate.ts

继续阅读 检查本地空间,用离线 CLI 检查同一逻辑片段,但不要把 CLI 当成 session。