diff --git a/app/src/main/java/eu/faircode/email/ServiceAuthenticator.java b/app/src/main/java/eu/faircode/email/ServiceAuthenticator.java index 940088d58f..339a2eb58b 100644 --- a/app/src/main/java/eu/faircode/email/ServiceAuthenticator.java +++ b/app/src/main/java/eu/faircode/email/ServiceAuthenticator.java @@ -47,8 +47,10 @@ import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; import javax.mail.Authenticator; import javax.mail.MessagingException; @@ -62,6 +64,8 @@ public class ServiceAuthenticator extends Authenticator { private String password; private IAuthenticated intf; + private static final ConcurrentHashMap locks = new ConcurrentHashMap<>(); + static final int AUTH_TYPE_PASSWORD = 1; static final int AUTH_TYPE_GMAIL = 2; static final int AUTH_TYPE_OAUTH = 3; @@ -164,6 +168,8 @@ public class ServiceAuthenticator extends Authenticator { static void OAuthRefresh(Context context, String id, int auth_type, String user, AuthState authState, boolean forceRefresh) throws MessagingException { + ReentrantLock lock = locks.computeIfAbsent(id, k -> new ReentrantLock()); + lock.lock(); try { long now = new Date().getTime(); @@ -254,6 +260,8 @@ public class ServiceAuthenticator extends Authenticator { } } catch (Exception ex) { throw new MessagingException("OAuth refresh provider=" + id + ":" + getAuthTypeName(auth_type), ex); + } finally { + lock.unlock(); } }