summaryrefslogtreecommitdiffhomepage
path: root/mullvad-daemon/src
diff options
context:
space:
mode:
authorOdd Stranne <odd@mullvad.net>2018-10-30 15:30:03 +0100
committerOdd Stranne <odd@mullvad.net>2018-10-30 15:30:03 +0100
commit2b427dc7fe3117a6eef79890e5f30923982878df (patch)
tree7354b6bbc63e29767c00c55f7772a9ecfd51c5d5 /mullvad-daemon/src
parent313a6657a0c3d35e6e83836d6edf99a87d423fc3 (diff)
parent10045211735d5040de7df927a13dc4182360865d (diff)
downloadmullvadvpn-2b427dc7fe3117a6eef79890e5f30923982878df.tar.xz
mullvadvpn-2b427dc7fe3117a6eef79890e5f30923982878df.zip
Merge branch 'openvpn-proxy'
Diffstat (limited to 'mullvad-daemon/src')
-rw-r--r--mullvad-daemon/src/lib.rs65
-rw-r--r--mullvad-daemon/src/management_interface.rs34
2 files changed, 95 insertions, 4 deletions
diff --git a/mullvad-daemon/src/lib.rs b/mullvad-daemon/src/lib.rs
index 13ae19e7a7..058466b04e 100644
--- a/mullvad-daemon/src/lib.rs
+++ b/mullvad-daemon/src/lib.rs
@@ -53,8 +53,12 @@ use mullvad_rpc::{AccountsProxy, AppVersionProxy, HttpHandle};
use mullvad_types::{
account::{AccountData, AccountToken},
location::GeoIpLocation,
- relay_constraints::{RelaySettings, RelaySettingsUpdate},
+ relay_constraints::{
+ Constraint, OpenVpnConstraints, RelayConstraintsUpdate, RelaySettings, RelaySettingsUpdate,
+ TunnelConstraints,
+ },
relay_list::{Relay, RelayList},
+ settings,
settings::Settings,
states::TargetState,
version::{AppVersion, AppVersionInfo},
@@ -64,7 +68,10 @@ use talpid_core::{
mpsc::IntoSender,
tunnel_state_machine::{self, TunnelCommand, TunnelParameters, TunnelParametersGenerator},
};
-use talpid_types::tunnel::{BlockReason, TunnelStateTransition};
+use talpid_types::{
+ net::{OpenVpnProxySettings, TransportProtocol},
+ tunnel::{BlockReason, TunnelStateTransition},
+};
error_chain!{
@@ -369,7 +376,7 @@ impl Daemon {
tunnel_parameters_tx
.send(TunnelParameters {
endpoint,
- options: self.settings.get_tunnel_options(),
+ options: self.settings.get_tunnel_options().clone(),
username: account_token,
})
.map_err(|_| Error::from("Tunnel parameters receiver stopped listening"))
@@ -417,6 +424,7 @@ impl Daemon {
SetAllowLan(tx, allow_lan) => self.on_set_allow_lan(tx, allow_lan),
SetAutoConnect(tx, auto_connect) => self.on_set_auto_connect(tx, auto_connect),
SetOpenVpnMssfix(tx, mssfix_arg) => self.on_set_openvpn_mssfix(tx, mssfix_arg),
+ SetOpenVpnProxy(tx, proxy) => self.on_set_openvpn_proxy(tx, proxy),
SetEnableIpv6(tx, enable_ipv6) => self.on_set_enable_ipv6(tx, enable_ipv6),
GetSettings(tx) => self.on_get_settings(tx),
GetVersionInfo(tx) => self.on_get_version_info(tx),
@@ -619,6 +627,57 @@ impl Daemon {
}
}
+ fn on_set_openvpn_proxy(
+ &mut self,
+ tx: oneshot::Sender<::std::result::Result<(), settings::Error>>,
+ proxy: Option<OpenVpnProxySettings>,
+ ) {
+ let constraints_result = match proxy {
+ Some(_) => self.apply_proxy_constraints(),
+ _ => Ok(false),
+ };
+ let proxy_result = self.settings.set_openvpn_proxy(proxy);
+
+ match (proxy_result, constraints_result) {
+ (Ok(proxy_changed), Ok(constraints_changed)) => {
+ Self::oneshot_send(tx, Ok(()), "set_openvpn_proxy response");
+ if proxy_changed || constraints_changed {
+ self.management_interface_broadcaster
+ .notify_settings(&self.settings);
+ info!("Initiating tunnel restart because the OpenVPN proxy setting changed");
+ self.reconnect_tunnel();
+ }
+ }
+ (Ok(_), Err(error)) | (Err(error), Ok(_)) => {
+ error!("{}", error.display_chain());
+ Self::oneshot_send(tx, Err(error), "set_openvpn_proxy response");
+ }
+ (Err(error), Err(_)) => {
+ error!("{}", error.display_chain());
+ Self::oneshot_send(tx, Err(error), "set_openvpn_proxy response");
+ }
+ }
+ }
+
+ // Set the OpenVPN tunnel to use TCP.
+ fn apply_proxy_constraints(&mut self) -> settings::Result<bool> {
+ let openvpn_constraints = OpenVpnConstraints {
+ port: Constraint::Any,
+ protocol: Constraint::Only(TransportProtocol::Tcp),
+ };
+
+ let tunnel_constraints = TunnelConstraints::OpenVpn(openvpn_constraints);
+
+ let constraints_update = RelayConstraintsUpdate {
+ location: None,
+ tunnel: Some(Constraint::Only(tunnel_constraints)),
+ };
+
+ let settings_update = RelaySettingsUpdate::Normal(constraints_update);
+
+ self.settings.update_relay_settings(settings_update)
+ }
+
fn on_set_enable_ipv6(&mut self, tx: oneshot::Sender<()>, enable_ipv6: bool) {
let save_result = self.settings.set_enable_ipv6(enable_ipv6);
match save_result.chain_err(|| "Unable to save settings") {
diff --git a/mullvad-daemon/src/management_interface.rs b/mullvad-daemon/src/management_interface.rs
index 07fd603e2a..3e204245ae 100644
--- a/mullvad-daemon/src/management_interface.rs
+++ b/mullvad-daemon/src/management_interface.rs
@@ -11,6 +11,7 @@ use mullvad_types::account::{AccountData, AccountToken};
use mullvad_types::location::GeoIpLocation;
use mullvad_types::relay_constraints::RelaySettingsUpdate;
use mullvad_types::relay_list::RelayList;
+use mullvad_types::settings;
use mullvad_types::settings::Settings;
use mullvad_types::states::TargetState;
use mullvad_types::version;
@@ -24,7 +25,7 @@ use std::sync::{Arc, Mutex, RwLock};
use talpid_core::mpsc::IntoSender;
use talpid_ipc;
-use talpid_types::tunnel::TunnelStateTransition;
+use talpid_types::{net::OpenVpnProxySettings, tunnel::TunnelStateTransition};
use uuid;
use account_history::{AccountHistory, Error as AccountHistoryError};
@@ -101,6 +102,10 @@ build_rpc_trait! {
#[rpc(meta, name = "set_openvpn_mssfix")]
fn set_openvpn_mssfix(&self, Self::Metadata, Option<u16>) -> BoxFuture<(), Error>;
+ /// Sets proxy details for OpenVPN
+ #[rpc(meta, name = "set_openvpn_proxy")]
+ fn set_openvpn_proxy(&self, Self::Metadata, Option<OpenVpnProxySettings>) -> BoxFuture<(), Error>;
+
/// Set if IPv6 is enabled in the tunnel
#[rpc(meta, name = "set_enable_ipv6")]
fn set_enable_ipv6(&self, Self::Metadata, bool) -> BoxFuture<(), Error>;
@@ -170,6 +175,11 @@ pub enum ManagementCommand {
SetAutoConnect(OneshotSender<()>, bool),
/// Set the mssfix argument for OpenVPN
SetOpenVpnMssfix(OneshotSender<()>, Option<u16>),
+ /// Set proxy details for OpenVPN
+ SetOpenVpnProxy(
+ OneshotSender<Result<(), settings::Error>>,
+ Option<OpenVpnProxySettings>,
+ ),
/// Set if IPv6 should be enabled in the tunnel
SetEnableIpv6(OneshotSender<()>, bool),
/// Get the daemon settings
@@ -537,6 +547,28 @@ impl<T: From<ManagementCommand> + 'static + Send> ManagementInterfaceApi
Box::new(future)
}
+ fn set_openvpn_proxy(
+ &self,
+ _: Self::Metadata,
+ proxy: Option<OpenVpnProxySettings>,
+ ) -> BoxFuture<(), Error> {
+ log::debug!("set_openvpn_proxy({:?})", proxy);
+ let (tx, rx) = sync::oneshot::channel();
+ let future = self
+ .send_command_to_daemon(ManagementCommand::SetOpenVpnProxy(tx, proxy))
+ .and_then(|_| rx.map_err(|_| Error::internal_error()))
+ .and_then(|settings_result| {
+ settings_result.map_err(|err| match err.kind() {
+ settings::ErrorKind::InvalidProxyData(msg) => {
+ Error::invalid_params(msg.to_owned())
+ }
+ _ => Error::internal_error(),
+ })
+ });
+
+ Box::new(future)
+ }
+
fn set_enable_ipv6(&self, _: Self::Metadata, enable_ipv6: bool) -> BoxFuture<(), Error> {
log::debug!("set_enable_ipv6({})", enable_ipv6);
let (tx, rx) = sync::oneshot::channel();