From 0da9c7381d8f4037fdb59f2c03b4509a0f40ef85 Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 24 Jul 2025 16:47:21 +0600 Subject: [PATCH] Update Murena account to use OAuth on SSO migration When Murena account is migrated from password-based to SSO in /e/OS Account Manager, Mail needs to update its auth state and auth type to match with OAuth. --- .../accountmanager/EeloAccountCreator.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloAccountCreator.java b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloAccountCreator.java index 2eb61d88fa..94edc44ec0 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloAccountCreator.java +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloAccountCreator.java @@ -18,6 +18,7 @@ package com.fsck.k9.activity.setup.accountmanager; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import android.accounts.AccountManager; @@ -120,13 +121,20 @@ public class EeloAccountCreator { continue; } + @Nullable String authState = + accountManager.getUserData(openIdAccount, AccountManagerConstants.KEY_AUTH_STATE); + var existenceAccount = accounts.stream() .filter(account -> emailId.equalsIgnoreCase(account.getEmail())) .peek(account -> updateAccountNameIfMissing(context, emailId, account)) + .peek(account -> { + if (authState != null) { + updateAuthStateIfChanged(authState, account); + } + }) .findAny(); if (!existenceAccount.isPresent()) { - String authState = accountManager.getUserData(openIdAccount, AccountManagerConstants.KEY_AUTH_STATE); createAccount(context, emailId, "", authState, accountType); continue; } @@ -147,6 +155,23 @@ public class EeloAccountCreator { } } + private static void updateAuthStateIfChanged(@NonNull String authState, @NonNull Account account) { + // Don't update authState if it's not a Murena account + if (!OsAccountManagerUtil.INSTANCE.isMurenaEmailAccount(account)) return; + + if (!Objects.equals(account.getOAuthState(), authState)) { + account.setOAuthState(authState); + + // Update auth type in case it was a migration. + ServerSettings incoming = account.getIncomingServerSettings(); + ServerSettings outgoing = account.getOutgoingServerSettings(); + account.setIncomingServerSettings(incoming.newAuthenticationType(AuthType.XOAUTH2)); + account.setOutgoingServerSettings(outgoing.newAuthenticationType(AuthType.XOAUTH2)); + + Preferences.getPreferences().saveAccount(account); + } + } + private static void updatePasswordIfChanged(Account account, String password) { // Don't update password if its not a murena account if (!OsAccountManagerUtil.INSTANCE.isMurenaEmailAccount(account)) return; -- GitLab