diff --git a/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF
index 72a1fe2221..d3f160a993 100644
--- a/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF
+++ b/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF
@@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2
Bundle-Vendor: %Bundle-Vendor
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: io.cloudbeaver.model;singleton:=true
-Bundle-Version: 1.0.14.qualifier
-Bundle-Release-Date: 20221010
+Bundle-Version: 1.0.15.qualifier
+Bundle-Release-Date: 20221024
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
diff --git a/server/bundles/io.cloudbeaver.model/pom.xml b/server/bundles/io.cloudbeaver.model/pom.xml
index e96dbcf6e4..42ebb6ef69 100644
--- a/server/bundles/io.cloudbeaver.model/pom.xml
+++ b/server/bundles/io.cloudbeaver.model/pom.xml
@@ -10,7 +10,7 @@
../
io.cloudbeaver.model
- 1.0.14-SNAPSHOT
+ 1.0.15-SNAPSHOT
eclipse-plugin
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/BaseWebApplication.java
index 4fca09f7d0..c3f4e64e59 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/BaseWebApplication.java
@@ -18,6 +18,7 @@ package io.cloudbeaver.model.app;
import io.cloudbeaver.DataSourceFilter;
import io.cloudbeaver.VirtualProjectImpl;
+import io.cloudbeaver.events.CBEventController;
import io.cloudbeaver.model.log.SLF4JLogHandler;
import io.cloudbeaver.model.rm.local.LocalResourceController;
import io.cloudbeaver.server.WebWorkspace;
@@ -198,4 +199,9 @@ public abstract class BaseWebApplication extends BaseApplicationImpl implements
throw new DBException("Error during generation instance id generation", e);
}
}
+
+ @Override
+ public CBEventController getEventController() {
+ return null;
+ }
}
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/DBNResourceManagerProject.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/DBNResourceManagerProject.java
index 127f10e8f7..0c91d030e2 100644
--- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/DBNResourceManagerProject.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/DBNResourceManagerProject.java
@@ -91,7 +91,7 @@ public class DBNResourceManagerProject extends DBNAbstractResourceManagerNode {
if (children == null) {
List rfList = new ArrayList<>();
for (RMResource resource : getResourceController().listResources(
- project.getId(), null, null, false, false, false)) {
+ project.getId(), null, null, true, false, false)) {
rfList.add(new DBNResourceManagerResource(this, resource));
}
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/DBNResourceManagerResource.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/DBNResourceManagerResource.java
index 832ccee853..1ab083835d 100644
--- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/DBNResourceManagerResource.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/DBNResourceManagerResource.java
@@ -76,7 +76,7 @@ public class DBNResourceManagerResource extends DBNAbstractResourceManagerNode {
if (children == null) {
List rfList = new ArrayList<>();
for (RMResource resource : getResourceController().listResources(
- getResourceProject().getId(), getResourceFolder(), null, false, false, false)) {
+ getResourceProject().getId(), getResourceFolder(), null, true, false, false)) {
rfList.add(new DBNResourceManagerResource(this, resource));
}
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 30105ae5a6..1082bdabcb 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
@@ -348,7 +348,7 @@ public class LocalResourceController implements RMController {
if (!folderPath.startsWith(projectPath)) {
throw new DBException("Invalid folder path");
}
- return readChildResources(projectId, folderPath, readProperties, readHistory, recursive);
+ return readChildResources(projectId, folderPath, nameMask, readProperties, readHistory, recursive);
} catch (NoSuchFileException e) {
throw new DBException("Invalid resource folder " + folder);
} catch (IOException e) {
@@ -360,14 +360,18 @@ public class LocalResourceController implements RMController {
private RMResource[] readChildResources(
@NotNull String projectId,
@NotNull Path folderPath,
+ @Nullable String nameMask,
boolean readProperties,
boolean readHistory,
boolean recursive
) throws IOException {
try (Stream files = Files.list(folderPath)) {
- return files.filter(path -> !path.getFileName().toString().startsWith(".")) // skip hidden files
+ return files.filter(path -> {
+ String fileName = path.getFileName().toString();
+ return (nameMask == null || nameMask.equals(fileName)) && !fileName.startsWith(".");
+ }) // skip hidden files
.sorted(Comparator.comparing(path -> path.getFileName().toString(), String.CASE_INSENSITIVE_ORDER))
- .map((Path path) -> makeResourceFromPath(projectId, path, readProperties, readHistory, recursive))
+ .map((Path path) -> makeResourceFromPath(projectId, path, nameMask, readProperties, readHistory, recursive))
.filter(Objects::nonNull)
.toArray(RMResource[]::new);
}
@@ -635,7 +639,7 @@ public class LocalResourceController implements RMController {
for (var resourceName : relativeResourcePath) {
resourcePath = resourcePath.resolve(resourceName);
- result.add(makeResourceFromPath(projectId, resourcePath, false, false, recursive));
+ result.add(makeResourceFromPath(projectId, resourcePath, null, false, false, recursive));
}
return result;
@@ -644,6 +648,7 @@ public class LocalResourceController implements RMController {
private RMResource makeResourceFromPath(
@NotNull String projectId,
@NotNull Path path,
+ @Nullable String nameMask,
boolean readProperties,
boolean readHistory,
boolean recursive
@@ -691,7 +696,7 @@ public class LocalResourceController implements RMController {
if (recursive && resource.isFolder()) {
try {
- resource.setChildren(readChildResources(projectId, path, readProperties, readHistory, true));
+ resource.setChildren(readChildResources(projectId, path, nameMask, readProperties, readHistory, true));
} catch (IOException e) {
log.error(e);
}
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 350d1f11e8..d8eeedb840 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
@@ -161,7 +161,7 @@ public class WebSessionAuthProcessor {
providerConfig,
authAttrs);
- if (!configMode && securityController.getUserPermissions(userId, authInfo.getAuthRole()).isEmpty()) {
+ if (!configMode && securityController.getUserPermissions(userId).isEmpty()) {
throw new DBWebException("Access denied (no permissions)");
}
if (!configMode && !securityController.getUserById(userId).isEnabled()) {
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/user/WebUser.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/user/WebUser.java
index 5516cddb32..2d66d6d386 100644
--- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/user/WebUser.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/user/WebUser.java
@@ -88,4 +88,8 @@ public class WebUser {
public String toString() {
return user.getUserId();
}
+
+ public String getAuthRole() {
+ return user.getAuthRole();
+ }
}
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebAppUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebAppUtils.java
index 366e418f97..5c10deb362 100644
--- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebAppUtils.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebAppUtils.java
@@ -29,6 +29,7 @@ import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.auth.SMAuthenticationManager;
import org.jkiss.dbeaver.model.rm.RMProjectType;
import org.jkiss.dbeaver.runtime.DBWorkbench;
+import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.utils.CommonUtils;
import javax.servlet.http.Cookie;
@@ -91,6 +92,47 @@ public class WebAppUtils {
return resultConfig;
}
+ @SuppressWarnings("unchecked")
+ public static Map mergeConfigurationsWithVariables(Map origin, Map additional) {
+ var resultConfig = new HashMap();
+ Set rootKeys = new HashSet<>(additional.keySet());
+
+ for (var rootKey : rootKeys) {
+ var originValue = origin.get(rootKey);
+ var additionalValue = additional.get(rootKey);
+
+ if (additionalValue == null) {
+ continue;
+ }
+
+ if (originValue instanceof Map) {
+ var resultValue = mergeConfigurationsWithVariables((Map) originValue, (Map) additionalValue);
+ resultConfig.put(rootKey, resultValue);
+ } else {
+ resultConfig.put(rootKey, getExtractedValue(originValue, additionalValue));
+ }
+
+ }
+
+ return resultConfig;
+ }
+
+ public static Object getExtractedValue(Object oldValue, Object newValue) {
+ if (!(oldValue instanceof String)) {
+ return newValue;
+ }
+ String value = (String) oldValue;
+ if (!GeneralUtils.isVariablePattern(value)) {
+ return newValue;
+ }
+ String extractedVariable = GeneralUtils.extractVariableName(value);
+ if (extractedVariable != null) {
+ return GeneralUtils.variablePattern(extractedVariable + ":" + newValue);
+ } else {
+ return newValue;
+ }
+ }
+
@NotNull
public static String removeSideSlashes(String action) {
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 8aa7a218b9..ce06b1ebfd 100644
--- a/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF
+++ b/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF
@@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2
Bundle-Vendor: %Bundle-Vendor
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: io.cloudbeaver.product.ce;singleton:=true
-Bundle-Version: 22.2.2.qualifier
-Bundle-Release-Date: 20221010
+Bundle-Version: 22.2.3.qualifier
+Bundle-Release-Date: 20221024
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
diff --git a/server/bundles/io.cloudbeaver.product.ce/pom.xml b/server/bundles/io.cloudbeaver.product.ce/pom.xml
index 6c445b2d90..81578b75c0 100644
--- a/server/bundles/io.cloudbeaver.product.ce/pom.xml
+++ b/server/bundles/io.cloudbeaver.product.ce/pom.xml
@@ -10,7 +10,7 @@
../
io.cloudbeaver.product.ce
- 22.2.2-SNAPSHOT
+ 22.2.3-SNAPSHOT
eclipse-plugin
diff --git a/server/bundles/io.cloudbeaver.resources.drivers.base/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.resources.drivers.base/META-INF/MANIFEST.MF
index 438b885e24..ba6e37fc22 100644
--- a/server/bundles/io.cloudbeaver.resources.drivers.base/META-INF/MANIFEST.MF
+++ b/server/bundles/io.cloudbeaver.resources.drivers.base/META-INF/MANIFEST.MF
@@ -2,8 +2,8 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Base JDBC drivers
Bundle-SymbolicName: io.cloudbeaver.resources.drivers.base;singleton:=true
-Bundle-Version: 1.0.59.qualifier
-Bundle-Release-Date: 20221010
+Bundle-Version: 1.0.60.qualifier
+Bundle-Release-Date: 20221024
Bundle-Vendor: DBeaver Corp
Bundle-ActivationPolicy: lazy
Automatic-Module-Name: io.cloudbeaver.resources.drivers.base
diff --git a/server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml b/server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml
index f8b03dc711..f0d16ece90 100644
--- a/server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml
+++ b/server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml
@@ -9,6 +9,6 @@
../
io.cloudbeaver.resources.drivers.base
- 1.0.59-SNAPSHOT
+ 1.0.60-SNAPSHOT
eclipse-plugin
diff --git a/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF
index d11f6ca0e6..5e33a75d1e 100644
--- a/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF
+++ b/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF
@@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2
Bundle-Vendor: %Bundle-Vendor
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: io.cloudbeaver.server;singleton:=true
-Bundle-Version: 22.2.2.qualifier
-Bundle-Release-Date: 20221010
+Bundle-Version: 22.2.3.qualifier
+Bundle-Release-Date: 20221024
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Bundle-Activator: io.cloudbeaver.server.CBPlatformActivator
diff --git a/server/bundles/io.cloudbeaver.server/pom.xml b/server/bundles/io.cloudbeaver.server/pom.xml
index cdcbd4aeee..cd4abe4d8a 100644
--- a/server/bundles/io.cloudbeaver.server/pom.xml
+++ b/server/bundles/io.cloudbeaver.server/pom.xml
@@ -10,7 +10,7 @@
../
io.cloudbeaver.server
- 22.2.2-SNAPSHOT
+ 22.2.3-SNAPSHOT
eclipse-plugin
diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBAppConfig.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBAppConfig.java
index 32028cfbcb..7682ae1a2f 100644
--- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBAppConfig.java
+++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBAppConfig.java
@@ -218,12 +218,16 @@ public class CBAppConfig extends BaseAuthWebAppConfiguration implements WebAuthC
}
public T getResourceQuota(String quotaId) {
- return (T) resourceQuotas.get(quotaId);
+ Object quota = resourceQuotas.get(quotaId);
+ if (quota instanceof String) {
+ quota = CommonUtils.toDouble(quota);
+ }
+ return (T) quota;
}
public T getResourceQuota(String quotaId, T defaultValue) {
if (resourceQuotas.containsKey(quotaId)) {
- return (T) resourceQuotas.get(quotaId);
+ return (T) getResourceQuota(quotaId);
} else {
return defaultValue;
}
diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java
index 5a82b7b2de..d2c34c78c0 100644
--- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java
+++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java
@@ -112,6 +112,7 @@ public class CBApplication extends BaseWebApplication implements WebAuthApplicat
protected final Map databaseConfiguration = new HashMap<>();
private final CBAppConfig appConfiguration = new CBAppConfig();
private Map externalProperties = new LinkedHashMap<>();
+ private Map originalConfigurationProperties = new LinkedHashMap<>();
// Persistence
private SMAdminController securityController;
@@ -650,13 +651,11 @@ public class CBApplication extends BaseWebApplication implements WebAuthApplicat
Map configProps = new LinkedHashMap<>();
if (configFile.exists()) {
log.debug("Read configuration [" + configFile.getAbsolutePath() + "]");
- try (Reader reader = new InputStreamReader(new FileInputStream(configFile), StandardCharsets.UTF_8)) {
- configProps.putAll(JSONUtils.parseMap(getGson(), reader));
- patchConfigurationWithProperties(configProps); // patch original properties
+ // saves original configuration file
+ this.originalConfigurationProperties.putAll(readConfigurationFile(configFile));
- } catch (IOException e) {
- throw new DBException("Error parsing server configuration", e);
- }
+ configProps.putAll(readConfigurationFile(configFile));
+ patchConfigurationWithProperties(configProps); // patch original properties
}
readAdditionalConfiguration(configProps);
@@ -682,6 +681,14 @@ public class CBApplication extends BaseWebApplication implements WebAuthApplicat
return configProps;
}
+ public Map readConfigurationFile(File configFile) throws DBException {
+ try (Reader reader = new InputStreamReader(new FileInputStream(configFile), StandardCharsets.UTF_8)) {
+ return JSONUtils.parseMap(getGson(), reader);
+ } catch (IOException e) {
+ throw new DBException("Error parsing server configuration", e);
+ }
+ }
+
private Gson getGson() {
// Stupid way to populate existing objects but ok google (https://github.com/google/gson/issues/431)
InstanceCreator appConfigCreator = type -> appConfiguration;
@@ -875,36 +882,57 @@ public class CBApplication extends BaseWebApplication implements WebAuthApplicat
Map rootConfig = new LinkedHashMap<>();
{
var serverConfigProperties = new LinkedHashMap();
+ var originServerConfig = getServerConfigProps(this.originalConfigurationProperties); // get server properties from original configuration file
rootConfig.put("server", serverConfigProperties);
if (!CommonUtils.isEmpty(newServerName)) {
- serverConfigProperties.put(CBConstants.PARAM_SERVER_NAME, newServerName);
+ copyConfigValue(originServerConfig, serverConfigProperties, CBConstants.PARAM_SERVER_NAME, newServerName);
}
if (!CommonUtils.isEmpty(newServerURL)) {
- serverConfigProperties.put(CBConstants.PARAM_SERVER_URL, newServerURL);
+ copyConfigValue(
+ originServerConfig, serverConfigProperties, CBConstants.PARAM_SERVER_URL, newServerURL);
}
if (sessionExpireTime > 0) {
- serverConfigProperties.put(CBConstants.PARAM_SESSION_EXPIRE_PERIOD, sessionExpireTime);
+ copyConfigValue(
+ originServerConfig, serverConfigProperties, CBConstants.PARAM_SESSION_EXPIRE_PERIOD, sessionExpireTime);
}
-
+ var databaseConfigProperties = new LinkedHashMap();
+ Map oldRuntimeDBConfig = JSONUtils.getObject(originServerConfig, CBConstants.PARAM_DB_CONFIGURATION);
if (!CommonUtils.isEmpty(databaseConfiguration)) {
- serverConfigProperties.put(CBConstants.PARAM_DB_CONFIGURATION, databaseConfiguration);
+ for (Map.Entry mp : databaseConfiguration.entrySet()) {
+ copyConfigValue(oldRuntimeDBConfig, databaseConfigProperties, mp.getKey(), mp.getValue());
+ }
+ serverConfigProperties.put(CBConstants.PARAM_DB_CONFIGURATION, databaseConfigProperties);
}
}
{
var appConfigProperties = new LinkedHashMap();
+ Map oldAppConfig = JSONUtils.getObject(this.originalConfigurationProperties, "app");
rootConfig.put("app", appConfigProperties);
- appConfigProperties.put("anonymousAccessEnabled", appConfig.isAnonymousAccessEnabled());
- appConfigProperties.put("supportsCustomConnections", appConfig.isSupportsCustomConnections());
- appConfigProperties.put("publicCredentialsSaveEnabled", appConfig.isPublicCredentialsSaveEnabled());
- appConfigProperties.put("adminCredentialsSaveEnabled", appConfig.isAdminCredentialsSaveEnabled());
- appConfigProperties.put("enableReverseProxyAuth", appConfig.isEnabledReverseProxyAuth());
- appConfigProperties.put("forwardProxy", appConfig.isEnabledForwardProxy());
- appConfigProperties.put("linkExternalCredentialsWithUser", appConfig.isLinkExternalCredentialsWithUser());
- appConfigProperties.put("redirectOnFederatedAuth", appConfig.isRedirectOnFederatedAuth());
- appConfigProperties.put(CBConstants.PARAM_RESOURCE_MANAGER_ENABLED, appConfig.isResourceManagerEnabled());
+ copyConfigValue(
+ oldAppConfig, appConfigProperties, "anonymousAccessEnabled", appConfig.isAnonymousAccessEnabled());
+ copyConfigValue(
+ oldAppConfig, appConfigProperties, "supportsCustomConnections", appConfig.isSupportsCustomConnections());
+ copyConfigValue(
+ oldAppConfig, appConfigProperties, "publicCredentialsSaveEnabled", appConfig.isPublicCredentialsSaveEnabled());
+ copyConfigValue(
+ oldAppConfig, appConfigProperties, "adminCredentialsSaveEnabled", appConfig.isAdminCredentialsSaveEnabled());
+ copyConfigValue(
+ oldAppConfig, appConfigProperties, "enableReverseProxyAuth", appConfig.isEnabledReverseProxyAuth());
+ copyConfigValue(
+ oldAppConfig, appConfigProperties, "forwardProxy", appConfig.isEnabledForwardProxy());
+ copyConfigValue(
+ oldAppConfig, appConfigProperties, "linkExternalCredentialsWithUser", appConfig.isLinkExternalCredentialsWithUser());
+ copyConfigValue(
+ oldAppConfig, appConfigProperties, "redirectOnFederatedAuth", appConfig.isRedirectOnFederatedAuth());
+ copyConfigValue(
+ oldAppConfig, appConfigProperties, CBConstants.PARAM_RESOURCE_MANAGER_ENABLED, appConfig.isResourceManagerEnabled());
- Map resourceQuotas = appConfig.getResourceQuotas();
+ Map resourceQuotas = new LinkedHashMap<>();
+ Map originResourceQuotas = JSONUtils.getObject(oldAppConfig, CBConstants.PARAM_RESOURCE_QUOTAS);
+ for (Map.Entry mp : appConfig.getResourceQuotas().entrySet()) {
+ copyConfigValue(originResourceQuotas, resourceQuotas, mp.getKey(), mp.getValue());
+ }
appConfigProperties.put(CBConstants.PARAM_RESOURCE_QUOTAS, resourceQuotas);
{
@@ -1003,11 +1031,32 @@ public class CBApplication extends BaseWebApplication implements WebAuthApplicat
protected WebSessionManager createSessionManager() {
return new WebSessionManager(this);
}
+
@NotNull
public WebDriverRegistry getDriverRegistry() {
return WebDriverRegistry.getInstance();
}
+ public Set getAvailableAuthRoles() {
+ return Set.of();
+ }
+
+ // gets info about patterns from original configuration file and saves it to runtime config
+ private void copyConfigValue(Map oldConfig, Map newConfig, String key, Object defaultValue) {
+ Object value = oldConfig.get(key);
+ if (value instanceof Map && defaultValue instanceof Map) {
+ Map subValue = new LinkedHashMap<>();
+ Map oldConfigValue = JSONUtils.getObject(oldConfig, key);
+ for (Map.Entry entry : oldConfigValue.entrySet()) {
+ copyConfigValue(oldConfigValue, subValue, entry.getKey(), ((Map) defaultValue).get(entry.getKey()));
+ }
+ newConfig.put(key, subValue);
+ } else {
+ Object newConfigValue = WebAppUtils.getExtractedValue(oldConfig.get(key), defaultValue);
+ newConfig.put(key, newConfigValue);
+ }
+ }
+
@Override
public CBEventController getEventController() {
return eventController;
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 5b86fb7b5a..7dba9a5676 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
@@ -179,6 +179,7 @@ public class WebServiceBindingCore extends WebServiceBindingBase
model.getRuntimeWiring().type(TypeRuntimeWiring.newTypeWiring("AsyncTaskResult").typeResolver(TypeResolutionEnvironment::getObject)
);
+
}
private WebConnectionConfig getConnectionConfig(DataFetchingEnvironment env) {
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 66e5caa766..3e2eae1248 100644
--- a/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF
+++ b/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF
@@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2
Bundle-Vendor: %Bundle-Vendor
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: io.cloudbeaver.service.admin;singleton:=true
-Bundle-Version: 1.0.58.qualifier
-Bundle-Release-Date: 20221010
+Bundle-Version: 1.0.59.qualifier
+Bundle-Release-Date: 20221024
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
diff --git a/server/bundles/io.cloudbeaver.service.admin/pom.xml b/server/bundles/io.cloudbeaver.service.admin/pom.xml
index 0be2e7c495..76000d72e9 100644
--- a/server/bundles/io.cloudbeaver.service.admin/pom.xml
+++ b/server/bundles/io.cloudbeaver.service.admin/pom.xml
@@ -10,7 +10,7 @@
../
io.cloudbeaver.service.admin
- 1.0.58-SNAPSHOT
+ 1.0.59-SNAPSHOT
eclipse-plugin
diff --git a/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls b/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls
index 8c09fe4183..bba8667b9c 100644
--- a/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls
+++ b/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls
@@ -42,6 +42,7 @@ type AdminUserInfo {
linkedAuthProviders: [String!]!
enabled: Boolean!
+ authRole: String
}
type AdminTeamInfo {
@@ -118,8 +119,9 @@ extend type Query {
listUsers(userId: ID): [AdminUserInfo!]!
listTeams(teamId: ID): [AdminTeamInfo!]!
listPermissions: [AdminPermissionInfo!]!
+ listAuthRoles: [String!]!
- createUser(userId: ID!, enabled: Boolean!): AdminUserInfo!
+ createUser(userId: ID!, enabled: Boolean!, authRole: String): AdminUserInfo!
deleteUser(userId: ID!): Boolean
createTeam(teamId: ID!, teamName: String, description: String): AdminTeamInfo!
@@ -135,6 +137,8 @@ extend type Query {
enableUser(userId: ID!, enabled: Boolean!): Boolean
+ setUserAuthRole(userId: ID!, authRole: String): Boolean
+
#### Connection management
# All connection configurations
diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminUserInfo.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminUserInfo.java
index c542cbed51..ab8dae7a28 100644
--- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminUserInfo.java
+++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminUserInfo.java
@@ -54,6 +54,11 @@ public class AdminUserInfo {
return user.getUserId();
}
+ @Property
+ public String getAuthRole() {
+ return user.getAuthRole();
+ }
+
@Property
public Map getMetaParameters() {
return user.getMetaParameters();
diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/DBWServiceAdmin.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/DBWServiceAdmin.java
index b9c79e360a..249090e947 100644
--- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/DBWServiceAdmin.java
+++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/DBWServiceAdmin.java
@@ -33,6 +33,7 @@ import org.jkiss.dbeaver.model.security.SMDataSourceGrant;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Web service API
@@ -53,7 +54,15 @@ public interface DBWServiceAdmin extends DBWService {
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
@NotNull
- AdminUserInfo createUser(@NotNull WebSession webSession, String userName, @NotNull Boolean enabled) throws DBWebException;
+ AdminUserInfo createUser(
+ @NotNull WebSession webSession,
+ String userName,
+ @NotNull Boolean enabled,
+ @Nullable String authRole
+ ) throws DBWebException;
+
+ @WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
+ Set listAuthRoles();
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
boolean deleteUser(@NotNull WebSession webSession, String userName) throws DBWebException;
@@ -164,18 +173,28 @@ public interface DBWServiceAdmin extends DBWService {
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
SMDataSourceGrant[] getSubjectConnectionAccess(@NotNull WebSession webSession, @NotNull String subjectId) throws DBWebException;
+
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
- boolean setSubjectConnectionAccess(@NotNull WebSession webSession, @NotNull String subjectId, @NotNull List connections) throws DBWebException;
+ boolean setSubjectConnectionAccess(@NotNull WebSession webSession, @NotNull String subjectId, @NotNull List connections) throws
+ DBWebException;
////////////////////////////////////////////////////////////////////
// User meta parameters
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
- WebPropertyInfo saveUserMetaParameter(WebSession webSession, String id, String displayName, String description, Boolean required) throws DBWebException;
+ WebPropertyInfo saveUserMetaParameter(WebSession webSession, String id, String displayName, String description, Boolean required) throws
+ DBWebException;
+
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
Boolean deleteUserMetaParameter(WebSession webSession, String id) throws DBWebException;
+
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
Boolean setUserMetaParameterValues(WebSession webSession, String userId, Map parameters) throws DBWebException;
+
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
Boolean enableUser(WebSession webSession, String userId, Boolean enabled) throws DBWebException;
+
+ @WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
+ Boolean setUserAuthRole(WebSession webSession, String userId, String authRole) throws DBWebException;
+
}
diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java
index a3cb6190b3..16bc85d87f 100644
--- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java
+++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java
@@ -49,8 +49,15 @@ public class WebServiceBindingAdmin extends WebServiceBindingBase getService(env).listTeams(getWebSession(env), env.getArgument("teamId")))
.dataFetcher("listPermissions",
env -> getService(env).listPermissions(getWebSession(env)))
+ .dataFetcher("listAuthRoles",
+ env -> getService(env).listAuthRoles())
.dataFetcher("createUser",
- env -> getService(env).createUser(getWebSession(env), env.getArgument("userId"), env.getArgument("enabled")))
+ env -> getService(env).createUser(
+ getWebSession(env),
+ env.getArgument("userId"),
+ env.getArgument("enabled"),
+ env.getArgument("authRole")
+ ))
.dataFetcher("deleteUser",
env -> getService(env).deleteUser(getWebSession(env), env.getArgument("userId")))
.dataFetcher("createTeam",
@@ -78,6 +85,8 @@ public class WebServiceBindingAdmin extends WebServiceBindingBase getService(env).setUserCredentials(getWebSession(env), env.getArgument("userId"), env.getArgument("providerId"), env.getArgument("credentials")))
.dataFetcher("enableUser",
env -> getService(env).enableUser(getWebSession(env), env.getArgument("userId"), env.getArgument("enabled")))
+ .dataFetcher("setUserAuthRole",
+ env -> getService(env).setUserAuthRole(getWebSession(env), env.getArgument("userId"), env.getArgument("authRole")))
.dataFetcher("allConnections", env -> getService(env).getAllConnections(getWebSession(env), env.getArgument("id")))
.dataFetcher("searchConnections", env -> getService(env).searchConnections(getWebSession(env), env.getArgument("hostNames")))
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 50efb32b68..0071eacfa3 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
@@ -126,7 +126,12 @@ public class WebServiceAdmin implements DBWServiceAdmin {
@NotNull
@Override
- public AdminUserInfo createUser(@NotNull WebSession webSession, String userName, @NotNull Boolean enabled) throws DBWebException {
+ public AdminUserInfo createUser(
+ @NotNull WebSession webSession,
+ String userName,
+ @NotNull Boolean enabled,
+ @Nullable String authRole
+ ) throws DBWebException {
if (userName.isEmpty()) {
throw new DBWebException("Empty user name");
}
@@ -134,7 +139,7 @@ public class WebServiceAdmin implements DBWServiceAdmin {
try {
var securityController = webSession.getAdminSecurityController();
- securityController.createUser(userName, Map.of(), enabled);
+ securityController.createUser(userName, Map.of(), enabled, authRole);
var smUser = securityController.getUserById(userName);
return new AdminUserInfo(webSession, new WebUser(smUser));
} catch (Exception e) {
@@ -142,6 +147,11 @@ public class WebServiceAdmin implements DBWServiceAdmin {
}
}
+ @Override
+ public Set listAuthRoles() {
+ return CBApplication.getInstance().getAvailableAuthRoles();
+ }
+
@Override
public boolean deleteUser(@NotNull WebSession webSession, String userName) throws DBWebException {
if (CommonUtils.equalObjects(userName, webSession.getUser().getUserId())) {
@@ -320,6 +330,16 @@ public class WebServiceAdmin implements DBWServiceAdmin {
}
}
+ @Override
+ public Boolean setUserAuthRole(WebSession webSession, String userId, String authRole) throws DBWebException {
+ try {
+ webSession.getAdminSecurityController().setUserAuthRole(userId, authRole);
+ return true;
+ } catch (Exception e) {
+ throw new DBWebException("Error updating user auth role", e);
+ }
+ }
+
////////////////////////////////////////////////////////////////////
// Connection management
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 78934cdcd1..91447178bc 100644
--- a/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF
+++ b/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF
@@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2
Bundle-Vendor: %Bundle-Vendor
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: io.cloudbeaver.service.auth;singleton:=true
-Bundle-Version: 1.0.58.qualifier
-Bundle-Release-Date: 20221010
+Bundle-Version: 1.0.59.qualifier
+Bundle-Release-Date: 20221024
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
diff --git a/server/bundles/io.cloudbeaver.service.auth/pom.xml b/server/bundles/io.cloudbeaver.service.auth/pom.xml
index 930c9b182c..1510e56ca5 100644
--- a/server/bundles/io.cloudbeaver.service.auth/pom.xml
+++ b/server/bundles/io.cloudbeaver.service.auth/pom.xml
@@ -10,7 +10,7 @@
../
io.cloudbeaver.service.auth
- 1.0.58-SNAPSHOT
+ 1.0.59-SNAPSHOT
eclipse-plugin
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 b2e515129c..4e21e0bb72 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
@@ -40,6 +40,7 @@ public interface DBWServiceAuth extends DBWService {
@Nullable Map credentials,
boolean linkWithActiveUser) throws DBWebException;
+
@WebAction(requirePermissions = {})
WebAuthStatus authUpdateStatus(@NotNull WebSession webSession, @NotNull String authId, boolean linkWithActiveUser) throws DBWebException;
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 6fd56d9109..fe461b1c60 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
@@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2
Bundle-Vendor: %Bundle-Vendor
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: io.cloudbeaver.service.data.transfer;singleton:=true
-Bundle-Version: 1.0.59.qualifier
-Bundle-Release-Date: 20221010
+Bundle-Version: 1.0.60.qualifier
+Bundle-Release-Date: 20221024
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/pom.xml b/server/bundles/io.cloudbeaver.service.data.transfer/pom.xml
index 19cecf90ca..1f0ff5340b 100644
--- a/server/bundles/io.cloudbeaver.service.data.transfer/pom.xml
+++ b/server/bundles/io.cloudbeaver.service.data.transfer/pom.xml
@@ -10,7 +10,7 @@
../
io.cloudbeaver.service.data.transfer
- 1.0.59-SNAPSHOT
+ 1.0.60-SNAPSHOT
eclipse-plugin
diff --git a/server/bundles/io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF
index 7d170f98ec..b71384b988 100644
--- a/server/bundles/io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF
+++ b/server/bundles/io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF
@@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2
Bundle-Vendor: %Bundle-Vendor
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: io.cloudbeaver.service.metadata;singleton:=true
-Bundle-Version: 1.0.62.qualifier
-Bundle-Release-Date: 20221010
+Bundle-Version: 1.0.63.qualifier
+Bundle-Release-Date: 20221024
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
diff --git a/server/bundles/io.cloudbeaver.service.metadata/pom.xml b/server/bundles/io.cloudbeaver.service.metadata/pom.xml
index b7987e6180..41b83c47ff 100644
--- a/server/bundles/io.cloudbeaver.service.metadata/pom.xml
+++ b/server/bundles/io.cloudbeaver.service.metadata/pom.xml
@@ -10,7 +10,7 @@
../
io.cloudbeaver.service.metadata
- 1.0.62-SNAPSHOT
+ 1.0.63-SNAPSHOT
eclipse-plugin
diff --git a/server/bundles/io.cloudbeaver.service.rm/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.rm/META-INF/MANIFEST.MF
index f90034f190..cb1284689e 100644
--- a/server/bundles/io.cloudbeaver.service.rm/META-INF/MANIFEST.MF
+++ b/server/bundles/io.cloudbeaver.service.rm/META-INF/MANIFEST.MF
@@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2
Bundle-Vendor: %Bundle-Vendor
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: io.cloudbeaver.service.rm;singleton:=true
-Bundle-Version: 1.0.11.qualifier
-Bundle-Release-Date: 20221010
+Bundle-Version: 1.0.12.qualifier
+Bundle-Release-Date: 20221024
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
diff --git a/server/bundles/io.cloudbeaver.service.rm/pom.xml b/server/bundles/io.cloudbeaver.service.rm/pom.xml
index 146e8f8a54..70574f8780 100644
--- a/server/bundles/io.cloudbeaver.service.rm/pom.xml
+++ b/server/bundles/io.cloudbeaver.service.rm/pom.xml
@@ -10,7 +10,7 @@
../
io.cloudbeaver.service.rm
- 1.0.11-SNAPSHOT
+ 1.0.12-SNAPSHOT
eclipse-plugin
diff --git a/server/bundles/io.cloudbeaver.service.rm/schema/service.rm.graphqls b/server/bundles/io.cloudbeaver.service.rm/schema/service.rm.graphqls
index d8c15e30c7..310319066d 100644
--- a/server/bundles/io.cloudbeaver.service.rm/schema/service.rm.graphqls
+++ b/server/bundles/io.cloudbeaver.service.rm/schema/service.rm.graphqls
@@ -15,6 +15,8 @@ type RMResource {
name: String!
folder: Boolean!
length: Int!
+ # Properties map
+ properties: Object
}
input RMSubjectProjectPermissions {
@@ -90,4 +92,5 @@ extend type Mutation {
rmSetSubjectProjectPermissions(subjectId: String!, permissions: [RMProjectPermissions!]!): Boolean!
+ rmSetResourceProperty(projectId: String!, resourcePath: String!, name: ID!, value: String): Boolean!
}
\ No newline at end of file
diff --git a/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/DBWServiceRM.java b/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/DBWServiceRM.java
index 1e2b1c1297..c277cf30e7 100644
--- a/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/DBWServiceRM.java
+++ b/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/DBWServiceRM.java
@@ -58,6 +58,25 @@ public interface DBWServiceRM extends DBWService {
boolean readProperties,
boolean readHistory) throws DBException;
+ /**
+ * Sets resource property.
+ *
+ * @param webSession the web session
+ * @param projectId the project id
+ * @param resourcePath the resource path
+ * @param propertyName the property name
+ * @param propertyValue the property value
+ * @return the resource property
+ * @throws DBException the db exception
+ */
+ @WebProjectAction(requireProjectPermissions = RMConstants.PERMISSION_PROJECT_RESOURCE_EDIT)
+ String setResourceProperty(
+ @NotNull WebSession webSession,
+ @NotNull @WebObjectId String projectId,
+ @NotNull String resourcePath,
+ @NotNull String propertyName,
+ @Nullable Object propertyValue) throws DBException;
+
@WebProjectAction(
requireProjectPermissions = RMConstants.PERMISSION_PROJECT_RESOURCE_VIEW
)
diff --git a/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/WebServiceBindingRM.java b/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/WebServiceBindingRM.java
index 794557dc2d..d4b24f5d4e 100644
--- a/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/WebServiceBindingRM.java
+++ b/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/WebServiceBindingRM.java
@@ -81,7 +81,6 @@ public class WebServiceBindingRM extends WebServiceBindingBase {
env.getArgument("resourcePath"),
env.getArgument("data"),
env.getArgument("forceOverwrite")))
-
.dataFetcher("rmCreateProject", env -> getService(env).createProject(
getWebSession(env),
env.getArgument("projectName"),
@@ -96,12 +95,18 @@ public class WebServiceBindingRM extends WebServiceBindingBase {
env.getArgument("projectId"),
new RMSubjectProjectPermissions(env.getArgument("permissions"))
))
+ .dataFetcher("rmSetResourceProperty", env -> getService(env).setResourceProperty(
+ getWebSession(env),
+ env.getArgument("projectId"),
+ env.getArgument("resourcePath"),
+ env.getArgument("name"),
+ env.getArgument("value")
+ ))
.dataFetcher("rmSetSubjectProjectPermissions", env -> getService(env).setSubjectProjectPermissions(
getWebSession(env),
env.getArgument("subjectId"),
new RMProjectPermissions(env.getArgument("permissions"))
))
;
-
}
}
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 35e7adca28..5b8864e406 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
@@ -43,7 +43,7 @@ import java.util.Set;
public class WebServiceRM implements DBWServiceRM {
@Override
- public RMProject[] listProjects(WebSession webSession) throws DBWebException {
+ public RMProject[] listProjects(@NotNull WebSession webSession) throws DBWebException {
try {
return getResourceController(webSession).listAccessibleProjects();
} catch (DBException e) {
@@ -71,7 +71,13 @@ public class WebServiceRM implements DBWServiceRM {
@NotNull
@Override
- public RMResource[] listResources(WebSession webSession, @NotNull String projectId, @Nullable String folder, @Nullable String nameMask, boolean readProperties, boolean readHistory) throws DBException {
+ public RMResource[] listResources(@NotNull WebSession webSession,
+ @NotNull String projectId,
+ @Nullable String folder,
+ @Nullable String nameMask,
+ boolean readProperties,
+ boolean readHistory
+ ) throws DBException {
checkIsRmEnabled(webSession);
try {
return getResourceController(webSession).listResources(projectId, folder, nameMask, readProperties, readHistory, false);
@@ -80,8 +86,40 @@ public class WebServiceRM implements DBWServiceRM {
}
}
+ /**
+ * Sets resource property.
+ *
+ * @param webSession the web session
+ * @param projectId the project id
+ * @param resourcePath the resource path
+ * @param propertyName the property name
+ * @param propertyValue the property value
+ * @return the resource property
+ * @throws DBException the db exception
+ */
+ @NotNull
@Override
- public String readResourceAsString(@NotNull WebSession webSession, @NotNull String projectId, @NotNull String resourcePath) throws DBException {
+ public String setResourceProperty(@NotNull WebSession webSession,
+ @NotNull String projectId,
+ @NotNull String resourcePath,
+ @NotNull String propertyName,
+ @Nullable Object propertyValue
+ ) throws DBException {
+ checkIsRmEnabled(webSession);
+ try {
+ getResourceController(webSession).setResourceProperty(projectId, resourcePath, propertyName, propertyValue);
+ return Boolean.TRUE.toString();
+ } catch (DBException e) {
+ String message = String.format("Error setting property [%s] for the the resource: [%s]", resourcePath, propertyName);
+ throw new DBWebException(message, e);
+ }
+ }
+
+ @Override
+ public String readResourceAsString(@NotNull WebSession webSession,
+ @NotNull String projectId,
+ @NotNull String resourcePath
+ ) throws DBException {
checkIsRmEnabled(webSession);
try {
byte[] data = getResourceController(webSession).getResourceContents(projectId, resourcePath);
@@ -92,7 +130,11 @@ public class WebServiceRM implements DBWServiceRM {
}
@Override
- public String createResource(@NotNull WebSession webSession, @NotNull String projectId, @NotNull String resourcePath, boolean isFolder) throws DBException {
+ public String createResource(@NotNull WebSession webSession,
+ @NotNull String projectId,
+ @NotNull String resourcePath,
+ boolean isFolder
+ ) throws DBException {
checkIsRmEnabled(webSession);
try {
return getResourceController(webSession).createResource(projectId, resourcePath, isFolder);
@@ -102,7 +144,10 @@ public class WebServiceRM implements DBWServiceRM {
}
@Override
- public boolean deleteResource(@NotNull WebSession webSession, @NotNull String projectId, @NotNull String resourcePath) throws DBException {
+ public boolean deleteResource(@NotNull WebSession webSession,
+ @NotNull String projectId,
+ @NotNull String resourcePath
+ ) throws DBException {
checkIsRmEnabled(webSession);
try {
getResourceController(webSession).deleteResource(projectId, resourcePath, false);
@@ -215,7 +260,9 @@ public class WebServiceRM implements DBWServiceRM {
}
@Override
- public List listProjectGrantedPermissions(@NotNull WebSession webSession, @NotNull String projectId) throws DBWebException {
+ public List listProjectGrantedPermissions(@NotNull WebSession webSession,
+ @NotNull String projectId
+ ) throws DBWebException {
SMController sm = webSession.getSecurityController();
try {
return sm.getObjectPermissionGrants(projectId, SMObjects.PROJECT);
@@ -225,7 +272,9 @@ public class WebServiceRM implements DBWServiceRM {
}
@Override
- public List listSubjectProjectsPermissionGrants(@NotNull WebSession webSession, @NotNull String subjectId) throws DBWebException {
+ public List listSubjectProjectsPermissionGrants(@NotNull WebSession webSession,
+ @NotNull String subjectId
+ ) throws DBWebException {
try {
SMAdminController sm = webSession.getAdminSecurityController();
return sm.getSubjectObjectPermissionGrants(subjectId, SMObjects.PROJECT);
diff --git a/server/bundles/io.cloudbeaver.service.security/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.security/META-INF/MANIFEST.MF
index 1a39905013..d6b455a802 100644
--- a/server/bundles/io.cloudbeaver.service.security/META-INF/MANIFEST.MF
+++ b/server/bundles/io.cloudbeaver.service.security/META-INF/MANIFEST.MF
@@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2
Bundle-Vendor: DBeaver Security Sevice
Bundle-Vendor: DBeaver Corp
Bundle-SymbolicName: io.cloudbeaver.service.security;singleton:=true
-Bundle-Version: 1.0.14.qualifier
-Bundle-Release-Date: 20221010
+Bundle-Version: 1.0.15.qualifier
+Bundle-Release-Date: 20221024
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
diff --git a/server/bundles/io.cloudbeaver.service.security/pom.xml b/server/bundles/io.cloudbeaver.service.security/pom.xml
index 21a42a3369..65f9f5ba39 100644
--- a/server/bundles/io.cloudbeaver.service.security/pom.xml
+++ b/server/bundles/io.cloudbeaver.service.security/pom.xml
@@ -10,7 +10,7 @@
../
io.cloudbeaver.service.security
- 1.0.14-SNAPSHOT
+ 1.0.15-SNAPSHOT
eclipse-plugin
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 73c6571392..ca075801bd 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
@@ -23,11 +23,12 @@ import io.cloudbeaver.DBWConstants;
import io.cloudbeaver.auth.SMAuthProviderExternal;
import io.cloudbeaver.auth.SMWAuthProviderFederated;
import io.cloudbeaver.model.app.WebApplication;
+import io.cloudbeaver.model.app.WebAuthApplication;
import io.cloudbeaver.model.app.WebAuthConfiguration;
import io.cloudbeaver.model.session.WebAuthInfo;
import io.cloudbeaver.service.security.db.CBDatabase;
import io.cloudbeaver.service.security.internal.AuthAttemptSessionInfo;
-import io.cloudbeaver.service.security.internal.RefreshTokenInfo;
+import io.cloudbeaver.service.security.internal.SMTokenInfo;
import io.cloudbeaver.utils.WebAppUtils;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
@@ -78,14 +79,14 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
}.getType();
private static final Gson gson = new GsonBuilder().create();
- protected final WebApplication application;
+ protected final WebAuthApplication application;
protected final CBDatabase database;
protected final SMCredentialsProvider credentialsProvider;
- private final SMControllerConfiguration smConfig;
+ protected final SMControllerConfiguration smConfig;
public CBEmbeddedSecurityController(
- WebApplication application,
+ WebAuthApplication application,
CBDatabase database,
SMCredentialsProvider credentialsProvider,
SMControllerConfiguration smConfig
@@ -113,17 +114,29 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
// Users
@Override
- public void createUser(String userId, Map metaParameters, boolean enabled) throws DBException {
+ public void createUser(
+ @NotNull String userId,
+ @Nullable Map metaParameters,
+ boolean enabled,
+ @Nullable String defaultAuthRole
+ ) throws DBException {
if (isSubjectExists(userId)) {
throw new DBCException("User or team '" + userId + "' already exists");
}
try (Connection dbCon = database.openConnection()) {
try (JDBCTransaction txn = new JDBCTransaction(dbCon)) {
createAuthSubject(dbCon, userId, SUBJECT_USER);
- try (PreparedStatement dbStat = dbCon.prepareStatement("INSERT INTO CB_USER(USER_ID,IS_ACTIVE,CREATE_TIME) VALUES(?,?,?)")) {
+ try (PreparedStatement dbStat = dbCon.prepareStatement(
+ "INSERT INTO CB_USER(USER_ID,IS_ACTIVE,CREATE_TIME,DEFAULT_AUTH_ROLE) VALUES(?,?,?,?)")
+ ) {
dbStat.setString(1, userId);
dbStat.setString(2, enabled ? CHAR_BOOL_TRUE : CHAR_BOOL_FALSE);
dbStat.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
+ if (CommonUtils.isEmpty(defaultAuthRole)) {
+ dbStat.setNull(4, Types.VARCHAR);
+ } else {
+ dbStat.setString(4, defaultAuthRole);
+ }
dbStat.execute();
}
if (!CommonUtils.isEmpty(metaParameters)) {
@@ -204,13 +217,16 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
public SMUser getUserById(String userId) throws DBException {
try (Connection dbCon = database.openConnection()) {
SMUser user;
- try (PreparedStatement dbStat = dbCon.prepareStatement("SELECT * FROM CB_USER WHERE USER_ID=?")) {
+ try (PreparedStatement dbStat = dbCon.prepareStatement(
+ "SELECT USER_ID,IS_ACTIVE,DEFAULT_AUTH_ROLE FROM CB_USER WHERE USER_ID=?"
+ )) {
dbStat.setString(1, userId);
try (ResultSet dbResult = dbStat.executeQuery()) {
if (dbResult.next()) {
String userName = dbResult.getString(1);
String active = dbResult.getString(2);
- user = new SMUser(userName, CHAR_BOOL_TRUE.equals(active));
+ String authRole = dbResult.getString(3);
+ user = new SMUser(userName, CHAR_BOOL_TRUE.equals(active), authRole);
} else {
return null;
}
@@ -251,8 +267,9 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
try (Connection dbCon = database.openConnection()) {
Map result = new LinkedHashMap<>();
// Read users
- try (PreparedStatement dbStat = dbCon.prepareStatement("SELECT * FROM CB_USER" +
- (CommonUtils.isEmpty(userNameMask) ? "\nORDER BY USER_ID" : " WHERE USER_ID=?"))) {
+ try (PreparedStatement dbStat = dbCon.prepareStatement(
+ "SELECT USER_ID,IS_ACTIVE,DEFAULT_AUTH_ROLE FROM CB_USER" +
+ (CommonUtils.isEmpty(userNameMask) ? "\nORDER BY USER_ID" : " WHERE USER_ID=?"))) {
if (!CommonUtils.isEmpty(userNameMask)) {
dbStat.setString(1, userNameMask);
}
@@ -260,7 +277,8 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
while (dbResult.next()) {
String userId = dbResult.getString(1);
String active = dbResult.getString(2);
- result.put(userId, new SMUser(userId, CHAR_BOOL_TRUE.equals(active)));
+ String authRole = dbResult.getString(3);
+ result.put(userId, new SMUser(userId, CHAR_BOOL_TRUE.equals(active), authRole));
}
}
}
@@ -403,6 +421,21 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
}
}
+ @Override
+ public void setUserAuthRole(@NotNull String userId, @Nullable String authRole) throws DBException {
+ try (Connection dbCon = database.openConnection()) {
+ try (PreparedStatement dbStat = dbCon.prepareStatement("UPDATE CB_USER SET DEFAULT_AUTH_ROLE=? WHERE USER_ID=?")) {
+ dbStat.setString(1, authRole);
+ dbStat.setString(2, userId);
+ if (dbStat.executeUpdate() <= 0) {
+ throw new SMException("User not found");
+ }
+ }
+ } catch (SQLException e) {
+ throw new DBCException("Error while updating user authentication role", e);
+ }
+ }
+
///////////////////////////////////////////
// Credentials
@@ -791,7 +824,7 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
@NotNull
@Override
- public Set getUserPermissions(String userId, String authRole) throws DBException {
+ public Set getUserPermissions(String userId) throws DBException {
try (Connection dbCon = database.openConnection()) {
Set permissions = new HashSet<>();
try (PreparedStatement dbStat = dbCon.prepareStatement(
@@ -819,6 +852,10 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
}
}
+ protected Set getUserPermissions(String userId, String authRole) throws DBException {
+ return getUserPermissions(userId);
+ }
+
///////////////////////////////////////////
// Sessions
@@ -1160,17 +1197,17 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
public SMTokens refreshSession(@NotNull String refreshToken) throws DBException {
var currentUserCreds = getCurrentUserCreds();
var currentUserAccessToken = currentUserCreds.getSmToken();
- String currentUserAuthRole = null; // FIXME: read role from auth token
+ String currentUserAuthRole = readTokenAuthRole(currentUserAccessToken);
- var expectedRefreshTokenInfo = findRefreshToken(currentUserAccessToken);
+ var smTokenInfo = readAccessTokenInfo(currentUserAccessToken);
- if (!expectedRefreshTokenInfo.getRefreshToken().equals(refreshToken)) {
+ if (!smTokenInfo.getRefreshToken().equals(refreshToken)) {
throw new SMException("Invalid refresh token");
}
try (var dbCon = database.openConnection()) {
invalidateUserTokens(currentUserAccessToken);
- return generateNewSessionToken(expectedRefreshTokenInfo.getSessionId(), expectedRefreshTokenInfo.getUserId(), currentUserAuthRole, dbCon);
+ return generateNewSessionToken(smTokenInfo.getSessionId(), smTokenInfo.getUserId(), currentUserAuthRole, dbCon);
} catch (SQLException e) {
throw new DBException("Error refreshing sm session", e);
}
@@ -1208,10 +1245,10 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
}
}
- private RefreshTokenInfo findRefreshToken(String smAccessToken) throws DBException {
+ private SMTokenInfo readAccessTokenInfo(String smAccessToken) throws DBException {
try (Connection dbCon = database.openConnection();
PreparedStatement dbStat = dbCon.prepareStatement(
- "SELECT REFRESH_TOKEN_ID,SESSION_ID,USER_ID,REFRESH_TOKEN_EXPIRATION_TIME FROM CB_AUTH_TOKEN WHERE TOKEN_ID=?"
+ "SELECT REFRESH_TOKEN_ID,SESSION_ID,USER_ID,REFRESH_TOKEN_EXPIRATION_TIME,AUTH_ROLE FROM CB_AUTH_TOKEN WHERE TOKEN_ID=?"
)
) {
dbStat.setString(1, smAccessToken);
@@ -1223,10 +1260,11 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
var sessionId = dbResult.getString(2);
var userId = dbResult.getString(3);
var expiredDate = dbResult.getTimestamp(4);
+ var authRole = dbResult.getString(5);
if (Timestamp.from(Instant.now()).after(expiredDate)) {
throw new SMRefreshTokenExpiredException("Refresh token expired");
}
- return new RefreshTokenInfo(refreshToken, sessionId, userId);
+ return new SMTokenInfo(smAccessToken, refreshToken, sessionId, userId, authRole);
}
} catch (SQLException e) {
throw new DBCException("Error reading token info in database", e);
@@ -1268,14 +1306,15 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
Map storedUserData = new LinkedHashMap<>();
for (String authProviderId : authProviderIds) {
- var userCredentials = (Map) authInfo.getAuthData().get(authProviderId);
+ var userAuthData = (Map) authInfo.getAuthData().get(authProviderId);
var userIdFromCreds = findOrCreateExternalUserByCredentials(
authProviderId,
authAttemptSessionInfo.getSessionParams(),
- userCredentials,
+ userAuthData,
finishAuthMonitor,
activeUserId,
- activeUserId == null
+ activeUserId == null,
+ authInfo.getAuthRole()
);
if (userIdFromCreds == null) {
@@ -1288,10 +1327,11 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
}
storedUserData.put(
authProviderId,
- saveSecuredCreds ? userCredentials : filterSecuredUserData(userCredentials, getAuthProvider(authProviderId))
+ saveSecuredCreds ? userAuthData : filterSecuredUserData(userAuthData, getAuthProvider(authProviderId))
);
}
+ String tokenAuthRole = updateUserAuthRoleIfNeeded(activeUserId, authInfo.getAuthRole());
if (smTokens == null && permissions == null) {
try (Connection dbCon = database.openConnection()) {
try (JDBCTransaction txn = new JDBCTransaction(dbCon)) {
@@ -1307,9 +1347,11 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
} else {
smSessionId = authAttemptSessionInfo.getSmSessionId();
}
- smTokens = generateNewSessionToken(smSessionId, activeUserId, authInfo.getAuthRole(), dbCon);
+
+ smTokens = generateNewSessionToken(smSessionId, activeUserId, tokenAuthRole, dbCon);
permissions = new SMAuthPermissions(
- activeUserId, smSessionId, getUserPermissions(activeUserId, authInfo.getAuthRole()));
+ activeUserId, smSessionId, getUserPermissions(activeUserId, tokenAuthRole)
+ );
txn.commit();
}
} catch (SQLException e) {
@@ -1330,6 +1372,38 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
);
}
+ @Nullable
+ protected String readUserAuthRole(String userId) throws DBException {
+ try (Connection dbCon = database.openConnection()) {
+ try (PreparedStatement dbStat = dbCon.prepareStatement(
+ "SELECT DEFAULT_AUTH_ROLE FROM CB_USER WHERE USER_ID=?"
+ )) {
+ dbStat.setString(1, userId);
+ try (ResultSet dbResult = dbStat.executeQuery()) {
+ if (!dbResult.next()) {
+ throw new SMException("User not found");
+ }
+ return dbResult.getString(1);
+
+ }
+ }
+ } catch (SQLException e) {
+ throw new DBException("Failed to update user auth role", e);
+ }
+ }
+
+ private String updateUserAuthRoleIfNeeded(@Nullable String userId, @Nullable String authRole) throws DBException {
+ if (userId == null) {
+ return null;
+ }
+ var currentAuthRole = readUserAuthRole(userId);
+ String expectedAuthRole = resolveUserAuthRole(currentAuthRole, authRole);
+ if (!Objects.equals(currentAuthRole, expectedAuthRole)) {
+ setUserAuthRole(userId, expectedAuthRole);
+ }
+ return expectedAuthRole;
+ }
+
private AuthAttemptSessionInfo readAuthAttemptSessionInfo(@NotNull String authId) throws DBException {
try (Connection dbCon = database.openConnection()) {
try (PreparedStatement dbStat = dbCon.prepareStatement(
@@ -1361,7 +1435,8 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
@NotNull Map userCredentials,
@NotNull DBRProgressMonitor progressMonitor,
@Nullable String activeUserId,
- boolean createNewUserIfNotExist
+ boolean createNewUserIfNotExist,
+ String authRole
) throws DBException {
AuthProviderDescriptor authProvider = getAuthProvider(authProviderId);
SMAuthProvider> smAuthProviderInstance = authProvider.getInstance();
@@ -1385,8 +1460,11 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
userId = userIdFromCredentials;
if (!isSubjectExists(userId)) {
- var newUser = new SMUser(userId, true);
- createUser(newUser.getUserId(), newUser.getMetaParameters(), true);
+ createUser(userId,
+ Map.of(),
+ true,
+ resolveUserAuthRole(null, authRole)
+ );
String defaultTeamName = WebAppUtils.getWebApplication().getAppConfiguration().getDefaultUserTeam();
if (!CommonUtils.isEmpty(defaultTeamName)) {
setUserTeams(userId, new String[]{defaultTeamName}, userId);
@@ -1405,6 +1483,14 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
return userId;
}
+ @Nullable
+ protected String resolveUserAuthRole(
+ @Nullable String currentAuthRole,
+ @Nullable String newAuthRole
+ ) throws SMException {
+ return newAuthRole == null ? currentAuthRole : newAuthRole;
+ }
+
protected SMTokens generateNewSessionToken(
@NotNull String smSessionId,
@Nullable String userId,
@@ -1467,7 +1553,7 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
} catch (SQLException e) {
throw new DBCException("Error reading token info in database", e);
}
- var permissions = userId == null ? getAnonymousUserPermissions() : getUserPermissions(userId, authRole);
+ var permissions = userId == null ? getAnonymousUserPermissions() : getUserPermissions(userId);
return new SMAuthPermissions(userId, sessionId, permissions);
}
@@ -1776,6 +1862,25 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
///////////////////////////////////////////
// Utils
+ protected String readTokenAuthRole(String smAccessToken) throws DBException {
+ try (Connection dbCon = database.openConnection();
+ PreparedStatement dbStat = dbCon.prepareStatement(
+ "SELECT AUTH_ROLE FROM CB_AUTH_TOKEN " +
+ "WHERE TOKEN_ID=?"
+ )
+ ) {
+ dbStat.setString(1, smAccessToken);
+ try (var dbResult = dbStat.executeQuery()) {
+ if (!dbResult.next()) {
+ throw new SMException("Invalid token");
+ }
+ return dbResult.getString(1);
+ }
+ } catch (SQLException e) {
+ throw new DBCException("Error reading lm role in database", e);
+ }
+ }
+
public void initializeMetaInformation() throws DBCException {
try (Connection dbCon = database.openConnection()) {
try (JDBCTransaction txn = new JDBCTransaction(dbCon)) {
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 8f5d98de64..fa11eb459c 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
@@ -19,7 +19,7 @@ package io.cloudbeaver.service.security;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.InstanceCreator;
-import io.cloudbeaver.model.app.WebApplication;
+import io.cloudbeaver.model.app.WebAuthApplication;
import io.cloudbeaver.service.security.db.CBDatabase;
import io.cloudbeaver.service.security.db.CBDatabaseConfig;
import org.jkiss.dbeaver.DBException;
@@ -41,7 +41,7 @@ public class EmbeddedSecurityControllerFactory {
* Create new security controller instance with default configuration
*/
public CBEmbeddedSecurityController createSecurityService(
- WebApplication application,
+ WebAuthApplication application,
Map databaseConfig,
SMCredentialsProvider credentialsProvider
) throws DBException {
@@ -52,7 +52,7 @@ public class EmbeddedSecurityControllerFactory {
* Create new security controller instance with custom configuration
*/
public CBEmbeddedSecurityController createSecurityService(
- WebApplication application,
+ WebAuthApplication application,
Map databaseConfig,
SMCredentialsProvider credentialsProvider,
SMControllerConfiguration smConfig
@@ -78,7 +78,7 @@ public class EmbeddedSecurityControllerFactory {
return securityController;
}
- private synchronized void initDatabase(WebApplication application, Map databaseConfig) {
+ private synchronized void initDatabase(WebAuthApplication application, Map databaseConfig) {
CBDatabaseConfig databaseConfiguration = new CBDatabaseConfig();
InstanceCreator dbConfigCreator = type -> databaseConfiguration;
InstanceCreator dbPoolConfigCreator = type -> databaseConfiguration.getPool();
@@ -92,7 +92,7 @@ public class EmbeddedSecurityControllerFactory {
}
protected CBEmbeddedSecurityController createEmbeddedSecurityController(
- WebApplication application,
+ WebAuthApplication application,
CBDatabase database,
SMCredentialsProvider credentialsProvider,
SMControllerConfiguration smConfig
diff --git a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/SMControllerConfiguration.java b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/SMControllerConfiguration.java
index 0f18961fb6..ee00abf39e 100644
--- a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/SMControllerConfiguration.java
+++ b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/SMControllerConfiguration.java
@@ -24,6 +24,7 @@ public class SMControllerConfiguration {
private int accessTokenTtl = DEFAULT_ACCESS_TOKEN_TTL;
private int refreshTokenTtl = DEFAULT_REFRESH_TOKEN_TTL;
+ private String defaultAuthRole = null;
public int getAccessTokenTtl() {
return accessTokenTtl;
@@ -40,4 +41,12 @@ public class SMControllerConfiguration {
public void setRefreshTokenTtl(int refreshTokenTtl) {
this.refreshTokenTtl = refreshTokenTtl;
}
+
+ public String getDefaultAuthRole() {
+ return defaultAuthRole;
+ }
+
+ public void setDefaultAuthRole(String defaultAuthRole) {
+ this.defaultAuthRole = defaultAuthRole;
+ }
}
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 29cc7b57ec..6459df0f9f 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
@@ -196,14 +196,20 @@ public class CBDatabase {
}
//TODO move out
- public void finishConfiguration(@NotNull String adminName, @Nullable String adminPassword, @NotNull List authInfoList) throws DBException {
+ public void finishConfiguration(
+ @NotNull String adminName,
+ @Nullable String adminPassword,
+ @NotNull List authInfoList
+ ) throws DBException {
if (!application.isConfigurationMode()) {
throw new DBException("Database is already configured");
}
log.info("Configure CB database security");
CBDatabaseInitialData initialData = getInitialData();
- if (initialData != null && !CommonUtils.isEmpty(initialData.getAdminName()) && !CommonUtils.equalObjects(initialData.getAdminName(), adminName)) {
+ if (initialData != null && !CommonUtils.isEmpty(initialData.getAdminName())
+ && !CommonUtils.equalObjects(initialData.getAdminName(), adminName)
+ ) {
// Delete old admin user
adminSecurityController.deleteUser(initialData.getAdminName());
}
@@ -241,12 +247,15 @@ public class CBDatabase {
}
@NotNull
- private SMUser createAdminUser(@NotNull String adminName, @Nullable String adminPassword) throws DBException {
+ private SMUser createAdminUser(
+ @NotNull String adminName,
+ @Nullable String adminPassword
+ ) throws DBException {
SMUser adminUser = adminSecurityController.getUserById(adminName);
if (adminUser == null) {
- adminUser = new SMUser(adminName, true);
- adminSecurityController.createUser(adminUser.getUserId(), adminUser.getMetaParameters(), true);
+ adminUser = new SMUser(adminName, true, "administrator");
+ adminSecurityController.createUser(adminUser.getUserId(), adminUser.getMetaParameters(), true, adminUser.getAuthRole());
}
if (!CommonUtils.isEmpty(adminPassword)) {
diff --git a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/RefreshTokenInfo.java b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/SMTokenInfo.java
similarity index 67%
rename from server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/RefreshTokenInfo.java
rename to server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/SMTokenInfo.java
index 89d39430cd..f8ff7e285e 100644
--- a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/RefreshTokenInfo.java
+++ b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/SMTokenInfo.java
@@ -18,8 +18,12 @@
package io.cloudbeaver.service.security.internal;
import org.jkiss.code.NotNull;
+import org.jkiss.code.Nullable;
+
+public class SMTokenInfo {
+ @NotNull
+ private final String accessToken;
-public class RefreshTokenInfo {
@NotNull
private final String refreshToken;
@@ -29,10 +33,21 @@ public class RefreshTokenInfo {
@NotNull
private final String userId;
- public RefreshTokenInfo(@NotNull String refreshToken, @NotNull String sessionId, @NotNull String userId) {
+ @Nullable
+ private final String authRole;
+
+ public SMTokenInfo(
+ @NotNull String accessToken,
+ @NotNull String refreshToken,
+ @NotNull String sessionId,
+ @NotNull String userId,
+ @Nullable String authRole
+ ) {
+ this.accessToken = accessToken;
this.refreshToken = refreshToken;
this.sessionId = sessionId;
this.userId = userId;
+ this.authRole = authRole;
}
@NotNull
@@ -49,4 +64,14 @@ public class RefreshTokenInfo {
public String getUserId() {
return userId;
}
+
+ @NotNull
+ public String getAccessToken() {
+ return accessToken;
+ }
+
+ @Nullable
+ public String getAuthRole() {
+ return authRole;
+ }
}
diff --git a/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml b/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml
index d7f69efd8c..6331138d45 100644
--- a/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml
+++ b/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml
@@ -2,7 +2,7 @@
diff --git a/server/features/io.cloudbeaver.ce.drivers.feature/pom.xml b/server/features/io.cloudbeaver.ce.drivers.feature/pom.xml
index 97f9690551..336332f630 100644
--- a/server/features/io.cloudbeaver.ce.drivers.feature/pom.xml
+++ b/server/features/io.cloudbeaver.ce.drivers.feature/pom.xml
@@ -9,6 +9,6 @@
../
io.cloudbeaver.ce.drivers.feature
- 1.0.82-SNAPSHOT
+ 1.0.83-SNAPSHOT
eclipse-feature
diff --git a/server/features/io.cloudbeaver.product.ce.feature/feature.xml b/server/features/io.cloudbeaver.product.ce.feature/feature.xml
index eb78cbf19d..4ed22da67b 100644
--- a/server/features/io.cloudbeaver.product.ce.feature/feature.xml
+++ b/server/features/io.cloudbeaver.product.ce.feature/feature.xml
@@ -2,7 +2,7 @@
diff --git a/server/features/io.cloudbeaver.product.ce.feature/pom.xml b/server/features/io.cloudbeaver.product.ce.feature/pom.xml
index b26a3aa483..9df53d8c9b 100644
--- a/server/features/io.cloudbeaver.product.ce.feature/pom.xml
+++ b/server/features/io.cloudbeaver.product.ce.feature/pom.xml
@@ -10,7 +10,7 @@
../
io.cloudbeaver.product.ce.feature
- 22.2.2-SNAPSHOT
+ 22.2.3-SNAPSHOT
eclipse-feature
diff --git a/server/features/io.cloudbeaver.server.feature/feature.xml b/server/features/io.cloudbeaver.server.feature/feature.xml
index 0014433c70..5427793688 100644
--- a/server/features/io.cloudbeaver.server.feature/feature.xml
+++ b/server/features/io.cloudbeaver.server.feature/feature.xml
@@ -2,7 +2,7 @@
diff --git a/server/features/io.cloudbeaver.server.feature/pom.xml b/server/features/io.cloudbeaver.server.feature/pom.xml
index 49ced4fc95..8fdf1eb758 100644
--- a/server/features/io.cloudbeaver.server.feature/pom.xml
+++ b/server/features/io.cloudbeaver.server.feature/pom.xml
@@ -10,6 +10,6 @@
../
io.cloudbeaver.server.feature
- 22.2.2-SNAPSHOT
+ 22.2.3-SNAPSHOT
eclipse-feature
diff --git a/server/features/io.cloudbeaver.ws.feature/feature.xml b/server/features/io.cloudbeaver.ws.feature/feature.xml
index 310e69c955..6b81e72224 100644
--- a/server/features/io.cloudbeaver.ws.feature/feature.xml
+++ b/server/features/io.cloudbeaver.ws.feature/feature.xml
@@ -2,7 +2,7 @@
diff --git a/server/features/io.cloudbeaver.ws.feature/pom.xml b/server/features/io.cloudbeaver.ws.feature/pom.xml
index 76b27cb4c1..340d0ae839 100644
--- a/server/features/io.cloudbeaver.ws.feature/pom.xml
+++ b/server/features/io.cloudbeaver.ws.feature/pom.xml
@@ -10,6 +10,6 @@
../
io.cloudbeaver.ws.feature
- 1.0.12-SNAPSHOT
+ 1.0.13-SNAPSHOT
eclipse-feature
diff --git a/server/pom.xml b/server/pom.xml
index 480cb69357..042f7a88ba 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -19,7 +19,7 @@
CloudBeaver CE
- 22.2.2
+ 22.2.3
diff --git a/server/product/web-server/CloudbeaverServer.product b/server/product/web-server/CloudbeaverServer.product
index 478130654c..075f261703 100644
--- a/server/product/web-server/CloudbeaverServer.product
+++ b/server/product/web-server/CloudbeaverServer.product
@@ -2,7 +2,7 @@
diff --git a/server/product/web-server/pom.xml b/server/product/web-server/pom.xml
index 3919e9319c..58783146c4 100644
--- a/server/product/web-server/pom.xml
+++ b/server/product/web-server/pom.xml
@@ -9,7 +9,7 @@
1.0.0-SNAPSHOT
../../
- 22.2.2-SNAPSHOT
+ 22.2.3-SNAPSHOT
web-server
eclipse-repository
Cloudbeaver Server Product
diff --git a/webapp/packages/core-connections/src/ConnectionExecutionContext/ConnectionExecutionContextResource.ts b/webapp/packages/core-connections/src/ConnectionExecutionContext/ConnectionExecutionContextResource.ts
index 281337fb2f..c2f3556bf2 100644
--- a/webapp/packages/core-connections/src/ConnectionExecutionContext/ConnectionExecutionContextResource.ts
+++ b/webapp/packages/core-connections/src/ConnectionExecutionContext/ConnectionExecutionContextResource.ts
@@ -33,6 +33,8 @@ export const ConnectionExecutionContextProjectKey = (projectId: string) => resou
projectId
);
+export const NOT_INITIALIZED_CONTEXT_ID = '-1';
+
@injectable()
export class ConnectionExecutionContextResource extends CachedMapResource {
constructor(
@@ -157,7 +159,7 @@ export class ConnectionExecutionContextResource extends CachedMapResource
): Promise