From f39f930492a694b2b9d40cfe451a75baffdbdf74 Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Sat, 21 Nov 2020 12:33:14 +0300 Subject: [PATCH] CB-551 Connection settings save fix --- .../src/io/cloudbeaver/DBWebException.java | 6 +---- .../src/io/cloudbeaver/WebServiceUtils.java | 16 ++++++++---- .../model/WebConnectionConfig.java | 4 +-- .../io/cloudbeaver/server/CBApplication.java | 2 +- .../service/core/impl/WebServiceCore.java | 10 ++++---- .../service/admin/impl/WebServiceAdmin.java | 25 ++++++++++++------- 6 files changed, 36 insertions(+), 27 deletions(-) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWebException.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWebException.java index 1d625aec1d..d2c31cc58d 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWebException.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWebException.java @@ -113,16 +113,12 @@ public class DBWebException extends DBException implements GraphQLError { } if (divPos != -1) { stString = stString.substring(0, divPos); -// divPos = stString.lastIndexOf(")"); -// if (divPos != -1) { -// stString = stString.substring(0, divPos + 1); -// } } divPos = stString.indexOf(':'); if (divPos != -1) { String exceptionClass = stString.substring(0, divPos); extensions.put("exceptionClass", exceptionClass); - stString = stString.substring(divPos + 1).trim(); + //stString = stString.substring(divPos + 1).trim(); } extensions.put("stackTrace", stString); int errorCode = getErrorCode(); 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 fa417bf428..d2742a9206 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java @@ -89,7 +89,7 @@ public class WebServiceUtils { } @NotNull - public static DBPDataSourceRegistry getDataSourceRegistry() throws DBWebException { + public static DBPDataSourceRegistry getGlobalDataSourceRegistry() throws DBWebException { DBPDataSourceRegistry registry = DBWorkbench.getPlatform().getWorkspace().getDefaultDataSourceRegistry(); if (registry == null) { throw new DBWebException("No activate data source registry"); @@ -163,9 +163,15 @@ public class WebServiceUtils { } dsConfig.setProperties(newProps); } - dsConfig.setUserName(config.getUserName()); - dsConfig.setUserPassword(config.getUserPassword()); - dsConfig.setAuthModelId(config.getAuthModelId()); + if (config.getUserName() != null) { + dsConfig.setUserName(config.getUserName()); + } + if (config.getUserPassword() != null) { + dsConfig.setUserPassword(config.getUserPassword()); + } + if (config.getAuthModelId() != null) { + dsConfig.setAuthModelId(config.getAuthModelId()); + } } public static void saveAuthProperties(DBPDataSourceContainer dataSourceContainer, DBPConnectionConfiguration configuration, Map authProperties, boolean saveCredentials) { @@ -244,7 +250,7 @@ public class WebServiceUtils { dataSource = webSession.getSingletonProject().getDataSourceRegistry().getDataSource(connectionId); if (dataSource == null) { // If called for new connection in admin mode then this connection may absent in session registry yet - dataSource = getDataSourceRegistry().getDataSource(connectionId); + dataSource = getGlobalDataSourceRegistry().getDataSource(connectionId); } } return dataSource; 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 1d0b82441b..cea9840d04 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 @@ -74,12 +74,12 @@ public class WebConnectionConfig { name = JSONUtils.getString(params, "name"); description = JSONUtils.getString(params, "description"); - properties = JSONUtils.getObject(params, "properties"); + properties = JSONUtils.getObjectOrNull(params, "properties"); userName = JSONUtils.getString(params, "userName"); userPassword = JSONUtils.getString(params, "userPassword"); authModelId = JSONUtils.getString(params, "authModelId"); - credentials = JSONUtils.getObject(params, "credentials"); + credentials = JSONUtils.getObjectOrNull(params, "credentials"); saveCredentials = JSONUtils.getBoolean(params, "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 6a76a70130..86222c972a 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 @@ -531,7 +531,7 @@ public class CBApplication extends BaseApplicationImpl { try { String anonymousRoleId = appConfig.getAnonymousUserRole(); DBWSecurityController securityController = getSecurityController(); - for (DBPDataSourceContainer ds : WebServiceUtils.getDataSourceRegistry().getDataSources()) { + for (DBPDataSourceContainer ds : WebServiceUtils.getGlobalDataSourceRegistry().getDataSources()) { DBWConnectionGrant[] grants = securityController.getConnectionSubjectAccess(ds.getId()); if (ArrayUtils.isEmpty(grants)) { securityController.setConnectionSubjectAccess( 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 070e9d7d72..c6affb0ce4 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 @@ -84,7 +84,7 @@ public class WebServiceCore implements DBWServiceCore { public List getTemplateDataSources() throws DBWebException { List result = new ArrayList<>(); - DBPDataSourceRegistry dsRegistry = WebServiceUtils.getDataSourceRegistry(); + DBPDataSourceRegistry dsRegistry = WebServiceUtils.getGlobalDataSourceRegistry(); for (DBPDataSourceContainer ds : dsRegistry.getDataSources()) { if (ds.isTemplate()) { @@ -102,7 +102,7 @@ public class WebServiceCore implements DBWServiceCore { @Override public List getTemplateConnections(WebSession webSession) throws DBWebException { List result = new ArrayList<>(); - for (DBPDataSourceContainer ds : WebServiceUtils.getDataSourceRegistry().getDataSources()) { + for (DBPDataSourceContainer ds : WebServiceUtils.getGlobalDataSourceRegistry().getDataSources()) { if (ds.isTemplate() && CBPlatform.getInstance().getApplicableDrivers().contains(ds.getDriver())) { @@ -180,7 +180,7 @@ public class WebServiceCore implements DBWServiceCore { if (CommonUtils.isEmpty(templateId)) { throw new DBWebException("Only preconfigured data sources are supported yet"); } - DBPDataSourceRegistry templateRegistry = WebServiceUtils.getDataSourceRegistry(); + DBPDataSourceRegistry templateRegistry = WebServiceUtils.getGlobalDataSourceRegistry(); DBPDataSourceContainer dataSourceTemplate = templateRegistry.getDataSource(templateId); if (dataSourceTemplate == null) { throw new DBWebException("Datasource '" + templateId + "' not found"); @@ -270,7 +270,7 @@ public class WebServiceCore implements DBWServiceCore { @Override public WebConnectionInfo createConnectionFromTemplate(WebSession webSession, String templateId) throws DBWebException { - DBPDataSourceRegistry templateRegistry = WebServiceUtils.getDataSourceRegistry(); + DBPDataSourceRegistry templateRegistry = WebServiceUtils.getGlobalDataSourceRegistry(); DBPDataSourceContainer dataSourceTemplate = templateRegistry.getDataSource(templateId); if (dataSourceTemplate == null) { throw new DBWebException("Template data source '" + templateId + "' not found"); @@ -324,7 +324,7 @@ public class WebServiceCore implements DBWServiceCore { if (dataSource != null) { testDataSource = dataSource.createCopy(dataSource.getRegistry()); WebServiceUtils.setConnectionConfiguration(testDataSource.getDriver(), testDataSource.getConnectionConfiguration(), connectionConfig); - WebServiceUtils.saveAuthProperties(testDataSource, testDataSource.getConnectionConfiguration(), connectionConfig.getCredentials(), connectionConfig.isSaveCredentials()); + WebServiceUtils.saveAuthProperties(testDataSource, testDataSource.getConnectionConfiguration(), connectionConfig.getCredentials(), true); } else { testDataSource = WebServiceUtils.createConnectionFromConfig(connectionConfig, sessionRegistry); } 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 8f676b48ce..0bfa370318 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 @@ -249,7 +249,7 @@ public class WebServiceAdmin implements DBWServiceAdmin { public List getAllConnections(@NotNull WebSession webSession) throws DBWebException { // Get all connections from global configuration List result = new ArrayList<>(); - for (DBPDataSourceContainer ds : WebServiceUtils.getDataSourceRegistry().getDataSources()) { + for (DBPDataSourceContainer ds : WebServiceUtils.getGlobalDataSourceRegistry().getDataSources()) { if (CBPlatform.getInstance().getApplicableDrivers().contains(ds.getDriver())) { result.add(new WebConnectionInfo(webSession, ds)); } @@ -267,7 +267,7 @@ public class WebServiceAdmin implements DBWServiceAdmin { @Override public WebConnectionInfo createConnectionConfiguration(@NotNull WebSession webSession, @NotNull WebConnectionConfig config) throws DBWebException { - DBPDataSourceRegistry registry = WebServiceUtils.getDataSourceRegistry(); + DBPDataSourceRegistry registry = WebServiceUtils.getGlobalDataSourceRegistry(); DBPDataSourceContainer dataSource = WebServiceUtils.createConnectionFromConfig(config, registry); registry.addDataSource(dataSource); registry.flushConfig(); @@ -279,7 +279,7 @@ public class WebServiceAdmin implements DBWServiceAdmin { public WebConnectionInfo copyConnectionConfiguration(@NotNull WebSession webSession, @NotNull String nodePath) throws DBWebException { try { DBNModel globalNavigatorModel = webSession.getNavigatorModel(); - DBPDataSourceRegistry globalDataSourceRegistry = WebServiceUtils.getDataSourceRegistry(); + DBPDataSourceRegistry globalDataSourceRegistry = WebServiceUtils.getGlobalDataSourceRegistry(); DBNNode srcNode = globalNavigatorModel.getNodeByPath(webSession.getProgressMonitor(), nodePath); if (srcNode == null) { @@ -303,23 +303,30 @@ public class WebServiceAdmin implements DBWServiceAdmin { @Override public WebConnectionInfo updateConnectionConfiguration(@NotNull WebSession webSession, @NotNull String id, @NotNull WebConnectionConfig config) throws DBWebException { - DBPDataSourceContainer dataSource = WebServiceUtils.getDataSourceRegistry().getDataSource(id); + DBPDataSourceContainer dataSource = WebServiceUtils.getGlobalDataSourceRegistry().getDataSource(id); if (dataSource == null) { throw new DBWebException("Connection '" + id + "' not found"); } WebServiceUtils.updateConnectionFromConfig(dataSource, config); dataSource.persistConfiguration(); + // Update local datasource as well. We use it for connection tests + // It may be null if this connection was just created + DBPDataSourceContainer localDS = webSession.getSingletonProject().getDataSourceRegistry().getDataSource(id); + if (localDS != null) { + WebServiceUtils.updateConnectionFromConfig(localDS, config); + // We don't need to save it in local registry (because in fact it is stored in the global registry) + } return new WebConnectionInfo(webSession, dataSource); } @Override public boolean deleteConnectionConfiguration(@NotNull WebSession webSession, @NotNull String id) throws DBWebException { - DBPDataSourceContainer dataSource = WebServiceUtils.getDataSourceRegistry().getDataSource(id); + DBPDataSourceContainer dataSource = WebServiceUtils.getGlobalDataSourceRegistry().getDataSource(id); if (dataSource == null) { throw new DBWebException("Connection '" + id + "' not found"); } - WebServiceUtils.getDataSourceRegistry().removeDataSource(dataSource); - WebServiceUtils.getDataSourceRegistry().flushConfig(); + WebServiceUtils.getGlobalDataSourceRegistry().removeDataSource(dataSource); + WebServiceUtils.getGlobalDataSourceRegistry().flushConfig(); try { CBApplication.getInstance().getSecurityController().setConnectionSubjectAccess(id, null, null); @@ -389,7 +396,7 @@ public class WebServiceAdmin implements DBWServiceAdmin { @Override public boolean setConnectionSubjectAccess(@NotNull WebSession webSession, @NotNull String connectionId, @NotNull List subjects) throws DBWebException { - DBPDataSourceContainer dataSource = WebServiceUtils.getDataSourceRegistry().getDataSource(connectionId); + DBPDataSourceContainer dataSource = WebServiceUtils.getGlobalDataSourceRegistry().getDataSource(connectionId); if (dataSource == null) { throw new DBWebException("Connection '" + connectionId + "' not found"); } @@ -417,7 +424,7 @@ public class WebServiceAdmin implements DBWServiceAdmin { @Override public boolean setSubjectConnectionAccess(@NotNull WebSession webSession, @NotNull String subjectId, @NotNull List connections) throws DBWebException { for (String connectionId : connections) { - if (WebServiceUtils.getDataSourceRegistry().getDataSource(connectionId) == null) { + if (WebServiceUtils.getGlobalDataSourceRegistry().getDataSource(connectionId) == null) { throw new DBWebException("Connection '" + connectionId + "' not found"); } }