"""#215(feat-arch-converge)接口对齐层,CHV 本地实现。 背景:#215 未合并,本基线里没有 cloud/timeouts.py、 cloud/gates.py、cloud/quota.py、cloud/sandbox_policy.py。 本模块绝不复制 #215 的文件,只把 CHV 真正能映射的 接口写成与 #215 相同的签名,#215 合并后替换为 import 即是机械的(见 docs/chv-architecture.md ADR-8)。 映射表(逐个核对过 #215 远程分支的真实函数,不是凭空编的): - gates.resolve_inside(base, rel):目录门,CHV 快照/磁盘 路径白名单正好需要它——本模块实现同语义并已在 hardening.validate_snapshot_url 里使用,#215 合并后 改为 from cloud.gates import resolve_inside 即可。 - sandbox_policy.tmpfs_isolated(executor_kind, path):CHV 客机 /tmp 落在客机磁盘上,不是宿主 tmpfs,故对 cloud-hypervisor 一律返回 (False, ...)——fail-closed, 绝不宣称隔离。未知执行器同样 fail-closed。 - timeouts.resolve_module_timeout / quota.decide:无映射。 前者是审批/队列超时(None=不过期、0=不过期),CHV 的 api/ready 超时是秒数且 0 无效,语义不同,硬套会 改行为;后者是按月美元配额,CHV 的配额是 VM 数/磁盘 GB/快照数,单位不同。两者在本模块里 deliberately 不提供,测试钉住“CHV 不 import 它们”。 本模块只依赖标准库,是叶子模块,不 import cloud.sandbox。 """ import os def resolve_inside(base, rel): """目录门:base 内的相对路径安全解析,越界回 None。 空串回 base 本身;绝对路径、.. 逃逸、符号链接逃逸、 commonpath 跨盘符 ValueError 一律 None。签名与 #215 的 gates.resolve_inside 一致,合并后可直接替换为 import。""" if not rel: return base if os.path.isabs(rel): return None real_base = os.path.realpath(base) target = os.path.realpath(os.path.join(real_base, rel)) try: if os.path.commonpath([real_base, target]) != real_base: return None except ValueError: return None return target def tmpfs_isolated(executor_kind, path): """某执行器下某路径是否走 tmpfs 隔离:(isolated, reason)。 cloud-hypervisor:客机 /tmp 落在客机磁盘上,不走宿主 tmpfs,一律 (False, ...);未知执行器 fail-closed 同样 False。签名与 #215 的 sandbox_policy.tmpfs_isolated 一致。""" if executor_kind == "cloud-hypervisor": return False, "CHV 客机 /tmp 落在客机磁盘上,不走宿主 tmpfs" return False, "未知执行器,按不隔离处理(fail-closed 口径)"