Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 10f3d62e authored by Fahim M. Choudhury's avatar Fahim M. Choudhury
Browse files

Merge branch '3540-sync-not-working-on-oauth-accounts' into 'main'

refactor: inject AuthorizationService using Hilt

See merge request !166
parents b7c82a32 90dce8ba
Loading
Loading
Loading
Loading
Loading
+19 −8
Original line number Diff line number Diff line
@@ -6,12 +6,10 @@ package at.bitfire.davdroid.network

import android.accounts.Account
import android.content.Context
import android.os.Build
import android.security.KeyChain
import at.bitfire.cert4android.CustomCertManager
import at.bitfire.dav4jvm.BasicDigestAuthHandler
import at.bitfire.dav4jvm.UrlUtils
import at.bitfire.davdroid.BuildConfig
import at.bitfire.davdroid.OpenIdUtils
import at.bitfire.davdroid.db.Credentials
import at.bitfire.davdroid.log.Logger
@@ -27,7 +25,13 @@ import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.flow.MutableStateFlow
import net.openid.appauth.AuthState
import net.openid.appauth.AuthorizationService
import okhttp3.*
import okhttp3.Cache
import okhttp3.ConnectionSpec
import okhttp3.CookieJar
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Protocol
import okhttp3.Response
import okhttp3.brotli.BrotliInterceptor
import okhttp3.internal.tls.OkHostnameVerifier
import okhttp3.logging.HttpLoggingInterceptor
@@ -37,11 +41,14 @@ import java.net.Proxy
import java.net.Socket
import java.security.KeyStore
import java.security.Principal
import java.text.SimpleDateFormat
import java.util.*
import java.util.Locale
import java.util.concurrent.TimeUnit
import java.util.logging.Level
import javax.net.ssl.*
import javax.net.ssl.KeyManager
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManagerFactory
import javax.net.ssl.X509ExtendedKeyManager
import javax.net.ssl.X509TrustManager

