From ec007a2b21eaa98b47e9059dffa2e351ec30eb58 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 23 Feb 2024 11:39:58 +0100 Subject: [PATCH 1/3] Provide global proxy to the SDK --- changelog.d/2420.misc | 1 + .../matrix/impl/RustMatrixClientFactory.kt | 12 +++++ .../auth/RustMatrixAuthenticationService.kt | 4 +- .../matrix/impl/proxy/DefaultProxyProvider.kt | 45 +++++++++++++++++++ .../matrix/impl/proxy/ProxyProvider.kt | 21 +++++++++ .../android/samples/minimal/MainActivity.kt | 3 ++ .../samples/minimal/NoOpProxyProvider.kt | 23 ++++++++++ 7 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 changelog.d/2420.misc create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/DefaultProxyProvider.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/ProxyProvider.kt create mode 100644 samples/minimal/src/main/kotlin/io/element/android/samples/minimal/NoOpProxyProvider.kt diff --git a/changelog.d/2420.misc b/changelog.d/2420.misc new file mode 100644 index 0000000000..abe4e5a0ed --- /dev/null +++ b/changelog.d/2420.misc @@ -0,0 +1 @@ +Provide the current system proxy setting to the Rust SDK. diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt index 96670d2a2d..64f152cd9c 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt @@ -19,6 +19,7 @@ package io.element.android.libraries.matrix.impl import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.di.CacheDirectory import io.element.android.libraries.matrix.impl.certificates.UserCertificatesProvider +import io.element.android.libraries.matrix.impl.proxy.ProxyProvider import io.element.android.libraries.network.useragent.UserAgentProvider import io.element.android.libraries.sessionstorage.api.SessionData import io.element.android.libraries.sessionstorage.api.SessionStore @@ -39,6 +40,7 @@ class RustMatrixClientFactory @Inject constructor( private val sessionStore: SessionStore, private val userAgentProvider: UserAgentProvider, private val userCertificatesProvider: UserCertificatesProvider, + private val proxyProvider: ProxyProvider, private val clock: SystemClock, ) { suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) { @@ -48,6 +50,16 @@ class RustMatrixClientFactory @Inject constructor( .username(sessionData.userId) .passphrase(sessionData.passphrase) .userAgent(userAgentProvider.provide()) + .let { + // Sadly ClientBuilder.proxy() does not accept null :/ + // Tracked by https://github.com/matrix-org/matrix-rust-sdk/issues/3159 + val proxy = proxyProvider.provides() + if (proxy != null) { + it.proxy(proxy) + } else { + it + } + } .addRootCertificates(userCertificatesProvider.provides()) // FIXME Quick and dirty fix for stopping version requests on startup https://github.com/matrix-org/matrix-rust-sdk/pull/1376 .serverVersions(listOf("v1.0", "v1.1", "v1.2", "v1.3", "v1.4", "v1.5")) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt index 1f66970fdb..29dd327ae2 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt @@ -33,6 +33,7 @@ import io.element.android.libraries.matrix.impl.certificates.UserCertificatesPro import io.element.android.libraries.matrix.impl.exception.mapClientException import io.element.android.libraries.matrix.impl.keys.PassphraseGenerator import io.element.android.libraries.matrix.impl.mapper.toSessionData +import io.element.android.libraries.matrix.impl.proxy.ProxyProvider import io.element.android.libraries.network.useragent.UserAgentProvider import io.element.android.libraries.sessionstorage.api.LoggedInState import io.element.android.libraries.sessionstorage.api.LoginType @@ -58,6 +59,7 @@ class RustMatrixAuthenticationService @Inject constructor( private val rustMatrixClientFactory: RustMatrixClientFactory, private val passphraseGenerator: PassphraseGenerator, userCertificatesProvider: UserCertificatesProvider, + proxyProvider: ProxyProvider, private val buildMeta: BuildMeta, ) : MatrixAuthenticationService { // Passphrase which will be used for new sessions. Existing sessions will use the passphrase @@ -66,7 +68,7 @@ class RustMatrixAuthenticationService @Inject constructor( private val authService: RustAuthenticationService = RustAuthenticationService( basePath = baseDirectory.absolutePath, passphrase = pendingPassphrase, - proxy = null, + proxy = proxyProvider.provides(), userAgent = userAgentProvider.provide(), additionalRootCertificates = userCertificatesProvider.provides(), oidcConfiguration = oidcConfiguration, diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/DefaultProxyProvider.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/DefaultProxyProvider.kt new file mode 100644 index 0000000000..1a3c9b9b4a --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/DefaultProxyProvider.kt @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.impl.proxy + +import android.content.Context +import android.provider.Settings +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.di.AppScope +import io.element.android.libraries.di.ApplicationContext +import javax.inject.Inject + +/** + * Provides the proxy settings from the system. + * Note that you can configure the global proxy using adb like this: + * ``` + * adb shell settings put global http_proxy https://proxy.example.com:8080 + * ``` + * and to remove it: + * ``` + * adb shell settings delete global http_proxy + * ``` + */ +@ContributesBinding(AppScope::class) +class DefaultProxyProvider @Inject constructor( + @ApplicationContext + private val context: Context +) : ProxyProvider { + override fun provides(): String? { + return Settings.Global.getString(context.contentResolver, Settings.Global.HTTP_PROXY) + } +} diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/ProxyProvider.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/ProxyProvider.kt new file mode 100644 index 0000000000..d193fadf12 --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/ProxyProvider.kt @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.impl.proxy + +interface ProxyProvider { + fun provides(): String? +} diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt index e87e0057d0..1e5d1e7fd9 100644 --- a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt @@ -43,6 +43,7 @@ class MainActivity : ComponentActivity() { val userAgentProvider = SimpleUserAgentProvider("MinimalSample") val sessionStore = InMemorySessionStore() val userCertificatesProvider = NoOpUserCertificatesProvider() + val proxyProvider = NoOpProxyProvider() RustMatrixAuthenticationService( baseDirectory = baseDirectory, coroutineDispatchers = Singleton.coroutineDispatchers, @@ -56,11 +57,13 @@ class MainActivity : ComponentActivity() { sessionStore = sessionStore, userAgentProvider = userAgentProvider, userCertificatesProvider = userCertificatesProvider, + proxyProvider = proxyProvider, clock = DefaultSystemClock(), ), passphraseGenerator = NullPassphraseGenerator(), buildMeta = Singleton.buildMeta, userCertificatesProvider = userCertificatesProvider, + proxyProvider = proxyProvider, ) } diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/NoOpProxyProvider.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/NoOpProxyProvider.kt new file mode 100644 index 0000000000..de6bada759 --- /dev/null +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/NoOpProxyProvider.kt @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.samples.minimal + +import io.element.android.libraries.matrix.impl.proxy.ProxyProvider + +class NoOpProxyProvider : ProxyProvider { + override fun provides(): String? = null +} From d169388a80e33f2b9696250de730006eecd562a9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 26 Feb 2024 10:21:13 +0100 Subject: [PATCH 2/3] Also log the filter value. --- .../android/libraries/matrix/impl/tracing/RustTracingService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt index a03813f347..6c9ec5bbeb 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt @@ -42,7 +42,7 @@ class RustTracingService @Inject constructor(private val buildMeta: BuildMeta) : }, ) org.matrix.rustcomponents.sdk.setupTracing(rustTracingConfiguration) - Timber.v("Tracing config filter = $filter") + Timber.v("Tracing config filter = $filter: ${filter.filter}") } override fun createTimberTree(): Timber.Tree { From 0994960b79d6682dca83c87184cbe1a0f3825810 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 26 Feb 2024 11:01:01 +0100 Subject: [PATCH 3/3] Log the fact that the application is using the global proxy. --- .../libraries/matrix/impl/proxy/DefaultProxyProvider.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/DefaultProxyProvider.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/DefaultProxyProvider.kt index 1a3c9b9b4a..5657cd0811 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/DefaultProxyProvider.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/DefaultProxyProvider.kt @@ -21,6 +21,7 @@ import android.provider.Settings import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext +import timber.log.Timber import javax.inject.Inject /** @@ -41,5 +42,8 @@ class DefaultProxyProvider @Inject constructor( ) : ProxyProvider { override fun provides(): String? { return Settings.Global.getString(context.contentResolver, Settings.Global.HTTP_PROXY) + ?.also { + Timber.d("Using global proxy") + } } }