CB-6109 fix deadlock and keep filter only in global project (#3195)

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
This commit is contained in:
Ainur
2025-01-24 11:25:24 +01:00
committed by GitHub
co-authored by mr-anton-t
parent bfd435dc5e
commit ade04708a3
4 changed files with 31 additions and 32 deletions
@@ -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;
}
}
@@ -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<String> accessibleConnectionIds = Collections.emptySet();
private final Set<String> 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<String> 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;
}
}
@@ -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;
}
@@ -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));
}
}