diff options
| author | Emīls Piņķis <emils@mullvad.net> | 2018-10-30 13:47:13 +0000 |
|---|---|---|
| committer | Emīls Piņķis <emils@mullvad.net> | 2018-10-30 13:47:13 +0000 |
| commit | 313a6657a0c3d35e6e83836d6edf99a87d423fc3 (patch) | |
| tree | 93e5d4fa54ee1c12b0cd94a762eeeb443661f94f | |
| parent | e28a10a2f9fe40632ac58cd9211e5f3009f2cc7a (diff) | |
| parent | ee37a62fe2f3d75a2161daa69485da7931885d03 (diff) | |
| download | mullvadvpn-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.rs | 31 |
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<()> { |
