diff options
author | Jake McGinty <me@jake.su> | 2018-04-02 01:59:56 -0700 |
---|---|---|
committer | Jake McGinty <me@jake.su> | 2018-04-02 01:59:56 -0700 |
commit | fc7ab96841b119b5c9a3c30039bcbd69c801d8ad (patch) | |
tree | 7b6de392a2b6d74d7480435199ea0248d0cb6db4 | |
parent | config: return error when trying to remove nonexistent peer (diff) | |
download | wireguard-rs-fc7ab96841b119b5c9a3c30039bcbd69c801d8ad.tar.xz wireguard-rs-fc7ab96841b119b5c9a3c30039bcbd69c801d8ad.zip |
config: handle self-add peer case
-rw-r--r-- | src/interface/config.rs | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/src/interface/config.rs b/src/interface/config.rs index 3dda7a9..1768aaa 100644 --- a/src/interface/config.rs +++ b/src/interface/config.rs @@ -211,27 +211,38 @@ impl ConfigurationService { }) } + fn clear_peer_refs(state: &mut State, peer: &Peer) { + for index in peer.get_mapped_indices() { + let _ = state.index_map.remove(&index); + } + state.router.remove_allowed_ips(&peer.info.allowed_ips); + } + pub fn handle_update(state: &mut State, event: &UpdateEvent) -> Result<(), Error> { match *event { UpdateEvent::PrivateKey(private_key) => { let pub_key = x25519::generate_public(&private_key); - info!("set pubkey: {}", base64::encode(pub_key.as_bytes())); state.interface_info.private_key = Some(private_key); - state.interface_info.pub_key = Some(*pub_key.as_bytes()); - debug!("set new private key."); + state.interface_info.pub_key = Some(*pub_key.as_bytes()); + debug!("set new private key (pub: {}).", base64::encode(pub_key.as_bytes())); + + if let Some(peer_ref) = state.pubkey_map.remove(&*pub_key.as_bytes()) { + Self::clear_peer_refs(state, &peer_ref.borrow()); + debug!("removed self from peers"); + } }, UpdateEvent::ListenPort(port) => { state.interface_info.listen_port = Some(port); - info!("set listen port: {}", port); + debug!("set listen port: {}", port); }, UpdateEvent::Fwmark(mark) => { state.interface_info.fwmark = Some(mark); - info!("set fwmark: {}", mark); + debug!("set fwmark: {}", mark); } UpdateEvent::UpdatePeer(ref info, replace_allowed_ips) => { let existing_peer = state.pubkey_map.get(&info.pub_key).cloned(); if let Some(peer_ref) = existing_peer { - info!("updating peer: {}", info); + debug!("updating peer: {}", info); let mut peer = peer_ref.borrow_mut(); let mut info = info.clone(); if replace_allowed_ips { @@ -244,7 +255,13 @@ impl ConfigurationService { state.router.add_allowed_ips(&info.allowed_ips, &peer_ref); peer.info = info; } else { - info!("adding new peer: {}", info); + if let Some(pub_key) = state.interface_info.pub_key { + if pub_key == info.pub_key { + debug!("ignoring self-peer add"); + return Ok(()) + } + } + debug!("adding new peer: {}", info); let mut peer = Peer::new(info.clone()); let peer_ref = Rc::new(RefCell::new(peer)); let _ = state.pubkey_map.insert(info.pub_key, peer_ref.clone()); @@ -259,13 +276,7 @@ impl ConfigurationService { UpdateEvent::RemovePeer(pub_key) => { let peer_ref = state.pubkey_map.remove(&pub_key) .ok_or_else(|| err_msg("trying to remove nonexistent peer"))?; - let peer = peer_ref.borrow(); - let indices = peer.get_mapped_indices(); - - for index in indices { - let _ = state.index_map.remove(&index); - } - state.router.remove_allowed_ips(&peer.info.allowed_ips); + Self::clear_peer_refs(state, &peer_ref.borrow()); }, } Ok(()) @@ -349,7 +360,7 @@ impl Drop for ConfigurationService { socket_path.push(&self.interface_name); socket_path.set_extension("sock"); if socket_path.exists() { - info!("Removing socket on drop: {}", socket_path.display()); + debug!("Removing socket on drop: {}", socket_path.display()); let _ = remove_file(&socket_path); } } |