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

Verified Commit 2a1f3888 authored by Fahim M. Choudhury's avatar Fahim M. Choudhury
Browse files

fix: preserve sync settings on re-auth for OAuth accounts

The re-authentication flow for OAuth accounts used to reset every sync settings and start with defaults. This commit fixes the behaviour so that on re-auth, the settings are preserved.

It uses the same flow for Murena account's SSO migration as the settings are saved too during the migration.
parent 935df4dd
Loading
Loading
Loading
Loading
Loading
+20 −12
Original line number Diff line number Diff line
@@ -173,7 +173,7 @@ class AccountDetailsFragment : Fragment() {
                val idx = v.contactGroupMethod.selectedItemPosition
                val groupMethodName = resources.getStringArray(R.array.settings_contact_group_method_values)[idx]

                val accountToUpdate = findBasicAuthMurenaAccount(name, providedAccountType)
                val basicAuthAccount = findBasicAuthMurenaAccount(name, providedAccountType)

                model.createOrUpdateAccount(
                    requireActivity(),
@@ -181,7 +181,7 @@ class AccountDetailsFragment : Fragment() {
                    loginModel.credentials!!,
                    config,
                    GroupMethod.valueOf(groupMethodName),
                    accountToUpdate,
                    basicAuthAccount,
                ).observe(viewLifecycleOwner, Observer { success ->
                    if (success) {
                        Toast.makeText(context, R.string.message_account_added_successfully, Toast.LENGTH_LONG).show()
@@ -334,7 +334,7 @@ class AccountDetailsFragment : Fragment() {
            credentials: Credentials?,
            config: DavResourceFinder.Configuration,
            groupMethod: GroupMethod,
            accountToUpdate: Account? = null
            basicAuthAccount: Account? = null
        ): LiveData<Boolean> {
            val result = MutableLiveData<Boolean>()
            viewModelScope.launch(Dispatchers.Default + NonCancellable) {
@@ -367,7 +367,7 @@ class AccountDetailsFragment : Fragment() {
                    }
                }

                val account = getOrCreateAccount(name, accountType, accountToUpdate)
                val account = getOrCreateAccount(name, accountType, basicAuthAccount)

                val userData = AccountSettings.initialUserData(credentials, baseURL, config.cookies, config.calDAV?.emails?.firstOrNull())

@@ -375,7 +375,11 @@ class AccountDetailsFragment : Fragment() {

                val accountManager = AccountManager.get(context)

                if (accountToUpdate != null) {
                val isAccountUsingOAuth =
                    accountType in AccountUtils.getOpenIdMainAccountTypes(context) &&
                            credentials?.authState != null

                if (basicAuthAccount != null) {
                    val authState = credentials?.authState
                    if (authState != null) {
                        updateAuthState(userData, account)
@@ -392,7 +396,7 @@ class AccountDetailsFragment : Fragment() {
                            credentials?.password
                        )
                    ) {
                        if (accountType in AccountUtils.getOpenIdMainAccountTypes(context) && credentials?.authState != null) {
                        if (isAccountUsingOAuth) {
                            updateAuthState(userData, account)
                            Logger.log.info("Updated auth state for re-authenticating $account")
                        } else {
@@ -447,7 +451,8 @@ class AccountDetailsFragment : Fragment() {
                var calendarSyncEnabled = true
                var tasksSyncEnabled = true

                if (accountToUpdate != null) {
                if (basicAuthAccount != null || isAccountUsingOAuth) {
                    val accountToUpdate = basicAuthAccount ?: account
                    val oldSettings = AccountSettings(context, accountToUpdate)
                    val addressBookAuthority = context.getString(R.string.address_books_authority)
                    val taskProvider = TaskUtils.currentProvider(context)
@@ -554,8 +559,9 @@ class AccountDetailsFragment : Fragment() {
                    // Configure CardDAV service
                    val addressBookAuthority = context.getString(R.string.address_books_authority)
                    if (config.cardDAV != null) {
                        if (accountToUpdate != null) {
                            // Migration: update existing service
                        if (basicAuthAccount != null || isAccountUsingOAuth) {
                            val accountToUpdate = basicAuthAccount ?: account
                            // Update existing service
                            val service = db.serviceDao().getByAccountAndType(accountToUpdate.name, Service.TYPE_CARDDAV)
                            service?.let {
                                it.authState = credentials?.authState?.jsonSerializeString()
@@ -592,8 +598,9 @@ class AccountDetailsFragment : Fragment() {

                    // Configure CalDAV service
                    if (config.calDAV != null) {
                        if (accountToUpdate != null) {
                            // Migration: update existing service
                        if (basicAuthAccount != null || isAccountUsingOAuth) {
                            val accountToUpdate = basicAuthAccount ?: account
                            // Update existing service
                            val service = db.serviceDao().getByAccountAndType(accountToUpdate.name, Service.TYPE_CALDAV)
                            service?.let {
                                it.authState = credentials?.authState?.jsonSerializeString()
@@ -626,8 +633,9 @@ class AccountDetailsFragment : Fragment() {
                        // if task provider present, set task sync interval and enable sync
                        val taskProvider = TaskUtils.currentProvider(context)
                        if (taskProvider != null) {
                            if (accountToUpdate == null)
                            if (basicAuthAccount == null) {
                                ContentResolver.setIsSyncable(account, taskProvider.authority, tasksSyncable)
                            }

                            ContentResolver.setSyncAutomatically(
                                account,