From 457af2a2f8756f174e4e59184ee51d378c304ff2 Mon Sep 17 00:00:00 2001 From: Daniel Salinas Date: Tue, 24 Jun 2025 08:22:43 -0400 Subject: [PATCH] feat(wasm): Remove network config features from ffi ClientBuilder for Wasm (#5248) Features to configure UserAgent, Proxy, Disabling SSL, and additional certificates are not available on Wasm platforms. We remove these configuration options from the FFI layer, while preserving them on non-Wasm platforms. - [ ] Public API changes documented in changelogs (optional) Signed-off-by: Daniel Salinas --------- Co-authored-by: Daniel Salinas --- bindings/matrix-sdk-ffi/src/client_builder.rs | 158 ++++++++++-------- 1 file changed, 86 insertions(+), 72 deletions(-) diff --git a/bindings/matrix-sdk-ffi/src/client_builder.rs b/bindings/matrix-sdk-ffi/src/client_builder.rs index 5788249ca..829ff9956 100644 --- a/bindings/matrix-sdk-ffi/src/client_builder.rs +++ b/bindings/matrix-sdk-ffi/src/client_builder.rs @@ -1,13 +1,14 @@ use std::{fs, num::NonZeroUsize, path::Path, sync::Arc, time::Duration}; use futures_util::StreamExt; +#[cfg(not(target_family = "wasm"))] +use matrix_sdk::reqwest::Certificate; use matrix_sdk::{ crypto::{ types::qr_login::QrCodeModeData, CollectStrategy, DecryptionSettings, TrustRequirement, }, encryption::{BackupDownloadStrategy, EncryptionSettings}, event_cache::EventCacheError, - reqwest::Certificate, ruma::{ServerName, UserId}, sliding_sync::{ Error as MatrixSlidingSyncError, VersionBuilder as MatrixSlidingSyncVersionBuilder, @@ -118,21 +119,27 @@ pub struct ClientBuilder { system_is_memory_constrained: bool, username: Option, homeserver_cfg: Option, - user_agent: Option, sliding_sync_version_builder: SlidingSyncVersionBuilder, - proxy: Option, - disable_ssl_verification: bool, disable_automatic_token_refresh: bool, cross_process_store_locks_holder_name: Option, enable_oidc_refresh_lock: bool, session_delegate: Option>, - additional_root_certificates: Vec>, - disable_built_in_root_certificates: bool, encryption_settings: EncryptionSettings, room_key_recipient_strategy: CollectStrategy, decryption_settings: DecryptionSettings, enable_share_history_on_invite: bool, request_config: Option, + + #[cfg(not(target_family = "wasm"))] + user_agent: Option, + #[cfg(not(target_family = "wasm"))] + proxy: Option, + #[cfg(not(target_family = "wasm"))] + disable_ssl_verification: bool, + #[cfg(not(target_family = "wasm"))] + disable_built_in_root_certificates: bool, + #[cfg(not(target_family = "wasm"))] + additional_root_certificates: Vec>, } #[matrix_sdk_ffi_macros::export] @@ -301,12 +308,6 @@ impl ClientBuilder { Arc::new(builder) } - pub fn user_agent(self: Arc, user_agent: String) -> Arc { - let mut builder = unwrap_or_clone_arc(self); - builder.user_agent = Some(user_agent); - Arc::new(builder) - } - pub fn sliding_sync_version_builder( self: Arc, version_builder: SlidingSyncVersionBuilder, @@ -316,43 +317,12 @@ impl ClientBuilder { Arc::new(builder) } - pub fn proxy(self: Arc, url: String) -> Arc { - let mut builder = unwrap_or_clone_arc(self); - builder.proxy = Some(url); - Arc::new(builder) - } - - pub fn disable_ssl_verification(self: Arc) -> Arc { - let mut builder = unwrap_or_clone_arc(self); - builder.disable_ssl_verification = true; - Arc::new(builder) - } - pub fn disable_automatic_token_refresh(self: Arc) -> Arc { let mut builder = unwrap_or_clone_arc(self); builder.disable_automatic_token_refresh = true; Arc::new(builder) } - pub fn add_root_certificates( - self: Arc, - certificates: Vec, - ) -> Arc { - let mut builder = unwrap_or_clone_arc(self); - builder.additional_root_certificates = certificates; - - Arc::new(builder) - } - - /// Don't trust any system root certificates, only trust the certificates - /// provided through - /// [`add_root_certificates`][ClientBuilder::add_root_certificates]. - pub fn disable_built_in_root_certificates(self: Arc) -> Arc { - let mut builder = unwrap_or_clone_arc(self); - builder.disable_built_in_root_certificates = true; - Arc::new(builder) - } - pub fn auto_enable_cross_signing( self: Arc, auto_enable_cross_signing: bool, @@ -496,48 +466,51 @@ impl ClientBuilder { } }; - let mut certificates = Vec::new(); + #[cfg(not(target_family = "wasm"))] + { + let mut certificates = Vec::new(); - for certificate in builder.additional_root_certificates { - // We don't really know what type of certificate we may get here, so let's try - // first one type, then the other. - match Certificate::from_der(&certificate) { - Ok(cert) => { - certificates.push(cert); - } - Err(der_error) => { - let cert = Certificate::from_pem(&certificate).map_err(|pem_error| { - ClientBuildError::Generic { - message: format!("Failed to add a root certificate as DER ({der_error:?}) or PEM ({pem_error:?})"), - } - })?; - certificates.push(cert); + for certificate in builder.additional_root_certificates { + // We don't really know what type of certificate we may get here, so let's try + // first one type, then the other. + match Certificate::from_der(&certificate) { + Ok(cert) => { + certificates.push(cert); + } + Err(der_error) => { + let cert = Certificate::from_pem(&certificate).map_err(|pem_error| { + ClientBuildError::Generic { + message: format!("Failed to add a root certificate as DER ({der_error:?}) or PEM ({pem_error:?})"), + } + })?; + certificates.push(cert); + } } } - } - inner_builder = inner_builder.add_root_certificates(certificates); + inner_builder = inner_builder.add_root_certificates(certificates); - if builder.disable_built_in_root_certificates { - inner_builder = inner_builder.disable_built_in_root_certificates(); - } + if builder.disable_built_in_root_certificates { + inner_builder = inner_builder.disable_built_in_root_certificates(); + } - if let Some(proxy) = builder.proxy { - inner_builder = inner_builder.proxy(proxy); - } + if let Some(proxy) = builder.proxy { + inner_builder = inner_builder.proxy(proxy); + } - if builder.disable_ssl_verification { - inner_builder = inner_builder.disable_ssl_verification(); + if builder.disable_ssl_verification { + inner_builder = inner_builder.disable_ssl_verification(); + } + + if let Some(user_agent) = builder.user_agent { + inner_builder = inner_builder.user_agent(user_agent); + } } if !builder.disable_automatic_token_refresh { inner_builder = inner_builder.handle_refresh_tokens(); } - if let Some(user_agent) = builder.user_agent { - inner_builder = inner_builder.user_agent(user_agent); - } - inner_builder = inner_builder .with_encryption_settings(builder.encryption_settings) .with_room_key_recipient_strategy(builder.room_key_recipient_strategy) @@ -650,6 +623,47 @@ impl ClientBuilder { } } +#[cfg(not(target_family = "wasm"))] +#[matrix_sdk_ffi_macros::export] +impl ClientBuilder { + pub fn proxy(self: Arc, url: String) -> Arc { + let mut builder = unwrap_or_clone_arc(self); + builder.proxy = Some(url); + Arc::new(builder) + } + + pub fn disable_ssl_verification(self: Arc) -> Arc { + let mut builder = unwrap_or_clone_arc(self); + builder.disable_ssl_verification = true; + Arc::new(builder) + } + + pub fn add_root_certificates( + self: Arc, + certificates: Vec, + ) -> Arc { + let mut builder = unwrap_or_clone_arc(self); + builder.additional_root_certificates = certificates; + + Arc::new(builder) + } + + /// Don't trust any system root certificates, only trust the certificates + /// provided through + /// [`add_root_certificates`][ClientBuilder::add_root_certificates]. + pub fn disable_built_in_root_certificates(self: Arc) -> Arc { + let mut builder = unwrap_or_clone_arc(self); + builder.disable_built_in_root_certificates = true; + Arc::new(builder) + } + + pub fn user_agent(self: Arc, user_agent: String) -> Arc { + let mut builder = unwrap_or_clone_arc(self); + builder.user_agent = Some(user_agent); + Arc::new(builder) + } +} + /// The store paths the client will use when built. #[derive(Clone)] struct SessionPaths {