Provide global proxy to the SDK
This commit is contained in:
parent
0f563d712a
commit
ec82072b4d
7 changed files with 108 additions and 1 deletions
1
changelog.d/2420.misc
Normal file
1
changelog.d/2420.misc
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Provide the current system proxy setting to the Rust SDK.
|
||||||
|
|
@ -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"))
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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?
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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…
Add table
Add a link
Reference in a new issue