diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-10-11 11:50:29 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-10-11 15:10:31 -0300 |
| commit | 8ec80b7009dd97d93aed5c4989edca6e46db5280 (patch) | |
| tree | e47e58ab0dc62e95bfdc1a504ad895a1ec9fdba7 | |
| parent | 5d9b89f8e22d54ac3f83c8393d1015d5fb8cd8f3 (diff) | |
| download | mullvadvpn-8ec80b7009dd97d93aed5c4989edca6e46db5280.tar.xz mullvadvpn-8ec80b7009dd97d93aed5c4989edca6e46db5280.zip | |
Check for resolv.conf symlink to systemd-resolved
| -rw-r--r-- | talpid-core/src/security/linux/dns/mod.rs | 4 | ||||
| -rw-r--r-- | talpid-core/src/security/linux/dns/static_resolv_conf.rs | 5 | ||||
| -rw-r--r-- | talpid-core/src/security/linux/dns/systemd_resolved.rs | 22 |
3 files changed, 27 insertions, 4 deletions
diff --git a/talpid-core/src/security/linux/dns/mod.rs b/talpid-core/src/security/linux/dns/mod.rs index c1e36efa53..0ab82c5d15 100644 --- a/talpid-core/src/security/linux/dns/mod.rs +++ b/talpid-core/src/security/linux/dns/mod.rs @@ -1,3 +1,5 @@ +extern crate resolv_conf; + mod network_manager; mod resolvconf; mod static_resolv_conf; @@ -10,6 +12,8 @@ use self::resolvconf::Resolvconf; use self::static_resolv_conf::StaticResolvConf; use self::systemd_resolved::SystemdResolved; +const RESOLV_CONF_PATH: &str = "/etc/resolv.conf"; + error_chain! { errors { NoDnsSettingsManager { diff --git a/talpid-core/src/security/linux/dns/static_resolv_conf.rs b/talpid-core/src/security/linux/dns/static_resolv_conf.rs index e9e81e5446..6ece9ba44c 100644 --- a/talpid-core/src/security/linux/dns/static_resolv_conf.rs +++ b/talpid-core/src/security/linux/dns/static_resolv_conf.rs @@ -1,5 +1,4 @@ extern crate notify; -extern crate resolv_conf; use std::net::IpAddr; use std::ops::DerefMut; @@ -9,9 +8,9 @@ use std::{fs, io, thread}; use error_chain::ChainedError; use self::notify::{RecommendedWatcher, RecursiveMode, Watcher}; -use self::resolv_conf::{Config, ScopedIp}; +use super::resolv_conf::{Config, ScopedIp}; +use super::RESOLV_CONF_PATH; -const RESOLV_CONF_PATH: &str = "/etc/resolv.conf"; const RESOLV_CONF_BACKUP_PATH: &str = "/etc/resolv.conf.mullvadbackup"; error_chain! { diff --git a/talpid-core/src/security/linux/dns/systemd_resolved.rs b/talpid-core/src/security/linux/dns/systemd_resolved.rs index 5c416187fd..72743d8913 100644 --- a/talpid-core/src/security/linux/dns/systemd_resolved.rs +++ b/talpid-core/src/security/linux/dns/systemd_resolved.rs @@ -1,6 +1,8 @@ extern crate dbus; -use std::net::IpAddr; +use std::fs; +use std::net::{IpAddr, Ipv4Addr}; +use std::path::Path; use error_chain::ChainedError; use libc::{AF_INET, AF_INET6}; @@ -10,6 +12,7 @@ use self::dbus::stdintf::*; use self::dbus::{BusType, Interface, Member, MessageItem, MessageItemArray, Signature}; use super::super::iface_index; +use super::{resolv_conf, RESOLV_CONF_PATH}; error_chain! { errors { @@ -38,6 +41,7 @@ error_chain! { } +const DYNAMIC_RESOLV_CONF_PATH: &str = "/run/systemd/resolve/resolv.conf"; const RESOLVED_BUS: &str = "org.freedesktop.resolve1"; const RPC_TIMEOUT_MS: i32 = 1000; @@ -65,6 +69,7 @@ impl SystemdResolved { interface_link: None, }; + SystemdResolved::ensure_resolved_is_active()?; systemd_resolved.ensure_resolved_exists()?; Ok(systemd_resolved) @@ -79,6 +84,21 @@ impl SystemdResolved { Ok(()) } + fn ensure_resolved_is_active() -> Result<()> { + ensure!( + Self::resolv_conf_is_resolved_symlink(), + ErrorKind::NoSystemdResolved + ); + + Ok(()) + } + + fn resolv_conf_is_resolved_symlink() -> bool { + fs::read_link(RESOLV_CONF_PATH) + .map(|resolv_conf_target| resolv_conf_target == Path::new(DYNAMIC_RESOLV_CONF_PATH)) + .unwrap_or_else(|_| false) + } + fn as_manager_object<'a>(&'a self) -> dbus::ConnPath<'a, &'a dbus::Connection> { self.dbus_connection .with_path(RESOLVED_BUS, "/org/freedesktop/resolve1", RPC_TIMEOUT_MS) |
