diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebUserContext.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebUserContext.java index e180d6c205..be13412d74 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebUserContext.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebUserContext.java @@ -112,8 +112,11 @@ public class WebUserContext implements SMCredentialsProvider { * reset the state as if the user is not logged in */ public synchronized void reset() throws DBException { - if (this.smCredentials != null) { - this.securityController.logout(); + try { + if (this.smCredentials != null) { + this.securityController.logout(); + } + } catch (Exception e) { } this.userPermissions = getDefaultPermissions(); this.smCredentials = null; diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/security/SMUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/security/SMUtils.java index b03138f17b..6fbcd831d7 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/security/SMUtils.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/security/SMUtils.java @@ -10,6 +10,7 @@ import org.jkiss.dbeaver.model.auth.SMCredentialsProvider; import org.jkiss.dbeaver.model.rm.RMConstants; import org.jkiss.dbeaver.model.rm.RMProject; import org.jkiss.dbeaver.model.rm.RMProjectPermission; +import org.jkiss.dbeaver.model.security.exception.SMRefreshTokenExpiredException; import java.util.ArrayList; import java.util.Comparator; @@ -45,4 +46,18 @@ public class SMUtils { return permissionInfos; } + public static boolean isTokenExpiredExceptionWasHandled(Throwable ex) { + if (ex instanceof SMRefreshTokenExpiredException) { + return true; + } + + Throwable cause = ex; + while ((cause = cause.getCause()) != null) { + if (cause instanceof SMRefreshTokenExpiredException) { + return true; + } + } + return false; + } + } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java index d7b7248a2b..db367f95bd 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java @@ -26,6 +26,7 @@ import io.cloudbeaver.model.session.WebSessionProvider; import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.server.CBPlatform; import io.cloudbeaver.server.graphql.GraphQLEndpoint; +import io.cloudbeaver.service.security.SMUtils; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; @@ -170,6 +171,17 @@ public abstract class WebServiceBindingBase impleme throw e.getTargetException(); } } catch (Throwable ex) { + if (SMUtils.isTokenExpiredExceptionWasHandled(ex)) { + WebSession webSession = findWebSession(env); + if (webSession != null) { + webSession.resetUserState(); + } + throw new DBWebException( + "Authentication has expired", + DBWebException.ERROR_CODE_SESSION_EXPIRED, + ex + ); + } for (Class exType : method.getExceptionTypes()) { if (exType.isInstance(ex)) { throw ex; diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/impl/WebServiceAuthImpl.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/impl/WebServiceAuthImpl.java index 121af7a056..7d31bb5268 100644 --- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/impl/WebServiceAuthImpl.java +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/impl/WebServiceAuthImpl.java @@ -32,6 +32,7 @@ import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.service.auth.DBWServiceAuth; import io.cloudbeaver.service.auth.WebAuthStatus; import io.cloudbeaver.service.auth.WebUserInfo; +import io.cloudbeaver.service.security.SMUtils; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; @@ -157,6 +158,14 @@ public class WebServiceAuthImpl implements DBWServiceAuth { return new WebUserInfo(webSession, webSession.getUser()); } } catch (DBException e) { + if (SMUtils.isTokenExpiredExceptionWasHandled(e)) { + try { + webSession.resetUserState(); + return null; + } catch (DBException ex) { + throw new DBWebException("Error reading user details", e); + } + } throw new DBWebException("Error reading user details", e); } }