diff --git a/app/core/src/main/java/com/fsck/k9/K9.kt b/app/core/src/main/java/com/fsck/k9/K9.kt index 98a96dc7cc8bf5d77b958fc8a5433249f08d58d8..637f624aa75c19153731fab8461126b42c1a0401 100644 --- a/app/core/src/main/java/com/fsck/k9/K9.kt +++ b/app/core/src/main/java/com/fsck/k9/K9.kt @@ -375,7 +375,7 @@ object K9 : EarlyInit { k9Language = storage.getString("language", "") - appTheme = AppTheme.FOLLOW_SYSTEM //storage.getEnum("theme", AppTheme.FOLLOW_SYSTEM) + appTheme = AppTheme.FOLLOW_SYSTEM // storage.getEnum("theme", AppTheme.FOLLOW_SYSTEM) messageViewTheme = storage.getEnum("messageViewTheme", SubTheme.USE_GLOBAL) messageComposeTheme = storage.getEnum("messageComposeTheme", SubTheme.USE_GLOBAL) diff --git a/app/core/src/test/java/com/fsck/k9/preferences/SettingsImporterTest.java b/app/core/src/test/java/com/fsck/k9/preferences/SettingsImporterTest.java index fcfdd48fd748cde07ffeff798c8bebe8830132c6..afd4f4605b9905a48eedd873cbd09d093b0970e2 100644 --- a/app/core/src/test/java/com/fsck/k9/preferences/SettingsImporterTest.java +++ b/app/core/src/test/java/com/fsck/k9/preferences/SettingsImporterTest.java @@ -144,16 +144,16 @@ public class SettingsImporterTest extends K9RobolectricTest { InputStream inputStream = inputStreamOf("" + "Account" + "" + - "SSL_TLS_REQUIRED" + - "user@gmail.com" + - "CRAM_MD5" + - "googlemail.com" + + "SSL_TLS_REQUIRED" + + "user@gmail.com" + + "CRAM_MD5" + + "googlemail.com" + "" + "" + - "SSL_TLS_REQUIRED" + - "user@googlemail.com" + - "CRAM_MD5" + - "googlemail.com" + + "SSL_TLS_REQUIRED" + + "user@googlemail.com" + + "CRAM_MD5" + + "googlemail.com" + "" + "b" + "user@gmail.com" + @@ -177,14 +177,14 @@ public class SettingsImporterTest extends K9RobolectricTest { String validUUID = UUID.randomUUID().toString(); InputStream inputStream = inputStreamOf("" + "" + - "" + - "Account" + - "" + - "" + - "user@gmail.com" + - "" + - "" + - "" + + "" + + "Account" + + "" + + "" + + "user@gmail.com" + + "" + + "" + + "" + ""); SettingsImporter.ImportContents results = SettingsImporter.getImportStreamContents(inputStream); @@ -200,14 +200,14 @@ public class SettingsImporterTest extends K9RobolectricTest { String validUUID = UUID.randomUUID().toString(); InputStream inputStream = inputStreamOf("" + "" + - "" + - "" + - "" + - "" + - "user@gmail.com" + - "" + - "" + - "" + + "" + + "" + + "" + + "" + + "user@gmail.com" + + "" + + "" + + "" + ""); SettingsImporter.ImportContents results = SettingsImporter.getImportStreamContents(inputStream); diff --git a/app/k9mail/src/main/java/com/fsck/k9/backends/ImapBackendFactory.kt b/app/k9mail/src/main/java/com/fsck/k9/backends/ImapBackendFactory.kt index 05a9baa676d0129ef0bce162229a0813d837d688..20893d309b0ec730a0a5a766e01d24dc0ac806db 100644 --- a/app/k9mail/src/main/java/com/fsck/k9/backends/ImapBackendFactory.kt +++ b/app/k9mail/src/main/java/com/fsck/k9/backends/ImapBackendFactory.kt @@ -49,6 +49,7 @@ class ImapBackendFactory( } private fun createImapStore(account: Account): ImapStore { + val oAuth2TokenProvider: OAuth2TokenProvider? = oAuth2TokenProvider val config = createImapStoreConfig(account) return ImapStore.create( account.incomingServerSettings, @@ -72,7 +73,8 @@ class ImapBackendFactory( private fun createSmtpTransport(account: Account): SmtpTransport { val serverSettings = account.outgoingServerSettings - return SmtpTransport(serverSettings, trustedSocketFactory, oAuth2TokenProvider) + val oauth2TokenProvider: OAuth2TokenProvider? = oAuth2TokenProvider + return SmtpTransport(serverSettings, trustedSocketFactory, oauth2TokenProvider) } private fun createPushConfigProvider(account: Account) = object : ImapPushConfigProvider { 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 6c0c0573267adecfc4c4d649d7f109c61405fde4..c9d53db3df275d85c6161b29e6157426ad6db0ce 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 @@ -41,7 +41,6 @@ import com.fsck.k9.controller.MessageReference import com.fsck.k9.fragment.MessageListFragment import com.fsck.k9.fragment.MessageListFragment.MessageListFragmentListener import com.fsck.k9.helper.Contacts -import com.fsck.k9.helper.EmailHelper import com.fsck.k9.helper.ParcelableUtil import com.fsck.k9.mailstore.SearchStatusManager import com.fsck.k9.mailstore.StorageManager @@ -151,7 +150,6 @@ open class MessageList : accounts = preferences.accounts } - val hasAccountSetup = accounts.any { it.isFinishedSetup } if (!hasAccountSetup) { AccountSetupBasics.actionNewAccount(this) @@ -1640,8 +1638,10 @@ open class MessageList : accountWasAdded = true } } + for (googleAccount in googleAccounts) { val emailId: String = accountManager.getUserData(googleAccount, ACCOUNT_EMAIL_ADDRESS_KEY) + var accountIsSignedIn = false for (account in accounts) { if (emailId == account.email) { @@ -1654,12 +1654,11 @@ open class MessageList : } } if (!accountIsSignedIn) { -// GoogleAccountCreator.createAccount(this, emailId) EeloAccountCreator.createAccount(this, emailId, "") accountWasAdded = true } } - accountWasAdded + return accountWasAdded } catch (e: SecurityException) { e.printStackTrace() false diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupBasics.java b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupBasics.java index abf985c11bcf01785911862c0d4d23f2492b3f2a..b6567352b89b1c2bec169dcc5c695e49361bc373 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupBasics.java +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupBasics.java @@ -195,7 +195,7 @@ public class AccountSetupBasics extends K9Activity boolean valid = Utility.requiredFieldValid(mEmailView) && ((!clientCertificateChecked && (Utility.requiredFieldValid(mPasswordView) || xoauth2)) - || (clientCertificateChecked && clientCertificateAlias != null)) + || (clientCertificateChecked && clientCertificateAlias != null)) && mEmailValidator.isValidAddressOnly(email); mNextButton.setEnabled(valid); diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupCheckSettings.java b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupCheckSettings.java index a58531c76a6ba188b0fc147179351f0146d9c713..5980705a57f814ea993370ba4426150af9992e18 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupCheckSettings.java +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupCheckSettings.java @@ -20,6 +20,7 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; +import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; @@ -69,6 +70,8 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList private static final String EXTRA_CHECK_DIRECTION ="checkDirection"; + private String className=this.getClass().getName(); + public enum CheckDirection { INCOMING, OUTGOING; @@ -461,6 +464,7 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList finish(); } catch (OAuth2NeedUserPromptException ignored) { //let the user do oauth2 flow procedure through webview + Log.e(className, ignored.getMessage()); } } catch (AuthenticationFailedException afe) { diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/AccountManagerConstants.kt b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/AccountManagerConstants.kt index 622b445446d1f44a5f95a8f089ade0a6d37cf319..a958a5e269eeecf24c1f6cd543b637f7e92f77d2 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/AccountManagerConstants.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/AccountManagerConstants.kt @@ -5,4 +5,4 @@ object AccountManagerConstants { const val GOOGLE_ACCOUNT_TYPE = "e.foundation.webdav.google" const val ACCOUNT_EMAIL_ADDRESS_KEY = "email_address" const val MAIL_CONTENT_AUTHORITY = "foundation.e.mail.provider.AppContentProvider" -} \ No newline at end of file +} diff --git a/mail/common/build.gradle b/mail/common/build.gradle index c6ebe96d859e73e09382d22106654f28179cf280..93bd2518908ca16afd0dca42b981e2958979e292 100644 --- a/mail/common/build.gradle +++ b/mail/common/build.gradle @@ -41,6 +41,7 @@ android { testCoverageEnabled rootProject.testCoverage buildConfigField "String", "GOOGLE_CLIENT_ID", "\"654688539095-g7f4lov1ljpd6sjal6pgr57j19i58t2p.apps.googleusercontent.com\"" buildConfigField "String", "GOOGLE_CLIENT_ID_PACKAGE_NAME", "\"foundation.e.mail\"" + } release { diff --git a/mail/common/src/main/AndroidManifest.xml b/mail/common/src/main/AndroidManifest.xml index 384e73586dde425d5f97e5d3eaa6c209571eacd0..83c843f0f2220fe984843be0c71d7c18d0c42d53 100644 --- a/mail/common/src/main/AndroidManifest.xml +++ b/mail/common/src/main/AndroidManifest.xml @@ -1,2 +1,8 @@ - + + + + + + diff --git a/mail/common/src/main/java/com/fsck/k9/mail/oauth/K9OAuth2TokenProvider.kt b/mail/common/src/main/java/com/fsck/k9/mail/oauth/K9OAuth2TokenProvider.kt index d818a3eee0b146b4ce8bbff0544b4a2d26d03f26..7d3e0b938f5dbb1559f5cfd2f6c32cd74516aabf 100644 --- a/mail/common/src/main/java/com/fsck/k9/mail/oauth/K9OAuth2TokenProvider.kt +++ b/mail/common/src/main/java/com/fsck/k9/mail/oauth/K9OAuth2TokenProvider.kt @@ -1,17 +1,41 @@ package com.fsck.k9.mail.oauth +import android.accounts.Account +import android.accounts.AccountManager +import android.content.Context +import android.os.Bundle +import android.os.Handler +import android.os.HandlerThread import com.fsck.k9.mail.AuthenticationFailedException import com.fsck.k9.mail.oauth.authorizationserver.AuthorizationServer import com.fsck.k9.mail.oauth.authorizationserver.codegrantflow.OAuth2CodeGrantFlowManager import com.fsck.k9.mail.oauth.authorizationserver.codegrantflow.OAuth2NeedUserPromptException +import java.util.concurrent.CountDownLatch class K9OAuth2TokenProvider( private val tokensStore: OAuth2TokensStore, - private val oAuth2CodeGrantFlowManager: OAuth2CodeGrantFlowManager + private val oAuth2CodeGrantFlowManager: OAuth2CodeGrantFlowManager, + private val context: Context ) : OAuth2TokenProvider { + companion object { + const val GOOGLE_ACCOUNT_TYPE = "e.foundation.webdav.google" + const val EELO_ACCOUNT_TYPE = "e.foundation.webdav.eelo" + const val ACCOUNT_EMAIL_ADDRESS_KEY = "email_address" + const val AUTH_TOKEN_TYPE = "oauth2-access-token" + } + + private val accountManager by lazy { + AccountManager.get(context) + } + @Throws(AuthenticationFailedException::class, OAuth2NeedUserPromptException::class) override fun getToken(email: String, timeoutMillis: Long): String { + + getTokenFromAccountManager(email)?.let { + return it + } + if (tokensStore.getAccessToken(email) == null) { val refreshToken = tokensStore.getRefreshToken(email) if (refreshToken != null) { @@ -43,4 +67,40 @@ class K9OAuth2TokenProvider( private fun getAuthorizationServer(email: String): AuthorizationServer? { return OAuth2Provider.getProvider(email)?.authorizationServer } + + private fun getTokenFromAccountManager(emailId: String): String? { + + var authToken: String? = null + val handlerThread = HandlerThread("callbackThread") + + handlerThread.start() + val handler = Handler(handlerThread.looper) + + val accounts: ArrayList = arrayListOf() + for (account in accountManager.getAccountsByType(GOOGLE_ACCOUNT_TYPE)) { + accounts.add(account) + } + + for (account in accountManager.getAccountsByType(EELO_ACCOUNT_TYPE)) { + accounts.add(account) + } + + for (account in accounts) { + val accountEmailId = accountManager.getUserData(account, ACCOUNT_EMAIL_ADDRESS_KEY) + if (emailId == accountEmailId) { + val latch = CountDownLatch(1) + accountManager.getAuthToken( + account, AUTH_TOKEN_TYPE, Bundle(), false, + { future -> + authToken = future?.result?.getString(AccountManager.KEY_AUTHTOKEN) + latch.countDown() + }, + handler + ) + latch.await() + } + } + + return authToken + } } diff --git a/mail/common/src/main/java/com/fsck/k9/mail/oauth/KoinModule.kt b/mail/common/src/main/java/com/fsck/k9/mail/oauth/KoinModule.kt index 6085aca726649a3212995c8bf587d8dc19506f61..ae625dae735caf42dfc6b3584b03103eec1fb193 100644 --- a/mail/common/src/main/java/com/fsck/k9/mail/oauth/KoinModule.kt +++ b/mail/common/src/main/java/com/fsck/k9/mail/oauth/KoinModule.kt @@ -1,10 +1,11 @@ package com.fsck.k9.mail.oauth import com.fsck.k9.mail.oauth.authorizationserver.codegrantflow.OAuth2CodeGrantFlowManager +import org.koin.android.ext.koin.androidContext import org.koin.dsl.module val oauth2Module = module { - single { K9OAuth2TokenProvider(get(), get()) } + single { K9OAuth2TokenProvider(get(), get(), androidContext()) } single { OAuth2CodeGrantFlowManager(get()) } single { OAuth2TokensStore(get()) } } diff --git a/mail/protocols/imap/src/test/java/com/fsck/k9/mail/store/imap/RealImapConnectionTest.java b/mail/protocols/imap/src/test/java/com/fsck/k9/mail/store/imap/RealImapConnectionTest.java index 9232c9df3ec4a0c5f582813712a039a792579b8f..a87fb5d16e90f171660834f761cc1d189447459b 100644 --- a/mail/protocols/imap/src/test/java/com/fsck/k9/mail/store/imap/RealImapConnectionTest.java +++ b/mail/protocols/imap/src/test/java/com/fsck/k9/mail/store/imap/RealImapConnectionTest.java @@ -1072,16 +1072,6 @@ public class RealImapConnectionTest { assertEquals(USERNAME, username); invalidationCount++; } - - @Override - public List getAccounts() { - throw new UnsupportedOperationException(); - } - - @Override - public void authorizeApi(String username, Activity activity, OAuth2TokenProviderAuthCallback callback) { - throw new UnsupportedOperationException(); - } }; } }