This is an automated email from the ASF dual-hosted git repository.

justinchen pushed a commit to branch enable-time-other-name
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/enable-time-other-name by this 
push:
     new 857e0b57653 user_role
857e0b57653 is described below

commit 857e0b576531d0aa996843376896acc09d2e73f8
Author: Caideyipi <[email protected]>
AuthorDate: Fri Dec 26 11:10:09 2025 +0800

    user_role
---
 .../PipeConfigTablePrivilegeParseVisitor.java      | 287 ++++++++++-----------
 .../PipeConfigTreePrivilegeParseVisitor.java       |  25 +-
 2 files changed, 154 insertions(+), 158 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigTablePrivilegeParseVisitor.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigTablePrivilegeParseVisitor.java
index bf0871f0032..3ae3b3ed9fe 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigTablePrivilegeParseVisitor.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigTablePrivilegeParseVisitor.java
@@ -19,8 +19,10 @@
 
 package org.apache.iotdb.confignode.manager.pipe.source;
 
+import org.apache.iotdb.commons.audit.IAuditEntity;
 import org.apache.iotdb.commons.auth.entity.PrivilegeType;
 import org.apache.iotdb.commons.auth.entity.PrivilegeUnion;
+import org.apache.iotdb.confignode.audit.CNAuditLogger;
 import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlan;
 import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanVisitor;
 import 
org.apache.iotdb.confignode.consensus.request.write.auth.AuthorRelationalPlan;
@@ -37,353 +39,334 @@ import 
org.apache.iotdb.confignode.consensus.request.write.table.RenameTablePlan
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnCommentPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableCommentPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTablePropertiesPlan;
+import org.apache.iotdb.confignode.manager.ConfigManager;
 import org.apache.iotdb.confignode.service.ConfigNode;
 import org.apache.iotdb.rpc.TSStatusCode;
 
 import java.util.Optional;
 
 public class PipeConfigTablePrivilegeParseVisitor
