Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1754a3ce authored by Mohammed Althaf T's avatar Mohammed Althaf T 😊
Browse files

mail: Update password on change

parent 04b7457c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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"
+47 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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));
+25 −4
Original line number Diff line number Diff line
@@ -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
@@ -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) {
@@ -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