From 2a1f3888ffe219ef2bcd867ee95579ba82a6d35f Mon Sep 17 00:00:00 2001 From: Fahim Masud Choudhury Date: Thu, 21 Aug 2025 14:27:59 +0600 Subject: [PATCH] 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. --- .../ui/setup/AccountDetailsFragment.kt | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt index b976a9e0d..109747348 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt @@ -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 { val result = MutableLiveData() 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, -- GitLab