From 63d1e511f3925a820de9871c5194240fe165628d Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 25 Oct 2020 15:55:27 +0100 Subject: [PATCH] Gmail refresh refactoring --- .../java/eu/faircode/email/ActivitySetup.java | 2 +- .../java/eu/faircode/email/EmailService.java | 40 +++++++++++-------- .../eu/faircode/email/FragmentAccount.java | 4 +- .../eu/faircode/email/FragmentIdentity.java | 4 +- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/ActivitySetup.java b/app/src/main/java/eu/faircode/email/ActivitySetup.java index 143dc40524..199b2ddf34 100644 --- a/app/src/main/java/eu/faircode/email/ActivitySetup.java +++ b/app/src/main/java/eu/faircode/email/ActivitySetup.java @@ -776,7 +776,7 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac if (account.auth_type == EmailService.AUTH_TYPE_GMAIL) { AccountManager am = AccountManager.get(context); boolean found = false; - for (Account google : am.getAccountsByType("com.google")) + for (Account google : am.getAccountsByType(EmailService.TYPE_GOOGLE)) if (account.user.equals(google.name)) { found = true; break; diff --git a/app/src/main/java/eu/faircode/email/EmailService.java b/app/src/main/java/eu/faircode/email/EmailService.java index 6dbdc5f989..1578e6d6d9 100644 --- a/app/src/main/java/eu/faircode/email/EmailService.java +++ b/app/src/main/java/eu/faircode/email/EmailService.java @@ -3,6 +3,7 @@ package eu.faircode.email; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; import android.content.Context; import android.content.SharedPreferences; import android.security.KeyChain; @@ -104,6 +105,8 @@ public class EmailService implements AutoCloseable { private ExecutorService executor = Helper.getBackgroundExecutor(0, "mail"); + static final String TYPE_GOOGLE = "com.google"; + static final int AUTH_TYPE_PASSWORD = 1; static final int AUTH_TYPE_GMAIL = 2; static final int AUTH_TYPE_OAUTH = 3; @@ -347,22 +350,9 @@ public class EmailService implements AutoCloseable { // Refresh token if (auth == AUTH_TYPE_GMAIL) try { - String type = "com.google"; - AccountManager am = AccountManager.get(context); - Account[] accounts = am.getAccountsByType(type); - for (Account account : accounts) - if (user.equals(account.name)) { - Log.i("Refreshing token user=" + user); - am.invalidateAuthToken(type, password); - String token = am.blockingGetAuthToken(account, getAuthTokenType(type), true); - if (token == null) - throw new AuthenticatorException("No token on refresh for " + user); - - connect(host, port, auth, user, token, factory); - return token; - } - - throw new AuthenticatorException("Account not found for " + user); + String token = GmailRefresh(context, user, password); + connect(host, port, auth, user, token, factory); + return token; } catch (Exception ex1) { Log.e(ex1); throw new AuthenticationFailedException(ex.getMessage(), ex1); @@ -619,6 +609,24 @@ public class EmailService implements AutoCloseable { AuthorizationException error; } + private static String GmailRefresh(Context context, String user, String password) throws AuthenticatorException, OperationCanceledException, IOException { + AccountManager am = AccountManager.get(context); + Account[] accounts = am.getAccountsByType(TYPE_GOOGLE); + for (Account account : accounts) + if (user.equals(account.name)) { + Log.i("Refreshing token user=" + user); + if (password != null) + am.invalidateAuthToken(TYPE_GOOGLE, password); + String token = am.blockingGetAuthToken(account, getAuthTokenType(TYPE_GOOGLE), true); + if (token == null) + throw new AuthenticatorException("No token on refresh for " + user); + + return token; + } + + throw new AuthenticatorException("Account not found for " + user); + } + private static AuthState OAuthRefresh(Context context, String id, String json) throws MessagingException { try { AuthState authState = AuthState.jsonDeserialize(json); diff --git a/app/src/main/java/eu/faircode/email/FragmentAccount.java b/app/src/main/java/eu/faircode/email/FragmentAccount.java index 53aa2f6f1c..b157f710bd 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAccount.java +++ b/app/src/main/java/eu/faircode/email/FragmentAccount.java @@ -1334,12 +1334,12 @@ public class FragmentAccount extends FragmentBase { return null; AccountManager am = AccountManager.get(context); - Account[] accounts = am.getAccountsByType("com.google"); + Account[] accounts = am.getAccountsByType(EmailService.TYPE_GOOGLE); for (Account google : accounts) if (account.user.equals(google.name)) return am.blockingGetAuthToken( google, - EmailService.getAuthTokenType("com.google"), + EmailService.getAuthTokenType(EmailService.TYPE_GOOGLE), true); return null; diff --git a/app/src/main/java/eu/faircode/email/FragmentIdentity.java b/app/src/main/java/eu/faircode/email/FragmentIdentity.java index 4fda477427..84d8f91d99 100644 --- a/app/src/main/java/eu/faircode/email/FragmentIdentity.java +++ b/app/src/main/java/eu/faircode/email/FragmentIdentity.java @@ -987,12 +987,12 @@ public class FragmentIdentity extends FragmentBase { return null; AccountManager am = AccountManager.get(context); - Account[] accounts = am.getAccountsByType("com.google"); + Account[] accounts = am.getAccountsByType(EmailService.TYPE_GOOGLE); for (Account google : accounts) if (identity.user.equals(google.name)) return am.blockingGetAuthToken( google, - EmailService.getAuthTokenType("com.google"), + EmailService.getAuthTokenType(EmailService.TYPE_GOOGLE), true); return null;