Skip to content

Commit 0e452d9

Browse files
authored
Merge branch 'devel' into 7157-external-browser-auth-model
2 parents f5daa0d + c39de17 commit 0e452d9

File tree

175 files changed

+5893
-714
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

175 files changed

+5893
-714
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<img src="https://github.com/dbeaver/cloudbeaver/wiki/images/cloudbeaver-logo.png" align="right" width="250"/>
1+
<img src="https://github.com/dbeaver/cloudbeaver/wiki/images/cloudbeaver-logo.png" alt="CloudBeaver logo" align="right" width="250"/>
22

33
# CloudBeaver Community
44

@@ -25,6 +25,11 @@ You can see a live demo of CloudBeaver here: https://demo.cloudbeaver.io
2525

2626
## Changelog
2727

28+
### 25.3.1 2025-12-22
29+
- Implemented an ability to add parameters and variables to queries in the SQL Editor. This feature allows for the reuse of queries by changing parameters at the execution stage. It is enabled by default and can be configured in personal preferences;
30+
- Added support for mapping users to CloudBeaver teams based on LDAP memberOf group membership;
31+
- Added support for previous browser versions, but not older than three years.
32+
2833
### 25.3.0 2025-12-01
2934
### Changes since 25.2.0:
3035
- Administration:

server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionProjectImpl.java

Lines changed: 47 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -24,63 +24,83 @@
2424
import org.jkiss.code.Nullable;
2525
import org.jkiss.dbeaver.DBException;
2626
import org.jkiss.dbeaver.Log;
27+
import org.jkiss.dbeaver.model.DBPAdaptable;
2728
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
29+
import org.jkiss.dbeaver.model.DBPObjectSettingsProvider;
2830
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
2931
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistryCache;
3032
import org.jkiss.dbeaver.model.navigator.DBNModel;
3133
import org.jkiss.dbeaver.model.rm.RMProject;
3234
import org.jkiss.dbeaver.model.rm.RMUtils;
35+
import org.jkiss.dbeaver.model.security.SMControllerUtils;
3336
import org.jkiss.dbeaver.model.security.SMObjectType;
3437
import org.jkiss.dbeaver.model.websocket.event.datasource.WSDataSourceEvent;
3538
import org.jkiss.dbeaver.model.websocket.event.datasource.WSDataSourceProperty;
3639
import org.jkiss.dbeaver.registry.DataSourceDescriptor;
3740
import org.jkiss.dbeaver.registry.DataSourceRegistry;
41+
import org.jkiss.dbeaver.registry.project.BaseProjectSettings;
3842
import org.jkiss.dbeaver.runtime.jobs.DisconnectJob;
3943
import org.jkiss.utils.CommonUtils;
4044

4145
import java.nio.file.Path;
42-
import java.util.ArrayList;
43-
import java.util.HashMap;
44-
import java.util.List;
45-
import java.util.Map;
46-
import java.util.concurrent.ConcurrentHashMap;
46+
import java.util.*;
4747

