summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2025-05-21 11:17:25 +0200
committerDavid Göransson <david.goransson@mullvad.net>2025-05-21 12:42:25 +0200
commit7e7d6734b1c53dcc26774aebca60e5c09201152b (patch)
tree61ea9b4516348eb12120d33d11b851473da9e88e
parentb708e86feb1235a6241cd12e1b8315cea19a12d5 (diff)
downloadmullvadvpn-7e7d6734b1c53dcc26774aebca60e5c09201152b.tar.xz
mullvadvpn-7e7d6734b1c53dcc26774aebca60e5c09201152b.zip
Supply IP address when using API override
Previously we did a DNS lookup for Stagemole and Devmole however, this causes problem when starting the app with no internet and is different from how the app performs in production mode. This commit removes that logic in order to align closer to what we expect in prod.
-rw-r--r--android/lib/endpoint/src/main/kotlin/net/mullvad/mullvadvpn/lib/endpoint/ApiEndpointOverride.kt1
-rw-r--r--android/service/build.gradle.kts3
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt2
-rw-r--r--android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt7
-rw-r--r--mullvad-jni/src/api.rs38
5 files changed, 32 insertions, 19 deletions
diff --git a/android/lib/endpoint/src/main/kotlin/net/mullvad/mullvadvpn/lib/endpoint/ApiEndpointOverride.kt b/android/lib/endpoint/src/main/kotlin/net/mullvad/mullvadvpn/lib/endpoint/ApiEndpointOverride.kt
index 7350aa0d26..3c86b4427a 100644
--- a/android/lib/endpoint/src/main/kotlin/net/mullvad/mullvadvpn/lib/endpoint/ApiEndpointOverride.kt
+++ b/android/lib/endpoint/src/main/kotlin/net/mullvad/mullvadvpn/lib/endpoint/ApiEndpointOverride.kt
@@ -6,6 +6,7 @@ import kotlinx.parcelize.Parcelize
@Parcelize
data class ApiEndpointOverride(
val hostname: String,
+ val address: String,
val port: Int = CUSTOM_ENDPOINT_HTTPS_PORT,
val disableTls: Boolean = false,
val forceDirectConnection: Boolean = true,
diff --git a/android/service/build.gradle.kts b/android/service/build.gradle.kts
index 4fd794c765..004e7a9d7b 100644
--- a/android/service/build.gradle.kts
+++ b/android/service/build.gradle.kts
@@ -46,14 +46,17 @@ android {
isDefault = true
// Not used for production builds.
buildConfigField("String", "API_ENDPOINT", "\"\"")
+ buildConfigField("String", "API_IP", "\"\"")
}
create(Flavors.DEVMOLE) {
dimension = FlavorDimensions.INFRASTRUCTURE
buildConfigField("String", "API_ENDPOINT", "\"api-app.devmole.eu\"")
+ buildConfigField("String", "API_IP", "\"185.217.116.4\"")
}
create(Flavors.STAGEMOLE) {
dimension = FlavorDimensions.INFRASTRUCTURE
buildConfigField("String", "API_ENDPOINT", "\"api-app.stagemole.eu\"")
+ buildConfigField("String", "API_IP", "\"185.217.116.132\"")
}
}
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt
index 9d4636cf07..c33b8ef518 100644
--- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt
@@ -63,7 +63,7 @@ val vpnServiceModule = module {
cacheDir = get(named(CACHE_DIR_NAMED_ARGUMENT)),
apiEndpointOverride =
if (BuildConfig.FLAVOR_infrastructure != "prod") {
- ApiEndpointOverride(BuildConfig.API_ENDPOINT)
+ ApiEndpointOverride(BuildConfig.API_ENDPOINT, BuildConfig.API_IP)
} else {
null
},
diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt
index 6327a54757..314aa1f09e 100644
--- a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt
+++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt
@@ -55,6 +55,11 @@ abstract class MockApiTest {
}
private fun createEndpoint(port: Int): ApiEndpointOverride {
- return ApiEndpointOverride(InetAddress.getLocalHost().hostName, port, disableTls = true)
+ return ApiEndpointOverride(
+ InetAddress.getLocalHost().hostName,
+ InetAddress.getLocalHost().hostAddress!!,
+ port,
+ disableTls = true,
+ )
}
}
diff --git a/mullvad-jni/src/api.rs b/mullvad-jni/src/api.rs
index 81043871f8..e35083eb1b 100644
--- a/mullvad-jni/src/api.rs
+++ b/mullvad-jni/src/api.rs
@@ -2,7 +2,9 @@
use jnix::FromJava;
use jnix::{jni::objects::JObject, JnixEnv};
#[cfg(feature = "api-override")]
-use std::net::{SocketAddr, ToSocketAddrs};
+use std::net::{IpAddr, ToSocketAddrs};
+#[cfg(feature = "api-override")]
+use std::str::FromStr;
#[cfg(feature = "api-override")]
pub fn api_endpoint_from_java(
@@ -14,12 +16,14 @@ pub fn api_endpoint_from_java(
}
let hostname = hostname_from_java(env, endpoint_override);
+ let address = address_from_java(env, endpoint_override);
+ let ip_addr = IpAddr::from_str(&address).expect("Invalid IP address");
let port = port_from_java(env, endpoint_override);
- let address = Some(create_socket_addr(hostname.clone(), port));
+ let socket_addr = (ip_addr, port).to_socket_addrs().unwrap().next().unwrap();
Some(mullvad_api::ApiEndpoint {
host: Some(hostname),
- address,
+ address: Some(socket_addr),
disable_tls: disable_tls_from_java(env, endpoint_override),
force_direct: force_direct_from_java(env, endpoint_override),
})
@@ -36,17 +40,6 @@ pub fn api_endpoint_from_java(
panic!("Trying to set api override when feature is disabled")
}
-/// Resolves the hostname and port to SocketAddr
-#[cfg(feature = "api-override")]
-fn create_socket_addr(hostname: String, port: u16) -> SocketAddr {
- //Resolve ip address from hostname
- (hostname, port)
- .to_socket_addrs()
- .expect("could not resolve address")
- .next()
- .expect("no ip address received")
-}
-
#[cfg(feature = "api-override")]
fn hostname_from_java(env: &JnixEnv<'_>, endpoint_override: JObject<'_>) -> String {
let hostname = env
@@ -59,9 +52,20 @@ fn hostname_from_java(env: &JnixEnv<'_>, endpoint_override: JObject<'_>) -> Stri
}
#[cfg(feature = "api-override")]
+fn address_from_java(env: &JnixEnv<'_>, endpoint_override: JObject<'_>) -> String {
+ let hostname = env
+ .call_method(endpoint_override, "component2", "()Ljava/lang/String;", &[])
+ .expect("missing ApiEndpointOverride.address")
+ .l()
+ .expect("ApiEndpointOverride.address is not a string");
+
+ String::from_java(env, hostname)
+}
+
+#[cfg(feature = "api-override")]
fn port_from_java(env: &JnixEnv<'_>, endpoint_override: JObject<'_>) -> u16 {
let port = env
- .call_method(endpoint_override, "component2", "()I", &[])
+ .call_method(endpoint_override, "component3", "()I", &[])
.expect("missing ApiEndpointOverride.port")
.i()
.expect("ApiEndpointOverride.port is not a int");
@@ -71,7 +75,7 @@ fn port_from_java(env: &JnixEnv<'_>, endpoint_override: JObject<'_>) -> u16 {
#[cfg(feature = "api-override")]
fn disable_tls_from_java(env: &JnixEnv<'_>, endpoint_override: JObject<'_>) -> bool {
- env.call_method(endpoint_override, "component3", "()Z", &[])
+ env.call_method(endpoint_override, "component4", "()Z", &[])
.expect("missing ApiEndpointOverride.disableTls")
.z()
.expect("ApiEndpointOverride.disableTls is not a bool")
@@ -79,7 +83,7 @@ fn disable_tls_from_java(env: &JnixEnv<'_>, endpoint_override: JObject<'_>) -> b
#[cfg(feature = "api-override")]
fn force_direct_from_java(env: &JnixEnv<'_>, endpoint_override: JObject<'_>) -> bool {
- env.call_method(endpoint_override, "component4", "()Z", &[])
+ env.call_method(endpoint_override, "component5", "()Z", &[])
.expect("missing ApiEndpointOverride.forceDirectConnection")
.z()
.expect("ApiEndpointOverride.forceDirectConnection is not a bool")