summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJoakim Hulthe <joakim.hulthe@mullvad.net>2024-08-19 14:47:35 +0200
committerJoakim Hulthe <joakim.hulthe@mullvad.net>2024-09-17 11:29:28 +0200
commit3fac6f5f6d84ee65ba015f900ab5436e0f48cc01 (patch)
tree24e82fa02dd1566331d13e5d97b4fad7ecc7e2b8
parent4892d4a4f34509b9af21bd1349e9e5e964bf9846 (diff)
downloadmullvadvpn-3fac6f5f6d84ee65ba015f900ab5436e0f48cc01.tar.xz
mullvadvpn-3fac6f5f6d84ee65ba015f900ab5436e0f48cc01.zip
Add daita.enabled and daita.use_anywhere rpc calls
-rw-r--r--gui/src/main/daemon-rpc.ts15
-rw-r--r--gui/src/main/settings.ts7
-rw-r--r--gui/src/renderer/app.tsx7
-rw-r--r--gui/src/renderer/components/WireguardSettings.tsx8
-rw-r--r--gui/src/shared/ipc-schema.ts4
-rw-r--r--mullvad-cli/src/cmds/tunnel.rs25
-rw-r--r--mullvad-daemon/src/lib.rs56
-rw-r--r--mullvad-daemon/src/management_interface.rs30
-rw-r--r--mullvad-management-interface/proto/management_interface.proto2
-rw-r--r--mullvad-management-interface/src/client.rs15
-rw-r--r--mullvad-relay-selector/src/relay_selector/mod.rs2
11 files changed, 142 insertions, 29 deletions
diff --git a/gui/src/main/daemon-rpc.ts b/gui/src/main/daemon-rpc.ts
index 3ccfce85bf..9f1f2d760c 100644
--- a/gui/src/main/daemon-rpc.ts
+++ b/gui/src/main/daemon-rpc.ts
@@ -38,7 +38,6 @@ import {
IAppVersionInfo,
IBridgeConstraints,
ICustomList,
- IDaitaSettings,
IDevice,
IDeviceRemoval,
IDnsOptions,
@@ -586,14 +585,12 @@ export class DaemonRpc {
await this.callBool(this.client.prepareRestartV2, quit);
}
- public async setDaitaSettings(daitaSettings: IDaitaSettings): Promise<void> {
- const grpcDaitaSettings = new grpcTypes.DaitaSettings();
- grpcDaitaSettings.setEnabled(daitaSettings.enabled);
- grpcDaitaSettings.setUseAnywhere(daitaSettings.useAnywhere);
- await this.call<grpcTypes.DaitaSettings, Empty>(
- this.client.setDaitaSettings,
- grpcDaitaSettings,
- );
+ public async setEnableDaita(value: boolean): Promise<void> {
+ await this.callBool(this.client.setEnableDaita, value);
+ }
+
+ public async setDaitaUseAnywhere(value: boolean): Promise<void> {
+ await this.callBool(this.client.setDaitaUseAnywhere, value);
}
public async listDevices(accountToken: AccountToken): Promise<Array<IDevice>> {
diff --git a/gui/src/main/settings.ts b/gui/src/main/settings.ts
index 22238c72c4..6ec4e0b09d 100644
--- a/gui/src/main/settings.ts
+++ b/gui/src/main/settings.ts
@@ -107,8 +107,11 @@ export default class Settings implements Readonly<ISettings> {
const settings = await fs.readFile(path);
return this.daemonRpc.applyJsonSettings(settings.toString());
});
- IpcMainEventChannel.settings.handleSetDaitaSettings((daitaSettings) => {
- return this.daemonRpc.setDaitaSettings(daitaSettings);
+ IpcMainEventChannel.settings.handleSetEnableDaita((value) => {
+ return this.daemonRpc.setEnableDaita(value);
+ });
+ IpcMainEventChannel.settings.handleSetDaitaUseAnywhere((value) => {
+ return this.daemonRpc.setDaitaUseAnywhere(value);
});
IpcMainEventChannel.guiSettings.handleSetEnableSystemNotifications((flag: boolean) => {
diff --git a/gui/src/renderer/app.tsx b/gui/src/renderer/app.tsx
index a4c76aa2d1..168e88dcb6 100644
--- a/gui/src/renderer/app.tsx
+++ b/gui/src/renderer/app.tsx
@@ -19,7 +19,6 @@ import {
IAccountData,
IAppVersionInfo,
ICustomList,
- IDaitaSettings,
IDevice,
IDeviceRemoval,
IDnsOptions,
@@ -345,8 +344,10 @@ export default class AppRenderer {
IpcRendererEventChannel.splitTunneling.forgetManuallyAddedApplication(application);
public setObfuscationSettings = (obfuscationSettings: ObfuscationSettings) =>
IpcRendererEventChannel.settings.setObfuscationSettings(obfuscationSettings);
- public setDaitaSettings = (daitaSettings: IDaitaSettings) =>
- IpcRendererEventChannel.settings.setDaitaSettings(daitaSettings);
+ public setEnableDaita = (value: boolean) =>
+ IpcRendererEventChannel.settings.setEnableDaita(value);
+ public setDaitaUseAnywhere = (value: boolean) =>
+ IpcRendererEventChannel.settings.setDaitaUseAnywhere(value);
public collectProblemReport = (toRedact: string | undefined) =>
IpcRendererEventChannel.problemReport.collectLogs(toRedact);
public viewLog = (path: string) => IpcRendererEventChannel.problemReport.viewLog(path);
diff --git a/gui/src/renderer/components/WireguardSettings.tsx b/gui/src/renderer/components/WireguardSettings.tsx
index 5beeab26c9..edcef77ea8 100644
--- a/gui/src/renderer/components/WireguardSettings.tsx
+++ b/gui/src/renderer/components/WireguardSettings.tsx
@@ -529,7 +529,7 @@ function MtuSetting() {
}
function DaitaSettings() {
- const { setDaitaSettings } = useAppContext();
+ const { setEnableDaita, setDaitaUseAnywhere } = useAppContext();
const daita = useSelector((state) => state.settings.wireguard.daita?.enabled ?? false);
const useAnywhere = useSelector((state) => state.settings.wireguard.daita?.useAnywhere ?? false);
@@ -539,16 +539,16 @@ function DaitaSettings() {
if (value) {
showConfirmationDialog();
} else {
- void setDaitaSettings({ enabled: value, useAnywhere: useAnywhere });
+ void setEnableDaita(value);
}
}, []);
const setUseAnywhere = useCallback((value: boolean) => {
- void setDaitaSettings({ enabled: daita, useAnywhere: value });
+ void setDaitaUseAnywhere(value);
}, []);
const confirmDaita = useCallback(() => {
- void setDaitaSettings({ enabled: true, useAnywhere: useAnywhere });
+ void setEnableDaita(true);
hideConfirmationDialog();
}, []);
diff --git a/gui/src/shared/ipc-schema.ts b/gui/src/shared/ipc-schema.ts
index acbb6366d2..78acc9fae9 100644
--- a/gui/src/shared/ipc-schema.ts
+++ b/gui/src/shared/ipc-schema.ts
@@ -14,7 +14,6 @@ import {
IAccountData,
IAppVersionInfo,
ICustomList,
- IDaitaSettings,
IDevice,
IDeviceRemoval,
IDnsOptions,
@@ -195,7 +194,8 @@ export const ipcSchema = {
testApiAccessMethodById: invoke<string, boolean>(),
testCustomApiAccessMethod: invoke<CustomProxy, boolean>(),
clearAllRelayOverrides: invoke<void, void>(),
- setDaitaSettings: invoke<IDaitaSettings, void>(),
+ setEnableDaita: invoke<boolean, void>(),
+ setDaitaUseAnywhere: invoke<boolean, void>(),
},
guiSettings: {
'': notifyRenderer<IGuiSettingsState>(),
diff --git a/mullvad-cli/src/cmds/tunnel.rs b/mullvad-cli/src/cmds/tunnel.rs
index 2464334cc6..911c2f010b 100644
--- a/mullvad-cli/src/cmds/tunnel.rs
+++ b/mullvad-cli/src/cmds/tunnel.rs
@@ -1,8 +1,6 @@
use anyhow::Result;
use clap::Subcommand;
use mullvad_management_interface::MullvadProxyClient;
-#[cfg(daita)]
-use mullvad_types::wireguard::DaitaSettings;
use mullvad_types::{
constraints::Constraint,
wireguard::{QuantumResistantState, RotationInterval, DEFAULT_ROTATION_INTERVAL},
@@ -44,6 +42,10 @@ pub enum TunnelOptions {
#[cfg(daita)]
#[arg(long)]
daita: Option<BooleanOption>,
+ /// Configure whether to enable DAITA "use anywhere"
+ #[cfg(daita)]
+ #[arg(long)]
+ daita_use_anywhere: Option<BooleanOption>,
/// The key rotation interval. Number of hours, or 'any'
#[arg(long)]
rotation_interval: Option<Constraint<RotationInterval>>,
@@ -140,6 +142,8 @@ impl Tunnel {
quantum_resistant,
#[cfg(daita)]
daita,
+ #[cfg(daita)]
+ daita_use_anywhere,
rotation_interval,
rotate_key,
} => {
@@ -148,6 +152,8 @@ impl Tunnel {
quantum_resistant,
#[cfg(daita)]
daita,
+ #[cfg(daita)]
+ daita_use_anywhere,
rotation_interval,
rotate_key,
)
@@ -179,6 +185,7 @@ impl Tunnel {
mtu: Option<Constraint<u16>>,
quantum_resistant: Option<QuantumResistantState>,
#[cfg(daita)] daita: Option<BooleanOption>,
+ #[cfg(daita)] daita_use_anywhere: Option<BooleanOption>,
rotation_interval: Option<Constraint<RotationInterval>>,
rotate_key: Option<RotateKey>,
) -> Result<()> {
@@ -195,12 +202,14 @@ impl Tunnel {
}
#[cfg(daita)]
- if let Some(daita) = daita {
- rpc.set_daita_settings(DaitaSettings {
- enabled: *daita,
- use_anywhere: true, /* TODO */
- })
- .await?;
+ if let Some(enable_daita) = daita {
+ rpc.set_enable_daita(*enable_daita).await?;
+ println!("DAITA setting has been updated");
+ }
+
+ #[cfg(daita)]
+ if let Some(daita_use_anywhere) = daita_use_anywhere {
+ rpc.set_daita_use_anywhere(*daita_use_anywhere).await?;
println!("DAITA setting has been updated");
}
diff --git a/mullvad-daemon/src/lib.rs b/mullvad-daemon/src/lib.rs
index 4a437e6e24..7a0dc2df23 100644
--- a/mullvad-daemon/src/lib.rs
+++ b/mullvad-daemon/src/lib.rs
@@ -264,6 +264,10 @@ pub enum DaemonCommand {
SetQuantumResistantTunnel(ResponseTx<(), settings::Error>, QuantumResistantState),
/// Set DAITA settings for the tunnel
#[cfg(daita)]
+ SetEnableDaita(ResponseTx<(), settings::Error>, bool),
+ #[cfg(daita)]
+ SetDaitaUseAnywhere(ResponseTx<(), settings::Error>, bool),
+ #[cfg(daita)]
SetDaitaSettings(ResponseTx<(), settings::Error>, DaitaSettings),
/// Set DNS options or servers to use
SetDnsOptions(ResponseTx<(), settings::Error>, DnsOptions),
@@ -1255,6 +1259,10 @@ impl Daemon {
.await
}
#[cfg(daita)]
+ SetEnableDaita(tx, value) => self.on_set_daita_enabled(tx, value).await,
+ #[cfg(daita)]
+ SetDaitaUseAnywhere(tx, value) => self.on_set_daita_use_anywhere(tx, value).await,
+ #[cfg(daita)]
SetDaitaSettings(tx, daita_settings) => {
self.on_set_daita_settings(tx, daita_settings).await
}
@@ -2324,6 +2332,54 @@ impl Daemon {
}
#[cfg(daita)]
+ async fn on_set_daita_enabled(&mut self, tx: ResponseTx<(), settings::Error>, value: bool) {
+ match self
+ .settings
+ .update(|settings| settings.tunnel_options.wireguard.daita.enabled = value)
+ .await
+ {
+ Ok(settings_changed) => {
+ Self::oneshot_send(tx, Ok(()), "set_daita_enabled response");
+ if settings_changed && self.get_target_tunnel_type() != Some(TunnelType::OpenVpn) {
+ log::info!("Reconnecting because DAITA settings changed");
+ self.reconnect_tunnel();
+ }
+ }
+ Err(e) => {
+ log::error!("{}", e.display_chain_with_msg("Unable to save settings"));
+ Self::oneshot_send(tx, Err(e), "set_daita_enabled response");
+ }
+ }
+ }
+
+ #[cfg(daita)]
+ async fn on_set_daita_use_anywhere(
+ &mut self,
+ tx: ResponseTx<(), settings::Error>,
+ value: bool,
+ ) {
+ match self
+ .settings
+ .update(|settings| settings.tunnel_options.wireguard.daita.use_anywhere = value)
+ .await
+ {
+ Ok(settings_changed) => {
+ Self::oneshot_send(tx, Ok(()), "set_daita_use_anywhere response");
+
+ // TODO: don't reconnect if multihop is enabled
+ if settings_changed && self.get_target_tunnel_type() != Some(TunnelType::OpenVpn) {
+ log::info!("Reconnecting because DAITA settings changed");
+ self.reconnect_tunnel();
+ }
+ }
+ Err(e) => {
+ log::error!("{}", e.display_chain_with_msg("Unable to save settings"));
+ Self::oneshot_send(tx, Err(e), "set_daita_use_anywhere response");
+ }
+ }
+ }
+
+ #[cfg(daita)]
async fn on_set_daita_settings(
&mut self,
tx: ResponseTx<(), settings::Error>,
diff --git a/mullvad-daemon/src/management_interface.rs b/mullvad-daemon/src/management_interface.rs
index 4d0f558a97..594fd7a19e 100644
--- a/mullvad-daemon/src/management_interface.rs
+++ b/mullvad-daemon/src/management_interface.rs
@@ -342,6 +342,26 @@ impl ManagementService for ManagementServiceImpl {
}
#[cfg(daita)]
+ async fn set_enable_daita(&self, request: Request<bool>) -> ServiceResult<()> {
+ let value = request.into_inner();
+ log::debug!("set_enable_daita({value})");
+ let (tx, rx) = oneshot::channel();
+ self.send_command_to_daemon(DaemonCommand::SetEnableDaita(tx, value))?;
+ self.wait_for_result(rx).await?.map(Response::new)?;
+ Ok(Response::new(()))
+ }
+
+ #[cfg(daita)]
+ async fn set_daita_use_anywhere(&self, request: Request<bool>) -> ServiceResult<()> {
+ let value = request.into_inner();
+ log::debug!("set_daita_use_anywhere({value})");
+ let (tx, rx) = oneshot::channel();
+ self.send_command_to_daemon(DaemonCommand::SetDaitaUseAnywhere(tx, value))?;
+ self.wait_for_result(rx).await?.map(Response::new)?;
+ Ok(Response::new(()))
+ }
+
+ #[cfg(daita)]
async fn set_daita_settings(
&self,
request: Request<types::DaitaSettings>,
@@ -356,6 +376,16 @@ impl ManagementService for ManagementServiceImpl {
}
#[cfg(not(daita))]
+ async fn set_enable_daita(&self, _: Request<bool>) -> ServiceResult<()> {
+ Ok(Response::new(()))
+ }
+
+ #[cfg(not(daita))]
+ async fn set_daita_use_anywhere(&self, _: Request<bool>) -> ServiceResult<()> {
+ Ok(Response::new(()))
+ }
+
+ #[cfg(not(daita))]
async fn set_daita_settings(&self, _: Request<types::DaitaSettings>) -> ServiceResult<()> {
Ok(Response::new(()))
}
diff --git a/mullvad-management-interface/proto/management_interface.proto b/mullvad-management-interface/proto/management_interface.proto
index 595c8f3527..29acf34923 100644
--- a/mullvad-management-interface/proto/management_interface.proto
+++ b/mullvad-management-interface/proto/management_interface.proto
@@ -48,6 +48,8 @@ service ManagementService {
rpc SetWireguardMtu(google.protobuf.UInt32Value) returns (google.protobuf.Empty) {}
rpc SetEnableIpv6(google.protobuf.BoolValue) returns (google.protobuf.Empty) {}
rpc SetQuantumResistantTunnel(QuantumResistantState) returns (google.protobuf.Empty) {}
+ rpc SetEnableDaita(google.protobuf.BoolValue) returns (google.protobuf.Empty) {}
+ rpc SetDaitaUseAnywhere(google.protobuf.BoolValue) returns (google.protobuf.Empty) {}
rpc SetDaitaSettings(DaitaSettings) returns (google.protobuf.Empty) {}
rpc SetDnsOptions(DnsOptions) returns (google.protobuf.Empty) {}
rpc SetRelayOverride(RelayOverride) returns (google.protobuf.Empty) {}
diff --git a/mullvad-management-interface/src/client.rs b/mullvad-management-interface/src/client.rs
index 3b2cabc33e..14676ceeb9 100644
--- a/mullvad-management-interface/src/client.rs
+++ b/mullvad-management-interface/src/client.rs
@@ -379,6 +379,21 @@ impl MullvadProxyClient {
}
#[cfg(daita)]
+ pub async fn set_enable_daita(&mut self, value: bool) -> Result<()> {
+ self.0.set_enable_daita(value).await.map_err(Error::Rpc)?;
+ Ok(())
+ }
+
+ #[cfg(daita)]
+ pub async fn set_daita_use_anywhere(&mut self, value: bool) -> Result<()> {
+ self.0
+ .set_daita_use_anywhere(value)
+ .await
+ .map_err(Error::Rpc)?;
+ Ok(())
+ }
+
+ #[cfg(daita)]
pub async fn set_daita_settings(&mut self, settings: DaitaSettings) -> Result<()> {
let settings = types::DaitaSettings::from(settings);
self.0
diff --git a/mullvad-relay-selector/src/relay_selector/mod.rs b/mullvad-relay-selector/src/relay_selector/mod.rs
index f889cac48e..1635de8857 100644
--- a/mullvad-relay-selector/src/relay_selector/mod.rs
+++ b/mullvad-relay-selector/src/relay_selector/mod.rs
@@ -803,7 +803,7 @@ impl RelaySelector {
.take_while(|relay| relay.distance <= smallest_distance)
.map(|relay_with_distance| relay_with_distance.relay)
.collect_vec();
- let entry = pick_random_excluding(&entry_candidates, &exit).ok_or(Error::NoRelay)?;
+ let entry = pick_random_excluding(&entry_candidates, exit).ok_or(Error::NoRelay)?;
Ok(WireguardConfig::multihop(exit.clone(), entry.clone()))
}