const RELAY_HOST: &str = "wireup.net";
const REQUIRED_ROUTES: &[(&str, &str)] = &[
("GET", "/healthz"),
("POST", "/v1/slot/allocate"),
("POST", "/v1/events/abc123"),
("GET", "/v1/events/abc123"),
("GET", "/v1/events/abc123/stream"), ("GET", "/v1/slot/abc123/state"),
("POST", "/v1/slot/abc123/responder-health"),
("POST", "/v1/pair"),
("POST", "/v1/pair/abandon"),
("GET", "/v1/pair/pid123"),
("POST", "/v1/pair/pid123/bootstrap"),
("POST", "/v1/handle/claim"),
("DELETE", "/v1/handle/claim/somenick"), ("POST", "/v1/handle/intro/somenick"),
("GET", "/.well-known/agent-card.json"),
("GET", "/.well-known/wire/agent"),
("POST", "/v1/invite/register"), ("GET", "/i/tok123?format=url"), ];
struct Allow {
host: String,
method: String,
path: String,
}
fn parse_policy_allows(script: &str) -> Vec<Allow> {
let mut out = Vec::new();
for line in script.lines() {
let line = line.trim();
let Some(rest) = line.strip_prefix("--add-allow '") else {
continue;
};
let Some(rule) = rest
.strip_suffix("' \\")
.or_else(|| rest.strip_suffix('\''))
else {
continue;
};
let parts: Vec<&str> = rule.splitn(4, ':').collect();
if parts.len() != 4 {
continue;
}
out.push(Allow {
host: parts[0].to_string(),
method: parts[2].to_string(),
path: parts[3].to_string(),
});
}
out
}
fn glob_matches(pattern: &str, path: &str) -> bool {
fn rec(p: &[u8], s: &[u8]) -> bool {
match p.first() {
None => s.is_empty(),
Some(b'*') => {
let mut i = 0;
loop {
if rec(&p[1..], &s[i..]) {
return true;
}
if i < s.len() && s[i] != b'/' {
i += 1;
} else {
return false;
}
}
}
Some(&c) => !s.is_empty() && s[0] == c && rec(&p[1..], &s[1..]),
}
}
rec(pattern.as_bytes(), path.as_bytes())
}
#[test]
fn openshell_policy_covers_every_client_route() {
let script = include_str!("../landing/openshell-policy.sh");
let allows = parse_policy_allows(script);
assert!(
allows
.iter()
.any(|a| a.host == RELAY_HOST && a.method == "GET" && a.path == "/healthz"),
"parser found no `{RELAY_HOST}:GET:/healthz` allow — parse_policy_allows likely broke"
);
let mut uncovered = Vec::new();
for (method, path) in REQUIRED_ROUTES {
let covered = allows
.iter()
.any(|a| a.host == RELAY_HOST && a.method == *method && glob_matches(&a.path, path));
if !covered {
uncovered.push(format!("{method} {path}"));
}
}
assert!(
uncovered.is_empty(),
"openshell-policy.sh is missing allow rules for relay routes the client calls:\n {}\n\
Add the matching `--add-allow '{RELAY_HOST}:443:METHOD:/path'` line(s) to the wire_runtime rule.",
uncovered.join("\n ")
);
}
#[test]
fn glob_matcher_sanity() {
assert!(glob_matches("/v1/handle/claim/*", "/v1/handle/claim/bob"));
assert!(glob_matches("/v1/slot/*/state", "/v1/slot/abc/state"));
assert!(glob_matches("/healthz", "/healthz"));
assert!(glob_matches("abc*", "abc"));
assert!(!glob_matches("/v1/events/*", "/v1/events/abc/stream"));
assert!(!glob_matches("/v1/pair/*", "/v1/pair/pid123/bootstrap"));
assert!(!glob_matches("/v1/handle/claim/*", "/v1/handle/claim"));
assert!(!glob_matches("/healthz", "/healthzz"));
assert!(glob_matches("", ""));
assert!(!glob_matches("", "x"));
assert!(glob_matches("/*", "/healthz"));
}