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

Commit d838f681 authored by Nihar Thakkar's avatar Nihar Thakkar Committed by Sumit Pundir
Browse files

Implemented OAuth token refresh.

parent 05f950bf
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -157,10 +157,18 @@ class AccountSettings(
    }

    fun credentials(credentials: Credentials) {
	if (credentials.authState == null) {
            accountManager.setUserData(account, KEY_USERNAME, credentials.userName)
            accountManager.setPassword(account, credentials.password)
            accountManager.setUserData(account, KEY_CERTIFICATE_ALIAS, credentials.certificateAlias)
        }
        else {
            accountManager.setUserData(account, KEY_USERNAME, credentials.userName)
            accountManager.setPassword(account, credentials.password)
            accountManager.setUserData(account, KEY_AUTH_STATE, credentials.authState.jsonSerializeString())
            accountManager.setUserData(account, KEY_CERTIFICATE_ALIAS, credentials.certificateAlias)
        }
    }


    // sync. settings
+30 −1
Original line number Diff line number Diff line
@@ -13,14 +13,17 @@ import android.content.ContentResolver
import android.content.Context
import android.content.SyncResult
import android.os.Bundle
import android.os.AsyncTask
import android.provider.CalendarContract
import foundation.e.accountmanager.log.Logger
import foundation.e.accountmanager.model.AppDatabase
import foundation.e.accountmanager.model.Collection
import foundation.e.accountmanager.model.Credentials
import foundation.e.accountmanager.model.Service
import foundation.e.accountmanager.resource.LocalCalendar
import foundation.e.accountmanager.settings.AccountSettings
import foundation.e.ical4android.AndroidCalendar
import net.openid.appauth.AuthorizationService
import okhttp3.HttpUrl
import java.util.logging.Level

@@ -58,7 +61,33 @@ class CalendarsSyncAdapterService: SyncAdapterService() {
                for (calendar in calendars) {
                    Logger.log.info("Synchronizing calendar #${calendar.id}, URL: ${calendar.name}")
                    CalendarSyncManager(context, account, accountSettings, extras, authority, syncResult, calendar).use {
			val authState = accountSettings.credentials().authState
                        if (authState != null)
                        {
                            if (authState.needsTokenRefresh)
                            {
                                val tokenRequest = authState.createTokenRefreshRequest()

                                AuthorizationService(context).performTokenRequest(tokenRequest,
                                        AuthorizationService.TokenResponseCallback { tokenResponse, ex ->
                                            authState.update(tokenResponse, ex)
                                            accountSettings.credentials(Credentials(account.name, null, authState, null))
                                            it.accountSettings.credentials(Credentials(it.account.name, null, authState, null))
                                            object : AsyncTask<Void, Void, Void>() {
                                                override fun doInBackground(vararg params: Void): Void? {
                                                    it.performSync()
                                                    return null
                                                }
                                            }.execute()
                                        })
                            }
                            else {
                                it.performSync()
                            }
                        }
                        else {
                            it.performSync()
                        }
                    }
                }
            } catch(e: Exception) {
+30 −1
Original line number Diff line number Diff line
@@ -13,11 +13,14 @@ import android.content.ContentProviderClient
import android.content.ContentResolver
import android.content.Context
import android.content.SyncResult
import android.os.AsyncTask
import android.os.Bundle
import android.provider.ContactsContract
import foundation.e.accountmanager.log.Logger
import foundation.e.accountmanager.resource.LocalAddressBook
import foundation.e.accountmanager.model.Credentials
import foundation.e.accountmanager.settings.AccountSettings
import net.openid.appauth.AuthorizationService
import java.util.logging.Level

class ContactsSyncAdapterService: SyncAdapterService() {
@@ -65,7 +68,33 @@ class ContactsSyncAdapterService: SyncAdapterService() {
                Logger.log.info("Taking settings from: ${addressBook.mainAccount}")

                ContactsSyncManager(context, account, accountSettings, extras, authority, syncResult, provider, addressBook).use {
		    val authState = accountSettings.credentials().authState
                        if (authState != null)
                        {
                            if (authState.needsTokenRefresh)
                            {
                                val tokenRequest = authState.createTokenRefreshRequest()

                                AuthorizationService(context).performTokenRequest(tokenRequest,
                                        AuthorizationService.TokenResponseCallback { tokenResponse, ex ->
                                            authState.update(tokenResponse, ex)
                                            accountSettings.credentials(Credentials(account.name, null, authState, null))
                                            it.accountSettings.credentials(Credentials(it.account.name, null, authState, null))
                                            object : AsyncTask<Void, Void, Void>() {
                                                override fun doInBackground(vararg params: Void): Void? {
                                                    it.performSync()
                                                    return null
                                                }
                                            }.execute()
                                        })
                            }
                            else {
                                it.performSync()
                            }
                        }
                        else {
                            it.performSync()
                        }
                }
            } catch(e: Exception) {
                Logger.log.log(Level.SEVERE, "Couldn't sync contacts", e)
+30 −1
Original line number Diff line number Diff line
@@ -16,18 +16,21 @@ import android.graphics.drawable.BitmapDrawable
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.AsyncTask
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import foundation.e.accountmanager.R
import foundation.e.accountmanager.log.Logger
import foundation.e.accountmanager.model.AppDatabase
import foundation.e.accountmanager.model.Collection
import foundation.e.accountmanager.model.Credentials
import foundation.e.accountmanager.model.Service
import foundation.e.accountmanager.resource.LocalTaskList
import foundation.e.accountmanager.settings.AccountSettings
import foundation.e.accountmanager.ui.NotificationUtils
import foundation.e.ical4android.AndroidTaskList
import foundation.e.ical4android.TaskProvider
import net.openid.appauth.AuthorizationService
import okhttp3.HttpUrl
import org.dmfs.tasks.contract.TaskContract
import java.util.logging.Level
@@ -69,7 +72,33 @@ class TasksSyncAdapterService: SyncAdapterService() {
                for (taskList in taskLists) {
                    Logger.log.info("Synchronizing task list #${taskList.id} [${taskList.syncId}]")
                    TasksSyncManager(context, account, accountSettings, extras, authority, syncResult, taskList).use {
			val authState = accountSettings.credentials().authState
                        if (authState != null)
                        {
                            if (authState.needsTokenRefresh)
                            {
                                val tokenRequest = authState.createTokenRefreshRequest()

                                AuthorizationService(context).performTokenRequest(tokenRequest,
                                        AuthorizationService.TokenResponseCallback { tokenResponse, ex ->
                                            authState.update(tokenResponse, ex)
                                            accountSettings.credentials(Credentials(account.name, null, authState, null))
                                            it.accountSettings.credentials(Credentials(it.account.name, null, authState, null))
                                            object : AsyncTask<Void, Void, Void>() {
                                                override fun doInBackground(vararg params: Void): Void? {
                                                    it.performSync()
                                                    return null
                                                }
                                            }.execute()
                                        })
                            }
                            else {
                                it.performSync()
                            }
                        }
                        else {
                            it.performSync()
                        }
                    }
                }
            } catch (e: TaskProvider.ProviderTooOldException) {