Use OkHttpClient with certificate to download files, and to perform wellknown request, and to get terms
This commit is contained in:
parent
6721e33c7e
commit
ba26aee54c
@ -89,6 +89,7 @@ interface AuthenticationService {
|
|||||||
* Perform a wellknown request, using the domain from the matrixId
|
* Perform a wellknown request, using the domain from the matrixId
|
||||||
*/
|
*/
|
||||||
fun getWellKnownData(matrixId: String,
|
fun getWellKnownData(matrixId: String,
|
||||||
|
homeServerConnectionConfig: HomeServerConnectionConfig?,
|
||||||
callback: MatrixCallback<WellknownResult>): Cancelable
|
callback: MatrixCallback<WellknownResult>): Cancelable
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -215,7 +215,7 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||||||
|
|
||||||
// Create a fake userId, for the getWellknown task
|
// Create a fake userId, for the getWellknown task
|
||||||
val fakeUserId = "@alice:$domain"
|
val fakeUserId = "@alice:$domain"
|
||||||
val wellknownResult = getWellknownTask.execute(GetWellknownTask.Params(fakeUserId))
|
val wellknownResult = getWellknownTask.execute(GetWellknownTask.Params(fakeUserId, homeServerConnectionConfig))
|
||||||
|
|
||||||
return when (wellknownResult) {
|
return when (wellknownResult) {
|
||||||
is WellknownResult.Prompt -> {
|
is WellknownResult.Prompt -> {
|
||||||
@ -327,9 +327,11 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getWellKnownData(matrixId: String, callback: MatrixCallback<WellknownResult>): Cancelable {
|
override fun getWellKnownData(matrixId: String,
|
||||||
|
homeServerConnectionConfig: HomeServerConnectionConfig?,
|
||||||
|
callback: MatrixCallback<WellknownResult>): Cancelable {
|
||||||
return getWellknownTask
|
return getWellknownTask
|
||||||
.configureWith(GetWellknownTask.Params(matrixId)) {
|
.configureWith(GetWellknownTask.Params(matrixId, homeServerConnectionConfig)) {
|
||||||
this.callback = callback
|
this.callback = callback
|
||||||
}
|
}
|
||||||
.executeBy(taskExecutor)
|
.executeBy(taskExecutor)
|
||||||
|
@ -26,6 +26,7 @@ import im.vector.matrix.android.internal.auth.data.PasswordLoginParams
|
|||||||
import im.vector.matrix.android.internal.di.Unauthenticated
|
import im.vector.matrix.android.internal.di.Unauthenticated
|
||||||
import im.vector.matrix.android.internal.network.RetrofitFactory
|
import im.vector.matrix.android.internal.network.RetrofitFactory
|
||||||
import im.vector.matrix.android.internal.network.executeRequest
|
import im.vector.matrix.android.internal.network.executeRequest
|
||||||
|
import im.vector.matrix.android.internal.network.httpclient.addSocketFactory
|
||||||
import im.vector.matrix.android.internal.task.Task
|
import im.vector.matrix.android.internal.task.Task
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@ -47,7 +48,8 @@ internal class DefaultDirectLoginTask @Inject constructor(
|
|||||||
) : DirectLoginTask {
|
) : DirectLoginTask {
|
||||||
|
|
||||||
override suspend fun execute(params: DirectLoginTask.Params): Session {
|
override suspend fun execute(params: DirectLoginTask.Params): Session {
|
||||||
val authAPI = retrofitFactory.create(okHttpClient, params.homeServerConnectionConfig.homeServerUri.toString())
|
val client = buildClient(params.homeServerConnectionConfig)
|
||||||
|
val authAPI = retrofitFactory.create(client, params.homeServerConnectionConfig.homeServerUri.toString())
|
||||||
.create(AuthAPI::class.java)
|
.create(AuthAPI::class.java)
|
||||||
|
|
||||||
val loginParams = PasswordLoginParams.userIdentifier(params.userId, params.password, params.deviceName)
|
val loginParams = PasswordLoginParams.userIdentifier(params.userId, params.password, params.deviceName)
|
||||||
@ -58,4 +60,11 @@ internal class DefaultDirectLoginTask @Inject constructor(
|
|||||||
|
|
||||||
return sessionCreator.createSession(credentials, params.homeServerConnectionConfig)
|
return sessionCreator.createSession(credentials, params.homeServerConnectionConfig)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun buildClient(homeServerConnectionConfig: HomeServerConnectionConfig): OkHttpClient {
|
||||||
|
return okHttpClient.get()
|
||||||
|
.newBuilder()
|
||||||
|
.addSocketFactory(homeServerConnectionConfig)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,3 +29,7 @@ internal annotation class AuthenticatedIdentity
|
|||||||
@Qualifier
|
@Qualifier
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
internal annotation class Unauthenticated
|
internal annotation class Unauthenticated
|
||||||
|
|
||||||
|
@Qualifier
|
||||||
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
|
internal annotation class UnauthenticatedWithCertificate
|
||||||
|
@ -35,12 +35,12 @@ internal class PinnedTrustManager(private val fingerprints: List<Fingerprint>?,
|
|||||||
private val defaultTrustManager: X509TrustManager?) : X509TrustManager {
|
private val defaultTrustManager: X509TrustManager?) : X509TrustManager {
|
||||||
|
|
||||||
// Set to false to perform some test
|
// Set to false to perform some test
|
||||||
private val USE_DEAFULT_TRUST_MANAGER = true
|
private val USE_DEFAULT_TRUST_MANAGER = true
|
||||||
|
|
||||||
@Throws(CertificateException::class)
|
@Throws(CertificateException::class)
|
||||||
override fun checkClientTrusted(chain: Array<X509Certificate>, s: String) {
|
override fun checkClientTrusted(chain: Array<X509Certificate>, s: String) {
|
||||||
try {
|
try {
|
||||||
if (defaultTrustManager != null && USE_DEAFULT_TRUST_MANAGER) {
|
if (defaultTrustManager != null && USE_DEFAULT_TRUST_MANAGER) {
|
||||||
defaultTrustManager.checkClientTrusted(chain, s)
|
defaultTrustManager.checkClientTrusted(chain, s)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -57,7 +57,7 @@ internal class PinnedTrustManager(private val fingerprints: List<Fingerprint>?,
|
|||||||
@Throws(CertificateException::class)
|
@Throws(CertificateException::class)
|
||||||
override fun checkServerTrusted(chain: Array<X509Certificate>, s: String) {
|
override fun checkServerTrusted(chain: Array<X509Certificate>, s: String) {
|
||||||
try {
|
try {
|
||||||
if (defaultTrustManager != null && USE_DEAFULT_TRUST_MANAGER) {
|
if (defaultTrustManager != null && USE_DEFAULT_TRUST_MANAGER) {
|
||||||
defaultTrustManager.checkServerTrusted(chain, s)
|
defaultTrustManager.checkServerTrusted(chain, s)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ import im.vector.matrix.android.internal.crypto.attachments.MXEncryptedAttachmen
|
|||||||
import im.vector.matrix.android.internal.di.CacheDirectory
|
import im.vector.matrix.android.internal.di.CacheDirectory
|
||||||
import im.vector.matrix.android.internal.di.ExternalFilesDirectory
|
import im.vector.matrix.android.internal.di.ExternalFilesDirectory
|
||||||
import im.vector.matrix.android.internal.di.SessionCacheDirectory
|
import im.vector.matrix.android.internal.di.SessionCacheDirectory
|
||||||
import im.vector.matrix.android.internal.di.Unauthenticated
|
import im.vector.matrix.android.internal.di.UnauthenticatedWithCertificate
|
||||||
import im.vector.matrix.android.internal.extensions.foldToCallback
|
import im.vector.matrix.android.internal.extensions.foldToCallback
|
||||||
import im.vector.matrix.android.internal.task.TaskExecutor
|
import im.vector.matrix.android.internal.task.TaskExecutor
|
||||||
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
|
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
|
||||||
@ -49,7 +49,7 @@ internal class DefaultFileService @Inject constructor(
|
|||||||
@SessionCacheDirectory
|
@SessionCacheDirectory
|
||||||
private val sessionCacheDirectory: File,
|
private val sessionCacheDirectory: File,
|
||||||
private val contentUrlResolver: ContentUrlResolver,
|
private val contentUrlResolver: ContentUrlResolver,
|
||||||
@Unauthenticated
|
@UnauthenticatedWithCertificate
|
||||||
private val okHttpClient: OkHttpClient,
|
private val okHttpClient: OkHttpClient,
|
||||||
private val coroutineDispatchers: MatrixCoroutineDispatchers,
|
private val coroutineDispatchers: MatrixCoroutineDispatchers,
|
||||||
private val taskExecutor: TaskExecutor
|
private val taskExecutor: TaskExecutor
|
||||||
|
@ -48,6 +48,7 @@ import im.vector.matrix.android.internal.di.SessionDatabase
|
|||||||
import im.vector.matrix.android.internal.di.SessionFilesDirectory
|
import im.vector.matrix.android.internal.di.SessionFilesDirectory
|
||||||
import im.vector.matrix.android.internal.di.SessionId
|
import im.vector.matrix.android.internal.di.SessionId
|
||||||
import im.vector.matrix.android.internal.di.Unauthenticated
|
import im.vector.matrix.android.internal.di.Unauthenticated
|
||||||
|
import im.vector.matrix.android.internal.di.UnauthenticatedWithCertificate
|
||||||
import im.vector.matrix.android.internal.di.UserId
|
import im.vector.matrix.android.internal.di.UserId
|
||||||
import im.vector.matrix.android.internal.di.UserMd5
|
import im.vector.matrix.android.internal.di.UserMd5
|
||||||
import im.vector.matrix.android.internal.eventbus.EventBusTimberLogger
|
import im.vector.matrix.android.internal.eventbus.EventBusTimberLogger
|
||||||
@ -183,18 +184,29 @@ internal abstract class SessionModule {
|
|||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
@Provides
|
||||||
|
@SessionScope
|
||||||
|
@UnauthenticatedWithCertificate
|
||||||
|
fun providesOkHttpClientWithCertificate(@Unauthenticated okHttpClient: OkHttpClient,
|
||||||
|
homeServerConnectionConfig: HomeServerConnectionConfig): OkHttpClient {
|
||||||
|
return okHttpClient
|
||||||
|
.newBuilder()
|
||||||
|
.addSocketFactory(homeServerConnectionConfig)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@Provides
|
@Provides
|
||||||
@SessionScope
|
@SessionScope
|
||||||
@Authenticated
|
@Authenticated
|
||||||
fun providesOkHttpClient(@Unauthenticated okHttpClient: OkHttpClient,
|
fun providesOkHttpClient(@UnauthenticatedWithCertificate okHttpClient: OkHttpClient,
|
||||||
@Authenticated accessTokenProvider: AccessTokenProvider,
|
@Authenticated accessTokenProvider: AccessTokenProvider,
|
||||||
homeServerConnectionConfig: HomeServerConnectionConfig,
|
|
||||||
@SessionId sessionId: String,
|
@SessionId sessionId: String,
|
||||||
@MockHttpInterceptor testInterceptor: TestInterceptor?): OkHttpClient {
|
@MockHttpInterceptor testInterceptor: TestInterceptor?): OkHttpClient {
|
||||||
return okHttpClient.newBuilder()
|
return okHttpClient
|
||||||
|
.newBuilder()
|
||||||
.addAccessTokenInterceptor(accessTokenProvider)
|
.addAccessTokenInterceptor(accessTokenProvider)
|
||||||
.addSocketFactory(homeServerConnectionConfig)
|
|
||||||
.apply {
|
.apply {
|
||||||
if (testInterceptor != null) {
|
if (testInterceptor != null) {
|
||||||
testInterceptor.sessionId = sessionId
|
testInterceptor.sessionId = sessionId
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
package im.vector.matrix.android.internal.session.homeserver
|
package im.vector.matrix.android.internal.session.homeserver
|
||||||
|
|
||||||
import com.zhuinden.monarchy.Monarchy
|
import com.zhuinden.monarchy.Monarchy
|
||||||
|
import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig
|
||||||
import im.vector.matrix.android.api.auth.wellknown.WellknownResult
|
import im.vector.matrix.android.api.auth.wellknown.WellknownResult
|
||||||
import im.vector.matrix.android.api.session.homeserver.HomeServerCapabilities
|
import im.vector.matrix.android.api.session.homeserver.HomeServerCapabilities
|
||||||
import im.vector.matrix.android.internal.auth.version.Versions
|
import im.vector.matrix.android.internal.auth.version.Versions
|
||||||
@ -43,6 +44,7 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
|
|||||||
private val eventBus: EventBus,
|
private val eventBus: EventBus,
|
||||||
private val getWellknownTask: GetWellknownTask,
|
private val getWellknownTask: GetWellknownTask,
|
||||||
private val configExtractor: IntegrationManagerConfigExtractor,
|
private val configExtractor: IntegrationManagerConfigExtractor,
|
||||||
|
private val homeServerConnectionConfig: HomeServerConnectionConfig,
|
||||||
@UserId
|
@UserId
|
||||||
private val userId: String
|
private val userId: String
|
||||||
) : GetHomeServerCapabilitiesTask {
|
) : GetHomeServerCapabilitiesTask {
|
||||||
@ -78,7 +80,7 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
|
|||||||
}.getOrNull()
|
}.getOrNull()
|
||||||
|
|
||||||
val wellknownResult = runCatching {
|
val wellknownResult = runCatching {
|
||||||
getWellknownTask.execute(GetWellknownTask.Params(userId))
|
getWellknownTask.execute(GetWellknownTask.Params(userId, homeServerConnectionConfig))
|
||||||
}.getOrNull()
|
}.getOrNull()
|
||||||
|
|
||||||
insertInDb(capabilities, uploadCapabilities, versions, wellknownResult)
|
insertInDb(capabilities, uploadCapabilities, versions, wellknownResult)
|
||||||
|
@ -36,7 +36,7 @@ import im.vector.matrix.android.api.session.identity.ThreePid
|
|||||||
import im.vector.matrix.android.api.util.Cancelable
|
import im.vector.matrix.android.api.util.Cancelable
|
||||||
import im.vector.matrix.android.api.util.NoOpCancellable
|
import im.vector.matrix.android.api.util.NoOpCancellable
|
||||||
import im.vector.matrix.android.internal.di.AuthenticatedIdentity
|
import im.vector.matrix.android.internal.di.AuthenticatedIdentity
|
||||||
import im.vector.matrix.android.internal.di.Unauthenticated
|
import im.vector.matrix.android.internal.di.UnauthenticatedWithCertificate
|
||||||
import im.vector.matrix.android.internal.extensions.observeNotNull
|
import im.vector.matrix.android.internal.extensions.observeNotNull
|
||||||
import im.vector.matrix.android.internal.network.RetrofitFactory
|
import im.vector.matrix.android.internal.network.RetrofitFactory
|
||||||
import im.vector.matrix.android.internal.session.SessionLifecycleObserver
|
import im.vector.matrix.android.internal.session.SessionLifecycleObserver
|
||||||
@ -68,7 +68,7 @@ internal class DefaultIdentityService @Inject constructor(
|
|||||||
private val identityPingTask: IdentityPingTask,
|
private val identityPingTask: IdentityPingTask,
|
||||||
private val identityDisconnectTask: IdentityDisconnectTask,
|
private val identityDisconnectTask: IdentityDisconnectTask,
|
||||||
private val identityRequestTokenForBindingTask: IdentityRequestTokenForBindingTask,
|
private val identityRequestTokenForBindingTask: IdentityRequestTokenForBindingTask,
|
||||||
@Unauthenticated
|
@UnauthenticatedWithCertificate
|
||||||
private val unauthenticatedOkHttpClient: Lazy<OkHttpClient>,
|
private val unauthenticatedOkHttpClient: Lazy<OkHttpClient>,
|
||||||
@AuthenticatedIdentity
|
@AuthenticatedIdentity
|
||||||
private val okHttpClient: Lazy<OkHttpClient>,
|
private val okHttpClient: Lazy<OkHttpClient>,
|
||||||
|
@ -19,15 +19,13 @@ package im.vector.matrix.android.internal.session.identity
|
|||||||
import dagger.Binds
|
import dagger.Binds
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.Provides
|
import dagger.Provides
|
||||||
import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig
|
|
||||||
import im.vector.matrix.android.internal.database.RealmKeysUtils
|
import im.vector.matrix.android.internal.database.RealmKeysUtils
|
||||||
import im.vector.matrix.android.internal.di.AuthenticatedIdentity
|
import im.vector.matrix.android.internal.di.AuthenticatedIdentity
|
||||||
import im.vector.matrix.android.internal.di.IdentityDatabase
|
import im.vector.matrix.android.internal.di.IdentityDatabase
|
||||||
import im.vector.matrix.android.internal.di.SessionFilesDirectory
|
import im.vector.matrix.android.internal.di.SessionFilesDirectory
|
||||||
import im.vector.matrix.android.internal.di.Unauthenticated
|
import im.vector.matrix.android.internal.di.UnauthenticatedWithCertificate
|
||||||
import im.vector.matrix.android.internal.di.UserMd5
|
import im.vector.matrix.android.internal.di.UserMd5
|
||||||
import im.vector.matrix.android.internal.network.httpclient.addAccessTokenInterceptor
|
import im.vector.matrix.android.internal.network.httpclient.addAccessTokenInterceptor
|
||||||
import im.vector.matrix.android.internal.network.httpclient.addSocketFactory
|
|
||||||
import im.vector.matrix.android.internal.network.token.AccessTokenProvider
|
import im.vector.matrix.android.internal.network.token.AccessTokenProvider
|
||||||
import im.vector.matrix.android.internal.session.SessionModule
|
import im.vector.matrix.android.internal.session.SessionModule
|
||||||
import im.vector.matrix.android.internal.session.SessionScope
|
import im.vector.matrix.android.internal.session.SessionScope
|
||||||
@ -47,13 +45,11 @@ internal abstract class IdentityModule {
|
|||||||
@Provides
|
@Provides
|
||||||
@SessionScope
|
@SessionScope
|
||||||
@AuthenticatedIdentity
|
@AuthenticatedIdentity
|
||||||
fun providesOkHttpClient(@Unauthenticated okHttpClient: OkHttpClient,
|
fun providesOkHttpClient(@UnauthenticatedWithCertificate okHttpClient: OkHttpClient,
|
||||||
@AuthenticatedIdentity accessTokenProvider: AccessTokenProvider,
|
@AuthenticatedIdentity accessTokenProvider: AccessTokenProvider): OkHttpClient {
|
||||||
homeServerConnectionConfig: HomeServerConnectionConfig): OkHttpClient {
|
|
||||||
return okHttpClient
|
return okHttpClient
|
||||||
.newBuilder()
|
.newBuilder()
|
||||||
.addAccessTokenInterceptor(accessTokenProvider)
|
.addAccessTokenInterceptor(accessTokenProvider)
|
||||||
.addSocketFactory(homeServerConnectionConfig)
|
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ import im.vector.matrix.android.api.session.events.model.toModel
|
|||||||
import im.vector.matrix.android.api.session.terms.GetTermsResponse
|
import im.vector.matrix.android.api.session.terms.GetTermsResponse
|
||||||
import im.vector.matrix.android.api.session.terms.TermsService
|
import im.vector.matrix.android.api.session.terms.TermsService
|
||||||
import im.vector.matrix.android.api.util.Cancelable
|
import im.vector.matrix.android.api.util.Cancelable
|
||||||
import im.vector.matrix.android.internal.di.Unauthenticated
|
import im.vector.matrix.android.internal.di.UnauthenticatedWithCertificate
|
||||||
import im.vector.matrix.android.internal.network.NetworkConstants
|
import im.vector.matrix.android.internal.network.NetworkConstants
|
||||||
import im.vector.matrix.android.internal.network.RetrofitFactory
|
import im.vector.matrix.android.internal.network.RetrofitFactory
|
||||||
import im.vector.matrix.android.internal.network.executeRequest
|
import im.vector.matrix.android.internal.network.executeRequest
|
||||||
@ -41,7 +41,7 @@ import okhttp3.OkHttpClient
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
internal class DefaultTermsService @Inject constructor(
|
internal class DefaultTermsService @Inject constructor(
|
||||||
@Unauthenticated
|
@UnauthenticatedWithCertificate
|
||||||
private val unauthenticatedOkHttpClient: Lazy<OkHttpClient>,
|
private val unauthenticatedOkHttpClient: Lazy<OkHttpClient>,
|
||||||
private val accountDataDataSource: AccountDataDataSource,
|
private val accountDataDataSource: AccountDataDataSource,
|
||||||
private val termsAPI: TermsAPI,
|
private val termsAPI: TermsAPI,
|
||||||
|
@ -21,7 +21,7 @@ import dagger.Lazy
|
|||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.Provides
|
import dagger.Provides
|
||||||
import im.vector.matrix.android.api.session.terms.TermsService
|
import im.vector.matrix.android.api.session.terms.TermsService
|
||||||
import im.vector.matrix.android.internal.di.Unauthenticated
|
import im.vector.matrix.android.internal.di.UnauthenticatedWithCertificate
|
||||||
import im.vector.matrix.android.internal.network.RetrofitFactory
|
import im.vector.matrix.android.internal.network.RetrofitFactory
|
||||||
import im.vector.matrix.android.internal.session.SessionScope
|
import im.vector.matrix.android.internal.session.SessionScope
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
@ -34,7 +34,7 @@ internal abstract class TermsModule {
|
|||||||
@Provides
|
@Provides
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@SessionScope
|
@SessionScope
|
||||||
fun providesTermsAPI(@Unauthenticated unauthenticatedOkHttpClient: Lazy<OkHttpClient>,
|
fun providesTermsAPI(@UnauthenticatedWithCertificate unauthenticatedOkHttpClient: Lazy<OkHttpClient>,
|
||||||
retrofitFactory: RetrofitFactory): TermsAPI {
|
retrofitFactory: RetrofitFactory): TermsAPI {
|
||||||
val retrofit = retrofitFactory.create(unauthenticatedOkHttpClient, "https://foo.bar")
|
val retrofit = retrofitFactory.create(unauthenticatedOkHttpClient, "https://foo.bar")
|
||||||
return retrofit.create(TermsAPI::class.java)
|
return retrofit.create(TermsAPI::class.java)
|
||||||
|
@ -19,12 +19,14 @@ package im.vector.matrix.android.internal.wellknown
|
|||||||
import android.util.MalformedJsonException
|
import android.util.MalformedJsonException
|
||||||
import dagger.Lazy
|
import dagger.Lazy
|
||||||
import im.vector.matrix.android.api.MatrixPatterns
|
import im.vector.matrix.android.api.MatrixPatterns
|
||||||
|
import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig
|
||||||
import im.vector.matrix.android.api.auth.data.WellKnown
|
import im.vector.matrix.android.api.auth.data.WellKnown
|
||||||
import im.vector.matrix.android.api.auth.wellknown.WellknownResult
|
import im.vector.matrix.android.api.auth.wellknown.WellknownResult
|
||||||
import im.vector.matrix.android.api.failure.Failure
|
import im.vector.matrix.android.api.failure.Failure
|
||||||
import im.vector.matrix.android.internal.di.Unauthenticated
|
import im.vector.matrix.android.internal.di.Unauthenticated
|
||||||
import im.vector.matrix.android.internal.network.RetrofitFactory
|
import im.vector.matrix.android.internal.network.RetrofitFactory
|
||||||
import im.vector.matrix.android.internal.network.executeRequest
|
import im.vector.matrix.android.internal.network.executeRequest
|
||||||
|
import im.vector.matrix.android.internal.network.httpclient.addSocketFactory
|
||||||
import im.vector.matrix.android.internal.session.homeserver.CapabilitiesAPI
|
import im.vector.matrix.android.internal.session.homeserver.CapabilitiesAPI
|
||||||
import im.vector.matrix.android.internal.session.identity.IdentityAuthAPI
|
import im.vector.matrix.android.internal.session.identity.IdentityAuthAPI
|
||||||
import im.vector.matrix.android.internal.task.Task
|
import im.vector.matrix.android.internal.task.Task
|
||||||
@ -36,7 +38,8 @@ import javax.net.ssl.HttpsURLConnection
|
|||||||
|
|
||||||
internal interface GetWellknownTask : Task<GetWellknownTask.Params, WellknownResult> {
|
internal interface GetWellknownTask : Task<GetWellknownTask.Params, WellknownResult> {
|
||||||
data class Params(
|
data class Params(
|
||||||
val matrixId: String
|
val matrixId: String,
|
||||||
|
val homeServerConnectionConfig: HomeServerConnectionConfig?
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,7 +59,19 @@ internal class DefaultGetWellknownTask @Inject constructor(
|
|||||||
|
|
||||||
val homeServerDomain = params.matrixId.substringAfter(":")
|
val homeServerDomain = params.matrixId.substringAfter(":")
|
||||||
|
|
||||||
return findClientConfig(homeServerDomain)
|
val client = buildClient(params.homeServerConnectionConfig)
|
||||||
|
return findClientConfig(homeServerDomain, client)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildClient(homeServerConnectionConfig: HomeServerConnectionConfig?): OkHttpClient {
|
||||||
|
return if (homeServerConnectionConfig != null) {
|
||||||
|
okHttpClient.get()
|
||||||
|
.newBuilder()
|
||||||
|
.addSocketFactory(homeServerConnectionConfig)
|
||||||
|
.build()
|
||||||
|
} else {
|
||||||
|
okHttpClient.get()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -68,8 +83,8 @@ internal class DefaultGetWellknownTask @Inject constructor(
|
|||||||
*
|
*
|
||||||
* @param domain: homeserver domain, deduced from mx userId (ex: "matrix.org" from userId "@user:matrix.org")
|
* @param domain: homeserver domain, deduced from mx userId (ex: "matrix.org" from userId "@user:matrix.org")
|
||||||
*/
|
*/
|
||||||
private suspend fun findClientConfig(domain: String): WellknownResult {
|
private suspend fun findClientConfig(domain: String, client: OkHttpClient): WellknownResult {
|
||||||
val wellKnownAPI = retrofitFactory.create(okHttpClient, "https://dummy.org")
|
val wellKnownAPI = retrofitFactory.create(client, "https://dummy.org")
|
||||||
.create(WellKnownAPI::class.java)
|
.create(WellKnownAPI::class.java)
|
||||||
|
|
||||||
return try {
|
return try {
|
||||||
@ -84,7 +99,7 @@ internal class DefaultGetWellknownTask @Inject constructor(
|
|||||||
} else {
|
} else {
|
||||||
if (homeServerBaseUrl.isValidUrl()) {
|
if (homeServerBaseUrl.isValidUrl()) {
|
||||||
// Check that HS is a real one
|
// Check that HS is a real one
|
||||||
validateHomeServer(homeServerBaseUrl, wellKnown)
|
validateHomeServer(homeServerBaseUrl, wellKnown, client)
|
||||||
} else {
|
} else {
|
||||||
WellknownResult.FailError
|
WellknownResult.FailError
|
||||||
}
|
}
|
||||||
@ -113,8 +128,8 @@ internal class DefaultGetWellknownTask @Inject constructor(
|
|||||||
/**
|
/**
|
||||||
* Return true if home server is valid, and (if applicable) if identity server is pingable
|
* Return true if home server is valid, and (if applicable) if identity server is pingable
|
||||||
*/
|
*/
|
||||||
private suspend fun validateHomeServer(homeServerBaseUrl: String, wellKnown: WellKnown): WellknownResult {
|
private suspend fun validateHomeServer(homeServerBaseUrl: String, wellKnown: WellKnown, client: OkHttpClient): WellknownResult {
|
||||||
val capabilitiesAPI = retrofitFactory.create(okHttpClient, homeServerBaseUrl)
|
val capabilitiesAPI = retrofitFactory.create(client, homeServerBaseUrl)
|
||||||
.create(CapabilitiesAPI::class.java)
|
.create(CapabilitiesAPI::class.java)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -135,7 +150,7 @@ internal class DefaultGetWellknownTask @Inject constructor(
|
|||||||
WellknownResult.FailError
|
WellknownResult.FailError
|
||||||
} else {
|
} else {
|
||||||
if (identityServerBaseUrl.isValidUrl()) {
|
if (identityServerBaseUrl.isValidUrl()) {
|
||||||
if (validateIdentityServer(identityServerBaseUrl)) {
|
if (validateIdentityServer(identityServerBaseUrl, client)) {
|
||||||
// All is ok
|
// All is ok
|
||||||
WellknownResult.Prompt(homeServerBaseUrl, identityServerBaseUrl, wellKnown)
|
WellknownResult.Prompt(homeServerBaseUrl, identityServerBaseUrl, wellKnown)
|
||||||
} else {
|
} else {
|
||||||
@ -151,8 +166,8 @@ internal class DefaultGetWellknownTask @Inject constructor(
|
|||||||
/**
|
/**
|
||||||
* Return true if identity server is pingable
|
* Return true if identity server is pingable
|
||||||
*/
|
*/
|
||||||
private suspend fun validateIdentityServer(identityServerBaseUrl: String): Boolean {
|
private suspend fun validateIdentityServer(identityServerBaseUrl: String, client: OkHttpClient): Boolean {
|
||||||
val identityPingApi = retrofitFactory.create(okHttpClient, identityServerBaseUrl)
|
val identityPingApi = retrofitFactory.create(client, identityServerBaseUrl)
|
||||||
.create(IdentityAuthAPI::class.java)
|
.create(IdentityAuthAPI::class.java)
|
||||||
|
|
||||||
return try {
|
return try {
|
||||||
|
@ -496,7 +496,8 @@ class LoginViewModel @AssistedInject constructor(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
authenticationService.getWellKnownData(action.username, object : MatrixCallback<WellknownResult> {
|
// TODO Handle certificate error in this case. Direct login is deactivated now, so we will handle that later
|
||||||
|
authenticationService.getWellKnownData(action.username, null, object : MatrixCallback<WellknownResult> {
|
||||||
override fun onSuccess(data: WellknownResult) {
|
override fun onSuccess(data: WellknownResult) {
|
||||||
when (data) {
|
when (data) {
|
||||||
is WellknownResult.Prompt ->
|
is WellknownResult.Prompt ->
|
||||||
|
Loading…
x
Reference in New Issue
Block a user