summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2023-10-27 15:13:25 +0200
committerDavid Lönnhager <david.l@mullvad.net>2023-10-31 00:45:17 +0100
commit64756a535e04aea34bc8101eb4f3e83f52e426cb (patch)
treed75fc82796fd5982b5980455a302519bec24e2e8
parent5c491337ba76b999137fa4c0071ed5b6e0079eb4 (diff)
downloadmullvadvpn-64756a535e04aea34bc8101eb4f3e83f52e426cb.tar.xz
mullvadvpn-64756a535e04aea34bc8101eb4f3e83f52e426cb.zip
Add from java support for relay settings
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt12
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt5
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayListListener.kt3
-rw-r--r--mullvad-types/src/custom_tunnel.rs16
-rw-r--r--mullvad-types/src/relay_constraints.rs73
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)]