diff --git a/crates/openshell-supervisor-network/src/l7/mod.rs b/crates/openshell-supervisor-network/src/l7/mod.rs index f054695a4..d26523258 100644 --- a/crates/openshell-supervisor-network/src/l7/mod.rs +++ b/crates/openshell-supervisor-network/src/l7/mod.rs @@ -962,6 +962,11 @@ pub fn validate_l7_policies(data_json: &serde_json::Value) -> (Vec, Vec< }; for (i, ep) in endpoints.iter().enumerate() { + let loc = format!("{name}.endpoints[{i}]"); + if !ep.is_object() { + errors.push(format!("{loc}: endpoint entry must be an object")); + continue; + } let protocol = ep.get("protocol").and_then(|v| v.as_str()).unwrap_or(""); let l7_protocol = L7Protocol::parse(protocol); let jsonrpc_family = l7_protocol.is_some_and(L7Protocol::is_jsonrpc_family); @@ -986,9 +991,13 @@ pub fn validate_l7_policies(data_json: &serde_json::Value) -> (Vec, Vec< .into_iter() .collect() }, - |arr| arr.iter().filter_map(serde_json::Value::as_u64).collect(), + |arr| { + arr.iter() + .filter_map(serde_json::Value::as_u64) + .filter(|p| *p > 0) + .collect() + }, ); - let loc = format!("{name}.endpoints[{i}]"); if protocol == "mcp" { if host.trim().is_empty() { @@ -1557,7 +1566,13 @@ pub fn expand_access_presets(data: &mut serde_json::Value) -> Vec { && !has_rules && mcp_allow_all_known_mcp_methods { - ep.as_object_mut().unwrap().insert( + let Some(obj) = ep.as_object_mut() else { + warnings.push(format!( + "{name}.endpoints[{i}]: endpoint entry is not an object; skipping access preset expansion" + )); + continue; + }; + obj.insert( "rules".to_string(), serde_json::Value::Array(vec![jsonrpc_rule_json("*")]), ); @@ -1582,9 +1597,13 @@ pub fn expand_access_presets(data: &mut serde_json::Value) -> Vec { continue; }; - ep.as_object_mut() - .unwrap() - .insert("rules".to_string(), serde_json::Value::Array(rules)); + if let Some(obj) = ep.as_object_mut() { + obj.insert("rules".to_string(), serde_json::Value::Array(rules)); + } else { + warnings.push(format!( + "{name}.endpoints[{i}]: endpoint entry is not an object; skipping access preset expansion" + )); + } } } diff --git a/crates/openshell-supervisor-network/src/policy_local.rs b/crates/openshell-supervisor-network/src/policy_local.rs index e915c18c9..1b260c49e 100644 --- a/crates/openshell-supervisor-network/src/policy_local.rs +++ b/crates/openshell-supervisor-network/src/policy_local.rs @@ -1104,6 +1104,7 @@ fn network_endpoint_from_json( } let mut ports = endpoint.ports; + ports.retain(|p| *p > 0); if ports.is_empty() && endpoint.port > 0 { ports.push(endpoint.port); }