From 625b926eeaea3717fa0526623de77bad31b67938 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Mon, 25 Apr 2022 13:37:41 +0600 Subject: [PATCH 1/2] 5293-Fix_crash_on_non_gmail_domained_google_account_add issue: https://gitlab.e.foundation/e/backlog/-/issues/5293 when add new google account from accountManager, for custom domains, app failed to retrieve connectionInfo. For this case, we need to provide default google connectionInfo by manually --- .../java/com/fsck/k9/activity/MessageList.kt | 4 +-- .../accountmanager/EeloAccountCreator.java | 36 ++++++++++++++++++- .../EeloMailAutoConfigDiscovery.java | 4 +-- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt b/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt index ec96a46b60..f0223fbaff 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt @@ -1687,7 +1687,7 @@ open class MessageList : } if (!accountIsSignedIn) { val password: String = accountManager.getPassword(eeloAccount) - EeloAccountCreator.createAccount(this, emailId, password) + EeloAccountCreator.createAccount(this, emailId, password, false) accountWasAdded = true } } @@ -1707,7 +1707,7 @@ open class MessageList : } } if (!accountIsSignedIn) { - EeloAccountCreator.createAccount(this, emailId, "") + EeloAccountCreator.createAccount(this, emailId, "", true) accountWasAdded = 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 b05af6f10d..25f1fbcf30 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 @@ -13,8 +13,11 @@ import com.fsck.k9.autodiscovery.api.DiscoveredServerSettings; import com.fsck.k9.autodiscovery.api.DiscoveryResults; import com.fsck.k9.autodiscovery.api.DiscoveryTarget; import com.fsck.k9.autodiscovery.providersxml.ProvidersXmlDiscovery; +import com.fsck.k9.mail.AuthType; +import com.fsck.k9.mail.ConnectionSecurity; import com.fsck.k9.mail.ServerSettings; import com.fsck.k9.mailstore.SpecialLocalFoldersCreator; +import com.fsck.k9.preferences.Protocols; import com.fsck.k9.ui.ConnectionSettings; import timber.log.Timber; @@ -24,7 +27,7 @@ public class EeloAccountCreator { private static final AccountCreator accountCreator = DI.get(AccountCreator.class); private static final SpecialLocalFoldersCreator localFoldersCreator = DI.get(SpecialLocalFoldersCreator.class); - public static void createAccount(Context context, String emailId, String password) { + public static void createAccount(Context context, String emailId, String password, boolean isGoogleAccount) { Preferences preferences = Preferences.getPreferences(context); Account account = preferences.newAccount(); @@ -37,6 +40,12 @@ public class EeloAccountCreator { // connection details not predefined in the xml. Try to load from the api connectionSettings = EeloMailAutoConfigDiscovery.retrieveConfigFromApi(emailId); } + // providers.xml doesn't have the connection details & can't retrieve details from api + // & it is google account, meaning custom domain for google account is used. + // In this case, provide default gmail configuration. + if (connectionSettings == null && isGoogleAccount) { + connectionSettings = providersDefaultGoogleAccountDiscover(emailId); + } if (connectionSettings == null) { Timber.e("Error while trying to initialise account configuration."); return; @@ -88,5 +97,30 @@ public class EeloAccountCreator { ) ); } + + private static ConnectionSettings providersDefaultGoogleAccountDiscover(String email) { + return new ConnectionSettings( + new ServerSettings( + Protocols.IMAP, + "imap.gmail.com", + 993, + ConnectionSecurity.SSL_TLS_REQUIRED, + AuthType.XOAUTH2, + email, + null, + null + ), + new ServerSettings( + Protocols.SMTP, + "smtp.gmail.com", + 465, + ConnectionSecurity.SSL_TLS_REQUIRED, + AuthType.XOAUTH2, + email, + null, + null + ) + ); + } } diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloMailAutoConfigDiscovery.java b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloMailAutoConfigDiscovery.java index 9c914cbe99..91c8e4aae1 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloMailAutoConfigDiscovery.java +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloMailAutoConfigDiscovery.java @@ -1,8 +1,6 @@ package com.fsck.k9.activity.setup.accountmanager; -import java.io.IOException; - import com.fsck.k9.autodiscovery.api.DiscoveredServerSettings; import com.fsck.k9.helper.EmailHelper; import com.fsck.k9.helper.Utility; @@ -48,7 +46,7 @@ public class EeloMailAutoConfigDiscovery { EeloMailAutoConfigResponse eeloMailAutoConfigResponse = response.body(); return providersAutoConfigDiscoveryDiscover(eeloMailAutoConfigResponse); } - } catch (IOException e) { + } catch (Exception e) { Timber.e(e); } return null; -- GitLab From e06261609b41ec1bf6d40876999ed143b1836273 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Mon, 25 Apr 2022 13:56:40 +0600 Subject: [PATCH 2/2] 5293-Fix_crash_on_non_gmail_domained_google_account_add issue: https://gitlab.e.foundation/e/backlog/-/issues/5293 Fix app crash on startup when multiple accounts are configured --- .../com/fsck/k9/backend/BackendManager.kt | 19 +++++++++++++------ .../controller/push/AccountPushController.kt | 4 ++-- .../fsck/k9/controller/push/PushController.kt | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/app/core/src/main/java/com/fsck/k9/backend/BackendManager.kt b/app/core/src/main/java/com/fsck/k9/backend/BackendManager.kt index 061084c591..25a1090177 100644 --- a/app/core/src/main/java/com/fsck/k9/backend/BackendManager.kt +++ b/app/core/src/main/java/com/fsck/k9/backend/BackendManager.kt @@ -3,20 +3,22 @@ package com.fsck.k9.backend import com.fsck.k9.Account import com.fsck.k9.backend.api.Backend import com.fsck.k9.mail.ServerSettings +import java.lang.Exception import java.util.concurrent.CopyOnWriteArraySet +import timber.log.Timber class BackendManager(private val backendFactories: Map) { private val backendCache = mutableMapOf() private val listeners = CopyOnWriteArraySet() - fun getBackend(account: Account): Backend { + fun getBackend(account: Account): Backend? { val newBackend = synchronized(backendCache) { val container = backendCache[account.uuid] if (container != null && isBackendStillValid(container, account)) { return container.backend } - createBackend(account).also { backend -> + createBackend(account)?.also { backend -> backendCache[account.uuid] = BackendContainer( backend, account.incomingServerSettings, @@ -43,10 +45,15 @@ class BackendManager(private val backendFactories: Map) notifyListeners(account) } - private fun createBackend(account: Account): Backend { - val serverType = account.incomingServerSettings.type - val backendFactory = backendFactories[serverType] ?: error("Unsupported account type") - return backendFactory.createBackend(account) + private fun createBackend(account: Account): Backend? { + return try { + val serverType = account.incomingServerSettings.type + val backendFactory = backendFactories[serverType] ?: error("Unsupported account type") + backendFactory.createBackend(account) + } catch (e: Exception) { + Timber.e(e) + null + } } fun addListener(listener: BackendChangedListener) { diff --git a/app/core/src/main/java/com/fsck/k9/controller/push/AccountPushController.kt b/app/core/src/main/java/com/fsck/k9/controller/push/AccountPushController.kt index c735c20bc6..b47eba89a6 100644 --- a/app/core/src/main/java/com/fsck/k9/controller/push/AccountPushController.kt +++ b/app/core/src/main/java/com/fsck/k9/controller/push/AccountPushController.kt @@ -63,8 +63,8 @@ internal class AccountPushController( private fun startBackendPusher() { val backend = backendManager.getBackend(account) - backendPusher = backend.createPusher(backendPusherCallback).also { backendPusher -> - backendPusher.start() + backendPusher = backend?.createPusher(backendPusherCallback).also { backendPusher -> + backendPusher?.start() } } diff --git a/app/core/src/main/java/com/fsck/k9/controller/push/PushController.kt b/app/core/src/main/java/com/fsck/k9/controller/push/PushController.kt index 2917900576..9edc8b295c 100644 --- a/app/core/src/main/java/com/fsck/k9/controller/push/PushController.kt +++ b/app/core/src/main/java/com/fsck/k9/controller/push/PushController.kt @@ -211,7 +211,7 @@ class PushController internal constructor( private fun getPushAccounts(): List { return preferences.accounts.filter { account -> - account.folderPushMode != FolderMode.NONE && backendManager.getBackend(account).isPushCapable + account.folderPushMode != FolderMode.NONE && backendManager.getBackend(account)?.isPushCapable ?: false } } private fun setPushNotificationState(notificationState: PushNotificationState) { -- GitLab