summaryrefslogtreecommitdiffhomepage
path: root/mullvad-ios/src/api_client
diff options
context:
space:
mode:
authorJon Petersson <jon.petersson@mullvad.net>2025-06-25 14:43:35 +0200
committerJon Petersson <jon.petersson@mullvad.net>2025-07-08 12:04:35 +0200
commit7ded39e1f58396baa401b93576dd4650e0836645 (patch)
treee275fbf4cd1a23ea38bef30e45f87c233e5c3c72 /mullvad-ios/src/api_client
parent216653151569b218ca8f0d78a8585595147a16b9 (diff)
downloadmullvadvpn-7ded39e1f58396baa401b93576dd4650e0836645.tar.xz
mullvadvpn-7ded39e1f58396baa401b93576dd4650e0836645.zip
Update FFI to handle new QUIC params
Diffstat (limited to 'mullvad-ios/src/api_client')
-rw-r--r--mullvad-ios/src/api_client/access_method_settings.rs6
-rw-r--r--mullvad-ios/src/api_client/address_cache_provider.rs5
-rw-r--r--mullvad-ios/src/api_client/helpers.rs22
-rw-r--r--mullvad-ios/src/api_client/mod.rs33
-rw-r--r--mullvad-ios/src/api_client/storekit.rs9
5 files changed, 24 insertions, 51 deletions
diff --git a/mullvad-ios/src/api_client/access_method_settings.rs b/mullvad-ios/src/api_client/access_method_settings.rs
index 35a90d1f0c..2870047e24 100644
--- a/mullvad-ios/src/api_client/access_method_settings.rs
+++ b/mullvad-ios/src/api_client/access_method_settings.rs
@@ -11,7 +11,7 @@ use mullvad_types::access_method::{
};
use talpid_types::net::proxy::{self, Shadowsocks, Socks5Remote};
-use super::helpers::convert_c_string;
+use crate::get_string;
/// Converts parameters into a `Box<AccessMethodSetting>` raw representation that
/// can be passed across the FFI boundary
@@ -54,9 +54,9 @@ fn convert_builtin_access_method_setting_inner(
proxy_configuration: *const c_void,
) -> Option<AccessMethodSetting> {
// SAFETY: See `convert_builtin_access_method_setting`
- let id = Id::from_string(unsafe { convert_c_string(unique_identifier) })?;
+ let id = unsafe { Id::from_string(get_string(unique_identifier))? };
// SAFETY: See `convert_builtin_access_method_setting`
- let name = unsafe { convert_c_string(name) };
+ let name = unsafe { get_string(name) };
match method_kind {
SwiftAccessMethodKind::KindDirect => Some(AccessMethodSetting::with_id(
id,
diff --git a/mullvad-ios/src/api_client/address_cache_provider.rs b/mullvad-ios/src/api_client/address_cache_provider.rs
index f813683445..9d5f656c62 100644
--- a/mullvad-ios/src/api_client/address_cache_provider.rs
+++ b/mullvad-ios/src/api_client/address_cache_provider.rs
@@ -1,7 +1,8 @@
-use super::helpers::convert_c_string;
use libc::c_char;
use std::{ffi::c_void, net::SocketAddr};
+use super::get_string;
+
extern "C" {
/// Return the latest available endpoint, or a default one if none are cached
///
@@ -58,7 +59,7 @@ impl SwiftAddressCacheProviderContext {
// SAFETY: The pointer contained in the late deallocator returned by `swift_get_cached_endpoint`
// is guaranteed to point to a valid UTF-8 String
// It is also guaranteed to be a valid representation of either an IPv4 or IPv6 address
- let cached_address = unsafe { convert_c_string(deallocator.ptr) }
+ let cached_address = unsafe { get_string(deallocator.ptr) }
.parse()
.expect("Invalid socket address in cache");
diff --git a/mullvad-ios/src/api_client/helpers.rs b/mullvad-ios/src/api_client/helpers.rs
index f331e56a9b..556b679d71 100644
--- a/mullvad-ios/src/api_client/helpers.rs
+++ b/mullvad-ios/src/api_client/helpers.rs
@@ -1,10 +1,12 @@
use std::{
- ffi::{c_char, c_void, CStr},
+ ffi::{c_char, c_void},
net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr},
};
use talpid_types::net::proxy::{Shadowsocks, Socks5Remote, SocksAuth};
+use super::get_string;
+
/// Constructs a new IP address from a pointer containing bytes representing an IP address.
///
/// SAFETY: `addr` pointer must be non-null, aligned, and point to at least addr_len bytes
@@ -30,16 +32,6 @@ pub(crate) unsafe fn parse_ip_addr(addr: *const u8, addr_len: usize) -> Option<I
}
}
-/// Converts a pointer to a C style string into an owned Rust `String`
-///
-/// # SAFETY
-/// `c_str` must point to a valid, null terminated C string.
-pub unsafe fn convert_c_string(c_str: *const c_char) -> String {
- // SAFETY: c_str points to a valid region of memory and contains a null terminator.
- let str = unsafe { CStr::from_ptr(c_str) };
- String::from_utf8_lossy(str.to_bytes()).into_owned()
-}
-
/// Converts parameters into a boxed `Shadowsocks` configuration that is safe
/// to send across the FFI boundary
///
@@ -60,8 +52,8 @@ pub unsafe extern "C" fn new_shadowsocks_access_method_setting(
return std::ptr::null();
};
- let password = convert_c_string(c_password);
- let cipher = convert_c_string(c_cipher);
+ let password = get_string(c_password);
+ let cipher = get_string(c_cipher);
let shadowsocks_configuration = Shadowsocks {
endpoint,
@@ -97,8 +89,8 @@ pub unsafe extern "C" fn new_socks5_access_method_setting(
if c_username.is_null() || c_password.is_null() {
None
} else {
- let username = convert_c_string(c_username);
- let password = convert_c_string(c_password);
+ let username = get_string(c_username);
+ let password = get_string(c_password);
SocksAuth::new(username, password).ok()
}
};
diff --git a/mullvad-ios/src/api_client/mod.rs b/mullvad-ios/src/api_client/mod.rs
index 4e875fe4c6..1c45fb3397 100644
--- a/mullvad-ios/src/api_client/mod.rs
+++ b/mullvad-ios/src/api_client/mod.rs
@@ -1,9 +1,9 @@
-use std::{ffi::c_char, ffi::CStr, future::Future, sync::Arc};
+use std::{ffi::c_char, future::Future, sync::Arc};
+use crate::get_string;
use access_method_resolver::SwiftAccessMethodResolver;
use access_method_settings::SwiftAccessMethodSettingsWrapper;
use address_cache_provider::SwiftAddressCacheWrapper;
-use helpers::convert_c_string;
use mullvad_api::{
access_mode::{AccessModeSelector, AccessModeSelectorHandle},
rest::{self, MullvadRestHandle},
@@ -108,8 +108,8 @@ pub unsafe extern "C" fn mullvad_api_use_access_method(
access_method_id: *const c_char,
) {
let api_context = api_context.rust_context();
- // SAFETY: See Safety notes for `convert_c_string`
- let id = unsafe { convert_c_string(access_method_id) };
+ // SAFETY: See Safety notes for `get_string`
+ let id = get_string(access_method_id);
let Some(id) = Id::from_string(id) else {
return;
@@ -214,14 +214,9 @@ pub extern "C" fn mullvad_api_init_inner(
settings_provider: SwiftAccessMethodSettingsWrapper,
address_cache: SwiftAddressCacheWrapper,
) -> SwiftApiContext {
- // Safety: See notes for `convert_c_string`
- let (host, address, domain) = unsafe {
- (
- convert_c_string(host),
- convert_c_string(address),
- convert_c_string(domain),
- )
- };
+ // Safety: See notes for `get_string`
+ let (host, address, domain) =
+ unsafe { (get_string(host), get_string(address), get_string(domain)) };
// The iOS client provides a different default endpoint based on its configuration
// Debug and Release builds use the standard endpoints
@@ -314,17 +309,3 @@ where
retry_future(future_factory, should_retry, retry_strategy.delays()).await
}
-
-/// Try to convert a C string to an owned [String]. if `ptr` is null, an empty [String] is
-/// returned.
-///
-/// # Safety
-/// - `ptr` must uphold all safety invariants as required by [CStr::from_ptr].
-fn get_string(ptr: *const c_char) -> String {
- if ptr.is_null() {
- return String::new();
- }
- // Safety: See function doc comment.
- let cstr = unsafe { CStr::from_ptr(ptr) };
- cstr.to_str().map(ToOwned::to_owned).unwrap_or_default()
-}
diff --git a/mullvad-ios/src/api_client/storekit.rs b/mullvad-ios/src/api_client/storekit.rs
index 61967eec9b..994e6628d7 100644
--- a/mullvad-ios/src/api_client/storekit.rs
+++ b/mullvad-ios/src/api_client/storekit.rs
@@ -9,8 +9,7 @@ use mullvad_types::account::AccountNumber;
use super::{
cancellation::{RequestCancelHandle, SwiftCancelHandle},
completion::{CompletionCookie, SwiftCompletionHandler},
- do_request,
- helpers::convert_c_string,
+ do_request, get_string,
response::SwiftMullvadApiResponse,
retry_strategy::{RetryStrategy, SwiftRetryStrategy},
SwiftApiContext,
@@ -58,7 +57,7 @@ pub unsafe extern "C" fn mullvad_ios_legacy_storekit_payment(
let completion = completion_handler.clone();
// SAFETY: See param documentation for `account_number`.
- let account_number = unsafe { AccountNumber::from(convert_c_string(account_number)) };
+ let account_number = AccountNumber::from(get_string(account_number));
// SAFETY: See param documentation for `body`.
let body = unsafe { std::slice::from_raw_parts(body, body_size) }.to_vec();
@@ -133,7 +132,7 @@ pub unsafe extern "C" fn mullvad_ios_init_storekit_payment(
let completion = completion_handler.clone();
// SAFETY: See param documentation for `account_number`.
- let account_number = unsafe { AccountNumber::from(convert_c_string(account_number)) };
+ let account_number = AccountNumber::from(get_string(account_number));
let task = tokio_handle.spawn(async move {
match mullvad_ios_init_storekit_payment_inner(
@@ -208,7 +207,7 @@ pub unsafe extern "C" fn mullvad_ios_check_storekit_payment(
let completion = completion_handler.clone();
// SAFETY: See param documentation for `account_number`.
- let account_number = unsafe { AccountNumber::from(convert_c_string(account_number)) };
+ let account_number = AccountNumber::from(get_string(account_number));
// SAFETY: See param documentation for `body`.
let body = unsafe { std::slice::from_raw_parts(body, body_size) }.to_vec();