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

shuwenwei 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 a4a807f5bd4 add super_user check in TreeAccessCheckVisitor
a4a807f5bd4 is described below

commit a4a807f5bd46bf40f8d9a467282cfe4a9ac3e7ca
Author: shuwenwei <[email protected]>
AuthorDate: Thu Sep 18 15:27:02 2025 +0800

    add super_user check in TreeAccessCheckVisitor
---
 .../org/apache/iotdb/db/auth/AuthorityChecker.java |   3 +-
 .../security/TreeAccessCheckVisitor.java           | 137 +++++++++++----------
 2 files changed, 72 insertions(+), 68 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
index 26f320b8fe8..48b58a9634b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
@@ -44,6 +44,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.security.TreeAccessCheckV
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement;
 import org.apache.iotdb.db.queryengine.plan.statement.Statement;
 import org.apache.iotdb.db.queryengine.plan.statement.sys.AuthorStatement;
+import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 
 import com.google.common.util.concurrent.SettableFuture;
@@ -70,7 +71,7 @@ public class AuthorityChecker {
 
   public static String SUPER_USER = 
CommonDescriptor.getInstance().getConfig().getAdminName();
 
-  public static final TSStatus SUCCEED = new 
TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
+  public static final TSStatus SUCCEED = RpcUtils.SUCCESS_STATUS;
 
   public static final String ONLY_ADMIN_ALLOWED =
       "No permissions for this operation, only root user is allowed";
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 3bf3c92808f..1059f24c76b 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
@@ -172,15 +172,6 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
     return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
   }
 
-  private TSStatus checkSystemAuth(String userName) {
-    if (AuthorityChecker.SUPER_USER.equals(userName)) {
-      return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
-    }
-    return AuthorityChecker.getTSStatus(
-        AuthorityChecker.checkSystemPermission(userName, PrivilegeType.SYSTEM),
-        PrivilegeType.SYSTEM);
-  }
-
   // ====================== template related =================================
 
   @Override
@@ -193,10 +184,9 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
   public TSStatus visitSetSchemaTemplate(
       SetSchemaTemplateStatement setSchemaTemplateStatement, 
TreeAccessCheckContext context) {
     // root.__audit can never be set template
-    String[] nodes = setSchemaTemplateStatement.getPath().getNodes();
-    if (nodes.length >= 2 && 
TABLE_MODEL_AUDIT_DATABASE.equalsIgnoreCase(nodes[1])) {
-      return new TSStatus(TSStatusCode.NO_PERMISSION.getStatusCode())
-          .setMessage(String.format(READ_ONLY_DB_ERROR_MSG, 
TABLE_MODEL_AUDIT_DATABASE));
+    TSStatus status = 
checkWriteOnReadOnlyPath(setSchemaTemplateStatement.getPath());
+    if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+      return status;
     }
     return checkSystemAuth(context.userName);
   }
