From 7712535834bba9d1dc862175fa35bc4477e07f01 Mon Sep 17 00:00:00 2001 From: Fahim Masud Choudhury Date: Thu, 26 Jun 2025 18:59:10 +0600 Subject: [PATCH] fix: add support for re-authentication flow in account setup for Murena account Introduce intent extras for handling re-authentication scenarios, including pre-filling username hints and bypassing standard login checks. This ensures seamless transitions during account re-authentication processes and improves overall user experience. --- .../DefaultAccountAuthenticatorService.kt | 11 +++++++++ .../davdroid/ui/account/SettingsActivity.kt | 19 ++++++++++++--- .../ui/setup/DetectConfigurationFragment.kt | 21 ++++++++++++---- .../ui/setup/EeloAuthenticatorFragment.kt | 24 ++++++++++++++++++- .../ui/setup/MurenaOpenIdAuthFragment.kt | 9 +++++++ 5 files changed, 75 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/DefaultAccountAuthenticatorService.kt b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/DefaultAccountAuthenticatorService.kt index cf75304e5..c231ae4a3 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/DefaultAccountAuthenticatorService.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/DefaultAccountAuthenticatorService.kt @@ -31,6 +31,7 @@ import at.bitfire.davdroid.db.AppDatabase import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.resource.LocalAddressBook import at.bitfire.davdroid.settings.AccountSettings +import at.bitfire.davdroid.ui.account.SettingsActivity import at.bitfire.davdroid.ui.setup.LoginActivity import at.bitfire.davdroid.util.AuthStatePrefUtils import dagger.hilt.EntryPoint @@ -149,6 +150,16 @@ abstract class DefaultAccountAuthenticatorService : Service(), OnAccountsUpdateL LoginActivity.USERNAME_HINT, it.getString(LoginActivity.USERNAME_HINT) ) + + intent.putExtra( + SettingsActivity.EXTRA_IS_RE_AUTHENTICATING, + it.getBoolean(SettingsActivity.EXTRA_IS_RE_AUTHENTICATING) + ) + + intent.putExtra( + SettingsActivity.EXTRA_ACCOUNT_NAME_HINT, + it.getString(SettingsActivity.EXTRA_ACCOUNT_NAME_HINT) + ) } val bundle = Bundle(1) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/SettingsActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/SettingsActivity.kt index 22cc425c2..f0c33eca6 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/SettingsActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/SettingsActivity.kt @@ -62,6 +62,8 @@ class SettingsActivity: AppCompatActivity() { companion object { const val EXTRA_ACCOUNT = "account" + const val EXTRA_IS_RE_AUTHENTICATING = "IS_RE_AUTHENTICATING" + const val EXTRA_ACCOUNT_NAME_HINT = "ACCOUNT_NAME_HINT" } private val account by lazy { intent.getParcelableExtra(EXTRA_ACCOUNT) ?: throw IllegalArgumentException("EXTRA_ACCOUNT must be set") } @@ -127,9 +129,20 @@ class SettingsActivity: AppCompatActivity() { } private fun launchSetup(): Boolean { - AccountManager.get(context).addAccount(account.type, - null, null, null, activity, null, - null) + val bundle = Bundle().apply { + putBoolean(EXTRA_IS_RE_AUTHENTICATING, true) + putString(EXTRA_ACCOUNT_NAME_HINT, account.name) + } + + AccountManager.get(context).addAccount( + /* accountType = */ account.type, + /* authTokenType = */ null, + /* requiredFeatures = */ null, + /* addAccountOptions = */ bundle, + /* activity = */ activity, + /* callback = */ null, + /* handler = */ null + ) return true } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/DetectConfigurationFragment.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/DetectConfigurationFragment.kt index 3c80ddf72..6c0e5aa6b 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/DetectConfigurationFragment.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/DetectConfigurationFragment.kt @@ -24,6 +24,7 @@ import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.murenasso.MurenaSsoMigrationPreferences import at.bitfire.davdroid.servicedetection.DavResourceFinder import at.bitfire.davdroid.ui.DebugInfoActivity +import at.bitfire.davdroid.ui.account.SettingsActivity import com.google.android.material.dialog.MaterialAlertDialogBuilder import java.lang.ref.WeakReference import java.net.URI @@ -35,16 +36,26 @@ class DetectConfigurationFragment: Fragment() { private val loginModel by activityViewModels() private val model by viewModels() - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val accountType = requireActivity().intent.getStringExtra(LoginActivity.ACCOUNT_TYPE) - if (!MurenaSsoMigrationPreferences.isSsoMigrationRunning(requireContext())) { - if (model.blockProceedWithLogin(accountType)) { - ECloudAccountHelper.showMultipleECloudAccountNotAcceptedDialog(requireActivity()) - return + val isReAuthenticating = + requireActivity().intent.getBooleanExtra(SettingsActivity.EXTRA_IS_RE_AUTHENTICATING, false) + + val isSsoMigrationRunning = + MurenaSsoMigrationPreferences.isSsoMigrationRunning(requireContext()) + + val isOAuthFlowComplete = + requireActivity().intent.getBooleanExtra(LoginActivity.OPENID_AUTH_FLOW_COMPLETE, false) + + if (!isOAuthFlowComplete) { + if (!isReAuthenticating && !isSsoMigrationRunning) { + if (model.blockProceedWithLogin(accountType)) { + ECloudAccountHelper.showMultipleECloudAccountNotAcceptedDialog(requireActivity()) + return + } } } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/EeloAuthenticatorFragment.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/EeloAuthenticatorFragment.kt index 56c1d817e..e601529f6 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/EeloAuthenticatorFragment.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/EeloAuthenticatorFragment.kt @@ -39,6 +39,7 @@ import at.bitfire.davdroid.databinding.FragmentEeloAuthenticatorBinding import at.bitfire.davdroid.db.Credentials import at.bitfire.davdroid.murenasso.MurenaSsoMigrationPreferences import at.bitfire.davdroid.ui.ShowUrlActivity +import at.bitfire.davdroid.ui.account.SettingsActivity import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout @@ -59,6 +60,14 @@ class EeloAuthenticatorFragment : Fragment() { private lateinit var passwordEditText: TextInputEditText private lateinit var passwordHolder: View + private val isReAuthenticating by lazy { + requireActivity().intent.getBooleanExtra(SettingsActivity.EXTRA_IS_RE_AUTHENTICATING, false) + } + + private val userNameHint by lazy { + requireActivity().intent.getStringExtra(SettingsActivity.EXTRA_ACCOUNT_NAME_HINT) + } + private fun isNetworkAvailable(): Boolean { val connectivityManager = requireActivity().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeNetworkInfo = connectivityManager.activeNetworkInfo @@ -120,9 +129,16 @@ class EeloAuthenticatorFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + + if (isReAuthenticating) { + userIdEditText.setText(userNameHint) + return + } + if (MurenaSsoMigrationPreferences.isSsoMigrationRunning(requireContext())) { return } + if (model.blockProceedWithLogin()) { ECloudAccountHelper.showMultipleECloudAccountNotAcceptedDialog(requireActivity()) } @@ -219,7 +235,13 @@ class EeloAuthenticatorFragment : Fragment() { val password = passwordEditText.text.toString() if (handleOpenIdAuth && userId.isNotBlank()) { - requireActivity().intent.putExtra(LoginActivity.USERNAME_HINT, userIdEditText.text.toString()) + requireActivity().intent.apply { + val userNameHint = + if (!userNameHint.isNullOrBlank()) userNameHint else userIdEditText.text.toString() + + putExtra(LoginActivity.USERNAME_HINT, userNameHint) + putExtra(SettingsActivity.EXTRA_IS_RE_AUTHENTICATING, isReAuthenticating) + } navigate(MurenaOpenIdAuthFragment()) } else if (userId.isNotBlank() && password.isNotBlank() && validate()) { navigate(DetectConfigurationFragment()) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/MurenaOpenIdAuthFragment.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/MurenaOpenIdAuthFragment.kt index b7b37c9a6..dbf0c0796 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/MurenaOpenIdAuthFragment.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/MurenaOpenIdAuthFragment.kt @@ -21,6 +21,7 @@ import android.view.View import at.bitfire.davdroid.ECloudAccountHelper import at.bitfire.davdroid.authorization.IdentityProvider import at.bitfire.davdroid.murenasso.MurenaSsoMigrationPreferences +import at.bitfire.davdroid.ui.account.SettingsActivity import org.json.JSONObject class MurenaOpenIdAuthFragment : OpenIdAuthenticationBaseFragment(IdentityProvider.MURENA) { @@ -28,6 +29,14 @@ class MurenaOpenIdAuthFragment : OpenIdAuthenticationBaseFragment(IdentityProvid override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val isReAuthenticating = + requireActivity().intent.getBooleanExtra(SettingsActivity.EXTRA_IS_RE_AUTHENTICATING, false) + + if (isReAuthenticating) { + startAuthFLow() + return + } + if (MurenaSsoMigrationPreferences.isSsoMigrationRunning(requireContext())) { startAuthFLow() return -- GitLab