aboutsummaryrefslogtreecommitdiffstats
path: root/src/interface
diff options
context:
space:
mode:
authorJake McGinty <me@jake.su>2018-02-14 14:55:19 +0000
committerJake McGinty <me@jake.su>2018-02-14 14:55:19 +0000
commitf963960a6044c770b7b40f6cd54dc9b19df0049f (patch)
tree3bfd83c408f84f85298ace781f02ecf8f4ac4094 /src/interface
parentdeshittify the config parser (diff)
downloadwireguard-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.rs16
-rw-r--r--src/interface/mod.rs7
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(())