Browse Source

Merge pull request #2435 from element-hq/feature/bma/proxyConfig

Provide global proxy to the SDK
pull/2444/head
Benoit Marty 7 months ago committed by GitHub
parent
commit
5939c64158
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      changelog.d/2420.misc
  2. 12
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt
  3. 4
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt
  4. 49
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/DefaultProxyProvider.kt
  5. 21
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/ProxyProvider.kt
  6. 2
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt
  7. 3
      samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt
  8. 23
      samples/minimal/src/main/kotlin/io/element/android/samples/minimal/NoOpProxyProvider.kt

1
changelog.d/2420.misc

@ -0,0 +1 @@
Provide the current system proxy setting to the Rust SDK.

12
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.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.di.CacheDirectory import io.element.android.libraries.di.CacheDirectory
import io.element.android.libraries.matrix.impl.certificates.UserCertificatesProvider 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.network.useragent.UserAgentProvider
import io.element.android.libraries.sessionstorage.api.SessionData import io.element.android.libraries.sessionstorage.api.SessionData
import io.element.android.libraries.sessionstorage.api.SessionStore import io.element.android.libraries.sessionstorage.api.SessionStore
@ -39,6 +40,7 @@ class RustMatrixClientFactory @Inject constructor(
private val sessionStore: SessionStore, private val sessionStore: SessionStore,
private val userAgentProvider: UserAgentProvider, private val userAgentProvider: UserAgentProvider,
private val userCertificatesProvider: UserCertificatesProvider, private val userCertificatesProvider: UserCertificatesProvider,
private val proxyProvider: ProxyProvider,
private val clock: SystemClock, private val clock: SystemClock,
) { ) {
suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) { suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) {
@ -48,6 +50,16 @@ class RustMatrixClientFactory @Inject constructor(
.username(sessionData.userId) .username(sessionData.userId)
.passphrase(sessionData.passphrase) .passphrase(sessionData.passphrase)
.userAgent(userAgentProvider.provide()) .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()) .addRootCertificates(userCertificatesProvider.provides())
// FIXME Quick and dirty fix for stopping version requests on startup https://github.com/matrix-org/matrix-rust-sdk/pull/1376 // 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")) .serverVersions(listOf("v1.0", "v1.1", "v1.2", "v1.3", "v1.4", "v1.5"))

4
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.exception.mapClientException
import io.element.android.libraries.matrix.impl.keys.PassphraseGenerator 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.mapper.toSessionData
import io.element.android.libraries.matrix.impl.proxy.ProxyProvider
import io.element.android.libraries.network.useragent.UserAgentProvider import io.element.android.libraries.network.useragent.UserAgentProvider
import io.element.android.libraries.sessionstorage.api.LoggedInState import io.element.android.libraries.sessionstorage.api.LoggedInState
import io.element.android.libraries.sessionstorage.api.LoginType import io.element.android.libraries.sessionstorage.api.LoginType
@ -58,6 +59,7 @@ class RustMatrixAuthenticationService @Inject constructor(
private val rustMatrixClientFactory: RustMatrixClientFactory, private val rustMatrixClientFactory: RustMatrixClientFactory,
private val passphraseGenerator: PassphraseGenerator, private val passphraseGenerator: PassphraseGenerator,
userCertificatesProvider: UserCertificatesProvider, userCertificatesProvider: UserCertificatesProvider,
proxyProvider: ProxyProvider,
private val buildMeta: BuildMeta, private val buildMeta: BuildMeta,
) : MatrixAuthenticationService { ) : MatrixAuthenticationService {
// Passphrase which will be used for new sessions. Existing sessions will use the passphrase // 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( private val authService: RustAuthenticationService = RustAuthenticationService(
basePath = baseDirectory.absolutePath, basePath = baseDirectory.absolutePath,
passphrase = pendingPassphrase, passphrase = pendingPassphrase,
proxy = null, proxy = proxyProvider.provides(),
userAgent = userAgentProvider.provide(), userAgent = userAgentProvider.provide(),
additionalRootCertificates = userCertificatesProvider.provides(), additionalRootCertificates = userCertificatesProvider.provides(),
oidcConfiguration = oidcConfiguration, oidcConfiguration = oidcConfiguration,

49
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/DefaultProxyProvider.kt

@ -0,0 +1,49 @@
/*
* 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 timber.log.Timber
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)
?.also {
Timber.d("Using global proxy")
}
}
}

21
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?
}

2
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) 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 { override fun createTimberTree(): Timber.Tree {

3
samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt

@ -43,6 +43,7 @@ class MainActivity : ComponentActivity() {
val userAgentProvider = SimpleUserAgentProvider("MinimalSample") val userAgentProvider = SimpleUserAgentProvider("MinimalSample")
val sessionStore = InMemorySessionStore() val sessionStore = InMemorySessionStore()
val userCertificatesProvider = NoOpUserCertificatesProvider() val userCertificatesProvider = NoOpUserCertificatesProvider()
val proxyProvider = NoOpProxyProvider()
RustMatrixAuthenticationService( RustMatrixAuthenticationService(
baseDirectory = baseDirectory, baseDirectory = baseDirectory,
coroutineDispatchers = Singleton.coroutineDispatchers, coroutineDispatchers = Singleton.coroutineDispatchers,
@ -56,11 +57,13 @@ class MainActivity : ComponentActivity() {
sessionStore = sessionStore, sessionStore = sessionStore,
userAgentProvider = userAgentProvider, userAgentProvider = userAgentProvider,
userCertificatesProvider = userCertificatesProvider, userCertificatesProvider = userCertificatesProvider,
proxyProvider = proxyProvider,
clock = DefaultSystemClock(), clock = DefaultSystemClock(),
), ),
passphraseGenerator = NullPassphraseGenerator(), passphraseGenerator = NullPassphraseGenerator(),
buildMeta = Singleton.buildMeta, buildMeta = Singleton.buildMeta,
userCertificatesProvider = userCertificatesProvider, userCertificatesProvider = userCertificatesProvider,
proxyProvider = proxyProvider,
) )
} }

23
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
}
Loading…
Cancel
Save