diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2023-10-27 15:13:25 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2023-10-31 00:45:17 +0100 |
| commit | 64756a535e04aea34bc8101eb4f3e83f52e426cb (patch) | |
| tree | d75fc82796fd5982b5980455a302519bec24e2e8 | |
| parent | 5c491337ba76b999137fa4c0071ed5b6e0079eb4 (diff) | |
| download | mullvadvpn-64756a535e04aea34bc8101eb4f3e83f52e426cb.tar.xz mullvadvpn-64756a535e04aea34bc8101eb4f3e83f52e426cb.zip | |
Add from java support for relay settings
5 files changed, 96 insertions, 13 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt index 4eb5a35141..94abf1da90 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt @@ -77,14 +77,14 @@ class VpnSettingsViewModel( isLocalNetworkSharingEnabled = settings?.allowLan ?: false, isCustomDnsEnabled = settings?.isCustomDnsEnabled() ?: false, customDnsList = settings?.addresses()?.asStringAddressList() ?: listOf(), - contentBlockersOptions = - settings?.contentBlockersSettings() ?: DefaultDnsOptions(), + contentBlockersOptions = settings?.contentBlockersSettings() + ?: DefaultDnsOptions(), isAllowLanEnabled = settings?.allowLan ?: false, - selectedObfuscation = - settings?.selectedObfuscationSettings() ?: SelectedObfuscation.Off, + selectedObfuscation = settings?.selectedObfuscationSettings() + ?: SelectedObfuscation.Off, dialogState = dialogState, - quantumResistant = - settings?.quantumResistant() ?: QuantumResistantState.Off, + quantumResistant = settings?.quantumResistant() + ?: QuantumResistantState.Off, selectedWireguardPort = settings?.getWireguardPort() ?: Constraint.Any(), availablePortRanges = portRanges ) diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt index 0b9e15774a..fd734bbeac 100644 --- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt +++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt @@ -289,10 +289,7 @@ class MullvadDaemon( playPurchase: PlayPurchase, ): PlayPurchaseVerifyResult - private external fun setRelaySettings( - daemonInterfaceAddress: Long, - update: RelaySettings - ) + private external fun setRelaySettings(daemonInterfaceAddress: Long, update: RelaySettings) private external fun setObfuscationSettings( daemonInterfaceAddress: Long, diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayListListener.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayListListener.kt index 2fc1e4115a..7a0b3fbe97 100644 --- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayListListener.kt +++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayListListener.kt @@ -91,7 +91,8 @@ class RelayListListener(endpoint: ServiceEndpoint) { val location: Constraint<LocationConstraint> = selectedRelayLocation?.let { location -> Constraint.Only(LocationConstraint.Location(location)) - } ?: currentRelayConstraints.location + } + ?: currentRelayConstraints.location val wireguardConstraints: WireguardConstraints = selectedWireguardConstraints ?: currentRelayConstraints.wireguardConstraints diff --git a/mullvad-types/src/custom_tunnel.rs b/mullvad-types/src/custom_tunnel.rs index 4fe3e54111..9b6ab9bff3 100644 --- a/mullvad-types/src/custom_tunnel.rs +++ b/mullvad-types/src/custom_tunnel.rs @@ -1,6 +1,6 @@ use crate::settings::TunnelOptions; #[cfg(target_os = "android")] -use jnix::IntoJava; +use jnix::{jni::objects::JObject, FromJava, IntoJava, JnixEnv}; use serde::{Deserialize, Serialize}; use std::{ fmt, io, @@ -91,6 +91,20 @@ impl fmt::Display for CustomTunnelEndpoint { } } +#[cfg(target_os = "android")] +impl<'env, 'sub_env> FromJava<'env, JObject<'sub_env>> for CustomTunnelEndpoint +where + 'env: 'sub_env, +{ + const JNI_SIGNATURE: &'static str = "Lnet/mullvad/mullvadvpn/model/CustomTunnelEndpoint;"; + + fn from_java(_env: &JnixEnv<'env>, _object: JObject<'sub_env>) -> Self { + panic!( + "Attempting to convert from CustomTunnelEndpoint java class. This should never happen!" + ); + } +} + /// Does a DNS lookup if the host isn't an IP. /// Returns the first IPv4 address if one exists, otherwise the first IPv6 address. /// Rust only provides means to resolve a socket addr, not just a host, for some reason. So diff --git a/mullvad-types/src/relay_constraints.rs b/mullvad-types/src/relay_constraints.rs index ebc2b627b3..fffc6e03de 100644 --- a/mullvad-types/src/relay_constraints.rs +++ b/mullvad-types/src/relay_constraints.rs @@ -197,7 +197,7 @@ where /// relay. #[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "snake_case")] -#[cfg_attr(target_os = "android", derive(IntoJava))] +#[cfg_attr(target_os = "android", derive(IntoJava, FromJava))] #[cfg_attr(target_os = "android", jnix(package = "net.mullvad.mullvadvpn.model"))] pub enum RelaySettings { CustomTunnelEndpoint(CustomTunnelEndpoint), @@ -415,6 +415,77 @@ impl<'a> fmt::Display for RelayConstraintsFormatter<'a> { } } +#[cfg(target_os = "android")] +impl<'env, 'sub_env> FromJava<'env, JObject<'sub_env>> for RelayConstraints +where + 'env: 'sub_env, +{ + const JNI_SIGNATURE: &'static str = "Lnet/mullvad/mullvadvpn/model/RelayConstraints;"; + + fn from_java(env: &JnixEnv<'env>, object: JObject<'sub_env>) -> Self { + let object_location = env + .call_method( + object, + "component1", + "()Lnet/mullvad/mullvadvpn/model/Constraint;", + &[], + ) + .expect("missing RelayConstraints.location") + .l() + .expect("RelayConstraints.location did not return an object"); + + let location: Constraint<LocationConstraint> = Constraint::from_java(env, object_location); + + let object_providers = env + .call_method( + object, + "component2", + "()Lnet/mullvad/mullvadvpn/model/Constraint;", + &[], + ) + .expect("missing RelayConstraints.providers") + .l() + .expect("RelayConstraints.providers did not return an object"); + + let providers: Constraint<Providers> = Constraint::from_java(env, object_providers); + + let object_ownership = env + .call_method( + object, + "component3", + "()Lnet/mullvad/mullvadvpn/model/Constraint;", + &[], + ) + .expect("missing RelayConstraints.providers") + .l() + .expect("RelayConstraints.providers did not return an object"); + + let ownership: Constraint<Ownership> = Constraint::from_java(env, object_ownership); + + let object_wireguard_constraints = env + .call_method( + object, + "component4", + "()Lnet/mullvad/mullvadvpn/model/WireguardConstraints;", + &[], + ) + .expect("missing RelayConstraints.wireguard_constraints") + .l() + .expect("RelayConstraints.wireguard_constraints did not return an object"); + + let wireguard_constraints: WireguardConstraints = + WireguardConstraints::from_java(env, object_wireguard_constraints); + + RelayConstraints { + location, + providers, + ownership, + wireguard_constraints, + ..Default::default() + } + } +} + /// Limits the set of [`crate::relay_list::Relay`]s used by a `RelaySelector` based on /// location. #[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize, PartialOrd, Ord)] |
