diff --git a/config/sample-databases/DefaultConfiguration/cloudbeaver.conf b/config/sample-databases/DefaultConfiguration/cloudbeaver.conf
index 168e296f93..e4f986e684 100644
--- a/config/sample-databases/DefaultConfiguration/cloudbeaver.conf
+++ b/config/sample-databases/DefaultConfiguration/cloudbeaver.conf
@@ -38,6 +38,7 @@
anonymousAccessEnabled: true,
anonymousUserRole: "user",
supportsCustomConnections: false,
+ showReadOnlyConnectionInfo: false,
forwardProxy: false,
diff --git a/config/sample-databases/SQLiteConfiguration/cloudbeaver.conf b/config/sample-databases/SQLiteConfiguration/cloudbeaver.conf
index a1f14be291..5dbc3c8d71 100644
--- a/config/sample-databases/SQLiteConfiguration/cloudbeaver.conf
+++ b/config/sample-databases/SQLiteConfiguration/cloudbeaver.conf
@@ -38,6 +38,7 @@
anonymousAccessEnabled: true,
anonymousUserRole: "user",
supportsCustomConnections: false,
+ showReadOnlyConnectionInfo: false,
forwardProxy: false,
diff --git a/deploy/docker/Dockerfile b/deploy/docker/Dockerfile
index 5e32885cae..8a041b51ed 100644
--- a/deploy/docker/Dockerfile
+++ b/deploy/docker/Dockerfile
@@ -1,5 +1,4 @@
-ARG ARCH=amd64
-FROM ${ARCH}/eclipse-temurin:17.0.4.1_1-jre-focal
+FROM eclipse-temurin:17.0.4.1_1-jre-focal
COPY cloudbeaver /opt/cloudbeaver
diff --git a/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF
index a99f1bcca3..7ae78071a0 100644
--- a/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF
+++ b/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF
@@ -3,12 +3,13 @@ Bundle-ManifestVersion: 2
Bundle-Vendor: %Bundle-Vendor
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: io.cloudbeaver.model;singleton:=true
-Bundle-Version: 1.0.16.qualifier
-Bundle-Release-Date: 20221107
+Bundle-Version: 1.0.17.qualifier
+Bundle-Release-Date: 20221121
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
Require-Bundle: org.jkiss.dbeaver.model;visibility:=reexport,
+ org.jkiss.dbeaver.model.sm;visibility:=reexport,
org.jkiss.dbeaver.registry;visibility:=reexport,
org.jkiss.dbeaver.net.ssh,
org.jkiss.bundle.graphql.java;visibility:=reexport,
diff --git a/server/bundles/io.cloudbeaver.model/plugin.xml b/server/bundles/io.cloudbeaver.model/plugin.xml
index 96847f47d7..ec0dd5a019 100644
--- a/server/bundles/io.cloudbeaver.model/plugin.xml
+++ b/server/bundles/io.cloudbeaver.model/plugin.xml
@@ -7,4 +7,6 @@
+
+
diff --git a/server/bundles/io.cloudbeaver.model/pom.xml b/server/bundles/io.cloudbeaver.model/pom.xml
index 6c58cc5d6c..61c409252c 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.16-SNAPSHOT
+ 1.0.17-SNAPSHOT
eclipse-plugin
diff --git a/server/bundles/io.cloudbeaver.service.auth/schema/io.cloudbeaver.userProfile.exsd b/server/bundles/io.cloudbeaver.model/schema/io.cloudbeaver.metaParameters.exsd
similarity index 85%
rename from server/bundles/io.cloudbeaver.service.auth/schema/io.cloudbeaver.userProfile.exsd
rename to server/bundles/io.cloudbeaver.model/schema/io.cloudbeaver.metaParameters.exsd
index 5901571b6a..fe9b6f92fb 100644
--- a/server/bundles/io.cloudbeaver.service.auth/schema/io.cloudbeaver.userProfile.exsd
+++ b/server/bundles/io.cloudbeaver.model/schema/io.cloudbeaver.metaParameters.exsd
@@ -2,7 +2,7 @@
-
+
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java
index 7c781afdd2..eacb137ba4 100644
--- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java
@@ -1,3 +1,20 @@
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2022 DBeaver Corp and others
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package io.cloudbeaver;
import org.jkiss.code.NotNull;
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 3f24947c00..dbfe02cb02 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
@@ -17,11 +17,14 @@
package io.cloudbeaver.model;
import io.cloudbeaver.WebProjectImpl;
+import io.cloudbeaver.model.app.BaseWebAppConfiguration;
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.WebCommonUtils;
+import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.DBPDataSourceFolder;
@@ -38,10 +41,7 @@ import org.jkiss.dbeaver.model.rm.RMProjectPermission;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.utils.CommonUtils;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -49,6 +49,7 @@ import java.util.stream.Collectors;
*/
public class WebConnectionInfo {
+ private static final String SECURED_VALUE = "********";
private final WebSession session;
private final DBPDataSourceContainer dataSourceContainer;
private WebServerError connectError;
@@ -99,12 +100,18 @@ public class WebConnectionInfo {
@Property
public String getHost() {
- return dataSourceContainer.getConnectionConfiguration().getHostName();
+ if (canViewReadOnlyConnections()) {
+ return dataSourceContainer.getConnectionConfiguration().getHostName();
+ }
+ return SECURED_VALUE;
}
@Property
public String getPort() {
- return dataSourceContainer.getConnectionConfiguration().getHostPort();
+ if (canViewReadOnlyConnections()) {
+ return dataSourceContainer.getConnectionConfiguration().getHostPort();
+ }
+ return SECURED_VALUE;
}
@Property
@@ -114,17 +121,26 @@ public class WebConnectionInfo {
@Property
public String getDatabaseName() {
- return dataSourceContainer.getConnectionConfiguration().getDatabaseName();
+ if (canViewReadOnlyConnections()) {
+ return dataSourceContainer.getConnectionConfiguration().getDatabaseName();
+ }
+ return SECURED_VALUE;
}
@Property
public String getUrl() {
- return dataSourceContainer.getConnectionConfiguration().getUrl();
+ if (canViewReadOnlyConnections()) {
+ return dataSourceContainer.getConnectionConfiguration().getUrl();
+ }
+ return SECURED_VALUE;
}
@Property
public Map getProperties() {
- return dataSourceContainer.getConnectionConfiguration().getProperties();
+ if (canViewReadOnlyConnections()) {
+ return dataSourceContainer.getConnectionConfiguration().getProperties();
+ }
+ return Collections.emptyMap();
}
@Property
@@ -157,6 +173,16 @@ public class WebConnectionInfo {
return dataSourceContainer.isSavePassword();
}
+ @Property
+ public boolean isCredentialsSaved() throws DBException {
+ return dataSourceContainer.isCredentialsSaved();
+ }
+
+ @Property
+ public boolean isSharedCredentials() {
+ return dataSourceContainer.isSharedCredentials();
+ }
+
@Property
public String getFolder() {
DBPDataSourceFolder folder = dataSourceContainer.getFolder();
@@ -265,9 +291,9 @@ public class WebConnectionInfo {
}
@Property
- public boolean isAuthNeeded() {
+ public boolean isAuthNeeded() throws DBException {
return !dataSourceContainer.isConnected() &&
- !dataSourceContainer.isSavePassword() &&
+ !dataSourceContainer.isCredentialsSaved() &&
!dataSourceContainer.getDriver().isAnonymousAccess();
}
@@ -301,8 +327,11 @@ public class WebConnectionInfo {
@Property
public List getNetworkHandlersConfig() {
- return dataSourceContainer.getConnectionConfiguration().getHandlers().stream()
- .map(WebNetworkHandlerConfig::new).collect(Collectors.toList());
+ if (canViewReadOnlyConnections()) {
+ return dataSourceContainer.getConnectionConfiguration().getHandlers().stream()
+ .map(WebNetworkHandlerConfig::new).collect(Collectors.toList());
+ }
+ return Collections.emptyList();
}
@Property
@@ -341,7 +370,7 @@ public class WebConnectionInfo {
@Property
public boolean isCanViewSettings() {
- return true;
+ return canViewReadOnlyConnections();
}
@Property
@@ -371,4 +400,13 @@ public class WebConnectionInfo {
}
return SMUtils.hasProjectPermission(session, ((WebProjectImpl) project).getRmProject(), projectPermission);
}
+
+ private boolean canViewReadOnlyConnections() {
+ if (isCanEdit()) {
+ return true;
+ }
+ BaseWebAppConfiguration appConfig = (BaseWebAppConfiguration) WebAppUtils.getWebApplication().getAppConfiguration();
+ return appConfig.isShowReadOnlyConnectionInfo();
+
+ }
}
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 82a17315e5..7d02c127f5 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
@@ -31,6 +31,7 @@ public abstract class BaseWebAppConfiguration implements WebAppConfiguration {
protected final Map plugins;
protected String defaultUserTeam;
protected boolean resourceManagerEnabled;
+ protected boolean showReadOnlyConnectionInfo;
protected String[] enabledFeatures;
public BaseWebAppConfiguration() {
@@ -38,6 +39,7 @@ public abstract class BaseWebAppConfiguration implements WebAppConfiguration {
this.defaultUserTeam = DEFAULT_APP_ANONYMOUS_TEAM_NAME;
this.resourceManagerEnabled = true;
this.enabledFeatures = null;
+ this.showReadOnlyConnectionInfo = false;
}
public BaseWebAppConfiguration(BaseWebAppConfiguration src) {
@@ -45,6 +47,7 @@ public abstract class BaseWebAppConfiguration implements WebAppConfiguration {
this.defaultUserTeam = src.defaultUserTeam;
this.resourceManagerEnabled = src.resourceManagerEnabled;
this.enabledFeatures = src.enabledFeatures;
+ this.showReadOnlyConnectionInfo = src.showReadOnlyConnectionInfo;
}
@Override
@@ -98,4 +101,8 @@ public abstract class BaseWebAppConfiguration implements WebAppConfiguration {
public void setEnabledFeatures(String[] enabledFeatures) {
this.enabledFeatures = enabledFeatures;
}
+
+ public boolean isShowReadOnlyConnectionInfo() {
+ return showReadOnlyConnectionInfo;
+ }
}
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 bf7ebc726f..048bf5a3b8 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
@@ -34,7 +34,6 @@ import org.jkiss.dbeaver.model.app.DBPWorkspace;
import org.jkiss.dbeaver.model.auth.SMCredentialsProvider;
import org.jkiss.dbeaver.model.data.json.JSONUtils;
import org.jkiss.dbeaver.model.impl.app.ApplicationRegistry;
-import org.jkiss.dbeaver.model.impl.app.LocalSecretController;
import org.jkiss.dbeaver.model.rm.RMController;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.secret.DBSSecretController;
@@ -140,9 +139,14 @@ public abstract class BaseWebApplication extends BaseApplicationImpl implements
);
}
+ /**
+ * There is no secret controller in base web app.
+ * Method returns VoidSecretController instance.
+ * Advanced apps may implement it differently.
+ */
@Override
public DBSSecretController getSecretController(@NotNull SMCredentialsProvider credentialsProvider) throws DBException {
- return new LocalSecretController("user/" + credentialsProvider.getActiveUserCredentials().getUserId());
+ return VoidSecretController.INSTANCE;
}
protected Map getServerConfigProps(Map configProps) {
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/VoidSecretController.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/VoidSecretController.java
new file mode 100644
index 0000000000..12bbb9b255
--- /dev/null
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/VoidSecretController.java
@@ -0,0 +1,50 @@
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2022 DBeaver Corp and others
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.cloudbeaver.model.app;
+
+import org.jkiss.code.NotNull;
+import org.jkiss.code.Nullable;
+import org.jkiss.dbeaver.DBException;
+import org.jkiss.dbeaver.model.secret.DBSSecretController;
+
+/**
+ * Void secret controller.
+ */
+public class VoidSecretController implements DBSSecretController {
+
+ public static final VoidSecretController INSTANCE = new VoidSecretController();
+
+ public VoidSecretController() {
+
+ }
+
+ @Nullable
+ @Override
+ public String getSecretValue(@NotNull String secretId) {
+ return null;
+ }
+
+ @Override
+ public void setSecretValue(@NotNull String secretId, @Nullable String secretValue) throws DBException {
+ throw new DBException("Secret controller is read-only");
+ }
+
+ @Override
+ public void flushChanges() {
+ }
+
+}
\ No newline at end of file
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java
index 4060ef878b..5b53c616e9 100644
--- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java
@@ -3,10 +3,12 @@ package io.cloudbeaver.model.rm;
import io.cloudbeaver.DBWConstants;
import io.cloudbeaver.model.app.BaseWebApplication;
import org.jkiss.code.NotNull;
+import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.rm.RMProjectPermission;
import org.jkiss.dbeaver.model.rm.RMProjectType;
import org.jkiss.dbeaver.runtime.DBWorkbench;
+import org.jkiss.utils.CommonUtils;
import java.nio.file.Path;
import java.util.Objects;
@@ -46,18 +48,25 @@ public class RMUtils {
* @return path to the project based on the name of projects and prefixes that it contains
*/
@NotNull
- public static Path getProjectPathByName(@NotNull String projectId) {
- if (!projectId.contains("_") || projectId.startsWith("_")) {
- return getRootPath().resolve(BaseWebApplication.getInstance().getDefaultProjectName());
+ public static Path getProjectPathByName(@NotNull String projectId) throws DBException {
+ int divPos = projectId.indexOf("_");
+ if (divPos <= 0) {
+ throw new DBException("Bad project ID");
}
- String prefix = projectId.substring(0, projectId.indexOf("_"));
+
+ String prefix = projectId.substring(0, divPos);
+ String projectName = projectId.substring(divPos + 1);
switch (RMProjectType.getByPrefix(prefix)) {
case GLOBAL:
- return getRootPath().resolve(BaseWebApplication.getInstance().getDefaultProjectName());
+ String defaultProjectName = BaseWebApplication.getInstance().getDefaultProjectName();
+ if (CommonUtils.isEmpty(defaultProjectName)) {
+ throw new DBException("Global projects are not supported");
+ }
+ return getRootPath().resolve(defaultProjectName);
case SHARED:
- return getSharedProjectsPath().resolve(projectId);
+ return getSharedProjectsPath().resolve(projectName);
default:
- return getUserProjectsPath().resolve(projectId);
+ return getUserProjectsPath().resolve(projectName);
}
}
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 5fa715498e..6463d8ccd0 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
@@ -155,6 +155,7 @@ public class LocalResourceController implements RMController {
if (userProject != null) {
projects.add(0, userProject);
}
+ projects.sort(Comparator.comparing(RMProject::getDisplayName));
return projects.toArray(new RMProject[0]);
}
@@ -172,7 +173,6 @@ public class LocalResourceController implements RMController {
RMProjectType.SHARED, true)
)
.filter(Objects::nonNull)
- .sorted(Comparator.comparing(RMProject::getDisplayName))
.collect(Collectors.toList());
}
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 7338aa2ba4..0269f7248e 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
@@ -23,11 +23,13 @@ import io.cloudbeaver.model.user.WebUser;
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.auth.SMAuthInfo;
import org.jkiss.dbeaver.model.auth.SMAuthStatus;
import org.jkiss.dbeaver.model.auth.SMCredentials;
import org.jkiss.dbeaver.model.auth.SMCredentialsProvider;
import org.jkiss.dbeaver.model.exec.DBCException;
+import org.jkiss.dbeaver.model.secret.DBSSecretController;
import org.jkiss.dbeaver.model.security.SMAdminController;
import org.jkiss.dbeaver.model.security.SMController;
import org.jkiss.utils.CommonUtils;
@@ -40,6 +42,8 @@ import java.util.Set;
* Contains user state and services based on available permissions
*/
public class WebUserContext implements SMCredentialsProvider {
+ private static final Log log = Log.getLog(WebUserContext.class);
+
private final WebApplication application;
private WebUser user;
@@ -50,6 +54,7 @@ public class WebUserContext implements SMCredentialsProvider {
private SMController securityController;
private SMAdminController adminSecurityController;
+ private DBSSecretController secretController;
public WebUserContext(WebApplication application) throws DBException {
this.application = application;
@@ -64,7 +69,7 @@ public class WebUserContext implements SMCredentialsProvider {
* @throws DBException - if user already authorized and new token come from another user
*/
public synchronized boolean refresh(SMAuthInfo smAuthInfo) throws DBException {
- if (smAuthInfo.getAuthStatus() != SMAuthStatus.SUCCESS) {
+ if (smAuthInfo.getAuthStatus() != SMAuthStatus.SUCCESS || smAuthInfo.getSmAuthToken() == null) {
throw new DBCException("Authorization did not complete successfully");
}
var isNonAnonymousUserAuthorized = isAuthorizedInSecurityManager() && getUser() != null;
@@ -85,6 +90,7 @@ public class WebUserContext implements SMCredentialsProvider {
this.userPermissions = authPermissions.getPermissions();
this.securityController = application.createSecurityController(this);
this.adminSecurityController = application.getAdminSecurityController(this);
+ this.secretController = application.getSecretController(this);
if (isSessionChanged) {
this.smSessionId = smAuthInfo.getAuthPermissions().getSessionId();
setUser(authPermissions.getUserId() == null ? null : new WebUser(securityController.getCurrentUser()));
@@ -114,12 +120,14 @@ public class WebUserContext implements SMCredentialsProvider {
this.securityController.logout();
}
} catch (Exception e) {
+ log.error("Error logging out user", e);
}
this.userPermissions = getDefaultPermissions();
this.smCredentials = null;
this.user = null;
this.securityController = application.createSecurityController(this);
this.adminSecurityController = null;
+ this.secretController = application.getSecretController(this);
}
@NotNull
@@ -172,6 +180,10 @@ public class WebUserContext implements SMCredentialsProvider {
}
}
+ public DBSSecretController getSecretController() {
+ return secretController;
+ }
+
public synchronized String getSmSessionId() {
return smSessionId;
}
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java
index a6c46bebc1..087dfda5b0 100644
--- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java
@@ -46,7 +46,7 @@ public class WebAuthProviderDescriptor extends AbstractDescriptor {
private final IConfigurationElement cfg;
private final ObjectType implType;
- private final Map> metaProperties = new HashMap<>();
+ private final Map> metaParameters = new HashMap<>();
private SMAuthProvider> instance;
private final DBPImage icon;
private final Map configurationParameters = new LinkedHashMap<>();
@@ -76,13 +76,13 @@ public class WebAuthProviderDescriptor extends AbstractDescriptor {
for (IConfigurationElement credElement : cfg.getChildren("credentials")) {
credentialProfiles.add(new SMAuthCredentialsProfile(credElement));
}
- for (IConfigurationElement mpElement : cfg.getChildren("metaProperties")) {
+ for (IConfigurationElement mpElement : cfg.getChildren("metaParameters")) {
SMSubjectType subjectType = CommonUtils.valueOf(SMSubjectType.class, mpElement.getAttribute("type"), SMSubjectType.user);
List metaProps = new ArrayList<>();
for (IConfigurationElement propGroup : ArrayUtils.safeArray(mpElement.getChildren(PropertyDescriptor.TAG_PROPERTY_GROUP))) {
metaProps.addAll(PropertyDescriptor.extractProperties(propGroup));
}
- metaProperties.put(subjectType, metaProps);
+ metaParameters.put(subjectType, metaProps);
}
String rfList = cfg.getAttribute("requiredFeatures");
@@ -182,8 +182,8 @@ public class WebAuthProviderDescriptor extends AbstractDescriptor {
}
@Nullable
- public List getMetaProperties(SMSubjectType subjectType) {
- return metaProperties.get(subjectType);
+ public List getMetaParameters(SMSubjectType subjectType) {
+ return metaParameters.get(subjectType);
}
}
diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/registry/WebUserProfileRegistry.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebMetaParametersRegistry.java
similarity index 57%
rename from server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/registry/WebUserProfileRegistry.java
rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebMetaParametersRegistry.java
index 796f62b3e2..c8f11f6211 100644
--- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/registry/WebUserProfileRegistry.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebMetaParametersRegistry.java
@@ -27,36 +27,47 @@ import org.jkiss.utils.ArrayUtils;
import java.util.ArrayList;
import java.util.List;
-public class WebUserProfileRegistry {
+public class WebMetaParametersRegistry {
- private static final Log log = Log.getLog(WebUserProfileRegistry.class);
+ private static final Log log = Log.getLog(WebMetaParametersRegistry.class);
- public static final String EXTENSION_ID = "io.cloudbeaver.userProfile"; //$NON-NLS-1$
+ public static final String EXTENSION_ID = "io.cloudbeaver.metaParameters"; //$NON-NLS-1$
- private static WebUserProfileRegistry instance = null;
- private final List properties = new ArrayList<>();
+ private static WebMetaParametersRegistry instance = null;
+ private final List userParameters = new ArrayList<>();
+ private final List teamParameters = new ArrayList<>();
- public synchronized static WebUserProfileRegistry getInstance() {
+ public synchronized static WebMetaParametersRegistry getInstance() {
if (instance == null) {
- instance = new WebUserProfileRegistry();
+ instance = new WebMetaParametersRegistry();
instance.loadExtensions(Platform.getExtensionRegistry());
}
return instance;
}
- private WebUserProfileRegistry() {
+ private WebMetaParametersRegistry() {
}
- public List getProperties() {
- return properties;
+ public List getUserParameters() {
+ return userParameters;
+ }
+
+ public List getTeamParameters() {
+ return teamParameters;
}
private void loadExtensions(IExtensionRegistry registry) {
IConfigurationElement[] extConfigs = registry.getConfigurationElementsFor(EXTENSION_ID);
for (IConfigurationElement ext : extConfigs) {
- if (ext.getName().equals("userProfileProperties")) {
+ if (ext.getName().equals("metaParameters")) {
+ boolean isUser = "user".equals(ext.getAttribute("type"));
for (IConfigurationElement propGroup : ArrayUtils.safeArray(ext.getChildren(PropertyDescriptor.TAG_PROPERTY_GROUP))) {
- properties.addAll(PropertyDescriptor.extractProperties(propGroup));
+ List props = PropertyDescriptor.extractProperties(propGroup);
+ if (isUser) {
+ userParameters.addAll(props);
+ } else {
+ teamParameters.addAll(props);
+ }
}
}
}
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 ebc2d9d70b..6e07c156a7 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.4.qualifier
-Bundle-Release-Date: 20221107
+Bundle-Version: 22.2.5.qualifier
+Bundle-Release-Date: 20221121
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 6cc9f578ef..5585e89770 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.4-SNAPSHOT
+ 22.2.5-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 b63393ed03..b955039986 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.61.qualifier
-Bundle-Release-Date: 20221107
+Bundle-Version: 1.0.62.qualifier
+Bundle-Release-Date: 20221121
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 a1ac12206d..d769225d92 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.61-SNAPSHOT
+ 1.0.62-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 79ca58304c..2586cb7ef5 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.4.qualifier
-Bundle-Release-Date: 20221107
+Bundle-Version: 22.2.5.qualifier
+Bundle-Release-Date: 20221121
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 dac95913a5..41606d0cda 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.4-SNAPSHOT
+ 22.2.5-SNAPSHOT
eclipse-plugin
diff --git a/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls
index 8dcec45ed7..bd2c65cb57 100644
--- a/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls
+++ b/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls
@@ -301,8 +301,19 @@ type ConnectionInfo {
connected: Boolean!
provided: Boolean!
readOnly: Boolean!
+ # Forces connection URL use, host/port/database parameters will be ignored
useUrl: Boolean!
+
+ # Forces credentials save. This flag doesn't work in shared projects.
saveCredentials: Boolean!
+ # Shared credentials - the same for all users, stored in secure storage.
+ sharedCredentials: Boolean!
+ # Determines that credentials were saved for current user.
+ # This field read is slow, it should be read only when it really needed
+ credentialsSaved: Boolean!
+ # Determines that additional credentials are needed to connect
+ # This field read is slow, it should be read only when it really needed
+ authNeeded: Boolean!
folder: ID
nodePath: String
@@ -314,7 +325,6 @@ type ConnectionInfo {
origin: ObjectOrigin!
- authNeeded: Boolean!
authModel: ID
authProperties: [ObjectPropertyInfo!]!
@@ -453,6 +463,7 @@ input ConnectionConfig {
# User credentials
saveCredentials: Boolean
+ sharedCredentials: Boolean
authModelId: ID
credentials: Object
@@ -558,7 +569,8 @@ extend type Mutation {
testNetworkHandler( config: NetworkHandlerConfigInput! ): NetworkEndpointInfo!
# Initiate existing connection
- initConnection( id: ID!, projectId: ID, credentials: Object, networkCredentials: [NetworkHandlerConfigInput!], saveCredentials: Boolean ): ConnectionInfo!
+ initConnection( id: ID!, projectId: ID, credentials: Object, networkCredentials: [NetworkHandlerConfigInput!],
+ saveCredentials:Boolean, sharedCredentials: Boolean ): ConnectionInfo!
# Disconnect from database
closeConnection( id: ID!, projectId: ID ): ConnectionInfo!
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 6f2a43060c..893cdc96b1 100644
--- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java
+++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java
@@ -140,7 +140,13 @@ public class WebServiceUtils extends WebCommonUtils {
//navSettings.setShowSystemObjects(false);
((DataSourceDescriptor)newDataSource).setNavigatorSettings(navSettings);
- saveAuthProperties(newDataSource, newDataSource.getConnectionConfiguration(), config.getCredentials(), config.isSaveCredentials());
+ saveAuthProperties(
+ newDataSource,
+ newDataSource.getConnectionConfiguration(),
+ config.getCredentials(),
+ config.isSaveCredentials(),
+ config.isSharedCredentials()
+ );
return newDataSource;
@@ -245,9 +251,11 @@ public class WebServiceUtils extends WebCommonUtils {
@NotNull DBPDataSourceContainer dataSourceContainer,
@NotNull DBPConnectionConfiguration configuration,
@Nullable Map authProperties,
- boolean saveCredentials)
- {
+ boolean saveCredentials,
+ boolean sharedCredentials
+ ) {
dataSourceContainer.setSavePassword(saveCredentials);
+ dataSourceContainer.setSharedCredentials(sharedCredentials);
if (!saveCredentials) {
// Reset credentials
if (authProperties == null) {
@@ -293,7 +301,13 @@ public class WebServiceUtils extends WebCommonUtils {
dataSource.setFolder(null);
}
getGlobalDataSourceRegistry().getAllFolders().clear();
- saveAuthProperties(dataSource, dataSource.getConnectionConfiguration(), config.getCredentials(), config.isSaveCredentials());
+ saveAuthProperties(
+ dataSource,
+ dataSource.getConnectionConfiguration(),
+ config.getCredentials(),
+ config.isSaveCredentials(),
+ config.isSharedCredentials()
+ );
}
public static DBNBrowseSettings parseNavigatorSettings(Map settingsMap) {
diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebConnectionConfig.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebConnectionConfig.java
index b74bee9cf2..8b8b8bd962 100644
--- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebConnectionConfig.java
+++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebConnectionConfig.java
@@ -53,6 +53,7 @@ public class WebConnectionConfig {
private String authModelId;
private Map credentials;
private boolean saveCredentials;
+ private boolean sharedCredentials;
private Map providerProperties;
private List networkHandlersConfig;
private DBPDriverConfigurationType configurationType;
@@ -90,6 +91,7 @@ public class WebConnectionConfig {
authModelId = JSONUtils.getString(params, "authModelId");
credentials = JSONUtils.getObjectOrNull(params, "credentials");
saveCredentials = JSONUtils.getBoolean(params, "saveCredentials");
+ sharedCredentials = JSONUtils.getBoolean(params, "sharedCredentials");
providerProperties = JSONUtils.getObjectOrNull(params, "providerProperties");
@@ -207,6 +209,11 @@ public class WebConnectionConfig {
return saveCredentials;
}
+ @Property
+ public boolean isSharedCredentials() {
+ return sharedCredentials;
+ }
+
public void setSaveCredentials(boolean saveCredentials) {
this.saveCredentials = saveCredentials;
}
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 e44699337e..3ab312a6fa 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
@@ -930,23 +930,25 @@ public class CBApplication extends BaseWebApplication implements WebAuthApplicat
rootConfig.put("app", appConfigProperties);
copyConfigValue(
- oldAppConfig, appConfigProperties, "anonymousAccessEnabled", appConfig.isAnonymousAccessEnabled());
+ oldAppConfig, appConfigProperties, "anonymousAccessEnabled", appConfig.isAnonymousAccessEnabled());
copyConfigValue(
- oldAppConfig, appConfigProperties, "supportsCustomConnections", appConfig.isSupportsCustomConnections());
+ oldAppConfig, appConfigProperties, "supportsCustomConnections", appConfig.isSupportsCustomConnections());
copyConfigValue(
- oldAppConfig, appConfigProperties, "publicCredentialsSaveEnabled", appConfig.isPublicCredentialsSaveEnabled());
+ oldAppConfig, appConfigProperties, "publicCredentialsSaveEnabled", appConfig.isPublicCredentialsSaveEnabled());
copyConfigValue(
- oldAppConfig, appConfigProperties, "adminCredentialsSaveEnabled", appConfig.isAdminCredentialsSaveEnabled());
+ oldAppConfig, appConfigProperties, "adminCredentialsSaveEnabled", appConfig.isAdminCredentialsSaveEnabled());
copyConfigValue(
- oldAppConfig, appConfigProperties, "enableReverseProxyAuth", appConfig.isEnabledReverseProxyAuth());
+ oldAppConfig, appConfigProperties, "enableReverseProxyAuth", appConfig.isEnabledReverseProxyAuth());
copyConfigValue(
- oldAppConfig, appConfigProperties, "forwardProxy", appConfig.isEnabledForwardProxy());
+ oldAppConfig, appConfigProperties, "forwardProxy", appConfig.isEnabledForwardProxy());
copyConfigValue(
- oldAppConfig, appConfigProperties, "linkExternalCredentialsWithUser", appConfig.isLinkExternalCredentialsWithUser());
+ oldAppConfig, appConfigProperties, "linkExternalCredentialsWithUser", appConfig.isLinkExternalCredentialsWithUser());
copyConfigValue(
- oldAppConfig, appConfigProperties, "redirectOnFederatedAuth", appConfig.isRedirectOnFederatedAuth());
+ oldAppConfig, appConfigProperties, "redirectOnFederatedAuth", appConfig.isRedirectOnFederatedAuth());
copyConfigValue(
- oldAppConfig, appConfigProperties, CBConstants.PARAM_RESOURCE_MANAGER_ENABLED, appConfig.isResourceManagerEnabled());
+ oldAppConfig, appConfigProperties, CBConstants.PARAM_RESOURCE_MANAGER_ENABLED, appConfig.isResourceManagerEnabled());
+ copyConfigValue(
+ oldAppConfig, appConfigProperties, CBConstants.PARAM_SHOW_READ_ONLY_CONN_INFO, appConfig.isShowReadOnlyConnectionInfo());
Map resourceQuotas = new LinkedHashMap<>();
Map originResourceQuotas = JSONUtils.getObject(oldAppConfig, CBConstants.PARAM_RESOURCE_QUOTAS);
diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBConstants.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBConstants.java
index 5b2e04a638..b774d61635 100644
--- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBConstants.java
+++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBConstants.java
@@ -39,6 +39,7 @@ public class CBConstants {
public static final String PARAM_STATIC_CONTENT = "staticContent";
public static final String PARAM_RESOURCE_QUOTAS = "resourceQuotas";
public static final String PARAM_RESOURCE_MANAGER_ENABLED = "resourceManagerEnabled";
+ public static final String PARAM_SHOW_READ_ONLY_CONN_INFO = "showReadOnlyConnectionInfo";
public static final String PARAM_AUTH_PROVIDERS = "authConfiguration";
public static final String PARAM_DB_CONFIGURATION = "database";
diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/DBWServiceCore.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/DBWServiceCore.java
index 666d0f33a9..53e4022dc5 100644
--- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/DBWServiceCore.java
+++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/DBWServiceCore.java
@@ -113,13 +113,16 @@ public interface DBWServiceCore extends DBWService {
@NotNull String connectionId,
@NotNull Map authProperties,
@Nullable List networkCredentials,
- @Nullable Boolean saveCredentials) throws DBWebException;
+ @Nullable Boolean saveCredentials,
+ @Nullable Boolean sharedCredentials
+ ) throws DBWebException;
@WebProjectAction(requireProjectPermissions = {RMConstants.PERMISSION_PROJECT_DATASOURCES_EDIT})
WebConnectionInfo createConnection(
@NotNull WebSession webSession,
@Nullable @WebObjectId String projectId,
- @NotNull WebConnectionConfig connectionConfig) throws DBWebException;
+ @NotNull WebConnectionConfig connectionConfig
+ ) throws DBWebException;
@WebProjectAction(requireProjectPermissions = {RMConstants.PERMISSION_PROJECT_DATASOURCES_EDIT})
WebConnectionInfo updateConnection(
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 7dba9a5676..5e079c041d 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
@@ -134,7 +134,9 @@ public class WebServiceBindingCore extends WebServiceBindingBase
env.getArgument("id"),
env.getArgument("credentials"),
nhc,
- env.getArgument("saveCredentials"));
+ env.getArgument("saveCredentials"),
+ env.getArgument("sharedCredentials")
+ );
}
)
.dataFetcher("testConnection", env -> getService(env).testConnection(
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 0d90d902c9..729fdebd75 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,6 +19,7 @@ package io.cloudbeaver.service.core.impl;
import io.cloudbeaver.DBWConstants;
import io.cloudbeaver.DBWebException;
+import io.cloudbeaver.WebProjectImpl;
import io.cloudbeaver.WebServiceUtils;
import io.cloudbeaver.events.CBEvent;
import io.cloudbeaver.events.CBEventConstants;
@@ -154,7 +155,7 @@ public class WebServiceCore implements DBWServiceCore {
getTemplateConnectionsFromProject(webSession, project, result);
}
} else {
- DBPProject project = webSession.getProjectById(projectId);
+ DBPProject project = getProjectById(webSession, projectId);
getTemplateConnectionsFromProject(webSession, project, result);
}
webSession.filterAccessibleConnections(result);
@@ -189,7 +190,7 @@ public class WebServiceCore implements DBWServiceCore {
WebConnectionFolderInfo folderInfo = WebConnectionFolderUtils.getFolderInfo(webSession, projectId, id);
return Collections.singletonList(folderInfo);
}
- DBPProject project = webSession.getProjectById(projectId);
+ DBPProject project = getProjectById(webSession, projectId);
return getConnectionFoldersFromProject(webSession, project);
}
@@ -308,8 +309,9 @@ public class WebServiceCore implements DBWServiceCore {
@NotNull String connectionId,
@NotNull Map authProperties,
@Nullable List networkCredentials,
- @Nullable Boolean saveCredentials) throws DBWebException
- {
+ @Nullable Boolean saveCredentials,
+ @Nullable Boolean sharedCredentials
+ ) throws DBWebException {
WebConnectionInfo connectionInfo = webSession.getWebConnectionInfo(projectId, connectionId);
connectionInfo.setSavedCredentials(authProperties, networkCredentials);
@@ -349,7 +351,9 @@ public class WebServiceCore implements DBWServiceCore {
dataSourceContainer,
dataSourceContainer.getConnectionConfiguration(),
authProperties,
- true);
+ true,
+ sharedCredentials == null ? false : sharedCredentials
+ );
WebDataSourceUtils.saveCredentialsInDataSource(connectionInfo, dataSourceContainer, dataSourceContainer.getConnectionConfiguration());
saveConfig[0] = true;
@@ -371,7 +375,7 @@ public class WebServiceCore implements DBWServiceCore {
@Nullable String projectId,
@NotNull WebConnectionConfig connectionConfig
) throws DBWebException {
- var project = webSession.getProjectById(projectId);
+ var project = getProjectById(webSession, projectId);
var rmProject = project.getRmProject();
if (rmProject.getType() == RMProjectType.USER
&& !webSession.hasPermission(DBWConstants.PERMISSION_ADMIN)
@@ -380,7 +384,7 @@ public class WebServiceCore implements DBWServiceCore {
throw new DBWebException("New connection create is restricted by server configuration");
}
webSession.addInfoMessage("Create new connection");
- DBPDataSourceRegistry sessionRegistry = webSession.getProjectById(projectId).getDataSourceRegistry();
+ DBPDataSourceRegistry sessionRegistry = project.getDataSourceRegistry();
// we don't need to save credentials for templates
if (connectionConfig.isTemplate()) {
@@ -404,7 +408,7 @@ public class WebServiceCore implements DBWServiceCore {
webSession.addConnection(connectionInfo);
webSession.addInfoMessage("New connection was created - " + WebServiceUtils.getConnectionContainerInfo(newDataSource));
WebAppUtils.addDataSourceUpdatedEvent(
- webSession.getProjectById(projectId),
+ project,
connectionInfo.getId(),
CBEventConstants.EventType.TYPE_CREATE
);
@@ -421,7 +425,7 @@ public class WebServiceCore implements DBWServiceCore {
// if (!CBApplication.getInstance().getAppConfiguration().isSupportsCustomConnections()) {
// throw new DBWebException("Connection edit is restricted by server configuration");
// }
- DBPDataSourceRegistry sessionRegistry = webSession.getProjectById(projectId).getDataSourceRegistry();
+ DBPDataSourceRegistry sessionRegistry = getProjectById(webSession, projectId).getDataSourceRegistry();
WebConnectionInfo connectionInfo = webSession.getWebConnectionInfo(projectId, config.getConnectionId());
DBPDataSourceContainer dataSource = connectionInfo.getDataSourceContainer();
@@ -437,7 +441,13 @@ public class WebServiceCore implements DBWServiceCore {
dataSource.setFolder(config.getFolder() != null ? sessionRegistry.getFolder(config.getFolder()) : null);
WebServiceUtils.setConnectionConfiguration(dataSource.getDriver(), dataSource.getConnectionConfiguration(), config);
- WebServiceUtils.saveAuthProperties(dataSource, dataSource.getConnectionConfiguration(), config.getCredentials(), config.isSaveCredentials());
+ WebServiceUtils.saveAuthProperties(
+ dataSource,
+ dataSource.getConnectionConfiguration(),
+ config.getCredentials(),
+ config.isSaveCredentials(),
+ config.isSharedCredentials()
+ );
try {
sessionRegistry.updateDataSource(dataSource);
@@ -446,21 +456,22 @@ public class WebServiceCore implements DBWServiceCore {
throw new DBWebException("Failed to update connection", e);
}
WebAppUtils.addDataSourceUpdatedEvent(
- webSession.getProjectById(projectId), connectionInfo.getId(), CBEventConstants.EventType.TYPE_UPDATE);
+ getProjectById(webSession, projectId), connectionInfo.getId(), CBEventConstants.EventType.TYPE_UPDATE);
return connectionInfo;
}
@Override
public boolean deleteConnection(
- @NotNull WebSession webSession, @Nullable String projectId, @NotNull String connectionId) throws DBWebException {
+ @NotNull WebSession webSession, @Nullable String projectId, @NotNull String connectionId
+ ) throws DBWebException {
WebConnectionInfo connectionInfo = webSession.getWebConnectionInfo(projectId, connectionId);
- if (connectionInfo.getDataSourceContainer().getProject() != webSession.getProjectById(projectId)) {
+ if (connectionInfo.getDataSourceContainer().getProject() != getProjectById(webSession, projectId)) {
throw new DBWebException("Global connection '" + connectionInfo.getName() + "' configuration cannot be deleted");
}
webSession.addInfoMessage("Delete connection - " +
WebServiceUtils.getConnectionContainerInfo(connectionInfo.getDataSourceContainer()));
closeAndDeleteConnection(webSession, projectId, connectionId, true);
- WebAppUtils.addDataSourceUpdatedEvent(webSession.getProjectById(projectId), connectionId, CBEventConstants.EventType.TYPE_DELETE);
+ WebAppUtils.addDataSourceUpdatedEvent(getProjectById(webSession, projectId), connectionId, CBEventConstants.EventType.TYPE_DELETE);
return true;
}
@@ -471,7 +482,7 @@ public class WebServiceCore implements DBWServiceCore {
@NotNull String templateId,
@Nullable String connectionName) throws DBWebException
{
- DBPDataSourceRegistry templateRegistry = webSession.getProjectById(projectId).getDataSourceRegistry();
+ DBPDataSourceRegistry templateRegistry = getProjectById(webSession, projectId).getDataSourceRegistry();
DBPDataSourceContainer dataSourceTemplate = templateRegistry.getDataSource(templateId);
if (dataSourceTemplate == null) {
throw new DBWebException("Template data source '" + templateId + "' not found");
@@ -507,7 +518,7 @@ public class WebServiceCore implements DBWServiceCore {
@NotNull WebConnectionConfig config) throws DBWebException {
try {
DBNModel navigatorModel = webSession.getNavigatorModel();
- DBPDataSourceRegistry dataSourceRegistry = webSession.getProjectById(projectId).getDataSourceRegistry();
+ DBPDataSourceRegistry dataSourceRegistry = getProjectById(webSession, projectId).getDataSourceRegistry();
DBNNode srcNode = navigatorModel.getNodeByPath(webSession.getProgressMonitor(), nodePath);
if (srcNode == null) {
@@ -537,7 +548,7 @@ public class WebServiceCore implements DBWServiceCore {
dataSourceRegistry.checkForErrors();
webSession.addConnection(connectionInfo);
WebAppUtils.addDataSourceUpdatedEvent(
- webSession.getProjectById(projectId), connectionInfo.getId(), CBEventConstants.EventType.TYPE_CREATE);
+ getProjectById(webSession, projectId), connectionInfo.getId(), CBEventConstants.EventType.TYPE_CREATE);
return connectionInfo;
} catch (DBException e) {
throw new DBWebException("Error copying connection", e);
@@ -555,12 +566,30 @@ public class WebServiceCore implements DBWServiceCore {
DBPDataSourceContainer dataSource = WebDataSourceUtils.getLocalOrGlobalDataSource(
CBApplication.getInstance(), webSession, projectId, connectionId);
- DBPDataSourceRegistry sessionRegistry = webSession.getProjectById(projectId).getDataSourceRegistry();
+ WebProjectImpl project = getProjectById(webSession, projectId);
+ DBPDataSourceRegistry sessionRegistry = project.getDataSourceRegistry();
DBPDataSourceContainer testDataSource;
if (dataSource != null) {
+ try {
+ // Check that creds are saved to trigger secrets resolve
+ dataSource.isCredentialsSaved();
+ } catch (DBException e) {
+ throw new DBWebException("Can't determine whether datasource credentials are saved", e);
+ }
+
testDataSource = dataSource.createCopy(dataSource.getRegistry());
- WebServiceUtils.setConnectionConfiguration(testDataSource.getDriver(), testDataSource.getConnectionConfiguration(), connectionConfig);
- WebServiceUtils.saveAuthProperties(testDataSource, testDataSource.getConnectionConfiguration(), connectionConfig.getCredentials(), true);
+ WebServiceUtils.setConnectionConfiguration(
+ testDataSource.getDriver(),
+ testDataSource.getConnectionConfiguration(),
+ connectionConfig
+ );
+ WebServiceUtils.saveAuthProperties(
+ testDataSource,
+ testDataSource.getConnectionConfiguration(),
+ connectionConfig.getCredentials(),
+ true,
+ false
+ );
} else {
testDataSource = WebServiceUtils.createConnectionFromConfig(connectionConfig, sessionRegistry);
}
@@ -664,7 +693,7 @@ public class WebServiceCore implements DBWServiceCore {
//new DisconnectJob(connectionInfo.getDataSource()).schedule();
}
if (forceDelete) {
- DBPDataSourceRegistry registry = webSession.getProjectById(projectId).getDataSourceRegistry();
+ DBPDataSourceRegistry registry = getProjectById(webSession, projectId).getDataSourceRegistry();
registry.removeDataSource(dataSourceContainer);
try {
registry.checkForErrors();
@@ -712,12 +741,13 @@ public class WebServiceCore implements DBWServiceCore {
if (parentPath != null) {
parentNode = WebConnectionFolderUtils.getFolderInfo(session, projectId, parentPath);
}
- DBPDataSourceRegistry sessionRegistry = session.getProjectById(projectId).getDataSourceRegistry();
+ WebProjectImpl project = getProjectById(session, projectId);
+ DBPDataSourceRegistry sessionRegistry = project.getDataSourceRegistry();
DBPDataSourceFolder newFolder = WebServiceUtils.createFolder(parentNode, folderName, sessionRegistry);
WebConnectionFolderInfo folderInfo = new WebConnectionFolderInfo(session, newFolder);
WebServiceUtils.updateConfigAndRefreshDatabases(session, projectId);
WebAppUtils.addDataSourceUpdatedEvent(
- session.getProjectById(projectId), folderInfo.getId(), CBEventConstants.EventType.TYPE_CREATE);
+ project, folderInfo.getId(), CBEventConstants.EventType.TYPE_CREATE);
return folderInfo;
} catch (DBException e) {
throw new DBWebException(e.getMessage(), e);
@@ -736,7 +766,7 @@ public class WebServiceCore implements DBWServiceCore {
folderInfo.getDataSourceFolder().setName(newName);
WebServiceUtils.updateConfigAndRefreshDatabases(session, projectId);
WebAppUtils.addDataSourceUpdatedEvent(
- session.getProjectById(projectId), folderInfo.getId(), CBEventConstants.EventType.TYPE_UPDATE);
+ getProjectById(session, projectId), folderInfo.getId(), CBEventConstants.EventType.TYPE_UPDATE);
return folderInfo;
}
@@ -747,15 +777,16 @@ public class WebServiceCore implements DBWServiceCore {
try {
WebConnectionFolderInfo folderInfo = WebConnectionFolderUtils.getFolderInfo(session, projectId, folderPath);
DBPDataSourceFolder folder = folderInfo.getDataSourceFolder();
- if (folder.getDataSourceRegistry().getProject() != session.getProjectById(projectId)) {
+ WebProjectImpl project = getProjectById(session, projectId);
+ if (folder.getDataSourceRegistry().getProject() != project) {
throw new DBWebException("Global folder '" + folderInfo.getId() + "' cannot be deleted");
}
session.addInfoMessage("Delete folder");
- DBPDataSourceRegistry sessionRegistry = session.getProjectById(projectId).getDataSourceRegistry();
+ DBPDataSourceRegistry sessionRegistry = project.getDataSourceRegistry();
sessionRegistry.removeFolder(folderInfo.getDataSourceFolder(), false);
WebServiceUtils.updateConfigAndRefreshDatabases(session, projectId);
WebAppUtils.addDataSourceUpdatedEvent(
- session.getProjectById(projectId), folderInfo.getId(), CBEventConstants.EventType.TYPE_DELETE);
+ project, folderInfo.getId(), CBEventConstants.EventType.TYPE_DELETE);
} catch (DBException e) {
throw new DBWebException(e.getMessage(), e);
}
@@ -771,7 +802,7 @@ public class WebServiceCore implements DBWServiceCore {
dataSourceDescriptor.setNavigatorSettings(settings);
dataSourceDescriptor.persistConfiguration();
WebAppUtils.addDataSourceUpdatedEvent(
- webSession.getProjectById(projectId), id, CBEventConstants.EventType.TYPE_UPDATE);
+ getProjectById(webSession, projectId), id, CBEventConstants.EventType.TYPE_UPDATE);
return connectionInfo;
}
@@ -785,4 +816,11 @@ public class WebServiceCore implements DBWServiceCore {
return webSession.asyncTaskCancel(taskId);
}
+ private WebProjectImpl getProjectById(WebSession webSession, String projectId) throws DBWebException {
+ WebProjectImpl project = webSession.getProjectById(projectId);
+ if (project == null) {
+ throw new DBWebException("Project '" + projectId + "' not found");
+ }
+ return project;
+ }
}
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 65b18a9ac7..d14f9379a9 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.60.qualifier
-Bundle-Release-Date: 20221107
+Bundle-Version: 1.0.61.qualifier
+Bundle-Release-Date: 20221121
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 ffa69eea79..f51281ec97 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.60-SNAPSHOT
+ 1.0.61-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 895c8168f2..2b463c236d 100644
--- a/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls
+++ b/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls
@@ -50,6 +50,8 @@ type AdminTeamInfo {
teamName: String
description: String
+ metaParameters: Object!
+
grantedUsers: [ID!]!
grantedConnections: [AdminConnectionGrantInfo!]!
@@ -120,6 +122,7 @@ extend type Query {
listTeams(teamId: ID): [AdminTeamInfo!]!
listPermissions: [AdminPermissionInfo!]!
listAuthRoles: [String!]!
+ listTeamMetaParameters: [ObjectPropertyInfo!]!
createUser(userId: ID!, enabled: Boolean!, authRole: String): AdminUserInfo!
deleteUser(userId: ID!): Boolean
@@ -179,6 +182,8 @@ extend type Query {
setUserMetaParameterValues(userId: ID!, parameters: Object!): Boolean!
+ setTeamMetaParameterValues(teamId: ID!, parameters: Object!): Boolean!
+
#### Global configuration
configureServer(configuration: ServerConfigInput!): Boolean!
diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminTeamInfo.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminTeamInfo.java
index 5826d36239..37ea11b0e3 100644
--- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminTeamInfo.java
+++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminTeamInfo.java
@@ -25,6 +25,7 @@ import org.jkiss.dbeaver.model.security.user.SMTeam;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
/**
* Web team info
@@ -45,14 +46,22 @@ public class AdminTeamInfo {
return team.getTeamId();
}
+ @Property
public String getTeamName() {
return team.getName();
}
+ @Property
public String getDescription() {
return team.getDescription();
}
+ @Property
+ public Map getMetaParameters() {
+ return team.getMetaParameters();
+ }
+
+ @Property
public List getTeamPermissions() {
return teamPermissions;
}
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 315990ac04..9a183de67b 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
@@ -50,6 +50,9 @@ public interface DBWServiceAdmin extends DBWService {
@NotNull
List listPermissions(@NotNull WebSession webSession) throws DBWebException;
+ @WebAction()
+ WebPropertyInfo[] listTeamMetaParameters(@NotNull WebSession webSession);
+
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
@NotNull
AdminUserInfo createUser(
@@ -164,6 +167,8 @@ public interface DBWServiceAdmin extends DBWService {
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
Boolean setUserMetaParameterValues(WebSession webSession, String userId, Map parameters) throws DBWebException;
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
+ Boolean setTeamMetaParameterValues(WebSession webSession, String teamId, Map parameters) throws DBWebException;
+ @WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
Boolean enableUser(WebSession webSession, String userId, Boolean enabled) throws DBWebException;
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
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 ee6f46afce..3a0dabe8f7 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
@@ -50,6 +50,8 @@ public class WebServiceBindingAdmin extends WebServiceBindingBase getService(env).listPermissions(getWebSession(env)))
.dataFetcher("listAuthRoles",
env -> getService(env).listAuthRoles())
+ .dataFetcher("listTeamMetaParameters",
+ env -> getService(env).listTeamMetaParameters(getWebSession(env)))
.dataFetcher("createUser",
env -> getService(env).createUser(
getWebSession(env),
@@ -143,6 +145,11 @@ public class WebServiceBindingAdmin extends WebServiceBindingBase getService(env).setTeamMetaParameterValues(
+ getWebSession(env),
+ env.getArgument("teamId"),
+ env.getArgument("parameters")))
.dataFetcher("configureServer",
env -> getService(env).configureServer(getWebSession(env), env.getArgument("configuration")))
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 5215b35597..85ef850d9a 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
@@ -41,10 +41,8 @@ import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings;
-import org.jkiss.dbeaver.model.security.SMAuthProviderCustomConfiguration;
-import org.jkiss.dbeaver.model.security.SMConstants;
-import org.jkiss.dbeaver.model.security.SMDataSourceGrant;
-import org.jkiss.dbeaver.model.security.SMObjects;
+import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor;
+import org.jkiss.dbeaver.model.security.*;
import org.jkiss.dbeaver.model.security.user.SMTeam;
import org.jkiss.dbeaver.model.security.user.SMUser;
import org.jkiss.utils.CommonUtils;
@@ -113,6 +111,25 @@ public class WebServiceAdmin implements DBWServiceAdmin {
}
}
+ @Override
+ public WebPropertyInfo[] listTeamMetaParameters(@NotNull WebSession webSession) {
+ // First add user profile properties
+ List props = new ArrayList<>(
+ WebMetaParametersRegistry.getInstance().getTeamParameters());
+
+ // Add metas from enabled auth providers
+ for (WebAuthProviderDescriptor ap : WebServiceUtils.getEnabledAuthProviders()) {
+ List metaProps = ap.getMetaParameters(SMSubjectType.team);
+ if (!CommonUtils.isEmpty(metaProps)) {
+ props.addAll(metaProps);
+ }
+ }
+
+ return props.stream()
+ .map(p -> new WebPropertyInfo(webSession, p, null))
+ .toArray(WebPropertyInfo[]::new);
+ }
+
@NotNull
@Override
public AdminUserInfo createUser(
@@ -657,6 +674,16 @@ public class WebServiceAdmin implements DBWServiceAdmin {
}
}
+ @Override
+ public Boolean setTeamMetaParameterValues(WebSession webSession, String teamId, Map parameters) throws DBWebException {
+ try {
+ webSession.getAdminSecurityController().setSubjectMetas(teamId, parameters);
+ return true;
+ } catch (DBException e) {
+ throw new DBWebException("Error changing team '" + teamId + "' meta parameters", e);
+ }
+ }
+
private DBPDataSourceRegistry getDataSourceRegistry(WebSession session, String projectId) throws DBWebException {
WebProjectImpl project = session.getProjectById(projectId);
if (project == null) {
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 a18830d881..67540cbcc3 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.60.qualifier
-Bundle-Release-Date: 20221107
+Bundle-Version: 1.0.61.qualifier
+Bundle-Release-Date: 20221121
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
diff --git a/server/bundles/io.cloudbeaver.service.auth/plugin.xml b/server/bundles/io.cloudbeaver.service.auth/plugin.xml
index 3cbc26b47e..36baf6d3c9 100644
--- a/server/bundles/io.cloudbeaver.service.auth/plugin.xml
+++ b/server/bundles/io.cloudbeaver.service.auth/plugin.xml
@@ -3,21 +3,18 @@
-
-
-
-
-
+
+
-
+
diff --git a/server/bundles/io.cloudbeaver.service.auth/pom.xml b/server/bundles/io.cloudbeaver.service.auth/pom.xml
index f504ffa82e..2a4519ab39 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.60-SNAPSHOT
+ 1.0.61-SNAPSHOT
eclipse-plugin
diff --git a/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls b/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls
index a48c41491d..e72b4b0d88 100644
--- a/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls
+++ b/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls
@@ -109,16 +109,19 @@ type UserInfo {
# Human readable display name. It is taken from the first auth provider which was used for user login.
displayName: String
+ # User auth role ID. Optional.
+ authRole: ID
+ # All authentication tokens used during current session
authTokens: [UserAuthToken!]!
linkedAuthProviders: [String!]!
# User profile properties map
metaParameters: Object!
-
- # USer configuiraiton parameters
+ # User configuration parameters
configurationParameters: Object!
+
}
extend type Query {
diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebUserInfo.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebUserInfo.java
index 7a78e7d5e0..dd2d72482b 100644
--- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebUserInfo.java
+++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebUserInfo.java
@@ -54,6 +54,11 @@ public class WebUserInfo {
return user == null ? null : user.getDisplayName();
}
+ @Property
+ public String getAuthRole() {
+ return user == null ? null : user.getAuthRole();
+ }
+
@Property
public List getAuthTokens() {
return session.getAllAuthInfo().stream()
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 7d31bb5268..949ba5fb1e 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
@@ -27,7 +27,7 @@ import io.cloudbeaver.model.user.WebAuthProviderInfo;
import io.cloudbeaver.model.user.WebUser;
import io.cloudbeaver.registry.WebAuthProviderDescriptor;
import io.cloudbeaver.registry.WebAuthProviderRegistry;
-import io.cloudbeaver.registry.WebUserProfileRegistry;
+import io.cloudbeaver.registry.WebMetaParametersRegistry;
import io.cloudbeaver.server.CBApplication;
import io.cloudbeaver.service.auth.DBWServiceAuth;
import io.cloudbeaver.service.auth.WebAuthStatus;
@@ -191,14 +191,13 @@ public class WebServiceAuthImpl implements DBWServiceAuth {
@Override
public WebPropertyInfo[] listUserProfileProperties(@NotNull WebSession webSession) {
- List props = new ArrayList<>();
-
// First add user profile properties
- props.addAll(WebUserProfileRegistry.getInstance().getProperties());
+ List props = new ArrayList<>(
+ WebMetaParametersRegistry.getInstance().getUserParameters());
// Add metas from enabled auth providers
for (WebAuthProviderDescriptor ap : WebServiceUtils.getEnabledAuthProviders()) {
- List metaProps = ap.getMetaProperties(SMSubjectType.user);
+ List metaProps = ap.getMetaParameters(SMSubjectType.user);
if (!CommonUtils.isEmpty(metaProps)) {
props.addAll(metaProps);
}
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 0eec3eed42..3a9279df38 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.61.qualifier
-Bundle-Release-Date: 20221107
+Bundle-Version: 1.0.62.qualifier
+Bundle-Release-Date: 20221121
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 ac3dc1ca6f..b202ef5d4a 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.61-SNAPSHOT
+ 1.0.62-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 f03b7b608c..7ab5ae4367 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.64.qualifier
-Bundle-Release-Date: 20221107
+Bundle-Version: 1.0.65.qualifier
+Bundle-Release-Date: 20221121
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 a43ef7d2fc..8c30f4afa3 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.64-SNAPSHOT
+ 1.0.65-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 b5a0da7371..2ed0469f67 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.13.qualifier
-Bundle-Release-Date: 20221107
+Bundle-Version: 1.0.14.qualifier
+Bundle-Release-Date: 20221121
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 f5cbb99cf8..05a756657f 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.13-SNAPSHOT
+ 1.0.14-SNAPSHOT
eclipse-plugin
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 52c7a00a45..94b0ef1a6b 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.16.qualifier
-Bundle-Release-Date: 20221107
+Bundle-Version: 1.0.17.qualifier
+Bundle-Release-Date: 20221121
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 01024811b9..0a9e8d2473 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.16-SNAPSHOT
+ 1.0.17-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 29aa81d210..28d736399b 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
@@ -44,11 +44,11 @@ import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCTransaction;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.LoggingProgressMonitor;
-import org.jkiss.dbeaver.model.security.*;
import org.jkiss.dbeaver.model.security.exception.SMAccessTokenExpiredException;
import org.jkiss.dbeaver.model.security.exception.SMException;
import org.jkiss.dbeaver.model.security.exception.SMRefreshTokenExpiredException;
import org.jkiss.dbeaver.model.security.user.*;
+import org.jkiss.dbeaver.model.security.*;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
diff --git a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/AuthAttemptSessionInfo.java b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/AuthAttemptSessionInfo.java
index 7c5aee36e3..28c972bdeb 100644
--- a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/AuthAttemptSessionInfo.java
+++ b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/AuthAttemptSessionInfo.java
@@ -19,7 +19,7 @@ package io.cloudbeaver.service.security.internal;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
-import org.jkiss.dbeaver.model.security.SMSessionType;
+import org.jkiss.dbeaver.model.auth.SMSessionType;
import java.util.Map;
diff --git a/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml b/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml
index d41f5e13ca..1035557792 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 211797eea3..add5768e85 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.84-SNAPSHOT
+ 1.0.85-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 924d9f6c24..615ebb2801 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 c4c4f9c632..abb26cd816 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.4-SNAPSHOT
+ 22.2.5-SNAPSHOT
eclipse-feature
diff --git a/server/features/io.cloudbeaver.server.feature/feature.xml b/server/features/io.cloudbeaver.server.feature/feature.xml
index 0d8902748d..1cef19e74e 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 40f70144e4..9082c6882a 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.4-SNAPSHOT
+ 22.2.5-SNAPSHOT
eclipse-feature
diff --git a/server/features/io.cloudbeaver.ws.feature/feature.xml b/server/features/io.cloudbeaver.ws.feature/feature.xml
index 98f48d9187..b7f614877d 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 f17ca57b58..67ffaf8b42 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.14-SNAPSHOT
+ 1.0.15-SNAPSHOT
eclipse-feature
diff --git a/server/pom.xml b/server/pom.xml
index fdea75709d..9ca92c06ea 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -19,7 +19,7 @@
CloudBeaver CE
- 22.2.4
+ 22.2.5
diff --git a/server/product/web-server/CloudbeaverServer.product b/server/product/web-server/CloudbeaverServer.product
index de9cef9eaf..040040199b 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/CloudbeaverServer.product.launch b/server/product/web-server/CloudbeaverServer.product.launch
index 4ebc339734..640feb6e01 100644
--- a/server/product/web-server/CloudbeaverServer.product.launch
+++ b/server/product/web-server/CloudbeaverServer.product.launch
@@ -33,7 +33,6 @@
-
diff --git a/server/product/web-server/pom.xml b/server/product/web-server/pom.xml
index af56b09f4c..ad0ecb96e6 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.4-SNAPSHOT
+ 22.2.5-SNAPSHOT
web-server
eclipse-repository
Cloudbeaver Server Product
diff --git a/webapp/packages/core-authentication/src/TeamMetaParametersResource.ts b/webapp/packages/core-authentication/src/TeamMetaParametersResource.ts
new file mode 100644
index 0000000000..f5026e9f29
--- /dev/null
+++ b/webapp/packages/core-authentication/src/TeamMetaParametersResource.ts
@@ -0,0 +1,30 @@
+/*
+ * CloudBeaver - Cloud Database Manager
+ * Copyright (C) 2020-2022 DBeaver Corp and others
+ *
+ * Licensed under the Apache License, Version 2.0.
+ * you may not use this file except in compliance with the License.
+ */
+
+import { injectable } from '@cloudbeaver/core-di';
+import { SessionResource } from '@cloudbeaver/core-root';
+import { CachedDataResource, GraphQLService, ObjectPropertyInfo } from '@cloudbeaver/core-sdk';
+
+export type TeamMetaParameter = ObjectPropertyInfo;
+
+@injectable()
+export class TeamMetaParametersResource extends CachedDataResource {
+ constructor(
+ private readonly graphQLService: GraphQLService,
+ sessionResource: SessionResource,
+ ) {
+ super([]);
+
+ this.sync(sessionResource, () => { }, () => { });
+ }
+
+ protected async loader(): Promise {
+ const { parameters } = await this.graphQLService.sdk.getTeamMetaParameters();
+ return parameters;
+ }
+}
diff --git a/webapp/packages/core-authentication/src/TeamsResource.ts b/webapp/packages/core-authentication/src/TeamsResource.ts
index 47cc793a75..ba3c8bb42d 100644
--- a/webapp/packages/core-authentication/src/TeamsResource.ts
+++ b/webapp/packages/core-authentication/src/TeamsResource.ts
@@ -16,17 +16,20 @@ import {
ResourceKeyUtils,
AdminTeamInfoFragment,
AdminConnectionGrantInfo,
- CachedMapAllKey
+ CachedMapAllKey,
+ GetTeamsListQueryVariables
} from '@cloudbeaver/core-sdk';
import { isArraysEqual } from '@cloudbeaver/core-utils';
const NEW_TEAM_SYMBOL = Symbol('new-team');
export type TeamInfo = AdminTeamInfoFragment;
+
+type TeamResourceIncludes = Omit;
type NewTeam = TeamInfo & { [NEW_TEAM_SYMBOL]: boolean; timestamp: number };
@injectable()
-export class TeamsResource extends CachedMapResource {
+export class TeamsResource extends CachedMapResource {
constructor(private readonly graphQLService: GraphQLService) {
super();
}
@@ -41,8 +44,20 @@ export class TeamsResource extends CachedMapResource {
return this.data;
}
- async createTeam(teamInfo: TeamInfo): Promise {
- const response = await this.graphQLService.sdk.createTeam(teamInfo);
+ async createTeam({
+ teamId,
+ teamPermissions,
+ teamName,
+ description,
+ metaParameters,
+ }: TeamInfo): Promise {
+ const response = await this.graphQLService.sdk.createTeam({
+ teamId,
+ teamName,
+ description,
+ ...this.getDefaultIncludes(),
+ ...this.getIncludesMap(teamId),
+ });
const newTeam: NewTeam = {
...response.team,
@@ -52,19 +67,35 @@ export class TeamsResource extends CachedMapResource {
this.updateTeams(newTeam);
- await this.setSubjectPermissions(newTeam.teamId, teamInfo.teamPermissions);
+ await this.setMetaParameters(newTeam.teamId, metaParameters);
+ await this.setSubjectPermissions(newTeam.teamId, teamPermissions);
- return this.get(teamInfo.teamId)!;
+ return this.get(teamId)!;
}
- async updateTeam(teamInfo: TeamInfo): Promise {
- const { team } = await this.graphQLService.sdk.updateTeam(teamInfo);
+ async updateTeam({
+ teamId,
+ teamPermissions,
+ teamName,
+ description,
+ metaParameters,
+ }: TeamInfo): Promise {
+ const { team } = await this.graphQLService.sdk.updateTeam({
+ teamId,
+ teamName,
+ description,
+ ...this.getDefaultIncludes(),
+ ...this.getIncludesMap(teamId),
+ });
this.updateTeams(team);
- await this.setSubjectPermissions(team.teamId, teamInfo.teamPermissions);
+ await this.setMetaParameters(team.teamId, metaParameters);
+ await this.setSubjectPermissions(team.teamId, teamPermissions);
- return this.get(teamInfo.teamId)!;
+ this.markOutdated(team.teamId);
+
+ return this.get(teamId)!;
}
async deleteTeam(key: ResourceKey): Promise