diff --git a/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSObjectPermissionUpdatedEventHandler.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSObjectPermissionUpdatedEventHandler.java index 9b367adbb8e..687760be69c 100644 --- a/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSObjectPermissionUpdatedEventHandler.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSObjectPermissionUpdatedEventHandler.java @@ -33,7 +33,6 @@ import org.jkiss.dbeaver.model.websocket.event.datasource.WSDataSourceProperty; import org.jkiss.dbeaver.model.websocket.event.permissions.WSObjectPermissionEvent; -import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -61,22 +60,13 @@ public void handleEvent(@NotNull WSObjectPermissionEvent event) { yield null; } }; - if (runnable == null) { + if (runnable == null || event.getSessionId() == null) { return; } - log.debug(event.getTopicId() + " event handled"); - Collection allSessions = CBApplication.getInstance().getSessionManager().getAllActiveSessions(); - for (var activeUserSession : allSessions) { - if (!isAcceptableInSession(activeUserSession, event)) { - log.debug("Cannot handle %s event '%s' in session %s".formatted( - event.getTopicId(), - event.getId(), - activeUserSession.getSessionId() - )); - continue; - } + BaseWebSession webSession = WebAppUtils.getWebApplication().getSessionManager().findSessionBySmId(event.getSessionId()); + if (webSession != null) { log.debug("%s event '%s' handled".formatted(event.getTopicId(), event.getId())); - runnable.accept(activeUserSession); + runnable.accept(webSession); } } diff --git a/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/session/CBSessionManager.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/session/CBSessionManager.java index e23e4048d80..b03f216af3f 100644 --- a/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/session/CBSessionManager.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/session/CBSessionManager.java @@ -283,7 +283,7 @@ public BaseWebSession getSession(@NotNull String sessionId) { @Override @Nullable - public WebSession findWebSession(HttpServletRequest request) { + public WebSession findWebSession(@NotNull HttpServletRequest request) { String sessionId = getSessionId(request); synchronized (sessionMap) { var session = sessionMap.get(sessionId); @@ -294,8 +294,22 @@ public WebSession findWebSession(HttpServletRequest request) { } } + @Nullable + @Override + public BaseWebSession findSessionBySmId(@NotNull String smSessionId) { + synchronized (sessionMap) { + for (BaseWebSession session : sessionMap.values()) { + if (Objects.equals(session.getUserContext().getSmSessionId(), smSessionId)) { + return session; + } + } + } + return null; + } + + @Nullable @Override - public WebSession findWebSession(HttpServletRequest request, boolean errorOnNoFound) throws DBWebException { + public WebSession findWebSession(@NotNull HttpServletRequest request, boolean errorOnNoFound) throws DBWebException { WebSession webSession = findWebSession(request); if (webSession != null) { return webSession; @@ -323,6 +337,7 @@ public void expireIdleSessions() { } } + @NotNull @Override public Collection getAllActiveSessions() { synchronized (sessionMap) { @@ -452,12 +467,13 @@ public void closeAllSessions(@Nullable String initiatorSessionId) { /** * Creates new web session or returns existing one. */ - public WebSession createWebSession(WebHttpRequestInfo requestInfo) throws DBException { + @NotNull + public WebSession createWebSession(@NotNull WebHttpRequestInfo requestInfo) throws DBException { String id = requestInfo.getId(); synchronized (sessionMap) { BaseWebSession baseWebSession = sessionMap.get(id); - if (baseWebSession instanceof WebSession) { - return (WebSession) baseWebSession; + if (baseWebSession instanceof WebSession webSession) { + return webSession; } else { WebSession webSessionImpl = createWebSessionImpl(requestInfo); sessionMap.put(id, webSessionImpl); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebAppSessionManager.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebAppSessionManager.java index 59ac88146a2..ca25a2a2a89 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebAppSessionManager.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebAppSessionManager.java @@ -53,10 +53,15 @@ WebSession getWebSession( BaseWebSession getSession(@NotNull String sessionId); @Nullable - WebSession findWebSession(HttpServletRequest request); + WebSession findWebSession(@NotNull HttpServletRequest request); - WebSession findWebSession(HttpServletRequest request, boolean errorOnNoFound) throws DBWebException; + @Nullable + BaseWebSession findSessionBySmId(@NotNull String smSessionId); + + @Nullable + WebSession findWebSession(@NotNull HttpServletRequest request, boolean errorOnNoFound) throws DBWebException; + @NotNull Collection getAllActiveSessions(); WebSession getOrRestoreWebSession(WebHttpRequestInfo httpRequest); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSDefaultEventHandler.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSDefaultEventHandler.java index 10bea4a2ede..c8f83592a98 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSDefaultEventHandler.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSDefaultEventHandler.java @@ -23,26 +23,20 @@ import org.jkiss.dbeaver.model.websocket.WSEventHandler; import org.jkiss.dbeaver.model.websocket.event.WSEvent; -import java.util.Collection; - public class WSDefaultEventHandler implements WSEventHandler { private static final Log log = Log.getLog(WSDefaultEventHandler.class); @Override public void handleEvent(@NotNull EVENT event) { - log.debug(event.getTopicId() + " event handled"); - Collection allSessions = WebAppUtils.getWebApplication() - .getSessionManager() - .getAllActiveSessions(); - for (var activeUserSession : allSessions) { - if (!isAcceptableInSession(activeUserSession, event)) { - log.debug("Cannot handle " + event.getTopicId() + " event '" + event.getId() + - "' in session " + activeUserSession.getSessionId()); - continue; + if (event.getSessionId() != null) { + BaseWebSession session = WebAppUtils.getWebApplication().getSessionManager().findSessionBySmId(event.getSessionId()); + if (session != null) { + log.debug(event.getTopicId() + " event '" + event.getId() + "' handled in session '" + event.getSessionId() + "'"); + updateSessionData(session, event); + } else { + log.debug(event.getTopicId() + " event '" + event.getId() + "' not handled: session '" + event.getSessionId() + "' was not found."); } - log.debug(event.getTopicId() + " event '" + event.getId() + "' handled"); - updateSessionData(activeUserSession, event); } }