From: Ian Jackson Date: Sat, 21 Aug 2021 23:16:59 +0000 (+0100) Subject: introduce MayRoute (loop prevention) X-Git-Tag: hippotat/1.0.0~122 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=c88fd455f807912f4780179a49b2630ca4bdea1b;p=hippotat.git introduce MayRoute (loop prevention) Signed-off-by: Ian Jackson --- diff --git a/server/server.rs b/server/server.rs index cfceef6..3093684 100644 --- a/server/server.rs +++ b/server/server.rs @@ -38,10 +38,21 @@ pub struct RoutedPacket { // not MIME data, valid SLIP (checked) pub type RoutedPacketData = Box<[u8]>; +// loop prevention +mod may_route { + #[derive(Clone,Debug)] + pub struct MayRoute(()); + impl MayRoute { + pub fn came_from_outside_hippotatd() -> Self { Self(()) } + } +} +pub use may_route::MayRoute; + #[throws(PacketError)] pub async fn route_packet(global: &Global, conn: &str, source: Option<&ClientName>, - packet: RoutedPacketData, daddr: IpAddr) + packet: RoutedPacketData, daddr: IpAddr, + _may_route: MayRoute) { let c = &global.config; let len = packet.len(); diff --git a/server/suser.rs b/server/suser.rs index dec1a5a..5b7ab0f 100644 --- a/server/suser.rs +++ b/server/suser.rs @@ -66,7 +66,7 @@ pub async fn run(global: Arc, let WebRequest { initial, initial_remaining, length_hint, mut body, boundary_finder, - reply_to, conn, mut warnings, + reply_to, conn, mut warnings, may_route, } = req.ok_or_else(|| anyhow!("webservers all shut down!"))?; match async { @@ -142,7 +142,8 @@ pub async fn run(global: Arc, let daddr = ip_packet_addr::(header)?; Ok(daddr) }, |(daddr,packet)| route_packet( - &global, &conn, Some(&ic.link.client), daddr,packet + &global, &conn, Some(&ic.link.client), daddr, + packet, may_route.clone(), ), |e| Ok::<_,SlipFramesError<_>>({ warnings.add(&e)?; }) ).await?; diff --git a/server/sweb.rs b/server/sweb.rs index 157261a..d4e825e 100644 --- a/server/sweb.rs +++ b/server/sweb.rs @@ -19,6 +19,7 @@ pub struct WebRequest { pub reply_to: oneshot::Sender, pub warnings: Warnings, pub conn: Arc, + pub may_route: MayRoute, } /// Reply from client task to hyper worker pool task @@ -188,6 +189,7 @@ pub async fn handle( warnings: mem::take(&mut warnings), reply_to, conn: conn.clone(), + may_route: MayRoute::came_from_outside_hippotatd(), }; client.web.try_send(wreq)