diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java index 9ca9c706add..0df3a56cf84 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java @@ -85,6 +85,7 @@ public class WebSession extends BaseWebSession private static final AtomicInteger TASK_ID = new AtomicInteger(); public static String RUNTIME_PARAM_AUTH_INFOS = "auth-infos"; + public static String RUNTIME_PARAM_CLIENT_ORIGIN = "client-origin"; private final AtomicInteger taskCount = new AtomicInteger(); private final String lastRemoteAddr; @@ -92,6 +93,7 @@ public class WebSession extends BaseWebSession private String locale; private boolean cacheExpired; + private String clientOrigin; protected WebSessionGlobalProjectImpl globalProject; private final List sessionMessages = new ArrayList<>(); @@ -278,6 +280,10 @@ public DBPEventListener getDataSourceConnectListener() { return connectListener; } + public void updateClientOrigin(@NotNull String originFromRequest) { + this.clientOrigin = originFromRequest; + } + private void initNavigatorModel() { // Cleanup current data @@ -845,6 +851,7 @@ public boolean provideAuthParameters( contextCredentialsProvider.provideAuthParameters(monitor, dataSourceContainer, configuration); } configuration.setRuntimeAttribute(RUNTIME_PARAM_AUTH_INFOS, getAllAuthInfo()); + configuration.setRuntimeAttribute(RUNTIME_PARAM_CLIENT_ORIGIN, this.clientOrigin); WebSessionProjectImpl project = getProjectById(dataSourceContainer.getProject().getId()); if (project != null) { 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 d06558c6b56..e23e4048d80 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 @@ -26,6 +26,7 @@ import io.cloudbeaver.server.WebAppSessionManager; import io.cloudbeaver.server.events.WSWebUtils; import io.cloudbeaver.service.DBWSessionHandler; +import io.cloudbeaver.utils.ServletAppUtils; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; @@ -165,6 +166,8 @@ public WebSession getWebSession( validateSessionIp(request, webSession); + webSession.updateClientOrigin(ServletAppUtils.getOriginFromRequest(request)); + return webSession; } diff --git a/server/bundles/io.cloudbeaver.server/schema/service.events.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.events.graphqls index e96306d42bf..333ca2bdeaf 100644 --- a/server/bundles/io.cloudbeaver.server/schema/service.events.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/service.events.graphqls @@ -74,6 +74,9 @@ enum CBServerEventId { cb_session_task_confirmation_request @since(version: "25.2.2") cb_session_task_query_confirmation_request @since(version: "25.2.2") cb_session_task_query_params_confirmation_request @since(version: "25.2.5") + + "Open URL request in client" + cb_open_url @since(version: "25.3.1") } "Events sent by client" @@ -108,6 +111,7 @@ enum CBEventTopic { cb_workspace_configuration @since(version: "25.1.1") cb_ai @since(version: "25.1.1") cb_notification @since(version: "25.2.1") + cb_session_action @since(version: "25.3.1") } "Base server event interface" @@ -301,6 +305,13 @@ type WSServerNotificationEvent implements CBServerEvent @since(version: "25.2.1" notificationType: WSServerNotificationEventType! } +"Event for opening URL in client application" +type WSOpenUrlEvent implements CBServerEvent @since(version: "25.3.1") { + id: CBServerEventId! + topicId: CBEventTopic! + url: String! +} + type WSSessionTaskConfirmationRequestEvent implements CBServerEvent @since(version: "25.2.2") { id: CBServerEventId! topicId: CBEventTopic!