From 101d26158bc44e23da2ba8eb038c2e0851fb1631 Mon Sep 17 00:00:00 2001 From: DenisSinelnikov <142215442+DenisSinelnikov@users.noreply.github.com> Date: Tue, 2 Apr 2024 20:50:21 +0400 Subject: [PATCH] =?UTF-8?q?CB-4603.=20Refactor=20searching=20by=20group,?= =?UTF-8?q?=20include=20default=20group=20for=20all=20s=E2=80=A6=20(#2440)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * CB-4603. Refactor searching by group, include default group for all sql query with team --------- Co-authored-by: DenisSinelnikov Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com> Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com> --- .../DefaultConfiguration/cloudbeaver.conf | 1 + .../model/app/BaseWebAppConfiguration.java | 1 - .../io/cloudbeaver/server/CBApplication.java | 14 +-- .../CBEmbeddedSecurityController.java | 112 +++++++----------- .../workspace/conf/cloudbeaver.conf | 1 + 5 files changed, 50 insertions(+), 79 deletions(-) diff --git a/config/sample-databases/DefaultConfiguration/cloudbeaver.conf b/config/sample-databases/DefaultConfiguration/cloudbeaver.conf index e9037337f0..c401d79fd7 100644 --- a/config/sample-databases/DefaultConfiguration/cloudbeaver.conf +++ b/config/sample-databases/DefaultConfiguration/cloudbeaver.conf @@ -62,6 +62,7 @@ app: { anonymousAccessEnabled: true, anonymousUserRole: "user", + defaultUserTeam: "user", grantConnectionsAccessToAnonymousTeam: false, supportsCustomConnections: false, showReadOnlyConnectionInfo: false, diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebAppConfiguration.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebAppConfiguration.java index 719feb4ed3..f7a79a460e 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebAppConfiguration.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebAppConfiguration.java @@ -36,7 +36,6 @@ public abstract class BaseWebAppConfiguration implements WebAppConfiguration { public BaseWebAppConfiguration() { this.plugins = new LinkedHashMap<>(); - this.defaultUserTeam = DEFAULT_APP_ANONYMOUS_TEAM_NAME; this.resourceManagerEnabled = true; this.enabledFeatures = null; this.showReadOnlyConnectionInfo = false; 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 7c6c5174ee..5ca711678b 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 @@ -200,6 +200,9 @@ public abstract class CBApplication extends BaseWebApp if (!loadServerConfiguration()) { return; } + if (CommonUtils.isEmpty(this.getAppConfiguration().getDefaultUserTeam())) { + throw new DBException("Default user team must be specified"); + } } catch (DBException e) { log.error(e); return; @@ -317,11 +320,6 @@ public abstract class CBApplication extends BaseWebApp }); System.setSecurityManager(new SecurityManager()); } - try { - addAllUsersToDefaultTeam(); - } catch (DBException e) { - log.error("Failed insert default teams"); - } eventController.scheduleCheckJob(); @@ -332,12 +330,6 @@ public abstract class CBApplication extends BaseWebApp return; } - private void addAllUsersToDefaultTeam() throws DBException { - if (securityController instanceof CBEmbeddedSecurityController controller) { - controller.addAllUsersToDefaultTeam(); - } - } - protected void initializeAdditionalConfiguration() { } diff --git a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/CBEmbeddedSecurityController.java b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/CBEmbeddedSecurityController.java index d9322a4553..2697406db4 100644 --- a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/CBEmbeddedSecurityController.java +++ b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/CBEmbeddedSecurityController.java @@ -249,63 +249,20 @@ public class CBEmbeddedSecurityController } } - public void addAllUsersToDefaultTeam() throws DBCException { - if (application.isConfigurationMode()) { - return; - } - if (CommonUtils.isEmpty(application.getAppConfiguration().getDefaultUserTeam())) { - return; - } - - try (Connection dbCon = database.openConnection()) { - try (PreparedStatement dbStat = dbCon.prepareStatement( - database.normalizeTableNames("SELECT USER_ID \n" + - "FROM {table_prefix}CB_USER\n" + - "WHERE USER_ID NOT IN (\n" + - " SELECT USER_ID FROM {table_prefix}CB_USER_TEAM CUT WHERE CUT.TEAM_ID = ? \n" + - ")") - )) { - dbStat.setString(1, application.getAppConfiguration().getDefaultUserTeam()); - ResultSet dbResult = dbStat.executeQuery(); - List usersIds = new ArrayList<>(); - while (dbResult.next()) { - String userId = dbResult.getString(1); - usersIds.add(userId); - } - - if (usersIds.isEmpty()) { - return; - } - - for (String usersId : usersIds) { - try (PreparedStatement insertStat = dbCon.prepareStatement( - database.normalizeTableNames("INSERT INTO {table_prefix}CB_USER_TEAM(USER_ID, TEAM_ID, GRANT_TIME, GRANTED_BY)" + - " VALUES(?,?,?,?)"))) { - insertStat.setString(1, usersId); - insertStat.setString(2, application.getAppConfiguration().getDefaultUserTeam()); - insertStat.setTimestamp(3, new Timestamp(System.currentTimeMillis())); - insertStat.setString(4, "CloudBeaver Application"); - insertStat.executeUpdate(); - } - } - } - } catch (SQLException e) { - throw new DBCException("Error while setting default user teams", e); - } - } - - @NotNull @Override public SMTeam[] getUserTeams(String userId) throws DBException { Map teams = new LinkedHashMap<>(); try (Connection dbCon = database.openConnection()) { + String defaultUserTeam = application.getAppConfiguration().getDefaultUserTeam(); try (PreparedStatement dbStat = dbCon.prepareStatement(database.normalizeTableNames( "SELECT R.*,S.IS_SECRET_STORAGE FROM {table_prefix}CB_USER_TEAM UR, {table_prefix}CB_TEAM R, " + "{table_prefix}CB_AUTH_SUBJECT S " + - "WHERE UR.USER_ID=? AND UR.TEAM_ID=R.TEAM_ID AND S.SUBJECT_ID=R.TEAM_ID")) + "WHERE UR.USER_ID=? AND UR.TEAM_ID = R.TEAM_ID " + + "AND S.SUBJECT_ID IN (R.TEAM_ID,?)")) ) { dbStat.setString(1, userId); + dbStat.setString(2, defaultUserTeam); try (ResultSet dbResult = dbStat.executeQuery()) { while (dbResult.next()) { var team = fetchTeam(dbResult); @@ -364,14 +321,16 @@ public class CBEmbeddedSecurityController readSubjectMetas(dbCon, user); // Teams try (PreparedStatement dbStat = dbCon.prepareStatement( - database.normalizeTableNames("SELECT TEAM_ID FROM {table_prefix}CB_USER_TEAM WHERE USER_ID=?")) + database.normalizeTableNames("SELECT TEAM_ID FROM {table_prefix}CB_USER_TEAM WHERE USER_ID=?")) ) { + String defaultUserTeam = application.getAppConfiguration().getDefaultUserTeam(); dbStat.setString(1, userId); try (ResultSet dbResult = dbStat.executeQuery()) { - List teamIDs = new ArrayList<>(); + Set teamIDs = new LinkedHashSet<>(); while (dbResult.next()) { teamIDs.add(dbResult.getString(1)); } + teamIDs.add(defaultUserTeam); user.setUserTeams(teamIDs.toArray(new String[0])); } } @@ -975,21 +934,27 @@ public class CBEmbeddedSecurityController @Override public SMTeam[] readAllTeams() throws DBCException { try (Connection dbCon = database.openConnection()) { + String defaultUserTeam = application.getAppConfiguration().getDefaultUserTeam(); Map teams = new LinkedHashMap<>(); - try (Statement dbStat = dbCon.createStatement()) { - try (ResultSet dbResult = dbStat.executeQuery( - database.normalizeTableNames("SELECT T.*,S.IS_SECRET_STORAGE FROM {table_prefix}CB_TEAM T," + - "{table_prefix}CB_AUTH_SUBJECT S " + - "WHERE T.TEAM_ID=S.SUBJECT_ID ORDER BY TEAM_ID"))) { + String query = database.normalizeTableNames( + "SELECT T.*, S.IS_SECRET_STORAGE FROM {table_prefix}CB_TEAM T, " + + "{table_prefix}CB_AUTH_SUBJECT S " + + "WHERE T.TEAM_ID IN (S.SUBJECT_ID, ?) ORDER BY TEAM_ID"); + try (PreparedStatement dbPreparedStatement = dbCon.prepareStatement(query)) { + dbPreparedStatement.setString(1, defaultUserTeam); + try (ResultSet dbResult = dbPreparedStatement.executeQuery()) { while (dbResult.next()) { SMTeam team = fetchTeam(dbResult); teams.put(team.getTeamId(), team); } } - try (ResultSet dbResult = dbStat.executeQuery( - database.normalizeTableNames("SELECT SUBJECT_ID,PERMISSION_ID\n" + - "FROM {table_prefix}CB_AUTH_PERMISSIONS AP, {table_prefix}CB_TEAM R\n" + - "WHERE AP.SUBJECT_ID=R.TEAM_ID\n"))) { + } + query = database.normalizeTableNames("SELECT SUBJECT_ID,PERMISSION_ID\n" + + "FROM {table_prefix}CB_AUTH_PERMISSIONS AP, {table_prefix}CB_TEAM R\n" + + "WHERE AP.SUBJECT_ID IN (R.TEAM_ID,?)\n"); + try (PreparedStatement dbPreparedStatement = dbCon.prepareStatement(query)) { + dbPreparedStatement.setString(1, defaultUserTeam); + try (ResultSet dbResult = dbPreparedStatement.executeQuery()) { while (dbResult.next()) { SMTeam team = teams.get(dbResult.getString(1)); if (team != null) { @@ -1016,16 +981,29 @@ public class CBEmbeddedSecurityController @Override public String[] getTeamMembers(String teamId) throws DBCException { try (Connection dbCon = database.openConnection()) { - try (PreparedStatement dbStat = dbCon.prepareStatement( - database.normalizeTableNames("SELECT USER_ID FROM {table_prefix}CB_USER_TEAM WHERE TEAM_ID=?"))) { - dbStat.setString(1, teamId); - List subjects = new ArrayList<>(); - try (ResultSet dbResult = dbStat.executeQuery()) { - while (dbResult.next()) { - subjects.add(dbResult.getString(1)); + if (application.getAppConfiguration().getDefaultUserTeam().equals(teamId)) { + try (PreparedStatement dbStat = dbCon.prepareStatement( + database.normalizeTableNames("SELECT USER_ID FROM {table_prefix}CB_USER"))) { + List subjects = new ArrayList<>(); + try (ResultSet dbResult = dbStat.executeQuery()) { + while (dbResult.next()) { + subjects.add(dbResult.getString(1)); + } } + return subjects.toArray(new String[0]); + } + } else { + try (PreparedStatement dbStat = dbCon.prepareStatement( + database.normalizeTableNames("SELECT USER_ID FROM {table_prefix}CB_USER_TEAM WHERE TEAM_ID=?"))) { + dbStat.setString(1, teamId); + List subjects = new ArrayList<>(); + try (ResultSet dbResult = dbStat.executeQuery()) { + while (dbResult.next()) { + subjects.add(dbResult.getString(1)); + } + } + return subjects.toArray(new String[0]); } - return subjects.toArray(new String[0]); } } catch (SQLException e) { throw new DBCException("Error while reading team members", e); @@ -1240,7 +1218,7 @@ public class CBEmbeddedSecurityController try (PreparedStatement dbStat = dbCon.prepareStatement( database.normalizeTableNames( "SELECT DISTINCT AP.PERMISSION_ID FROM {table_prefix}CB_AUTH_PERMISSIONS AP, {table_prefix}CB_USER_TEAM UR\n" + - "WHERE UR.TEAM_ID=AP.SUBJECT_ID AND UR.USER_ID=?" + "WHERE UR.TEAM_ID = AP.SUBJECT_ID AND UR.USER_ID=?" ) )) { dbStat.setString(1, userId); diff --git a/server/test/io.cloudbeaver.test.platform/workspace/conf/cloudbeaver.conf b/server/test/io.cloudbeaver.test.platform/workspace/conf/cloudbeaver.conf index 6e12420206..cd8725bd8d 100644 --- a/server/test/io.cloudbeaver.test.platform/workspace/conf/cloudbeaver.conf +++ b/server/test/io.cloudbeaver.test.platform/workspace/conf/cloudbeaver.conf @@ -40,6 +40,7 @@ app: { anonymousAccessEnabled: true, anonymousUserRole: "user", + defaultUserTeam: "user", supportsCustomConnections: true, enableReverseProxyAuth: true, enabledAuthProviders: [