summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-10-11 11:50:29 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-10-11 15:10:31 -0300
commit8ec80b7009dd97d93aed5c4989edca6e46db5280 (patch)
treee47e58ab0dc62e95bfdc1a504ad895a1ec9fdba7
parent5d9b89f8e22d54ac3f83c8393d1015d5fb8cd8f3 (diff)
downloadmullvadvpn-8ec80b7009dd97d93aed5c4989edca6e46db5280.tar.xz
mullvadvpn-8ec80b7009dd97d93aed5c4989edca6e46db5280.zip
Check for resolv.conf symlink to systemd-resolved
-rw-r--r--talpid-core/src/security/linux/dns/mod.rs4
-rw-r--r--talpid-core/src/security/linux/dns/static_resolv_conf.rs5
-rw-r--r--talpid-core/src/security/linux/dns/systemd_resolved.rs22
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)