This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch AuthEnhance in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/AuthEnhance by this push: new a076ac19409 Finish device related a076ac19409 is described below commit a076ac19409bb54bf9075e1db469c352ef82eed4 Author: JackieTien97 <jackietie...@gmail.com> AuthorDate: Thu Sep 18 20:47:51 2025 +0800 Finish device related --- .../iotdb/db/it/auth/IoTDBTemplateAuthIT.java | 8 +++ .../it/db/it/IoTDBAuthenticationTableIT.java | 8 +++ .../queryengine/plan/analyze/AnalyzeVisitor.java | 22 +++++--- .../plan/analyze/ClusterPartitionFetcher.java | 65 +++++++++++++--------- .../plan/analyze/IPartitionFetcher.java | 2 + .../analyze/schema/ClusterSchemaFetchExecutor.java | 7 ++- .../plan/analyze/schema/ClusterSchemaFetcher.java | 7 ++- .../plan/analyze/schema/ISchemaFetcher.java | 5 +- .../security/TreeAccessCheckVisitor.java | 61 ++++++++++++++++++-- .../statement/AuthorityInformationStatement.java | 9 +++ .../internal/DeviceSchemaFetchStatement.java | 9 ++- .../plan/statement/metadata/CountStatement.java | 9 --- .../statement/metadata/ShowDatabaseStatement.java | 9 --- .../plan/analyze/FakePartitionFetcherImpl.java | 5 ++ .../plan/analyze/FakeSchemaFetcherImpl.java | 5 +- .../plan/planner/distribution/Util.java | 10 +++- .../plan/planner/distribution/Util2.java | 10 +++- .../plan/relational/analyzer/TSBSMetadata.java | 5 ++ .../plan/relational/analyzer/TestMetadata.java | 5 ++ .../iotdb/commons/partition/SchemaPartition.java | 6 ++ 20 files changed, 204 insertions(+), 63 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBTemplateAuthIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBTemplateAuthIT.java index 5244287ef7a..ef275ec859f 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBTemplateAuthIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBTemplateAuthIT.java @@ -80,6 +80,14 @@ public class IoTDBTemplateAuthIT { "tytyty1", "tytytyty"); + assertNonQueryTestFail( + adminStmt, "create database root.__audit", "803: The database '__audit' is read-only"); + + assertNonQueryTestFail( + adminStmt, + "set device template t1 to root.__audit", + "803: The database '__audit' is read-only"); + Set<String> retSet = new HashSet<>(Arrays.asList("t1", "t2", "t3")); try (ResultSet resultSet = adminStmt.executeQuery("show device templates")) { diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBAuthenticationTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBAuthenticationTableIT.java index e57c6f32fd3..f5c04f03bb0 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBAuthenticationTableIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBAuthenticationTableIT.java @@ -91,6 +91,14 @@ public class IoTDBAuthenticationTableIT { public void testInsert() throws IoTDBConnectionException, StatementExecutionException { try (ITableSession sessionRoot = EnvFactory.getEnv().getTableSessionConnection()) { + + try { + sessionRoot.executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS __audit"); + fail("Should have thrown an exception"); + } catch (StatementExecutionException e) { + assertEquals("803: Access Denied: The database '__audit' is read-only.", e.getMessage()); + } + sessionRoot.executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS \"汉化\""); sessionRoot.executeNonQueryStatement("USE \"汉化\""); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java index 216743e1f67..eba071ca37b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java @@ -3209,14 +3209,16 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> PartialPath pattern, PathPatternTree authorityScope, Analysis analysis, - MPPQueryContext context) { + MPPQueryContext context, + boolean canSeeAuditDB) { // If there is time condition in SHOW DEVICES, we need to scan the raw data analyzeGlobalTimeConditionInShowMetaData(timeCondition, analysis); context.generateGlobalTimeFilter(analysis); PathPatternTree patternTree = new PathPatternTree(); patternTree.appendPathPattern(pattern); ISchemaTree schemaTree = - schemaFetcher.fetchRawSchemaInDeviceLevel(patternTree, authorityScope, context); + schemaFetcher.fetchRawSchemaInDeviceLevel( + patternTree, authorityScope, context, canSeeAuditDB); if (schemaTree.isEmpty()) { analysis.setFinishQueryAfterAnalyze(true); return; @@ -3250,12 +3252,14 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> showDevicesStatement.getPathPattern(), showDevicesStatement.getAuthorityScope(), analysis, - context); + context, + showDevicesStatement.isCanSeeAuditDB()); } else { PathPatternTree patternTree = new PathPatternTree(); patternTree.appendPathPattern( showDevicesStatement.getPathPattern().concatNode(IoTDBConstant.ONE_LEVEL_PATH_WILDCARD)); - SchemaPartition schemaPartitionInfo = partitionFetcher.getSchemaPartition(patternTree); + SchemaPartition schemaPartitionInfo = + partitionFetcher.getSchemaPartition(patternTree, showDevicesStatement.isCanSeeAuditDB()); analysis.setSchemaPartitionInfo(schemaPartitionInfo); } analysis.setRespDatasetHeader( @@ -3316,7 +3320,9 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> patternTree.appendPathPattern(path.concatNode(IoTDBConstant.ONE_LEVEL_PATH_WILDCARD)); } patternTree.constructTree(); - SchemaPartition schemaPartition = partitionFetcher.getSchemaPartition(patternTree); + SchemaPartition schemaPartition = + partitionFetcher.getSchemaPartition( + patternTree, deviceSchemaFetchStatement.isCanSeeAuditDB()); analysis.setSchemaPartitionInfo(schemaPartition); if (schemaPartition.isEmpty()) { @@ -3338,12 +3344,14 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> countDevicesStatement.getPathPattern(), countDevicesStatement.getAuthorityScope(), analysis, - context); + context, + countDevicesStatement.isCanSeeAuditDB()); } else { PathPatternTree patternTree = new PathPatternTree(); patternTree.appendPathPattern( countDevicesStatement.getPathPattern().concatNode(IoTDBConstant.ONE_LEVEL_PATH_WILDCARD)); - SchemaPartition schemaPartitionInfo = partitionFetcher.getSchemaPartition(patternTree); + SchemaPartition schemaPartitionInfo = + partitionFetcher.getSchemaPartition(patternTree, countDevicesStatement.isCanSeeAuditDB()); analysis.setSchemaPartitionInfo(schemaPartitionInfo); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ClusterPartitionFetcher.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ClusterPartitionFetcher.java index 216c0088131..a0bd1fc279a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ClusterPartitionFetcher.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ClusterPartitionFetcher.java @@ -67,6 +67,8 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import static org.apache.iotdb.commons.schema.table.Audit.TREE_MODEL_AUDIT_DATABASE; + public class ClusterPartitionFetcher implements IPartitionFetcher { private static final IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig(); @@ -98,14 +100,19 @@ public class ClusterPartitionFetcher implements IPartitionFetcher { @Override public SchemaPartition getSchemaPartition(final PathPatternTree patternTree, String userName) { - try (final ConfigNodeClient client = - configNodeClientManager.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { - patternTree.constructTree(); - final List<IDeviceID> deviceIDs = patternTree.getAllDevicePatterns(); - final Map<String, List<IDeviceID>> storageGroupToDeviceMap = - partitionCache.getDatabaseToDevice(deviceIDs, true, false, userName); - SchemaPartition schemaPartition = partitionCache.getSchemaPartition(storageGroupToDeviceMap); - if (null == schemaPartition) { + return getSchemaPartition(patternTree, userName, true); + } + + private SchemaPartition getSchemaPartition( + final PathPatternTree patternTree, String userName, boolean needAuditDB) { + patternTree.constructTree(); + final List<IDeviceID> deviceIDs = patternTree.getAllDevicePatterns(); + final Map<String, List<IDeviceID>> storageGroupToDeviceMap = + partitionCache.getDatabaseToDevice(deviceIDs, true, false, userName); + SchemaPartition schemaPartition = partitionCache.getSchemaPartition(storageGroupToDeviceMap); + if (null == schemaPartition) { + try (final ConfigNodeClient client = + configNodeClientManager.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { final TSchemaPartitionTableResp schemaPartitionTableResp = client.getSchemaPartitionTable(constructSchemaPartitionReq(patternTree)); if (schemaPartitionTableResp.getStatus().getCode() @@ -118,30 +125,38 @@ public class ClusterPartitionFetcher implements IPartitionFetcher { schemaPartitionTableResp.getStatus().getMessage(), schemaPartitionTableResp.getStatus().getCode()); } + } catch (final ClientManagerException | TException e) { + throw new StatementAnalyzeException( + "An error occurred when executing getSchemaPartition():" + e.getMessage()); } - return schemaPartition; - } catch (final ClientManagerException | TException e) { - throw new StatementAnalyzeException( - "An error occurred when executing getSchemaPartition():" + e.getMessage()); } + if (!needAuditDB) { + schemaPartition.removeDB(TREE_MODEL_AUDIT_DATABASE); + } + return schemaPartition; } @Override public SchemaPartition getSchemaPartition(final PathPatternTree patternTree) { - return getSchemaPartition(patternTree, null); + return getSchemaPartition(patternTree, true); + } + + @Override + public SchemaPartition getSchemaPartition(PathPatternTree patternTree, boolean needAuditDB) { + return getSchemaPartition(patternTree, null, needAuditDB); } @Override public SchemaPartition getOrCreateSchemaPartition( final PathPatternTree patternTree, final String userName) { - try (final ConfigNodeClient client = - configNodeClientManager.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { - patternTree.constructTree(); - final List<IDeviceID> deviceIDs = patternTree.getAllDevicePatterns(); - final Map<String, List<IDeviceID>> storageGroupToDeviceMap = - partitionCache.getDatabaseToDevice(deviceIDs, true, true, userName); - SchemaPartition schemaPartition = partitionCache.getSchemaPartition(storageGroupToDeviceMap); - if (null == schemaPartition) { + patternTree.constructTree(); + final List<IDeviceID> deviceIDs = patternTree.getAllDevicePatterns(); + final Map<String, List<IDeviceID>> storageGroupToDeviceMap = + partitionCache.getDatabaseToDevice(deviceIDs, true, true, userName); + SchemaPartition schemaPartition = partitionCache.getSchemaPartition(storageGroupToDeviceMap); + if (null == schemaPartition) { + try (final ConfigNodeClient client = + configNodeClientManager.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { final TSchemaPartitionTableResp schemaPartitionTableResp = client.getOrCreateSchemaPartitionTable(constructSchemaPartitionReq(patternTree)); if (schemaPartitionTableResp.getStatus().getCode() @@ -154,12 +169,12 @@ public class ClusterPartitionFetcher implements IPartitionFetcher { schemaPartitionTableResp.getStatus().getMessage(), schemaPartitionTableResp.getStatus().getCode()); } + } catch (final ClientManagerException | TException e) { + throw new StatementAnalyzeException( + "An error occurred when executing getOrCreateSchemaPartition():" + e.getMessage()); } - return schemaPartition; - } catch (final ClientManagerException | TException e) { - throw new StatementAnalyzeException( - "An error occurred when executing getOrCreateSchemaPartition():" + e.getMessage()); } + return schemaPartition; } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IPartitionFetcher.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IPartitionFetcher.java index 29187cf8da8..c794531028d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IPartitionFetcher.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IPartitionFetcher.java @@ -38,6 +38,8 @@ public interface IPartitionFetcher { /** Get schema partition without automatically create, used in write and query scenarios. */ SchemaPartition getSchemaPartition(PathPatternTree patternTree); + SchemaPartition getSchemaPartition(PathPatternTree patternTree, boolean needAuditDB); + /** Get schema partition without automatically create, used in write and query scenarios. */ default SchemaPartition getSchemaPartition(PathPatternTree patternTree, String username) { return getSchemaPartition(patternTree); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java index 637516ef83a..d23e9c58a9b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java @@ -151,9 +151,12 @@ class ClusterSchemaFetchExecutor { } ClusterSchemaTree fetchDeviceLevelRawSchema( - PathPatternTree patternTree, PathPatternTree authorityScope, MPPQueryContext context) { + PathPatternTree patternTree, + PathPatternTree authorityScope, + MPPQueryContext context, + boolean canSeeAuditDB) { return executeSchemaFetchQuery( - new DeviceSchemaFetchStatement(patternTree, authorityScope), context); + new DeviceSchemaFetchStatement(patternTree, authorityScope, canSeeAuditDB), context); } ClusterSchemaTree fetchMeasurementLevelRawSchema( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java index 3dd788e3528..ef9cc5d6ae6 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java @@ -165,10 +165,13 @@ public class ClusterSchemaFetcher implements ISchemaFetcher { @Override public ISchemaTree fetchRawSchemaInDeviceLevel( - PathPatternTree patternTree, PathPatternTree authorityScope, MPPQueryContext context) { + PathPatternTree patternTree, + PathPatternTree authorityScope, + MPPQueryContext context, + boolean canSeeAuditDB) { authorityScope.constructTree(); return clusterSchemaFetchExecutor.fetchDeviceLevelRawSchema( - patternTree, authorityScope, context); + patternTree, authorityScope, context, canSeeAuditDB); } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ISchemaFetcher.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ISchemaFetcher.java index 56a7670ad9d..585f9e7b18c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ISchemaFetcher.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ISchemaFetcher.java @@ -56,7 +56,10 @@ public interface ISchemaFetcher { * @return schemaTree without measurement nodes */ ISchemaTree fetchRawSchemaInDeviceLevel( - PathPatternTree patternTree, PathPatternTree authorityScope, MPPQueryContext context); + PathPatternTree patternTree, + PathPatternTree authorityScope, + MPPQueryContext context, + boolean canSeeAuditDB); /** * Fetch all the schema by the given patternTree in device level diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java index 3bb045bb53f..1bffd5915b4 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java @@ -162,6 +162,9 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces @Override public TSStatus visitAuthorityInformation( AuthorityInformationStatement statement, TreeAccessCheckContext context) { + if (AuthorityChecker.SUPER_USER.equals(context.userName)) { + return SUCCEED; + } try { statement.setAuthorityScope( AuthorityChecker.getAuthorizedPathTree(context.userName, PrivilegeType.READ_SCHEMA)); @@ -213,6 +216,10 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces private TSStatus checkTemplateShowRelated( ShowSchemaTemplateStatement statement, TreeAccessCheckContext context) { + if (AuthorityChecker.SUPER_USER.equals(context.userName)) { + statement.setCamSeeAll(true); + return SUCCEED; + } // own SYSTEM can see all, otherwise can only see PATHS that user has READ_SCHEMA auth if (!AuthorityChecker.checkSystemPermission(context.userName, PrivilegeType.SYSTEM)) { statement.setCamSeeAll(false); @@ -271,6 +278,9 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces @Override public TSStatus visitAlterSchemaTemplate( AlterSchemaTemplateStatement alterSchemaTemplateStatement, TreeAccessCheckContext context) { + if (AuthorityChecker.SUPER_USER.equals(context.userName)) { + return SUCCEED; + } return AuthorityChecker.getTSStatus( AuthorityChecker.checkSystemPermission(context.userName, PrivilegeType.SYSTEM) || AuthorityChecker.checkSystemPermission( @@ -464,6 +474,9 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces } private TSStatus checkCQManagement(String userName) { + if (AuthorityChecker.SUPER_USER.equals(userName)) { + return SUCCEED; + } return AuthorityChecker.getTSStatus( AuthorityChecker.checkSystemPermission(userName, PrivilegeType.SYSTEM) || AuthorityChecker.checkSystemPermission(userName, PrivilegeType.USE_CQ), @@ -491,6 +504,9 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces } private TSStatus checkUDFManagement(String userName) { + if (AuthorityChecker.SUPER_USER.equals(userName)) { + return SUCCEED; + } return AuthorityChecker.getTSStatus( AuthorityChecker.checkSystemPermission(userName, PrivilegeType.SYSTEM) || AuthorityChecker.checkSystemPermission(userName, PrivilegeType.USE_UDF), @@ -514,6 +530,9 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces } private TSStatus checkModelManagement(String userName) { + if (AuthorityChecker.SUPER_USER.equals(userName)) { + return SUCCEED; + } return AuthorityChecker.getTSStatus( AuthorityChecker.checkSystemPermission(userName, PrivilegeType.SYSTEM) || AuthorityChecker.checkSystemPermission(userName, PrivilegeType.USE_MODEL), @@ -572,6 +591,9 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces } private TSStatus checkPipeManagement(String userName) { + if (AuthorityChecker.SUPER_USER.equals(userName)) { + return SUCCEED; + } return AuthorityChecker.getTSStatus( AuthorityChecker.checkSystemPermission(userName, PrivilegeType.SYSTEM) || AuthorityChecker.checkSystemPermission(userName, PrivilegeType.USE_PIPE), @@ -626,6 +648,9 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces } private TSStatus checkTriggerManagement(String userName) { + if (AuthorityChecker.SUPER_USER.equals(userName)) { + return SUCCEED; + } return AuthorityChecker.getTSStatus( AuthorityChecker.checkSystemPermission(userName, PrivilegeType.SYSTEM) || AuthorityChecker.checkSystemPermission(userName, PrivilegeType.USE_TRIGGER), @@ -649,18 +674,20 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces @Override public TSStatus visitShowStorageGroup( ShowDatabaseStatement showDatabaseStatement, TreeAccessCheckContext context) { - if (!AuthorityChecker.checkSystemPermission(context.userName, PrivilegeType.AUDIT)) { - showDatabaseStatement.setCanSeeAuditDB(false); + if (AuthorityChecker.SUPER_USER.equals(context.userName)) { + return SUCCEED; } + setCanSeeAuditDB(showDatabaseStatement, context.userName); return checkShowOrCountDatabasePermission(showDatabaseStatement, context); } @Override public TSStatus visitCountStorageGroup( CountDatabaseStatement countDatabaseStatement, TreeAccessCheckContext context) { - if (!AuthorityChecker.checkSystemPermission(context.userName, PrivilegeType.AUDIT)) { - countDatabaseStatement.setCanSeeAuditDB(false); + if (AuthorityChecker.SUPER_USER.equals(context.userName)) { + return SUCCEED; } + setCanSeeAuditDB(countDatabaseStatement, context.userName); return checkShowOrCountDatabasePermission(countDatabaseStatement, context); } @@ -674,6 +701,9 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces .setMessage(String.format(READ_ONLY_DB_ERROR_MSG, TABLE_MODEL_AUDIT_DATABASE)); } } + if (AuthorityChecker.SUPER_USER.equals(context.userName)) { + return SUCCEED; + } return AuthorityChecker.getTSStatus( AuthorityChecker.checkSystemPermission(context.userName, PrivilegeType.SYSTEM) || AuthorityChecker.checkSystemPermission( @@ -687,6 +717,11 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces return new TSStatus(TSStatusCode.NO_PERMISSION.getStatusCode()) .setMessage(String.format(READ_ONLY_DB_ERROR_MSG, TABLE_MODEL_AUDIT_DATABASE)); } + + if (AuthorityChecker.SUPER_USER.equals(userName)) { + return SUCCEED; + } + return AuthorityChecker.getTSStatus( AuthorityChecker.checkSystemPermission(userName, PrivilegeType.SYSTEM) || AuthorityChecker.checkSystemPermission(userName, PrivilegeType.MANAGE_DATABASE), @@ -753,6 +788,9 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces // ============================= timeseries related ================================= private TSStatus checkTimeSeriesPermission( String userName, List<? extends PartialPath> checkedPaths, PrivilegeType permission) { + if (AuthorityChecker.SUPER_USER.equals(userName)) { + return SUCCEED; + } return AuthorityChecker.getTSStatus( AuthorityChecker.checkFullPathOrPatternListPermission(userName, checkedPaths, permission), checkedPaths, @@ -1106,6 +1144,11 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces // ================================= device related ============================= @Override public TSStatus visitShowDevices(ShowDevicesStatement statement, TreeAccessCheckContext context) { + if (AuthorityChecker.SUPER_USER.equals(context.userName)) { + statement.setCanSeeAuditDB(true); + return SUCCEED; + } + setCanSeeAuditDB(statement, context.userName); if (statement.hasTimeCondition()) { try { statement.setAuthorityScope( @@ -1124,6 +1167,10 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces @Override public TSStatus visitCountDevices( CountDevicesStatement statement, TreeAccessCheckContext context) { + if (AuthorityChecker.SUPER_USER.equals(context.userName)) { + return SUCCEED; + } + setCanSeeAuditDB(statement, context.userName); if (statement.hasTimeCondition()) { try { statement.setAuthorityScope( @@ -1165,4 +1212,10 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces } return SUCCEED; } + + protected void setCanSeeAuditDB(AuthorityInformationStatement statement, String userName) { + if (!checkHasGlobalAuth(userName, PrivilegeType.AUDIT)) { + statement.setCanSeeAuditDB(false); + } + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/AuthorityInformationStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/AuthorityInformationStatement.java index df33dc16cf7..c1d9b38eec5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/AuthorityInformationStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/AuthorityInformationStatement.java @@ -23,6 +23,7 @@ import org.apache.iotdb.commons.schema.SchemaConstant; public abstract class AuthorityInformationStatement extends Statement { protected PathPatternTree authorityScope = SchemaConstant.ALL_MATCH_SCOPE; + private boolean canSeeAuditDB = true; public PathPatternTree getAuthorityScope() { return authorityScope; @@ -36,4 +37,12 @@ public abstract class AuthorityInformationStatement extends Statement { public void setAuthorityScope(PathPatternTree authorityScope) { this.authorityScope = authorityScope; } + + public boolean isCanSeeAuditDB() { + return canSeeAuditDB; + } + + public void setCanSeeAuditDB(boolean canSeeAuditDB) { + this.canSeeAuditDB = canSeeAuditDB; + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/internal/DeviceSchemaFetchStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/internal/DeviceSchemaFetchStatement.java index af2ce0df838..0dca8f1433d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/internal/DeviceSchemaFetchStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/internal/DeviceSchemaFetchStatement.java @@ -30,11 +30,14 @@ import java.util.List; public class DeviceSchemaFetchStatement extends Statement { private final PathPatternTree patternTree; private final PathPatternTree authorityScope; + private final boolean canSeeAuditDB; - public DeviceSchemaFetchStatement(PathPatternTree patternTree, PathPatternTree authorityScope) { + public DeviceSchemaFetchStatement( + PathPatternTree patternTree, PathPatternTree authorityScope, boolean canSeeAuditDB) { super(); this.patternTree = patternTree; this.authorityScope = authorityScope; + this.canSeeAuditDB = canSeeAuditDB; setType(StatementType.FETCH_SCHEMA); } @@ -46,6 +49,10 @@ public class DeviceSchemaFetchStatement extends Statement { return authorityScope; } + public boolean isCanSeeAuditDB() { + return canSeeAuditDB; + } + @Override public List<PartialPath> getPaths() { patternTree.constructTree(); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/CountStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/CountStatement.java index a10f05aa659..529a8660dfb 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/CountStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/CountStatement.java @@ -34,7 +34,6 @@ import java.util.List; */ public class CountStatement extends ShowStatement { protected PartialPath pathPattern; - private boolean canSeeAuditDB = true; public CountStatement(PartialPath pathPattern) { this.pathPattern = pathPattern; @@ -53,12 +52,4 @@ public class CountStatement extends ShowStatement { public List<PartialPath> getPaths() { return Collections.singletonList(pathPattern); } - - public boolean isCanSeeAuditDB() { - return canSeeAuditDB; - } - - public void setCanSeeAuditDB(boolean canSeeAuditDB) { - this.canSeeAuditDB = canSeeAuditDB; - } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowDatabaseStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowDatabaseStatement.java index a84758264d8..d91e1f65f0d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowDatabaseStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowDatabaseStatement.java @@ -53,7 +53,6 @@ public class ShowDatabaseStatement extends ShowStatement implements IConfigState private final PartialPath pathPattern; private boolean isDetailed; - private boolean canSeeAuditDB = true; public ShowDatabaseStatement(final PartialPath pathPattern) { super(); @@ -129,12 +128,4 @@ public class ShowDatabaseStatement extends ShowStatement implements IConfigState public List<PartialPath> getPaths() { return Collections.singletonList(pathPattern); } - - public boolean isCanSeeAuditDB() { - return canSeeAuditDB; - } - - public void setCanSeeAuditDB(boolean canSeeAuditDB) { - this.canSeeAuditDB = canSeeAuditDB; - } } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/FakePartitionFetcherImpl.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/FakePartitionFetcherImpl.java index 338a05b4575..0daa3a1d865 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/FakePartitionFetcherImpl.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/FakePartitionFetcherImpl.java @@ -111,6 +111,11 @@ public class FakePartitionFetcherImpl implements IPartitionFetcher { return schemaPartition; } + @Override + public SchemaPartition getSchemaPartition(PathPatternTree patternTree, boolean needAuditDB) { + return getSchemaPartition(patternTree); + } + @Override public SchemaPartition getOrCreateSchemaPartition(PathPatternTree patternTree, String userName) { return null; diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/FakeSchemaFetcherImpl.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/FakeSchemaFetcherImpl.java index 1e6042e05df..e0cb87ae333 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/FakeSchemaFetcherImpl.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/FakeSchemaFetcherImpl.java @@ -55,7 +55,10 @@ public class FakeSchemaFetcherImpl implements ISchemaFetcher { @Override public ISchemaTree fetchRawSchemaInDeviceLevel( - PathPatternTree patternTree, PathPatternTree authorityScope, MPPQueryContext context) { + PathPatternTree patternTree, + PathPatternTree authorityScope, + MPPQueryContext context, + boolean canSeeAuditDB) { schemaTree.setDatabases(Collections.singleton("root.sg")); return schemaTree; } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java index 8fcc6ae7972..6629c2edae4 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java @@ -309,7 +309,10 @@ public class Util { @Override public ISchemaTree fetchRawSchemaInDeviceLevel( - PathPatternTree patternTree, PathPatternTree authorityScope, MPPQueryContext context) { + PathPatternTree patternTree, + PathPatternTree authorityScope, + MPPQueryContext context, + boolean canSeeAuditDB) { return ANALYSIS.getSchemaTree(); } @@ -377,6 +380,11 @@ public class Util { return ANALYSIS.getSchemaPartitionInfo(); } + @Override + public SchemaPartition getSchemaPartition(PathPatternTree patternTree, boolean needAuditDB) { + return ANALYSIS.getSchemaPartitionInfo(); + } + @Override public SchemaPartition getOrCreateSchemaPartition( PathPatternTree patternTree, String userName) { diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java index 42e8dc1f2c2..62a739c19f7 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java @@ -202,7 +202,10 @@ public class Util2 { @Override public ISchemaTree fetchRawSchemaInDeviceLevel( - PathPatternTree patternTree, PathPatternTree authorityScope, MPPQueryContext context) { + PathPatternTree patternTree, + PathPatternTree authorityScope, + MPPQueryContext context, + boolean canSeeAuditDB) { return ANALYSIS.getSchemaTree(); } @@ -270,6 +273,11 @@ public class Util2 { return ANALYSIS.getSchemaPartitionInfo(); } + @Override + public SchemaPartition getSchemaPartition(PathPatternTree patternTree, boolean needAuditDB) { + return ANALYSIS.getSchemaPartitionInfo(); + } + @Override public SchemaPartition getOrCreateSchemaPartition( PathPatternTree patternTree, String userName) { diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TSBSMetadata.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TSBSMetadata.java index 159ab2486a9..1513f93ac10 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TSBSMetadata.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TSBSMetadata.java @@ -409,6 +409,11 @@ public class TSBSMetadata implements Metadata { return SCHEMA_PARTITION; } + @Override + public SchemaPartition getSchemaPartition(PathPatternTree patternTree, boolean needAuditDB) { + return SCHEMA_PARTITION; + } + @Override public SchemaPartition getOrCreateSchemaPartition( PathPatternTree patternTree, String userName) { diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMetadata.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMetadata.java index 108975c0adf..652f208a052 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMetadata.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMetadata.java @@ -573,6 +573,11 @@ public class TestMetadata implements Metadata { return TABLE_SCHEMA_PARTITION; } + @Override + public SchemaPartition getSchemaPartition(PathPatternTree patternTree, boolean needAuditDB) { + return TABLE_SCHEMA_PARTITION; + } + @Override public SchemaPartition getOrCreateSchemaPartition( PathPatternTree patternTree, String userName) { diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaPartition.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaPartition.java index 3fc99857396..96abc749865 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaPartition.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaPartition.java @@ -122,4 +122,10 @@ public class SchemaPartition extends Partition { public String toString() { return "SchemaPartition{" + "schemaPartitionMap=" + schemaPartitionMap + '}'; } + + public void removeDB(String databaseName) { + if (schemaPartitionMap != null) { + schemaPartitionMap.remove(databaseName); + } + } }