Loading feature/account/accountmanager/src/main/kotlin/app/k9mail/feature/account/accountmanager/AccountManagerConstants.kt +3 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,9 @@ object AccountManagerConstants { val ACCOUNT_TYPES = listOf(EELO_ACCOUNT_TYPE, GOOGLE_ACCOUNT_TYPE, YAHOO_ACCOUNT_TYPE) @JvmStatic fun getAccountTypes(): List<String> = ACCOUNT_TYPES private const val ACTION_PREFIX = "foundation.e.accountmanager.account" const val ACCOUNT_CREATION_ACTION = "$ACTION_PREFIX.create" const val ACCOUNT_REMOVAL_ACTION = "android.accounts.action.ACCOUNT_REMOVED" Loading legacy/core/src/main/java/com/fsck/k9/controller/MessagingController.java +47 −0 Original line number Diff line number Diff line Loading @@ -21,12 +21,14 @@ import java.util.concurrent.Future; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import android.accounts.AccountManager; import android.content.Context; import android.os.Process; import android.os.SystemClock; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import app.k9mail.feature.account.accountmanager.AccountManagerConstants; import app.k9mail.feature.account.accountmanager.AccountManagerHelper; import app.k9mail.legacy.account.Account; import app.k9mail.legacy.account.Account.DeletePolicy; Loading Loading @@ -666,9 +668,54 @@ public class MessagingController implements MessagingControllerRegistry, Messagi migrateAccountToOAuth(account); } if (updatePassword(account)) { notificationController.clearAuthenticationErrorNotification(account, true); return; } notificationController.showAuthenticationErrorNotification(account, incoming); } public boolean updatePassword(Account account) { boolean isUpdated = false; AccountManager accountManager = AccountManager.get(context); for (String accountType : AccountManagerConstants.getAccountTypes()) { for (android.accounts.Account kAccount : accountManager.getAccountsByType(accountType)) { String emailId = accountManager.getUserData(kAccount, AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY); if (emailId == null || emailId.isBlank() || !emailId.contains("@")) { continue; } if (emailId.equalsIgnoreCase(account.getEmail())) { String password = accountManager.getPassword(kAccount); // Update incoming and outgoing server settings ServerSettings incoming = account.getIncomingServerSettings(); if (incoming.authenticationType == AuthType.PLAIN && incoming.password != null && !incoming.password.isEmpty() && !password.equals(incoming.password)) { account.setIncomingServerSettings(incoming.newPassword(password)); isUpdated = true; } ServerSettings outgoing = account.getOutgoingServerSettings(); if (outgoing.authenticationType == AuthType.PLAIN && outgoing.password != null && !outgoing.password.isEmpty() && !password.equals(outgoing.password)) { account.setOutgoingServerSettings(outgoing.newPassword(password)); isUpdated = true; } // Save account if updated if (isUpdated) { preferences.saveAccount(account); } } } } return isUpdated; } private void migrateAccountToOAuth(Account account) { account.setIncomingServerSettings(account.getIncomingServerSettings().newAuthenticationType(AuthType.XOAUTH2)); account.setOutgoingServerSettings(account.getOutgoingServerSettings().newAuthenticationType(AuthType.XOAUTH2)); Loading legacy/ui/legacy/src/main/java/com/fsck/k9/activity/accountmanager/EeloAccountCreator.kt +25 −4 Original line number Diff line number Diff line Loading @@ -22,15 +22,15 @@ import android.content.Context import app.k9mail.core.common.oauth.OAuthConfigurationProvider import app.k9mail.feature.account.accountmanager.AccountManagerConstants import app.k9mail.feature.account.accountmanager.AccountManagerHelper import app.k9mail.feature.account.accountmanager.autoconfig.EeloAutoConfigUrlProvider import app.k9mail.feature.account.accountmanager.providersxml.DiscoveryResults import app.k9mail.feature.account.accountmanager.providersxml.ProvidersXmlDiscovery import app.k9mail.feature.account.accountmanager.providersxml.ProvidersXmlProvider import app.k9mail.legacy.account.Account import app.k9mail.legacy.account.Account.DeletePolicy import com.fsck.k9.Core import com.fsck.k9.Preferences import com.fsck.k9.account.BackgroundAccountRemover import app.k9mail.feature.account.accountmanager.autoconfig.EeloAutoConfigUrlProvider import app.k9mail.legacy.account.Account import com.fsck.k9.logging.Timber import com.fsck.k9.mail.AuthType import com.fsck.k9.mail.ServerSettings Loading Loading @@ -146,14 +146,17 @@ internal class EeloAccountCreator(context: Context) : KoinComponent { continue } val password = accountManager.getPassword(account) val existenceAccount = accounts.stream() .filter { acc: kAccount -> emailId.equals(acc.email, ignoreCase = true) } .peek { acc: kAccount? -> updateAccountNameIfMissing(emailId, acc!!) } .peek { acc: kAccount? -> updateAccountNameIfMissing(emailId, acc!!) updatePasswordIfChanged(acc, password) } .findAny() if (!existenceAccount.isPresent) { val authState = accountManager.getUserData(account, AccountManagerConstants.KEY_AUTH_STATE) val password = accountManager.getPassword(account) val isOpenId = authState != null && authState.trim { it <= ' ' }.isNotEmpty() if (isOpenId) { Loading @@ -165,6 +168,24 @@ internal class EeloAccountCreator(context: Context) : KoinComponent { } } private fun updatePasswordIfChanged(account: Account, auth: String) { // Update incoming and outgoing server settings val incoming: ServerSettings = account.incomingServerSettings if (incoming.authenticationType == AuthType.PLAIN && !incoming.password.isNullOrEmpty() && auth != incoming.password) { account.incomingServerSettings = incoming.newPassword(auth) } val outgoing: ServerSettings = account.outgoingServerSettings if (outgoing.authenticationType == AuthType.PLAIN && !outgoing.password.isNullOrEmpty() && auth != outgoing.password) { account.outgoingServerSettings = outgoing.newPassword(auth) } // Save account if updated Preferences.getPreferences().saveAccount(account) } private fun updateAccountNameIfMissing(emailId: String, account: kAccount) { if (account.name == null) { // we need to fix an old bug account.name = emailId Loading Loading
feature/account/accountmanager/src/main/kotlin/app/k9mail/feature/account/accountmanager/AccountManagerConstants.kt +3 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,9 @@ object AccountManagerConstants { val ACCOUNT_TYPES = listOf(EELO_ACCOUNT_TYPE, GOOGLE_ACCOUNT_TYPE, YAHOO_ACCOUNT_TYPE) @JvmStatic fun getAccountTypes(): List<String> = ACCOUNT_TYPES private const val ACTION_PREFIX = "foundation.e.accountmanager.account" const val ACCOUNT_CREATION_ACTION = "$ACTION_PREFIX.create" const val ACCOUNT_REMOVAL_ACTION = "android.accounts.action.ACCOUNT_REMOVED" Loading
legacy/core/src/main/java/com/fsck/k9/controller/MessagingController.java +47 −0 Original line number Diff line number Diff line Loading @@ -21,12 +21,14 @@ import java.util.concurrent.Future; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import android.accounts.AccountManager; import android.content.Context; import android.os.Process; import android.os.SystemClock; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import app.k9mail.feature.account.accountmanager.AccountManagerConstants; import app.k9mail.feature.account.accountmanager.AccountManagerHelper; import app.k9mail.legacy.account.Account; import app.k9mail.legacy.account.Account.DeletePolicy; Loading Loading @@ -666,9 +668,54 @@ public class MessagingController implements MessagingControllerRegistry, Messagi migrateAccountToOAuth(account); } if (updatePassword(account)) { notificationController.clearAuthenticationErrorNotification(account, true); return; } notificationController.showAuthenticationErrorNotification(account, incoming); } public boolean updatePassword(Account account) { boolean isUpdated = false; AccountManager accountManager = AccountManager.get(context); for (String accountType : AccountManagerConstants.getAccountTypes()) { for (android.accounts.Account kAccount : accountManager.getAccountsByType(accountType)) { String emailId = accountManager.getUserData(kAccount, AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY); if (emailId == null || emailId.isBlank() || !emailId.contains("@")) { continue; } if (emailId.equalsIgnoreCase(account.getEmail())) { String password = accountManager.getPassword(kAccount); // Update incoming and outgoing server settings ServerSettings incoming = account.getIncomingServerSettings(); if (incoming.authenticationType == AuthType.PLAIN && incoming.password != null && !incoming.password.isEmpty() && !password.equals(incoming.password)) { account.setIncomingServerSettings(incoming.newPassword(password)); isUpdated = true; } ServerSettings outgoing = account.getOutgoingServerSettings(); if (outgoing.authenticationType == AuthType.PLAIN && outgoing.password != null && !outgoing.password.isEmpty() && !password.equals(outgoing.password)) { account.setOutgoingServerSettings(outgoing.newPassword(password)); isUpdated = true; } // Save account if updated if (isUpdated) { preferences.saveAccount(account); } } } } return isUpdated; } private void migrateAccountToOAuth(Account account) { account.setIncomingServerSettings(account.getIncomingServerSettings().newAuthenticationType(AuthType.XOAUTH2)); account.setOutgoingServerSettings(account.getOutgoingServerSettings().newAuthenticationType(AuthType.XOAUTH2)); Loading
legacy/ui/legacy/src/main/java/com/fsck/k9/activity/accountmanager/EeloAccountCreator.kt +25 −4 Original line number Diff line number Diff line Loading @@ -22,15 +22,15 @@ import android.content.Context import app.k9mail.core.common.oauth.OAuthConfigurationProvider import app.k9mail.feature.account.accountmanager.AccountManagerConstants import app.k9mail.feature.account.accountmanager.AccountManagerHelper import app.k9mail.feature.account.accountmanager.autoconfig.EeloAutoConfigUrlProvider import app.k9mail.feature.account.accountmanager.providersxml.DiscoveryResults import app.k9mail.feature.account.accountmanager.providersxml.ProvidersXmlDiscovery import app.k9mail.feature.account.accountmanager.providersxml.ProvidersXmlProvider import app.k9mail.legacy.account.Account import app.k9mail.legacy.account.Account.DeletePolicy import com.fsck.k9.Core import com.fsck.k9.Preferences import com.fsck.k9.account.BackgroundAccountRemover import app.k9mail.feature.account.accountmanager.autoconfig.EeloAutoConfigUrlProvider import app.k9mail.legacy.account.Account import com.fsck.k9.logging.Timber import com.fsck.k9.mail.AuthType import com.fsck.k9.mail.ServerSettings Loading Loading @@ -146,14 +146,17 @@ internal class EeloAccountCreator(context: Context) : KoinComponent { continue } val password = accountManager.getPassword(account) val existenceAccount = accounts.stream() .filter { acc: kAccount -> emailId.equals(acc.email, ignoreCase = true) } .peek { acc: kAccount? -> updateAccountNameIfMissing(emailId, acc!!) } .peek { acc: kAccount? -> updateAccountNameIfMissing(emailId, acc!!) updatePasswordIfChanged(acc, password) } .findAny() if (!existenceAccount.isPresent) { val authState = accountManager.getUserData(account, AccountManagerConstants.KEY_AUTH_STATE) val password = accountManager.getPassword(account) val isOpenId = authState != null && authState.trim { it <= ' ' }.isNotEmpty() if (isOpenId) { Loading @@ -165,6 +168,24 @@ internal class EeloAccountCreator(context: Context) : KoinComponent { } } private fun updatePasswordIfChanged(account: Account, auth: String) { // Update incoming and outgoing server settings val incoming: ServerSettings = account.incomingServerSettings if (incoming.authenticationType == AuthType.PLAIN && !incoming.password.isNullOrEmpty() && auth != incoming.password) { account.incomingServerSettings = incoming.newPassword(auth) } val outgoing: ServerSettings = account.outgoingServerSettings if (outgoing.authenticationType == AuthType.PLAIN && !outgoing.password.isNullOrEmpty() && auth != outgoing.password) { account.outgoingServerSettings = outgoing.newPassword(auth) } // Save account if updated Preferences.getPreferences().saveAccount(account) } private fun updateAccountNameIfMissing(emailId: String, account: kAccount) { if (account.name == null) { // we need to fix an old bug account.name = emailId Loading