class HttpClient private constructor(
    val okHttpClient: OkHttpClient,
@@ -90,10 +97,14 @@ class HttpClient private constructor(

    override fun close() {
        try {
            okHttpClient.cache?.close()
            authService?.dispose()
            okHttpClient.cache?.close()
        } catch (e: Exception) {
           Logger.log.log(Level.INFO, "failed to clear resource on close httpClient", e)
            Logger.log.log(
                Level.WARNING,
                "Failed to clear resource on closing OkHttpClient or disposing AuthorizationService",
                e
            )
        }
    }

+5 −2
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
package at.bitfire.davdroid.network

import android.content.Context
import at.bitfire.davdroid.Constants
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@@ -28,6 +29,8 @@ object OAuthModule {
                    (url.openConnection() as HttpURLConnection).apply {
                        setRequestProperty("User-Agent", HttpClient.UserAgentInterceptor.userAgent)
                    }
                }.build()
                }
                .setBrowserMatcher { it.packageName == Constants.E_BROWSER_PACKAGE_NAME }
                .build()
        )
}
+5 −2
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ abstract class DefaultAccountAuthenticatorService : Service(), OnAccountsUpdateL
    @InstallIn(SingletonComponent::class)
    interface DefaultAccountAuthenticatorServiceEntryPoint {
        fun appDatabase(): AppDatabase
        fun authorizationService(): AuthorizationService
    }

    companion object {
@@ -220,7 +221,9 @@ abstract class DefaultAccountAuthenticatorService : Service(), OnAccountsUpdateL
            val clientSecretString = accountManager.getUserData(account, AccountSettings.KEY_CLIENT_SECRET)
            val clientSecret = OpenIdUtils.getClientAuthentication(clientSecretString)

            val authorizationService = AuthorizationService(context)
            val authorizationService =
                EntryPointAccessors.fromApplication(context, DefaultAccountAuthenticatorServiceEntryPoint::class.java)
                    .authorizationService()

            authorizationService.performTokenRequest(
                tokenRequest,
@@ -249,7 +252,7 @@ abstract class DefaultAccountAuthenticatorService : Service(), OnAccountsUpdateL
                try {
                    authorizationService.dispose()
                } catch (e: Exception) {
                    Logger.log.log(Level.INFO, "failed to dispose oidc authorizationService", e)
                    Logger.log.log(Level.WARNING, "Failed to dispose AuthorizationService", e)
                }
            }

+38 −8
Original line number Diff line number Diff line
@@ -16,20 +16,40 @@ import android.provider.CalendarContract
import android.provider.ContactsContract
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import at.bitfire.dav4jvm.*
import at.bitfire.dav4jvm.exception.*
import at.bitfire.dav4jvm.DavCollection
import at.bitfire.dav4jvm.DavResource
import at.bitfire.dav4jvm.Error
import at.bitfire.dav4jvm.MultiResponseCallback
import at.bitfire.dav4jvm.Response
import at.bitfire.dav4jvm.exception.ConflictException
import at.bitfire.dav4jvm.exception.DavException
import at.bitfire.dav4jvm.exception.ForbiddenException
import at.bitfire.dav4jvm.exception.GoneException
import at.bitfire.dav4jvm.exception.HttpException
import at.bitfire.dav4jvm.exception.NotFoundException
import at.bitfire.dav4jvm.exception.PreconditionFailedException
import at.bitfire.dav4jvm.exception.ServiceUnavailableException
import at.bitfire.dav4jvm.exception.UnauthorizedException
import at.bitfire.dav4jvm.property.GetCTag
import at.bitfire.dav4jvm.property.GetETag
import at.bitfire.dav4jvm.property.ScheduleTag
import at.bitfire.dav4jvm.property.SyncToken
import at.bitfire.davdroid.*
import at.bitfire.davdroid.Constants
import at.bitfire.davdroid.InvalidAccountException
import at.bitfire.davdroid.OpenIdUtils
import at.bitfire.davdroid.R
import at.bitfire.davdroid.db.AppDatabase
import at.bitfire.davdroid.db.Credentials
import at.bitfire.davdroid.db.SyncState
import at.bitfire.davdroid.db.SyncStats
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.network.HttpClient
import at.bitfire.davdroid.resource.*
import at.bitfire.davdroid.resource.LocalAddressBook
import at.bitfire.davdroid.resource.LocalCollection
import at.bitfire.davdroid.resource.LocalContact
import at.bitfire.davdroid.resource.LocalEvent
import at.bitfire.davdroid.resource.LocalResource
import at.bitfire.davdroid.resource.LocalTask
import at.bitfire.davdroid.settings.AccountSettings
import at.bitfire.davdroid.ui.DebugInfoActivity
import at.bitfire.davdroid.ui.NetworkUtils
@@ -45,7 +65,11 @@ import dagger.hilt.EntryPoint
import dagger.hilt.InstallIn
import dagger.hilt.android.EntryPointAccessors
import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import net.openid.appauth.AuthState
import net.openid.appauth.AuthorizationService
import okhttp3.HttpUrl
@@ -60,7 +84,9 @@ import java.net.ConnectException
import java.net.HttpURLConnection
import java.security.cert.CertificateException
import java.time.Instant
import java.util.*
import java.util.LinkedList
import java.util.Locale
import java.util.ServiceLoader
import java.util.concurrent.Executors
import java.util.concurrent.LinkedBlockingQueue
import java.util.concurrent.ThreadPoolExecutor
@@ -87,6 +113,7 @@ abstract class SyncManager<ResourceType: LocalResource<*>, out CollectionType: L
    @InstallIn(SingletonComponent::class)
    interface SyncManagerEntryPoint {
        fun appDatabase(): AppDatabase
        fun authorizationService(): AuthorizationService
    }

    enum class SyncAlgorithm {
@@ -194,7 +221,10 @@ abstract class SyncManager<ResourceType: LocalResource<*>, out CollectionType: L
        val clientSecretString = accountSettings.credentials().clientSecret
        val clientSecret = OpenIdUtils.getClientAuthentication(clientSecretString)

        val authorizationService = AuthorizationService(context)
        val authorizationService =
            EntryPointAccessors.fromApplication(context, SyncManagerEntryPoint::class.java)
                .authorizationService()

        authorizationService.performTokenRequest(tokenRequest, clientSecret) { tokenResponse, ex ->
            authState.update(tokenResponse, ex)
            accountSettings.credentials(
+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import at.bitfire.davdroid.authorization.IdentityProvider
import at.bitfire.davdroid.db.Credentials
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.ui.NetworkUtils
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import net.openid.appauth.AuthState.AuthStateAction
@@ -42,6 +43,7 @@ import org.json.JSONObject
import java.net.URI
import java.util.logging.Level

@AndroidEntryPoint
abstract class OpenIdAuthenticationBaseFragment(private val identityProvider: IdentityProvider) :
    Fragment() {

Loading