From 02e5154164290c1149a526607f8ef467ae51e777 Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 3 Apr 2025 20:21:52 +0530 Subject: [PATCH 1/2] feat(account): Identify Murena email and web hosts --- .../java/com/fsck/k9/OsAccountManagerUtil.kt | 21 ++++++++ .../k9/controller/MessagingController.java | 53 +++++++++++-------- .../accountmanager/EeloAccountCreator.java | 9 ++++ .../accountmanager/AccountManagerConstants.kt | 1 + 4 files changed, 61 insertions(+), 23 deletions(-) diff --git a/app/core/src/main/java/com/fsck/k9/OsAccountManagerUtil.kt b/app/core/src/main/java/com/fsck/k9/OsAccountManagerUtil.kt index b1401bde17..d498bef95e 100644 --- a/app/core/src/main/java/com/fsck/k9/OsAccountManagerUtil.kt +++ b/app/core/src/main/java/com/fsck/k9/OsAccountManagerUtil.kt @@ -23,6 +23,8 @@ import android.content.Context import app.k9mail.core.android.common.accountmanager.AccountManagerConstants import timber.log.Timber +import com.fsck.k9.Account as K9Account + object OsAccountManagerUtil { /** @@ -83,4 +85,23 @@ object OsAccountManagerUtil { fun isAccountFound() = this != ACCOUNT_NOT_FOUND } + + fun isMurenaEmailAccount(account: K9Account): Boolean { + val incoming = account.incomingServerSettings + val outgoing = account.outgoingServerSettings + + if (incoming.host == null || outgoing.host == null) { + return false + } + + return isMurenaMailHost(incoming.host!!) && isMurenaMailHost(outgoing.host!!) + } + + private fun isMurenaMailHost(host: String): Boolean { + return "mail.ecloud.global" == host + } + + fun isMurenaWebHostUrl(host: String): Boolean { + return host.contains("https://murena.io") || host.contains("http://murena.io") + } } diff --git a/app/core/src/main/java/com/fsck/k9/controller/MessagingController.java b/app/core/src/main/java/com/fsck/k9/controller/MessagingController.java index 1cc0eb0256..c8d6e5322a 100644 --- a/app/core/src/main/java/com/fsck/k9/controller/MessagingController.java +++ b/app/core/src/main/java/com/fsck/k9/controller/MessagingController.java @@ -35,6 +35,7 @@ import com.fsck.k9.Account.DeletePolicy; import com.fsck.k9.Account.Expunge; import com.fsck.k9.DI; import com.fsck.k9.K9; +import com.fsck.k9.OsAccountManagerUtil; import com.fsck.k9.Preferences; import com.fsck.k9.backend.BackendManager; import com.fsck.k9.backend.api.Backend; @@ -671,34 +672,40 @@ public class MessagingController { } private boolean updatePassword(Account account) { + if (!OsAccountManagerUtil.INSTANCE.isMurenaEmailAccount(account)) return false; + AccountManager accountManager = AccountManager.get(context); + android.accounts.Account[] eeloAccounts = + accountManager.getAccountsByType(AccountManagerConstants.EELO_ACCOUNT_TYPE); - for (String accountType : AccountManagerConstants.INSTANCE.getALL_ACCOUNT_TYPES()) { - for (android.accounts.Account deviceAccount : accountManager.getAccountsByType(accountType)) { - // Check if the account email matches with account manager - String emailId = accountManager.getUserData(deviceAccount, - AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY); - if (emailId != null && !emailId.equalsIgnoreCase(account.getEmail())) { - continue; - } + for (android.accounts.Account deviceAccount : eeloAccounts) { + String hostUrl = accountManager.getUserData(deviceAccount, AccountManagerConstants.KEY_OC_BASE_URL); + if (hostUrl == null || !OsAccountManagerUtil.INSTANCE.isMurenaWebHostUrl(hostUrl)) { + continue; + } + // Check if the account email matches with account manager + String emailId = accountManager.getUserData(deviceAccount, + AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY); + if (emailId != null && !emailId.equalsIgnoreCase(account.getEmail())) { + continue; + } - ServerSettings incoming = account.getIncomingServerSettings(); - ServerSettings outgoing = account.getOutgoingServerSettings(); + ServerSettings incoming = account.getIncomingServerSettings(); + ServerSettings outgoing = account.getOutgoingServerSettings(); - // Only set if its plain password - if (incoming.authenticationType != AuthType.PLAIN - && outgoing.authenticationType != AuthType.PLAIN) { - continue; - } + // Only set if its plain password + if (incoming.authenticationType != AuthType.PLAIN + && outgoing.authenticationType != AuthType.PLAIN) { + continue; + } - // Update incoming and outgoing server settings - String password = accountManager.getPassword(deviceAccount); - if (password != null && (!password.equals(incoming.password) || !password.equals(outgoing.password))) { - account.setIncomingServerSettings(incoming.newPassword(password)); - account.setOutgoingServerSettings(outgoing.newPassword(password)); - preferences.saveAccount(account); - return true; - } + // Update incoming and outgoing server settings + String password = accountManager.getPassword(deviceAccount); + if (password != null && (!password.equals(incoming.password) || !password.equals(outgoing.password))) { + account.setIncomingServerSettings(incoming.newPassword(password)); + account.setOutgoingServerSettings(outgoing.newPassword(password)); + preferences.saveAccount(account); + return true; } } 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 e50152166b..1de5ccc09f 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 @@ -37,6 +37,7 @@ import com.fsck.k9.Account; import com.fsck.k9.Account.DeletePolicy; import com.fsck.k9.Core; import com.fsck.k9.DI; +import com.fsck.k9.OsAccountManagerUtil; import com.fsck.k9.Preferences; import com.fsck.k9.account.AccountCreatorHelper; import com.fsck.k9.account.BackgroundAccountRemover; @@ -140,6 +141,9 @@ public class EeloAccountCreator { } private static void updatePasswordIfChanged(Account account, String password) { + // Don't update password if its not a murena account + if (!OsAccountManagerUtil.INSTANCE.isMurenaEmailAccount(account)) return; + ServerSettings incoming = account.getIncomingServerSettings(); ServerSettings outgoing = account.getOutgoingServerSettings(); @@ -170,6 +174,11 @@ public class EeloAccountCreator { accountManager.getAccountsByType(AccountManagerConstants.EELO_ACCOUNT_TYPE); for (android.accounts.Account eeloAccount : eeloAccounts) { final String emailId = getEmailId(accountManager, eeloAccount); + String hostUrl = accountManager.getUserData(eeloAccount, AccountManagerConstants.KEY_OC_BASE_URL); + // We are trying to add account that are not murena. + if (hostUrl == null || !OsAccountManagerUtil.INSTANCE.isMurenaWebHostUrl(hostUrl)) { + continue; + } if (isInvalidEmail(emailId)) { continue; diff --git a/core/android/common/src/main/kotlin/app/k9mail/core/android/common/accountmanager/AccountManagerConstants.kt b/core/android/common/src/main/kotlin/app/k9mail/core/android/common/accountmanager/AccountManagerConstants.kt index 286deefbd8..5bf742a098 100644 --- a/core/android/common/src/main/kotlin/app/k9mail/core/android/common/accountmanager/AccountManagerConstants.kt +++ b/core/android/common/src/main/kotlin/app/k9mail/core/android/common/accountmanager/AccountManagerConstants.kt @@ -25,6 +25,7 @@ object AccountManagerConstants { const val AUTH_TOKEN_TYPE = "oauth2-access-token" const val KEY_AUTH_STATE = "auth_state" const val USERNAME_HINT = "userNameHint" + const val KEY_OC_BASE_URL = "oc_base_url" const val OPEN_APP_PACKAGE_AFTER_AUTH = "open_app_package_after_auth" const val OPEN_APP_ACTIVITY_AFTER_AUTH = "open_app_activity_after_auth" -- GitLab From 34dbde897fefadf6f64a13cc1b422b36c2711be5 Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 3 Apr 2025 20:37:11 +0530 Subject: [PATCH 2/2] mail: Bump version to 6.711-2 --- app/k9mail/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/k9mail/build.gradle.kts b/app/k9mail/build.gradle.kts index 38d5b49094..70893a881a 100644 --- a/app/k9mail/build.gradle.kts +++ b/app/k9mail/build.gradle.kts @@ -65,8 +65,8 @@ android { applicationId = "foundation.e.mail" testApplicationId = "foundation.e.mail.tests" - versionCode = 37020 - versionName = "6.711-1" + versionCode = 37021 + versionName = "6.711-2" // Keep in sync with the resource string array "supported_languages" resourceConfigurations.addAll( -- GitLab