-    extends ConfigPhysicalPlanVisitor<Optional<ConfigPhysicalPlan>, String> {
+    extends ConfigPhysicalPlanVisitor<Optional<ConfigPhysicalPlan>, 
IAuditEntity> {
 
   @Override
   public Optional<ConfigPhysicalPlan> visitPlan(
-      final ConfigPhysicalPlan plan, final String userName) {
+      final ConfigPhysicalPlan plan, final IAuditEntity userEntity) {
     return Optional.of(plan);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitCreateDatabase(
-      final DatabaseSchemaPlan createDatabasePlan, final String userName) {
-    return visitDatabaseSchemaPlan(createDatabasePlan, userName);
+      final DatabaseSchemaPlan createDatabasePlan, final IAuditEntity 
userEntity) {
+    return visitDatabaseSchemaPlan(createDatabasePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitAlterDatabase(
-      final DatabaseSchemaPlan alterDatabasePlan, final String userName) {
-    return visitDatabaseSchemaPlan(alterDatabasePlan, userName);
+      final DatabaseSchemaPlan alterDatabasePlan, final IAuditEntity 
userEntity) {
+    return visitDatabaseSchemaPlan(alterDatabasePlan, userEntity);
   }
 
   public Optional<ConfigPhysicalPlan> visitDatabaseSchemaPlan(
-      final DatabaseSchemaPlan databaseSchemaPlan, final String userName) {
-    return ConfigNode.getInstance()
-                .getConfigManager()
-                .getPermissionManager()
-                .checkUserPrivileges(
-                    userName, new 
PrivilegeUnion(databaseSchemaPlan.getSchema().getName(), null))
-                .getStatus()
-                .getCode()
-            == TSStatusCode.SUCCESS_STATUS.getStatusCode()
+      final DatabaseSchemaPlan databaseSchemaPlan, final IAuditEntity 
userEntity) {
+    return isDatabaseVisible(userEntity, 
databaseSchemaPlan.getSchema().getName())
         ? Optional.of(databaseSchemaPlan)
         : Optional.empty();
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitDeleteDatabase(
-      final DeleteDatabasePlan deleteDatabasePlan, final String userName) {
-    return ConfigNode.getInstance()
-                .getConfigManager()
-                .getPermissionManager()
-                .checkUserPrivileges(
-                    userName, new PrivilegeUnion(deleteDatabasePlan.getName(), 
null))
-                .getStatus()
-                .getCode()
-            == TSStatusCode.SUCCESS_STATUS.getStatusCode()
+      final DeleteDatabasePlan deleteDatabasePlan, final IAuditEntity 
userEntity) {
+    return isDatabaseVisible(userEntity, deleteDatabasePlan.getName())
         ? Optional.of(deleteDatabasePlan)
         : Optional.empty();
   }
 
-  @Override
-  public Optional<ConfigPhysicalPlan> visitPipeCreateTableOrView(
-      final PipeCreateTableOrViewPlan pipeCreateTableOrViewPlan, final String 
userName) {
-    return ConfigNode.getInstance()
-                .getConfigManager()
+  private boolean isDatabaseVisible(final IAuditEntity userEntity, final 
String database) {
+    final ConfigManager configManager = 
ConfigNode.getInstance().getConfigManager();
+    final CNAuditLogger logger = configManager.getAuditLogger();
+    boolean result =
+        configManager
                 .getPermissionManager()
-                .checkUserPrivileges(
-                    userName,
-                    new PrivilegeUnion(
-                        pipeCreateTableOrViewPlan.getDatabase(),
-                        pipeCreateTableOrViewPlan.getTable().getTableName(),
-                        null))
+                .checkUserPrivileges(userEntity.getUsername(), new 
PrivilegeUnion(database, null))
                 .getStatus()
                 .getCode()
-            == TSStatusCode.SUCCESS_STATUS.getStatusCode()
+            == TSStatusCode.SUCCESS_STATUS.getStatusCode();
+    if (result) {
+      logger.recordAuditLog(
+          
userEntity.setPrivilegeType(PrivilegeType.READ_SCHEMA).setResult(true), () -> 
database);
+      return true;
+    }
+    return PipeConfigTreePrivilegeParseVisitor.hasGlobalPrivilege(
+        userEntity, PrivilegeType.SYSTEM, database, true);
+  }
+
+  @Override
+  public Optional<ConfigPhysicalPlan> visitPipeCreateTableOrView(
+      final PipeCreateTableOrViewPlan pipeCreateTableOrViewPlan, final 
IAuditEntity userEntity) {
+    return isTableVisible(
+            userEntity,
+            pipeCreateTableOrViewPlan.getDatabase(),
+            pipeCreateTableOrViewPlan.getTable().getTableName())
         ? Optional.of(pipeCreateTableOrViewPlan)
         : Optional.empty();
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitAddTableColumn(
-      final AddTableColumnPlan addTableColumnPlan, final String userName) {
-    return visitAbstractTablePlan(addTableColumnPlan, userName);
+      final AddTableColumnPlan addTableColumnPlan, final IAuditEntity 
userEntity) {
+    return visitAbstractTablePlan(addTableColumnPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitSetTableProperties(
-      final SetTablePropertiesPlan setTablePropertiesPlan, final String 
userName) {
-    return visitAbstractTablePlan(setTablePropertiesPlan, userName);
+      final SetTablePropertiesPlan setTablePropertiesPlan, final IAuditEntity 
userEntity) {
+    return visitAbstractTablePlan(setTablePropertiesPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitCommitDeleteColumn(
-      final CommitDeleteColumnPlan commitDeleteColumnPlan, final String 
userName) {
-    return visitAbstractTablePlan(commitDeleteColumnPlan, userName);
+      final CommitDeleteColumnPlan commitDeleteColumnPlan, final IAuditEntity 
userEntity) {
+    return visitAbstractTablePlan(commitDeleteColumnPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRenameTableColumn(
-      final RenameTableColumnPlan renameTableColumnPlan, final String 
userName) {
-    return visitAbstractTablePlan(renameTableColumnPlan, userName);
+      final RenameTableColumnPlan renameTableColumnPlan, final IAuditEntity 
userEntity) {
+    return visitAbstractTablePlan(renameTableColumnPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitCommitDeleteTable(
-      final CommitDeleteTablePlan commitDeleteTablePlan, final String 
userName) {
-    return visitAbstractTablePlan(commitDeleteTablePlan, userName);
+      final CommitDeleteTablePlan commitDeleteTablePlan, final IAuditEntity 
userEntity) {
+    return visitAbstractTablePlan(commitDeleteTablePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitPipeDeleteDevices(
-      final PipeDeleteDevicesPlan pipeDeleteDevicesPlan, final String 
userName) {
-    return visitAbstractTablePlan(pipeDeleteDevicesPlan, userName);
+      final PipeDeleteDevicesPlan pipeDeleteDevicesPlan, final IAuditEntity 
userEntity) {
+    return visitAbstractTablePlan(pipeDeleteDevicesPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitSetTableComment(
-      final SetTableCommentPlan setTableCommentPlan, final String userName) {
-    return visitAbstractTablePlan(setTableCommentPlan, userName);
+      final SetTableCommentPlan setTableCommentPlan, final IAuditEntity 
userEntity) {
+    return visitAbstractTablePlan(setTableCommentPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitSetTableColumnComment(
-      final SetTableColumnCommentPlan setTableColumnCommentPlan, final String 
userName) {
-    return visitAbstractTablePlan(setTableColumnCommentPlan, userName);
+      final SetTableColumnCommentPlan setTableColumnCommentPlan, final 
IAuditEntity userEntity) {
+    return visitAbstractTablePlan(setTableColumnCommentPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRenameTable(
-      final RenameTablePlan renameTablePlan, final String userName) {
-    return visitAbstractTablePlan(renameTablePlan, userName);
+      final RenameTablePlan renameTablePlan, final IAuditEntity userEntity) {
+    return visitAbstractTablePlan(renameTablePlan, userEntity);
   }
 
   private Optional<ConfigPhysicalPlan> visitAbstractTablePlan(
-      final AbstractTablePlan plan, final String userName) {
-    return ConfigNode.getInstance()
-                .getConfigManager()
+      final AbstractTablePlan plan, final IAuditEntity userEntity) {
+    return isTableVisible(userEntity, plan.getDatabase(), plan.getTableName())
+        ? Optional.of(plan)
+        : Optional.empty();
+  }
+
+  private boolean isTableVisible(
+      final IAuditEntity userEntity, final String database, final String 
tableName) {
+    final ConfigManager configManager = 
ConfigNode.getInstance().getConfigManager();
+    final CNAuditLogger logger = configManager.getAuditLogger();
+    boolean result =
+        configManager
                 .getPermissionManager()
                 .checkUserPrivileges(
-                    userName, new PrivilegeUnion(plan.getDatabase(), 
plan.getTableName(), null))
+                    userEntity.getUsername(), new PrivilegeUnion(database, 
tableName, null))
                 .getStatus()
                 .getCode()
-            == TSStatusCode.SUCCESS_STATUS.getStatusCode()
-        ? Optional.of(plan)
-        : Optional.empty();
+            == TSStatusCode.SUCCESS_STATUS.getStatusCode();
+    if (result) {
+      logger.recordAuditLog(
+          
userEntity.setPrivilegeType(PrivilegeType.READ_SCHEMA).setResult(true), () -> 
database);
+      return true;
+    }
+    return PipeConfigTreePrivilegeParseVisitor.hasGlobalPrivilege(
+        userEntity, PrivilegeType.SYSTEM, tableName, true);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRCreateUser(
-      final AuthorRelationalPlan rCreateUserPlan, final String userName) {
-    return visitUserPlan(rCreateUserPlan, userName);
+      final AuthorRelationalPlan rCreateUserPlan, final IAuditEntity 
userEntity) {
+    return visitUserPlan(rCreateUserPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRCreateRole(
-      final AuthorRelationalPlan rCreateRolePlan, final String userName) {
-    return visitRolePlan(rCreateRolePlan, userName);
+      final AuthorRelationalPlan rCreateRolePlan, final IAuditEntity 
userEntity) {
+    return visitRolePlan(rCreateRolePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRUpdateUser(
-      final AuthorRelationalPlan rUpdateUserPlan, final String userName) {
-    return visitUserPlan(rUpdateUserPlan, userName);
+      final AuthorRelationalPlan rUpdateUserPlan, final IAuditEntity 
userEntity) {
+    return visitUserPlan(rUpdateUserPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRDropUserPlan(
-      final AuthorRelationalPlan rDropUserPlan, final String userName) {
-    return visitUserPlan(rDropUserPlan, userName);
+      final AuthorRelationalPlan rDropUserPlan, final IAuditEntity userEntity) 
{
+    return visitUserPlan(rDropUserPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRDropRolePlan(
-      final AuthorRelationalPlan rDropRolePlan, final String userName) {
-    return visitRolePlan(rDropRolePlan, userName);
+      final AuthorRelationalPlan rDropRolePlan, final IAuditEntity userEntity) 
{
+    return visitRolePlan(rDropRolePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRGrantUserRole(
-      final AuthorRelationalPlan rGrantUserRolePlan, final String userName) {
-    return visitUserRolePlan(rGrantUserRolePlan, userName);
+      final AuthorRelationalPlan rGrantUserRolePlan, final IAuditEntity 
userEntity) {
+    return visitUserRolePlan(rGrantUserRolePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRRevokeUserRole(
-      final AuthorRelationalPlan rRevokeUserRolePlan, final String userName) {
-    return visitUserRolePlan(rRevokeUserRolePlan, userName);
+      final AuthorRelationalPlan rRevokeUserRolePlan, final IAuditEntity 
userEntity) {
+    return visitUserRolePlan(rRevokeUserRolePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRGrantUserAny(
-      final AuthorRelationalPlan rGrantUserAnyPlan, final String userName) {
-    return visitUserPlan(rGrantUserAnyPlan, userName);
+      final AuthorRelationalPlan rGrantUserAnyPlan, final IAuditEntity 
userEntity) {
+    return visitUserPlan(rGrantUserAnyPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRGrantRoleAny(
-      final AuthorRelationalPlan rGrantRoleAnyPlan, final String userName) {
-    return visitRolePlan(rGrantRoleAnyPlan, userName);
+      final AuthorRelationalPlan rGrantRoleAnyPlan, final IAuditEntity 
userEntity) {
+    return visitRolePlan(rGrantRoleAnyPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRGrantUserAll(
-      final AuthorRelationalPlan rGrantUserAllPlan, final String userName) {
-    return visitUserPlan(rGrantUserAllPlan, userName);
+      final AuthorRelationalPlan rGrantUserAllPlan, final IAuditEntity 
userEntity) {
+    return visitUserPlan(rGrantUserAllPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRGrantRoleAll(
-      final AuthorRelationalPlan rGrantRoleAllPlan, final String userName) {
-    return visitRolePlan(rGrantRoleAllPlan, userName);
+      final AuthorRelationalPlan rGrantRoleAllPlan, final IAuditEntity 
userEntity) {
+    return visitRolePlan(rGrantRoleAllPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRGrantUserDB(
-      final AuthorRelationalPlan rGrantUserDBPlan, final String userName) {
-    return visitUserPlan(rGrantUserDBPlan, userName);
+      final AuthorRelationalPlan rGrantUserDBPlan, final IAuditEntity 
userEntity) {
+    return visitUserPlan(rGrantUserDBPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRGrantUserTB(
-      final AuthorRelationalPlan rGrantUserTBPlan, final String userName) {
-    return visitUserPlan(rGrantUserTBPlan, userName);
+      final AuthorRelationalPlan rGrantUserTBPlan, final IAuditEntity 
userEntity) {
+    return visitUserPlan(rGrantUserTBPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRGrantRoleDB(
-      final AuthorRelationalPlan rGrantRoleDBPlan, final String userName) {
-    return visitRolePlan(rGrantRoleDBPlan, userName);
+      final AuthorRelationalPlan rGrantRoleDBPlan, final IAuditEntity 
userEntity) {
+    return visitRolePlan(rGrantRoleDBPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRGrantRoleTB(
-      final AuthorRelationalPlan rGrantRoleTBPlan, final String userName) {
-    return visitRolePlan(rGrantRoleTBPlan, userName);
+      final AuthorRelationalPlan rGrantRoleTBPlan, final IAuditEntity 
userEntity) {
+    return visitRolePlan(rGrantRoleTBPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRRevokeUserAny(
-      final AuthorRelationalPlan rRevokeUserAnyPlan, final String userName) {
-    return visitUserPlan(rRevokeUserAnyPlan, userName);
+      final AuthorRelationalPlan rRevokeUserAnyPlan, final IAuditEntity 
userEntity) {
+    return visitUserPlan(rRevokeUserAnyPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRRevokeRoleAny(
-      final AuthorRelationalPlan rRevokeRoleAnyPlan, final String userName) {
-    return visitRolePlan(rRevokeRoleAnyPlan, userName);
+      final AuthorRelationalPlan rRevokeRoleAnyPlan, final IAuditEntity 
userEntity) {
+    return visitRolePlan(rRevokeRoleAnyPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRRevokeUserAll(
-      final AuthorRelationalPlan rRevokeUserAllPlan, final String userName) {
-    return visitUserPlan(rRevokeUserAllPlan, userName);
+      final AuthorRelationalPlan rRevokeUserAllPlan, final IAuditEntity 
userEntity) {
+    return visitUserPlan(rRevokeUserAllPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRRevokeRoleAll(
-      final AuthorRelationalPlan rRevokeRoleAllPlan, final String userName) {
-    return visitRolePlan(rRevokeRoleAllPlan, userName);
+      final AuthorRelationalPlan rRevokeRoleAllPlan, final IAuditEntity 
userEntity) {
+    return visitRolePlan(rRevokeRoleAllPlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRRevokeUserDBPrivilege(
-      final AuthorRelationalPlan rRevokeUserDBPrivilegePlan, final String 
userName) {
-    return visitUserPlan(rRevokeUserDBPrivilegePlan, userName);
+      final AuthorRelationalPlan rRevokeUserDBPrivilegePlan, final 
IAuditEntity userEntity) {
+    return visitUserPlan(rRevokeUserDBPrivilegePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRRevokeUserTBPrivilege(
-      final AuthorRelationalPlan rRevokeUserTBPrivilegePlan, final String 
userName) {
-    return visitUserPlan(rRevokeUserTBPrivilegePlan, userName);
+      final AuthorRelationalPlan rRevokeUserTBPrivilegePlan, final 
IAuditEntity userEntity) {
+    return visitUserPlan(rRevokeUserTBPrivilegePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRRevokeRoleDBPrivilege(
-      final AuthorRelationalPlan rRevokeRoleTBPrivilegePlan, final String 
userName) {
-    return visitRolePlan(rRevokeRoleTBPrivilegePlan, userName);
+      final AuthorRelationalPlan rRevokeRoleTBPrivilegePlan, final 
IAuditEntity userEntity) {
+    return visitRolePlan(rRevokeRoleTBPrivilegePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRRevokeRoleTBPrivilege(
-      final AuthorRelationalPlan rRevokeRoleTBPrivilegePlan, final String 
userName) {
-    return visitRolePlan(rRevokeRoleTBPrivilegePlan, userName);
+      final AuthorRelationalPlan rRevokeRoleTBPrivilegePlan, final 
IAuditEntity userEntity) {
+    return visitRolePlan(rRevokeRoleTBPrivilegePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRGrantUserSysPrivilege(
-      final AuthorRelationalPlan rGrantUserSysPrivilegePlan, final String 
userName) {
-    return visitUserPlan(rGrantUserSysPrivilegePlan, userName);
+      final AuthorRelationalPlan rGrantUserSysPrivilegePlan, final 
IAuditEntity userEntity) {
+    return visitUserPlan(rGrantUserSysPrivilegePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRGrantRoleSysPrivilege(
-      final AuthorRelationalPlan rGrantRoleSysPrivilegePlan, final String 
userName) {
-    return visitRolePlan(rGrantRoleSysPrivilegePlan, userName);
+      final AuthorRelationalPlan rGrantRoleSysPrivilegePlan, final 
IAuditEntity userEntity) {
+    return visitRolePlan(rGrantRoleSysPrivilegePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRRevokeUserSysPrivilege(
-      final AuthorRelationalPlan rRevokeUserSysPrivilegePlan, final String 
userName) {
-    return visitUserPlan(rRevokeUserSysPrivilegePlan, userName);
+      final AuthorRelationalPlan rRevokeUserSysPrivilegePlan, final 
IAuditEntity userEntity) {
+    return visitUserPlan(rRevokeUserSysPrivilegePlan, userEntity);
   }
 
   @Override
   public Optional<ConfigPhysicalPlan> visitRRevokeRoleSysPrivilege(
-      final AuthorRelationalPlan rRevokeRoleSysPrivilegePlan, final String 
userName) {
-    return visitRolePlan(rRevokeRoleSysPrivilegePlan, userName);
+      final AuthorRelationalPlan rRevokeRoleSysPrivilegePlan, final 
IAuditEntity userEntity) {
+    return visitRolePlan(rRevokeRoleSysPrivilegePlan, userEntity);
   }
 
   private Optional<ConfigPhysicalPlan> visitUserPlan(
-      final AuthorRelationalPlan plan, final String userName) {
-    return ConfigNode.getInstance()
-                .getConfigManager()
-                .getPermissionManager()
-                .checkUserPrivileges(userName, new 
PrivilegeUnion(PrivilegeType.MANAGE_USER))
-                .getStatus()
-                .getCode()
-            == TSStatusCode.SUCCESS_STATUS.getStatusCode()
-        ? Optional.of(plan)
-        : Optional.empty();
+      final AuthorRelationalPlan plan, final IAuditEntity userEntity) {
+    return PipeConfigTreePrivilegeParseVisitor.visitUserPlan(plan, userEntity);
   }
 
   private Optional<ConfigPhysicalPlan> visitRolePlan(
-      final AuthorRelationalPlan plan, final String userName) {
-    return ConfigNode.getInstance()
-                .getConfigManager()
-                .getPermissionManager()
-                .checkUserPrivileges(userName, new 
PrivilegeUnion(PrivilegeType.MANAGE_ROLE))
-                .getStatus()
-                .getCode()
-            == TSStatusCode.SUCCESS_STATUS.getStatusCode()
-        ? Optional.of(plan)
-        : Optional.empty();
+      final AuthorRelationalPlan plan, final IAuditEntity userEntity) {
+    return PipeConfigTreePrivilegeParseVisitor.visitRolePlan(plan, userEntity);
   }
 
   private Optional<ConfigPhysicalPlan> visitUserRolePlan(
-      final AuthorRelationalPlan plan, final String userName) {
-    return ConfigNode.getInstance()
-                    .getConfigManager()
-                    .getPermissionManager()
-                    .checkUserPrivileges(userName, new 
PrivilegeUnion(PrivilegeType.MANAGE_ROLE))
-                    .getStatus()
-                    .getCode()
-                == TSStatusCode.SUCCESS_STATUS.getStatusCode()
-            || ConfigNode.getInstance()
-                    .getConfigManager()
-                    .getPermissionManager()
-                    .checkUserPrivileges(userName, new 
PrivilegeUnion(PrivilegeType.MANAGE_USER))
-                    .getStatus()
-                    .getCode()
-                == TSStatusCode.SUCCESS_STATUS.getStatusCode()
-        ? Optional.of(plan)
-        : Optional.empty();
+      final AuthorRelationalPlan plan, final IAuditEntity userEntity) {
+    return PipeConfigTreePrivilegeParseVisitor.visitUserRolePlan(plan, 
userEntity);
   }
 }
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigTreePrivilegeParseVisitor.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigTreePrivilegeParseVisitor.java
index 925ba9ef952..4fe00a92ab0 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigTreePrivilegeParseVisitor.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigTreePrivilegeParseVisitor.java
@@ -31,6 +31,7 @@ import org.apache.iotdb.commons.schema.template.Template;
 import org.apache.iotdb.confignode.audit.CNAuditLogger;
 import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlan;
 import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanVisitor;
+import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorPlan;
 import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorTreePlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.database.DatabaseSchemaPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.database.DeleteDatabasePlan;
@@ -183,8 +184,19 @@ public class PipeConfigTreePrivilegeParseVisitor
     return visitRolePlan(revokeRolePlan, userEntity);
   }
 
-  private Optional<ConfigPhysicalPlan> visitUserPlan(
-      final AuthorTreePlan plan, final IAuditEntity userEntity) {
+  public static Optional<ConfigPhysicalPlan> visitUserRolePlan(
+      final AuthorPlan plan, final IAuditEntity userEntity) {
+    final Optional<ConfigPhysicalPlan> result = visitUserPlan(plan, 
userEntity, false);
+    return result.isPresent() ? result : visitRolePlan(plan, userEntity);
+  }
+
+  public static Optional<ConfigPhysicalPlan> visitUserPlan(
+      final AuthorPlan plan, final IAuditEntity userEntity) {
+    return visitUserPlan(plan, userEntity, true);
+  }
+
+  public static Optional<ConfigPhysicalPlan> visitUserPlan(
+      final AuthorPlan plan, final IAuditEntity userEntity, final boolean 
isLastCheck) {
     final String auditObject = plan.getUserName();
     if (userEntity.getUsername().equals(plan.getUserName())) {
       ConfigNode.getInstance()
@@ -193,13 +205,14 @@ public class PipeConfigTreePrivilegeParseVisitor
           .recordAuditLog(userEntity.setPrivilegeType(null).setResult(true), 
() -> auditObject);
       return Optional.of(plan);
     }
-    return hasGlobalPrivilege(userEntity, PrivilegeType.MANAGE_USER, 
plan.getUserName(), true)
+    return hasGlobalPrivilege(
+            userEntity, PrivilegeType.MANAGE_USER, plan.getUserName(), 
isLastCheck)
         ? Optional.of(plan)
         : Optional.empty();
   }
 
-  private Optional<ConfigPhysicalPlan> visitRolePlan(
-      final AuthorTreePlan plan, final IAuditEntity userEntity) {
+  public static Optional<ConfigPhysicalPlan> visitRolePlan(
+      final AuthorPlan plan, final IAuditEntity userEntity) {
     final String auditObject = plan.getRoleName();
     final ConfigManager configManager = 
ConfigNode.getInstance().getConfigManager();
     try {
@@ -354,7 +367,7 @@ public class PipeConfigTreePrivilegeParseVisitor
         .fetchRawAuthorizedPTree(userEntity, PrivilegeType.READ_SCHEMA);
   }
 
-  private boolean hasGlobalPrivilege(
+  public static boolean hasGlobalPrivilege(
       final IAuditEntity userEntity,
       final PrivilegeType privilegeType,
       final String auditObject,

Reply via email to