Added fail-safe

This commit is contained in:
M66B 2022-08-12 12:12:17 +02:00
parent e4152a6d7a
commit 3fd748d513
2 changed files with 35 additions and 2 deletions

View File

@ -24,8 +24,10 @@ import android.accounts.AccountManager;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.content.Context;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.preference.PreferenceManager;
import org.json.JSONException;
import org.json.JSONObject;
@ -71,6 +73,19 @@ public class GmailState {
expiration - ServiceAuthenticator.MIN_FORCE_REFRESH_INTERVAL < now)
needsRefresh = true;
if (needsRefresh) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String key = "token." + id + "." + user;
long last_refresh = prefs.getLong(key, 0);
long ago = now - last_refresh;
EntityLog.log(context, EntityLog.Type.Debug, "Token needs refresh" +
" user=" + id + ":" + user + " ago=" + (ago / 60 / 1000L) + " min");
if (ago < ServiceAuthenticator.MIN_FORCE_REFRESH_INTERVAL) {
Log.e("Blocked token refresh id=" + id + " ago=" + (ago / 1000L));
return;
}
prefs.edit().putLong(key, now).apply();
}
EntityLog.log(context, EntityLog.Type.Debug, "Token user=" + id + ":" + user +
" expiration=" + (expiration == null ? null : new Date(expiration)) +

View File

@ -24,6 +24,9 @@ import static eu.faircode.email.GmailState.TYPE_GOOGLE;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.content.Context;
import android.content.SharedPreferences;
import androidx.preference.PreferenceManager;
import net.openid.appauth.AuthState;
import net.openid.appauth.AuthorizationException;
@ -150,14 +153,29 @@ public class ServiceAuthenticator extends Authenticator {
long now = new Date().getTime();
Long expiration = authState.getAccessTokenExpirationTime();
boolean needsRefresh = (expiration != null && expiration < now);
if (needsRefresh)
authState.setNeedsTokenRefresh(true);
if (!needsRefresh && forceRefresh &&
expiration != null &&
expiration - ServiceAuthenticator.MIN_FORCE_REFRESH_INTERVAL < now)
needsRefresh = true;
if (needsRefresh)
authState.setNeedsTokenRefresh(true);
if (needsRefresh) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String key = "token." + id + "." + user;
long last_refresh = prefs.getLong(key, 0);
long ago = now - last_refresh;
EntityLog.log(context, EntityLog.Type.Debug, "Token needs refresh" +
" user=" + id + ":" + user + " ago=" + (ago / 60 / 1000L) + " min");
if (ago < ServiceAuthenticator.MIN_FORCE_REFRESH_INTERVAL) {
Log.e("Blocked token refresh id=" + id + " ago=" + (ago / 1000L));
return;
}
prefs.edit().putLong(key, now).apply();
}
EntityLog.log(context, EntityLog.Type.Debug, "Token user=" + id + ":" + user +
" expiration=" + (expiration == null ? null : new Date(expiration)) +
" need=" + needsRefresh + "/" + authState.getNeedsTokenRefresh() +