diff options
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") |