@@ -372,21 +362,16 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
     switch (authorType) {
       case CREATE_USER:
       case DROP_USER:
-        return AuthorityChecker.getTSStatus(
-            AuthorityChecker.checkSystemPermission(context.userName, 
PrivilegeType.MANAGE_USER),
-            PrivilegeType.MANAGE_USER);
-
+        return checkGlobalAuth(context.userName, PrivilegeType.MANAGE_USER);
       case UPDATE_USER:
         // users can change passwords of themselves
         if (statement.getUserName().equals(context.userName)) {
           return RpcUtils.SUCCESS_STATUS;
         }
-        return AuthorityChecker.getTSStatus(
-            AuthorityChecker.checkSystemPermission(context.userName, 
PrivilegeType.MANAGE_USER),
-            PrivilegeType.MANAGE_USER);
+        return checkGlobalAuth(context.userName, PrivilegeType.MANAGE_USER);
 
       case LIST_USER:
-        if (AuthorityChecker.checkSystemPermission(context.userName, 
PrivilegeType.SECURITY)) {
+        if (checkHasGlobalAuth(context.userName, PrivilegeType.MANAGE_USER)) {
           return RpcUtils.SUCCESS_STATUS;
         }
         statement.setUserName(context.userName);
@@ -396,22 +381,18 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
         if (context.userName.equals(statement.getUserName())) {
           return RpcUtils.SUCCESS_STATUS;
         }
-        return AuthorityChecker.getTSStatus(
-            AuthorityChecker.checkSystemPermission(context.userName, 
PrivilegeType.MANAGE_USER),
-            PrivilegeType.MANAGE_USER);
+        return checkGlobalAuth(context.userName, PrivilegeType.MANAGE_USER);
 
       case LIST_ROLE_PRIVILEGE:
         if (!AuthorityChecker.checkRole(context.userName, 
statement.getRoleName())) {
-          return AuthorityChecker.getTSStatus(
-              AuthorityChecker.checkSystemPermission(context.userName, 
PrivilegeType.MANAGE_ROLE),
-              PrivilegeType.MANAGE_ROLE);
+          return checkGlobalAuth(context.userName, PrivilegeType.MANAGE_ROLE);
         } else {
-          return RpcUtils.SUCCESS_STATUS;
+          return SUCCEED;
         }
 
       case LIST_ROLE:
         if (AuthorityChecker.checkSystemPermission(context.userName, 
PrivilegeType.MANAGE_ROLE)) {
-          return RpcUtils.SUCCESS_STATUS;
+          return SUCCEED;
         }
         // list roles of other user is not allowed
         if (statement.getUserName() != null && 
!statement.getUserName().equals(context.userName)) {
@@ -424,23 +405,20 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
       case DROP_ROLE:
       case GRANT_USER_ROLE:
       case REVOKE_USER_ROLE:
-        return AuthorityChecker.getTSStatus(
-            AuthorityChecker.checkSystemPermission(context.userName, 
PrivilegeType.MANAGE_ROLE),
-            PrivilegeType.MANAGE_ROLE);
+        return checkGlobalAuth(context.userName, PrivilegeType.MANAGE_ROLE);
 
       case REVOKE_USER:
       case GRANT_USER:
       case GRANT_ROLE:
       case REVOKE_ROLE:
-        if (AuthorityChecker.checkSystemPermission(context.userName, 
PrivilegeType.SECURITY)) {
+        if (checkHasGlobalAuth(context.userName, PrivilegeType.SECURITY)) {
           return RpcUtils.SUCCESS_STATUS;
         }
 
         for (String s : statement.getPrivilegeList()) {
           PrivilegeType privilegeType = PrivilegeType.valueOf(s.toUpperCase());
           if (privilegeType.isSystemPrivilege()) {
-            if (!AuthorityChecker.checkSystemPermissionGrantOption(
-                context.userName, privilegeType)) {
+            if (!checkHasGlobalAuth(context.userName, privilegeType)) {
               return AuthorityChecker.getTSStatus(
                   false,
                   "Has no permission to execute "
@@ -899,36 +877,35 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
   @Override
   public TSStatus visitExtendRegion(
       ExtendRegionStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitGetRegionId(GetRegionIdStatement statement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitGetSeriesSlotList(
       GetSeriesSlotListStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitGetTimeSlotList(
       GetTimeSlotListStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitCountTimeSlotList(
       CountTimeSlotListStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitKillQuery(KillQueryStatement statement, 
TreeAccessCheckContext context) {
-    if (AuthorityChecker.checkMaintain(context.userName).getCode()
-        != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+    if (checkHasGlobalAuth(context.userName, PrivilegeType.MAINTAIN)) {
       statement.setAllowedUsername(context.userName);
     }
     return SUCCEED;
@@ -936,7 +913,7 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
 
   @Override
   public TSStatus visitFlush(FlushStatement flushStatement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkUserIsSystemAdmin(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.SYSTEM);
   }
 
   @Override
@@ -954,61 +931,61 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
   @Override
   public TSStatus visitSetSystemStatus(
       SetSystemStatusStatement setSystemStatusStatement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkUserIsSystemAdmin(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.SYSTEM);
   }
 
   @Override
   public TSStatus visitStartRepairData(
       StartRepairDataStatement startRepairDataStatement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkUserIsSystemAdmin(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.SYSTEM);
   }
 
   @Override
   public TSStatus visitStopRepairData(
       StopRepairDataStatement stopRepairDataStatement, TreeAccessCheckContext 
context) {
-    return AuthorityChecker.checkUserIsSystemAdmin(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.SYSTEM);
   }
 
   @Override
   public TSStatus visitClearCache(
       ClearCacheStatement clearCacheStatement, TreeAccessCheckContext context) 
{
-    return AuthorityChecker.checkUserIsSystemAdmin(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.SYSTEM);
   }
 
   @Override
   public TSStatus visitMigrateRegion(
       MigrateRegionStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitReconstructRegion(
       ReconstructRegionStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitRemoveAINode(
       RemoveAINodeStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitRemoveConfigNode(
       RemoveConfigNodeStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitRemoveDataNode(
       RemoveDataNodeStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitRemoveRegion(
       RemoveRegionStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
@@ -1019,24 +996,24 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
 
   @Override
   public TSStatus visitShowAINodes(ShowAINodesStatement statement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitShowClusterId(
       ShowClusterIdStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitShowCluster(ShowClusterStatement statement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitShowConfigNodes(
       ShowConfigNodesStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
@@ -1054,13 +1031,12 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
   @Override
   public TSStatus visitShowDataNodes(
       ShowDataNodesStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitShowQueries(ShowQueriesStatement statement, 
TreeAccessCheckContext context) {
-    if (AuthorityChecker.checkMaintain(context.userName).getCode()
-        != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+    if (checkHasGlobalAuth(context.userName, PrivilegeType.MAINTAIN)) {
       statement.setAllowedUsername(context.userName);
     }
     return SUCCEED;
@@ -1068,36 +1044,36 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
 
   @Override
   public TSStatus visitShowRegion(ShowRegionStatement statement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitShowVariables(
       ShowVariablesStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitShowVersion(ShowVersionStatement statement, 
TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitTestConnection(
       TestConnectionStatement statement, TreeAccessCheckContext context) {
-    return AuthorityChecker.checkMaintain(context.userName);
+    return checkGlobalAuth(context.userName, PrivilegeType.MAINTAIN);
   }
 
   @Override
   public TSStatus visitShowCurrentTimestamp(
       ShowCurrentTimestampStatement showCurrentTimestampStatement, 
TreeAccessCheckContext context) {
-    return visitAuthorityInformation(showCurrentTimestampStatement, context);
+    return SUCCEED;
   }
 
   // ======================== TTL related ===========================
   @Override
   public TSStatus visitSetTTL(SetTTLStatement statement, 
TreeAccessCheckContext context) {
-    if (AuthorityChecker.checkSystemPermission(context.userName, 
PrivilegeType.SYSTEM)) {
+    if (checkHasGlobalAuth(context.userName, PrivilegeType.SYSTEM)) {
       return SUCCEED;
     }
     List<PartialPath> checkedPaths = statement.getPaths();
@@ -1110,7 +1086,7 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
 
   @Override
   public TSStatus visitShowTTL(ShowTTLStatement showTTLStatement, 
TreeAccessCheckContext context) {
-    if (AuthorityChecker.checkSystemPermission(context.userName, 
PrivilegeType.SYSTEM)) {
+    if (checkHasGlobalAuth(context.userName, PrivilegeType.SYSTEM)) {
       return SUCCEED;
     }
     return visitAuthorityInformation(showTTLStatement, context);
@@ -1157,4 +1133,31 @@ public class TreeAccessCheckVisitor extends 
StatementVisitor<TSStatus, TreeAcces
       return visitAuthorityInformation(statement, context);
     }
   }
+
+  protected TSStatus checkSystemAuth(String userName) {
+    return checkGlobalAuth(userName, PrivilegeType.SYSTEM);
+  }
+
+  protected TSStatus checkGlobalAuth(String userName, PrivilegeType 
requiredPrivilege) {
+    if (checkHasGlobalAuth(userName, requiredPrivilege)) {
+      return SUCCEED;
+    }
+    return AuthorityChecker.getTSStatus(false, requiredPrivilege);
+  }
+
+  protected boolean checkHasGlobalAuth(String userName, PrivilegeType 
requiredPrivilege) {
+    if (AuthorityChecker.SUPER_USER.equals(userName)) {
+      return true;
+    }
+    return AuthorityChecker.checkSystemPermission(userName, requiredPrivilege);
+  }
+
+  protected TSStatus checkWriteOnReadOnlyPath(PartialPath path) {
+    String[] nodes = path.getNodes();
+    if (nodes.length >= 2 && 
TABLE_MODEL_AUDIT_DATABASE.equalsIgnoreCase(nodes[1])) {
+      return new TSStatus(TSStatusCode.NO_PERMISSION.getStatusCode())
+          .setMessage(String.format(READ_ONLY_DB_ERROR_MSG, 
TABLE_MODEL_AUDIT_DATABASE));
+    }
+    return SUCCEED;
+  }
 }

Reply via email to