diff --git a/CHANGELOG.md b/CHANGELOG.md index af4c778..1d582fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,51 @@ ## Unreleased +## v2.0.0 — 2026-08-21 + +Enterprise network lockdown for Chorus: keep the relay off the open internet with CIDR allowlists, private bind, and VPN/VPC deployment docs. + +GitHub tag `v2.0.0` is the source of truth for this release. `@chorus/plugin` remains install-from-git (packages are private). Rebuild `chorus-relay` from this tag — older binaries ignore the new flags. + +### Network access restrictions + +- **CIDR / IP allowlist** on `chorus-relay` (`--allow-cidr` / `relay.allowedCidrs` / `CHORUS_ALLOWED_CIDRS`) — peers outside the list get HTTP 403 before auth on `/ws`, `/host`, and `/status` +- **Explicit deny CIDRs** (`--deny-cidr` / `relay.deniedCidrs` / `CHORUS_DENIED_CIDRS`) — deny wins over allow +- **Source-port allowlist** (`--allow-port` / `relay.allowedPorts` / `CHORUS_ALLOWED_PORTS`) — for single-machine e2e and tight lockdowns (`bun run test:network-e2e`) +- **Bind policy** — `relay.bind` / `CHORUS_BIND`; `relay.allowOpenBind: false` refuses `0.0.0.0` / `::` +- Loopback IPs remain admitted by default when an allow-CIDR list is set (`allowLoopback`); source-port rules still apply +- `/status` reports `{ network: { allowlist, denylist, allowedPorts, restricted } }` +- Docs: [docs/NETWORK.md](docs/NETWORK.md) (corporate VPN, Tailscale, AWS VPC, Azure VNet, GCP VPC) + +### Config & env (new) + +| Control | Default | Notes | +|---|---|---| +| `relay.bind` / `CHORUS_BIND` | `0.0.0.0` | Listen address | +| `relay.allowedCidrs` / `CHORUS_ALLOWED_CIDRS` | `[]` | Empty = unrestricted | +| `relay.deniedCidrs` / `CHORUS_DENIED_CIDRS` | `[]` | Deny wins over allow | +| `relay.allowedPorts` / `CHORUS_ALLOWED_PORTS` | `[]` | Peer source-port allowlist | +| `relay.allowOpenBind` / `CHORUS_ALLOW_OPEN_BIND` | `true` | Set `false` for enterprise MDM | +| `relay.allowLoopback` / `CHORUS_ALLOW_LOOPBACK` | `true` | Admit loopback IP when allowlisted | + +### Upgrade notes + +- Defaults are unchanged: LAN shares without an allowlist behave like v1.0.0. +- Hosts must run a `chorus-relay` built from this release (or later) for allowlist/bind flags to take effect. +- If `allowOpenBind` is `false` and `bind` is still open (`0.0.0.0` / `::`), `/chorus-share` fails with a clear error — set a private `bind` address. + +Example enterprise floor: + +```json +{ + "relay": { + "allowOpenBind": false, + "bind": "10.0.12.4", + "allowedCidrs": ["10.0.0.0/8", "100.64.0.0/10"] + } +} +``` + ## v1.0.0 — 2026-08-20 First stable release of Chorus: **OpenCode↔OpenCode pair programming on one live AI session**. The host shares a session; collaborators join over a LAN WebSocket relay and send prompts into the same LLM turn. Side-channel chat stays in toasts; the shared transcript is mirrored into each joiner’s OpenCode session. diff --git a/Cargo.lock b/Cargo.lock index e14f344..6926b20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -157,12 +157,14 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chorus-relay" -version = "0.2.0" +version = "2.0.0" dependencies = [ "axum", "clap", "futures-util", "hex", + "http", + "ipnet", "rand 0.8.7", "serde", "serde_json", @@ -566,6 +568,12 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "ipnet" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" + [[package]] name = "is_terminal_polyfill" version = "1.70.2" diff --git a/README.md b/README.md index 9a5ec27..528572c 100644 --- a/README.md +++ b/README.md @@ -135,11 +135,15 @@ Copy [chorus.example.json](./chorus.example.json) to get started. Example enterp "repoRemoteRewrites": [{ "from": "github.acme.com", "to": "github.com" }], "defaultRole": "edit", "tokenTtlMs": 86400000 + }, + "relay": { + "allowOpenBind": false, + "allowedCidrs": ["10.0.0.0/8", "100.64.0.0/10"] } } ``` -These knobs are pairing controls, not a complete enterprise ACL: email and git remote are **self-asserted** on join, and later config layers (user/project) can still override `/etc/chorus/config.json`. See [docs/ENTERPRISE.md](docs/ENTERPRISE.md) for the gaps a security review will hit. +These knobs are pairing controls, not a complete enterprise ACL: email and git remote are **self-asserted** on join, and later config layers (user/project) can still override `/etc/chorus/config.json`. See [docs/ENTERPRISE.md](docs/ENTERPRISE.md) for the gaps a security review will hit. For VPN / AWS VPC / Azure VNet / GCP VPC patterns, see [docs/NETWORK.md](docs/NETWORK.md). | Field | Default | Description | |---|---|---| @@ -153,6 +157,12 @@ These knobs are pairing controls, not a complete enterprise ACL: email and git r | `security.defaultRole` | `edit` | Role when `/chorus-share` omits role | | `security.tokenTtlMs` | — | Optional join-token TTL | | `relay.port` / `relay.publicHost` | — | Relay listen / advertised join host | +| `relay.bind` | `0.0.0.0` | Listen address (`CHORUS_BIND`) | +| `relay.allowedCidrs` | `[]` | CIDR/IP allowlist; empty = unrestricted | +| `relay.deniedCidrs` | `[]` | Explicit deny CIDRs (deny wins) | +| `relay.allowedPorts` | `[]` | Peer source-port allowlist (single-machine e2e) | +| `relay.allowOpenBind` | `true` | If `false`, refuse bind to `0.0.0.0` / `::` | +| `relay.allowLoopback` | `true` | Admit loopback IP when an allow-CIDR list is set | | `backup.bucket` / `region` / `endpoint` | — | Optional S3/R2 backup | | `org.name` / `org.policyNote` | — | Shown in share + status | @@ -166,6 +176,12 @@ These knobs are pairing controls, not a complete enterprise ACL: email and git r | `CHORUS_SYSTEM_CONFIG` | `/etc/chorus/config.json` | Org-wide config path | | `CHORUS_USER_CONFIG` | `~/.config/chorus/config.json` | Per-user config path override | | `CHORUS_PORT` | `7742` | Relay listen port (overrides file) | +| `CHORUS_BIND` | `0.0.0.0` | Relay bind address | +| `CHORUS_ALLOWED_CIDRS` | — | Comma-separated CIDR/IP allowlist | +| `CHORUS_DENIED_CIDRS` | — | Comma-separated CIDR/IP denylist (deny wins) | +| `CHORUS_ALLOWED_PORTS` | — | Comma-separated peer source ports | +| `CHORUS_ALLOW_OPEN_BIND` | `true` | Set `false` to refuse `0.0.0.0` / `::` | +| `CHORUS_ALLOW_LOOPBACK` | `true` | Admit loopback when allowlist is set | | `CHORUS_RELAY_BIN` | auto-detect | Path to `chorus-relay` binary | | `CHORUS_HOST_TOKEN` | random | Host control secret (set by plugin when spawning) | | `CHORUS_RELAY_HOST` | `127.0.0.1` | Relay host to attach to (e.g. `host.docker.internal:7742`) | @@ -184,6 +200,7 @@ These knobs are pairing controls, not a complete enterprise ACL: email and git r | Host approval | Config `security.requireApproval` (default off); when on, joiners appear in a live numbered queue — `/chorus-approve 1` (full userId still works) | | Git repo gate | If the host share directory has `origin` (or `requireRepoMatch`), joiners must present the same remote. Extra prefixes/rewrites come from `additionalRepoRemotePrefixes` / `repoRemoteRewrites`. | | Company email gate | If `allowedEmailDomain` is set (or `requireEmailDomainMatch`), joiners must auth with an email at that domain | +| Network allowlist | If `relay.allowedCidrs` is set, only those TCP peers reach `/ws` / `/host` (see [docs/NETWORK.md](docs/NETWORK.md)) | | Kick | `/chorus-kick ` disconnects an active joiner | Remote tunneling (`bore` / `cloudflared`) is not implemented yet — share a LAN IP + port for now. @@ -193,6 +210,7 @@ Remote tunneling (`bore` / `cloudflared`) is not implemented yet — share a LAN - [docs/STATUS.md](docs/STATUS.md) — what’s done and what still needs to happen - [docs/DECISIONS.md](docs/DECISIONS.md) — OpenCode plugin vs from-scratch, languages, license - [docs/ENTERPRISE.md](docs/ENTERPRISE.md) — security gaps for enterprise use (claims vs proofs, policy floor, SSO, audit) +- [docs/NETWORK.md](docs/NETWORK.md) — CIDR allowlist, VPN, AWS VPC / Azure VNet / GCP VPC - [docs/THIRD_PARTY_LICENSES.md](docs/THIRD_PARTY_LICENSES.md) — third-party license audit for commercial use ## License diff --git a/chorus.example.json b/chorus.example.json index cd9dc8b..40d1a30 100644 --- a/chorus.example.json +++ b/chorus.example.json @@ -1,7 +1,7 @@ { "org": { "name": "Example Engineering", - "policyNote": "Pair sessions require host approval and a matching git clone." + "policyNote": "Pair sessions require host approval, a matching git clone, and VPN/VPC network access." }, "security": { "requireApproval": true, @@ -15,7 +15,13 @@ "tokenTtlMs": 86400000 }, "relay": { - "port": 7742 + "port": 7742, + "allowOpenBind": false, + "bind": "10.0.12.4", + "allowedCidrs": ["10.0.0.0/8", "100.64.0.0/10"], + "deniedCidrs": ["203.0.113.0/24"], + "allowedPorts": [], + "allowLoopback": true }, "backup": { "region": "us-east-1" diff --git a/crates/chorus-relay/Cargo.toml b/crates/chorus-relay/Cargo.toml index e69052b..5edfe31 100644 --- a/crates/chorus-relay/Cargo.toml +++ b/crates/chorus-relay/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chorus-relay" -version = "0.2.0" +version = "2.0.0" edition.workspace = true license.workspace = true authors.workspace = true @@ -28,6 +28,8 @@ clap = { version = "4", features = ["derive", "env"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } tower-http = { version = "0.6", features = ["trace"] } +ipnet = "2.12.1" +http = "1.5.0" [dev-dependencies] tokio-tungstenite = "0.26" diff --git a/crates/chorus-relay/src/lib.rs b/crates/chorus-relay/src/lib.rs index ff0e1ae..2a45886 100644 --- a/crates/chorus-relay/src/lib.rs +++ b/crates/chorus-relay/src/lib.rs @@ -1,5 +1,6 @@ //! Library surface for integration tests. pub mod access; +pub mod netallow; pub mod protocol; pub mod server; pub mod state; diff --git a/crates/chorus-relay/src/main.rs b/crates/chorus-relay/src/main.rs index 2a3a66a..306a4b7 100644 --- a/crates/chorus-relay/src/main.rs +++ b/crates/chorus-relay/src/main.rs @@ -16,6 +16,28 @@ struct Args { /// Shared secret for the host control channel. Generated if omitted. #[arg(long, env = "CHORUS_HOST_TOKEN")] host_token: Option, + + /// CIDR or IP allowlist (repeat or comma-separated). Empty = no IP allow restriction. + #[arg(long = "allow-cidr", env = "CHORUS_ALLOWED_CIDRS", value_delimiter = ',')] + allowed_cidrs: Vec, + + /// CIDR or IP denylist (repeat or comma-separated). Deny wins over allow. + #[arg(long = "deny-cidr", env = "CHORUS_DENIED_CIDRS", value_delimiter = ',')] + denied_cidrs: Vec, + + /// Peer source-port allowlist (repeat or comma-separated). Empty = any source port. + /// Useful for single-machine e2e where all peers are 127.0.0.1. + #[arg(long = "allow-port", env = "CHORUS_ALLOWED_PORTS", value_delimiter = ',')] + allowed_ports: Vec, + + /// Allow binding to 0.0.0.0 / :: (open all interfaces). Disable for enterprise. + #[arg(long, env = "CHORUS_ALLOW_OPEN_BIND", default_value_t = true, action = clap::ArgAction::Set)] + allow_open_bind: bool, + + /// When an allowlist is set, still admit loopback IPs (host plugin on same machine). + /// Source-port allowlists still apply to loopback peers. + #[arg(long, env = "CHORUS_ALLOW_LOOPBACK", default_value_t = true, action = clap::ArgAction::Set)] + allow_loopback: bool, } fn random_hex(bytes: usize) -> String { @@ -44,6 +66,11 @@ async fn main() -> Result<(), Box> { port: args.port, host_token, bind: args.bind, + allowed_cidrs: args.allowed_cidrs, + denied_cidrs: args.denied_cidrs, + allowed_ports: args.allowed_ports, + allow_open_bind: args.allow_open_bind, + allow_loopback: args.allow_loopback, }) .await } diff --git a/crates/chorus-relay/src/netallow.rs b/crates/chorus-relay/src/netallow.rs new file mode 100644 index 0000000..edc6691 --- /dev/null +++ b/crates/chorus-relay/src/netallow.rs @@ -0,0 +1,291 @@ +//! TCP peer network policy: allow/deny CIDRs and optional source-port allowlist. +//! +//! Evaluation order for each peer `SocketAddr`: +//! 1. If peer IP matches any **deny** CIDR → reject +//! 2. If **allow** CIDRs are non-empty → peer must match one (loopback may bypass) +//! 3. If **allowed ports** are non-empty → peer **source port** must be listed +//! 4. Otherwise admit +//! +//! Empty allow + empty deny + empty ports = unrestricted (LAN-friendly default). +//! Source-port allowlisting is intended for single-machine e2e (all peers are +//! 127.0.0.1) and for tight lockdowns that pin known client ports. + +use ipnet::IpNet; +use std::collections::BTreeSet; +use std::net::{IpAddr, SocketAddr}; +use std::str::FromStr; + +#[derive(Debug, Clone)] +pub struct NetworkPolicy { + allow: Vec, + deny: Vec, + /// When non-empty, peer source port must be in this set. + allowed_ports: BTreeSet, + allow_loopback: bool, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum NetworkPolicyError { + InvalidCidr(String), + InvalidPort(String), +} + +impl std::fmt::Display for NetworkPolicyError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + NetworkPolicyError::InvalidCidr(s) => write!(f, "invalid CIDR: {s}"), + NetworkPolicyError::InvalidPort(s) => write!(f, "invalid port: {s}"), + } + } +} + +impl std::error::Error for NetworkPolicyError {} + +#[derive(Debug, Clone, Default)] +pub struct NetworkPolicyConfig { + pub allowed_cidrs: Vec, + pub denied_cidrs: Vec, + pub allowed_ports: Vec, + pub allow_loopback: bool, +} + +impl NetworkPolicy { + pub fn parse(config: NetworkPolicyConfig) -> Result { + Ok(Self { + allow: parse_cidrs(&config.allowed_cidrs)?, + deny: parse_cidrs(&config.denied_cidrs)?, + allowed_ports: config.allowed_ports.into_iter().collect(), + allow_loopback: config.allow_loopback, + }) + } + + pub fn is_restricted(&self) -> bool { + !self.allow.is_empty() || !self.deny.is_empty() || !self.allowed_ports.is_empty() + } + + pub fn allowed_cidrs(&self) -> impl Iterator + '_ { + self.allow.iter().map(|n| n.to_string()) + } + + pub fn denied_cidrs(&self) -> impl Iterator + '_ { + self.deny.iter().map(|n| n.to_string()) + } + + pub fn allowed_ports(&self) -> impl Iterator + '_ { + self.allowed_ports.iter().copied() + } + + pub fn allows_socket(&self, addr: SocketAddr) -> bool { + let ip = normalize_mapped_v4(addr.ip()); + + if self.deny.iter().any(|net| net.contains(&ip)) { + return false; + } + + if !self.allow.is_empty() { + let ip_ok = self.allow.iter().any(|net| net.contains(&ip)) + || (self.allow_loopback && is_loopback(ip)); + if !ip_ok { + return false; + } + } + + if !self.allowed_ports.is_empty() && !self.allowed_ports.contains(&addr.port()) { + return false; + } + + true + } +} + +fn parse_cidrs(cidrs: &[String]) -> Result, NetworkPolicyError> { + let mut nets = Vec::with_capacity(cidrs.len()); + for raw in cidrs { + let trimmed = raw.trim(); + if trimmed.is_empty() { + continue; + } + let net = parse_cidr_or_ip(trimmed) + .map_err(|_| NetworkPolicyError::InvalidCidr(trimmed.to_string()))?; + nets.push(net); + } + Ok(nets) +} + +fn parse_cidr_or_ip(s: &str) -> Result { + if let Ok(net) = IpNet::from_str(s) { + return Ok(net); + } + let ip = IpAddr::from_str(s).map_err(|e| e.to_string())?; + Ok(IpNet::from(ip)) +} + +fn is_loopback(addr: IpAddr) -> bool { + match normalize_mapped_v4(addr) { + IpAddr::V4(v4) => v4.is_loopback(), + IpAddr::V6(v6) => v6.is_loopback(), + } +} + +fn normalize_mapped_v4(addr: IpAddr) -> IpAddr { + match addr { + IpAddr::V6(v6) => v6 + .to_ipv4_mapped() + .map(IpAddr::V4) + .unwrap_or(IpAddr::V6(v6)), + other => other, + } +} + +/// True when the bind address is the unspecified / "open" address. +pub fn is_open_bind(bind: &str) -> bool { + let host = bind.split('%').next().unwrap_or(bind).trim(); + matches!(host, "0.0.0.0" | "::" | "[::]") +} + +/// Back-compat alias used by older call sites / docs. +pub type NetworkAllowlist = NetworkPolicy; +pub type AllowlistError = NetworkPolicyError; + +impl NetworkPolicy { + /// Parse allow-CIDR-only policy (tests / simple callers). + pub fn parse_allow(cidrs: &[String], allow_loopback: bool) -> Result { + Self::parse(NetworkPolicyConfig { + allowed_cidrs: cidrs.to_vec(), + denied_cidrs: Vec::new(), + allowed_ports: Vec::new(), + allow_loopback, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::net::{Ipv4Addr, Ipv6Addr, SocketAddrV4}; + + fn sock(ip: [u8; 4], port: u16) -> SocketAddr { + SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(ip[0], ip[1], ip[2], ip[3]), port)) + } + + #[test] + fn empty_policy_admits_everyone() { + let p = NetworkPolicy::parse(NetworkPolicyConfig { + allow_loopback: true, + ..Default::default() + }) + .unwrap(); + assert!(!p.is_restricted()); + assert!(p.allows_socket(sock([8, 8, 8, 8], 12345))); + } + + #[test] + fn cidr_allow_match_and_miss() { + let p = NetworkPolicy::parse_allow( + &["10.0.0.0/8".into(), "192.168.1.0/24".into()], + false, + ) + .unwrap(); + assert!(p.allows_socket(sock([10, 1, 2, 3], 1))); + assert!(p.allows_socket(sock([192, 168, 1, 50], 1))); + assert!(!p.allows_socket(sock([192, 168, 2, 1], 1))); + assert!(!p.allows_socket(sock([8, 8, 8, 8], 1))); + } + + #[test] + fn deny_overrides_allow() { + let p = NetworkPolicy::parse(NetworkPolicyConfig { + allowed_cidrs: vec!["10.0.0.0/8".into()], + denied_cidrs: vec!["10.99.0.0/16".into()], + allowed_ports: vec![], + allow_loopback: false, + }) + .unwrap(); + assert!(p.allows_socket(sock([10, 1, 2, 3], 9))); + assert!(!p.allows_socket(sock([10, 99, 1, 1], 9))); + } + + #[test] + fn deny_alone_blocks_range() { + let p = NetworkPolicy::parse(NetworkPolicyConfig { + allowed_cidrs: vec![], + denied_cidrs: vec!["203.0.113.0/24".into()], + allowed_ports: vec![], + allow_loopback: true, + }) + .unwrap(); + assert!(p.is_restricted()); + assert!(!p.allows_socket(sock([203, 0, 113, 9], 80))); + assert!(p.allows_socket(sock([8, 8, 8, 8], 80))); + } + + #[test] + fn deny_blocks_loopback_even_when_allow_loopback() { + let p = NetworkPolicy::parse(NetworkPolicyConfig { + allowed_cidrs: vec!["10.0.0.0/8".into()], + denied_cidrs: vec!["127.0.0.0/8".into()], + allowed_ports: vec![], + allow_loopback: true, + }) + .unwrap(); + assert!(!p.allows_socket(sock([127, 0, 0, 1], 9))); + } + + #[test] + fn source_port_allowlist_for_single_machine() { + let p = NetworkPolicy::parse(NetworkPolicyConfig { + allowed_cidrs: vec![], + denied_cidrs: vec![], + allowed_ports: vec![18001, 18002], + allow_loopback: true, + }) + .unwrap(); + assert!(p.allows_socket(sock([127, 0, 0, 1], 18001))); + assert!(p.allows_socket(sock([127, 0, 0, 1], 18002))); + assert!(!p.allows_socket(sock([127, 0, 0, 1], 18003))); + assert!(!p.allows_socket(sock([10, 0, 0, 5], 9999))); + } + + #[test] + fn port_and_cidr_both_required() { + let p = NetworkPolicy::parse(NetworkPolicyConfig { + allowed_cidrs: vec!["10.0.0.0/8".into()], + denied_cidrs: vec![], + allowed_ports: vec![4000], + allow_loopback: false, + }) + .unwrap(); + assert!(p.allows_socket(sock([10, 0, 0, 1], 4000))); + assert!(!p.allows_socket(sock([10, 0, 0, 1], 4001))); + assert!(!p.allows_socket(sock([11, 0, 0, 1], 4000))); + } + + #[test] + fn bare_ip_is_host_route() { + let p = NetworkPolicy::parse_allow(&["203.0.113.9".into()], false).unwrap(); + assert!(p.allows_socket(sock([203, 0, 113, 9], 1))); + assert!(!p.allows_socket(sock([203, 0, 113, 10], 1))); + } + + #[test] + fn loopback_bypasses_allow_cidr_when_enabled() { + let p = NetworkPolicy::parse_allow(&["10.0.0.0/8".into()], true).unwrap(); + assert!(p.allows_socket(sock([127, 0, 0, 1], 9))); + assert!(p.allows_socket(SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 9))); + assert!(!p.allows_socket(sock([8, 8, 8, 8], 9))); + } + + #[test] + fn ipv4_mapped_v6_matches_v4_cidr() { + let p = NetworkPolicy::parse_allow(&["10.0.0.0/8".into()], false).unwrap(); + let mapped = IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x0a01, 0x0203)); + assert!(p.allows_socket(SocketAddr::new(mapped, 1))); + } + + #[test] + fn open_bind_detection() { + assert!(is_open_bind("0.0.0.0")); + assert!(is_open_bind("::")); + assert!(!is_open_bind("127.0.0.1")); + } +} diff --git a/crates/chorus-relay/src/server.rs b/crates/chorus-relay/src/server.rs index 9269f05..99d0600 100644 --- a/crates/chorus-relay/src/server.rs +++ b/crates/chorus-relay/src/server.rs @@ -1,4 +1,5 @@ use crate::access::AccessManager; +use crate::netallow::{is_open_bind, NetworkPolicy, NetworkPolicyConfig}; use crate::protocol::{ email_matches_domain, normalize_display_name, normalize_email, sanitize_repo_remote_prefixes, sanitize_repo_remote_rewrites, ChatMessage, ClientMessage, HostToRelay, RelayToHost, @@ -6,7 +7,8 @@ use crate::protocol::{ }; use crate::state::{ClientTx, HostTx, RelayState, SharedState}; use axum::extract::ws::{Message, WebSocket}; -use axum::extract::{State, WebSocketUpgrade}; +use axum::extract::{ConnectInfo, State, WebSocketUpgrade}; +use axum::http::StatusCode; use axum::response::IntoResponse; use axum::routing::get; use axum::{Json, Router}; @@ -35,18 +37,76 @@ fn random_hex(bytes: usize) -> String { pub struct AppState { pub relay: SharedState, pub host_token: Arc, + pub network: Arc, } pub struct RelayConfig { pub port: u16, pub host_token: String, pub bind: String, + /// When non-empty, only these CIDRs (plus loopback if enabled) may connect. + pub allowed_cidrs: Vec, + /// Explicit deny CIDRs — evaluated before allow (deny wins). + pub denied_cidrs: Vec, + /// When non-empty, only these peer **source ports** may connect (single-machine e2e). + pub allowed_ports: Vec, + /// When false, refuse bind to 0.0.0.0 / :: (enterprise default for MDM). + pub allow_open_bind: bool, + /// When allowlist is set, still admit 127.0.0.0/8 and ::1 (host plugin). + pub allow_loopback: bool, +} + +impl Default for RelayConfig { + fn default() -> Self { + Self { + port: 7742, + host_token: String::new(), + bind: "0.0.0.0".into(), + allowed_cidrs: Vec::new(), + denied_cidrs: Vec::new(), + allowed_ports: Vec::new(), + allow_open_bind: true, + allow_loopback: true, + } + } +} + +fn peer_allowed(state: &AppState, peer: SocketAddr) -> bool { + state.network.allows_socket(peer) } pub async fn serve(config: RelayConfig) -> Result<(), Box> { + if !config.allow_open_bind && is_open_bind(&config.bind) { + return Err(format!( + "refusing open bind {} (set --bind to a private address or enable --allow-open-bind)", + config.bind + ) + .into()); + } + + let network = NetworkPolicy::parse(NetworkPolicyConfig { + allowed_cidrs: config.allowed_cidrs, + denied_cidrs: config.denied_cidrs, + allowed_ports: config.allowed_ports, + allow_loopback: config.allow_loopback, + })?; + if network.is_restricted() { + let allow: Vec = network.allowed_cidrs().collect(); + let deny: Vec = network.denied_cidrs().collect(); + let ports: Vec = network.allowed_ports().map(|p| p.to_string()).collect(); + tracing::info!( + "network policy enabled (loopback={}): allow=[{}] deny=[{}] ports=[{}]", + config.allow_loopback, + allow.join(", "), + deny.join(", "), + ports.join(", ") + ); + } + let state = AppState { relay: Arc::new(RwLock::new(RelayState::new(config.port))), host_token: Arc::new(config.host_token), + network: Arc::new(network), }; let app = Router::new() @@ -60,28 +120,97 @@ pub async fn serve(config: RelayConfig) -> Result<(), Box(), + ) + .await?; Ok(()) } -async fn root() -> &'static str { - "chorus relay — OpenCode only" +async fn root( + ConnectInfo(peer): ConnectInfo, + State(state): State, +) -> impl IntoResponse { + if !peer_allowed(&state, peer) { + return ( + StatusCode::FORBIDDEN, + "chorus relay — peer not on network allowlist", + ) + .into_response(); + } + "chorus relay — OpenCode only".into_response() } -async fn status(State(state): State) -> impl IntoResponse { +async fn status( + ConnectInfo(peer): ConnectInfo, + State(state): State, +) -> impl IntoResponse { + if !peer_allowed(&state, peer) { + return ( + StatusCode::FORBIDDEN, + Json(serde_json::json!({ + "status": "forbidden", + "error": "peer not on network allowlist", + })), + ) + .into_response(); + } let guard = state.relay.read().await; + let allow: Vec = state.network.allowed_cidrs().collect(); + let deny: Vec = state.network.denied_cidrs().collect(); + let ports: Vec = state.network.allowed_ports().collect(); Json(serde_json::json!({ "status": "ok", "clients": guard.client_count(), + "network": { + "allowlist": allow, + "denylist": deny, + "allowedPorts": ports, + "restricted": state.network.is_restricted(), + }, })) + .into_response() } -async fn ws_joiner(ws: WebSocketUpgrade, State(state): State) -> impl IntoResponse { +async fn ws_joiner( + ConnectInfo(peer): ConnectInfo, + ws: WebSocketUpgrade, + State(state): State, +) -> impl IntoResponse { + if !peer_allowed(&state, peer) { + tracing::warn!(%peer, "rejected /ws: not on network allowlist"); + return ( + StatusCode::FORBIDDEN, + Json(serde_json::json!({ + "error": "NETWORK_ACCESS_DENIED", + "message": "Peer address is not on the relay network allowlist", + })), + ) + .into_response(); + } ws.on_upgrade(move |socket| handle_joiner(socket, state.relay)) + .into_response() } -async fn ws_host(ws: WebSocketUpgrade, State(state): State) -> impl IntoResponse { +async fn ws_host( + ConnectInfo(peer): ConnectInfo, + ws: WebSocketUpgrade, + State(state): State, +) -> impl IntoResponse { + if !peer_allowed(&state, peer) { + tracing::warn!(%peer, "rejected /host: not on network allowlist"); + return ( + StatusCode::FORBIDDEN, + Json(serde_json::json!({ + "error": "NETWORK_ACCESS_DENIED", + "message": "Peer address is not on the relay network allowlist", + })), + ) + .into_response(); + } ws.on_upgrade(move |socket| handle_host(socket, state.relay, state.host_token)) + .into_response() } fn admit_active(guard: &mut RelayState, uid: &str, user: &crate::protocol::ConnectedUser, tx: &ClientTx) { diff --git a/crates/chorus-relay/tests/relay_ws.rs b/crates/chorus-relay/tests/relay_ws.rs index 81c3126..cdd2251 100644 --- a/crates/chorus-relay/tests/relay_ws.rs +++ b/crates/chorus-relay/tests/relay_ws.rs @@ -19,6 +19,11 @@ async fn start_relay(port: u16, host_token: &str) { port, host_token: token, bind: "127.0.0.1".into(), + allowed_cidrs: Vec::new(), + denied_cidrs: Vec::new(), + allowed_ports: Vec::new(), + allow_open_bind: true, + allow_loopback: true, }) .await .expect("relay failed"); @@ -552,3 +557,198 @@ async fn accepts_custom_remote_format_with_policy_prefix_and_rewrite() { let _ = wait_for_server(&mut ws, |m| matches!(m, ServerMessage::SessionHistory { .. })).await; } + +async fn start_relay_with(config: RelayConfig) { + let port = config.port; + tokio::spawn(async move { + serve(config).await.expect("relay failed"); + }); + for _ in 0..50 { + // Status may be forbidden when loopback is denied; TCP accept is enough. + if tokio::net::TcpStream::connect(("127.0.0.1", port)) + .await + .is_ok() + { + return; + } + tokio::time::sleep(Duration::from_millis(20)).await; + } + panic!("relay did not become ready on port {port}"); +} + +#[tokio::test] +async fn allowlist_admits_loopback_by_default() { + let port = 18753; + let host_token = "allowlist-loopback-token"; + start_relay_with(RelayConfig { + port, + host_token: host_token.into(), + bind: "127.0.0.1".into(), + allowed_cidrs: vec!["10.0.0.0/8".into()], + denied_cidrs: Vec::new(), + allowed_ports: Vec::new(), + allow_open_bind: true, + allow_loopback: true, + }) + .await; + + let res = http_status(port).await; + assert_eq!(res.status, 200); + assert!(res.body.contains("\"restricted\":true")); + + let mut host = connect_host(port, host_token).await; + let token = issue_token(&mut host, UserRole::Edit).await; + let (mut ws, _) = connect_async(format!("ws://127.0.0.1:{port}/ws")) + .await + .unwrap(); + ws.send(Message::Text( + serde_json::to_string(&ClientMessage::Auth { + token, + display_name: "Local".into(), + repo_remote: None, + email: None, + }) + .unwrap() + .into(), + )) + .await + .unwrap(); + let _ = wait_for_server(&mut ws, |m| matches!(m, ServerMessage::SessionHistory { .. })).await; +} + +#[tokio::test] +async fn allowlist_rejects_loopback_when_disabled() { + let port = 18754; + let host_token = "allowlist-deny-loopback-token"; + start_relay_with(RelayConfig { + port, + host_token: host_token.into(), + bind: "127.0.0.1".into(), + allowed_cidrs: vec!["10.0.0.0/8".into()], + denied_cidrs: Vec::new(), + allowed_ports: Vec::new(), + allow_open_bind: true, + allow_loopback: false, + }) + .await; + + let res = http_status(port).await; + assert_eq!(res.status, 403); + assert!(res.body.contains("NETWORK_ACCESS_DENIED") || res.body.contains("forbidden")); + + let connect = connect_async(format!("ws://127.0.0.1:{port}/ws")).await; + assert!( + connect.is_err(), + "websocket upgrade should fail when peer is not allowlisted" + ); +} + +#[tokio::test] +async fn refuse_open_bind_when_disabled() { + let err = serve(RelayConfig { + port: 18755, + host_token: "x".into(), + bind: "0.0.0.0".into(), + allowed_cidrs: Vec::new(), + denied_cidrs: Vec::new(), + allowed_ports: Vec::new(), + allow_open_bind: false, + allow_loopback: true, + }) + .await + .expect_err("should refuse open bind"); + let msg = err.to_string(); + assert!( + msg.contains("refusing open bind") || msg.contains("0.0.0.0"), + "unexpected error: {msg}" + ); +} + +struct HttpStatus { + status: u16, + body: String, +} + +async fn http_status(port: u16) -> HttpStatus { + http_status_from_local(port, 0).await +} + +/// GET /status using a bound local source port (`0` = ephemeral). +async fn http_status_from_local(relay_port: u16, local_port: u16) -> HttpStatus { + use std::net::{Ipv4Addr, SocketAddr}; + use tokio::io::{AsyncReadExt, AsyncWriteExt}; + use tokio::net::TcpSocket; + + let socket = TcpSocket::new_v4().expect("socket"); + socket.set_reuseaddr(true).ok(); + if local_port != 0 { + socket + .bind(SocketAddr::from((Ipv4Addr::LOCALHOST, local_port))) + .expect("bind local"); + } + let mut stream = socket + .connect(SocketAddr::from((Ipv4Addr::LOCALHOST, relay_port))) + .await + .expect("connect"); + let req = format!("GET /status HTTP/1.0\r\nHost: 127.0.0.1:{relay_port}\r\n\r\n"); + stream.write_all(req.as_bytes()).await.unwrap(); + let mut buf = Vec::new(); + stream.read_to_end(&mut buf).await.unwrap(); + let text = String::from_utf8_lossy(&buf); + let status = text + .lines() + .next() + .and_then(|line| line.split_whitespace().nth(1)) + .and_then(|s| s.parse().ok()) + .unwrap_or(0); + HttpStatus { + status, + body: text.into_owned(), + } +} + +#[tokio::test] +async fn source_port_allowlist_admits_a_and_b_rejects_c() { + let port = 18756; + start_relay_with(RelayConfig { + port, + host_token: "port-allow-token".into(), + bind: "127.0.0.1".into(), + allowed_cidrs: Vec::new(), + denied_cidrs: Vec::new(), + allowed_ports: vec![18101, 18102], + allow_open_bind: true, + allow_loopback: true, + }) + .await; + + let a = http_status_from_local(port, 18101).await; + assert_eq!(a.status, 200, "port A should be allowed: {}", a.body); + assert!(a.body.contains("\"allowedPorts\"")); + + let b = http_status_from_local(port, 18102).await; + assert_eq!(b.status, 200, "port B should be allowed: {}", b.body); + + let c = http_status_from_local(port, 18103).await; + assert_eq!(c.status, 403, "port C should be denied: {}", c.body); +} + +#[tokio::test] +async fn deny_cidr_blocks_loopback_when_listed() { + let port = 18757; + start_relay_with(RelayConfig { + port, + host_token: "deny-loopback-token".into(), + bind: "127.0.0.1".into(), + allowed_cidrs: Vec::new(), + denied_cidrs: vec!["127.0.0.0/8".into()], + allowed_ports: Vec::new(), + allow_open_bind: true, + allow_loopback: true, + }) + .await; + + let res = http_status(port).await; + assert_eq!(res.status, 403, "deny CIDR should win: {}", res.body); + assert!(res.body.contains("denylist") || res.body.contains("forbidden")); +} diff --git a/docs/ENTERPRISE.md b/docs/ENTERPRISE.md index 0a0ce70..5506e86 100644 --- a/docs/ENTERPRISE.md +++ b/docs/ENTERPRISE.md @@ -34,6 +34,7 @@ System / MDM config must be able to set a **minimum** that user and project file - `requireApproval`, `allowSkipApproval`, `requireRepoMatch`, `requireEmailDomainMatch`, `allowedEmailDomain`, `defaultRole`, `tokenTtlMs` - Optional: forbid `admin` join tokens, forbid backup, forbid advertising a non-loopback `publicHost` +- Network: `allowOpenBind: false`, non-empty `allowedCidrs` (see [NETWORK.md](./NETWORK.md)) Users should still be allowed to **tighten** (force approval even if org default is off). Today they can also loosen. @@ -104,7 +105,7 @@ Not always a hard block, but they show up on every questionnaire. | Feature | Why | |---|---| | **Proven repo ACL** | GitHub/GitLab “is this user a collaborator on `origin`?” or a signed capability from the host clone — STATUS.md #11 | -| **Network allowlist** | Only listed CIDRs / tailnet peers can hit the relay; refuse `0.0.0.0` unless org allows LAN bind | +| **Network allowlist** | CIDR allowlist + refuse open bind on the relay; still pair with VPC/SG/VPN — [NETWORK.md](./NETWORK.md) | | **Signed relay binaries + SBOM** | Supply-chain review of `chorus-relay`; pinned plugin version | | **Apache-2.0 or explicit patent grant** | MIT is often acceptable; some legal teams still stall — see [DECISIONS.md](./DECISIONS.md) | | **Admin role split** | Joiner `admin` can kick/promote/close from the `/ws` client protocol. Host-only moderation is easier to explain | @@ -123,7 +124,7 @@ Skip these until the blockers above exist: ## Suggested order 1. **Policy floor** + **default `view`** + **token TTL and revoke-on-stop** — makes the locks you already document real, cuts blast radius, no IdP required. -2. **Audit JSON** + **backup encryption / no-backup lock** + **localhost or TLS bind** — answers IR and data-handling questions. +2. **Audit JSON** + **backup encryption / no-backup lock** + **TLS** — answers IR and data-handling questions. Network allowlist / private bind is available now ([NETWORK.md](./NETWORK.md)). 3. **OIDC** + **GitHub/GitLab collaborator check** — turns email/repo from claims into proofs. 4. **Joiner tool allowlist** + **tunnel with TLS** — only then is remote pair programming an enterprise feature. diff --git a/docs/NETWORK.md b/docs/NETWORK.md new file mode 100644 index 0000000..6a6a4bb --- /dev/null +++ b/docs/NETWORK.md @@ -0,0 +1,147 @@ +# Network access — keep Chorus off the open internet + +Chorus is a **self-hosted** WebSocket relay. By default it binds `0.0.0.0:7742` with no IP filter so LAN pair sessions work. Enterprises that must keep the share off the public internet should combine: + +1. **Cloud / VPN network controls** (security groups, private subnets, VPN routes) — the primary gate +2. **Chorus CIDR allowlist + bind policy** — defense in depth on the relay process itself + +Neither replaces join tokens, approval, or (eventually) SSO. They only answer: *who can even open a TCP connection to the relay?* + +## Chorus controls + +Configure in `chorus.json` (or `/etc/chorus/config.json` / env): + +```json +{ + "relay": { + "bind": "10.0.12.4", + "allowOpenBind": false, + "allowedCidrs": ["10.0.0.0/8", "100.64.0.0/10"], + "allowLoopback": true + } +} +``` + +| Field / env | Default | Meaning | +|---|---|---| +| `relay.bind` / `CHORUS_BIND` | `0.0.0.0` | Listen address | +| `relay.allowOpenBind` / `CHORUS_ALLOW_OPEN_BIND` | `true` | When `false`, refuse bind to `0.0.0.0` / `::` | +| `relay.allowedCidrs` / `CHORUS_ALLOWED_CIDRS` | `[]` | CIDR or IP allow list; empty = no allow restriction | +| `relay.deniedCidrs` / `CHORUS_DENIED_CIDRS` | `[]` | Explicit deny CIDRs (deny wins over allow) | +| `relay.allowedPorts` / `CHORUS_ALLOWED_PORTS` | `[]` | Peer **source port** allowlist; empty = any port | +| `relay.allowLoopback` / `CHORUS_ALLOW_LOOPBACK` | `true` | When allow-CIDRs set, still admit loopback IPs (ports still enforced) | + +CLI equivalent when running `chorus-relay` directly: + +```sh +chorus-relay \ + --bind 10.0.12.4 \ + --allow-open-bind false \ + --allow-cidr 10.0.0.0/8 \ + --allow-cidr 100.64.0.0/10 \ + --deny-cidr 203.0.113.0/24 \ + --allow-port 18201 \ + --allow-port 18202 +``` + +Evaluation order per TCP peer: + +1. **Deny CIDR** match → reject +2. **Allow CIDR** (if non-empty) → must match (loopback may bypass when `allowLoopback`) +3. **Allowed source ports** (if non-empty) → peer source port must be listed +4. Otherwise admit + +Source-port allowlisting is how single-machine e2e distinguishes clients that all appear as `127.0.0.1`. See `bun run test:network-e2e`. + +Peers outside policy get **HTTP 403** / failed WebSocket upgrade (`NETWORK_ACCESS_DENIED`) before auth. Matching uses the **TCP peer address and source port** (not `X-Forwarded-For`). Put the policy on the process that terminates the client connection, or rely on the edge security group when fronted by a load balancer. + +`/status` reports whether a policy is active: + +```json +{ + "status": "ok", + "clients": 0, + "network": { + "allowlist": ["10.0.0.0/8"], + "denylist": ["203.0.113.0/24"], + "allowedPorts": [18201, 18202], + "restricted": true + } +} +``` + +## Recommended patterns + +### Corporate VPN or Zero Trust (any cloud) + +1. Require VPN / WARP / GlobalProtect / etc. for developer laptops. +2. Allowlist the VPN egress CIDRs (or the VPN pool) in `allowedCidrs`. +3. Set `allowOpenBind: false` and bind a private interface (or keep `0.0.0.0` only if the host has no public NIC). + +Joiners who are not on the VPN never reach the relay, even with a leaked join token. + +### Tailscale / WireGuard / Nebula + +Allowlist the overlay range (Tailscale CGNAT is typically `100.64.0.0/10`). Advertise `publicHost` as the host’s tailnet IP (or MagicDNS name + port) via `relay.publicHost` / `CHORUS_PUBLIC_HOST`. + +```json +{ + "relay": { + "publicHost": "100.100.1.20:7742", + "allowedCidrs": ["100.64.0.0/10"], + "allowOpenBind": false, + "bind": "100.100.1.20" + } +} +``` + +### AWS VPC + +Defense in depth: + +| Layer | What to set | +|---|---| +| Placement | Run the host (or a dedicated `chorus-relay`) in a **private subnet** with no public IP | +| Security group | Inbound TCP `7742` only from VPN SG, Shared Services SG, or corporate CIDRs — never `0.0.0.0/0` | +| NACL (optional) | Same CIDR allowlist at subnet edge | +| Chorus | `allowedCidrs` = VPC CIDR(s) + VPN client CIDR; `allowOpenBind: false` | + +Private connectivity options when joiners are in another account/VPC: **VPC peering**, **Transit Gateway**, or **PrivateLink** to an NLB in front of the relay. Do not put an internet-facing ALB in front of plaintext `ws://` without TLS termination and auth at the edge. + +Example MDM floor: + +```json +{ + "relay": { + "allowOpenBind": false, + "allowedCidrs": ["10.20.0.0/16", "10.30.0.0/16"] + } +} +``` + +### Azure VNet + +| Layer | What to set | +|---|---| +| Placement | Private subnet; no public IP on the NIC | +| NSG | Allow TCP `7742` from VPN Gateway / Virtual WAN hub / peered VNet ranges only | +| Private Link | Optional Private Endpoint + Internal Load Balancer if the relay is a shared service | +| Chorus | `allowedCidrs` = VNet address spaces + VPN point-to-site pool | + +### GCP VPC + +| Layer | What to set | +|---|---| +| Placement | Private GCE / GKE with no external IP (Cloud NAT for egress if needed) | +| Firewall | Ingress `tcp:7742` from VPN (`Cloud VPN` / `Identity-Aware Proxy` is not a TCP peer substitute) or specific source tags/ranges | +| PSC | Private Service Connect for cross-project relay | +| Chorus | `allowedCidrs` = subnet CIDRs + HA VPN client ranges | + +## What this does *not* do + +- It does **not** terminate TLS (still `ws://` until tunnel/TLS work lands). +- It does **not** verify IdP identity — pair with join token + approval / future OIDC. +- It does **not** replace cloud security groups; treat Chorus allowlists as a second fence. +- Behind a reverse proxy, the relay sees the **proxy’s** IP unless you terminate allowlisting at the proxy. + +See also [ENTERPRISE.md](./ENTERPRISE.md) for the full security gap list. diff --git a/docs/STATUS.md b/docs/STATUS.md index 6ce47e1..b766f5b 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -1,6 +1,6 @@ # Chorus status — what still needs to happen -Snapshot as of 2026-08-03 (post `v0.1.6`). Tests/typecheck/build are green (33 tests). +Snapshot as of 2026-08-21 (toward `v2.0.0` network lockdown). Tests/typecheck/build are green. ## Current state @@ -53,6 +53,7 @@ Enterprise gap analysis (what would actually pass a security review vs what ship - Git origin binding when the host share directory has a remote (joiner must present matching remote) - `chorus-kick` for active joiners - Layered `chorus.json` config (org/user/project) for security + relay + backup defaults, with enterprise locks (user/project can still override system; email/repo remain claims — [docs/ENTERPRISE.md](./ENTERPRISE.md)) +- **Network allowlist** — `relay.allowedCidrs`, `relay.bind`, `relay.allowOpenBind` / `allowLoopback` (VPN/VPC patterns in [docs/NETWORK.md](./NETWORK.md)) ### P1 — reliability diff --git a/package.json b/package.json index a898c35..98932f9 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "test:multi-agent": "bun scripts/multi-agent.ts setup --agents 2 && bun scripts/multi-agent.ts up --agents 2 && bun scripts/multi-agent.ts smoke && bun scripts/multi-agent.ts pair && bun scripts/multi-agent.ts down", "test:integration": "bun run test && bun run typecheck && bun run test:multi-agent && bun run test:security-e2e && bun run test:relay-stress", "test:relay-stress": "bun scripts/multi-agent.ts relay-stress --agents 5", + "test:network-e2e": "bun run build:relay && bun scripts/network-e2e.ts", "docker-agents": "bun scripts/docker-agents.ts", "test:docker-agents": "bun scripts/docker-agents.ts up --agents 2 && bun scripts/docker-agents.ts smoke && bun scripts/docker-agents.ts pair && bun scripts/docker-agents.ts down" }, diff --git a/packages/plugin/dist/config/load.d.ts b/packages/plugin/dist/config/load.d.ts index 45813a8..12f3ffa 100644 --- a/packages/plugin/dist/config/load.d.ts +++ b/packages/plugin/dist/config/load.d.ts @@ -21,7 +21,7 @@ export declare function systemConfigPath(): string; * 3. user file (`~/.config/chorus/config.json`) * 4. project file (`chorus.json` or `.chorus/config.json` under projectDir) * 5. explicit CHORUS_CONFIG path - * 6. selected environment overrides (relay port, public host, backup) + * 6. selected environment overrides (relay port/bind/allowlist, public host, backup) */ export declare function loadChorusConfig(projectDir?: string): LoadedChorusConfig; /** diff --git a/packages/plugin/dist/config/load.d.ts.map b/packages/plugin/dist/config/load.d.ts.map index 52ea7a4..a9a168b 100644 --- a/packages/plugin/dist/config/load.d.ts.map +++ b/packages/plugin/dist/config/load.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,qBAAqB,EAErB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,QAAQ,GACR,MAAM,GACN,SAAS,GACT,eAAe,GACf,KAAK,CAAC;AAEV,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,+DAA+D;IAC/D,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD;AAsBD,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/D;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAqCxE;AAuCD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,EAClC,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAMT;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,EAClC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAClC,MAAM,GAAG,MAAM,GAAG,OAAO,CAE3B;AAED,wEAAwE;AACxE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGvF;AAED,4FAA4F;AAC5F,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,GACjC,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,GAAG,OAAO,CAElF;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAE/F;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,qBAAqB,EAErB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,QAAQ,GACR,MAAM,GACN,SAAS,GACT,eAAe,GACf,KAAK,CAAC;AAEV,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,+DAA+D;IAC/D,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD;AAsBD,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/D;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAqCxE;AAgFD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,EAClC,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAMT;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,EAClC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAClC,MAAM,GAAG,MAAM,GAAG,OAAO,CAE3B;AAED,wEAAwE;AACxE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGvF;AAED,4FAA4F;AAC5F,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,GACjC,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,GAAG,OAAO,CAElF;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAE/F;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"} \ No newline at end of file diff --git a/packages/plugin/dist/config/load.js b/packages/plugin/dist/config/load.js index 47bc510..6fece6f 100644 --- a/packages/plugin/dist/config/load.js +++ b/packages/plugin/dist/config/load.js @@ -40,7 +40,7 @@ export function systemConfigPath() { * 3. user file (`~/.config/chorus/config.json`) * 4. project file (`chorus.json` or `.chorus/config.json` under projectDir) * 5. explicit CHORUS_CONFIG path - * 6. selected environment overrides (relay port, public host, backup) + * 6. selected environment overrides (relay port/bind/allowlist, public host, backup) */ export function loadChorusConfig(projectDir) { const sources = [{ kind: "defaults" }]; @@ -95,6 +95,39 @@ function applyEnvOverrides(config) { next.relay.publicHost = process.env["CHORUS_PUBLIC_HOST"]; applied = true; } + if (process.env["CHORUS_BIND"]) { + next.relay.bind = process.env["CHORUS_BIND"]; + applied = true; + } + if (process.env["CHORUS_ALLOWED_CIDRS"]) { + next.relay.allowedCidrs = process.env["CHORUS_ALLOWED_CIDRS"] + .split(",") + .map((s) => s.trim()) + .filter(Boolean); + applied = true; + } + if (process.env["CHORUS_DENIED_CIDRS"]) { + next.relay.deniedCidrs = process.env["CHORUS_DENIED_CIDRS"] + .split(",") + .map((s) => s.trim()) + .filter(Boolean); + applied = true; + } + if (process.env["CHORUS_ALLOWED_PORTS"]) { + next.relay.allowedPorts = process.env["CHORUS_ALLOWED_PORTS"] + .split(",") + .map((s) => parseInt(s.trim(), 10)) + .filter((n) => Number.isFinite(n) && n >= 1 && n <= 65535); + applied = true; + } + if (process.env["CHORUS_ALLOW_OPEN_BIND"] !== undefined) { + next.relay.allowOpenBind = parseEnvBool(process.env["CHORUS_ALLOW_OPEN_BIND"], true); + applied = true; + } + if (process.env["CHORUS_ALLOW_LOOPBACK"] !== undefined) { + next.relay.allowLoopback = parseEnvBool(process.env["CHORUS_ALLOW_LOOPBACK"], true); + applied = true; + } if (process.env["CHORUS_AWS_BUCKET"]) { next.backup.bucket = process.env["CHORUS_AWS_BUCKET"]; applied = true; @@ -109,6 +142,16 @@ function applyEnvOverrides(config) { } return { config: next, applied }; } +function parseEnvBool(raw, fallback) { + if (raw === undefined) + return fallback; + const v = raw.trim().toLowerCase(); + if (["1", "true", "yes", "on"].includes(v)) + return true; + if (["0", "false", "no", "off"].includes(v)) + return false; + return fallback; +} /** * Resolve effective requireApproval for a share invocation. * Enterprise lock: when allowSkipApproval is false, always use config.requireApproval. diff --git a/packages/plugin/dist/config/load.js.map b/packages/plugin/dist/config/load.js.map index f383720..c3382da 100644 --- a/packages/plugin/dist/config/load.js.map +++ b/packages/plugin/dist/config/load.js.map @@ -1 +1 @@ -{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/plugin/dist/config/schema.d.ts b/packages/plugin/dist/config/schema.d.ts index 590c524..65ae899 100644 --- a/packages/plugin/dist/config/schema.d.ts +++ b/packages/plugin/dist/config/schema.d.ts @@ -26,6 +26,12 @@ export declare const chorusSecurityConfigSchema: z.ZodObject<{ export declare const chorusRelayConfigSchema: z.ZodObject<{ port: z.ZodOptional; publicHost: z.ZodOptional; + bind: z.ZodOptional; + allowedCidrs: z.ZodDefault>; + deniedCidrs: z.ZodDefault>; + allowedPorts: z.ZodDefault>; + allowOpenBind: z.ZodDefault; + allowLoopback: z.ZodDefault; }, z.core.$strict>; export declare const chorusBackupConfigSchema: z.ZodObject<{ bucket: z.ZodOptional; @@ -65,6 +71,12 @@ export declare const chorusConfigSchema: z.ZodObject<{ relay: z.ZodDefault; publicHost: z.ZodOptional; + bind: z.ZodOptional; + allowedCidrs: z.ZodDefault>; + deniedCidrs: z.ZodDefault>; + allowedPorts: z.ZodDefault>; + allowOpenBind: z.ZodDefault; + allowLoopback: z.ZodDefault; }, z.core.$strict>>; backup: z.ZodDefault; diff --git a/packages/plugin/dist/config/schema.d.ts.map b/packages/plugin/dist/config/schema.d.ts.map index 2daf688..b7c0e84 100644 --- a/packages/plugin/dist/config/schema.d.ts.map +++ b/packages/plugin/dist/config/schema.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB;;;;EAAoC,CAAC;AAYlE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;kBAmD5B,CAAC;AAEZ,eAAO,MAAM,uBAAuB;;;kBAMzB,CAAC;AAEZ,eAAO,MAAM,wBAAwB;;;;kBAM1B,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;kBAOvB,CAAC;AAEZ;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAOpB,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC/D,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;AAE5D,eAAO,MAAM,qBAAqB,EAAE,YAA2C,CAAC;AAEhF,uEAAuE;AACvE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBzB"} \ No newline at end of file +{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB;;;;EAAoC,CAAC;AAYlE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;kBAmD5B,CAAC;AAUZ,eAAO,MAAM,uBAAuB;;;;;;;;;kBAwCzB,CAAC;AAEZ,eAAO,MAAM,wBAAwB;;;;kBAM1B,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;kBAOvB,CAAC;AAEZ;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAOpB,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC/D,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;AAE5D,eAAO,MAAM,qBAAqB,EAAE,YAA2C,CAAC;AAEhF,uEAAuE;AACvE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBzB"} \ No newline at end of file diff --git a/packages/plugin/dist/config/schema.js b/packages/plugin/dist/config/schema.js index 3b8260a..08cbf48 100644 --- a/packages/plugin/dist/config/schema.js +++ b/packages/plugin/dist/config/schema.js @@ -60,11 +60,52 @@ export const chorusSecurityConfigSchema = z tokenTtlMs: z.number().int().positive().optional(), }) .strict(); +const relayDefaults = { + allowedCidrs: [], + deniedCidrs: [], + allowedPorts: [], + allowOpenBind: true, + allowLoopback: true, +}; export const chorusRelayConfigSchema = z .object({ port: z.number().int().min(1).max(65535).optional(), /** Host:port advertised in join URLs (overrides LAN detection). */ publicHost: z.string().min(1).optional(), + /** + * Bind address for chorus-relay (default 0.0.0.0 for LAN). + * Prefer a private interface or 127.0.0.1 when only local/VPN peers should reach it. + */ + bind: z.string().min(1).optional(), + /** + * CIDR or IP allowlist for TCP peers. Empty = no IP allow restriction. + * Examples: ["10.0.0.0/8", "100.64.0.0/10"] for VPC + Tailscale. + */ + allowedCidrs: z.array(z.string().min(1).max(64)).max(64).default(relayDefaults.allowedCidrs), + /** + * Explicit deny CIDRs — evaluated before allow (deny wins). + * Example: ["203.0.113.0/24"] to block a guest / untrusted range. + */ + deniedCidrs: z.array(z.string().min(1).max(64)).max(64).default(relayDefaults.deniedCidrs), + /** + * Peer **source port** allowlist. Empty = any source port. + * For single-machine e2e: pin clients to fixed local ports and list them here. + */ + allowedPorts: z + .array(z.number().int().min(1).max(65535)) + .max(256) + .default(relayDefaults.allowedPorts), + /** + * When false, refuse bind to 0.0.0.0 / :: so the relay cannot listen on all + * interfaces. Use with MDM /etc/chorus/config.json for enterprise. + */ + allowOpenBind: z.boolean().default(relayDefaults.allowOpenBind), + /** + * When allowedCidrs is non-empty, still admit 127.0.0.0/8 and ::1 so the + * host plugin on the same machine can use /host. Source-port allowlists + * still apply to loopback peers. + */ + allowLoopback: z.boolean().default(relayDefaults.allowLoopback), }) .strict(); export const chorusBackupConfigSchema = z @@ -92,7 +133,7 @@ export const chorusOrgConfigSchema = z export const chorusConfigSchema = z .object({ security: chorusSecurityConfigSchema.default(securityDefaults), - relay: chorusRelayConfigSchema.default({}), + relay: chorusRelayConfigSchema.default(relayDefaults), backup: chorusBackupConfigSchema.default({}), org: chorusOrgConfigSchema.default({}), }) diff --git a/packages/plugin/dist/config/schema.js.map b/packages/plugin/dist/config/schema.js.map index d6c279a..179c65e 100644 --- a/packages/plugin/dist/config/schema.js.map +++ b/packages/plugin/dist/config/schema.js.map @@ -1 +1 @@ -{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/plugin/dist/index.d.ts.map b/packages/plugin/dist/index.d.ts.map index 7854a8c..0436ade 100644 --- a/packages/plugin/dist/index.d.ts.map +++ b/packages/plugin/dist/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/plugin/dist/index.js b/packages/plugin/dist/index.js index b16679a..44525d0 100644 --- a/packages/plugin/dist/index.js +++ b/packages/plugin/dist/index.js @@ -504,12 +504,42 @@ export default async function chorusPlugin(input) { } if (!sharing) { pendingQueue.clear(); + const bind = config.relay.bind ?? "0.0.0.0"; + if (config.relay.allowOpenBind === false && (bind === "0.0.0.0" || bind === "::" || bind === "[::]")) { + return JSON.stringify({ + shared: false, + error: "relay.allowOpenBind is false but relay.bind is open (0.0.0.0 / ::). " + + "Set relay.bind to a private address (or 127.0.0.1) in chorus.json.", + }); + } + relay.setNetworkOptions({ + bind, + allowedCidrs: config.relay.allowedCidrs, + deniedCidrs: config.relay.deniedCidrs, + allowedPorts: config.relay.allowedPorts, + allowOpenBind: config.relay.allowOpenBind, + allowLoopback: config.relay.allowLoopback, + }); await relay.start(); sharing = true; const where = relay.isExternal() ? `attached to external relay ${relay.getHost()}:${relay.getPort()}` - : `chorus relay started on port ${relay.getPort()}`; + : `chorus relay started on ${relay.getBind()}:${relay.getPort()}`; say(sid, where); + const netBits = []; + if (config.relay.allowedCidrs.length > 0) { + netBits.push(`allow ${config.relay.allowedCidrs.join(", ")}`); + } + if (config.relay.deniedCidrs.length > 0) { + netBits.push(`deny ${config.relay.deniedCidrs.join(", ")}`); + } + if (config.relay.allowedPorts.length > 0) { + netBits.push(`ports ${config.relay.allowedPorts.join(", ")}`); + } + if (netBits.length > 0) { + say(sid, `Network policy: ${netBits.join("; ")}` + + (config.relay.allowLoopback ? " (+ loopback IP)" : "")); + } } const repoRemote = detectRepoRemote(context.directory); if (config.security.requireRepoMatch && !repoRemote) { diff --git a/packages/plugin/dist/index.js.map b/packages/plugin/dist/index.js.map index 8174cea..ce42b67 100644 --- a/packages/plugin/dist/index.js.map +++ b/packages/plugin/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/plugin/dist/relay/index.d.ts b/packages/plugin/dist/relay/index.d.ts index 85cb286..1710d37 100644 --- a/packages/plugin/dist/relay/index.d.ts +++ b/packages/plugin/dist/relay/index.d.ts @@ -9,6 +9,26 @@ export type RelayServerOptions = { * When true, requires hostToken and does not spawn/kill a subprocess. */ external?: boolean; + /** Bind address passed to chorus-relay (default 0.0.0.0). */ + bind?: string; + /** CIDR/IP allowlist for TCP peers. */ + allowedCidrs?: string[]; + /** Explicit deny CIDRs (deny wins). */ + deniedCidrs?: string[]; + /** Peer source-port allowlist (single-machine e2e). */ + allowedPorts?: number[]; + /** Refuse 0.0.0.0 / :: bind when false. */ + allowOpenBind?: boolean; + /** Admit loopback IPs even when allowlist is set (default true). */ + allowLoopback?: boolean; +}; +export type RelayNetworkOptions = { + bind?: string; + allowedCidrs?: string[]; + deniedCidrs?: string[]; + allowedPorts?: number[]; + allowOpenBind?: boolean; + allowLoopback?: boolean; }; /** * Resolve relay connection settings from env. @@ -35,6 +55,12 @@ export declare class RelayServer { private clients; private readonly host; private readonly external; + private bind; + private allowedCidrs; + private deniedCidrs; + private allowedPorts; + private allowOpenBind; + private allowLoopback; private pendingToken; private onInjectInput?; private onChatMessage?; @@ -43,6 +69,8 @@ export declare class RelayServer { private onUserJoined?; private onUserLeft?; constructor(port: number, opts?: RelayServerOptions); + /** Apply network policy before start() (from project/org chorus.json). */ + setNetworkOptions(opts: RelayNetworkOptions): void; setInputHandler(fn: (content: string, userId: string, displayName?: string) => Promise): void; setChatHandler(fn: (displayName: string | undefined, content: string) => void): void; setTypingHandler(fn: (displayName: string | undefined) => void): void; @@ -78,6 +106,8 @@ export declare class RelayServer { get clientCount(): number; getPort(): number; getHost(): string; + getBind(): string; + getAllowedCidrs(): string[]; isExternal(): boolean; } //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/plugin/dist/relay/index.d.ts.map b/packages/plugin/dist/relay/index.d.ts.map index bed6fae..862f647 100644 --- a/packages/plugin/dist/relay/index.d.ts.map +++ b/packages/plugin/dist/relay/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/relay/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/relay/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/plugin/dist/relay/index.js b/packages/plugin/dist/relay/index.js index 09e0bb5..5c31c8a 100644 --- a/packages/plugin/dist/relay/index.js +++ b/packages/plugin/dist/relay/index.js @@ -65,6 +65,12 @@ export class RelayServer { clients = 0; host; external; + bind; + allowedCidrs; + deniedCidrs; + allowedPorts; + allowOpenBind; + allowLoopback; pendingToken = null; onInjectInput; onChatMessage; @@ -77,6 +83,27 @@ export class RelayServer { this.host = opts.host ?? "127.0.0.1"; this.external = Boolean(opts.external); this.hostToken = opts.hostToken ?? ""; + this.bind = opts.bind ?? "0.0.0.0"; + this.allowedCidrs = opts.allowedCidrs ? [...opts.allowedCidrs] : []; + this.deniedCidrs = opts.deniedCidrs ? [...opts.deniedCidrs] : []; + this.allowedPorts = opts.allowedPorts ? [...opts.allowedPorts] : []; + this.allowOpenBind = opts.allowOpenBind ?? true; + this.allowLoopback = opts.allowLoopback ?? true; + } + /** Apply network policy before start() (from project/org chorus.json). */ + setNetworkOptions(opts) { + if (opts.bind !== undefined) + this.bind = opts.bind; + if (opts.allowedCidrs !== undefined) + this.allowedCidrs = [...opts.allowedCidrs]; + if (opts.deniedCidrs !== undefined) + this.deniedCidrs = [...opts.deniedCidrs]; + if (opts.allowedPorts !== undefined) + this.allowedPorts = [...opts.allowedPorts]; + if (opts.allowOpenBind !== undefined) + this.allowOpenBind = opts.allowOpenBind; + if (opts.allowLoopback !== undefined) + this.allowLoopback = opts.allowLoopback; } setInputHandler(fn) { this.onInjectInput = fn; @@ -110,7 +137,28 @@ export class RelayServer { } this.hostToken = this.hostToken || randomBytes(32).toString("hex"); const bin = resolveRelayBin(); - this.child = spawn(bin, ["--port", String(this.port), "--bind", "0.0.0.0", "--host-token", this.hostToken], { + const args = [ + "--port", + String(this.port), + "--bind", + this.bind, + "--host-token", + this.hostToken, + "--allow-open-bind", + this.allowOpenBind ? "true" : "false", + "--allow-loopback", + this.allowLoopback ? "true" : "false", + ]; + for (const cidr of this.allowedCidrs) { + args.push("--allow-cidr", cidr); + } + for (const cidr of this.deniedCidrs) { + args.push("--deny-cidr", cidr); + } + for (const port of this.allowedPorts) { + args.push("--allow-port", String(port)); + } + this.child = spawn(bin, args, { stdio: ["ignore", "ignore", "pipe"], env: { ...process.env }, }); @@ -336,6 +384,12 @@ export class RelayServer { getHost() { return this.host; } + getBind() { + return this.bind; + } + getAllowedCidrs() { + return [...this.allowedCidrs]; + } isExternal() { return this.external; } diff --git a/packages/plugin/dist/relay/index.js.map b/packages/plugin/dist/relay/index.js.map index 821fab0..faa6183 100644 --- a/packages/plugin/dist/relay/index.js.map +++ b/packages/plugin/dist/relay/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/relay/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/relay/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/plugin/dist/tunnel/index.d.ts.map b/packages/plugin/dist/tunnel/index.d.ts.map index ec2a155..f61ef4c 100644 --- a/packages/plugin/dist/tunnel/index.d.ts.map +++ b/packages/plugin/dist/tunnel/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tunnel/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAIxE"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tunnel/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAIxE"} \ No newline at end of file diff --git a/packages/plugin/dist/tunnel/index.js b/packages/plugin/dist/tunnel/index.js index 8587113..391af6d 100644 --- a/packages/plugin/dist/tunnel/index.js +++ b/packages/plugin/dist/tunnel/index.js @@ -1,5 +1,6 @@ // LAN-only in the MVP. Remote tunnel support (bore/cloudflared) is reserved for a future phase. -// The relay server already binds to 0.0.0.0 so LAN access works without this module. +// The relay server binds according to relay.bind / CHORUS_BIND (default 0.0.0.0). +// Use relay.allowedCidrs + VPN/VPC controls for off-LAN lockdown — see docs/NETWORK.md. // eslint-disable-next-line @typescript-eslint/no-unused-vars export async function openTunnel(_localPort) { throw new Error("Remote tunneling is not yet implemented. Share your LAN IP and port directly."); diff --git a/packages/plugin/dist/tunnel/index.js.map b/packages/plugin/dist/tunnel/index.js.map index 67ddf1f..05e2484 100644 --- a/packages/plugin/dist/tunnel/index.js.map +++ b/packages/plugin/dist/tunnel/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tunnel/index.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,qFAAqF;AAOrF,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;AACJ,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tunnel/index.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,kFAAkF;AAClF,wFAAwF;AAOxF,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;AACJ,CAAC"} \ No newline at end of file diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 5b98e56..699eb47 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,6 +1,6 @@ { "name": "@chorus/plugin", - "version": "1.0.0", + "version": "2.0.0", "private": true, "type": "module", "main": "./dist/index.js", diff --git a/packages/plugin/src/config/load.ts b/packages/plugin/src/config/load.ts index 488618a..efc0580 100644 --- a/packages/plugin/src/config/load.ts +++ b/packages/plugin/src/config/load.ts @@ -65,7 +65,7 @@ export function systemConfigPath(): string { * 3. user file (`~/.config/chorus/config.json`) * 4. project file (`chorus.json` or `.chorus/config.json` under projectDir) * 5. explicit CHORUS_CONFIG path - * 6. selected environment overrides (relay port, public host, backup) + * 6. selected environment overrides (relay port/bind/allowlist, public host, backup) */ export function loadChorusConfig(projectDir?: string): LoadedChorusConfig { const sources: LoadedChorusConfig["sources"] = [{ kind: "defaults" }]; @@ -127,6 +127,39 @@ function applyEnvOverrides(config: ChorusConfig): { config: ChorusConfig; applie next.relay.publicHost = process.env["CHORUS_PUBLIC_HOST"]; applied = true; } + if (process.env["CHORUS_BIND"]) { + next.relay.bind = process.env["CHORUS_BIND"]; + applied = true; + } + if (process.env["CHORUS_ALLOWED_CIDRS"]) { + next.relay.allowedCidrs = process.env["CHORUS_ALLOWED_CIDRS"] + .split(",") + .map((s) => s.trim()) + .filter(Boolean); + applied = true; + } + if (process.env["CHORUS_DENIED_CIDRS"]) { + next.relay.deniedCidrs = process.env["CHORUS_DENIED_CIDRS"] + .split(",") + .map((s) => s.trim()) + .filter(Boolean); + applied = true; + } + if (process.env["CHORUS_ALLOWED_PORTS"]) { + next.relay.allowedPorts = process.env["CHORUS_ALLOWED_PORTS"] + .split(",") + .map((s) => parseInt(s.trim(), 10)) + .filter((n) => Number.isFinite(n) && n >= 1 && n <= 65535); + applied = true; + } + if (process.env["CHORUS_ALLOW_OPEN_BIND"] !== undefined) { + next.relay.allowOpenBind = parseEnvBool(process.env["CHORUS_ALLOW_OPEN_BIND"], true); + applied = true; + } + if (process.env["CHORUS_ALLOW_LOOPBACK"] !== undefined) { + next.relay.allowLoopback = parseEnvBool(process.env["CHORUS_ALLOW_LOOPBACK"], true); + applied = true; + } if (process.env["CHORUS_AWS_BUCKET"]) { next.backup.bucket = process.env["CHORUS_AWS_BUCKET"]; applied = true; @@ -143,6 +176,14 @@ function applyEnvOverrides(config: ChorusConfig): { config: ChorusConfig; applie return { config: next, applied }; } +function parseEnvBool(raw: string | undefined, fallback: boolean): boolean { + if (raw === undefined) return fallback; + const v = raw.trim().toLowerCase(); + if (["1", "true", "yes", "on"].includes(v)) return true; + if (["0", "false", "no", "off"].includes(v)) return false; + return fallback; +} + /** * Resolve effective requireApproval for a share invocation. * Enterprise lock: when allowSkipApproval is false, always use config.requireApproval. diff --git a/packages/plugin/src/config/schema.ts b/packages/plugin/src/config/schema.ts index 5a31c2e..7016685 100644 --- a/packages/plugin/src/config/schema.ts +++ b/packages/plugin/src/config/schema.ts @@ -66,11 +66,53 @@ export const chorusSecurityConfigSchema = z }) .strict(); +const relayDefaults = { + allowedCidrs: [] as string[], + deniedCidrs: [] as string[], + allowedPorts: [] as number[], + allowOpenBind: true, + allowLoopback: true, +}; + export const chorusRelayConfigSchema = z .object({ port: z.number().int().min(1).max(65535).optional(), /** Host:port advertised in join URLs (overrides LAN detection). */ publicHost: z.string().min(1).optional(), + /** + * Bind address for chorus-relay (default 0.0.0.0 for LAN). + * Prefer a private interface or 127.0.0.1 when only local/VPN peers should reach it. + */ + bind: z.string().min(1).optional(), + /** + * CIDR or IP allowlist for TCP peers. Empty = no IP allow restriction. + * Examples: ["10.0.0.0/8", "100.64.0.0/10"] for VPC + Tailscale. + */ + allowedCidrs: z.array(z.string().min(1).max(64)).max(64).default(relayDefaults.allowedCidrs), + /** + * Explicit deny CIDRs — evaluated before allow (deny wins). + * Example: ["203.0.113.0/24"] to block a guest / untrusted range. + */ + deniedCidrs: z.array(z.string().min(1).max(64)).max(64).default(relayDefaults.deniedCidrs), + /** + * Peer **source port** allowlist. Empty = any source port. + * For single-machine e2e: pin clients to fixed local ports and list them here. + */ + allowedPorts: z + .array(z.number().int().min(1).max(65535)) + .max(256) + .default(relayDefaults.allowedPorts), + /** + * When false, refuse bind to 0.0.0.0 / :: so the relay cannot listen on all + * interfaces. Use with MDM /etc/chorus/config.json for enterprise. + */ + allowOpenBind: z.boolean().default(relayDefaults.allowOpenBind), + /** + * When allowedCidrs is non-empty, still admit 127.0.0.0/8 and ::1 so the + * host plugin on the same machine can use /host. Source-port allowlists + * still apply to loopback peers. + */ + allowLoopback: z.boolean().default(relayDefaults.allowLoopback), }) .strict(); @@ -101,7 +143,7 @@ export const chorusOrgConfigSchema = z export const chorusConfigSchema = z .object({ security: chorusSecurityConfigSchema.default(securityDefaults), - relay: chorusRelayConfigSchema.default({}), + relay: chorusRelayConfigSchema.default(relayDefaults), backup: chorusBackupConfigSchema.default({}), org: chorusOrgConfigSchema.default({}), }) diff --git a/packages/plugin/src/index.ts b/packages/plugin/src/index.ts index 79d7f45..b6873d9 100644 --- a/packages/plugin/src/index.ts +++ b/packages/plugin/src/index.ts @@ -645,12 +645,46 @@ export default async function chorusPlugin(input: PluginInput) { if (!sharing) { pendingQueue.clear(); + const bind = config.relay.bind ?? "0.0.0.0"; + if (config.relay.allowOpenBind === false && (bind === "0.0.0.0" || bind === "::" || bind === "[::]")) { + return JSON.stringify({ + shared: false, + error: + "relay.allowOpenBind is false but relay.bind is open (0.0.0.0 / ::). " + + "Set relay.bind to a private address (or 127.0.0.1) in chorus.json.", + }); + } + relay.setNetworkOptions({ + bind, + allowedCidrs: config.relay.allowedCidrs, + deniedCidrs: config.relay.deniedCidrs, + allowedPorts: config.relay.allowedPorts, + allowOpenBind: config.relay.allowOpenBind, + allowLoopback: config.relay.allowLoopback, + }); await relay.start(); sharing = true; const where = relay.isExternal() ? `attached to external relay ${relay.getHost()}:${relay.getPort()}` - : `chorus relay started on port ${relay.getPort()}`; + : `chorus relay started on ${relay.getBind()}:${relay.getPort()}`; say(sid, where); + const netBits: string[] = []; + if (config.relay.allowedCidrs.length > 0) { + netBits.push(`allow ${config.relay.allowedCidrs.join(", ")}`); + } + if (config.relay.deniedCidrs.length > 0) { + netBits.push(`deny ${config.relay.deniedCidrs.join(", ")}`); + } + if (config.relay.allowedPorts.length > 0) { + netBits.push(`ports ${config.relay.allowedPorts.join(", ")}`); + } + if (netBits.length > 0) { + say( + sid, + `Network policy: ${netBits.join("; ")}` + + (config.relay.allowLoopback ? " (+ loopback IP)" : "") + ); + } } const repoRemote = detectRepoRemote(context.directory); diff --git a/packages/plugin/src/relay/index.ts b/packages/plugin/src/relay/index.ts index fa202d0..5e9d00c 100644 --- a/packages/plugin/src/relay/index.ts +++ b/packages/plugin/src/relay/index.ts @@ -37,6 +37,27 @@ export type RelayServerOptions = { * When true, requires hostToken and does not spawn/kill a subprocess. */ external?: boolean; + /** Bind address passed to chorus-relay (default 0.0.0.0). */ + bind?: string; + /** CIDR/IP allowlist for TCP peers. */ + allowedCidrs?: string[]; + /** Explicit deny CIDRs (deny wins). */ + deniedCidrs?: string[]; + /** Peer source-port allowlist (single-machine e2e). */ + allowedPorts?: number[]; + /** Refuse 0.0.0.0 / :: bind when false. */ + allowOpenBind?: boolean; + /** Admit loopback IPs even when allowlist is set (default true). */ + allowLoopback?: boolean; +}; + +export type RelayNetworkOptions = { + bind?: string; + allowedCidrs?: string[]; + deniedCidrs?: string[]; + allowedPorts?: number[]; + allowOpenBind?: boolean; + allowLoopback?: boolean; }; function parseRelayHost(raw: string | undefined, fallbackPort: number): { host: string; port: number } { @@ -89,6 +110,12 @@ export class RelayServer { private clients = 0; private readonly host: string; private readonly external: boolean; + private bind: string; + private allowedCidrs: string[]; + private deniedCidrs: string[]; + private allowedPorts: number[]; + private allowOpenBind: boolean; + private allowLoopback: boolean; private pendingToken: { resolve: (t: SessionToken) => void; reject: (e: Error) => void; @@ -108,6 +135,22 @@ export class RelayServer { this.host = opts.host ?? "127.0.0.1"; this.external = Boolean(opts.external); this.hostToken = opts.hostToken ?? ""; + this.bind = opts.bind ?? "0.0.0.0"; + this.allowedCidrs = opts.allowedCidrs ? [...opts.allowedCidrs] : []; + this.deniedCidrs = opts.deniedCidrs ? [...opts.deniedCidrs] : []; + this.allowedPorts = opts.allowedPorts ? [...opts.allowedPorts] : []; + this.allowOpenBind = opts.allowOpenBind ?? true; + this.allowLoopback = opts.allowLoopback ?? true; + } + + /** Apply network policy before start() (from project/org chorus.json). */ + setNetworkOptions(opts: RelayNetworkOptions): void { + if (opts.bind !== undefined) this.bind = opts.bind; + if (opts.allowedCidrs !== undefined) this.allowedCidrs = [...opts.allowedCidrs]; + if (opts.deniedCidrs !== undefined) this.deniedCidrs = [...opts.deniedCidrs]; + if (opts.allowedPorts !== undefined) this.allowedPorts = [...opts.allowedPorts]; + if (opts.allowOpenBind !== undefined) this.allowOpenBind = opts.allowOpenBind; + if (opts.allowLoopback !== undefined) this.allowLoopback = opts.allowLoopback; } setInputHandler( @@ -154,14 +197,32 @@ export class RelayServer { this.hostToken = this.hostToken || randomBytes(32).toString("hex"); const bin = resolveRelayBin(); - this.child = spawn( - bin, - ["--port", String(this.port), "--bind", "0.0.0.0", "--host-token", this.hostToken], - { - stdio: ["ignore", "ignore", "pipe"], - env: { ...process.env }, - } - ); + const args = [ + "--port", + String(this.port), + "--bind", + this.bind, + "--host-token", + this.hostToken, + "--allow-open-bind", + this.allowOpenBind ? "true" : "false", + "--allow-loopback", + this.allowLoopback ? "true" : "false", + ]; + for (const cidr of this.allowedCidrs) { + args.push("--allow-cidr", cidr); + } + for (const cidr of this.deniedCidrs) { + args.push("--deny-cidr", cidr); + } + for (const port of this.allowedPorts) { + args.push("--allow-port", String(port)); + } + + this.child = spawn(bin, args, { + stdio: ["ignore", "ignore", "pipe"], + env: { ...process.env }, + }); this.child.on("exit", () => { this.running = false; @@ -424,6 +485,14 @@ export class RelayServer { return this.host; } + getBind(): string { + return this.bind; + } + + getAllowedCidrs(): string[] { + return [...this.allowedCidrs]; + } + isExternal(): boolean { return this.external; } diff --git a/packages/plugin/src/tunnel/index.ts b/packages/plugin/src/tunnel/index.ts index 201aa42..c8eab08 100644 --- a/packages/plugin/src/tunnel/index.ts +++ b/packages/plugin/src/tunnel/index.ts @@ -1,5 +1,6 @@ // LAN-only in the MVP. Remote tunnel support (bore/cloudflared) is reserved for a future phase. -// The relay server already binds to 0.0.0.0 so LAN access works without this module. +// The relay server binds according to relay.bind / CHORUS_BIND (default 0.0.0.0). +// Use relay.allowedCidrs + VPN/VPC controls for off-LAN lockdown — see docs/NETWORK.md. export interface TunnelInfo { publicUrl: string; diff --git a/packages/plugin/test/config.test.ts b/packages/plugin/test/config.test.ts index a2c3242..f7e7b93 100644 --- a/packages/plugin/test/config.test.ts +++ b/packages/plugin/test/config.test.ts @@ -39,6 +39,12 @@ describe("parseChorusConfig", () => { defaultRole: "view", tokenTtlMs: 3600000, }, + relay: { + bind: "10.0.0.5", + allowOpenBind: false, + allowedCidrs: ["10.0.0.0/8", "100.64.0.0/10"], + allowLoopback: true, + }, }); expect(cfg.org.name).toBe("Acme"); expect(cfg.security.allowSkipApproval).toBe(false); @@ -51,6 +57,31 @@ describe("parseChorusConfig", () => { ]); expect(cfg.security.defaultRole).toBe("view"); expect(cfg.security.tokenTtlMs).toBe(3600000); + expect(cfg.relay.bind).toBe("10.0.0.5"); + expect(cfg.relay.allowOpenBind).toBe(false); + expect(cfg.relay.allowedCidrs).toEqual(["10.0.0.0/8", "100.64.0.0/10"]); + expect(cfg.relay.allowLoopback).toBe(true); + }); + + it("defaults relay network knobs to LAN-friendly", () => { + const cfg = parseChorusConfig({}); + expect(cfg.relay.allowedCidrs).toEqual([]); + expect(cfg.relay.deniedCidrs).toEqual([]); + expect(cfg.relay.allowedPorts).toEqual([]); + expect(cfg.relay.allowOpenBind).toBe(true); + expect(cfg.relay.allowLoopback).toBe(true); + expect(cfg.relay.bind).toBeUndefined(); + }); + + it("accepts deny CIDRs and source-port allowlist", () => { + const cfg = parseChorusConfig({ + relay: { + deniedCidrs: ["203.0.113.0/24"], + allowedPorts: [18201, 18202], + }, + }); + expect(cfg.relay.deniedCidrs).toEqual(["203.0.113.0/24"]); + expect(cfg.relay.allowedPorts).toEqual([18201, 18202]); }); it("rejects unknown top-level keys", () => { @@ -127,6 +158,9 @@ describe("loadChorusConfig", () => { const prevSystem = process.env["CHORUS_SYSTEM_CONFIG"]; const prevUser = process.env["CHORUS_USER_CONFIG"]; const prevPort = process.env["CHORUS_PORT"]; + const prevBind = process.env["CHORUS_BIND"]; + const prevCidrs = process.env["CHORUS_ALLOWED_CIDRS"]; + const prevOpenBind = process.env["CHORUS_ALLOW_OPEN_BIND"]; let root: string; beforeEach(() => { @@ -134,6 +168,9 @@ describe("loadChorusConfig", () => { mkdirSync(root, { recursive: true }); delete process.env["CHORUS_CONFIG"]; delete process.env["CHORUS_PORT"]; + delete process.env["CHORUS_BIND"]; + delete process.env["CHORUS_ALLOWED_CIDRS"]; + delete process.env["CHORUS_ALLOW_OPEN_BIND"]; // Isolate from real machine /etc and ~/.config during unit tests. process.env["CHORUS_SYSTEM_CONFIG"] = join(root, "missing-system.json"); process.env["CHORUS_USER_CONFIG"] = join(root, "missing-user.json"); @@ -149,6 +186,12 @@ describe("loadChorusConfig", () => { else process.env["CHORUS_USER_CONFIG"] = prevUser; if (prevPort === undefined) delete process.env["CHORUS_PORT"]; else process.env["CHORUS_PORT"] = prevPort; + if (prevBind === undefined) delete process.env["CHORUS_BIND"]; + else process.env["CHORUS_BIND"] = prevBind; + if (prevCidrs === undefined) delete process.env["CHORUS_ALLOWED_CIDRS"]; + else process.env["CHORUS_ALLOWED_CIDRS"] = prevCidrs; + if (prevOpenBind === undefined) delete process.env["CHORUS_ALLOW_OPEN_BIND"]; + else process.env["CHORUS_ALLOW_OPEN_BIND"] = prevOpenBind; }); it("loads project chorus.json", () => { @@ -193,6 +236,17 @@ describe("loadChorusConfig", () => { expect(loaded.sources.some((s) => s.kind === "env")).toBe(true); }); + it("applies network allowlist env overrides", () => { + writeFileSync(join(root, "chorus.json"), JSON.stringify({ relay: { port: 7742 } })); + process.env["CHORUS_BIND"] = "10.0.0.5"; + process.env["CHORUS_ALLOWED_CIDRS"] = "10.0.0.0/8, 100.64.0.0/10"; + process.env["CHORUS_ALLOW_OPEN_BIND"] = "false"; + const loaded = loadChorusConfig(root); + expect(loaded.config.relay.bind).toBe("10.0.0.5"); + expect(loaded.config.relay.allowedCidrs).toEqual(["10.0.0.0/8", "100.64.0.0/10"]); + expect(loaded.config.relay.allowOpenBind).toBe(false); + }); + it("loads .chorus/config.json when chorus.json is absent", () => { mkdirSync(join(root, ".chorus"), { recursive: true }); writeFileSync( diff --git a/scripts/network-e2e.ts b/scripts/network-e2e.ts new file mode 100644 index 0000000..6cf61b6 --- /dev/null +++ b/scripts/network-e2e.ts @@ -0,0 +1,215 @@ +#!/usr/bin/env bun +/** + * Network-constraint e2e (single-machine). + * + * Spawns chorus-relay with: + * - source-port allowlist: PORT_A + PORT_B admitted, PORT_C denied + * - deny CIDR: 203.0.113.0/24 (documentation range; not exercised on loopback) + * - then a second relay with deny 127.0.0.0/8 to prove deny wins on loopback + * + * Clients bind fixed local ports so peers are distinguishable on 127.0.0.1. + * + * Usage: + * bun run test:network-e2e + * # or: bun scripts/network-e2e.ts + */ +import { spawn, type ChildProcess } from "node:child_process"; +import { createHash, randomBytes } from "node:crypto"; +import { existsSync } from "node:fs"; +import { createConnection, type Socket } from "node:net"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const REPO = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const RELAY_PORT = parseInt(process.env["NETWORK_E2E_RELAY_PORT"] ?? "18780", 10); +const PORT_A = parseInt(process.env["NETWORK_E2E_PORT_A"] ?? "18201", 10); +const PORT_B = parseInt(process.env["NETWORK_E2E_PORT_B"] ?? "18202", 10); +const PORT_C = parseInt(process.env["NETWORK_E2E_PORT_C"] ?? "18203", 10); +const DENY_RELAY_PORT = RELAY_PORT + 1; + +function resolveRelayBin(): string { + if (process.env["CHORUS_RELAY_BIN"]) return process.env["CHORUS_RELAY_BIN"]; + for (const p of [ + join(REPO, "target/release/chorus-relay"), + join(REPO, "target/debug/chorus-relay"), + ]) { + if (existsSync(p)) return p; + } + return "chorus-relay"; +} + +function sleep(ms: number): Promise { + return new Promise((r) => setTimeout(r, ms)); +} + +async function waitReady(port: number, timeoutMs = 8000): Promise { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + try { + // Any TCP accept means the listener is up (status may be 403 under policy). + await new Promise((resolve, reject) => { + const s = createConnection({ host: "127.0.0.1", port }, () => { + s.end(); + resolve(); + }); + s.on("error", reject); + }); + return; + } catch { + await sleep(40); + } + } + throw new Error(`relay not ready on ${port}`); +} + +function startRelay(args: string[]): { child: ChildProcess; hostToken: string } { + const hostToken = randomBytes(32).toString("hex"); + const bin = resolveRelayBin(); + const child = spawn( + bin, + ["--port", String(args[0]), "--bind", "127.0.0.1", "--host-token", hostToken, ...args.slice(1)], + { stdio: ["ignore", "ignore", "pipe"] } + ); + child.stderr?.on("data", () => {}); + return { child, hostToken }; +} + +async function httpStatus( + relayPort: number, + localPort: number +): Promise<{ status: number; body: string; peerPort: number }> { + return new Promise((resolve, reject) => { + const socket: Socket = createConnection({ + host: "127.0.0.1", + port: relayPort, + localAddress: "127.0.0.1", + localPort, + }); + let buf = ""; + socket.setEncoding("utf8"); + socket.on("connect", () => { + socket.write(`GET /status HTTP/1.0\r\nHost: 127.0.0.1:${relayPort}\r\n\r\n`); + }); + socket.on("data", (chunk) => { + buf += chunk; + }); + socket.on("end", () => { + const status = parseInt(buf.split(" ")[1] ?? "0", 10) || 0; + resolve({ status, body: buf, peerPort: localPort }); + }); + socket.on("error", reject); + setTimeout(() => { + socket.destroy(); + reject(new Error(`timeout talking to relay from local port ${localPort}`)); + }, 5000).unref?.(); + }); +} + +async function wsUpgrade( + relayPort: number, + localPort: number +): Promise<{ ok: boolean; status: number; body: string }> { + const key = randomBytes(16).toString("base64"); + return new Promise((resolve, reject) => { + const socket = createConnection({ + host: "127.0.0.1", + port: relayPort, + localAddress: "127.0.0.1", + localPort, + }); + let buf = Buffer.alloc(0); + socket.on("connect", () => { + socket.write( + `GET /ws HTTP/1.1\r\nHost: 127.0.0.1:${relayPort}\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: ${key}\r\nSec-WebSocket-Version: 13\r\n\r\n` + ); + }); + socket.on("data", (chunk) => { + buf = Buffer.concat([buf, chunk]); + const text = buf.toString("utf8"); + if (!text.includes("\r\n\r\n")) return; + const status = parseInt(text.split(" ")[1] ?? "0", 10) || 0; + const accept = createHash("sha1") + .update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11") + .digest("base64"); + const ok = status === 101 && text.includes(accept); + socket.destroy(); + resolve({ ok, status, body: text.slice(0, 300) }); + }); + socket.on("error", reject); + setTimeout(() => { + socket.destroy(); + reject(new Error(`ws timeout from local port ${localPort}`)); + }, 5000).unref?.(); + }); +} + +function assert(cond: unknown, msg: string): asserts cond { + if (!cond) throw new Error(msg); +} + +async function scenarioPortAllowlist(): Promise { + console.log(`\n→ scenario: source ports A=${PORT_A} B=${PORT_B} allow, C=${PORT_C} deny`); + const { child } = startRelay([ + String(RELAY_PORT), + "--allow-port", + String(PORT_A), + "--allow-port", + String(PORT_B), + "--deny-cidr", + "203.0.113.0/24", + ]); + try { + await waitReady(RELAY_PORT); + const status = await httpStatus(RELAY_PORT, PORT_A); + assert(status.status === 200, `A /status expected 200, got ${status.status}`); + assert(status.body.includes('"restricted":true'), "status should report restricted"); + assert(status.body.includes("18201") || status.body.includes(String(PORT_A)), "status lists ports"); + + const a = await wsUpgrade(RELAY_PORT, PORT_A); + assert(a.ok, `port A ws should upgrade: ${a.status} ${a.body}`); + console.log(` ✓ port A (${PORT_A}) admitted`); + + const b = await wsUpgrade(RELAY_PORT, PORT_B); + assert(b.ok, `port B ws should upgrade: ${b.status} ${b.body}`); + console.log(` ✓ port B (${PORT_B}) admitted`); + + const cHttp = await httpStatus(RELAY_PORT, PORT_C); + assert(cHttp.status === 403, `port C /status expected 403, got ${cHttp.status}`); + const cWs = await wsUpgrade(RELAY_PORT, PORT_C).catch((e) => ({ + ok: false, + status: 0, + body: String(e), + })); + assert(!cWs.ok && (cWs.status === 403 || cWs.status === 0), `port C ws should fail, got ${cWs.status}`); + console.log(` ✓ port C (${PORT_C}) denied`); + } finally { + child.kill("SIGTERM"); + await sleep(100); + } +} + +async function scenarioDenyLoopback(): Promise { + console.log(`\n→ scenario: deny 127.0.0.0/8 blocks loopback peers`); + const { child } = startRelay([String(DENY_RELAY_PORT), "--deny-cidr", "127.0.0.0/8"]); + try { + await waitReady(DENY_RELAY_PORT); + const res = await httpStatus(DENY_RELAY_PORT, PORT_A); + assert(res.status === 403, `deny loopback expected 403, got ${res.status}: ${res.body}`); + console.log(` ✓ deny CIDR blocked loopback (403)`); + } finally { + child.kill("SIGTERM"); + await sleep(100); + } +} + +async function main() { + console.log(`network-e2e using ${resolveRelayBin()}`); + await scenarioPortAllowlist(); + await scenarioDenyLoopback(); + console.log("\n✓ network-e2e passed"); +} + +main().catch((err) => { + console.error("\n✗ network-e2e failed:", err instanceof Error ? err.message : err); + process.exit(1); +});