diff options
author | 2018-02-14 14:55:19 +0000 | |
---|---|---|
committer | 2018-02-14 14:55:19 +0000 | |
commit | f963960a6044c770b7b40f6cd54dc9b19df0049f (patch) | |
tree | 3bfd83c408f84f85298ace781f02ecf8f4ac4094 /src/interface | |
parent | deshittify the config parser (diff) | |
download | wireguard-rs-f963960a6044c770b7b40f6cd54dc9b19df0049f.tar.xz wireguard-rs-f963960a6044c770b7b40f6cd54dc9b19df0049f.zip |
scaffolding for remove_peer config support
Diffstat (limited to 'src/interface')
-rw-r--r-- | src/interface/config.rs | 16 | ||||
-rw-r--r-- | src/interface/mod.rs | 7 |
2 files changed, 17 insertions, 6 deletions
diff --git a/src/interface/config.rs b/src/interface/config.rs index 73f445e..a0ebfdb 100644 --- a/src/interface/config.rs +++ b/src/interface/config.rs @@ -41,6 +41,7 @@ impl UpdateEvent { fn from(items: Vec<(String, String)>) -> Result<Vec<UpdateEvent>, Error> { let mut events = vec![]; let mut pending_peer = false; + let mut remove_pending_peer = false; let mut info = PeerInfo::default(); for (key, value) in items { @@ -48,15 +49,20 @@ impl UpdateEvent { "private_key" => { events.push(UpdateEvent::PrivateKey(<[u8; 32]>::from_hex(&value)?)); }, "listen_port" => { events.push(UpdateEvent::ListenPort(value.parse()?)); }, "public_key" => { - if pending_peer { - events.push(UpdateEvent::UpdatePeer(mem::replace(&mut info, PeerInfo::default()))); + let peer_info = mem::replace(&mut info, PeerInfo::default()); + match (pending_peer, remove_pending_peer) { + (true, true) => events.push(UpdateEvent::RemovePeer(peer_info.pub_key)), + (true, false) => events.push(UpdateEvent::UpdatePeer(peer_info)), + _ => {} } info.pub_key = <[u8; 32]>::from_hex(&value)?; pending_peer = true; + remove_pending_peer = false; }, "preshared_key" => { info.psk = Some(<[u8; 32]>::from_hex(&value)?); }, "persistent_keepalive_interval" => { info.keep_alive_interval = Some(value.parse()?); }, "endpoint" => { info.endpoint = Some(value.parse()?); }, + "remove" => { remove_pending_peer = true; } "allowed_ip" => { let (ip, cidr) = value.split_at(value.find('/').ok_or_else(|| format_err!("ip/cidr format error"))?); info.allowed_ips.push((ip.parse()?, (&cidr[1..]).parse()?)) @@ -66,8 +72,10 @@ impl UpdateEvent { } // "flush" the final peer if there is one - if pending_peer { - events.push(UpdateEvent::UpdatePeer(info)); + match (pending_peer, remove_pending_peer) { + (true, true) => events.push(UpdateEvent::RemovePeer(info.pub_key)), + (true, false) => events.push(UpdateEvent::UpdatePeer(info)), + _ => {} } trace!("events {:?}", events); Ok(events) diff --git a/src/interface/mod.rs b/src/interface/mod.rs index 4a091c1..aa55c29 100644 --- a/src/interface/mod.rs +++ b/src/interface/mod.rs @@ -145,7 +145,7 @@ impl Interface { let state = self.state.clone(); move |(stream, _)| { let (sink, stream) = stream.framed(ConfigurationCodec {}).split(); - debug!("UnixServer connection."); + trace!("UnixServer connection."); let handle = h.clone(); let responses = stream.and_then({ @@ -218,7 +218,10 @@ impl Interface { handle.spawn(tx.clone().send((info.endpoint.unwrap(), init_packet)).then(|_| Ok(()))); debug!("sent handshake packet to new peer"); }, - _ => unimplemented!() + UpdateEvent::RemovePeer(_pub_key) => { + warn!("RemovePeer event not yet handled"); + }, + _ => warn!("unhandled UpdateEvent received") } future::ok(()) |