From 37b7d2d3cff3a8cc86c39ba94482ac651b8968fe Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Wed, 20 May 2020 15:09:04 +0300 Subject: [PATCH 1/7] Product launch fix. Auth fix --- .../src/io/cloudbeaver/server/CBDatabase.java | 2 +- .../server/CBSecurityController.java | 5 +- .../CloudbeaverServer.product.launch | 211 +++++++++++++++++- webapp/yarn.lock | 69 +----- 4 files changed, 212 insertions(+), 75 deletions(-) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBDatabase.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBDatabase.java index 5dbfe65bae..7e33bfe7ac 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBDatabase.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBDatabase.java @@ -82,7 +82,7 @@ public class CBDatabase { void initialize() throws DBException { if (CommonUtils.isEmpty(databaseConfiguration.getDriver())) { - throw new DBException("Database driver not specified"); + throw new DBException("No database driver configured for CloudBeaver database"); } DriverDescriptor driver = DataSourceProviderRegistry.getInstance().findDriver(databaseConfiguration.getDriver()); if (driver == null) { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBSecurityController.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBSecurityController.java index 0b15e2353b..4d328b09b1 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBSecurityController.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBSecurityController.java @@ -148,7 +148,7 @@ class CBSecurityController implements DBWSecurityController { String propertyName = cred.getKey(); WebAuthProviderPropertyDescriptor property = authProvider.getCredentialParameter(propertyName); if (property == null) { - throw new IllegalArgumentException("Invalid auth provider '" + authProvider.getId() + "' property '" + propertyName + "'"); + return null; } String encodedValue = CommonUtils.toString(cred.getValue()); encodedValue = property.getEncryption().encrypt(userId, encodedValue); @@ -162,6 +162,9 @@ class CBSecurityController implements DBWSecurityController { if (!CommonUtils.isEmpty(credentials)) { try (PreparedStatement dbStat = dbCon.prepareStatement("INSERT INTO CB_USER_CREDENTIALS(USER_ID,PROVIDER_ID,CRED_ID,CRED_VALUE) VALUES(?,?,?,?)")) { for (String[] cred : transformedCredentials) { + if (cred == null) { + continue; + } dbStat.setString(1, userId); dbStat.setString(2, authProvider.getId()); dbStat.setString(3, cred[0]); diff --git a/server/product/web-server/CloudbeaverServer.product.launch b/server/product/web-server/CloudbeaverServer.product.launch index 7b4e4a0f78..a23f453f50 100644 --- a/server/product/web-server/CloudbeaverServer.product.launch +++ b/server/product/web-server/CloudbeaverServer.product.launch @@ -12,16 +12,18 @@ + - + + - + @@ -34,13 +36,212 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/webapp/yarn.lock b/webapp/yarn.lock index ad5817e815..beb844f416 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -2972,15 +2972,6 @@ axobject-query@^2.0.2: "@babel/runtime" "^7.7.4" "@babel/runtime-corejs3" "^7.7.4" -babel-code-frame@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - babel-loader@^8.0.6: version "8.0.6" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" @@ -5006,13 +4997,6 @@ eslint-plugin-jsx-a11y@^6.2.3: has "^1.0.3" jsx-ast-utils "^2.2.1" -eslint-plugin-prettier@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz#507b8562410d02a03f0ddc949c616f877852f2ba" - integrity sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA== - dependencies: - prettier-linter-helpers "^1.0.0" - eslint-plugin-react-hooks@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04" @@ -5388,11 +5372,6 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - fast-glob@^2.0.2, fast-glob@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" @@ -5625,19 +5604,6 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -fork-ts-checker-webpack-plugin@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.0.5.tgz#1982b464cb8a44d224940a95a0d075c8bbd700bf" - integrity sha512-7juf7VGQ4GD7beQI2vsHlWME4H7cabXn4+zYzvWTOYQUjn3L+3tWQe8j9KnVOpdCf+1PoSvYMRT2A2kltfGLtQ== - dependencies: - babel-code-frame "^6.22.0" - chalk "^2.4.1" - micromatch "^3.1.10" - minimatch "^3.0.4" - semver "^5.6.0" - tapable "^1.0.0" - worker-rpc "^0.1.0" - form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -7051,11 +7017,6 @@ js-levenshtein@^1.1.3: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - js-yaml@^3.13.0, js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" @@ -7679,11 +7640,6 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -microevent.ts@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" - integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== - micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -9703,19 +9659,12 @@ prettier-eslint@^9.0.0: typescript "^3.2.1" vue-eslint-parser "^2.0.2" -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - prettier@1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== -prettier@^1.19.1, prettier@^1.7.0: +prettier@^1.7.0: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== @@ -10041,15 +9990,6 @@ react@>=15: object-assign "^4.1.1" prop-types "^15.6.2" -react@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" - integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -12396,13 +12336,6 @@ worker-farm@^1.7.0: dependencies: errno "~0.1.7" -worker-rpc@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" - integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== - dependencies: - microevent.ts "~0.1.1" - wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" From 8f94243a1f272d0789a81d47190d57cf24a2ee07 Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Wed, 20 May 2020 20:00:45 +0300 Subject: [PATCH 2/7] AWS RDS explorer + authentication --- .../src/io/cloudbeaver/server/CBDatabase.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBDatabase.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBDatabase.java index 7e33bfe7ac..7cbf858089 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBDatabase.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBDatabase.java @@ -33,10 +33,10 @@ import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBConstants; +import org.jkiss.dbeaver.model.connection.DBPDriver; import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.runtime.LoggingProgressMonitor; import org.jkiss.dbeaver.registry.DataSourceProviderRegistry; -import org.jkiss.dbeaver.registry.driver.DriverDescriptor; import org.jkiss.dbeaver.utils.ContentUtils; import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.dbeaver.utils.SystemVariablesResolver; @@ -84,7 +84,7 @@ public class CBDatabase { if (CommonUtils.isEmpty(databaseConfiguration.getDriver())) { throw new DBException("No database driver configured for CloudBeaver database"); } - DriverDescriptor driver = DataSourceProviderRegistry.getInstance().findDriver(databaseConfiguration.getDriver()); + DBPDriver driver = DataSourceProviderRegistry.getInstance().findDriver(databaseConfiguration.getDriver()); if (driver == null) { throw new DBException("Driver '" + databaseConfiguration.getDriver() + "' not found"); } From df3d27a8bf758dd31b1c63b9baf5017c63a73c6e Mon Sep 17 00:00:00 2001 From: serge-rider Date: Wed, 20 May 2020 22:53:22 +0300 Subject: [PATCH 3/7] Include h2 and clickhouse in EE drivers --- .../sample/SampleDataSourceConfigurationStorage.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/bundles/io.cloudbeaver.connect.provider.sample/src/io/cloudbeaver/connect/provider/sample/SampleDataSourceConfigurationStorage.java b/server/bundles/io.cloudbeaver.connect.provider.sample/src/io/cloudbeaver/connect/provider/sample/SampleDataSourceConfigurationStorage.java index 3b80569972..c3ec2cb7e5 100644 --- a/server/bundles/io.cloudbeaver.connect.provider.sample/src/io/cloudbeaver/connect/provider/sample/SampleDataSourceConfigurationStorage.java +++ b/server/bundles/io.cloudbeaver.connect.provider.sample/src/io/cloudbeaver/connect/provider/sample/SampleDataSourceConfigurationStorage.java @@ -66,9 +66,9 @@ public class SampleDataSourceConfigurationStorage implements DBPDataSourceConfig if (sampleConfigFile.exists()) { log.debug("Loading provided connections from [" + sampleConfigFile.getFullPath().toString() + "]"); List dsList = registry.loadDataSourcesFromFile(this, sampleConfigFile); - for (DBPDataSourceContainer ds : dsList) { - log.debug("\tProvided connection: " + ds.getName()); - } +// for (DBPDataSourceContainer ds : dsList) { +// log.debug("\tProvided connection: " + ds.getName()); +// } return dsList; } } From b39a6bf13d8a2f06e64f137b54823945b928c2b1 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Wed, 20 May 2020 23:16:39 +0300 Subject: [PATCH 4/7] CB-59 Drivers in CB EE --- .../src/io/cloudbeaver/model/WebDatabaseDriverConfig.java | 3 +++ .../src/io/cloudbeaver/server/CBPlatform.java | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebDatabaseDriverConfig.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebDatabaseDriverConfig.java index 7ca4561388..9782adfe43 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebDatabaseDriverConfig.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebDatabaseDriverConfig.java @@ -152,6 +152,9 @@ public class WebDatabaseDriverConfig { cfg.setHostPort(driver.getDefaultPort()); cfg.setUrl(driver.getDataSourceProvider().getConnectionURL(driver, cfg)); DBPPropertyDescriptor[] properties = driver.getDataSourceProvider().getConnectionProperties(webSession.getProgressMonitor(), driver, cfg); + if (properties == null) { + return new WebPropertyInfo[0]; + } PropertySourceCustom propertySource = new PropertySourceCustom( properties, diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatform.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatform.java index ac28c49583..020626f844 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatform.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatform.java @@ -155,7 +155,7 @@ public class CBPlatform extends BasePlatformImpl { continue; } List libraries = driver.getDriverLibraries(); - if (!libraries.isEmpty()) { + { boolean hasAllFiles = true; for (DBPDriverLibrary lib : libraries) { if (!lib.isOptional() && lib.getType() != DBPDriverLibrary.FileType.license && @@ -172,7 +172,7 @@ public class CBPlatform extends BasePlatformImpl { } } } - log.info("Available drivers: " + applicableDrivers.stream().map(DBPDriver::getId).collect(Collectors.joining(","))); + log.info("Available drivers: " + applicableDrivers.stream().map(DBPDriver::getFullName).collect(Collectors.joining(","))); sessionManager = WebSessionManager.getInstance(); From 2ea250fcd4ed8e88ea8227c5a99f6f5cbb079e6c Mon Sep 17 00:00:00 2001 From: serge-rider Date: Thu, 21 May 2020 01:44:46 +0300 Subject: [PATCH 5/7] Non-standard connections support --- .../cloudbeaver/model/session/WebSession.java | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java index 78b26a2b20..4c383ebd15 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java @@ -28,16 +28,14 @@ import io.cloudbeaver.server.CBPlatform; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.app.DBPProject; import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.meta.Association; import org.jkiss.dbeaver.model.meta.Property; -import org.jkiss.dbeaver.model.navigator.DBNModel; -import org.jkiss.dbeaver.model.navigator.DBNNode; -import org.jkiss.dbeaver.model.navigator.DBNProject; -import org.jkiss.dbeaver.model.navigator.DBNProjectDatabases; +import org.jkiss.dbeaver.model.navigator.*; import org.jkiss.dbeaver.model.runtime.*; import org.jkiss.dbeaver.runtime.jobs.DisconnectJob; import org.jkiss.utils.CommonUtils; @@ -73,7 +71,7 @@ public class WebSession { private String locale; private boolean cacheExpired; - private final List connections = new ArrayList<>(); + private final Map connections = new HashMap<>(); private final List progressMessages = new ArrayList<>(); private final Map asyncTasks = new HashMap<>(); @@ -184,7 +182,7 @@ public class WebSession { for (DBPDataSourceContainer ds : databases.getDataSourceRegistry().getDataSources()) { if (ds.isProvided()) { WebConnectionInfo connectionInfo = new WebConnectionInfo(this, ds); - connections.add(connectionInfo); + connections.put(connectionInfo.getId(), connectionInfo); } } } @@ -201,13 +199,13 @@ public class WebSession { attributes.clear(); } - List conCopy; + Map conCopy; synchronized (this.connections) { - conCopy = new ArrayList<>(this.connections); + conCopy = new HashMap<>(this.connections); this.connections.clear(); } - for (WebConnectionInfo connectionInfo : conCopy) { + for (WebConnectionInfo connectionInfo : conCopy.values()) { if (connectionInfo.isConnected()) { new DisconnectJob(connectionInfo.getDataSourceContainer()).schedule(); } @@ -293,23 +291,28 @@ public class WebSession { @Association public List getConnections() { synchronized (connections) { - return new ArrayList<>(connections); + return new ArrayList<>(connections.values()); } } @NotNull public WebConnectionInfo getWebConnectionInfo(String connectionID) throws DBWebException { - WebConnectionInfo connectionInfo = null; + WebConnectionInfo connectionInfo; synchronized (connections) { - for (WebConnectionInfo ci : connections) { - if (ci.getId().equals(connectionID)) { - connectionInfo = ci; - break; - } - } + connectionInfo = connections.get(connectionID); } if (connectionInfo == null) { - throw new DBWebException("Connection '" + connectionID + "' not found"); + DBNNode dbNode = null; + try { + dbNode = navigatorModel.getNodeByPath(progressMonitor, connectionID); + } catch (DBException e) { + log.debug(e); + } + if (dbNode instanceof DBNDataSource) { + return new WebConnectionInfo(this, ((DBNDataSource) dbNode).getDataSourceContainer()); + } else { + throw new DBWebException("Connection '" + connectionID + "' not found"); + } } return connectionInfo; } @@ -317,13 +320,13 @@ public class WebSession { public void addConnection(WebConnectionInfo connectionInfo) { synchronized (connections) { - connections.add(connectionInfo); + connections.put(connectionInfo.getId(), connectionInfo); } } public void removeConnection(WebConnectionInfo connectionInfo) { synchronized (connections) { - connections.remove(connectionInfo); + connections.remove(connectionInfo.getId()); } } From 52f3e98f9832a602706d5aed597d9bc15dea063e Mon Sep 17 00:00:00 2001 From: serge-rider Date: Thu, 21 May 2020 10:23:17 +0300 Subject: [PATCH 6/7] Show user display name (if present) --- webapp/packages/authentication/src/UserInfo.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/packages/authentication/src/UserInfo.tsx b/webapp/packages/authentication/src/UserInfo.tsx index dfabf6b880..d5cb9c0da7 100644 --- a/webapp/packages/authentication/src/UserInfo.tsx +++ b/webapp/packages/authentication/src/UserInfo.tsx @@ -52,7 +52,7 @@ export const UserInfo = observer(function UserInfo() { - {authInfoService.userInfo.userId} + {authInfoService.userInfo.displayName || authInfoService.userInfo.userId} ); }); From d6282bf3428d9e768f4d1e947cffaeecd0bc2269 Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Thu, 21 May 2020 16:47:30 +0300 Subject: [PATCH 7/7] Cloud extension improvements --- .../cloudbeaver/model/session/WebSession.java | 29 +++++++++++-------- .../service/core/impl/WebServiceCore.java | 8 ++--- .../navigator/impl/WebServiceNavigator.java | 8 ++++- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java index 4c383ebd15..3c47a6efe8 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java @@ -28,14 +28,16 @@ import io.cloudbeaver.server.CBPlatform; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.jkiss.code.NotNull; -import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.app.DBPProject; import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.meta.Association; import org.jkiss.dbeaver.model.meta.Property; -import org.jkiss.dbeaver.model.navigator.*; +import org.jkiss.dbeaver.model.navigator.DBNModel; +import org.jkiss.dbeaver.model.navigator.DBNNode; +import org.jkiss.dbeaver.model.navigator.DBNProject; +import org.jkiss.dbeaver.model.navigator.DBNProjectDatabases; import org.jkiss.dbeaver.model.runtime.*; import org.jkiss.dbeaver.runtime.jobs.DisconnectJob; import org.jkiss.utils.CommonUtils; @@ -81,6 +83,7 @@ public class WebSession { private DBNModel navigatorModel; private DBNProjectDatabases databases; private DBRProgressMonitor progressMonitor = new SessionProgressMonitor(); + private DBNProject projectNode; public WebSession(HttpSession httpSession) { this.id = httpSession.getId(); @@ -173,7 +176,7 @@ public class WebSession { this.navigatorModel.initialize(); DBPProject project = platform.getWorkspace().getActiveProject(); - DBNProject projectNode = this.navigatorModel.getRoot().getProjectNode(project); + this.projectNode = this.navigatorModel.getRoot().getProjectNode(project); this.databases = projectNode.getDatabases(); this.locale = Locale.getDefault().getLanguage(); @@ -245,7 +248,11 @@ public class WebSession { return navigatorModel; } - public DBNProjectDatabases getDatabases() { + public DBNProject getProjectNode() { + return projectNode; + } + + public DBNProjectDatabases getDatabasesNode() { return databases; } @@ -302,14 +309,12 @@ public class WebSession { connectionInfo = connections.get(connectionID); } if (connectionInfo == null) { - DBNNode dbNode = null; - try { - dbNode = navigatorModel.getNodeByPath(progressMonitor, connectionID); - } catch (DBException e) { - log.debug(e); - } - if (dbNode instanceof DBNDataSource) { - return new WebConnectionInfo(this, ((DBNDataSource) dbNode).getDataSourceContainer()); + DBPDataSourceContainer dataSource = databases.getDataSourceRegistry().getDataSource(connectionID); + if (dataSource != null) { + connectionInfo = new WebConnectionInfo(this, dataSource); + synchronized (connections) { + connections.put(connectionID, connectionInfo); + } } else { throw new DBWebException("Connection '" + connectionID + "' not found"); } 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 52149d8c76..b1c0f28116 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 @@ -135,7 +135,7 @@ public class WebServiceCore implements DBWServiceCore { throw new DBWebException("Datasource '" + dataSourceId + "' not found"); } - DBPDataSourceRegistry sessionRegistry = webSession.getDatabases().getDataSourceRegistry(); + DBPDataSourceRegistry sessionRegistry = webSession.getDatabasesNode().getDataSourceRegistry(); DBPDataSourceContainer newDataSource = sessionRegistry.createDataSource(dataSourceTemplate); newDataSource.setSavePassword(true); ((DataSourceDescriptor)newDataSource).setTemporary(true); @@ -164,7 +164,7 @@ public class WebServiceCore implements DBWServiceCore { @Override public WebConnectionInfo createConnection(WebSession webSession, WebConnectionConfig connectionConfig) throws DBWebException { - DBPDataSourceRegistry sessionRegistry = webSession.getDatabases().getDataSourceRegistry(); + DBPDataSourceRegistry sessionRegistry = webSession.getDatabasesNode().getDataSourceRegistry(); DBPDataSourceContainer newDataSource = makeConnectionInstance(connectionConfig, sessionRegistry); if (CommonUtils.isEmpty(newDataSource.getName())) { @@ -181,7 +181,7 @@ public class WebServiceCore implements DBWServiceCore { @Override public WebConnectionInfo testConnection(WebSession webSession, WebConnectionConfig connectionConfig) throws DBWebException { - DBPDataSourceRegistry sessionRegistry = webSession.getDatabases().getDataSourceRegistry(); + DBPDataSourceRegistry sessionRegistry = webSession.getDatabasesNode().getDataSourceRegistry(); DBPDataSourceContainer newDataSource = makeConnectionInstance(connectionConfig, sessionRegistry); try { @@ -216,7 +216,7 @@ public class WebServiceCore implements DBWServiceCore { // Disconnect in async mode? //new DisconnectJob(connectionInfo.getDataSource()).schedule(); } - webSession.getDatabases().getDataSourceRegistry().removeDataSource(connectionInfo.getDataSourceContainer()); + webSession.getDatabasesNode().getDataSourceRegistry().removeDataSource(connectionInfo.getDataSourceContainer()); webSession.removeConnection(connectionInfo); return disconnected; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java index a0119551f6..3adf6c5214 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java @@ -35,6 +35,7 @@ import org.jkiss.dbeaver.model.navigator.DBNNode; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.model.struct.rdb.DBSCatalog; +import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; import java.lang.reflect.InvocationTargetException; @@ -56,7 +57,12 @@ public class WebServiceNavigator implements DBWServiceNavigator { DBNNode[] nodeChildren; boolean isRootPath = CommonUtils.isEmpty(parentPath) || "/".equals(parentPath); if (isRootPath) { - nodeChildren = session.getDatabases().getChildren(monitor); + nodeChildren = session.getDatabasesNode().getChildren(monitor); + // Inject extra nodes + List extraNodes = session.getProjectNode().getExtraNodes(); + if (!extraNodes.isEmpty()) { + nodeChildren = ArrayUtils.concatArrays(extraNodes.toArray(new DBNNode[0]), nodeChildren); + } } else { DBNNode parentNode = session.getNavigatorModel().getNodeByPath(monitor, parentPath); if (parentNode == null) {