diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebProjectImpl.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebProjectImpl.java index 8a1691cefc..58ee233e45 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebProjectImpl.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebProjectImpl.java @@ -84,10 +84,7 @@ public abstract class WebProjectImpl extends BaseWebProjectImpl { @NotNull @Override protected DBPDataSourceRegistry createDataSourceRegistry() { - return new WebDataSourceRegistryProxy( - createRMRegistry(), - getDataSourceFilter() - ); + return createRMRegistry(); } @NotNull @@ -95,9 +92,4 @@ public abstract class WebProjectImpl extends BaseWebProjectImpl { return new DataSourceRegistryRM<>(this, getResourceController(), preferenceStore); } - @NotNull - public DataSourceFilter getDataSourceFilter() { - return (ds) -> true; - } - } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionGlobalProjectImpl.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionGlobalProjectImpl.java index 66f48d8d03..49663933cf 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionGlobalProjectImpl.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionGlobalProjectImpl.java @@ -22,13 +22,13 @@ import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.DBPEvent; +import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry; import org.jkiss.dbeaver.model.rm.RMProject; import org.jkiss.dbeaver.model.security.SMObjectType; import org.jkiss.dbeaver.model.security.user.SMObjectPermissions; -import java.util.Collections; import java.util.Set; -import java.util.stream.Collectors; +import java.util.concurrent.CopyOnWriteArraySet; /** * Global project. @@ -36,31 +36,39 @@ import java.util.stream.Collectors; */ public class WebSessionGlobalProjectImpl extends WebSessionProjectImpl { private static final Log log = Log.getLog(WebSessionGlobalProjectImpl.class); - private Set accessibleConnectionIds = Collections.emptySet(); + + private final Set accessibleConnectionIds = new CopyOnWriteArraySet<>(); public WebSessionGlobalProjectImpl(@NotNull WebSession webSession, @NotNull RMProject project) { super(webSession, project); } /** - * Update info about accessible connections from a database. + * Creates data source registry that can filter data sources that are not accessible for user. */ - public synchronized void refreshAccessibleConnectionIds() { - this.accessibleConnectionIds = readAccessibleConnectionIds(); + @NotNull + @Override + protected DBPDataSourceRegistry createDataSourceRegistry() { + return new WebDataSourceRegistryProxy( + createRegistryWithCredentialsProvider(), + this::isDataSourceAccessible + ); } - @NotNull - private Set readAccessibleConnectionIds() { + /** + * Update info about accessible connections from a database. + */ + public void refreshAccessibleConnectionIds() { + this.accessibleConnectionIds.clear(); try { - return webSession.getSecurityController() - .getAllAvailableObjectsPermissions(SMObjectType.datasource) - .stream() - .map(SMObjectPermissions::getObjectId) - .collect(Collectors.toSet()); + for (SMObjectPermissions smObjectPermissions : webSession.getSecurityController() + .getAllAvailableObjectsPermissions(SMObjectType.datasource)) { + String objectId = smObjectPermissions.getObjectId(); + this.accessibleConnectionIds.add(objectId); + } } catch (DBException e) { webSession.addSessionError(e); log.error("Error reading connection grants", e); - return Collections.emptySet(); } } @@ -110,9 +118,4 @@ public class WebSessionGlobalProjectImpl extends WebSessionProjectImpl { dataSource.dispose(); } } - - @NotNull - public DataSourceFilter getDataSourceFilter() { - return this::isDataSourceAccessible; - } } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionProjectImpl.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionProjectImpl.java index 5c4d20aa81..dc175a45b2 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionProjectImpl.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionProjectImpl.java @@ -30,6 +30,7 @@ import org.jkiss.dbeaver.model.rm.RMProject; import org.jkiss.dbeaver.model.rm.RMUtils; import org.jkiss.dbeaver.model.websocket.event.datasource.WSDataSourceEvent; import org.jkiss.dbeaver.registry.DataSourceDescriptor; +import org.jkiss.dbeaver.registry.DataSourceRegistry; import org.jkiss.dbeaver.runtime.jobs.DisconnectJob; import java.nio.file.Path; @@ -83,7 +84,12 @@ public class WebSessionProjectImpl extends WebProjectImpl { @NotNull @Override protected DBPDataSourceRegistry createDataSourceRegistry() { - DBPDataSourceRegistry dataSourceRegistry = super.createDataSourceRegistry(); + return createRegistryWithCredentialsProvider(); + } + + @NotNull + protected DataSourceRegistry createRegistryWithCredentialsProvider() { + DataSourceRegistry dataSourceRegistry = createRMRegistry(); dataSourceRegistry.setAuthCredentialsProvider(webSession); return dataSourceRegistry; } 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 00a6cab21f..746460111a 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 @@ -179,9 +179,7 @@ public class WebServiceCore implements DBWServiceCore { ) { DBPDataSourceRegistry registry = project.getDataSourceRegistry(); for (DBPDataSourceContainer ds : registry.getDataSources()) { - if (ds.isTemplate() && - project.getDataSourceFilter().filter(ds) && - WebAppUtils.getWebApplication().getDriverRegistry().getApplicableDrivers().contains(ds.getDriver())) { + if (ds.isTemplate() && WebAppUtils.getWebApplication().getDriverRegistry().getApplicableDrivers().contains(ds.getDriver())) { result.add(new WebConnectionInfo(webSession, ds)); } }