Skip to content

policy: admit host:port entries in network.hosts (fixes #214) - #230

Open
kkkkikun wants to merge 1 commit into
OctoSense-org:mainfrom
kkkkikun:fix/host-port-entries
Open

kkkkikun wants to merge 1 commit into
OctoSense-org:mainfrom
kkkkikun:fix/host-port-entries

Conversation

@kkkkikun

@kkkkikun kkkkikun commented Oct 14, 2026 •

Copy link
Copy Markdown

What

准入层(app-contract 的 check_host)此前拒绝 network.hosts 中带端口的条目(host may not name a port),而运行时门本就支持「裸 host 匹配任意端口、host:port 只匹配该端口」。两者错位:listing 声明的粒度 ≠ 实际放行范围,商店也无法表达端口约束。

本 PR 让准入接受 host:port 形态,端口须为纯数字且落在 1..=65535。裸 host 语义不变。

Why not 收紧运行时

三选一里(issue 内已列),放行端口与现有运行时行为一致、对存量 app 零破坏,且让「最小授权」可用:app 可以声明「仅某端口」。收紧运行时(裸 host 仅 443/80)会破坏所有把条目写在非标端口的存量场景(如本地调试服务)。

验证锚点(逐字可对)

  • 基点 commit:386359153ed6377b5f047bd9ed2767a6a2ac2bc7(main,分支由此出发)。
  • 准入拒绝原文(基点 policy.rs:324-325):
    if host.contains(':') {
        return Err(format!("host {host:?} may not name a port"));
    }
    
  • 运行时门(pin 内 makepad-widgets 的 splash_policy.rs url_allowed;本仓 pin:makepad d653bc4493619ab979ccff165cf48c0c63b77d19、Octoscript-Makepad 6cf2d90aa33ff4ae603f49c7557f3ecf986207f0):
    // A listed `host` matches any port; a listed `host:port` matches
    // only that port, which is how a host lists its own asset origin.
    let host = url_host(url);
    let host_port = url_host_port(url);
    policy.hosts.iter().any(|h| Some(h) == host.as_ref() || Some(h) == host_port.as_ref())
    
  • issue 里的逐字报错(复现声明 127.0.0.1:8195):host "127.0.0.1:8195" may not name a port。

Tested

  • 新增 network_hosts_may_name_one_explicit_port(growth.rs):接受 api.weather.example:8443、裸 host 不变;逐一拒绝空端口/非数字/0/65536/无主机名/多冒号/带路径/通配符(8 例)。
  • cargo test -p octosense-app-contract 全绿(61 项)。
  • 测试输出逐字:test network_hosts_may_name_one_explicit_port ... ok / test result: ok. 61 passed; 0 failed(全套)。

Docs

PUBLISHING 双语「Network hosts」一节同步为「可显式带一个端口;裸 host 匹配任意端口、带端口只匹配该端口」。


发现于 GOSIM Agentic App 黑客松 2026 参赛作品(qianxian-guardian)开发——为 script app 声明本地服务端口时触发。

…#214)

准入层(app-contract check_host)此前拒绝带端口条目,而运行时门
(splash_policy.rs url_allowed)本就支持「裸 host 匹配任意端口、
host:port 只匹配该端口」——两者错位使 listing 声明的粒度与实际放行
范围不一致,商店也无法表达端口约束。

本 PR 让准入接受 host:port 形态:端口须为纯数字且落在 1..=65535;
空端口/非数字/超界/无主机名/多冒号/带路径/通配符逐一拒绝(新增
growth.rs 测试覆盖)。裸 host 行为不变。PUBLISHING 双语档同步。

Tested: cargo test -p octosense-app-contract 全绿(61 项,含新增
network_hosts_may_name_one_explicit_port 九例)。

Found while building a GOSIM hackathon script app that needed to declare
one local service port.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant