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

Commit 15edb549 authored by Fahim Salam Chowdhury's avatar Fahim Salam Chowdhury 👽
Browse files

Enable openId support for murena accounts

parent 4a372f9d
Loading
Loading
Loading
Loading
Loading
+26 −11
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.Context
import com.fsck.k9.Account
import com.fsck.k9.mail.AuthType
import com.fsck.k9.preferences.AccountManager
import kotlin.streams.toList
import timber.log.Timber

object EeloAccountHelper {
@@ -44,8 +45,8 @@ object EeloAccountHelper {
        }

        val osAccountManager = OsAccountManager.get(context)
        val googleAccount = retrieveGoogleAccountFromAccountManager(osAccountManager, account.email) ?: return false
        account.oAuthState = osAccountManager.getUserData(googleAccount, AccountManagerConstants.KEY_AUTH_STATE)
        val authAccount = retrieveAuthAccountFromAccountManager(osAccountManager, account.email) ?: return false
        account.oAuthState = osAccountManager.getUserData(authAccount, AccountManagerConstants.KEY_AUTH_STATE)
        accountManager.saveAccount(account)
        return true
    }
@@ -67,30 +68,44 @@ object EeloAccountHelper {
        accountManager.setUserData(account, AccountManagerConstants.KEY_AUTH_STATE, authState)
    }

    fun retrieveGoogleAccountFromAccountManager(context: Context?, email: String?): OsAccount? {
    fun retrieveAuthAccountFromAccountManager(context: Context?, email: String?): OsAccount? {
        if (context == null) {
            Timber.w("retrieve google accounts from accountManager failed, null context.")
            Timber.w("retrieve accounts from accountManager failed, null context.")
            return null
        }

        val accountManager = OsAccountManager.get(context)
        return retrieveGoogleAccountFromAccountManager(accountManager, email)
        return retrieveAuthAccountFromAccountManager(accountManager, email)
    }

    private fun retrieveGoogleAccountFromAccountManager(accountManager: OsAccountManager?, email: String?): OsAccount? {
    private fun retrieveAuthAccountFromAccountManager(accountManager: OsAccountManager?, email: String?): android.accounts.Account? {
        if (accountManager == null || email == null || email.isEmpty()) {
            Timber.w("retrieve google account from accountManager failed, invalid param")
            return null
        }

        val googleAccounts = accountManager.getAccountsByType(AccountManagerConstants.GOOGLE_ACCOUNT_TYPE)
        for (googleAccount in googleAccounts) {
            val emailId = accountManager.getUserData(googleAccount, AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY)
        val accounts = getAuthAccounts(accountManager)
        for (account in accounts) {
            val emailId = accountManager.getUserData(account, AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY)
            if (email.equals(emailId, ignoreCase = true)) {
                return googleAccount
                return account
            }
        }

        return null
    }

    private fun getAuthAccounts(accountManager: OsAccountManager): List<android.accounts.Account> {
        val murenaAccounts = accountManager.getAccountsByType(AccountManagerConstants.EELO_ACCOUNT_TYPE)
        val googleAccounts = accountManager.getAccountsByType(AccountManagerConstants.GOOGLE_ACCOUNT_TYPE)
        val authAccounts = ArrayList<android.accounts.Account>()
        authAccounts.addAll(murenaAccounts)
        authAccounts.addAll(googleAccounts)

        return authAccounts.stream()
            .filter{
                val authState = accountManager.getUserData(it, AccountManagerConstants.KEY_AUTH_STATE)
                authState != null &&authState.trim().isNotEmpty()
            }.toList()
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ class RealOAuth2TokenProvider(
                ?: throw AuthenticationFailedException("Login required")
        }

        val accountManagerAccount = EeloAccountHelper.retrieveGoogleAccountFromAccountManager(context, email)
        val accountManagerAccount = EeloAccountHelper.retrieveAuthAccountFromAccountManager(context, email)

        val latch = CountDownLatch(1)
        var token: String? = null
+9 −10
Original line number Diff line number Diff line
@@ -16,17 +16,14 @@

package com.fsck.k9.activity.setup.accountmanager;


import java.util.List;

import android.accounts.AccountManager;
import android.content.ContentResolver;
import android.content.Context;
import android.os.Build.VERSION_CODES;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.WorkerThread;
import com.fsck.k9.Account;
import com.fsck.k9.Account.DeletePolicy;
@@ -48,13 +45,11 @@ import com.fsck.k9.setup.AccountManagerConstants;
import com.fsck.k9.ui.ConnectionSettings;
import timber.log.Timber;


public class EeloAccountCreator {
    private static final ProvidersXmlDiscovery providersXmlDiscovery = DI.get(ProvidersXmlDiscovery.class);
    private static final AccountCreator accountCreator = DI.get(AccountCreator.class);
    private static final SpecialLocalFoldersCreator localFoldersCreator = DI.get(SpecialLocalFoldersCreator.class);

    @RequiresApi(api = VERSION_CODES.N)
    @WorkerThread
    public static void loadAccountsFromAccountManager(@NonNull Context context, @NonNull Preferences preferences,
            @NonNull BackgroundAccountRemover accountRemover, @NonNull K9JobManager jobManager, @Nullable OnAccountLoadCompleteCallBack callBack) {
@@ -88,7 +83,6 @@ public class EeloAccountCreator {
        return ContentResolver.getSyncAutomatically(account, AccountManagerConstants.MAIL_CONTENT_AUTHORITY);
    }

    @RequiresApi(api = VERSION_CODES.N)
    private static void loadGoogleAccounts(@NonNull Context context, List<Account> accounts,
            @NonNull AccountManager accountManager, @NonNull K9JobManager jobManager) {
        android.accounts.Account[] googleAccounts =
@@ -130,7 +124,6 @@ public class EeloAccountCreator {
        return emailId == null || !emailId.contains("@");
    }

    @RequiresApi(api = VERSION_CODES.N)
    private static void loadEeloAccounts(@NonNull Context context, List<Account> accounts,
            @NonNull AccountManager accountManager, @NonNull K9JobManager jobManager) {
        android.accounts.Account[] eeloAccounts =
@@ -151,7 +144,8 @@ public class EeloAccountCreator {

            if (!existenceAccount.isPresent()) {
                String password = accountManager.getPassword(eeloAccount);
                createAccount(context, emailId, password, null);
                String authState = accountManager.getUserData(eeloAccount, AccountManagerConstants.KEY_AUTH_STATE);
                createAccount(context, emailId, (password != null ? password : ""), authState);
                continue;
            }

@@ -159,7 +153,6 @@ public class EeloAccountCreator {
        }
    }

    @RequiresApi(api = VERSION_CODES.N)
    private static void deleteIncompleteAccounts(List<Account> accounts, BackgroundAccountRemover accountRemover) {
        accounts.stream().filter(account -> !account.isFinishedSetup())
                .forEach(account -> accountRemover.removeAccountAsync(account.getUuid()));
@@ -190,8 +183,14 @@ public class EeloAccountCreator {
            return;
        }
        ServerSettings incomingSettings = connectionSettings.getIncoming().newPassword(password);
        account.setIncomingServerSettings(incomingSettings);
        ServerSettings outgoingSettings = connectionSettings.getOutgoing().newPassword(password);

        if (authState != null && !authState.trim().isEmpty()) {
            incomingSettings = incomingSettings.newAuthenticationType(AuthType.XOAUTH2);
            outgoingSettings = outgoingSettings.newAuthenticationType(AuthType.XOAUTH2);
        }

        account.setIncomingServerSettings(incomingSettings);
        account.setOutgoingServerSettings(outgoingSettings);

        account.setOAuthState(authState);