diff options
| author | Linus Färnstrand <linus@mullvad.net> | 2017-05-23 14:25:47 +0200 |
|---|---|---|
| committer | Linus Färnstrand <linus@mullvad.net> | 2017-05-23 14:28:43 +0200 |
| commit | 5c30d7757d295e280626173e33cf2ff3f9ad5550 (patch) | |
| tree | a7771661b963e8ff857d508f9a0981d0f2389936 | |
| parent | 830a4c95ebc0fd7c051529b43e7cad972ba4dd2d (diff) | |
| download | mullvadvpn-5c30d7757d295e280626173e33cf2ff3f9ad5550.tar.xz mullvadvpn-5c30d7757d295e280626173e33cf2ff3f9ad5550.zip | |
Change to safe conversion from OpenVpnEvent
| -rw-r--r-- | talpid_core/src/tunnel/mod.rs | 37 | ||||
| -rw-r--r-- | talpid_core/src/tunnel/openvpn.rs | 1 |
2 files changed, 24 insertions, 14 deletions
diff --git a/talpid_core/src/tunnel/mod.rs b/talpid_core/src/tunnel/mod.rs index 27ce11c1f6..5de530746d 100644 --- a/talpid_core/src/tunnel/mod.rs +++ b/talpid_core/src/tunnel/mod.rs @@ -34,23 +34,26 @@ pub enum TunnelEvent { Shutdown, } -impl From<OpenVpnEvent> for TunnelEvent { - /// TODO(linus): When we know better which events we need and what data they must carry - /// this can be implemented in a better way. - fn from(openvpn_event: OpenVpnEvent) -> Self { - match openvpn_event { - OpenVpnEvent::PluginEvent(event, _) => { - match event { - OpenVpnPluginEvent::Up => TunnelEvent::Up, - OpenVpnPluginEvent::RoutePredown => TunnelEvent::Down, - _ => panic!("Unsupported event. This should not happen"), - } - } - OpenVpnEvent::Shutdown(_) => TunnelEvent::Shutdown, +impl TunnelEvent { + /// Converts an `OpenVpnEvent` to a `TunnelEvent`. + /// Returns `None` if there is no corresponding `TunnelEvent`. + pub fn from_openvpn_event(event: &OpenVpnEvent) -> Option<TunnelEvent> { + match *event { + OpenVpnEvent::PluginEvent(ref event, _) => Self::from_openvpn_plugin_event(event), + OpenVpnEvent::Shutdown(_) => Some(TunnelEvent::Shutdown), + } + } + + fn from_openvpn_plugin_event(event: &OpenVpnPluginEvent) -> Option<TunnelEvent> { + match *event { + OpenVpnPluginEvent::Up => Some(TunnelEvent::Up), + OpenVpnPluginEvent::RoutePredown => Some(TunnelEvent::Down), + _ => None, } } } + /// Abstraction for monitoring a generic VPN tunnel. pub struct TunnelMonitor { monitor: OpenVpnMonitor, @@ -61,7 +64,13 @@ impl TunnelMonitor { pub fn new<L>(on_event: L) -> Result<Self> where L: Fn(TunnelEvent) + Send + Sync + 'static { - let openvpn_on_event = move |openvpn_event| on_event(TunnelEvent::from(openvpn_event)); + let openvpn_on_event = move |openvpn_event| { + if let Some(tunnel_event) = TunnelEvent::from_openvpn_event(&openvpn_event) { + on_event(tunnel_event); + } else { + debug!("Ignoring OpenVpnEvent {:?}", openvpn_event); + } + }; let monitor = openvpn::OpenVpnMonitor::new(openvpn_on_event, get_plugin_path()) .chain_err(|| ErrorKind::TunnelMonitoringError)?; Ok(TunnelMonitor { monitor }) diff --git a/talpid_core/src/tunnel/openvpn.rs b/talpid_core/src/tunnel/openvpn.rs index bcf89e3eb0..9d366ebb4a 100644 --- a/talpid_core/src/tunnel/openvpn.rs +++ b/talpid_core/src/tunnel/openvpn.rs @@ -33,6 +33,7 @@ pub use self::errors::*; /// Possible events from OpenVPN +#[derive(Debug)] pub enum OpenVpnEvent { /// An event from the plugin loaded into OpenVPN. PluginEvent(openvpn_ffi::OpenVpnPluginEvent, openvpn_ffi::OpenVpnEnv), |
