From b814110578c35f617032e1ad4c80e25a55a1e392 Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Mon, 16 Jan 2023 18:04:16 +0300 Subject: [PATCH] dbeaver/pro#143 te remote event handle (#1409) * CB-3054 send event if connection name was changed * CB-3053 use smSession id in events * CB-3054 fix rename event * CB-3054 use equalSettings method to compare changes * dbeaver/pro#143 Datasources refresh API * dbeaver/pro#143 Handle datasource events + partial ds load * CB-3054 update headless sessions on pink Co-authored-by: Aleksandr Skoblikov Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com> --- .../WebDataSourceRegistryProxy.java | 10 +++- .../auth}/SMTokenCredentialProvider.java | 4 +- .../rm/local/LocalResourceController.java | 12 +++-- .../model/session/WebUserContext.java | 2 + .../io/cloudbeaver/server/CBApplication.java | 5 +- .../WSConfigurationChangedEventHandler.java | 3 +- .../events/WSProjectUpdatedEventHandler.java | 3 +- .../cloudbeaver/server/events/WSWebUtils.java | 39 +++++++++++++++ .../server/websockets/CBEventsWebSocket.java | 10 ++++ .../websockets/CBJettyWebSocketManager.java | 5 +- .../websockets/WebSocketPingPongCallback.java | 38 ++++++++++++++ .../service/core/impl/WebServiceCore.java | 50 ++++++------------- .../navigator/impl/WebServiceNavigator.java | 8 +-- .../service/session/WebSessionManager.java | 1 + 14 files changed, 138 insertions(+), 52 deletions(-) rename server/bundles/{io.cloudbeaver.server/src/io/cloudbeaver/service/session => io.cloudbeaver.model/src/io/cloudbeaver/auth}/SMTokenCredentialProvider.java (91%) create mode 100644 server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSWebUtils.java create mode 100644 server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/WebSocketPingPongCallback.java diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java index 3ac2b59275..1c4a6c23b7 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java @@ -35,6 +35,7 @@ import org.jkiss.dbeaver.registry.DataSourceConfigurationManager; import org.jkiss.dbeaver.registry.DataSourcePersistentRegistry; import org.jkiss.dbeaver.registry.DataSourceRegistry; +import java.util.Collection; import java.util.List; import java.util.Set; import java.util.function.Predicate; @@ -254,6 +255,11 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo dataSourceRegistry.refreshConfig(); } + @Override + public void refreshConfig(@Nullable Collection dataSourceIds) { + dataSourceRegistry.refreshConfig(dataSourceIds); + } + @Override public Throwable getLastError() { return dataSourceRegistry.getLastError(); @@ -299,10 +305,10 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo public boolean loadDataSources( @NotNull List storages, @NotNull DataSourceConfigurationManager manager, - boolean refresh, + @Nullable Collection dataSourceIds, boolean refresh, boolean purgeUntouched ) { - return dataSourceRegistry.loadDataSources(storages, manager, refresh, purgeUntouched); + return dataSourceRegistry.loadDataSources(storages, manager, dataSourceIds, refresh, purgeUntouched); } @Override diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/SMTokenCredentialProvider.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/auth/SMTokenCredentialProvider.java similarity index 91% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/SMTokenCredentialProvider.java rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/auth/SMTokenCredentialProvider.java index a3f74a327c..1716be7503 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/SMTokenCredentialProvider.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/auth/SMTokenCredentialProvider.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.cloudbeaver.service.session; +package io.cloudbeaver.auth; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.model.auth.SMCredentials; @@ -32,6 +32,6 @@ public class SMTokenCredentialProvider implements SMCredentialsProvider { @Nullable @Override public SMCredentials getActiveUserCredentials() { - return new SMCredentials(smAccessToken, null, Set.of()); + return new SMCredentials(smAccessToken, null, null, Set.of()); } } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java index 6032651e95..0c59fb308d 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java @@ -42,6 +42,7 @@ import org.jkiss.dbeaver.model.security.SMObjects; import org.jkiss.dbeaver.model.sql.DBQuotaException; import org.jkiss.dbeaver.registry.*; import org.jkiss.dbeaver.runtime.DBWorkbench; +import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; import org.jkiss.utils.IOUtils; @@ -51,6 +52,7 @@ import java.nio.file.*; import java.time.OffsetDateTime; import java.time.ZoneId; import java.util.*; +import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -287,12 +289,16 @@ public class LocalResourceController implements RMController { } @Override - public String getProjectsDataSources(@NotNull String projectId) throws DBException { + public String getProjectsDataSources(@NotNull String projectId, @Nullable String[] dataSourceIds) throws DBException { DBPProject projectMetadata = getProjectMetadata(projectId, false); DBPDataSourceRegistry registry = projectMetadata.getDataSourceRegistry(); registry.checkForErrors(); DataSourceConfigurationManagerBuffer buffer = new DataSourceConfigurationManagerBuffer(); - ((DataSourcePersistentRegistry) registry).saveConfigurationToManager(new VoidProgressMonitor(), buffer, null); + Predicate filter = null; + if (!ArrayUtils.isEmpty(dataSourceIds)) { + filter = ds -> ArrayUtils.contains(dataSourceIds, ds.getId()); + } + ((DataSourcePersistentRegistry) registry).saveConfigurationToManager(new VoidProgressMonitor(), buffer, filter); registry.checkForErrors(); return new String(buffer.getData(), StandardCharsets.UTF_8); } @@ -316,7 +322,7 @@ public class LocalResourceController implements RMController { final DBPDataSourceRegistry registry = project.getDataSourceRegistry(); final DBPDataSourceConfigurationStorage storage = new DataSourceMemoryStorage(configuration.getBytes(StandardCharsets.UTF_8)); final DataSourceConfigurationManager manager = new DataSourceConfigurationManagerBuffer(); - var configChanged = ((DataSourcePersistentRegistry) registry).loadDataSources(List.of(storage), manager, true, false); + var configChanged = ((DataSourcePersistentRegistry) registry).loadDataSources(List.of(storage), manager, dataSourceIds, true, false); registry.checkForErrors(); ((DataSourcePersistentRegistry) registry).saveDataSources(); registry.checkForErrors(); 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 2fec37ded2..2ec891d953 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 @@ -100,6 +100,7 @@ public class WebUserContext implements SMCredentialsProvider { this.smCredentials = new SMCredentials( smAccessToken, smAuthPermissions.getUserId(), + smAuthPermissions.getSessionId(), smAuthPermissions.getPermissions() ); this.refreshToken = smRefreshToken; @@ -128,6 +129,7 @@ public class WebUserContext implements SMCredentialsProvider { this.smCredentials = new SMCredentials( newTokens.getSmAccessToken(), smCredentials.getUserId(), + smCredentials.getSmSessionId(), smCredentials.getPermissions() ); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java index 2446361c37..562b084221 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java @@ -26,7 +26,6 @@ import io.cloudbeaver.model.app.WebAuthApplication; import io.cloudbeaver.model.app.WebAuthConfiguration; import io.cloudbeaver.model.rm.local.LocalResourceController; import io.cloudbeaver.model.session.WebAuthInfo; -import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.registry.WebDriverRegistry; import io.cloudbeaver.registry.WebServiceRegistry; import io.cloudbeaver.server.jetty.CBJettyServer; @@ -833,8 +832,8 @@ public class CBApplication extends BaseWebApplication implements WebAuthApplicat configurationMode = CommonUtils.isEmpty(serverName); String sessionId = null; - if (credentialsProvider instanceof WebSession) { - sessionId = ((WebSession) credentialsProvider).getSessionId(); + if (credentialsProvider != null && credentialsProvider.getActiveUserCredentials() != null) { + sessionId = credentialsProvider.getActiveUserCredentials().getSmSessionId(); } eventController.addEvent(new WSServerConfigurationChangedEvent(sessionId)); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSConfigurationChangedEventHandler.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSConfigurationChangedEventHandler.java index b59e98e6c6..c862183ecf 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSConfigurationChangedEventHandler.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSConfigurationChangedEventHandler.java @@ -23,7 +23,6 @@ import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.websocket.WSEventHandler; import org.jkiss.dbeaver.model.websocket.event.WSEvent; import org.jkiss.dbeaver.model.websocket.event.WSEventTopic; -import org.jkiss.utils.CommonUtils; import java.util.Collection; @@ -45,7 +44,7 @@ public class WSConfigurationChangedEventHandler implements WSEventHandler { Collection allSessions = CBPlatform.getInstance().getSessionManager().getAllActiveSessions(); for (var activeUserSession : allSessions) { - if (CommonUtils.equalObjects(activeUserSession.getSessionId(), event.getSessionId())) { + if (WSWebUtils.isSessionIdEquals(activeUserSession, event.getSessionId())) { continue; } activeUserSession.addSessionEvent(event); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSProjectUpdatedEventHandler.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSProjectUpdatedEventHandler.java index 6018eb993b..ad6c9473c3 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSProjectUpdatedEventHandler.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSProjectUpdatedEventHandler.java @@ -21,6 +21,7 @@ import io.cloudbeaver.server.CBPlatform; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.websocket.WSEventHandler; +import org.jkiss.dbeaver.model.websocket.WSUtils; import org.jkiss.dbeaver.model.websocket.event.WSEvent; import org.jkiss.utils.CommonUtils; @@ -41,7 +42,7 @@ public abstract class WSProjectUpdatedEventHandler implements WSEventHandler { log.debug(getSupportedTopicId() + " event handled"); Collection allSessions = CBPlatform.getInstance().getSessionManager().getAllActiveSessions(); for (var activeUserSession : allSessions) { - if (CommonUtils.equalObjects(activeUserSession.getSessionId(), event.getSessionId())) { + if (WSWebUtils.isSessionIdEquals(activeUserSession, event.getSessionId())) { continue; } updateSessionData(activeUserSession, event); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSWebUtils.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSWebUtils.java new file mode 100644 index 0000000000..1283b2a465 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSWebUtils.java @@ -0,0 +1,39 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.cloudbeaver.server.events; + +import io.cloudbeaver.model.session.BaseWebSession; +import io.cloudbeaver.model.session.WebSession; +import org.jkiss.code.NotNull; +import org.jkiss.code.Nullable; + +import java.util.Objects; + +public class WSWebUtils { + public static boolean isSessionIdEquals(@NotNull BaseWebSession webSession, @Nullable String sessionId) { + if (sessionId == null) { + return false; + } + if (Objects.equals(webSession.getSessionId(), sessionId)) { + return true; + } + if (webSession instanceof WebSession) { + return Objects.equals(webSession.getUserContext().getSmSessionId(), sessionId); + } + return false; + } +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsWebSocket.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsWebSocket.java index d5726098da..b5f29c6072 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsWebSocket.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsWebSocket.java @@ -22,6 +22,7 @@ import io.cloudbeaver.model.session.BaseWebSession; import io.cloudbeaver.websocket.CBWebSessionEventHandler; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.WebSocketAdapter; +import org.eclipse.jetty.websocket.api.WriteCallback; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.websocket.WSConstants; @@ -40,8 +41,12 @@ public class CBEventsWebSocket extends WebSocketAdapter implements CBWebSessionE @NotNull private final BaseWebSession webSession; + @NotNull + private final WriteCallback callback; + public CBEventsWebSocket(@NotNull BaseWebSession webSession) { this.webSession = webSession; + this.callback = new WebSocketPingPongCallback(webSession); } @Override @@ -124,4 +129,9 @@ public class CBEventsWebSocket extends WebSocketAdapter implements CBWebSessionE public BaseWebSession getWebSession() { return webSession; } + + @NotNull + public WriteCallback getCallback() { + return callback; + } } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBJettyWebSocketManager.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBJettyWebSocketManager.java index f6747fbc18..806e8329a5 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBJettyWebSocketManager.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBJettyWebSocketManager.java @@ -92,7 +92,10 @@ public class CBJettyWebSocketManager implements JettyWebSocketCreator { var sessionId = entry.getKey(); var webSocket = entry.getValue(); try { - webSocket.getRemote().sendPing(ByteBuffer.wrap("cb-ping".getBytes(StandardCharsets.UTF_8))); + webSocket.getRemote().sendPing( + ByteBuffer.wrap("cb-ping".getBytes(StandardCharsets.UTF_8)), + webSocket.getCallback() + ); } catch (Exception e) { log.error("Failed to send ping in web socket: " + sessionId); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/WebSocketPingPongCallback.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/WebSocketPingPongCallback.java new file mode 100644 index 0000000000..8530e963c1 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/WebSocketPingPongCallback.java @@ -0,0 +1,38 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.cloudbeaver.server.websockets; + +import io.cloudbeaver.model.session.BaseWebSession; +import io.cloudbeaver.model.session.WebHeadlessSession; +import org.eclipse.jetty.websocket.api.WriteCallback; +import org.jkiss.code.NotNull; + +public class WebSocketPingPongCallback implements WriteCallback { + @NotNull + private final BaseWebSession webSession; + + public WebSocketPingPongCallback(@NotNull BaseWebSession webSession) { + this.webSession = webSession; + } + + @Override + public void writeSuccess() { + if (webSession instanceof WebHeadlessSession) { + webSession.touchSession(); + } + } +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java index 718e82bd67..7d563076ce 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java @@ -61,7 +61,10 @@ import org.jkiss.utils.CommonUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -405,7 +408,7 @@ public class WebServiceCore implements DBWServiceCore { webSession.addInfoMessage("New connection was created - " + WebServiceUtils.getConnectionContainerInfo(newDataSource)); WebEventUtils.addDataSourceUpdatedEvent( webSession.getProjectById(projectId), - webSession.getSessionId(), + webSession.getUserContext().getSmSessionId(), connectionInfo.getId(), WSConstants.EventAction.CREATE ); @@ -427,12 +430,12 @@ public class WebServiceCore implements DBWServiceCore { WebConnectionInfo connectionInfo = webSession.getWebConnectionInfo(projectId, config.getConnectionId()); DBPDataSourceContainer dataSource = connectionInfo.getDataSourceContainer(); webSession.addInfoMessage("Update connection - " + WebServiceUtils.getConnectionContainerInfo(dataSource)); - DBPConnectionConfiguration oldConnectionConfig = new DBPConnectionConfiguration(dataSource.getConnectionConfiguration()); + var oldDataSource = new DataSourceDescriptor((DataSourceDescriptor) dataSource, dataSource.getRegistry()); if (!CommonUtils.isEmpty(config.getName())) { dataSource.setName(config.getName()); } - String oldDescription = dataSource.getDescription(); + if (config.getDescription() != null) { dataSource.setDescription(config.getDescription()); } @@ -441,7 +444,7 @@ public class WebServiceCore implements DBWServiceCore { WebServiceUtils.setConnectionConfiguration(dataSource.getDriver(), dataSource.getConnectionConfiguration(), config); - boolean sendEvent = sendUpdateConnectionEvent(config, dataSource, oldConnectionConfig, oldDescription); + boolean sendEvent = !((DataSourceDescriptor) dataSource).equalSettings(oldDataSource); WebServiceUtils.saveAuthProperties( dataSource, @@ -460,7 +463,7 @@ public class WebServiceCore implements DBWServiceCore { if (sendEvent) { WebEventUtils.addDataSourceUpdatedEvent( webSession.getProjectById(projectId), - webSession.getSessionId(), + webSession.getUserContext().getSmSessionId(), connectionInfo.getId(), WSConstants.EventAction.UPDATE ); @@ -468,27 +471,6 @@ public class WebServiceCore implements DBWServiceCore { return connectionInfo; } - /** - * Checks if only user credentials were changed - */ - private boolean sendUpdateConnectionEvent( - @NotNull WebConnectionConfig config, - @NotNull DBPDataSourceContainer dataSource, - @NotNull DBPConnectionConfiguration oldConnectionConfig, - @Nullable String oldDescription - ) { - if (!oldConnectionConfig.equals(dataSource.getConnectionConfiguration())) { - return true; - } - if (!Objects.equals(oldDescription, dataSource.getDescription())) { - return true; - } - if (dataSource.getProject().isUseSecretStorage()) { - return dataSource.isSharedCredentials() != config.isSharedCredentials(); - } - return dataSource.isSavePassword() != config.isSaveCredentials(); - } - @Override public boolean deleteConnection( @NotNull WebSession webSession, @Nullable String projectId, @NotNull String connectionId @@ -502,7 +484,7 @@ public class WebServiceCore implements DBWServiceCore { closeAndDeleteConnection(webSession, projectId, connectionId, true); WebEventUtils.addDataSourceUpdatedEvent( webSession.getProjectById(projectId), - webSession.getSessionId(), + webSession.getUserContext().getSmSessionId(), connectionId, WSConstants.EventAction.DELETE ); @@ -583,7 +565,7 @@ public class WebServiceCore implements DBWServiceCore { webSession.addConnection(connectionInfo); WebEventUtils.addDataSourceUpdatedEvent( webSession.getProjectById(projectId), - webSession.getSessionId(), + webSession.getUserContext().getSmSessionId(), connectionInfo.getId(), WSConstants.EventAction.CREATE ); @@ -786,7 +768,7 @@ public class WebServiceCore implements DBWServiceCore { WebServiceUtils.updateConfigAndRefreshDatabases(session, projectId); WebEventUtils.addNavigatorNodeUpdatedEvent( session.getProjectById(projectId), - session.getSessionId(), + session.getUserContext().getSmSessionId(), DBNLocalFolder.makeLocalFolderItemPath(newFolder), WSConstants.EventAction.CREATE ); @@ -811,13 +793,13 @@ public class WebServiceCore implements DBWServiceCore { WebServiceUtils.updateConfigAndRefreshDatabases(session, projectId); WebEventUtils.addNavigatorNodeUpdatedEvent( session.getProjectById(projectId), - session.getSessionId(), + session.getUserContext().getSmSessionId(), oldFolderNode, WSConstants.EventAction.DELETE ); WebEventUtils.addNavigatorNodeUpdatedEvent( session.getProjectById(projectId), - session.getSessionId(), + session.getUserContext().getSmSessionId(), newFolderNode, WSConstants.EventAction.CREATE ); @@ -842,7 +824,7 @@ public class WebServiceCore implements DBWServiceCore { WebServiceUtils.updateConfigAndRefreshDatabases(session, projectId); WebEventUtils.addNavigatorNodeUpdatedEvent( session.getProjectById(projectId), - session.getSessionId(), + session.getUserContext().getSmSessionId(), folderNode, WSConstants.EventAction.DELETE ); @@ -862,7 +844,7 @@ public class WebServiceCore implements DBWServiceCore { dataSourceDescriptor.persistConfiguration(); WebEventUtils.addDataSourceUpdatedEvent( webSession.getProjectById(projectId), - webSession.getSessionId(), + webSession.getUserContext().getSmSessionId(), id, WSConstants.EventAction.UPDATE); return connectionInfo; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java index 72fa05e923..c553770ab2 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java @@ -391,13 +391,13 @@ public class WebServiceNavigator implements DBWServiceNavigator { private void addNavigatorNodeMoveEvent(@NotNull WebSession session, DBNNode node, String oldNodePath, String newNodePath) { WebEventUtils.addNavigatorNodeUpdatedEvent( node.getOwnerProject(), - session.getSessionId(), + session.getUserContext().getSmSessionId(), oldNodePath, WSConstants.EventAction.DELETE ); WebEventUtils.addNavigatorNodeUpdatedEvent( node.getOwnerProject(), - session.getSessionId(), + session.getUserContext().getSmSessionId(), newNodePath, WSConstants.EventAction.CREATE ); @@ -492,7 +492,7 @@ public class WebServiceNavigator implements DBWServiceNavigator { node.getOwnerProject().getDataSourceRegistry().removeFolder(((DBNLocalFolder) node).getFolder(), false); WebEventUtils.addNavigatorNodeUpdatedEvent( session.getProjectById(projectId), - session.getSessionId(), + session.getUserContext().getSmSessionId(), nodePath, WSConstants.EventAction.DELETE ); @@ -561,7 +561,7 @@ public class WebServiceNavigator implements DBWServiceNavigator { ((DBNDataSource) node).getDataSourceContainer()); WebEventUtils.addDataSourceUpdatedEvent( node.getOwnerProject(), - session.getSessionId(), + session.getUserContext().getSmSessionId(), ((DBNDataSource) node).getDataSourceContainer().getId(), WSConstants.EventAction.UPDATE ); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/WebSessionManager.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/WebSessionManager.java index 41f554a9bf..4aed6e13eb 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/WebSessionManager.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/WebSessionManager.java @@ -17,6 +17,7 @@ package io.cloudbeaver.service.session; import io.cloudbeaver.DBWebException; +import io.cloudbeaver.auth.SMTokenCredentialProvider; import io.cloudbeaver.model.session.BaseWebSession; import io.cloudbeaver.model.session.WebHeadlessSession; import io.cloudbeaver.model.session.WebSession;