summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls Piņķis <emils@mullvad.net>2018-10-09 13:52:29 +0100
committerEmīls Piņķis <emils@mullvad.net>2018-10-09 13:52:29 +0100
commitb31a91dc1ed7552023ff342f77df22bec5a723f3 (patch)
tree8267f52af8fa721526c12c6bc67f73e6e9299f1f
parentc231604e1b4fa1bb9e7e7a1a3b254892e22ddcfc (diff)
parentb112230f162901858d3f38fb0d686c0bb0225611 (diff)
downloadmullvadvpn-b31a91dc1ed7552023ff342f77df22bec5a723f3.tar.xz
mullvadvpn-b31a91dc1ed7552023ff342f77df22bec5a723f3.zip
Merge branch 'fix-systemd-resolved'
-rw-r--r--CHANGELOG.md4
-rw-r--r--gui/packages/desktop/src/main/window-controller.js3
-rw-r--r--talpid-core/src/security/linux/dns/systemd_resolved.rs50
3 files changed, 24 insertions, 33 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 146635e87f..49b695afb9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -30,6 +30,10 @@ Line wrap the file at 100 chars. Th
- The app will have it's window resized correctly when display scaling settings are changed. This
should also fix bad window behaviour on startup.
+### Fixed
+#### Linux
+- Fixed systemd-resolved DNS management.
+
## [2018.4-beta2] - 2018-10-08
### Added
diff --git a/gui/packages/desktop/src/main/window-controller.js b/gui/packages/desktop/src/main/window-controller.js
index ab32b1d6b7..5950ab4716 100644
--- a/gui/packages/desktop/src/main/window-controller.js
+++ b/gui/packages/desktop/src/main/window-controller.js
@@ -213,8 +213,7 @@ export default class WindowController {
// On linux, the window won't be properly rescaled back to it's original
// size if the DPI scaling factor is changed.
// https://github.com/electron/electron/issues/11050
- if (process.platform === 'linux' && changedMetrics.includes('scaleFactor'))
- {
+ if (process.platform === 'linux' && changedMetrics.includes('scaleFactor')) {
this._forceResizeWindow();
}
};
diff --git a/talpid-core/src/security/linux/dns/systemd_resolved.rs b/talpid-core/src/security/linux/dns/systemd_resolved.rs
index e5aea9a0de..5c416187fd 100644
--- a/talpid-core/src/security/linux/dns/systemd_resolved.rs
+++ b/talpid-core/src/security/linux/dns/systemd_resolved.rs
@@ -1,6 +1,5 @@
extern crate dbus;
-use std::collections::HashMap;
use std::net::IpAddr;
use error_chain::ChainedError;
@@ -54,7 +53,7 @@ lazy_static! {
pub struct SystemdResolved {
dbus_connection: dbus::Connection,
- interface_links: HashMap<String, dbus::Path<'static>>,
+ interface_link: Option<(String, dbus::Path<'static>)>,
}
impl SystemdResolved {
@@ -63,7 +62,7 @@ impl SystemdResolved {
dbus::Connection::get_private(BusType::System).chain_err(|| ErrorKind::DBusError)?;
let systemd_resolved = SystemdResolved {
dbus_connection,
- interface_links: HashMap::new(),
+ interface_link: None,
};
systemd_resolved.ensure_resolved_exists()?;
@@ -94,23 +93,17 @@ impl SystemdResolved {
}
pub fn set_dns(&mut self, interface_name: &str, servers: &[IpAddr]) -> Result<()> {
- let new_entry = if let Some(link_object_path) = self.interface_links.get(interface_name) {
- self.set_link_dns(&link_object_path, servers)?;
-
- None
- } else {
- let link_object_path = self.fetch_link(interface_name)?;
-
- self.set_link_dns(&link_object_path, servers)?;
-
- Some((interface_name.to_owned(), link_object_path))
- };
-
- if let Some((interface_name, link_object_path)) = new_entry {
- self.interface_links
- .insert(interface_name, link_object_path);
+ let link_object_path = self.fetch_link(interface_name)?;
+ if let Err(e) = self.reset() {
+ debug!(
+ "Failed to reset previous DNS settings - {}",
+ e.display_chain()
+ );
}
+ self.set_link_dns(&link_object_path, servers)?;
+ self.interface_link = Some((interface_name.to_string(), link_object_path));
+
Ok(())
}
@@ -151,23 +144,18 @@ impl SystemdResolved {
}
pub fn reset(&mut self) -> Result<()> {
- let mut result = Ok(());
- let interface_links: Vec<_> = self.interface_links.drain().collect();
-
- for (interface_name, link_object_path) in interface_links {
- if let Err(error) = self.revert_link(link_object_path, &interface_name) {
- let chained_error = error.chain_err(|| {
+ if let Some((interface_name, link_object_path)) = self.interface_link.take() {
+ self.revert_link(link_object_path, &interface_name)
+ .chain_err(|| {
format!(
"Failed to revert DNS settings of interface: {}",
interface_name
)
- });
- error!("{}", chained_error.display_chain());
- result = Err(Error::from(ErrorKind::RevertDnsError));
- }
- }
-
- result
+ })?;
+ } else {
+ trace!("No DNS settings to reset");
+ };
+ Ok(())
}
fn revert_link(