48-
public class WebSessionProjectImpl extends WebProjectImpl {
48+
public class WebSessionProjectImpl extends WebProjectImpl implements DBPAdaptable {
4949
private static final Log log = Log.getLog(WebSessionProjectImpl.class);
50+
5051
protected final WebSession webSession;
5152
private final Map<String, WebConnectionInfo> connections = new HashMap<>();
52-
private final Map<String, Object> projectSettings = new ConcurrentHashMap<>();
53+
private final BaseProjectSettings projectSettings;
5354
private boolean registryIsLoaded = false;
5455

5556
public WebSessionProjectImpl(
5657
@NotNull WebSession webSession,
5758
@NotNull RMProject project
5859
) {
59-
super(
60-
webSession.getWorkspace(),
61-
webSession.getRmController(),
62-
webSession.getSessionContext(),
63-
project,
64-
webSession.getUserPreferenceStore(),
65-
RMUtils.getProjectPath(project)
66-
);
67-
this.webSession = webSession;
60+
this(webSession, project, null);
6861
}
6962

7063
public WebSessionProjectImpl(
7164
@NotNull WebSession webSession,
7265
@NotNull RMProject project,
73-
@NotNull Path path
66+
@Nullable Path path
7467
) {
7568
super(
7669
webSession.getWorkspace(),
7770
webSession.getRmController(),
7871
webSession.getSessionContext(),
7972
project,
8073
webSession.getUserPreferenceStore(),
81-
path
74+
path == null ? RMUtils.getProjectPath(project) : path
8275
);
8376
this.webSession = webSession;
77+
this.projectSettings = new BaseProjectSettings(this) {
78+
@NotNull
79+
@Override
80+
protected Map<SMObjectType, Map<String, Map<String, String>>> loadAllProjectSettings() throws DBException {
81+
if (webSession.getUser() == null) {
82+
return new LinkedHashMap<>();
83+
}
84+
return SMControllerUtils.getObjectSettingsMap(WebSessionProjectImpl.this, webSession.getSecurityController());
85+
}
86+
87+
@Override
88+
protected void saveProjectSettings(
89+
@NotNull SMObjectType objectType,
90+
@NotNull String objectId,
91+
@NotNull Map<String, String> settings
92+
) throws DBException {
93+
if (webSession.getUserContext().isNonAnonymousUserAuthorizedInSM()) {
94+
webSession.getSecurityController().setObjectSettings(getId(), objectType, objectId, settings);
95+
}
96+
}
97+
98+
};
99+
}
100+
101+
@NotNull
102+
public BaseProjectSettings getProjectSettings() {
103+
return projectSettings;
84104
}
85105

86106
@Nullable
@@ -89,6 +109,14 @@ public DBNModel getNavigatorModel() {
89109
return webSession.getNavigatorModel();
90110
}
91111

112+
@Override
113+
public <T> T getAdapter(@NotNull Class<T> adapter) {
114+
if (adapter == DBPObjectSettingsProvider.class) {
115+
return adapter.cast(projectSettings);
116+
}
117+
return null;
118+
}
119+
92120
@NotNull
93121
@Override
94122
protected DBPDataSourceRegistry createDataSourceRegistry() {
@@ -244,21 +272,6 @@ public synchronized boolean updateProjectDataSources(@NotNull WSDataSourceEvent
244272
return sendDataSourceUpdatedEvent;
245273
}
246274

247-
// TODO: load project settings on project load
248-
public void refreshProjectSettings() throws DBException {
249-
if (webSession.getUser() == null) {
250-
projectSettings.clear();
251-
return;
252-
}
253-
Map<String, Object> loadedSettings = webSession.getSecurityController().getObjectSettings(
254-
getId(),
255-
SMObjectType.project,
256-
null
257-
);
258-
projectSettings.clear();
259-
projectSettings.putAll(loadedSettings);
260-
}
261-
262275
@NotNull
263276
public WebConnectionInfo createConnectionInfo(@NotNull DBPDataSourceContainer dataSourceDescriptor) {
264277
return new WebConnectionInfo(webSession, dataSourceDescriptor);
@@ -331,19 +344,9 @@ public boolean deleteConnection(@NotNull String connectionId) throws DBWebExcept
331344
@NotNull
332345
private WebConnectionInfo closeAndDeleteConnection(@NotNull WebConnectionInfo connectionInfo) throws DBWebException {
333346
DBPDataSourceContainer dataSourceContainer = connectionInfo.getDataSourceContainer();
334-
boolean disconnected = WebDataSourceUtils.disconnectDataSource(webSession, dataSourceContainer);
347+
WebDataSourceUtils.disconnectDataSource(webSession, dataSourceContainer);
335348
DBPDataSourceRegistry registry = getDataSourceRegistry();
336349
registry.removeDataSource(dataSourceContainer);
337-
try {
338-
registry.checkForErrors();
339-
} catch (DBException e) {
340-
try {
341-
registry.addDataSource(dataSourceContainer);
342-
} catch (DBException ex) {
343-
log.error("Error re-adding after delete attempt", e);
344-
}
345-
throw new DBWebException("Failed to delete connection", e);
346-
}
347350
removeConnection(dataSourceContainer);
348351
return connectionInfo;
349352
}

0 commit comments

Comments
 (0)