60 lines
2.6 KiB
Python
60 lines
2.6 KiB
Python
"""#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 口径)"
|