summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls Piņķis <emils@mullvad.net>2018-10-30 13:47:13 +0000
committerEmīls Piņķis <emils@mullvad.net>2018-10-30 13:47:13 +0000
commit313a6657a0c3d35e6e83836d6edf99a87d423fc3 (patch)
tree93e5d4fa54ee1c12b0cd94a762eeeb443661f94f
parente28a10a2f9fe40632ac58cd9211e5f3009f2cc7a (diff)
parentee37a62fe2f3d75a2161daa69485da7931885d03 (diff)
downloadmullvadvpn-313a6657a0c3d35e6e83836d6edf99a87d423fc3.tar.xz
mullvadvpn-313a6657a0c3d35e6e83836d6edf99a87d423fc3.zip
Merge branch 'linux-force-domain-in-systemd-resolved'
-rw-r--r--talpid-core/src/security/linux/dns/systemd_resolved.rs31
1 files changed, 28 insertions, 3 deletions
diff --git a/talpid-core/src/security/linux/dns/systemd_resolved.rs b/talpid-core/src/security/linux/dns/systemd_resolved.rs
index f4c00012b5..b9123cf8eb 100644
--- a/talpid-core/src/security/linux/dns/systemd_resolved.rs
+++ b/talpid-core/src/security/linux/dns/systemd_resolved.rs
@@ -11,7 +11,7 @@ use std::{
use self::dbus::arg::RefArg;
use self::dbus::stdintf::*;
-use self::dbus::{BusType, Interface, Member, MessageItem, MessageItemArray, Signature};
+use self::dbus::{BusType, Interface, Member, Message, MessageItem, MessageItemArray, Signature};
use super::super::iface_index;
use super::{resolv_conf, RESOLV_CONF_PATH};
@@ -34,6 +34,9 @@ error_chain! {
SetDnsError {
description("Failed to configure DNS servers")
}
+ SetDomainsError {
+ description("Failed to configure DNS domains")
+ }
RevertDnsError {
description("Failed to revert DNS configuration")
}
@@ -41,7 +44,6 @@ error_chain! {
description("Failed to initialize a connection to dbus")
}
}
-
}
const DYNAMIC_RESOLV_CONF_PATH: &str = "/run/systemd/resolve/resolv.conf";
@@ -57,6 +59,7 @@ lazy_static! {
Interface::from_slice(b"org.freedesktop.resolve1.Manager").unwrap();
static ref GET_LINK_METHOD: Member<'static> = Member::from_slice(b"GetLink").unwrap();
static ref SET_DNS_METHOD: Member<'static> = Member::from_slice(b"SetDNS").unwrap();
+ static ref SET_DOMAINS_METHOD: Member<'static> = Member::from_slice(b"SetDomains").unwrap();
static ref REVERT_METHOD: Member<'static> = Member::from_slice(b"Revert").unwrap();
}
@@ -179,7 +182,29 @@ impl SystemdResolved {
reply
.as_result()
.map(|_| ())
- .chain_err(|| ErrorKind::SetDnsError)
+ .chain_err(|| ErrorKind::SetDnsError)?;
+
+ // set the search domain to catch all DNS requests, forces the link to be the prefered
+ // resolver, otherwise systemd-resolved will use other interfaces to do DNS lookups
+ let dns_domains: &[_] = &[(&".", true)];
+
+ let msg = Message::new_method_call(
+ RESOLVED_BUS,
+ link_object_path as &str,
+ &LINK_INTERFACE as &str,
+ &SET_DOMAINS_METHOD as &str,
+ )
+ .expect("failed to construct a new dbus message")
+ .append1(dns_domains);
+
+ let mut reply = self
+ .dbus_connection
+ .send_with_reply_and_block(msg, RPC_TIMEOUT_MS)
+ .chain_err(|| ErrorKind::SetDomainsError)?;
+ reply
+ .as_result()
+ .map(|_| ())
+ .chain_err(|| ErrorKind::SetDomainsError)
}
pub fn reset(&mut self) -> Result<()> {