diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionInfo.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionInfo.java index c41c22e7fb..d590d9c24f 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionInfo.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionInfo.java @@ -22,7 +22,7 @@ import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.service.security.SMUtils; import io.cloudbeaver.service.sql.WebDataFormat; import io.cloudbeaver.utils.CBModelConstants; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import io.cloudbeaver.utils.WebCommonUtils; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; @@ -465,7 +465,8 @@ public class WebConnectionInfo { if (isCanEdit()) { return true; } - BaseWebAppConfiguration appConfig = (BaseWebAppConfiguration) WebAppUtils.getWebApplication().getAppConfiguration(); + BaseWebAppConfiguration appConfig = (BaseWebAppConfiguration) ServletAppUtils.getServletApplication() + .getAppConfiguration(); return appConfig.isShowReadOnlyConnectionInfo(); } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseServerConfigurationController.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseServerConfigurationController.java index 781f904e81..f6b37cb3d6 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseServerConfigurationController.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseServerConfigurationController.java @@ -32,8 +32,8 @@ import java.nio.file.Path; /** * Abstract class that contains methods for loading configuration with gson. */ -public abstract class BaseServerConfigurationController - implements WebServerConfigurationController { +public abstract class BaseServerConfigurationController + implements ServletServerConfigurationController { private static final Log log = Log.getLog(BaseServerConfigurationController.class); @NotNull private final Path homeDirectory; diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebApplication.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseServletApplication.java similarity index 96% rename from server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebApplication.java rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseServletApplication.java index 87f9b85409..0c767a8bff 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebApplication.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseServletApplication.java @@ -45,16 +45,16 @@ import java.util.List; import java.util.Map; /** - * Web application + * Servlet application */ -public abstract class BaseWebApplication extends BaseApplicationImpl implements WebApplication { +public abstract class BaseServletApplication extends BaseApplicationImpl implements ServletApplication { public static final String DEFAULT_CONFIG_FILE_PATH = "/etc/cloudbeaver.conf"; public static final String CUSTOM_CONFIG_FOLDER = "custom"; public static final String CLI_PARAM_WEB_CONFIG = "-web-config"; public static final String LOGBACK_FILE_NAME = "logback.xml"; - private static final Log log = Log.getLog(BaseWebApplication.class); + private static final Log log = Log.getLog(BaseServletApplication.class); private String instanceId; @@ -252,7 +252,7 @@ public abstract class BaseWebApplication extends BaseApplicationImpl implements return null; } - public abstract WebServerConfigurationController getServerConfigurationController(); + public abstract ServletServerConfigurationController getServerConfigurationController(); @Override public boolean isEnvironmentVariablesAccessible() { diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebAppConfiguration.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebAppConfiguration.java index 4c3a1714e1..3995bdfd1a 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebAppConfiguration.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebAppConfiguration.java @@ -25,7 +25,7 @@ import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; -public abstract class BaseWebAppConfiguration implements WebAppConfiguration { +public abstract class BaseWebAppConfiguration implements ServletAppConfiguration { public static final String DEFAULT_APP_ANONYMOUS_TEAM_NAME = "user"; protected final Map plugins; diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletAppConfiguration.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletAppConfiguration.java new file mode 100644 index 0000000000..5f55eb5b47 --- /dev/null +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletAppConfiguration.java @@ -0,0 +1,55 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2024 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.model.app; + +import org.jkiss.code.NotNull; +import org.jkiss.code.Nullable; + +import java.util.Map; + +/** + * Application configuration + */ +public interface ServletAppConfiguration { + String getAnonymousUserTeam(); + + boolean isAnonymousAccessEnabled(); + + @Nullable + T getResourceQuota(String quotaId); + + String getDefaultUserTeam(); + + T getPluginOption(@NotNull String pluginId, @NotNull String option); + + Map getPluginConfig(@NotNull String pluginId, boolean create); + + boolean isResourceManagerEnabled(); + + boolean isFeaturesEnabled(String[] requiredFeatures); + + boolean isFeatureEnabled(String id); + + @NotNull + default String[] getEnabledFeatures() { + return new String[0]; + } + + default boolean isSupportsCustomConnections() { + return true; + } +} diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebApplication.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletApplication.java similarity index 91% rename from server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebApplication.java rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletApplication.java index ae1ec9333a..8fd3bae376 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebApplication.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletApplication.java @@ -35,16 +35,16 @@ import java.util.Map; /** * Base interface for web application */ -public interface WebApplication extends DBPApplication { +public interface ServletApplication extends DBPApplication { boolean isConfigurationMode(); - default boolean isInitializationMode() { - return false; - } + default boolean isInitializationMode() { + return false; + } - WebAppConfiguration getAppConfiguration(); + ServletAppConfiguration getAppConfiguration(); - WebServerConfiguration getServerConfiguration(); + ServletServerConfiguration getServerConfiguration(); Path getDataDirectory(boolean create); diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebAuthApplication.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletAuthApplication.java similarity index 88% rename from server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebAuthApplication.java rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletAuthApplication.java index 4817849c8d..699d604670 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebAuthApplication.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletAuthApplication.java @@ -20,10 +20,8 @@ package io.cloudbeaver.model.app; import io.cloudbeaver.auth.CBAuthConstants; import org.jkiss.dbeaver.DBException; -import java.util.List; - -public interface WebAuthApplication extends WebApplication { - WebAuthConfiguration getAuthConfiguration(); +public interface ServletAuthApplication extends ServletApplication { + ServletAuthConfiguration getAuthConfiguration(); String getAuthServiceURL(); diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebAuthConfiguration.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletAuthConfiguration.java similarity index 96% rename from server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebAuthConfiguration.java rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletAuthConfiguration.java index 367d53377d..749cb51353 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebAuthConfiguration.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletAuthConfiguration.java @@ -25,7 +25,7 @@ import java.util.Set; /** * Application authentication configuration */ -public interface WebAuthConfiguration { +public interface ServletAuthConfiguration { String getDefaultAuthProvider(); diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebServerConfiguration.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletServerConfiguration.java similarity index 96% rename from server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebServerConfiguration.java rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletServerConfiguration.java index 82cbfeb05a..43a6e3537f 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebServerConfiguration.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletServerConfiguration.java @@ -25,7 +25,7 @@ import java.util.Map; * Web server configuration. * Contains only server configuration properties. */ -public interface WebServerConfiguration { +public interface ServletServerConfiguration { boolean isDevelMode(); default String getRootURI() { @@ -39,5 +39,4 @@ public interface WebServerConfiguration { default Map getProductSettings() { return Map.of(); } - } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebServerConfigurationController.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletServerConfigurationController.java similarity index 93% rename from server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebServerConfigurationController.java rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletServerConfigurationController.java index f6823f6dfb..3c2afc36de 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebServerConfigurationController.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/ServletServerConfigurationController.java @@ -27,7 +27,7 @@ import java.util.Map; * Server configuration controller. * Works with app server configuration (loads, updates) */ -public interface WebServerConfigurationController { +public interface ServletServerConfigurationController { /** * Loads server configuration. diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebAppConfiguration.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebAppConfiguration.java index c377b924b9..fefe5225f6 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebAppConfiguration.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebAppConfiguration.java @@ -17,39 +17,38 @@ package io.cloudbeaver.model.app; import org.jkiss.code.NotNull; -import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings; +import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings; import java.util.Map; /** * Application configuration */ -public interface WebAppConfiguration { - String getAnonymousUserTeam(); +public interface WebAppConfiguration extends ServletAppConfiguration { + DataSourceNavigatorSettings.Preset PRESET_WEB = new DataSourceNavigatorSettings.Preset("web", + "Web", + "Default view"); - boolean isAnonymousAccessEnabled(); + DBNBrowseSettings getDefaultNavigatorSettings(); - @Nullable - T getResourceQuota(String quotaId); + boolean isPublicCredentialsSaveEnabled(); - String getDefaultUserTeam(); + boolean isAdminCredentialsSaveEnabled(); - T getPluginOption(@NotNull String pluginId, @NotNull String option); - - Map getPluginConfig(@NotNull String pluginId, boolean create); - - boolean isResourceManagerEnabled(); - - boolean isFeaturesEnabled(String[] requiredFeatures); - - boolean isFeatureEnabled(String id); - - @NotNull - default String[] getEnabledFeatures() { + default String[] getDisabledBetaFeatures() { return new String[0]; } - default boolean isSupportsCustomConnections() { - return true; + default String[] getEnabledAuthProviders() { + return new String[0]; } + + @NotNull + String[] getEnabledDrivers(); + + @NotNull + String[] getDisabledDrivers(); + + Map getResourceQuotas(); } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/config/CBAppConfig.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/config/CBAppConfig.java index a2fc07f6be..4dfdb1000a 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/config/CBAppConfig.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/config/CBAppConfig.java @@ -19,7 +19,8 @@ package io.cloudbeaver.model.config; import com.google.gson.annotations.Expose; import io.cloudbeaver.auth.provider.local.LocalAuthProviderConstants; import io.cloudbeaver.model.app.BaseWebAppConfiguration; -import io.cloudbeaver.model.app.WebAuthConfiguration; +import io.cloudbeaver.model.app.WebAppConfiguration; +import io.cloudbeaver.model.app.ServletAuthConfiguration; import io.cloudbeaver.registry.WebAuthProviderDescriptor; import io.cloudbeaver.registry.WebAuthProviderRegistry; import org.jkiss.code.NotNull; @@ -36,9 +37,8 @@ import java.util.*; /** * Application configuration */ -public class CBAppConfig extends BaseWebAppConfiguration implements WebAuthConfiguration { +public class CBAppConfig extends BaseWebAppConfiguration implements ServletAuthConfiguration, WebAppConfiguration { private static final Log log = Log.getLog(CBAppConfig.class); - public static final DataSourceNavigatorSettings.Preset PRESET_WEB = new DataSourceNavigatorSettings.Preset("web", "Web", "Default view"); public static final DataSourceNavigatorSettings DEFAULT_VIEW_SETTINGS = PRESET_WEB.getSettings(); private final Set authConfigurations; @@ -47,8 +47,6 @@ public class CBAppConfig extends BaseWebAppConfiguration implements WebAuthConfi private final Map authConfiguration; private boolean supportsCustomConnections; - private boolean supportsConnectionBrowser; - private boolean supportsUserWorkspaces; private boolean enableReverseProxyAuth; private boolean forwardProxy; private boolean publicCredentialsSaveEnabled; @@ -80,8 +78,6 @@ public class CBAppConfig extends BaseWebAppConfiguration implements WebAuthConfi this.anonymousUserRole = DEFAULT_APP_ANONYMOUS_TEAM_NAME; this.anonymousUserTeam = DEFAULT_APP_ANONYMOUS_TEAM_NAME; this.supportsCustomConnections = true; - this.supportsConnectionBrowser = false; - this.supportsUserWorkspaces = false; this.publicCredentialsSaveEnabled = true; this.adminCredentialsSaveEnabled = true; this.redirectOnFederatedAuth = false; @@ -106,8 +102,6 @@ public class CBAppConfig extends BaseWebAppConfiguration implements WebAuthConfi this.anonymousUserRole = src.anonymousUserRole; this.anonymousUserTeam = src.anonymousUserTeam; this.supportsCustomConnections = src.supportsCustomConnections; - this.supportsConnectionBrowser = src.supportsConnectionBrowser; - this.supportsUserWorkspaces = src.supportsUserWorkspaces; this.publicCredentialsSaveEnabled = src.publicCredentialsSaveEnabled; this.adminCredentialsSaveEnabled = src.adminCredentialsSaveEnabled; this.redirectOnFederatedAuth = src.redirectOnFederatedAuth; @@ -148,14 +142,6 @@ public class CBAppConfig extends BaseWebAppConfiguration implements WebAuthConfi this.supportsCustomConnections = supportsCustomConnections; } - public boolean isSupportsConnectionBrowser() { - return supportsConnectionBrowser; - } - - public boolean isSupportsUserWorkspaces() { - return supportsUserWorkspaces; - } - public boolean isPublicCredentialsSaveEnabled() { return publicCredentialsSaveEnabled; } @@ -176,6 +162,7 @@ public class CBAppConfig extends BaseWebAppConfiguration implements WebAuthConfi return redirectOnFederatedAuth; } + @NotNull public String[] getEnabledDrivers() { return enabledDrivers; } @@ -184,6 +171,7 @@ public class CBAppConfig extends BaseWebAppConfiguration implements WebAuthConfi this.enabledDrivers = enabledDrivers; } + @NotNull public String[] getDisabledDrivers() { return disabledDrivers; } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMControllerInvocationHandler.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMControllerInvocationHandler.java deleted file mode 100644 index b867aeba6d..0000000000 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMControllerInvocationHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2024 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.model.rm; - -import io.cloudbeaver.model.app.WebApplication; -import org.jkiss.dbeaver.DBException; -import org.jkiss.dbeaver.model.rm.RMController; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -public class RMControllerInvocationHandler implements InvocationHandler { - private final WebApplication webApplication; - private final RMController rmController; - - public RMControllerInvocationHandler(RMController rmController, WebApplication webApplication) { - this.webApplication = webApplication; - this.rmController = rmController; - } - - private void checkIsRmEnabled() throws DBException { - if (!webApplication.getAppConfiguration().isResourceManagerEnabled()) { - throw new DBException("Resource Manager disabled"); - } - } - - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - try { - checkIsRmEnabled(); - return method.invoke(rmController, args); - } catch (InvocationTargetException e) { - throw e.getCause(); - } - } -} 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 44dc11d08b..173d45d5c9 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 @@ -18,11 +18,11 @@ package io.cloudbeaver.model.rm.local; import io.cloudbeaver.BaseWebProjectImpl; import io.cloudbeaver.DBWConstants; -import io.cloudbeaver.model.app.WebApplication; +import io.cloudbeaver.model.app.ServletApplication; import io.cloudbeaver.model.rm.lock.RMFileLockController; import io.cloudbeaver.service.security.SMUtils; import io.cloudbeaver.service.sql.WebSQLConstants; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import io.cloudbeaver.utils.file.UniversalFileVisitor; import org.eclipse.core.runtime.IPath; import org.jkiss.code.NotNull; @@ -84,7 +84,7 @@ public class LocalResourceController extends BaseLocalResourceController { Path sharedProjectsPath, Supplier smControllerSupplier ) throws DBException { - super(workspace, new RMFileLockController(WebAppUtils.getWebApplication())); + super(workspace, new RMFileLockController(ServletAppUtils.getServletApplication())); this.credentialsProvider = credentialsProvider; this.rootPath = rootPath; this.userProjectsPath = userProjectsPath; @@ -145,7 +145,7 @@ public class LocalResourceController extends BaseLocalResourceController { } // Checking if private projects are enabled in the configuration and if the user has permission to them - var webApp = WebAppUtils.getWebApplication(); + var webApp = ServletAppUtils.getServletApplication(); var userHasPrivateProjectPermission = userHasAccessToPrivateProject(webApp, activeUserCreds); if (webApp.getAppConfiguration().isSupportsCustomConnections() && userHasPrivateProjectPermission) { var userProjectPermission = getProjectPermissions(null, RMProjectType.USER); @@ -154,7 +154,7 @@ public class LocalResourceController extends BaseLocalResourceController { projects.add(0, userProject); } } - if (WebAppUtils.getWebApplication().isMultiNode()) { + if (ServletAppUtils.getServletApplication().isMultiNode()) { for (RMProject rmProject : projects) { handleProjectOpened(rmProject.getId()); } @@ -200,7 +200,7 @@ public class LocalResourceController extends BaseLocalResourceController { } return getRmProjectPermissions(projectId, activeUserCreds); case USER: - var webApp = WebAppUtils.getWebApplication(); + var webApp = ServletAppUtils.getServletApplication(); if (userHasAccessToPrivateProject(webApp, activeUserCreds)) { return Set.of(RMProjectPermission.RESOURCE_EDIT, RMProjectPermission.DATA_SOURCES_EDIT); } @@ -209,7 +209,7 @@ public class LocalResourceController extends BaseLocalResourceController { } } - private boolean userHasAccessToPrivateProject(WebApplication webApp, @Nullable SMCredentials activeUserCreds) { + private boolean userHasAccessToPrivateProject(ServletApplication webApp, @Nullable SMCredentials activeUserCreds) { return !webApp.isMultiNode() || (activeUserCreds != null && activeUserCreds.hasPermission(DBWConstants.PERMISSION_PRIVATE_PROJECT_ACCESS)); } @@ -277,7 +277,7 @@ public class LocalResourceController extends BaseLocalResourceController { try { log.debug("Creating project '" + project.getId() + "'"); Files.createDirectories(projectPath); - if (WebAppUtils.getWebApplication().isMultiNode()) { + if (ServletAppUtils.getServletApplication().isMultiNode()) { createResourceTypeFolders(projectPath); } fireRmProjectAddEvent(project); @@ -581,7 +581,7 @@ public class LocalResourceController extends BaseLocalResourceController { ) throws DBException { try (var ignoredLock = lockController.lockProject(projectId, "setResourceContents")) { validateResourcePath(resourcePath); - Number fileSizeLimit = WebAppUtils.getWebApplication() + Number fileSizeLimit = ServletAppUtils.getServletApplication() .getAppConfiguration() .getResourceQuota(WebSQLConstants.QUOTA_PROP_RM_FILE_SIZE_LIMIT); if (fileSizeLimit != null && data.length > fileSizeLimit.longValue()) { @@ -775,7 +775,7 @@ public class LocalResourceController extends BaseLocalResourceController { fileHandler.projectOpened(projectId); } catch (Exception e) { if (credentialsProvider.getActiveUserCredentials() != null) { - WebAppUtils.getWebApplication().getEventController().addEvent( + ServletAppUtils.getServletApplication().getEventController().addEvent( new WSSessionLogUpdatedEvent( WSEventType.SESSION_LOG_UPDATED, credentialsProvider.getActiveUserCredentials().getSmSessionId(), @@ -794,7 +794,7 @@ public class LocalResourceController extends BaseLocalResourceController { fileHandler.beforeFileRead(projectId, file); } catch (Exception e) { if (credentialsProvider.getActiveUserCredentials() != null) { - WebAppUtils.getWebApplication().getEventController().addEvent( + ServletAppUtils.getServletApplication().getEventController().addEvent( new WSSessionLogUpdatedEvent( WSEventType.SESSION_LOG_UPDATED, credentialsProvider.getActiveUserCredentials().getSmSessionId(), diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/lock/RMFileLockController.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/lock/RMFileLockController.java index b87526cd92..c160071d73 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/lock/RMFileLockController.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/lock/RMFileLockController.java @@ -17,7 +17,7 @@ package io.cloudbeaver.model.rm.lock; import com.google.gson.Gson; -import io.cloudbeaver.model.app.WebApplication; +import io.cloudbeaver.model.app.ServletApplication; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; @@ -50,12 +50,12 @@ public class RMFileLockController { private final int maxLockTime; - public RMFileLockController(WebApplication application) throws DBException { + public RMFileLockController(ServletApplication application) throws DBException { this(application, DEFAULT_MAX_LOCK_TIME); } // for tests - public RMFileLockController(WebApplication application, int maxLockTime) throws DBException { + public RMFileLockController(ServletApplication application, int maxLockTime) throws DBException { this.lockFolderPath = application.getWorkspaceDirectory() .resolve(DBPWorkspace.METADATA_FOLDER) .resolve(LOCK_META_FOLDER); diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/BaseWebSession.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/BaseWebSession.java index 43b69e137b..d763f4b12d 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/BaseWebSession.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/BaseWebSession.java @@ -17,8 +17,8 @@ package io.cloudbeaver.model.session; import io.cloudbeaver.model.WebServerMessage; -import io.cloudbeaver.model.app.WebApplication; -import io.cloudbeaver.model.app.WebAuthApplication; +import io.cloudbeaver.model.app.ServletApplication; +import io.cloudbeaver.model.app.ServletAuthApplication; import io.cloudbeaver.websocket.CBWebSessionEventHandler; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; @@ -51,14 +51,14 @@ public abstract class BaseWebSession extends AbstractSessionPersistent { @NotNull protected final WebUserContext userContext; @NotNull - protected final WebApplication application; + protected final ServletApplication application; protected volatile long lastAccessTime; private final List sessionEventHandlers = new CopyOnWriteArrayList<>(); private WebSessionEventsFilter eventsFilter = new WebSessionEventsFilter(); private final WebSessionWorkspace workspace; - public BaseWebSession(@NotNull String id, @NotNull WebApplication application) throws DBException { + public BaseWebSession(@NotNull String id, @NotNull ServletApplication application) throws DBException { this.id = id; this.application = application; this.createTime = System.currentTimeMillis(); @@ -153,7 +153,7 @@ public abstract class BaseWebSession extends AbstractSessionPersistent { } @NotNull - public WebApplication getApplication() { + public ServletApplication getApplication() { return application; } @@ -238,7 +238,7 @@ public abstract class BaseWebSession extends AbstractSessionPersistent { @Property public long getRemainingTime() { - if (application instanceof WebAuthApplication authApplication) { + if (application instanceof ServletAuthApplication authApplication) { return authApplication.getMaxSessionIdleTime() + lastAccessTime - System.currentTimeMillis(); } return Integer.MAX_VALUE; diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebHeadlessSession.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebHeadlessSession.java index 397ddfb688..9bd8cb4261 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebHeadlessSession.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebHeadlessSession.java @@ -17,7 +17,7 @@ package io.cloudbeaver.model.session; import io.cloudbeaver.model.WebServerMessage; -import io.cloudbeaver.model.app.WebAuthApplication; +import io.cloudbeaver.model.app.ServletAuthApplication; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; @@ -29,7 +29,7 @@ import org.jkiss.dbeaver.model.auth.SMSessionPrincipal; public class WebHeadlessSession extends BaseWebSession { public WebHeadlessSession( @NotNull String id, - @NotNull WebAuthApplication application + @NotNull ServletAuthApplication application ) throws DBException { super(id, application); } 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 d4ee22fbc7..c5d8318213 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 @@ -24,8 +24,8 @@ import io.cloudbeaver.*; import io.cloudbeaver.model.WebAsyncTaskInfo; import io.cloudbeaver.model.WebConnectionInfo; import io.cloudbeaver.model.WebServerMessage; -import io.cloudbeaver.model.app.WebApplication; -import io.cloudbeaver.model.app.WebAuthApplication; +import io.cloudbeaver.model.app.ServletApplication; +import io.cloudbeaver.model.app.ServletAuthApplication; import io.cloudbeaver.model.user.WebUser; import io.cloudbeaver.service.DBWSessionHandler; import io.cloudbeaver.service.sql.WebSQLConstants; @@ -114,7 +114,7 @@ public class WebSession extends BaseWebSession public WebSession( @NotNull WebHttpRequestInfo requestInfo, - @NotNull WebAuthApplication application, + @NotNull ServletAuthApplication application, @NotNull Map sessionHandlers ) throws DBException { this(requestInfo.getId(), @@ -128,7 +128,7 @@ public class WebSession extends BaseWebSession protected WebSession( @NotNull String id, @Nullable String locale, - @NotNull WebApplication application, + @NotNull ServletApplication application, @NotNull Map sessionHandlers ) throws DBException { super(id, application); diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSessionAuthProcessor.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSessionAuthProcessor.java index f695ab401a..c89ad41e3b 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSessionAuthProcessor.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSessionAuthProcessor.java @@ -20,11 +20,11 @@ package io.cloudbeaver.model.session; import io.cloudbeaver.DBWUserIdentity; import io.cloudbeaver.DBWebException; import io.cloudbeaver.auth.SMAuthProviderExternal; -import io.cloudbeaver.model.app.WebAuthConfiguration; +import io.cloudbeaver.model.app.ServletAuthConfiguration; import io.cloudbeaver.model.user.WebUser; import io.cloudbeaver.registry.WebAuthProviderDescriptor; import io.cloudbeaver.registry.WebAuthProviderRegistry; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; @@ -82,7 +82,7 @@ public class WebSessionAuthProcessor { @SuppressWarnings("unchecked") private List finishWebSessionAuthorization(SMAuthInfo authInfo) throws DBException { - boolean configMode = WebAppUtils.getWebApplication().isConfigurationMode(); + boolean configMode = ServletAppUtils.getServletApplication().isConfigurationMode(); boolean alreadyLoggedIn = webSession.getUser() != null; boolean resetUserStateOnError = !alreadyLoggedIn; @@ -127,7 +127,7 @@ public class WebSessionAuthProcessor { DBWUserIdentity userIdentity = null; var providerConfigId = authConfiguration.getAuthProviderConfigurationId(); - var providerConfig = WebAppUtils.getWebAuthApplication() + var providerConfig = ServletAppUtils.getAuthApplication() .getAuthConfiguration() .getAuthProviderConfiguration(providerConfigId); if (authProviderExternal != null) { @@ -194,7 +194,8 @@ public class WebSessionAuthProcessor { } private boolean isProviderEnabled(@NotNull String providerId) { - WebAuthConfiguration appConfiguration = (WebAuthConfiguration) WebAppUtils.getWebApplication().getAppConfiguration(); + ServletAuthConfiguration appConfiguration = (ServletAuthConfiguration) ServletAppUtils.getServletApplication() + .getAppConfiguration(); return appConfiguration.isAuthProviderEnabled(providerId); } } 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 f94462297b..f80e0b52d2 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 @@ -17,7 +17,7 @@ package io.cloudbeaver.model.session; -import io.cloudbeaver.model.app.WebApplication; +import io.cloudbeaver.model.app.ServletApplication; import io.cloudbeaver.model.user.WebUser; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; @@ -50,7 +50,7 @@ import java.util.stream.Collectors; public class WebUserContext implements SMCredentialsProvider { private static final Log log = Log.getLog(WebUserContext.class); - private final WebApplication application; + private final ServletApplication application; private final DBPWorkspace workspace; private WebUser user; @@ -67,7 +67,7 @@ public class WebUserContext implements SMCredentialsProvider { private Set accessibleProjectIds = new HashSet<>(); private final WebSessionPreferenceStore preferenceStore; - public WebUserContext(WebApplication application, DBPWorkspace workspace) throws DBException { + public WebUserContext(ServletApplication application, DBPWorkspace workspace) throws DBException { this.application = application; this.workspace = workspace; this.securityController = application.createSecurityController(this); diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebAuthProviderConfiguration.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebAuthProviderConfiguration.java index 322c1be6bd..d99352ea22 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebAuthProviderConfiguration.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebAuthProviderConfiguration.java @@ -19,7 +19,7 @@ package io.cloudbeaver.registry; import io.cloudbeaver.auth.CBAuthConstants; import io.cloudbeaver.auth.SMAuthProviderFederated; import io.cloudbeaver.auth.SMSignOutLinkProvider; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.auth.SMAuthProvider; @@ -80,7 +80,7 @@ public class WebAuthProviderConfiguration { } private String buildRedirectUrl(String baseUrl) { - return baseUrl + "?" + CBAuthConstants.CB_REDIRECT_URL_REQUEST_PARAM + "=" + WebAppUtils.getFullServerUrl(); + return baseUrl + "?" + CBAuthConstants.CB_REDIRECT_URL_REQUEST_PARAM + "=" + ServletAppUtils.getFullServerUrl(); } @Property diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebFeatureDescriptor.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebFeatureDescriptor.java index 4d984c07d7..5526cd1cba 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebFeatureDescriptor.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebFeatureDescriptor.java @@ -18,7 +18,7 @@ package io.cloudbeaver.registry; import io.cloudbeaver.DBWFeatureSet; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.eclipse.core.runtime.IConfigurationElement; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.model.DBPImage; @@ -66,7 +66,7 @@ public class WebFeatureDescriptor extends AbstractContextDescriptor implements D @Override public boolean isEnabled() { - return WebAppUtils.getWebApplication().getAppConfiguration().isFeatureEnabled(this.id); + return ServletAppUtils.getServletApplication().getAppConfiguration().isFeatureEnabled(this.id); } } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebServerFeatureDescriptor.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebServerFeatureDescriptor.java index 6e04d75767..49cf2e0241 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebServerFeatureDescriptor.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebServerFeatureDescriptor.java @@ -18,7 +18,6 @@ package io.cloudbeaver.registry; import io.cloudbeaver.DBWFeatureSet; -import io.cloudbeaver.utils.WebAppUtils; import org.eclipse.core.runtime.IConfigurationElement; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.model.DBPImage; diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/CBConstants.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/CBConstants.java index 0103994c19..5fb391293d 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/CBConstants.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/CBConstants.java @@ -20,6 +20,8 @@ package io.cloudbeaver.server; * Various constants */ public class CBConstants { + public static final int STATIC_CACHE_SECONDS = 60 * 60 * 24 * 3; + public static final String RUNTIME_DATA_DIR_NAME = ".data"; public static final String RUNTIME_APP_CONFIG_FILE_NAME = ".cloudbeaver.runtime.conf"; public static final String RUNTIME_PRODUCT_CONFIG_FILE_NAME = ".product.runtime.conf"; diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/WebGlobalWorkspace.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/ServerGlobalWorkspace.java similarity index 87% rename from server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/WebGlobalWorkspace.java rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/ServerGlobalWorkspace.java index 91ac528f11..4f99ca0a0e 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/WebGlobalWorkspace.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/ServerGlobalWorkspace.java @@ -17,8 +17,7 @@ package io.cloudbeaver.server; import io.cloudbeaver.WebProjectImpl; -import io.cloudbeaver.model.app.WebApplication; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.model.app.ServletApplication; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.Log; @@ -39,18 +38,18 @@ import java.util.Map; /** * Web global workspace. */ -public class WebGlobalWorkspace extends BaseWorkspaceImpl { +public class ServerGlobalWorkspace extends BaseWorkspaceImpl { - private static final Log log = Log.getLog(WebGlobalWorkspace.class); + private static final Log log = Log.getLog(ServerGlobalWorkspace.class); protected final Map projects = new LinkedHashMap<>(); private WebGlobalProject globalProject; - private final WebApplication application; + private final ServletApplication application; - public WebGlobalWorkspace( + public ServerGlobalWorkspace( @NotNull DBPPlatform platform, - @NotNull WebApplication application + @NotNull ServletApplication application ) { super(platform, application.getWorkspaceDirectory()); this.application = application; @@ -61,7 +60,7 @@ public class WebGlobalWorkspace extends BaseWorkspaceImpl { initializeWorkspaceSession(); // Load global project - String defaultProjectName = WebAppUtils.getWebApplication().getDefaultProjectName(); + String defaultProjectName = application.getDefaultProjectName(); if (CommonUtils.isNotEmpty(defaultProjectName)) { Path globalProjectPath = getAbsolutePath().resolve(defaultProjectName); if (!Files.exists(globalProjectPath)) { diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/WebServerPreferenceStore.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/WebServerPreferenceStore.java index 681262bf36..f1e3bf5c66 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/WebServerPreferenceStore.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/WebServerPreferenceStore.java @@ -16,7 +16,7 @@ */ package io.cloudbeaver.server; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.model.impl.preferences.AbstractPreferenceStore; import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; @@ -185,7 +185,7 @@ public class WebServerPreferenceStore extends AbstractPreferenceStore { } private Map productConf() { - var app = WebAppUtils.getWebApplication(); + var app = ServletAppUtils.getServletApplication(); return app.getServerConfiguration().getProductSettings(); } } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/DBWServiceBindingServlet.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/DBWServiceBindingServlet.java index 5b7e52cc95..c582c19904 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/DBWServiceBindingServlet.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/DBWServiceBindingServlet.java @@ -16,14 +16,14 @@ */ package io.cloudbeaver.service; -import io.cloudbeaver.model.app.WebApplication; +import io.cloudbeaver.model.app.ServletApplication; import org.jkiss.dbeaver.DBException; /** * Servlet service */ -public interface DBWServiceBindingServlet extends DBWServiceBinding { - default boolean isApplicable(WebApplication application) { +public interface DBWServiceBindingServlet extends DBWServiceBinding { + default boolean isApplicable(ServletApplication application) { return true; } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/DBWServiceServerConfigurator.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/DBWServiceServerConfigurator.java index 877f7a8e33..dd28cde931 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/DBWServiceServerConfigurator.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/DBWServiceServerConfigurator.java @@ -16,9 +16,9 @@ */ package io.cloudbeaver.service; -import io.cloudbeaver.model.app.WebAppConfiguration; -import io.cloudbeaver.model.app.WebApplication; -import io.cloudbeaver.model.app.WebServerConfiguration; +import io.cloudbeaver.model.app.ServletAppConfiguration; +import io.cloudbeaver.model.app.ServletApplication; +import io.cloudbeaver.model.app.ServletServerConfiguration; import io.cloudbeaver.model.session.WebSession; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; @@ -30,16 +30,16 @@ import org.jkiss.dbeaver.DBException; public interface DBWServiceServerConfigurator extends DBWServiceBinding { void configureServer( - @NotNull WebApplication application, + @NotNull ServletApplication application, @Nullable WebSession session, - @NotNull WebServerConfiguration serverConfiguration, - @NotNull WebAppConfiguration appConfig + @NotNull ServletServerConfiguration serverConfiguration, + @NotNull ServletAppConfiguration appConfig ) throws DBException; - default void migrateConfigurationIfNeeded(@NotNull WebApplication application) throws DBException { + default void migrateConfigurationIfNeeded(@NotNull ServletApplication application) throws DBException { } - void reloadConfiguration(@NotNull WebAppConfiguration appConfig) throws DBException; + void reloadConfiguration(@NotNull ServletAppConfiguration appConfig) throws DBException; } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebAppUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/ServletAppUtils.java similarity index 88% rename from server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebAppUtils.java rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/ServletAppUtils.java index fdc44975e3..45d42e6728 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebAppUtils.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/ServletAppUtils.java @@ -19,8 +19,8 @@ package io.cloudbeaver.utils; import io.cloudbeaver.DBWebException; import io.cloudbeaver.WebProjectImpl; import io.cloudbeaver.auth.NoAuthCredentialsProvider; -import io.cloudbeaver.model.app.WebApplication; -import io.cloudbeaver.model.app.WebAuthApplication; +import io.cloudbeaver.model.app.ServletApplication; +import io.cloudbeaver.model.app.ServletAuthApplication; import io.cloudbeaver.model.session.WebSession; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; @@ -41,8 +41,8 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; -public class WebAppUtils { - private static final Log log = Log.getLog(WebAppUtils.class); +public class ServletAppUtils { + private static final Log log = Log.getLog(ServletAppUtils.class); public static String getRelativePath(String path, String curDir) { return getRelativePath(path, Path.of(curDir)); @@ -55,19 +55,19 @@ public class WebAppUtils { return curDir.resolve(path).toAbsolutePath().toString(); } - public static WebApplication getWebApplication() { - return (WebApplication) DBWorkbench.getPlatform().getApplication(); + public static ServletApplication getServletApplication() { + return (ServletApplication) DBWorkbench.getPlatform().getApplication(); } - public static WebAuthApplication getWebAuthApplication() throws DBException { - WebApplication application = getWebApplication(); - if (!WebAuthApplication.class.isAssignableFrom(application.getClass())) { + public static ServletAuthApplication getAuthApplication() throws DBException { + ServletApplication application = getServletApplication(); + if (!ServletAuthApplication.class.isAssignableFrom(application.getClass())) { throw new DBException("The current application doesn't contain authorization configuration"); } - return (WebAuthApplication) application; + return (ServletAuthApplication) application; } - public static SMAuthenticationManager getAuthManager(WebApplication application) throws DBException { + public static SMAuthenticationManager getAuthManager(ServletApplication application) throws DBException { var smController = application.createSecurityController(new NoAuthCredentialsProvider()); if (!SMAuthenticationManager.class.isAssignableFrom(smController.getClass())) { throw new DBException("The current application cannot be used for authorization"); @@ -169,11 +169,11 @@ public class WebAppUtils { @NotNull public static StringBuilder getAuthApiPrefix(String serviceId) throws DBException { - return getAuthApiPrefix(getWebAuthApplication(), serviceId); + return getAuthApiPrefix(getAuthApplication(), serviceId); } @NotNull - public static StringBuilder getAuthApiPrefix(WebAuthApplication webAuthApplication, String serviceId) { + public static StringBuilder getAuthApiPrefix(ServletAuthApplication webAuthApplication, String serviceId) { String authUrl = removeSideSlashes(webAuthApplication.getAuthServiceURL()); StringBuilder apiPrefix = new StringBuilder(authUrl); apiPrefix.append("/").append(serviceId).append("/"); @@ -190,7 +190,7 @@ public class WebAppUtils { sessionCookie.setMaxAge((int) (maxSessionIdleTime / 1000)); } - String path = getWebApplication().getServerConfiguration().getRootURI(); + String path = getServletApplication().getServerConfiguration().getRootURI(); if (sameSite != null) { if (!request.isSecure()) { @@ -223,7 +223,7 @@ public class WebAppUtils { } public static String getGlobalProjectId() { - String globalConfigurationName = getWebApplication().getDefaultProjectName(); + String globalConfigurationName = getServletApplication().getDefaultProjectName(); return RMProjectType.GLOBAL.getPrefix() + "_" + globalConfigurationName; } @@ -273,9 +273,9 @@ public class WebAppUtils { @NotNull public static String getFullServerUrl() { - WebApplication application = WebAppUtils.getWebApplication(); + ServletApplication application = ServletAppUtils.getServletApplication(); return Stream.of(application.getServerURL(), application.getRootURI()) - .map(WebAppUtils::removeSideSlashes) + .map(ServletAppUtils::removeSideSlashes) .filter(CommonUtils::isNotEmpty) .collect(Collectors.joining("/")); } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebEventUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebEventUtils.java index d81846db27..2e51485347 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebEventUtils.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebEventUtils.java @@ -80,7 +80,7 @@ public class WebEventUtils { if (event == null) { return; } - WebAppUtils.getWebApplication().getEventController().addEvent(event); + ServletAppUtils.getServletApplication().getEventController().addEvent(event); } public static void addNavigatorNodeUpdatedEvent( @@ -122,7 +122,7 @@ public class WebEventUtils { if (event == null) { return; } - WebAppUtils.getWebApplication().getEventController().addEvent(event); + ServletAppUtils.getServletApplication().getEventController().addEvent(event); } public static void addRmResourceUpdatedEvent( @@ -179,7 +179,7 @@ public class WebEventUtils { if (event == null) { return; } - WebAppUtils.getWebApplication().getEventController().addEvent(event); + ServletAppUtils.getServletApplication().getEventController().addEvent(event); } } \ No newline at end of file diff --git a/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF index c737550521..63f76a4b6e 100644 --- a/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF @@ -8,5 +8,5 @@ Bundle-Release-Date: 20241223 Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . -Require-Bundle: io.cloudbeaver.server +Require-Bundle: io.cloudbeaver.server.ce Automatic-Module-Name: io.cloudbeaver.product.ce diff --git a/server/bundles/io.cloudbeaver.server.ce/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.server.ce/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..aa378a5709 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server.ce/META-INF/MANIFEST.MF @@ -0,0 +1,20 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Vendor: DBeaver Corp +Bundle-Name: Cloudbeaver CE Server +Bundle-SymbolicName: io.cloudbeaver.server.ce;singleton:=true +Bundle-Version: 24.3.1.qualifier +Bundle-Release-Date: 20241104 +Bundle-RequiredExecutionEnvironment: JavaSE-17 +Bundle-ActivationPolicy: lazy +Bundle-Activator: io.cloudbeaver.server.CBPlatformActivator +Bundle-ClassPath: . +Require-Bundle: io.cloudbeaver.server;visibility:=reexport +Export-Package: io.cloudbeaver, + io.cloudbeaver.model, + io.cloudbeaver.model.config, + io.cloudbeaver.server, + io.cloudbeaver.service, + io.cloudbeaver.service.session +Import-Package: org.slf4j +Automatic-Module-Name: io.cloudbeaver.server.ce diff --git a/server/bundles/io.cloudbeaver.server.ce/build.properties b/server/bundles/io.cloudbeaver.server.ce/build.properties new file mode 100644 index 0000000000..742a80a09d --- /dev/null +++ b/server/bundles/io.cloudbeaver.server.ce/build.properties @@ -0,0 +1,6 @@ +source..=src/ +output..=target/classes/ +bin.includes=.,\ + META-INF/,\ + schema/,\ + plugin.xml diff --git a/server/bundles/io.cloudbeaver.server.ce/plugin.xml b/server/bundles/io.cloudbeaver.server.ce/plugin.xml new file mode 100644 index 0000000000..4c3287e279 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server.ce/plugin.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/bundles/io.cloudbeaver.server.ce/pom.xml b/server/bundles/io.cloudbeaver.server.ce/pom.xml new file mode 100644 index 0000000000..b55ddedc65 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server.ce/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + io.cloudbeaver + bundles + 1.0.0-SNAPSHOT + ../ + + io.cloudbeaver.server.ce + 24.3.1-SNAPSHOT + eclipse-plugin + + diff --git a/server/bundles/io.cloudbeaver.server.ce/schema/service.core.graphqls b/server/bundles/io.cloudbeaver.server.ce/schema/service.core.graphqls new file mode 100644 index 0000000000..1ab312e7f0 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server.ce/schema/service.core.graphqls @@ -0,0 +1,16 @@ +extend type ServerConfig { + serverURL: String! + rootURI: String! + hostName: String! @deprecated # use container id instead + containerId: String! + defaultAuthRole: String + defaultUserTeam: String # [23.2.2] + + sessionExpireTime: Int! + localHostAddress: String + + redirectOnFederatedAuth: Boolean! + enabledAuthProviders: [ID!]! + passwordPolicyConfiguration: PasswordPolicyConfig! @since(version: "23.3.3") +} + diff --git a/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/model/CBWebServerConfig.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/model/CBWebServerConfig.java new file mode 100644 index 0000000000..5be2ad96cd --- /dev/null +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/model/CBWebServerConfig.java @@ -0,0 +1,89 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2024 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.model; + +import io.cloudbeaver.model.config.PasswordPolicyConfiguration; +import io.cloudbeaver.server.CBApplication; +import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.model.meta.Property; +import org.jkiss.utils.CommonUtils; + +public class CBWebServerConfig extends WebServerConfig { + private final CBApplication cbApp; + + public CBWebServerConfig(@NotNull CBApplication cbApp) { + super(cbApp); + this.cbApp = cbApp; + } + + @Property + public String getServerURL() { + return CommonUtils.notEmpty(cbApp.getServerConfiguration().getServerURL()); + } + + @Property + public String getRootURI() { + return CommonUtils.notEmpty(cbApp.getServerConfiguration().getRootURI()); + } + + @Deprecated + @Property + public String getHostName() { + return getContainerId(); + } + + @Property + public String getContainerId() { + return CommonUtils.notEmpty(cbApp.getContainerId()); + } + + @Property + public boolean isRedirectOnFederatedAuth() { + return cbApp.getAppConfiguration().isRedirectOnFederatedAuth(); + } + + @Property + public String getLocalHostAddress() { + return cbApp.getLocalHostAddress(); + } + + @Property + public long getSessionExpireTime() { + return cbApp.getServerConfiguration().getMaxSessionIdleTime(); + } + + @Property + public String[] getEnabledAuthProviders() { + return cbApp.getAppConfiguration().getEnabledAuthProviders(); + } + + @Property + public String getDefaultAuthRole() { + return cbApp.getDefaultAuthRole(); + } + + + @Property + public String getDefaultUserTeam() { + return cbApp.getAppConfiguration().getDefaultUserTeam(); + } + + @Property + public PasswordPolicyConfiguration getPasswordPolicyConfiguration() { + return cbApp.getSecurityManagerConfiguration().getPasswordPolicyConfiguration(); + } +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebDatasourceAccessCheckHandler.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/model/WebDatasourceAccessCheckHandler.java similarity index 89% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebDatasourceAccessCheckHandler.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/model/WebDatasourceAccessCheckHandler.java index ddd680fb03..a8400526e5 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebDatasourceAccessCheckHandler.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/model/WebDatasourceAccessCheckHandler.java @@ -20,14 +20,13 @@ package io.cloudbeaver.model; import io.cloudbeaver.model.config.CBAppConfig; import io.cloudbeaver.model.utils.ConfigurationUtils; import io.cloudbeaver.server.CBApplication; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.jkiss.dbeaver.model.connection.DBPDriver; -//TODO move to a separate CBApplication plugin public class WebDatasourceAccessCheckHandler extends BaseDatasourceAccessCheckHandler { @Override protected boolean isDriverDisabled(DBPDriver driver) { - if (!WebAppUtils.getWebApplication().isMultiuser()) { + if (!ServletAppUtils.getServletApplication().isMultiuser()) { return false; } CBAppConfig config = CBApplication.getInstance().getAppConfiguration(); diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/config/CBServerConfig.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/model/config/CBServerConfig.java similarity index 100% rename from server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/config/CBServerConfig.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/model/config/CBServerConfig.java diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBApplication.java similarity index 97% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBApplication.java index de0f13c5cc..ebe007cceb 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBApplication.java @@ -18,9 +18,11 @@ package io.cloudbeaver.server; import io.cloudbeaver.WebServiceUtils; import io.cloudbeaver.auth.NoAuthCredentialsProvider; -import io.cloudbeaver.model.app.BaseWebApplication; -import io.cloudbeaver.model.app.WebAuthApplication; -import io.cloudbeaver.model.app.WebAuthConfiguration; +import io.cloudbeaver.model.CBWebServerConfig; +import io.cloudbeaver.model.WebServerConfig; +import io.cloudbeaver.model.app.BaseServletApplication; +import io.cloudbeaver.model.app.ServletAuthApplication; +import io.cloudbeaver.model.app.ServletAuthConfiguration; import io.cloudbeaver.model.config.CBAppConfig; import io.cloudbeaver.model.config.CBServerConfig; import io.cloudbeaver.model.config.SMControllerConfiguration; @@ -29,7 +31,7 @@ import io.cloudbeaver.registry.WebServiceRegistry; import io.cloudbeaver.server.jetty.CBJettyServer; import io.cloudbeaver.service.DBWServiceInitializer; import io.cloudbeaver.service.DBWServiceServerConfigurator; -import io.cloudbeaver.service.session.WebSessionManager; +import io.cloudbeaver.service.session.CBSessionManager; import io.cloudbeaver.utils.WebDataSourceUtils; import org.eclipse.core.runtime.Platform; import org.eclipse.osgi.service.datalocation.Location; @@ -74,7 +76,7 @@ import java.util.concurrent.ConcurrentHashMap; * This class controls all aspects of the application's execution */ public abstract class CBApplication extends - BaseWebApplication implements WebAuthApplication, GQLApplicationAdapter { + BaseServletApplication implements ServletAuthApplication, WebApplication { private static final Log log = Log.getLog(CBApplication.class); @@ -105,7 +107,7 @@ public abstract class CBApplication extends protected final WSEventController eventController = new WSEventController(); - private WebSessionManager sessionManager; + private CBSessionManager sessionManager; private final Map initActions = new ConcurrentHashMap<>(); @@ -175,7 +177,7 @@ public abstract class CBApplication extends } @Override - public WebAuthConfiguration getAuthConfiguration() { + public ServletAuthConfiguration getAuthConfiguration() { return getAppConfiguration(); } @@ -660,15 +662,15 @@ public abstract class CBApplication extends return null; } - public WebSessionManager getSessionManager() { + public CBSessionManager getSessionManager() { if (sessionManager == null) { sessionManager = createSessionManager(); } return sessionManager; } - protected WebSessionManager createSessionManager() { - return new WebSessionManager(this); + protected CBSessionManager createSessionManager() { + return new CBSessionManager(this); } @NotNull @@ -709,7 +711,7 @@ public abstract class CBApplication extends @Override public Class getPlatformUIClass() { - return CBPlatformUI.class; + return ServletPlatformUI.class; } public void saveProductConfiguration( @@ -765,4 +767,9 @@ public abstract class CBApplication extends public Map getInitActions() { return Map.copyOf(initActions); } + + @Override + public WebServerConfig getWebServerConfig() { + return new CBWebServerConfig(this); + } } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplicationCE.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBApplicationCE.java similarity index 98% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplicationCE.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBApplicationCE.java index 1ee1b5c0f8..f69512b7c5 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplicationCE.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBApplicationCE.java @@ -17,6 +17,8 @@ package io.cloudbeaver.server; import io.cloudbeaver.auth.NoAuthCredentialsProvider; +import io.cloudbeaver.model.CBWebServerConfig; +import io.cloudbeaver.model.WebServerConfig; import io.cloudbeaver.model.config.CBServerConfig; import io.cloudbeaver.model.rm.local.LocalResourceController; import io.cloudbeaver.service.security.CBEmbeddedSecurityController; @@ -114,5 +116,4 @@ public class CBApplicationCE extends CBApplication { embeddedSecurityController.finishConfiguration(adminName, adminPassword, authInfoList); } } - } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatform.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBPlatform.java similarity index 86% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatform.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBPlatform.java index 0cc1833109..1fd68e3073 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatform.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBPlatform.java @@ -21,7 +21,7 @@ import io.cloudbeaver.auth.NoAuthCredentialsProvider; import io.cloudbeaver.server.jobs.SessionStateJob; import io.cloudbeaver.server.jobs.WebDataSourceMonitorJob; import io.cloudbeaver.server.jobs.WebSessionMonitorJob; -import io.cloudbeaver.service.session.WebSessionManager; +import io.cloudbeaver.service.session.CBSessionManager; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.jkiss.code.NotNull; @@ -47,17 +47,15 @@ import java.util.stream.Collectors; /** * CBPlatform */ -public class CBPlatform extends BaseGQLPlatform { +public class CBPlatform extends BaseWebPlatform { // The plug-in ID public static final String PLUGIN_ID = "io.cloudbeaver.server"; //$NON-NLS-1$ private static final Log log = Log.getLog(CBPlatform.class); - public static final String TEMP_FILE_FOLDER = "temp-sql-upload-files"; - public static final String TEMP_FILE_IMPORT_FOLDER = "temp-import-files"; @Nullable - private static GQLApplicationAdapter application = null; + private static CBApplication application = null; private WebServerPreferenceStore preferenceStore; protected final List applicableDrivers = new ArrayList<>(); @@ -69,7 +67,7 @@ public class CBPlatform extends BaseGQLPlatform { protected CBPlatform() { } - public static void setApplication(@NotNull GQLApplicationAdapter application) { + public static void setApplication(@NotNull CBApplication application) { CBPlatform.application = application; } @@ -86,15 +84,13 @@ public class CBPlatform extends BaseGQLPlatform { } protected void scheduleServerJobs() { - if (getSessionManager() instanceof WebSessionManager webSessionManager) { - new WebSessionMonitorJob(this, webSessionManager) - .scheduleMonitor(); + new WebSessionMonitorJob(this, application.getSessionManager()) + .scheduleMonitor(); - new SessionStateJob(this, webSessionManager) - .scheduleMonitor(); - } + new SessionStateJob(this, application.getSessionManager()) + .scheduleMonitor(); - new WebDataSourceMonitorJob(this, getSessionManager()) + new WebDataSourceMonitorJob(this, application.getSessionManager()) .scheduleMonitor(); new AbstractJob("Delete temp folder") { @@ -124,7 +120,7 @@ public class CBPlatform extends BaseGQLPlatform { @NotNull @Override - public GQLApplicationAdapter getApplication() { + public CBApplication getApplication() { return application; } @@ -144,10 +140,6 @@ public class CBPlatform extends BaseGQLPlatform { return false; } - public AppWebSessionManager getSessionManager() { - return application.getSessionManager(); - } - public void refreshApplicableDrivers() { this.applicableDrivers.clear(); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatformActivator.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBPlatformActivator.java similarity index 100% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatformActivator.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBPlatformActivator.java diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBServerConfigurationController.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBServerConfigurationController.java similarity index 94% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBServerConfigurationController.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBServerConfigurationController.java index 637ea382d3..637b287941 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBServerConfigurationController.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBServerConfigurationController.java @@ -18,12 +18,12 @@ package io.cloudbeaver.server; import com.google.gson.*; import io.cloudbeaver.model.app.BaseServerConfigurationController; -import io.cloudbeaver.model.app.BaseWebApplication; +import io.cloudbeaver.model.app.BaseServletApplication; import io.cloudbeaver.model.config.CBAppConfig; import io.cloudbeaver.model.config.CBServerConfig; import io.cloudbeaver.model.config.PasswordPolicyConfiguration; import io.cloudbeaver.model.config.SMControllerConfiguration; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; @@ -76,7 +76,7 @@ public abstract class CBServerConfigurationController return Stream.of(serverConfiguration.getServerURL(), serverConfiguration.getRootURI(), serverConfiguration.getServicesURI()) - .map(WebAppUtils::removeSideSlashes) + .map(ServletAppUtils::removeSideSlashes) .filter(CommonUtils::isNotEmpty) .collect(Collectors.joining("/")); } @@ -139,7 +139,7 @@ public abstract class CBServerConfigurationController Gson gson = getGson(); Map currentConfigurationAsMap = gson.fromJson(gson.toJson(getServerConfiguration()), JSONUtils.MAP_TYPE_TOKEN); - serverConfig = WebAppUtils.mergeConfigurations(currentConfigurationAsMap, serverConfig); + serverConfig = ServletAppUtils.mergeConfigurations(currentConfigurationAsMap, serverConfig); gson.fromJson( gson.toJson(serverConfig), getServerConfiguration().getClass() @@ -174,9 +174,9 @@ public abstract class CBServerConfigurationController config.setServerURL("http://" + hostName + ":" + config.getServerPort()); } - config.setContentRoot(WebAppUtils.getRelativePath(config.getContentRoot(), homeDirectory)); + config.setContentRoot(ServletAppUtils.getRelativePath(config.getContentRoot(), homeDirectory)); config.setRootURI(readRootUri(config.getRootURI())); - config.setDriversLocation(WebAppUtils.getRelativePath(config.getDriversLocation(), homeDirectory)); + config.setDriversLocation(ServletAppUtils.getRelativePath(config.getDriversLocation(), homeDirectory)); String staticContentsFile = config.getStaticContent(); if (!CommonUtils.isEmpty(staticContentsFile)) { @@ -231,7 +231,7 @@ public abstract class CBServerConfigurationController if (!serverConfig.containsKey(CBConstants.PARAM_PRODUCT_SETTINGS) && serverConfig.get(CBConstants.PARAM_PRODUCT_CONFIGURATION) instanceof String ) { - String productConfigPath = WebAppUtils.getRelativePath( + String productConfigPath = ServletAppUtils.getRelativePath( JSONUtils.getString( serverConfig, CBConstants.PARAM_PRODUCT_CONFIGURATION, @@ -248,7 +248,7 @@ public abstract class CBServerConfigurationController try (Reader reader = new InputStreamReader(new FileInputStream(productConfigFile), StandardCharsets.UTF_8)) { serverConfiguration.getProductSettings() - .putAll(WebAppUtils.flattenMap(JSONUtils.parseMap(gson, reader))); + .putAll(ServletAppUtils.flattenMap(JSONUtils.parseMap(gson, reader))); } catch (Exception e) { throw new DBException("Error reading product configuration", e); } @@ -265,7 +265,7 @@ public abstract class CBServerConfigurationController var runtimeProductSettings = JSONUtils.parseMap(gson, reader); var productSettings = serverConfiguration.getProductSettings(); runtimeProductSettings.putAll(productSettings); - Map flattenConfig = WebAppUtils.flattenMap(runtimeProductSettings); + Map flattenConfig = ServletAppUtils.flattenMap(runtimeProductSettings); productSettings.clear(); productSettings.putAll(flattenConfig); } catch (Exception e) { @@ -276,7 +276,7 @@ public abstract class CBServerConfigurationController } protected Map readConnectionsPermissionsConfiguration(Path parentPath) { - String permissionsConfigPath = WebAppUtils.getRelativePath(CBConstants.DEFAULT_DATASOURCE_PERMISSIONS_CONFIGURATION, + String permissionsConfigPath = ServletAppUtils.getRelativePath(CBConstants.DEFAULT_DATASOURCE_PERMISSIONS_CONFIGURATION, parentPath); File permissionsConfigFile = new File(permissionsConfigPath); if (permissionsConfigFile.exists()) { @@ -301,7 +301,7 @@ public abstract class CBServerConfigurationController if (originalConfigurationProperties.isEmpty()) { originalConfigurationProperties.putAll(configProps); } else { - var mergedOriginalConfigs = WebAppUtils.mergeConfigurations( + var mergedOriginalConfigs = ServletAppUtils.mergeConfigurations( originalConfigurationProperties, configProps ); @@ -394,7 +394,7 @@ public abstract class CBServerConfigurationController ) { Map rootConfig = new LinkedHashMap<>(); { - var originServerConfig = BaseWebApplication.getServerConfigProps(this.originalConfigurationProperties); // get server properties from original configuration file + var originServerConfig = BaseServletApplication.getServerConfigProps(this.originalConfigurationProperties); // get server properties from original configuration file var serverConfigProperties = collectServerConfigProperties(serverConfig, originServerConfig); rootConfig.put("server", serverConfigProperties); } @@ -560,7 +560,7 @@ public abstract class CBServerConfigurationController return super.get(name); } }; - BaseWebApplication.patchConfigurationWithProperties(configProps, varResolver); + BaseServletApplication.patchConfigurationWithProperties(configProps, varResolver); } // gets info about patterns from original configuration file and saves it to runtime config @@ -583,7 +583,7 @@ public abstract class CBServerConfigurationController } newConfig.put(key, subValue); } else { - Object newConfigValue = WebAppUtils.getExtractedValue(oldConfig.get(key), defaultValue); + Object newConfigValue = ServletAppUtils.getExtractedValue(oldConfig.get(key), defaultValue); newConfig.put(key, newConfigValue); } } @@ -613,9 +613,9 @@ public abstract class CBServerConfigurationController public void saveProductConfiguration(Map productConfiguration) throws DBException { Map productSettings = getServerConfiguration().getProductSettings(); - Map mergedConfig = WebAppUtils.mergeConfigurations(productSettings, productConfiguration); + Map mergedConfig = ServletAppUtils.mergeConfigurations(productSettings, productConfiguration); productSettings.clear(); - productSettings.putAll(WebAppUtils.flattenMap(mergedConfig)); + productSettings.putAll(ServletAppUtils.flattenMap(mergedConfig)); } public T getServerConfiguration() { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBServerConfigurationControllerEmbedded.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBServerConfigurationControllerEmbedded.java similarity index 100% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBServerConfigurationControllerEmbedded.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBServerConfigurationControllerEmbedded.java diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSObjectPermissionUpdatedEventHandler.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSObjectPermissionUpdatedEventHandler.java similarity index 97% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSObjectPermissionUpdatedEventHandler.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSObjectPermissionUpdatedEventHandler.java index 7f4ebeb740..32d9a7a88f 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSObjectPermissionUpdatedEventHandler.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSObjectPermissionUpdatedEventHandler.java @@ -22,7 +22,7 @@ import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.server.CBPlatform; import io.cloudbeaver.service.security.SMUtils; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; @@ -66,7 +66,7 @@ public class WSObjectPermissionUpdatedEventHandler extends WSDefaultEventHandler return; } log.debug(event.getTopicId() + " event handled"); - Collection allSessions = CBPlatform.getInstance().getSessionManager().getAllActiveSessions(); + 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( @@ -103,7 +103,7 @@ public class WSObjectPermissionUpdatedEventHandler extends WSDefaultEventHandler List dataSources = List.of(dataSourceId); WebSessionGlobalProjectImpl project = webSession.getGlobalProject(); if (project == null) { - log.error("Project " + WebAppUtils.getGlobalProjectId() + + log.error("Project " + ServletAppUtils.getGlobalProjectId() + " is not found in session " + activeUserSession.getSessionId()); return; } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSRmResourceUpdatedEventHandlerImpl.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSRmResourceUpdatedEventHandlerImpl.java similarity index 100% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSRmResourceUpdatedEventHandlerImpl.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSRmResourceUpdatedEventHandlerImpl.java diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSSubjectPermissionUpdatedEventHandler.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSSubjectPermissionUpdatedEventHandler.java similarity index 100% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSSubjectPermissionUpdatedEventHandler.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSSubjectPermissionUpdatedEventHandler.java diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSUserEventHandler.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSUserEventHandler.java similarity index 88% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSUserEventHandler.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSUserEventHandler.java index 14dc4cdb76..4ed0e17124 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSUserEventHandler.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSUserEventHandler.java @@ -16,8 +16,8 @@ */ package io.cloudbeaver.server.events; +import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.server.CBPlatform; -import io.cloudbeaver.service.session.WebSessionManager; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.model.websocket.WSEventHandler; import org.jkiss.dbeaver.model.websocket.event.WSAbstractEvent; @@ -32,11 +32,7 @@ public class WSUserEventHandler implements WSEven if (eventType == null) { return; } - var appSessionManager = CBPlatform.getInstance().getSessionManager(); - if (!(appSessionManager instanceof WebSessionManager)) { - return; - } - var sessionManager = (WebSessionManager) appSessionManager; + var sessionManager = CBApplication.getInstance().getSessionManager(); switch (eventType) { case CLOSE_USER_SESSIONS: if (event instanceof WSUserCloseSessionsEvent closeSessionsEvent) { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSUserSecretEventHandlerImpl.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSUserSecretEventHandlerImpl.java similarity index 100% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSUserSecretEventHandlerImpl.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/events/WSUserSecretEventHandlerImpl.java diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBJettyServer.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/jetty/CBJettyServer.java similarity index 86% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBJettyServer.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/jetty/CBJettyServer.java index e3c94cce88..9d0f86ec72 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBJettyServer.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/jetty/CBJettyServer.java @@ -19,11 +19,12 @@ package io.cloudbeaver.server.jetty; import io.cloudbeaver.model.config.CBServerConfig; import io.cloudbeaver.registry.WebServiceRegistry; import io.cloudbeaver.server.CBApplication; -import io.cloudbeaver.server.GQLApplicationAdapter; +import io.cloudbeaver.server.CBConstants; +import io.cloudbeaver.server.WebApplication; import io.cloudbeaver.server.graphql.GraphQLEndpoint; import io.cloudbeaver.server.servlets.CBImageServlet; import io.cloudbeaver.server.servlets.CBStaticServlet; -import io.cloudbeaver.server.servlets.CBStatusServlet; +import io.cloudbeaver.server.servlets.WebStatusServlet; import io.cloudbeaver.server.websockets.CBJettyWebSocketManager; import io.cloudbeaver.service.DBWServiceBindingServlet; import io.cloudbeaver.service.DBWServiceBindingWebSocket; @@ -104,7 +105,8 @@ public class CBJettyServer { "static", new CBStaticServlet(Path.of(serverConfiguration.getContentRoot())) ); staticServletHolder.setInitParameter("dirAllowed", "false"); - staticServletHolder.setInitParameter("cacheControl", "public, max-age=" + CBStaticServlet.STATIC_CACHE_SECONDS); + staticServletHolder.setInitParameter("cacheControl", + "public, max-age=" + CBConstants.STATIC_CACHE_SECONDS); servletContextHandler.addServlet(staticServletHolder, "/"); if (Files.isSymbolicLink(contentRootPath)) { @@ -114,7 +116,7 @@ public class CBJettyServer { ServletHolder imagesServletHolder = new ServletHolder("images", new CBImageServlet()); servletContextHandler.addServlet(imagesServletHolder, serverConfiguration.getServicesURI() + "images/*"); - servletContextHandler.addServlet(new ServletHolder("status", new CBStatusServlet()), "/status"); + servletContextHandler.addServlet(new ServletHolder("status", new WebStatusServlet()), "/status"); servletContextHandler.addServlet(new ServletHolder("graphql", new GraphQLEndpoint()), serverConfiguration.getServicesURI() + "gql/*"); servletContextHandler.addEventListener(new CBServerContextListener(application)); @@ -135,7 +137,7 @@ public class CBJettyServer { } CBJettyWebSocketContext webSocketContext = new CBJettyWebSocketContext(server, servletContextHandler); - for (DBWServiceBindingWebSocket wsb : WebServiceRegistry.getInstance() + for (DBWServiceBindingWebSocket wsb : WebServiceRegistry.getInstance() .getWebServices(DBWServiceBindingWebSocket.class) ) { if (wsb.isApplicable(this.application)) { @@ -158,7 +160,7 @@ public class CBJettyServer { ); servletContextHandler.insertHandler(webSocketHandler); - initSessionManager( + JettyUtils.initSessionManager( this.application.getMaxSessionIdleTime(), this.application, server, @@ -216,35 +218,6 @@ public class CBJettyServer { return sslConfiguration.isAbsolute() ? sslConfiguration : application.getHomeDirectory().resolve(sslConfiguration); } - public static void initSessionManager( - long maxIdleTime, - @NotNull GQLApplicationAdapter application, - @NotNull Server server, - @NotNull ServletContextHandler servletContextHandler - ) { - // Init sessions persistence - CBSessionHandler sessionHandler = new CBSessionHandler(application); - sessionHandler.setRefreshCookieAge(CBSessionHandler.ONE_MINUTE); - int intMaxIdleSeconds; - if (maxIdleTime > Integer.MAX_VALUE) { - log.warn("Max session idle time value is greater than Integer.MAX_VALUE. Integer.MAX_VALUE will be used instead"); - maxIdleTime = Integer.MAX_VALUE; - } - intMaxIdleSeconds = (int) (maxIdleTime / 1000); - log.debug("Max http session idle time: " + intMaxIdleSeconds + "s"); - sessionHandler.setMaxInactiveInterval(intMaxIdleSeconds); - sessionHandler.setMaxCookieAge(intMaxIdleSeconds); - - DefaultSessionCache sessionCache = new DefaultSessionCache(sessionHandler); - sessionCache.setSessionDataStore(new NullSessionDataStore()); - sessionHandler.setSessionCache(sessionCache); - servletContextHandler.setSessionHandler(sessionHandler); - - DefaultSessionIdManager idMgr = new DefaultSessionIdManager(server); - idMgr.setWorkerName(null); - server.addBean(idMgr, true); - } - public synchronized void refreshJettyConfig() { if (server == null) { return; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBServerContextListener.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/jetty/CBServerContextListener.java similarity index 100% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBServerContextListener.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/jetty/CBServerContextListener.java diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jobs/SessionStateJob.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/jobs/SessionStateJob.java similarity index 87% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jobs/SessionStateJob.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/jobs/SessionStateJob.java index 2a03e5262e..3625ddfdcd 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jobs/SessionStateJob.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/jobs/SessionStateJob.java @@ -16,7 +16,7 @@ */ package io.cloudbeaver.server.jobs; -import io.cloudbeaver.service.session.WebSessionManager; +import io.cloudbeaver.service.session.CBSessionManager; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.app.DBPPlatform; @@ -27,9 +27,9 @@ import java.time.Duration; public class SessionStateJob extends PeriodicJob { private static final Log log = Log.getLog(SessionStateJob.class); - private final WebSessionManager sessionManager; + private final CBSessionManager sessionManager; - public SessionStateJob(@NotNull DBPPlatform platform, WebSessionManager sessionManager) { + public SessionStateJob(@NotNull DBPPlatform platform, CBSessionManager sessionManager) { super("Session state sender", platform, Duration.ofSeconds(30)); this.sessionManager = sessionManager; } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jobs/WebSessionMonitorJob.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/jobs/WebSessionMonitorJob.java similarity index 90% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jobs/WebSessionMonitorJob.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/jobs/WebSessionMonitorJob.java index 3de046e1a9..23718a58e6 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jobs/WebSessionMonitorJob.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/jobs/WebSessionMonitorJob.java @@ -16,7 +16,7 @@ */ package io.cloudbeaver.server.jobs; -import io.cloudbeaver.service.session.WebSessionManager; +import io.cloudbeaver.service.session.CBSessionManager; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.app.DBPPlatform; @@ -30,9 +30,9 @@ import java.time.Duration; */ public class WebSessionMonitorJob extends PeriodicJob { private static final Log log = Log.getLog(WebSessionMonitorJob.class); - private final WebSessionManager sessionManager; + private final CBSessionManager sessionManager; - public WebSessionMonitorJob(@NotNull DBPPlatform platform, @NotNull WebSessionManager sessionManager) { + public WebSessionMonitorJob(@NotNull DBPPlatform platform, @NotNull CBSessionManager sessionManager) { super("Web session monitor", platform, Duration.ofSeconds(10)); this.sessionManager = sessionManager; } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/CBStaticServlet.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/servlets/CBStaticServlet.java similarity index 98% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/CBStaticServlet.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/servlets/CBStaticServlet.java index ee850f61d7..3c8f643b4b 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/CBStaticServlet.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/servlets/CBStaticServlet.java @@ -60,7 +60,6 @@ public class CBStaticServlet extends DefaultServlet { private static final String AUTO_LOGIN_ACTION = "auto-login"; private static final String AUTO_LOGIN_AUTH_ID = "auth-id"; private static final String ACTION = "action"; - public static final int STATIC_CACHE_SECONDS = 60 * 60 * 24 * 3; private static final Log log = Log.getLog(CBStaticServlet.class); @@ -84,7 +83,7 @@ public class CBStaticServlet extends DefaultServlet { } String uri = request.getPathInfo(); try { - WebSession webSession = CBPlatform.getInstance().getSessionManager().getWebSession( + WebSession webSession = CBApplication.getInstance().getSessionManager().getWebSession( request, response, false); performAutoLoginIfNeeded(request, webSession); WebActionParameters webActionParameters = WebActionParameters.fromSession(webSession, false); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/DBWServiceInitializer.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/DBWServiceInitializer.java similarity index 100% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/DBWServiceInitializer.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/DBWServiceInitializer.java diff --git a/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/core/CECoreModelExtender.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/core/CECoreModelExtender.java new file mode 100644 index 0000000000..4b5bf1f11d --- /dev/null +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/core/CECoreModelExtender.java @@ -0,0 +1,35 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2024 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.service.core; + +import io.cloudbeaver.DBWebException; +import io.cloudbeaver.service.DBWBindingContext; +import io.cloudbeaver.service.WebServiceBindingBase; + +/** + * extends the base gql model, to avoid unnecessary fields in other applications + */ +public class CECoreModelExtender extends WebServiceBindingBase { + public CECoreModelExtender() { + super(DBWVoidService.class, new DBWVoidService(), "schema/service.core.graphqls"); + } + + @Override + public void bindWiring(DBWBindingContext model) throws DBWebException { + + } +} diff --git a/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/core/DBWVoidService.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/core/DBWVoidService.java new file mode 100644 index 0000000000..852b182519 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/core/DBWVoidService.java @@ -0,0 +1,22 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2024 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.service.core; + +import io.cloudbeaver.service.DBWService; + +public class DBWVoidService implements DBWService { +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/WebSessionManager.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/session/CBSessionManager.java similarity index 98% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/WebSessionManager.java rename to server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/session/CBSessionManager.java index 324c96de6d..cc36ba849d 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/WebSessionManager.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/service/session/CBSessionManager.java @@ -21,9 +21,9 @@ import io.cloudbeaver.auth.SMTokenCredentialProvider; import io.cloudbeaver.model.session.*; import io.cloudbeaver.registry.WebHandlerRegistry; import io.cloudbeaver.registry.WebSessionHandlerDescriptor; -import io.cloudbeaver.server.AppWebSessionManager; import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.server.CBConstants; +import io.cloudbeaver.server.WebAppSessionManager; import io.cloudbeaver.server.events.WSWebUtils; import io.cloudbeaver.service.DBWSessionHandler; import jakarta.servlet.http.HttpServletRequest; @@ -48,14 +48,14 @@ import java.util.stream.Collectors; /** * Web session manager */ -public class WebSessionManager implements AppWebSessionManager { +public class CBSessionManager implements WebAppSessionManager { - private static final Log log = Log.getLog(WebSessionManager.class); + private static final Log log = Log.getLog(CBSessionManager.class); private final CBApplication application; private final Map sessionMap = new HashMap<>(); - public WebSessionManager(CBApplication application) { + public CBSessionManager(CBApplication application) { this.application = application; } diff --git a/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF index 2c3f7c58fb..a7e70de63a 100644 --- a/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF @@ -7,7 +7,6 @@ Bundle-Version: 24.3.1.qualifier Bundle-Release-Date: 20241223 Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-ActivationPolicy: lazy -Bundle-Activator: io.cloudbeaver.server.CBPlatformActivator Bundle-ClassPath: . Require-Bundle: org.eclipse.core.runtime;visibility:=reexport, org.apache.commons.jexl, @@ -23,6 +22,7 @@ Require-Bundle: org.eclipse.core.runtime;visibility:=reexport, io.cloudbeaver.service.security;visibility:=reexport Export-Package: io.cloudbeaver, io.cloudbeaver.model, + io.cloudbeaver.model.app, io.cloudbeaver.model.user, io.cloudbeaver.registry, io.cloudbeaver.server.events, @@ -32,10 +32,9 @@ Export-Package: io.cloudbeaver, io.cloudbeaver.server.graphql, io.cloudbeaver.server.jobs, io.cloudbeaver.server.servlets, - io.cloudbeaver.server.websockets, + io.cloudbeaver.server.websockets, io.cloudbeaver.service, io.cloudbeaver.service.navigator, - io.cloudbeaver.service.session, io.cloudbeaver.service.sql Import-Package: org.slf4j Automatic-Module-Name: io.cloudbeaver.server diff --git a/server/bundles/io.cloudbeaver.server/plugin.xml b/server/bundles/io.cloudbeaver.server/plugin.xml index 9259eddd80..91c17af200 100644 --- a/server/bundles/io.cloudbeaver.server/plugin.xml +++ b/server/bundles/io.cloudbeaver.server/plugin.xml @@ -29,9 +29,6 @@ - - - @@ -46,21 +43,9 @@ - - - - - - - - - - - - @@ -70,9 +55,6 @@ - - - diff --git a/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls index 72f12ddc98..8980b26d0b 100644 --- a/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls @@ -126,17 +126,8 @@ type ServerConfig { version: String! workspaceId: ID! - serverURL: String! - rootURI: String! - hostName: String! @deprecated # use container id instead - containerId: String! - defaultAuthRole: String - defaultUserTeam: String # [23.2.2] - anonymousAccessEnabled: Boolean! supportsCustomConnections: Boolean! - supportsConnectionBrowser: Boolean! - supportsWorkspaces: Boolean! resourceManagerEnabled: Boolean! publicCredentialsSaveEnabled: Boolean! @@ -146,19 +137,14 @@ type ServerConfig { licenseValid: Boolean! licenseStatus: String @since(version: "24.1.5") - sessionExpireTime: Int! - localHostAddress: String - configurationMode: Boolean! # initializationMode: Boolean! @since(version: "24.1.5") developmentMode: Boolean! - redirectOnFederatedAuth: Boolean! distributed: Boolean! enabledFeatures: [ID!]! disabledBetaFeatures: [ID!] @since(version: "24.0.5") serverFeatures: [ID!] @since(version: "24.3.0") - enabledAuthProviders: [ID!]! supportedLanguages: [ ServerLanguage! ]! services: [ WebServiceConfig ] productConfiguration: Object! @@ -166,7 +152,6 @@ type ServerConfig { defaultNavigatorSettings: NavigatorSettings! disabledDrivers: [ID!]! resourceQuotas: Object! - passwordPolicyConfiguration: PasswordPolicyConfig! @since(version: "23.3.3") } type ProductSettingsGroup @since(version: "24.0.1") { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java index 2d44b8ccde..a74ff5bafd 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java @@ -23,18 +23,20 @@ import com.google.gson.Strictness; import io.cloudbeaver.model.WebConnectionConfig; import io.cloudbeaver.model.WebNetworkHandlerConfigInput; import io.cloudbeaver.model.WebPropertyInfo; -import io.cloudbeaver.model.config.CBAppConfig; +import io.cloudbeaver.model.app.ServletApplication; import io.cloudbeaver.model.session.WebActionParameters; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.registry.WebAuthProviderDescriptor; import io.cloudbeaver.registry.WebAuthProviderRegistry; -import io.cloudbeaver.server.CBApplication; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.WebAppUtils; +import io.cloudbeaver.server.WebApplication; import io.cloudbeaver.service.navigator.WebPropertyFilter; +import io.cloudbeaver.utils.ServletAppUtils; import io.cloudbeaver.utils.WebCommonUtils; import io.cloudbeaver.utils.WebDataSourceUtils; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBConstants; import org.jkiss.dbeaver.model.DBPDataSourceContainer; @@ -135,11 +137,11 @@ public class WebServiceUtils extends WebCommonUtils { } ((DataSourceDescriptor)newDataSource).setTemplate(config.isTemplate()); - // Set default navigator settings - DataSourceNavigatorSettings navSettings = new DataSourceNavigatorSettings( - CBApplication.getInstance().getAppConfiguration().getDefaultNavigatorSettings()); - //navSettings.setShowSystemObjects(false); - ((DataSourceDescriptor)newDataSource).setNavigatorSettings(navSettings); + ServletApplication app = ServletAppUtils.getServletApplication(); + if (app instanceof WebApplication webApplication) { + ((DataSourceDescriptor) newDataSource).setNavigatorSettings( + webApplication.getAppConfiguration().getDefaultNavigatorSettings()); + } saveAuthProperties( newDataSource, @@ -311,12 +313,6 @@ public class WebServiceUtils extends WebCommonUtils { gson.toJsonTree(settingsMap), DataSourceNavigatorSettings.class); } - public static void checkServerConfigured() throws DBWebException { - if (CBApplication.getInstance().isConfigurationMode()) { - throw new DBWebException("Server is in configuration mode"); - } - } - public static void fireActionParametersOpenEditor(WebSession webSession, DBPDataSourceContainer dataSource, boolean addEditorName) { Map actionParameters = new HashMap<>(); actionParameters.put("action", "open-sql-editor"); @@ -341,13 +337,20 @@ public class WebServiceUtils extends WebCommonUtils { } public static boolean isGlobalProject(DBPProject project) { - return project.getId().equals(RMProjectType.GLOBAL.getPrefix() + "_" + CBApplication.getInstance().getDefaultProjectName()); + return project.getId() + .equals(RMProjectType.GLOBAL.getPrefix() + "_" + ServletAppUtils.getServletApplication() + .getDefaultProjectName()); } public static List getEnabledAuthProviders() { List result = new ArrayList<>(); - CBAppConfig appConfig = CBApplication.getInstance().getAppConfiguration(); - String[] authProviders = appConfig.getEnabledAuthProviders(); + String[] authProviders = null; + try { + authProviders = ServletAppUtils.getAuthApplication().getAuthConfiguration().getEnabledAuthProviders(); + } catch (DBException e) { + log.error(e.getMessage(), e); + return List.of(); + } for (String apId : authProviders) { WebAuthProviderDescriptor authProvider = WebAuthProviderRegistry.getInstance().getAuthProvider(apId); if (authProvider != null) { @@ -362,7 +365,7 @@ public class WebServiceUtils extends WebCommonUtils { */ @NotNull public static Set getApplicableDriversIds() { - return CBPlatform.getInstance().getApplicableDrivers().stream() + return WebAppUtils.getWebPlatform().getApplicableDrivers().stream() .map(DBPDriver::getId) .collect(Collectors.toSet()); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebDatabaseDriverInfo.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebDatabaseDriverInfo.java index 6fbd1d5c20..47aabec821 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebDatabaseDriverInfo.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebDatabaseDriverInfo.java @@ -18,10 +18,10 @@ package io.cloudbeaver.model; import io.cloudbeaver.DBWebException; import io.cloudbeaver.WebServiceUtils; -import io.cloudbeaver.model.config.CBAppConfig; +import io.cloudbeaver.model.app.WebAppConfiguration; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.model.utils.ConfigurationUtils; -import io.cloudbeaver.server.CBApplication; +import io.cloudbeaver.server.WebAppUtils; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBConstants; @@ -265,7 +265,7 @@ public class WebDatabaseDriverInfo { @Property public boolean isEnabled() { - CBAppConfig config = CBApplication.getInstance().getAppConfiguration(); + WebAppConfiguration config = WebAppUtils.getWebApplication().getAppConfiguration(); return ConfigurationUtils.isDriverEnabled( driver, config.getEnabledDrivers(), diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebProductInfo.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebProductInfo.java index 58d8f6b6bd..f366371837 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebProductInfo.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebProductInfo.java @@ -16,7 +16,7 @@ */ package io.cloudbeaver.model; -import io.cloudbeaver.server.CBApplication; +import io.cloudbeaver.utils.ServletAppUtils; import org.eclipse.core.runtime.IProduct; import org.eclipse.core.runtime.Platform; import org.jkiss.dbeaver.model.meta.Property; @@ -68,7 +68,7 @@ public class WebProductInfo { @Property public String getLicenseInfo() { - return CBApplication.getInstance().getInfoDetails(new VoidProgressMonitor()); + return ServletAppUtils.getServletApplication().getInfoDetails(new VoidProgressMonitor()); } @Property diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebServerConfig.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebServerConfig.java index afd236fc54..8309444230 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebServerConfig.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebServerConfig.java @@ -16,18 +16,14 @@ */ package io.cloudbeaver.model; -import io.cloudbeaver.model.app.WebApplication; -import io.cloudbeaver.model.config.PasswordPolicyConfiguration; import io.cloudbeaver.registry.WebServerFeatureRegistry; import io.cloudbeaver.registry.WebServiceDescriptor; import io.cloudbeaver.registry.WebServiceRegistry; -import io.cloudbeaver.server.CBApplication; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.WebApplication; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings; -import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings; import org.jkiss.dbeaver.registry.language.PlatformLanguageDescriptor; import org.jkiss.dbeaver.registry.language.PlatformLanguageRegistry; import org.jkiss.dbeaver.runtime.DBWorkbench; @@ -51,10 +47,7 @@ public class WebServerConfig { @Property public String getName() { - if (application instanceof CBApplication cbApp) { - return CommonUtils.notEmpty(cbApp.getServerConfiguration().getServerName()); - } - return ""; + return CommonUtils.notEmpty(application.getServerConfiguration().getServerName()); } @Property @@ -67,33 +60,6 @@ public class WebServerConfig { return DBWorkbench.getPlatform().getWorkspace().getWorkspaceId(); } - @Property - public String getServerURL() { - if (application instanceof CBApplication cbApp) { - return CommonUtils.notEmpty(cbApp.getServerConfiguration().getServerURL()); - } - return ""; - } - - @Property - public String getRootURI() { - return CommonUtils.notEmpty(application.getServerConfiguration().getRootURI()); - } - - @Deprecated - @Property - public String getHostName() { - return getContainerId(); - } - - @Property - public String getContainerId() { - if (application instanceof CBApplication cbApp) { - return CommonUtils.notEmpty(cbApp.getContainerId()); - } - return ""; - } - @Property public boolean isAnonymousAccessEnabled() { return application.getAppConfiguration().isAnonymousAccessEnabled(); @@ -104,36 +70,14 @@ public class WebServerConfig { return application.getAppConfiguration().isSupportsCustomConnections(); } - @Property - public boolean isSupportsConnectionBrowser() { - if (application instanceof CBApplication cbApp) { - return cbApp.getAppConfiguration().isSupportsConnectionBrowser(); - } - return false; - } - - @Property - public boolean isSupportsWorkspaces() { - if (application instanceof CBApplication cbApp) { - return cbApp.getAppConfiguration().isSupportsUserWorkspaces(); - } - return false; - } - @Property public boolean isPublicCredentialsSaveEnabled() { - if (application instanceof CBApplication cbApp) { - return cbApp.getAppConfiguration().isPublicCredentialsSaveEnabled(); - } - return false; + return application.getAppConfiguration().isPublicCredentialsSaveEnabled(); } @Property public boolean isAdminCredentialsSaveEnabled() { - if (application instanceof CBApplication cbApp) { - return cbApp.getAppConfiguration().isAdminCredentialsSaveEnabled(); - } - return false; + return application.getAppConfiguration().isAdminCredentialsSaveEnabled(); } @Property @@ -143,18 +87,12 @@ public class WebServerConfig { @Property public boolean isLicenseValid() { - if (application instanceof CBApplication cbApp) { - return cbApp.isLicenseValid(); - } - return false; + return application.isLicenseValid(); } @Property public String getLicenseStatus() { - if (application instanceof CBApplication cbApp) { - return cbApp.getLicenseStatus(); - } - return ""; + return application.getLicenseStatus(); } @Property @@ -167,35 +105,11 @@ public class WebServerConfig { return application.getServerConfiguration().isDevelMode(); } - @Property - public boolean isRedirectOnFederatedAuth() { - if (application instanceof CBApplication cbApp) { - return cbApp.getAppConfiguration().isRedirectOnFederatedAuth(); - } - return false; - } - @Property public boolean isResourceManagerEnabled() { return application.getAppConfiguration().isResourceManagerEnabled(); } - @Property - public long getSessionExpireTime() { - if (application instanceof CBApplication cbApp) { - return cbApp.getServerConfiguration().getMaxSessionIdleTime(); - } - return 0; - } - - @Property - public String getLocalHostAddress() { - if (application instanceof CBApplication cbApp) { - return cbApp.getLocalHostAddress(); - } - return ""; - } - @Property public String[] getEnabledFeatures() { return application.getAppConfiguration().getEnabledFeatures(); @@ -204,10 +118,7 @@ public class WebServerConfig { @Property @Nullable public String[] getDisabledBetaFeatures() { - if (application instanceof CBApplication cbApp) { - return cbApp.getAppConfiguration().getDisabledBetaFeatures(); - } - return new String[0]; + return application.getAppConfiguration().getDisabledBetaFeatures(); } @Property @@ -216,14 +127,6 @@ public class WebServerConfig { return WebServerFeatureRegistry.getInstance().getServerFeatures(); } - @Property - public String[] getEnabledAuthProviders() { - if (application instanceof CBApplication cbApp) { - return cbApp.getAppConfiguration().getEnabledAuthProviders(); - } - return new String[0]; - } - @Property public WebServerLanguage[] getSupportedLanguages() { List langs = PlatformLanguageRegistry.getInstance().getLanguages(); @@ -245,23 +148,17 @@ public class WebServerConfig { @Property public Map getProductConfiguration() { - return CBPlatform.getInstance().getApplication().getProductConfiguration(); + return application.getProductConfiguration(); } @Property public DBNBrowseSettings getDefaultNavigatorSettings() { - if (application instanceof CBApplication cbApp) { - return cbApp.getAppConfiguration().getDefaultNavigatorSettings(); - } - return new DataSourceNavigatorSettings(); + return application.getAppConfiguration().getDefaultNavigatorSettings(); } @Property public Map getResourceQuotas() { - if (application instanceof CBApplication cbApp) { - return cbApp.getAppConfiguration().getResourceQuotas(); - } - return Map.of(); + return application.getAppConfiguration().getResourceQuotas(); } @Property @@ -271,35 +168,11 @@ public class WebServerConfig { @Property public String[] getDisabledDrivers() { - if (application instanceof CBApplication cbApp) { - return cbApp.getAppConfiguration().getDisabledDrivers(); - } - return new String[0]; + return application.getAppConfiguration().getDisabledDrivers(); } @Property public Boolean isDistributed() { return application.isDistributed(); } - - @Property - public String getDefaultAuthRole() { - if (application instanceof CBApplication cbApp) { - return cbApp.getDefaultAuthRole(); - } - return ""; - } - - @Property - public String getDefaultUserTeam() { - return application.getAppConfiguration().getDefaultUserTeam(); - } - - @Property - public PasswordPolicyConfiguration getPasswordPolicyConfiguration() { - if (application instanceof CBApplication cbApp) { - return cbApp.getSecurityManagerConfiguration().getPasswordPolicyConfiguration(); - } - return new PasswordPolicyConfiguration(); - } } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/app/WebServerConfiguration.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/app/WebServerConfiguration.java new file mode 100644 index 0000000000..cc5915d588 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/app/WebServerConfiguration.java @@ -0,0 +1,28 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2024 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.model.app; + +import org.jkiss.code.Nullable; + +/** + * Web server configuration. + * Contains only server configuration properties. + */ +public interface WebServerConfiguration extends ServletServerConfiguration { + @Nullable + String getServerName(); +} diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/BaseGQLPlatform.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/BaseWebPlatform.java similarity index 89% rename from server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/BaseGQLPlatform.java rename to server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/BaseWebPlatform.java index a2ae8040a2..9d8cca6ad2 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/BaseGQLPlatform.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/BaseWebPlatform.java @@ -17,13 +17,13 @@ package io.cloudbeaver.server; import io.cloudbeaver.DBWConstants; -import io.cloudbeaver.model.app.WebApplication; import org.eclipse.core.runtime.Plugin; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBConstants; import org.jkiss.dbeaver.model.app.DBACertificateStorage; import org.jkiss.dbeaver.model.app.DBPWorkspace; +import org.jkiss.dbeaver.model.connection.DBPDriver; import org.jkiss.dbeaver.model.impl.app.DefaultCertificateStorage; import org.jkiss.dbeaver.model.qm.QMRegistry; import org.jkiss.dbeaver.model.qm.QMUtils; @@ -40,17 +40,20 @@ import org.jkiss.utils.StandardConstants; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; -public abstract class BaseGQLPlatform extends BasePlatformImpl { - private static final Log log = Log.getLog(BaseGQLPlatform.class); +public abstract class BaseWebPlatform extends BasePlatformImpl { + private static final Log log = Log.getLog(BaseWebPlatform.class); public static final String BASE_TEMP_DIR = "dbeaver"; + public static final String TEMP_FILE_FOLDER = "temp-sql-upload-files"; + public static final String TEMP_FILE_IMPORT_FOLDER = "temp-import-files"; private Path tempFolder; private QMRegistryImpl queryManager; private QMLogFileWriter qmLogWriter; private DBACertificateStorage certificateStorage; - private WebGlobalWorkspace workspace; + private ServerGlobalWorkspace workspace; @Override protected synchronized void initialize() { @@ -58,7 +61,7 @@ public abstract class BaseGQLPlatform extends BasePlatformImpl { SecurityProviderUtils.registerSecurityProvider(); // Register properties adapter - this.workspace = new WebGlobalWorkspace(this, (WebApplication) getApplication()); + this.workspace = new ServerGlobalWorkspace(this, getApplication()); this.workspace.initializeProjects(); QMUtils.initApplication(this); @@ -129,6 +132,8 @@ public abstract class BaseGQLPlatform extends BasePlatformImpl { @NotNull public abstract WebApplication getApplication(); + protected abstract void scheduleServerJobs(); + @Override public synchronized void dispose() { super.dispose(); @@ -158,4 +163,5 @@ public abstract class BaseGQLPlatform extends BasePlatformImpl { return queryManager; } + public abstract List getApplicableDrivers(); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatformUI.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/ServletPlatformUI.java similarity index 86% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatformUI.java rename to server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/ServletPlatformUI.java index 1db781d531..afdd674382 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatformUI.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/ServletPlatformUI.java @@ -21,9 +21,9 @@ import org.jkiss.dbeaver.runtime.ui.console.ConsoleUserInterface; /** * The activator class controls the plug-in life cycle */ -public class CBPlatformUI extends ConsoleUserInterface { +public class ServletPlatformUI extends ConsoleUserInterface { - public static final CBPlatformUI INSTANCE = new CBPlatformUI(); + public static final ServletPlatformUI INSTANCE = new ServletPlatformUI(); protected void initialize() { // just a placeholder for injection diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/AppWebSessionManager.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebAppSessionManager.java similarity index 96% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/AppWebSessionManager.java rename to server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebAppSessionManager.java index 13cfc7796a..d6465fb05c 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/AppWebSessionManager.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebAppSessionManager.java @@ -30,7 +30,7 @@ import org.jkiss.dbeaver.DBException; import java.util.Collection; -public interface AppWebSessionManager { +public interface WebAppSessionManager { BaseWebSession closeSession(@NotNull HttpServletRequest request); @NotNull @@ -61,4 +61,8 @@ public interface AppWebSessionManager { WebHeadlessSession getHeadlessSession(Request request, Session session, boolean create) throws DBException; boolean touchSession(HttpServletRequest request, HttpServletResponse response) throws DBWebException; + + default void expireIdleSessions() { + + } } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebAppUtils.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebAppUtils.java new file mode 100644 index 0000000000..c062fad708 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebAppUtils.java @@ -0,0 +1,29 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2024 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; + +import org.jkiss.dbeaver.runtime.DBWorkbench; + +public class WebAppUtils { + public static WebApplication getWebApplication() { + return (WebApplication) DBWorkbench.getPlatform().getApplication(); + } + + public static BaseWebPlatform getWebPlatform() { + return (BaseWebPlatform) DBWorkbench.getPlatform(); + } +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/GQLApplicationAdapter.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebApplication.java similarity index 68% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/GQLApplicationAdapter.java rename to server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebApplication.java index f747216547..25de26e9d0 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/GQLApplicationAdapter.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/WebApplication.java @@ -16,7 +16,10 @@ */ package io.cloudbeaver.server; -import io.cloudbeaver.model.app.WebApplication; +import io.cloudbeaver.model.WebServerConfig; +import io.cloudbeaver.model.app.ServletApplication; +import io.cloudbeaver.model.app.WebAppConfiguration; +import io.cloudbeaver.model.app.WebServerConfiguration; import io.cloudbeaver.registry.WebDriverRegistry; import org.jkiss.code.NotNull; @@ -24,13 +27,18 @@ import java.net.InetAddress; import java.util.List; import java.util.Map; -//FIXME: this interface should not exist, -// the logic of platforms and applications should be separated from each other -public interface GQLApplicationAdapter extends WebApplication { - AppWebSessionManager getSessionManager(); +/** + * Base interface for applications with web ui + */ +public interface WebApplication extends ServletApplication { + WebServerConfiguration getServerConfiguration(); + + WebAppSessionManager getSessionManager(); WebDriverRegistry getDriverRegistry(); + WebAppConfiguration getAppConfiguration(); + @NotNull Map getProductConfiguration(); @@ -41,4 +49,7 @@ public interface GQLApplicationAdapter extends WebApplication { boolean isLicenseValid(); String getLicenseStatus(); + + WebServerConfig getWebServerConfig(); + } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/actions/AbstractActionServletHandler.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/actions/AbstractActionServletHandler.java index bcf97f7aaf..652b1d53b3 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/actions/AbstractActionServletHandler.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/actions/AbstractActionServletHandler.java @@ -18,7 +18,7 @@ package io.cloudbeaver.server.actions; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.service.DBWServletHandler; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import jakarta.servlet.Servlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -44,7 +44,7 @@ public abstract class AbstractActionServletHandler implements DBWServletHandler action.saveInSession(session); // Redirect to home - response.sendRedirect(WebAppUtils.getWebApplication().getServerConfiguration().getRootURI()); + response.sendRedirect(ServletAppUtils.getServletApplication().getServerConfiguration().getRootURI()); } protected abstract String getActionConsole(); 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 fb456da4ff..10bea4a2ed 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 @@ -17,7 +17,7 @@ package io.cloudbeaver.server.events; import io.cloudbeaver.model.session.BaseWebSession; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.WebAppUtils; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.websocket.WSEventHandler; @@ -32,7 +32,9 @@ public class WSDefaultEventHandler implements WSEventHand @Override public void handleEvent(@NotNull EVENT event) { log.debug(event.getTopicId() + " event handled"); - Collection allSessions = CBPlatform.getInstance().getSessionManager().getAllActiveSessions(); + Collection allSessions = WebAppUtils.getWebApplication() + .getSessionManager() + .getAllActiveSessions(); for (var activeUserSession : allSessions) { if (!isAcceptableInSession(activeUserSession, event)) { log.debug("Cannot handle " + event.getTopicId() + " event '" + event.getId() + diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSDeleteTempFileHandler.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSDeleteTempFileHandler.java index 9c0085985c..04fe89f805 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSDeleteTempFileHandler.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/events/WSDeleteTempFileHandler.java @@ -16,7 +16,8 @@ */ package io.cloudbeaver.server.events; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.BaseWebPlatform; +import io.cloudbeaver.server.WebAppUtils; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; @@ -33,9 +34,9 @@ public class WSDeleteTempFileHandler implements WSEventHandler cbApp) { - return (WebSession)cbApp.getSessionManager() - .getSession(request.getSession().getId()); - } else { - return null; - } + return webApplication.getSessionManager() + .findWebSession(request); } public static String buildLoggerMessage(String sessionId, String userId, Map variables) { StringBuilder loggerMessage = new StringBuilder(" [user: ").append(userId) .append(", sessionId: ").append(sessionId).append("]"); - if (CBPlatform.getInstance().getPreferenceStore().getBoolean(LOG_API_GRAPHQL_DEBUG_PARAMETER) + if (WebAppUtils.getWebPlatform().getPreferenceStore().getBoolean(LOG_API_GRAPHQL_DEBUG_PARAMETER) && variables != null ) { loggerMessage.append(" [variables] "); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBSessionHandler.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBSessionHandler.java index b8539264f7..9b78e53ce5 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBSessionHandler.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBSessionHandler.java @@ -16,14 +16,14 @@ */ package io.cloudbeaver.server.jetty; -import io.cloudbeaver.server.GQLApplicationAdapter; +import io.cloudbeaver.server.WebApplication; import org.eclipse.jetty.ee10.servlet.SessionHandler; public class CBSessionHandler extends SessionHandler { static final int ONE_MINUTE = 60; - private final GQLApplicationAdapter application; + private final WebApplication application; - public CBSessionHandler(GQLApplicationAdapter application) { + public CBSessionHandler(WebApplication application) { this.application = application; } } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/JettyUtils.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/JettyUtils.java new file mode 100644 index 0000000000..8e07f75b8a --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/JettyUtils.java @@ -0,0 +1,59 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2024 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.jetty; + +import io.cloudbeaver.server.WebApplication; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.session.DefaultSessionCache; +import org.eclipse.jetty.session.DefaultSessionIdManager; +import org.eclipse.jetty.session.NullSessionDataStore; +import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.Log; + +public class JettyUtils { + private static final Log log = Log.getLog(JettyUtils.class); + + public static void initSessionManager( + long maxIdleTime, + @NotNull WebApplication application, + @NotNull Server server, + @NotNull ServletContextHandler servletContextHandler + ) { + // Init sessions persistence + CBSessionHandler sessionHandler = new CBSessionHandler(application); + sessionHandler.setRefreshCookieAge(CBSessionHandler.ONE_MINUTE); + int intMaxIdleSeconds; + if (maxIdleTime > Integer.MAX_VALUE) { + log.warn("Max session idle time value is greater than Integer.MAX_VALUE. Integer.MAX_VALUE will be used instead"); + maxIdleTime = Integer.MAX_VALUE; + } + intMaxIdleSeconds = (int) (maxIdleTime / 1000); + log.debug("Max http session idle time: " + intMaxIdleSeconds + "s"); + sessionHandler.setMaxInactiveInterval(intMaxIdleSeconds); + sessionHandler.setMaxCookieAge(intMaxIdleSeconds); + + DefaultSessionCache sessionCache = new DefaultSessionCache(sessionHandler); + sessionCache.setSessionDataStore(new NullSessionDataStore()); + sessionHandler.setSessionCache(sessionCache); + servletContextHandler.setSessionHandler(sessionHandler); + + DefaultSessionIdManager idMgr = new DefaultSessionIdManager(server); + idMgr.setWorkerName(null); + server.addBean(idMgr, true); + } +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jobs/WebDataSourceMonitorJob.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jobs/WebDataSourceMonitorJob.java index 961bf38ce6..183acc805f 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jobs/WebDataSourceMonitorJob.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jobs/WebDataSourceMonitorJob.java @@ -16,9 +16,9 @@ */ package io.cloudbeaver.server.jobs; -import io.cloudbeaver.server.AppWebSessionManager; import io.cloudbeaver.model.session.BaseWebSession; import io.cloudbeaver.model.session.WebSession; +import io.cloudbeaver.server.WebAppSessionManager; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.app.DBPPlatform; @@ -34,11 +34,11 @@ import java.util.List; * Web data source monitor job. */ public class WebDataSourceMonitorJob extends DataSourceMonitorJob { - private final AppWebSessionManager sessionManager; + private final WebAppSessionManager sessionManager; public WebDataSourceMonitorJob( @NotNull DBPPlatform platform, - @NotNull AppWebSessionManager sessionManager + @NotNull WebAppSessionManager sessionManager ) { super(platform); this.sessionManager = sessionManager; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/CBImageServlet.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/CBImageServlet.java index 9da6e55049..62166b6975 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/CBImageServlet.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/CBImageServlet.java @@ -1,14 +1,31 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2024 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.servlets; +import io.cloudbeaver.server.CBConstants; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.eclipse.core.runtime.FileLocator; import org.jkiss.dbeaver.Log; import org.jkiss.utils.CommonUtils; import org.jkiss.utils.IOUtils; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -72,9 +89,9 @@ public class CBImageServlet extends HttpServlet { private void setExpireTime(HttpServletResponse response) { // Http 1.0 header, set a fix expires date. - response.setDateHeader("Expires", System.currentTimeMillis() + CBStaticServlet.STATIC_CACHE_SECONDS * 1000); + response.setDateHeader("Expires", System.currentTimeMillis() + CBConstants.STATIC_CACHE_SECONDS * 1000); // Http 1.1 header, set a time after now. - response.setHeader("Cache-Control", "public, max-age=" + CBStaticServlet.STATIC_CACHE_SECONDS); + response.setHeader("Cache-Control", "public, max-age=" + CBConstants.STATIC_CACHE_SECONDS); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/CBStatusServlet.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/WebStatusServlet.java similarity index 87% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/CBStatusServlet.java rename to server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/WebStatusServlet.java index 78cd34091c..e8ee9395b5 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/CBStatusServlet.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/servlets/WebStatusServlet.java @@ -17,9 +17,8 @@ package io.cloudbeaver.server.servlets; import com.google.gson.stream.JsonWriter; -import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.server.CBConstants; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.WebAppUtils; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServletRequest; @@ -34,9 +33,9 @@ import java.util.LinkedHashMap; import java.util.Map; @WebServlet(urlPatterns = "/status") -public class CBStatusServlet extends DefaultServlet { +public class WebStatusServlet extends DefaultServlet { - private static final Log log = Log.getLog(CBStatusServlet.class); + private static final Log log = Log.getLog(WebStatusServlet.class); @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { @@ -46,7 +45,7 @@ public class CBStatusServlet extends DefaultServlet { infoMap.put("health", "ok"); infoMap.put("product.name", GeneralUtils.getProductName()); infoMap.put("product.version", GeneralUtils.getProductVersion().toString()); - CBPlatform.getInstance().getApplication().getStatusInfo(infoMap); + WebAppUtils.getWebApplication().getStatusInfo(infoMap); try (JsonWriter writer = new JsonWriter(response.getWriter())) { JSONUtils.serializeMap(writer, infoMap); } 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 b99ff76e93..55bbc7ce2b 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 @@ -55,7 +55,7 @@ public class CBEventsWebSocket extends CBAbstractWebSocket implements CBWebSessi @Override public void onWebSocketText(String message) { super.onWebSocketText(message); - var clientEvent = gson.fromJson(message, WSClientEvent.class); + var clientEvent = CBAbstractWebSocket.gson.fromJson(message, WSClientEvent.class); var clientEventType = WSClientEventType.valueById(clientEvent.getId()); if (clientEventType == null) { webSession.addSessionError( 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 06cd85f1c1..99641357ba 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 @@ -16,11 +16,11 @@ */ package io.cloudbeaver.server.websockets; -import io.cloudbeaver.server.AppWebSessionManager; import io.cloudbeaver.model.session.BaseWebSession; import io.cloudbeaver.model.session.WebHeadlessSession; import io.cloudbeaver.model.session.WebHttpRequestInfo; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.WebAppSessionManager; +import io.cloudbeaver.server.WebAppUtils; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.websocket.server.ServerUpgradeRequest; @@ -42,12 +42,12 @@ import java.util.concurrent.CopyOnWriteArrayList; public class CBJettyWebSocketManager implements WebSocketCreator { private static final Log log = Log.getLog(CBJettyWebSocketManager.class); private final Map> socketBySessionId = new ConcurrentHashMap<>(); - private final AppWebSessionManager webSessionManager; + private final WebAppSessionManager webSessionManager; - public CBJettyWebSocketManager(@NotNull AppWebSessionManager webSessionManager) { + public CBJettyWebSocketManager(@NotNull WebAppSessionManager webSessionManager) { this.webSessionManager = webSessionManager; - new WebSocketPingPongJob(CBPlatform.getInstance(), this).scheduleMonitor(); + new WebSocketPingPongJob(WebAppUtils.getWebPlatform(), this).scheduleMonitor(); } @Nullable diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/WebSocketPingPongJob.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/WebSocketPingPongJob.java index 16ff010560..6409f09d0e 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/WebSocketPingPongJob.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/WebSocketPingPongJob.java @@ -16,7 +16,7 @@ */ package io.cloudbeaver.server.websockets; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.BaseWebPlatform; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.jkiss.dbeaver.model.runtime.AbstractJob; @@ -27,10 +27,10 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; */ class WebSocketPingPongJob extends AbstractJob { private static final int INTERVAL = 1000 * 60 * 1; // once per 1 min - private final CBPlatform platform; + private final BaseWebPlatform platform; private final CBJettyWebSocketManager webSocketManager; - public WebSocketPingPongJob(CBPlatform platform, CBJettyWebSocketManager webSocketManager) { + public WebSocketPingPongJob(BaseWebPlatform platform, CBJettyWebSocketManager webSocketManager) { super("WebSocket monitor"); this.platform = platform; setUser(false); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/DBWServiceBindingWebSocket.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/DBWServiceBindingWebSocket.java index 9d62ef7a5f..47c2718825 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/DBWServiceBindingWebSocket.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/DBWServiceBindingWebSocket.java @@ -16,12 +16,12 @@ */ package io.cloudbeaver.service; -import io.cloudbeaver.model.app.WebApplication; +import io.cloudbeaver.model.app.ServletApplication; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; -public interface DBWServiceBindingWebSocket extends DBWServiceBinding { - default boolean isApplicable(@NotNull WebApplication application) { +public interface DBWServiceBindingWebSocket extends DBWServiceBinding { + default boolean isApplicable(@NotNull ServletApplication application) { return true; } 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 e6609823b2..ef883e09e8 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 @@ -21,12 +21,13 @@ import graphql.schema.idl.SchemaParser; import graphql.schema.idl.TypeDefinitionRegistry; import io.cloudbeaver.*; import io.cloudbeaver.model.WebConnectionInfo; +import io.cloudbeaver.model.app.ServletApplication; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.model.session.WebSessionProvider; -import io.cloudbeaver.server.CBApplication; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.WebAppUtils; import io.cloudbeaver.server.graphql.GraphQLEndpoint; import io.cloudbeaver.service.security.SMUtils; +import io.cloudbeaver.utils.ServletAppUtils; import io.cloudbeaver.utils.WebDataSourceUtils; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -103,12 +104,12 @@ public abstract class WebServiceBindingBase impleme } protected static WebSession getWebSession(DataFetchingEnvironment env) throws DBWebException { - return CBPlatform.getInstance().getSessionManager().getWebSession( + return WebAppUtils.getWebApplication().getSessionManager().getWebSession( getServletRequest(env), getServletResponse(env)); } protected static WebSession getWebSession(DataFetchingEnvironment env, boolean errorOnNotFound) throws DBWebException { - return CBPlatform.getInstance().getSessionManager().getWebSession( + return WebAppUtils.getWebApplication().getSessionManager().getWebSession( getServletRequest(env), getServletResponse(env), errorOnNotFound); } @@ -126,12 +127,12 @@ public abstract class WebServiceBindingBase impleme */ @Nullable public static WebSession findWebSession(DataFetchingEnvironment env) { - return CBPlatform.getInstance().getSessionManager().findWebSession( + return WebAppUtils.getWebApplication().getSessionManager().findWebSession( getServletRequest(env)); } public static WebSession findWebSession(DataFetchingEnvironment env, boolean errorOnNotFound) throws DBWebException { - return CBPlatform.getInstance().getSessionManager().findWebSession( + return WebAppUtils.getWebApplication().getSessionManager().findWebSession( getServletRequest(env), errorOnNotFound); } @@ -242,16 +243,17 @@ public abstract class WebServiceBindingBase impleme private void checkServicePermissions(Method method, WebActionSet actionSet) throws DBWebException { String[] features = actionSet.requireFeatures(); + ServletApplication servletApplication = ServletAppUtils.getServletApplication(); for (String feature : features) { - if (!CBApplication.getInstance().isConfigurationMode() && - !CBApplication.getInstance().getAppConfiguration().isFeatureEnabled(feature)) { + if (!servletApplication.isConfigurationMode() && + !servletApplication.getAppConfiguration().isFeatureEnabled(feature)) { throw new DBWebException("Feature " + feature + " is disabled"); } } } private void checkActionPermissions(@NotNull Method method, @NotNull WebAction webAction) throws DBWebException { - var application = CBPlatform.getInstance().getApplication(); + var application = WebAppUtils.getWebPlatform().getApplication(); if (application.isInitializationMode() && webAction.initializationRequired()) { String message = "Server initialization in progress: " + String.join(",", application.getInitActions().values()) + ".\nDo not restart the server."; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceServletBase.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceServletBase.java index 3768ff0617..6fed8c03fb 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceServletBase.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceServletBase.java @@ -18,18 +18,17 @@ package io.cloudbeaver.service; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import io.cloudbeaver.model.app.WebApplication; +import io.cloudbeaver.model.app.ServletApplication; import io.cloudbeaver.model.session.WebSession; -import io.cloudbeaver.server.CBApplication; -import io.cloudbeaver.server.CBPlatform; -import org.jkiss.dbeaver.DBException; -import org.jkiss.dbeaver.Log; -import org.jkiss.dbeaver.model.data.json.JSONUtils; - +import io.cloudbeaver.server.WebAppUtils; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.model.data.json.JSONUtils; + import java.io.IOException; import java.lang.reflect.Type; import java.util.Map; @@ -44,19 +43,19 @@ public abstract class WebServiceServletBase extends HttpServlet { .setPrettyPrinting() .create(); - private final WebApplication application; + private final ServletApplication application; - public WebServiceServletBase(WebApplication application) { + public WebServiceServletBase(ServletApplication application) { this.application = application; } - public WebApplication getApplication() { + public ServletApplication getApplication() { return application; } @Override protected final void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - WebSession webSession = CBPlatform.getInstance().getSessionManager().findWebSession(request); + WebSession webSession = WebAppUtils.getWebApplication().getSessionManager().findWebSession(request); if (webSession == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Web session not found"); return; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/WebServiceBindingCore.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/WebServiceBindingCore.java index ea6b0264b8..6f416ec19b 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/WebServiceBindingCore.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/WebServiceBindingCore.java @@ -24,7 +24,9 @@ import io.cloudbeaver.WebServiceUtils; import io.cloudbeaver.model.WebConnectionConfig; import io.cloudbeaver.model.WebNetworkHandlerConfigInput; import io.cloudbeaver.model.session.WebSession; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.BaseWebPlatform; +import io.cloudbeaver.server.WebAppSessionManager; +import io.cloudbeaver.server.WebAppUtils; import io.cloudbeaver.server.graphql.GraphQLEndpoint; import io.cloudbeaver.service.DBWBindingContext; import io.cloudbeaver.service.WebServiceBindingBase; @@ -48,8 +50,7 @@ public class WebServiceBindingCore extends WebServiceBindingBase @Override public void bindWiring(DBWBindingContext model) throws DBWebException { - CBPlatform platform = CBPlatform.getInstance(); - var sessionManager = platform.getSessionManager(); + WebAppSessionManager sessionManager = WebAppUtils.getWebApplication().getSessionManager(); model.getQueryType() .dataFetcher("serverConfig", env -> getService(env).getServerConfig()) .dataFetcher("productSettings", env -> getService(env).getProductSettings(getWebSession(env))) 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 22f0166156..60f4edbb33 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 @@ -19,14 +19,15 @@ package io.cloudbeaver.service.core.impl; import io.cloudbeaver.*; import io.cloudbeaver.model.*; +import io.cloudbeaver.model.app.ServletApplication; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.registry.WebHandlerRegistry; import io.cloudbeaver.registry.WebSessionHandlerDescriptor; -import io.cloudbeaver.server.CBApplication; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.WebAppUtils; +import io.cloudbeaver.server.WebApplication; import io.cloudbeaver.service.core.DBWServiceCore; import io.cloudbeaver.service.security.SMUtils; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import io.cloudbeaver.utils.WebConnectionFolderUtils; import io.cloudbeaver.utils.WebDataSourceUtils; import io.cloudbeaver.utils.WebEventUtils; @@ -76,13 +77,13 @@ public class WebServiceCore implements DBWServiceCore { @Override public WebServerConfig getServerConfig() { - return new WebServerConfig(WebAppUtils.getWebApplication()); + return WebAppUtils.getWebApplication().getWebServerConfig(); } @Override public List getDriverList(@NotNull WebSession webSession, String driverId) { List result = new ArrayList<>(); - for (DBPDriver driver : CBPlatform.getInstance().getApplicableDrivers()) { + for (DBPDriver driver : WebAppUtils.getWebPlatform().getApplicableDrivers()) { if (driverId == null || driverId.equals(driver.getFullId())) { result.add(new WebDatabaseDriverInfo(webSession, driver)); } @@ -139,7 +140,7 @@ public class WebServiceCore implements DBWServiceCore { for (DBPDataSourceContainer ds : dsRegistry.getDataSources()) { if (ds.isTemplate()) { - if (CBPlatform.getInstance().getApplicableDrivers().contains(ds.getDriver())) { + if (WebAppUtils.getWebPlatform().getApplicableDrivers().contains(ds.getDriver())) { result.add(new WebDataSourceConfig(ds)); } else { log.debug("Template datasource '" + ds.getName() + "' ignored - driver is not applicable"); @@ -178,7 +179,7 @@ public class WebServiceCore implements DBWServiceCore { for (DBPDataSourceContainer ds : registry.getDataSources()) { if (ds.isTemplate() && project.getDataSourceFilter().filter(ds) && - CBPlatform.getInstance().getApplicableDrivers().contains(ds.getDriver())) { + WebAppUtils.getWebPlatform().getApplicableDrivers().contains(ds.getDriver())) { result.add(new WebConnectionInfo(webSession, ds)); } } @@ -211,7 +212,7 @@ public class WebServiceCore implements DBWServiceCore { @Override public String[] getSessionPermissions(@NotNull WebSession webSession) throws DBWebException { - if (WebAppUtils.getWebApplication().isConfigurationMode()) { + if (ServletAppUtils.getServletApplication().isConfigurationMode()) { return new String[]{ DBWConstants.PERMISSION_ADMIN }; @@ -266,7 +267,7 @@ public class WebServiceCore implements DBWServiceCore { @Override public boolean closeSession(HttpServletRequest request) throws DBWebException { try { - var baseWebSession = CBPlatform.getInstance().getSessionManager().closeSession(request); + var baseWebSession = WebAppUtils.getWebApplication().getSessionManager().closeSession(request); if (baseWebSession instanceof WebSession webSession) { for (WebSessionHandlerDescriptor hd : WebHandlerRegistry.getInstance().getSessionHandlers()) { try { @@ -287,14 +288,14 @@ public class WebServiceCore implements DBWServiceCore { @Override @Deprecated public boolean touchSession(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) throws DBWebException { - return CBPlatform.getInstance().getSessionManager().touchSession(request, response); + return WebAppUtils.getWebApplication().getSessionManager().touchSession(request, response); } @Override @Deprecated public WebSession updateSession(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) throws DBWebException { - var sessionManager = CBPlatform.getInstance().getSessionManager(); + var sessionManager = WebAppUtils.getWebApplication().getSessionManager(); sessionManager.touchSession(request, response); return sessionManager.getWebSession(request, response, true); } @@ -302,7 +303,7 @@ public class WebServiceCore implements DBWServiceCore { @Override public boolean refreshSessionConnections(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) throws DBWebException { - WebSession session = CBPlatform.getInstance().getSessionManager().getWebSession(request, response); + WebSession session = WebAppUtils.getWebApplication().getSessionManager().getWebSession(request, response); if (session == null) { return false; } else { @@ -439,7 +440,7 @@ public class WebServiceCore implements DBWServiceCore { var rmProject = project.getRMProject(); if (rmProject.getType() == RMProjectType.USER && !webSession.hasPermission(DBWConstants.PERMISSION_ADMIN) - && !WebAppUtils.getWebApplication().getAppConfiguration().isSupportsCustomConnections() + && !ServletAppUtils.getServletApplication().getAppConfiguration().isSupportsCustomConnections() ) { throw new DBWebException("New connection create is restricted by server configuration"); } @@ -615,8 +616,11 @@ public class WebServiceCore implements DBWServiceCore { DBPDataSourceRegistry projectRegistry = webSession.getSingletonProject().getDataSourceRegistry(); DBPDataSourceContainer newDataSource = projectRegistry.createDataSource(dataSourceTemplate); - ((DataSourceDescriptor) newDataSource).setNavigatorSettings( - CBApplication.getInstance().getAppConfiguration().getDefaultNavigatorSettings()); + ServletApplication app = ServletAppUtils.getServletApplication(); + if (app instanceof WebApplication webApplication) { + ((DataSourceDescriptor) newDataSource).setNavigatorSettings( + webApplication.getAppConfiguration().getDefaultNavigatorSettings()); + } if (!CommonUtils.isEmpty(connectionName)) { newDataSource.setName(connectionName); @@ -655,8 +659,11 @@ public class WebServiceCore implements DBWServiceCore { DBPDataSourceContainer newDataSource = dataSourceRegistry.createDataSource(dataSourceTemplate); - ((DataSourceDescriptor) newDataSource).setNavigatorSettings( - CBApplication.getInstance().getAppConfiguration().getDefaultNavigatorSettings()); + ServletApplication app = ServletAppUtils.getServletApplication(); + if (app instanceof WebApplication webApplication) { + ((DataSourceDescriptor) newDataSource).setNavigatorSettings( + webApplication.getAppConfiguration().getDefaultNavigatorSettings()); + } // Copy props from config if (!CommonUtils.isEmpty(config.getName())) { @@ -859,7 +866,7 @@ public class WebServiceCore implements DBWServiceCore { @Override public List getProjects(@NotNull WebSession session) { var customConnectionsEnabled = - WebAppUtils.getWebApplication().getAppConfiguration().isSupportsCustomConnections() + ServletAppUtils.getServletApplication().getAppConfiguration().isSupportsCustomConnections() || SMUtils.isRMAdmin(session); return session.getAccessibleProjects().stream() .map(pr -> new WebProjectInfo(session, pr, customConnectionsEnabled)) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLDataLOBReceiver.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLDataLOBReceiver.java index 2d3a9e5fa5..58efd34698 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLDataLOBReceiver.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLDataLOBReceiver.java @@ -16,9 +16,9 @@ */ package io.cloudbeaver.service.sql; -import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.server.CBConstants; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; @@ -36,7 +36,8 @@ import java.text.SimpleDateFormat; public class WebSQLDataLOBReceiver extends WebSQLCellValueReceiver { private static final Log log = Log.getLog(WebSQLDataLOBReceiver.class); - public static final Path DATA_EXPORT_FOLDER = CBPlatform.getInstance().getTempFolder(new VoidProgressMonitor(), "sql-lob-files"); + public static final Path DATA_EXPORT_FOLDER = WebAppUtils.getWebPlatform().getTempFolder(new VoidProgressMonitor(), "sql-lob" + + "-files"); private final String tableName; WebSQLDataLOBReceiver(String tableName, DBSDataContainer dataContainer, int rowIndex) { @@ -63,8 +64,10 @@ public class WebSQLDataLOBReceiver extends WebSQLCellValueReceiver { fileName.append(s); exportFileName = CommonUtils.escapeFileName(fileName.toString()); byte[] binaryValue = getBinaryValue(monitor); - Number fileSizeLimit = CBApplication.getInstance().getAppConfiguration().getResourceQuota(CBConstants.QUOTA_PROP_FILE_LIMIT); - if (binaryValue.length > fileSizeLimit.longValue()) { + Number fileSizeLimit = ServletAppUtils.getServletApplication() + .getAppConfiguration() + .getResourceQuota(CBConstants.QUOTA_PROP_FILE_LIMIT); + if (fileSizeLimit != null && binaryValue.length > fileSizeLimit.longValue()) { throw new DBQuotaException( "Data export quota exceeded \n Please increase the resourceQuotas parameter in configuration", CBConstants.QUOTA_PROP_FILE_LIMIT, fileSizeLimit.longValue(), binaryValue.length diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLFileLoaderServlet.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLFileLoaderServlet.java index 34f70e363f..d70a9ab318 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLFileLoaderServlet.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLFileLoaderServlet.java @@ -20,10 +20,9 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import io.cloudbeaver.DBWebException; -import io.cloudbeaver.model.app.WebApplication; +import io.cloudbeaver.model.app.ServletApplication; import io.cloudbeaver.model.session.WebSession; -import io.cloudbeaver.server.CBApplication; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.WebAppUtils; import io.cloudbeaver.service.WebServiceServletBase; import jakarta.servlet.MultipartConfigElement; import jakarta.servlet.ServletException; @@ -61,7 +60,7 @@ public class WebSQLFileLoaderServlet extends WebServiceServletBase { .setPrettyPrinting() .create(); - public WebSQLFileLoaderServlet(WebApplication application) { + public WebSQLFileLoaderServlet(ServletApplication application) { super(application); } @@ -80,7 +79,7 @@ public class WebSQLFileLoaderServlet extends WebServiceServletBase { return; } - Path tempFolder = CBPlatform.getInstance() + Path tempFolder = WebAppUtils.getWebPlatform() .getTempFolder(session.getProgressMonitor(), TEMP_FILE_FOLDER) .resolve(session.getSessionId()); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLProcessor.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLProcessor.java index 436c67ae4c..9c5290b879 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLProcessor.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLProcessor.java @@ -20,7 +20,7 @@ import io.cloudbeaver.DBWebException; import io.cloudbeaver.model.WebConnectionInfo; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.model.session.WebSessionProvider; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.WebAppUtils; import io.cloudbeaver.server.jobs.SqlOutputLogReaderJob; import org.eclipse.jface.text.Document; import org.jkiss.code.NotNull; @@ -1149,7 +1149,7 @@ public class WebSQLProcessor implements WebSessionProvider { if (cellRow instanceof Map) { Map variables = (Map) cellRow; if (variables.get(FILE_ID) != null) { - Path path = CBPlatform.getInstance() + Path path = WebAppUtils.getWebPlatform() .getTempFolder(webSession.getProgressMonitor(), TEMP_FILE_FOLDER) .resolve(webSession.getSessionId()) .resolve(variables.get(FILE_ID).toString()); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLQueryDataReceiver.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLQueryDataReceiver.java index 3a53466590..be06c2f2c6 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLQueryDataReceiver.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLQueryDataReceiver.java @@ -17,7 +17,7 @@ package io.cloudbeaver.service.sql; import io.cloudbeaver.model.session.WebSession; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; @@ -55,7 +55,7 @@ class WebSQLQueryDataReceiver implements DBDDataReceiver { this.contextInfo = contextInfo; this.dataContainer = dataContainer; this.dataFormat = dataFormat; - rowLimit = WebAppUtils.getWebApplication() + rowLimit = ServletAppUtils.getServletApplication() .getAppConfiguration() .getResourceQuota(WebSQLConstants.QUOTA_PROP_ROW_LIMIT); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLResultServlet.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLResultServlet.java index 42652e9843..196dbc3cae 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLResultServlet.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLResultServlet.java @@ -17,10 +17,9 @@ package io.cloudbeaver.service.sql; import io.cloudbeaver.DBWebException; -import io.cloudbeaver.model.app.WebApplication; +import io.cloudbeaver.model.app.ServletApplication; import io.cloudbeaver.model.session.WebSession; -import io.cloudbeaver.server.CBApplication; -import io.cloudbeaver.server.servlets.CBStaticServlet; +import io.cloudbeaver.server.CBConstants; import io.cloudbeaver.service.WebServiceServletBase; import jakarta.servlet.MultipartConfigElement; import jakarta.servlet.ServletException; @@ -52,7 +51,7 @@ public class WebSQLResultServlet extends WebServiceServletBase { private final DBWServiceSQL sqlService; - public WebSQLResultServlet(WebApplication application, DBWServiceSQL sqlService) { + public WebSQLResultServlet(ServletApplication application, DBWServiceSQL sqlService) { super(application); this.sqlService = sqlService; } @@ -89,8 +88,8 @@ public class WebSQLResultServlet extends WebServiceServletBase { response.setHeader("Content-Type", "application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + dataFile.getFileName().toString() + "\""); response.setHeader("Content-Length", String.valueOf(Files.size(dataFile))); - response.setDateHeader("Expires", System.currentTimeMillis() + CBStaticServlet.STATIC_CACHE_SECONDS * 1000); - response.setHeader("Cache-Control", "public, max-age=" + CBStaticServlet.STATIC_CACHE_SECONDS); + response.setDateHeader("Expires", System.currentTimeMillis() + CBConstants.STATIC_CACHE_SECONDS * 1000); + response.setHeader("Cache-Control", "public, max-age=" + CBConstants.STATIC_CACHE_SECONDS); try (InputStream is = Files.newInputStream(dataFile)) { IOUtils.copyStream(is, response.getOutputStream()); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLUtils.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLUtils.java index 9bf207fa4c..45e7f42b43 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLUtils.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLUtils.java @@ -16,11 +16,11 @@ */ package io.cloudbeaver.service.sql; -import io.cloudbeaver.model.app.WebAppConfiguration; +import io.cloudbeaver.model.app.ServletAppConfiguration; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.registry.WebServiceRegistry; import io.cloudbeaver.utils.CBModelConstants; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.data.*; @@ -151,7 +151,7 @@ public class WebSQLUtils { if (ContentUtils.isTextContent(value)) { String stringValue = ContentUtils.getContentStringValue(session.getProgressMonitor(), value); int textPreviewMaxLength = CommonUtils.toInt( - WebAppUtils.getWebApplication() + ServletAppUtils.getServletApplication() .getAppConfiguration() .getResourceQuota(WebSQLConstants.QUOTA_PROP_TEXT_PREVIEW_MAX_LENGTH), WebSQLConstants.TEXT_PREVIEW_MAX_LENGTH @@ -166,7 +166,7 @@ public class WebSQLUtils { if (binaryValue != null) { byte[] previewValue = binaryValue; // gets parameters from the configuration file - WebAppConfiguration config = WebAppUtils.getWebApplication().getAppConfiguration(); + ServletAppConfiguration config = ServletAppUtils.getServletApplication().getAppConfiguration(); // the max length of the text preview int textPreviewMaxLength = CommonUtils.toInt( config.getResourceQuota( @@ -215,7 +215,7 @@ public class WebSQLUtils { */ public static Object serializeStringValue(Object value) { int textPreviewMaxLength = CommonUtils.toInt( - WebAppUtils.getWebApplication() + ServletAppUtils.getServletApplication() .getAppConfiguration() .getResourceQuota(WebSQLConstants.QUOTA_PROP_TEXT_PREVIEW_MAX_LENGTH), WebSQLConstants.TEXT_PREVIEW_MAX_LENGTH diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebServiceBindingSQL.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebServiceBindingSQL.java index 78065051a4..c183c7d350 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebServiceBindingSQL.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebServiceBindingSQL.java @@ -19,9 +19,8 @@ package io.cloudbeaver.service.sql; import graphql.schema.DataFetchingEnvironment; import io.cloudbeaver.DBWebException; import io.cloudbeaver.model.WebConnectionInfo; -import io.cloudbeaver.model.app.WebApplication; +import io.cloudbeaver.model.app.ServletApplication; import io.cloudbeaver.model.session.WebSession; -import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.service.DBWBindingContext; import io.cloudbeaver.service.DBWServiceBindingServlet; import io.cloudbeaver.service.DBWServletContext; @@ -40,7 +39,8 @@ import java.util.stream.Collectors; /** * Web service implementation */ -public class WebServiceBindingSQL extends WebServiceBindingBase implements DBWServiceBindingServlet { +public class WebServiceBindingSQL extends WebServiceBindingBase + implements DBWServiceBindingServlet { public WebServiceBindingSQL() { super(DBWServiceSQL.class, new WebServiceSQL(), "schema/service.sql.graphqls"); @@ -295,7 +295,7 @@ public class WebServiceBindingSQL extends WebServiceBindingBase i } @Override - public void addServlets(WebApplication application, DBWServletContext servletContext) throws DBException { + public void addServlets(ServletApplication application, DBWServletContext servletContext) throws DBException { servletContext.addServlet( "sqlResultValueViewer", new WebSQLResultServlet(application, getServiceImpl()), @@ -309,7 +309,7 @@ public class WebServiceBindingSQL extends WebServiceBindingBase i } @Override - public boolean isApplicable(WebApplication application) { + public boolean isApplicable(ServletApplication application) { return application.isMultiuser(); } diff --git a/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF index ebff9ca493..6d8084a110 100644 --- a/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF @@ -8,6 +8,6 @@ Bundle-Release-Date: 20241223 Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . -Require-Bundle: io.cloudbeaver.server, +Require-Bundle: io.cloudbeaver.server.ce, org.jkiss.dbeaver.registry Automatic-Module-Name: io.cloudbeaver.service.admin diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java index 51c959e209..6aaf00c790 100644 --- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java +++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java @@ -34,7 +34,7 @@ import io.cloudbeaver.server.CBPlatform; import io.cloudbeaver.service.DBWServiceServerConfigurator; import io.cloudbeaver.service.admin.*; import io.cloudbeaver.service.security.SMUtils; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; @@ -269,7 +269,7 @@ public class WebServiceAdmin implements DBWServiceAdmin { if (grantor == null) { throw new DBWebException("Cannot grant team in anonymous mode"); } - if (!WebAppUtils.getWebApplication().isDistributed() + if (!ServletAppUtils.getServletApplication().isDistributed() && CommonUtils.equalObjects(user, webSession.getUser().getUserId()) ) { throw new DBWebException("You cannot edit your own permissions"); @@ -289,7 +289,7 @@ public class WebServiceAdmin implements DBWServiceAdmin { if (grantor == null) { throw new DBWebException("Cannot revoke team in anonymous mode"); } - if (!WebAppUtils.getWebApplication().isDistributed() && + if (!ServletAppUtils.getServletApplication().isDistributed() && CommonUtils.equalObjects(user, webSession.getUser().getUserId()) ) { throw new DBWebException("You cannot edit your own permissions"); diff --git a/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF index f1ff27028a..2adf45bc86 100644 --- a/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF @@ -8,6 +8,6 @@ Bundle-Release-Date: 20241223 Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . -Require-Bundle: io.cloudbeaver.server +Require-Bundle: io.cloudbeaver.server.ce Automatic-Module-Name: io.cloudbeaver.service.auth Export-Package: io.cloudbeaver.service.auth diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/DBWServiceAuth.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/DBWServiceAuth.java index ee691566de..12d1266369 100644 --- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/DBWServiceAuth.java +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/DBWServiceAuth.java @@ -20,8 +20,8 @@ import io.cloudbeaver.DBWebException; import io.cloudbeaver.WebAction; import io.cloudbeaver.model.WebPropertyInfo; import io.cloudbeaver.model.session.WebSession; -import io.cloudbeaver.model.user.WebAuthProviderInfo; import io.cloudbeaver.service.DBWService; +import io.cloudbeaver.service.auth.model.user.WebAuthProviderInfo; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/RPSessionHandler.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/RPSessionHandler.java index 767823b4c3..7544f4ad8a 100644 --- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/RPSessionHandler.java +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/RPSessionHandler.java @@ -19,14 +19,14 @@ package io.cloudbeaver.service.auth; import io.cloudbeaver.DBWebException; import io.cloudbeaver.auth.SMAuthProviderExternal; import io.cloudbeaver.auth.provider.rp.RPAuthProvider; -import io.cloudbeaver.model.app.WebAuthConfiguration; +import io.cloudbeaver.model.app.ServletAuthConfiguration; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.model.session.WebSessionAuthProcessor; import io.cloudbeaver.registry.WebAuthProviderDescriptor; import io.cloudbeaver.registry.WebAuthProviderRegistry; import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.service.DBWSessionHandler; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.jkiss.code.NotNull; @@ -43,10 +43,9 @@ import org.jkiss.utils.CommonUtils; import java.io.IOException; import java.text.MessageFormat; -import java.util.*; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class RPSessionHandler implements DBWSessionHandler { @@ -57,7 +56,8 @@ public class RPSessionHandler implements DBWSessionHandler { public boolean handleSessionOpen(WebSession webSession, HttpServletRequest request, HttpServletResponse response) throws DBException, IOException { boolean configMode = CBApplication.getInstance().isConfigurationMode(); //checks if the app is not in configuration mode and reverse proxy auth is enabled in the config file - WebAuthConfiguration appConfiguration = (WebAuthConfiguration) WebAppUtils.getWebApplication().getAppConfiguration(); + ServletAuthConfiguration appConfiguration = (ServletAuthConfiguration) ServletAppUtils.getServletApplication() + .getAppConfiguration(); boolean isReverseProxyAuthEnabled = appConfiguration.isAuthProviderEnabled(RPAuthProvider.AUTH_PROVIDER); if (!configMode && isReverseProxyAuthEnabled) { reverseProxyAuthentication(request, webSession); @@ -72,7 +72,7 @@ public class RPSessionHandler implements DBWSessionHandler { throw new DBWebException("Auth provider " + RPAuthProvider.AUTH_PROVIDER + " not found"); } SMAuthProviderExternal authProviderExternal = (SMAuthProviderExternal) authProvider.getInstance(); - SMAuthProviderCustomConfiguration configuration = WebAppUtils.getWebAuthApplication() + SMAuthProviderCustomConfiguration configuration = ServletAppUtils.getAuthApplication() .getAuthConfiguration() .getAuthCustomConfigurations() .stream() diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/ReverseProxyConfigurator.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/ReverseProxyConfigurator.java index 8420f4e8ba..a73ebcb294 100644 --- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/ReverseProxyConfigurator.java +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/ReverseProxyConfigurator.java @@ -17,10 +17,10 @@ package io.cloudbeaver.service.auth; import io.cloudbeaver.auth.provider.rp.RPAuthProvider; -import io.cloudbeaver.model.app.WebAppConfiguration; -import io.cloudbeaver.model.app.WebApplication; -import io.cloudbeaver.model.app.WebAuthApplication; -import io.cloudbeaver.model.app.WebServerConfiguration; +import io.cloudbeaver.model.app.ServletAppConfiguration; +import io.cloudbeaver.model.app.ServletApplication; +import io.cloudbeaver.model.app.ServletAuthApplication; +import io.cloudbeaver.model.app.ServletServerConfiguration; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.service.DBWServiceServerConfigurator; import org.jkiss.code.NotNull; @@ -37,15 +37,15 @@ public class ReverseProxyConfigurator implements DBWServiceServerConfigurator { @Override public void configureServer( - @NotNull WebApplication application, + @NotNull ServletApplication application, @Nullable WebSession session, - @NotNull WebServerConfiguration serverConfiguration, - @NotNull WebAppConfiguration appConfig + @NotNull ServletServerConfiguration serverConfiguration, + @NotNull ServletAppConfiguration appConfig ) throws DBException { } @Override - public void migrateConfigurationIfNeeded(@NotNull WebApplication application) throws DBException { + public void migrateConfigurationIfNeeded(@NotNull ServletApplication application) throws DBException { if (migrationNotNeeded(application)) { return; } @@ -53,14 +53,14 @@ public class ReverseProxyConfigurator implements DBWServiceServerConfigurator { } @Override - public void reloadConfiguration(@NotNull WebAppConfiguration appConfig) throws DBException { + public void reloadConfiguration(@NotNull ServletAppConfiguration appConfig) throws DBException { } private void migrateConfiguration( - @NotNull WebApplication application + @NotNull ServletApplication application ) { - if (!(application instanceof WebAuthApplication authApplication)) { + if (!(application instanceof ServletAuthApplication authApplication)) { return; } @@ -90,8 +90,8 @@ public class ReverseProxyConfigurator implements DBWServiceServerConfigurator { } } - private boolean migrationNotNeeded(@NotNull WebApplication application) { - if (!(application instanceof WebAuthApplication authApplication)) { + private boolean migrationNotNeeded(@NotNull ServletApplication application) { + if (!(application instanceof ServletAuthApplication authApplication)) { return true; } 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 44b780a3b5..e8e008afba 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 @@ -21,11 +21,10 @@ import io.cloudbeaver.WebServiceUtils; import io.cloudbeaver.auth.SMSignOutLinkProvider; import io.cloudbeaver.auth.provider.local.LocalAuthProvider; import io.cloudbeaver.model.WebPropertyInfo; -import io.cloudbeaver.model.app.WebAppConfiguration; +import io.cloudbeaver.model.app.ServletAppConfiguration; import io.cloudbeaver.model.session.WebAuthInfo; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.model.session.WebSessionAuthProcessor; -import io.cloudbeaver.model.user.WebAuthProviderInfo; import io.cloudbeaver.model.user.WebUser; import io.cloudbeaver.registry.WebAuthProviderDescriptor; import io.cloudbeaver.registry.WebAuthProviderRegistry; @@ -35,6 +34,7 @@ import io.cloudbeaver.service.auth.DBWServiceAuth; import io.cloudbeaver.service.auth.WebAuthStatus; import io.cloudbeaver.service.auth.WebLogoutInfo; import io.cloudbeaver.service.auth.WebUserInfo; +import io.cloudbeaver.service.auth.model.user.WebAuthProviderInfo; import io.cloudbeaver.service.security.SMUtils; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; @@ -190,7 +190,7 @@ public class WebServiceAuthImpl implements DBWServiceAuth { @Override public WebUserInfo activeUser(@NotNull WebSession webSession) throws DBWebException { if (webSession.getUser() == null) { - WebAppConfiguration appConfiguration = webSession.getApplication().getAppConfiguration(); + ServletAppConfiguration appConfiguration = webSession.getApplication().getAppConfiguration(); if (!appConfiguration.isAnonymousAccessEnabled()) { return null; } diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/local/LocalServletHandler.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/local/LocalServletHandler.java index 42d2024e83..4771f6a417 100644 --- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/local/LocalServletHandler.java +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/local/LocalServletHandler.java @@ -17,9 +17,10 @@ package io.cloudbeaver.service.auth.local; import io.cloudbeaver.model.session.WebSession; +import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.server.CBPlatform; import io.cloudbeaver.server.actions.AbstractActionServletHandler; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import jakarta.servlet.Servlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -40,9 +41,9 @@ public class LocalServletHandler extends AbstractActionServletHandler { @Override public boolean handleRequest(Servlet servlet, HttpServletRequest request, HttpServletResponse response) throws DBException, IOException { - if (URI_PREFIX.equals(WebAppUtils.removeSideSlashes(request.getServletPath()))) { + if (URI_PREFIX.equals(ServletAppUtils.removeSideSlashes(request.getServletPath()))) { try { - WebSession webSession = CBPlatform.getInstance().getSessionManager().getWebSession(request, response, true); + WebSession webSession = CBApplication.getInstance().getSessionManager().getWebSession(request, response, true); createActionFromParams(webSession, request, response); return true; } catch (Exception e) { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebAuthProviderInfo.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/model/user/WebAuthProviderInfo.java similarity index 91% rename from server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebAuthProviderInfo.java rename to server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/model/user/WebAuthProviderInfo.java index 242bf2d79c..90257b64e6 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebAuthProviderInfo.java +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/model/user/WebAuthProviderInfo.java @@ -14,16 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.cloudbeaver.model.user; +package io.cloudbeaver.service.auth.model.user; import io.cloudbeaver.WebServiceUtils; import io.cloudbeaver.auth.SMAuthProviderFederated; import io.cloudbeaver.auth.provisioning.SMProvisioner; -import io.cloudbeaver.model.config.CBAppConfig; +import io.cloudbeaver.model.app.ServletAuthConfiguration; import io.cloudbeaver.registry.WebAuthProviderConfiguration; import io.cloudbeaver.registry.WebAuthProviderDescriptor; import io.cloudbeaver.server.CBApplication; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.WebAppUtils; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.security.SMAuthCredentialsProfile; import org.jkiss.dbeaver.model.security.SMAuthProviderCustomConfiguration; @@ -65,8 +65,8 @@ public class WebAuthProviderInfo { } public boolean isDefaultProvider() { - if (CBPlatform.getInstance().getApplication().getAppConfiguration() instanceof CBAppConfig cbAppConfig) { - return descriptor.getId().equals(cbAppConfig.getDefaultAuthProvider()); + if (WebAppUtils.getWebApplication().getAppConfiguration() instanceof ServletAuthConfiguration authConfiguration) { + return descriptor.getId().equals(authConfiguration.getDefaultAuthProvider()); } return false; } diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF index 5eac42de91..f45c27c1c7 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF @@ -8,7 +8,7 @@ Bundle-Release-Date: 20241223 Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . -Require-Bundle: io.cloudbeaver.server, +Require-Bundle: io.cloudbeaver.server.ce, org.jkiss.dbeaver.data.transfer, org.jkiss.dbeaver.registry Automatic-Module-Name: io.cloudbeaver.service.data.transfer diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferImportServlet.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferImportServlet.java index f645d07404..553855a195 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferImportServlet.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferImportServlet.java @@ -21,9 +21,10 @@ import io.cloudbeaver.DBWebException; import io.cloudbeaver.model.WebAsyncTaskInfo; import io.cloudbeaver.model.WebConnectionInfo; import io.cloudbeaver.model.session.WebSession; -import io.cloudbeaver.server.CBApplication; +import io.cloudbeaver.server.BaseWebPlatform; import io.cloudbeaver.server.CBConstants; -import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.server.WebAppUtils; +import io.cloudbeaver.server.WebApplication; import io.cloudbeaver.service.WebServiceServletBase; import io.cloudbeaver.service.data.transfer.DBWServiceDataTransfer; import io.cloudbeaver.service.sql.WebSQLContextInfo; @@ -55,7 +56,7 @@ public class WebDataTransferImportServlet extends WebServiceServletBase { DBWServiceDataTransfer dbwServiceDataTransfer; - public WebDataTransferImportServlet(CBApplication application, DBWServiceDataTransfer dbwServiceDataTransfer) { + public WebDataTransferImportServlet(WebApplication application, DBWServiceDataTransfer dbwServiceDataTransfer) { super(application); this.dbwServiceDataTransfer = dbwServiceDataTransfer; } @@ -71,7 +72,8 @@ public class WebDataTransferImportServlet extends WebServiceServletBase { return; } if ("POST".equalsIgnoreCase(request.getMethod())) { - Path tempFolder = CBPlatform.getInstance().getTempFolder(session.getProgressMonitor(), CBPlatform.TEMP_FILE_IMPORT_FOLDER); + Path tempFolder = WebAppUtils.getWebPlatform().getTempFolder(session.getProgressMonitor(), + BaseWebPlatform.TEMP_FILE_IMPORT_FOLDER); MultipartConfigElement MULTI_PART_CONFIG = new MultipartConfigElement(tempFolder.toString()); request.setAttribute(ECLIPSE_JETTY_MULTIPART_CONFIG, MULTI_PART_CONFIG); diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferServlet.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferServlet.java index 073cbc38a8..e5af5f39a9 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferServlet.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferServlet.java @@ -18,7 +18,7 @@ package io.cloudbeaver.service.data.transfer.impl; import io.cloudbeaver.DBWebException; import io.cloudbeaver.model.session.WebSession; -import io.cloudbeaver.server.CBApplication; +import io.cloudbeaver.server.WebApplication; import io.cloudbeaver.service.WebServiceServletBase; import io.cloudbeaver.service.data.transfer.DBWServiceDataTransfer; import jakarta.servlet.http.HttpServletRequest; @@ -42,7 +42,7 @@ public class WebDataTransferServlet extends WebServiceServletBase { private final DBWServiceDataTransfer dtManager; - public WebDataTransferServlet(CBApplication application, DBWServiceDataTransfer dtManager) { + public WebDataTransferServlet(WebApplication application, DBWServiceDataTransfer dtManager) { super(application); this.dtManager = dtManager; } diff --git a/server/bundles/io.cloudbeaver.service.fs/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.fs/META-INF/MANIFEST.MF index 3b38e865fd..3c7019f38a 100644 --- a/server/bundles/io.cloudbeaver.service.fs/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.fs/META-INF/MANIFEST.MF @@ -8,6 +8,6 @@ Bundle-Release-Date: 20241223 Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . -Require-Bundle: io.cloudbeaver.server, +Require-Bundle: io.cloudbeaver.server.ce, io.cloudbeaver.service.admin Automatic-Module-Name: io.cloudbeaver.service.fs diff --git a/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/RMNavigatorModelExtender.java b/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/RMNavigatorModelExtender.java index b8cb650c4b..b39b3951cb 100644 --- a/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/RMNavigatorModelExtender.java +++ b/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/RMNavigatorModelExtender.java @@ -18,7 +18,7 @@ package io.cloudbeaver.service.rm; import io.cloudbeaver.model.rm.DBNResourceManagerRoot; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.model.navigator.DBNModelExtender; import org.jkiss.dbeaver.model.navigator.DBNNode; @@ -28,7 +28,9 @@ public class RMNavigatorModelExtender implements DBNModelExtender { @Override public DBNNode[] getExtraNodes(@NotNull DBNNode parentNode) { - if (parentNode instanceof DBNRoot && WebAppUtils.getWebApplication().getAppConfiguration().isResourceManagerEnabled()) { + if (parentNode instanceof DBNRoot && ServletAppUtils.getServletApplication() + .getAppConfiguration() + .isResourceManagerEnabled()) { return createRMNodes((DBNRoot) parentNode); } else { return null; diff --git a/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/impl/WebServiceRM.java b/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/impl/WebServiceRM.java index 4c412ecbd8..82da13d2b7 100644 --- a/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/impl/WebServiceRM.java +++ b/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/impl/WebServiceRM.java @@ -23,7 +23,7 @@ import io.cloudbeaver.service.rm.DBWServiceRM; import io.cloudbeaver.service.rm.model.RMProjectPermissions; import io.cloudbeaver.service.rm.model.RMSubjectProjectPermissions; import io.cloudbeaver.service.security.SMUtils; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import io.cloudbeaver.utils.WebEventUtils; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; @@ -254,7 +254,7 @@ public class WebServiceRM implements DBWServiceRM { try { RMProject rmProject = getResourceController(session).createProject(name, description); session.addSessionProject(rmProject.getId()); - WebAppUtils.getWebApplication().getEventController().addEvent( + ServletAppUtils.getServletApplication().getEventController().addEvent( WSProjectUpdateEvent.create(session.getSessionId(), session.getUserId(), rmProject.getId()) ); return rmProject; @@ -276,7 +276,7 @@ public class WebServiceRM implements DBWServiceRM { } getResourceController(session).deleteProject(projectId); session.removeSessionProject(projectId); - WebAppUtils.getWebApplication().getEventController().addEvent( + ServletAppUtils.getServletApplication().getEventController().addEvent( WSProjectUpdateEvent.delete(session.getSessionId(), session.getUserId(), projectId) ); return true; diff --git a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/CBEmbeddedSecurityController.java b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/CBEmbeddedSecurityController.java index 4f0e988446..ee21cd8165 100644 --- a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/CBEmbeddedSecurityController.java +++ b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/CBEmbeddedSecurityController.java @@ -21,8 +21,8 @@ import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import io.cloudbeaver.DBWConstants; import io.cloudbeaver.auth.*; -import io.cloudbeaver.model.app.WebAuthApplication; -import io.cloudbeaver.model.app.WebAuthConfiguration; +import io.cloudbeaver.model.app.ServletAuthApplication; +import io.cloudbeaver.model.app.ServletAuthConfiguration; import io.cloudbeaver.model.config.SMControllerConfiguration; import io.cloudbeaver.registry.WebAuthProviderDescriptor; import io.cloudbeaver.registry.WebAuthProviderRegistry; @@ -68,7 +68,7 @@ import java.util.stream.Collectors; /** * Server controller */ -public class CBEmbeddedSecurityController +public class CBEmbeddedSecurityController implements SMAdminController, SMAuthenticationManager { private static final Log log = Log.getLog(CBEmbeddedSecurityController.class); @@ -1082,7 +1082,7 @@ public class CBEmbeddedSecurityController WebMetaParametersRegistry.getInstance().getMetaParameters(subjectType)); // Add metas from enabled auth providers - WebAuthConfiguration authConfiguration = application.getAuthConfiguration(); + ServletAuthConfiguration authConfiguration = application.getAuthConfiguration(); for (String apId : authConfiguration.getEnabledAuthProviders()) { WebAuthProviderDescriptor ap = WebAuthProviderRegistry.getInstance().getAuthProvider(apId); if (ap != null) { @@ -2650,7 +2650,7 @@ public class CBEmbeddedSecurityController @Override public SMAuthProviderDescriptor[] getAvailableAuthProviders() throws DBException { - WebAuthConfiguration appConfiguration = application.getAuthConfiguration(); + ServletAuthConfiguration appConfiguration = application.getAuthConfiguration(); Set customConfigurations = appConfiguration.getAuthCustomConfigurations(); List providers = WebAuthProviderRegistry.getInstance().getAuthProviders().stream() .filter(ap -> @@ -3217,7 +3217,7 @@ public class CBEmbeddedSecurityController } private boolean isProviderDisabled(@NotNull String providerId, @Nullable String authConfigurationId) { - WebAuthConfiguration appConfiguration = application.getAuthConfiguration(); + ServletAuthConfiguration appConfiguration = application.getAuthConfiguration(); if (!appConfiguration.isAuthProviderEnabled(providerId)) { return true; } diff --git a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/EmbeddedSecurityControllerFactory.java b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/EmbeddedSecurityControllerFactory.java index 1b1a7405fa..8528ee1a9a 100644 --- a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/EmbeddedSecurityControllerFactory.java +++ b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/EmbeddedSecurityControllerFactory.java @@ -17,7 +17,7 @@ package io.cloudbeaver.service.security; import io.cloudbeaver.auth.NoAuthCredentialsProvider; -import io.cloudbeaver.model.app.WebAuthApplication; +import io.cloudbeaver.model.app.ServletAuthApplication; import io.cloudbeaver.model.config.SMControllerConfiguration; import io.cloudbeaver.model.config.WebDatabaseConfig; import io.cloudbeaver.service.security.db.CBDatabase; @@ -29,7 +29,7 @@ import org.jkiss.dbeaver.model.auth.SMCredentialsProvider; /** * Embedded Security Controller Factory */ -public class EmbeddedSecurityControllerFactory { +public class EmbeddedSecurityControllerFactory { private static volatile CBDatabase DB_INSTANCE; public static CBDatabase getDbInstance() { diff --git a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/db/CBDatabase.java b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/db/CBDatabase.java index 4a40e1ca49..fb12e0b8b8 100644 --- a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/db/CBDatabase.java +++ b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/db/CBDatabase.java @@ -20,11 +20,11 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.Strictness; import io.cloudbeaver.auth.provider.local.LocalAuthProviderConstants; -import io.cloudbeaver.model.app.WebApplication; +import io.cloudbeaver.model.app.ServletApplication; import io.cloudbeaver.model.config.WebDatabaseConfig; import io.cloudbeaver.registry.WebAuthProviderDescriptor; import io.cloudbeaver.registry.WebAuthProviderRegistry; -import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.ServletAppUtils; import org.apache.commons.dbcp2.*; import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; @@ -83,7 +83,7 @@ public class CBDatabase { private static final String V1_DB_NAME = "cb.h2.dat"; private static final String V2_DB_NAME = "cb.h2v2.dat"; - private final WebApplication application; + private final ServletApplication application; private final WebDatabaseConfig databaseConfiguration; private PoolingDataSource cbDataSource; private transient volatile Connection exclusiveConnection; @@ -92,7 +92,7 @@ public class CBDatabase { private SMAdminController adminSecurityController; private SQLDialect dialect; - public CBDatabase(WebApplication application, WebDatabaseConfig databaseConfiguration) { + public CBDatabase(ServletApplication application, WebDatabaseConfig databaseConfiguration) { this.application = application; this.databaseConfiguration = databaseConfiguration; } @@ -299,7 +299,7 @@ public class CBDatabase { return null; } - initialDataPath = WebAppUtils.getRelativePath( + initialDataPath = ServletAppUtils.getRelativePath( databaseConfiguration.getInitialDataConfiguration(), application.getHomeDirectory()); try (Reader reader = new InputStreamReader(new FileInputStream(initialDataPath), StandardCharsets.UTF_8)) { Gson gson = new GsonBuilder() @@ -591,7 +591,7 @@ public class CBDatabase { } public static boolean isDefaultH2Configuration(WebDatabaseConfig databaseConfiguration) { - var workspace = WebAppUtils.getWebApplication().getWorkspaceDirectory(); + var workspace = ServletAppUtils.getServletApplication().getWorkspaceDirectory(); var v1Path = workspace.resolve(".data").resolve(V1_DB_NAME); var v2Path = workspace.resolve(".data").resolve(V2_DB_NAME); var v1DefaultUrl = "jdbc:h2:" + v1Path; @@ -604,7 +604,7 @@ public class CBDatabase { return databaseConfiguration; } - protected WebApplication getApplication() { + protected ServletApplication getApplication() { return application; } diff --git a/server/bundles/pom.xml b/server/bundles/pom.xml index 4cd1b54263..fa644299fe 100644 --- a/server/bundles/pom.xml +++ b/server/bundles/pom.xml @@ -15,6 +15,7 @@ io.cloudbeaver.model io.cloudbeaver.server + io.cloudbeaver.server.ce io.cloudbeaver.slf4j io.cloudbeaver.service.admin diff --git a/server/features/io.cloudbeaver.server.feature/feature.xml b/server/features/io.cloudbeaver.server.feature/feature.xml index c9c4d37b8c..5a9b9df769 100644 --- a/server/features/io.cloudbeaver.server.feature/feature.xml +++ b/server/features/io.cloudbeaver.server.feature/feature.xml @@ -31,6 +31,7 @@ + diff --git a/server/test/io.cloudbeaver.test.platform/META-INF/MANIFEST.MF b/server/test/io.cloudbeaver.test.platform/META-INF/MANIFEST.MF index 29e094999e..32943d4c31 100644 --- a/server/test/io.cloudbeaver.test.platform/META-INF/MANIFEST.MF +++ b/server/test/io.cloudbeaver.test.platform/META-INF/MANIFEST.MF @@ -20,6 +20,7 @@ Require-Bundle: org.eclipse.core.runtime, org.jkiss.bundle.jetty.websocket, io.cloudbeaver.model, io.cloudbeaver.server, + io.cloudbeaver.server.ce, io.cloudbeaver.resources.drivers.base, io.cloudbeaver.product.ce, io.cloudbeaver.service.auth, diff --git a/server/test/io.cloudbeaver.test.platform/src/io/cloudbeaver/model/rm/lock/TestLockController.java b/server/test/io.cloudbeaver.test.platform/src/io/cloudbeaver/model/rm/lock/TestLockController.java index f1fd252d5f..e92ae0e314 100644 --- a/server/test/io.cloudbeaver.test.platform/src/io/cloudbeaver/model/rm/lock/TestLockController.java +++ b/server/test/io.cloudbeaver.test.platform/src/io/cloudbeaver/model/rm/lock/TestLockController.java @@ -16,17 +16,17 @@ */ package io.cloudbeaver.model.rm.lock; -import io.cloudbeaver.model.app.WebApplication; +import io.cloudbeaver.model.app.ServletApplication; import org.jkiss.dbeaver.DBException; import java.nio.file.Path; public class TestLockController extends RMFileLockController { - public TestLockController(WebApplication application) throws DBException { + public TestLockController(ServletApplication application) throws DBException { super(application); } - public TestLockController(WebApplication application, int maxTimeout) throws DBException { + public TestLockController(ServletApplication application, int maxTimeout) throws DBException { super(application, maxTimeout); }