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

jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 13afc0348e1 Add IAuthorPlanExecutor
13afc0348e1 is described below

commit 13afc0348e199a6b81c76a1697a3093a1adc3217
Author: shuwenwei <[email protected]>
AuthorDate: Mon Sep 22 19:54:31 2025 +0800

    Add IAuthorPlanExecutor
---
 .../iotdb/confignode/manager/ConfigManager.java    |   6 +-
 .../confignode/manager/PermissionManager.java      |   4 +-
 .../confignode/persistence/auth/AuthorInfo.java    | 164 ++++++++++++++++
 .../AuthorPlanExecutor.java}                       | 209 ++++++++-------------
 .../persistence/auth/IAuthorPlanExecutor.java      |  62 ++++++
 .../persistence/executor/ConfigPlanExecutor.java   |   2 +-
 .../confignode/persistence/AuthorInfoTest.java     |   3 +-
 .../persistence/CNPhysicalPlanGeneratorTest.java   |   3 +-
 .../org/apache/iotdb/db/auth/AuthorityChecker.java |   7 +-
 9 files changed, 320 insertions(+), 140 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index cc5a1198d32..60883d6dd94 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -123,13 +123,13 @@ import 
org.apache.iotdb.confignode.manager.pipe.coordinator.PipeManager;
 import org.apache.iotdb.confignode.manager.schema.ClusterSchemaManager;
 import org.apache.iotdb.confignode.manager.schema.ClusterSchemaQuotaStatistics;
 import org.apache.iotdb.confignode.manager.subscription.SubscriptionManager;
-import org.apache.iotdb.confignode.persistence.AuthorInfo;
 import org.apache.iotdb.confignode.persistence.ClusterInfo;
 import org.apache.iotdb.confignode.persistence.ModelInfo;
 import org.apache.iotdb.confignode.persistence.ProcedureInfo;
 import org.apache.iotdb.confignode.persistence.TTLInfo;
 import org.apache.iotdb.confignode.persistence.TriggerInfo;
 import org.apache.iotdb.confignode.persistence.UDFInfo;
+import org.apache.iotdb.confignode.persistence.auth.AuthorInfo;
 import org.apache.iotdb.confignode.persistence.cq.CQInfo;
 import org.apache.iotdb.confignode.persistence.executor.ConfigPlanExecutor;
 import org.apache.iotdb.confignode.persistence.node.NodeInfo;
@@ -368,7 +368,7 @@ public class ConfigManager implements IManager {
     NodeInfo nodeInfo = new NodeInfo();
     ClusterSchemaInfo clusterSchemaInfo = new ClusterSchemaInfo();
     PartitionInfo partitionInfo = new PartitionInfo();
-    AuthorInfo authorInfo = new AuthorInfo(this);
+    AuthorInfo authorInfo = new AuthorInfo();
     ProcedureInfo procedureInfo = new ProcedureInfo(this);
     UDFInfo udfInfo = new UDFInfo();
     TriggerInfo triggerInfo = new TriggerInfo();
@@ -1356,7 +1356,7 @@ public class ConfigManager implements IManager {
     TSStatus status = confirmLeader();
     if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
       try {
-        return permissionManager.fetchAuthizedPTree(username, permission);
+        return permissionManager.fetchAuthorizedPTree(username, permission);
       } catch (AuthException e) {
         TAuthizedPatternTreeResp resp = new TAuthizedPatternTreeResp();
         status.setCode(e.getCode().getStatusCode()).setMessage(e.getMessage());
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/PermissionManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/PermissionManager.java
index 605e5785e9e..1ef0bcf04f0 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/PermissionManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/PermissionManager.java
@@ -28,7 +28,7 @@ import 
org.apache.iotdb.confignode.consensus.request.write.auth.AuthorPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeEnrichedPlan;
 import org.apache.iotdb.confignode.consensus.response.auth.PermissionInfoResp;
 import org.apache.iotdb.confignode.manager.consensus.ConsensusManager;
-import org.apache.iotdb.confignode.persistence.AuthorInfo;
+import org.apache.iotdb.confignode.persistence.auth.AuthorInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TAuthizedPatternTreeResp;
 import org.apache.iotdb.confignode.rpc.thrift.TPermissionInfoResp;
 import org.apache.iotdb.consensus.exception.ConsensusException;
@@ -122,7 +122,7 @@ public class PermissionManager {
     return authorInfo.checkUserPrivileges(username, union);
   }
 
-  public TAuthizedPatternTreeResp fetchAuthizedPTree(String username, int 
permission)
+  public TAuthizedPatternTreeResp fetchAuthorizedPTree(String username, int 
permission)
       throws AuthException {
     return authorInfo.generateAuthorizedPTree(username, permission);
   }
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorInfo.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorInfo.java
new file mode 100644
index 00000000000..e499887f195
--- /dev/null
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorInfo.java
@@ -0,0 +1,164 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.confignode.persistence.auth;
+
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.auth.AuthException;
+import org.apache.iotdb.commons.auth.authorizer.BasicAuthorizer;
+import org.apache.iotdb.commons.auth.authorizer.IAuthorizer;
+import org.apache.iotdb.commons.auth.entity.ModelType;
+import org.apache.iotdb.commons.auth.entity.PrivilegeUnion;
+import org.apache.iotdb.commons.conf.CommonConfig;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
+import org.apache.iotdb.commons.snapshot.SnapshotProcessor;
+import org.apache.iotdb.commons.utils.FileUtils;
+import org.apache.iotdb.commons.utils.TestOnly;
+import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorPlan;
+import 
org.apache.iotdb.confignode.consensus.request.write.auth.AuthorRelationalPlan;
+import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorTreePlan;
+import org.apache.iotdb.confignode.consensus.response.auth.PermissionInfoResp;
+import org.apache.iotdb.confignode.rpc.thrift.TAuthizedPatternTreeResp;
+import org.apache.iotdb.confignode.rpc.thrift.TPermissionInfoResp;
+
+import org.apache.thrift.TException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+
+public class AuthorInfo implements SnapshotProcessor {
+
+  // Works at config node.
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(AuthorInfo.class);
+  public static final CommonConfig COMMON_CONFIG = 
CommonDescriptor.getInstance().getConfig();
+  public static final String NO_USER_MSG = "No such user : ";
+
+  private IAuthorizer authorizer;
+  private volatile AuthorPlanExecutor authorPlanExecutor;
+
+  public AuthorInfo() {
+    try {
+      authorizer = BasicAuthorizer.getInstance();
+      authorPlanExecutor = new AuthorPlanExecutor(authorizer);
+    } catch (AuthException e) {
+      LOGGER.error("get user or role permissionInfo failed because ", e);
+    }
+  }
+
+  public void setAuthorQueryPlanExecutor(AuthorPlanExecutor 
authorPlanExecutor) {
+    this.authorPlanExecutor = authorPlanExecutor;
+  }
+
+  public TPermissionInfoResp login(String username, String password) {
+    return authorPlanExecutor.login(username, password);
+  }
+
+  public String login4Pipe(final String username, final String password) {
+    return authorPlanExecutor.login4Pipe(username, password);
+  }
+
+  public TPermissionInfoResp checkUserPrivileges(String username, 
PrivilegeUnion union) {
+    return authorPlanExecutor.checkUserPrivileges(username, union);
+  }
+
+  public TSStatus authorNonQuery(AuthorPlan authorPlan) {
+    if (authorPlan instanceof AuthorTreePlan) {
+      return authorNonQuery((AuthorTreePlan) authorPlan);
+    } else {
+      return authorNonQuery((AuthorRelationalPlan) authorPlan);
+    }
+  }
+
+  public TSStatus authorNonQuery(AuthorTreePlan authorPlan) {
+    return authorPlanExecutor.executeAuthorNonQuery(authorPlan);
+  }
+
+  public TSStatus authorNonQuery(AuthorRelationalPlan authorPlan) {
+    return authorPlanExecutor.executeRelationalAuthorNonQuery(authorPlan);
+  }
+
+  public PermissionInfoResp executeListUsers(final AuthorPlan plan) throws 
AuthException {
+    return authorPlanExecutor.executeListUsers(plan);
+  }
+
+  public PermissionInfoResp executeListRoles(final AuthorPlan plan) throws 
AuthException {
+    return authorPlanExecutor.executeListRoles(plan);
+  }
+
+  public PermissionInfoResp executeListRolePrivileges(final AuthorPlan plan) 
throws AuthException {
+    return authorPlanExecutor.executeListRolePrivileges(plan);
+  }
+
+  public PermissionInfoResp executeListUserPrivileges(final AuthorPlan plan) 
throws AuthException {
+    return authorPlanExecutor.executeListUserPrivileges(plan);
+  }
+
+  public TAuthizedPatternTreeResp generateAuthorizedPTree(String username, int 
permission)
+      throws AuthException {
+    return authorPlanExecutor.generateAuthorizedPTree(username, permission);
+  }
+
+  public TPermissionInfoResp checkRoleOfUser(String username, String roleName)
+      throws AuthException {
+    return authorPlanExecutor.checkRoleOfUser(username, roleName);
+  }
+
+  public TPermissionInfoResp getUser(String username) throws AuthException {
+    return authorPlanExecutor.getUser(username);
+  }
+
+  public String getUserName(long userId) throws AuthException {
+    return authorPlanExecutor.getUserName(userId);
+  }
+
+  @Override
+  public boolean processTakeSnapshot(File snapshotDir) throws TException, 
IOException {
+    return authorizer.processTakeSnapshot(snapshotDir);
+  }
+
+  @Override
+  public void processLoadSnapshot(File snapshotDir) throws TException, 
IOException {
+    authorizer.processLoadSnapshot(snapshotDir);
+  }
+
+  /**
+   * Save the user's permission information,Bring back the DataNode for caching
+   *
+   * @param username The username of the user that needs to be cached
+   */
+  public TPermissionInfoResp getUserPermissionInfo(String username, ModelType 
type)
+      throws AuthException {
+    return authorPlanExecutor.getUserPermissionInfo(username, type);
+  }
+
+  @TestOnly
+  public void clear() throws AuthException {
+    File userFolder = new File(COMMON_CONFIG.getUserFolder());
+    if (userFolder.exists()) {
+      FileUtils.deleteFileOrDirectory(userFolder);
+    }
+    File roleFolder = new File(COMMON_CONFIG.getRoleFolder());
+    if (roleFolder.exists()) {
+      FileUtils.deleteFileOrDirectory(roleFolder);
+    }
+    authorizer.reset();
+  }
+}
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/AuthorInfo.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorPlanExecutor.java
similarity index 92%
rename from 
iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/AuthorInfo.java
rename to 
iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorPlanExecutor.java
index efcbd894360..5f1024f881d 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/AuthorInfo.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorPlanExecutor.java
@@ -17,11 +17,10 @@
  * under the License.
  */
 
-package org.apache.iotdb.confignode.persistence;
+package org.apache.iotdb.confignode.persistence.auth;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.auth.AuthException;
-import org.apache.iotdb.commons.auth.authorizer.BasicAuthorizer;
 import org.apache.iotdb.commons.auth.authorizer.IAuthorizer;
 import org.apache.iotdb.commons.auth.authorizer.OpenIdAuthorizer;
 import org.apache.iotdb.commons.auth.entity.ModelType;
@@ -30,21 +29,15 @@ import org.apache.iotdb.commons.auth.entity.PrivilegeType;
 import org.apache.iotdb.commons.auth.entity.PrivilegeUnion;
 import org.apache.iotdb.commons.auth.entity.Role;
 import org.apache.iotdb.commons.auth.entity.User;
-import org.apache.iotdb.commons.conf.CommonConfig;
-import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.PathPatternTree;
 import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant;
-import org.apache.iotdb.commons.snapshot.SnapshotProcessor;
 import org.apache.iotdb.commons.utils.AuthUtils;
-import org.apache.iotdb.commons.utils.FileUtils;
-import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanType;
 import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.auth.AuthorRelationalPlan;
 import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorTreePlan;
 import org.apache.iotdb.confignode.consensus.response.auth.PermissionInfoResp;
-import org.apache.iotdb.confignode.manager.ConfigManager;
 import org.apache.iotdb.confignode.rpc.thrift.TAuthizedPatternTreeResp;
 import org.apache.iotdb.confignode.rpc.thrift.TListUserInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TPermissionInfoResp;
@@ -53,13 +46,11 @@ import org.apache.iotdb.confignode.rpc.thrift.TUserResp;
 import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 
-import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.ByteArrayOutputStream;
 import java.io.DataOutputStream;
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -72,24 +63,15 @@ import java.util.Map;
 import java.util.Set;
 
 import static 
org.apache.iotdb.commons.auth.utils.AuthUtils.constructAuthorityScope;
+import static 
org.apache.iotdb.confignode.persistence.auth.AuthorInfo.NO_USER_MSG;
 
-public class AuthorInfo implements SnapshotProcessor {
+public class AuthorPlanExecutor implements IAuthorPlanExecutor {
 
-  // Works at config node.
-  private static final Logger LOGGER = 
LoggerFactory.getLogger(AuthorInfo.class);
-  private static final CommonConfig COMMON_CONFIG = 
CommonDescriptor.getInstance().getConfig();
-  private static final String NO_USER_MSG = "No such user : ";
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(AuthorPlanExecutor.class);
+  private final IAuthorizer authorizer;
 
-  private IAuthorizer authorizer;
-  private ConfigManager configManager;
-
-  public AuthorInfo(ConfigManager configManager) {
-    try {
-      authorizer = BasicAuthorizer.getInstance();
-      this.configManager = configManager;
-    } catch (AuthException e) {
-      LOGGER.error("get user or role permissionInfo failed because ", e);
-    }
+  public AuthorPlanExecutor(IAuthorizer authorizer) {
+    this.authorizer = authorizer;
   }
 
   public TPermissionInfoResp login(String username, String password) {
@@ -130,58 +112,7 @@ public class AuthorInfo implements SnapshotProcessor {
     return authorizer.login4Pipe(username, password);
   }
 
-  public TPermissionInfoResp checkUserPrivileges(String username, 
PrivilegeUnion union) {
-    boolean status;
-    TPermissionInfoResp result = new TPermissionInfoResp();
-    List<Integer> failedList = new ArrayList<>();
-    try {
-      if (union.getModelType() == PrivilegeModelType.TREE) {
-        List<? extends PartialPath> list = union.getPaths();
-        int pos = 0;
-        for (PartialPath path : list) {
-          if (!authorizer.checkUserPrivileges(
-              username,
-              new PrivilegeUnion(path, union.getPrivilegeType(), 
union.isGrantOption()))) {
-            failedList.add(pos);
-          }
-          pos++;
-        }
-        if (union.isGrantOption()) {
-          // all path should have grant option.
-          status = failedList.isEmpty();
-        } else {
-          status = failedList.size() != list.size();
-        }
-      } else {
-        status = authorizer.checkUserPrivileges(username, union);
-      }
-    } catch (AuthException e) {
-      status = false;
-    }
-
-    try {
-      result = getUserPermissionInfo(username, ModelType.ALL);
-      result.setFailPos(failedList);
-      if (status) {
-        result.setStatus(RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS));
-      } else {
-        result.setStatus(RpcUtils.getStatus(TSStatusCode.NO_PERMISSION));
-      }
-    } catch (AuthException e) {
-      result.setStatus(RpcUtils.getStatus(e.getCode(), e.getMessage()));
-    }
-    return result;
-  }
-
-  public TSStatus authorNonQuery(AuthorPlan authorPlan) {
-    if (authorPlan instanceof AuthorTreePlan) {
-      return authorNonQuery((AuthorTreePlan) authorPlan);
-    } else {
-      return authorNonQuery((AuthorRelationalPlan) authorPlan);
-    }
-  }
-
-  public TSStatus authorNonQuery(AuthorTreePlan authorPlan) {
+  public TSStatus executeAuthorNonQuery(AuthorTreePlan authorPlan) {
     ConfigPhysicalPlanType authorType = authorPlan.getAuthorType();
     String userName = authorPlan.getUserName();
     String roleName = authorPlan.getRoleName();
@@ -277,7 +208,7 @@ public class AuthorInfo implements SnapshotProcessor {
     return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
   }
 
-  public TSStatus authorNonQuery(AuthorRelationalPlan authorPlan) {
+  public TSStatus executeRelationalAuthorNonQuery(AuthorRelationalPlan 
authorPlan) {
     ConfigPhysicalPlanType authorType = authorPlan.getAuthorType();
     String userName = authorPlan.getUserName();
     String roleName = authorPlan.getRoleName();
@@ -623,6 +554,77 @@ public class AuthorInfo implements SnapshotProcessor {
     return result;
   }
 
+  /**
+   * Save the user's permission information,Bring back the DataNode for caching
+   *
+   * @param username The username of the user that needs to be cached
+   */
+  public TPermissionInfoResp getUserPermissionInfo(String username, ModelType 
type)
+      throws AuthException {
+    TPermissionInfoResp result = new TPermissionInfoResp();
+    User user = authorizer.getUser(username);
+    if (user == null) {
+      return AuthUtils.generateEmptyPermissionInfoResp();
+    }
+    TUserResp tUserResp = user.getUserInfo(type);
+    // Permission information for roles owned by users
+    if (!user.getRoleSet().isEmpty()) {
+      for (String roleName : user.getRoleSet()) {
+        Role role = authorizer.getRole(roleName);
+        TRoleResp roleResp = role.getRoleInfo(type);
+        result.putToRoleInfo(roleName, roleResp);
+      }
+    } else {
+      result.setRoleInfo(new HashMap<>());
+    }
+    result.setUserInfo(tUserResp);
+    result.setStatus(new 
TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()));
+    return result;
+  }
+
+  public TPermissionInfoResp checkUserPrivileges(String username, 
PrivilegeUnion union) {
+    boolean status;
+    TPermissionInfoResp result = new TPermissionInfoResp();
+    List<Integer> failedList = new ArrayList<>();
+    try {
+      if (union.getModelType() == PrivilegeModelType.TREE) {
+        List<? extends PartialPath> list = union.getPaths();
+        int pos = 0;
+        for (PartialPath path : list) {
+          if (!authorizer.checkUserPrivileges(
+              username,
+              new PrivilegeUnion(path, union.getPrivilegeType(), 
union.isGrantOption()))) {
+            failedList.add(pos);
+          }
+          pos++;
+        }
+        if (union.isGrantOption()) {
+          // all path should have grant option.
+          status = failedList.isEmpty();
+        } else {
+          status = failedList.size() != list.size();
+        }
+      } else {
+        status = authorizer.checkUserPrivileges(username, union);
+      }
+    } catch (AuthException e) {
+      status = false;
+    }
+
+    try {
+      result = getUserPermissionInfo(username, ModelType.ALL);
+      result.setFailPos(failedList);
+      if (status) {
+        result.setStatus(RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS));
+      } else {
+        result.setStatus(RpcUtils.getStatus(TSStatusCode.NO_PERMISSION));
+      }
+    } catch (AuthException e) {
+      result.setStatus(RpcUtils.getStatus(e.getCode(), e.getMessage()));
+    }
+    return result;
+  }
+
   public TAuthizedPatternTreeResp generateAuthorizedPTree(String username, int 
permission)
       throws AuthException {
     TAuthizedPatternTreeResp resp = new TAuthizedPatternTreeResp();
@@ -695,55 +697,4 @@ public class AuthorInfo implements SnapshotProcessor {
   public String getUserName(long userId) throws AuthException {
     return authorizer.getUser(userId).getName();
   }
-
-  @Override
-  public boolean processTakeSnapshot(File snapshotDir) throws TException, 
IOException {
-    return authorizer.processTakeSnapshot(snapshotDir);
-  }
-
-  @Override
-  public void processLoadSnapshot(File snapshotDir) throws TException, 
IOException {
-    authorizer.processLoadSnapshot(snapshotDir);
-  }
-
-  @TestOnly
-  public void clear() throws AuthException {
-    File userFolder = new File(COMMON_CONFIG.getUserFolder());
-    if (userFolder.exists()) {
-      FileUtils.deleteFileOrDirectory(userFolder);
-    }
-    File roleFolder = new File(COMMON_CONFIG.getRoleFolder());
-    if (roleFolder.exists()) {
-      FileUtils.deleteFileOrDirectory(roleFolder);
-    }
-    authorizer.reset();
-  }
-
-  /**
-   * Save the user's permission information,Bring back the DataNode for caching
-   *
-   * @param username The username of the user that needs to be cached
-   */
-  public TPermissionInfoResp getUserPermissionInfo(String username, ModelType 
type)
-      throws AuthException {
-    TPermissionInfoResp result = new TPermissionInfoResp();
-    User user = authorizer.getUser(username);
-    if (user == null) {
-      return AuthUtils.generateEmptyPermissionInfoResp();
-    }
-    TUserResp tUserResp = user.getUserInfo(type);
-    // Permission information for roles owned by users
-    if (!user.getRoleSet().isEmpty()) {
-      for (String roleName : user.getRoleSet()) {
-        Role role = authorizer.getRole(roleName);
-        TRoleResp roleResp = role.getRoleInfo(type);
-        result.putToRoleInfo(roleName, roleResp);
-      }
-    } else {
-      result.setRoleInfo(new HashMap<>());
-    }
-    result.setUserInfo(tUserResp);
-    result.setStatus(new 
TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()));
-    return result;
-  }
 }
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/IAuthorPlanExecutor.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/IAuthorPlanExecutor.java
new file mode 100644
index 00000000000..9f93dba165b
--- /dev/null
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/IAuthorPlanExecutor.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.confignode.persistence.auth;
+
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.auth.AuthException;
+import org.apache.iotdb.commons.auth.entity.ModelType;
+import org.apache.iotdb.commons.auth.entity.PrivilegeUnion;
+import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorPlan;
+import 
org.apache.iotdb.confignode.consensus.request.write.auth.AuthorRelationalPlan;
+import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorTreePlan;
+import org.apache.iotdb.confignode.consensus.response.auth.PermissionInfoResp;
+import org.apache.iotdb.confignode.rpc.thrift.TAuthizedPatternTreeResp;
+import org.apache.iotdb.confignode.rpc.thrift.TPermissionInfoResp;
+
+public interface IAuthorPlanExecutor {
+  TPermissionInfoResp login(String username, String password);
+
+  String login4Pipe(final String username, final String password);
+
+  TSStatus executeAuthorNonQuery(AuthorTreePlan authorPlan);
+
+  TSStatus executeRelationalAuthorNonQuery(AuthorRelationalPlan authorPlan);
+
+  PermissionInfoResp executeListUsers(final AuthorPlan plan) throws 
AuthException;
+
+  PermissionInfoResp executeListRoles(final AuthorPlan plan) throws 
AuthException;
+
+  PermissionInfoResp executeListRolePrivileges(final AuthorPlan plan) throws 
AuthException;
+
+  PermissionInfoResp executeListUserPrivileges(final AuthorPlan plan) throws 
AuthException;
+
+  TPermissionInfoResp getUserPermissionInfo(String username, ModelType type) 
throws AuthException;
+
+  TPermissionInfoResp checkUserPrivileges(String username, PrivilegeUnion 
union);
+
+  TAuthizedPatternTreeResp generateAuthorizedPTree(String username, int 
permission)
+      throws AuthException;
+
+  TPermissionInfoResp checkRoleOfUser(String username, String roleName) throws 
AuthException;
+
+  TPermissionInfoResp getUser(String username) throws AuthException;
+
+  String getUserName(long userId) throws AuthException;
+}
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
index 93d65386f54..fb8005bedcc 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
@@ -149,13 +149,13 @@ import 
org.apache.iotdb.confignode.consensus.request.write.trigger.UpdateTrigger
 import 
org.apache.iotdb.confignode.consensus.response.partition.SchemaNodeManagementResp;
 import 
org.apache.iotdb.confignode.exception.physical.UnknownPhysicalPlanTypeException;
 import org.apache.iotdb.confignode.manager.pipe.agent.PipeConfigNodeAgent;
-import org.apache.iotdb.confignode.persistence.AuthorInfo;
 import org.apache.iotdb.confignode.persistence.ClusterInfo;
 import org.apache.iotdb.confignode.persistence.ModelInfo;
 import org.apache.iotdb.confignode.persistence.ProcedureInfo;
 import org.apache.iotdb.confignode.persistence.TTLInfo;
 import org.apache.iotdb.confignode.persistence.TriggerInfo;
 import org.apache.iotdb.confignode.persistence.UDFInfo;
+import org.apache.iotdb.confignode.persistence.auth.AuthorInfo;
 import org.apache.iotdb.confignode.persistence.cq.CQInfo;
 import org.apache.iotdb.confignode.persistence.node.NodeInfo;
 import org.apache.iotdb.confignode.persistence.partition.PartitionInfo;
diff --git 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/AuthorInfoTest.java
 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/AuthorInfoTest.java
index 63480bf7dff..fcb25d2f45f 100644
--- 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/AuthorInfoTest.java
+++ 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/AuthorInfoTest.java
@@ -33,6 +33,7 @@ import 
org.apache.iotdb.confignode.consensus.request.write.auth.AuthorPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.auth.AuthorRelationalPlan;
 import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorTreePlan;
 import org.apache.iotdb.confignode.consensus.response.auth.PermissionInfoResp;
+import org.apache.iotdb.confignode.persistence.auth.AuthorInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TPermissionInfoResp;
 import org.apache.iotdb.rpc.TSStatusCode;
 
@@ -67,7 +68,7 @@ public class AuthorInfoTest {
 
   @BeforeClass
   public static void setup() {
-    authorInfo = new AuthorInfo(null);
+    authorInfo = new AuthorInfo();
     if (!snapshotDir.exists()) {
       snapshotDir.mkdirs();
     }
diff --git 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/CNPhysicalPlanGeneratorTest.java
 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/CNPhysicalPlanGeneratorTest.java
index 19622c80906..f65bf6441e5 100644
--- 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/CNPhysicalPlanGeneratorTest.java
+++ 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/CNPhysicalPlanGeneratorTest.java
@@ -34,6 +34,7 @@ import 
org.apache.iotdb.confignode.consensus.request.write.database.SetTTLPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.template.CommitSetSchemaTemplatePlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.template.CreateSchemaTemplatePlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.template.PreSetSchemaTemplatePlan;
+import org.apache.iotdb.confignode.persistence.auth.AuthorInfo;
 import org.apache.iotdb.confignode.persistence.schema.CNPhysicalPlanGenerator;
 import org.apache.iotdb.confignode.persistence.schema.CNSnapshotFileType;
 import org.apache.iotdb.confignode.persistence.schema.ClusterSchemaInfo;
@@ -76,7 +77,7 @@ public class CNPhysicalPlanGeneratorTest {
   private static final String TEMPLATE_INFO_FILE_NAME = "template_info.bin";
 
   private static void setupAuthorInfo() {
-    authorInfo = new AuthorInfo(null);
+    authorInfo = new AuthorInfo();
     if (!snapshotDir.exists()) {
       snapshotDir.mkdir();
     }
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 8a4a5ab43d8..df9fd988933 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
@@ -40,6 +40,7 @@ import 
org.apache.iotdb.db.pipe.source.dataregion.realtime.listener.PipeInsertio
 import org.apache.iotdb.db.protocol.session.IClientSession;
 import org.apache.iotdb.db.queryengine.common.header.DatasetHeader;
 import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
+import org.apache.iotdb.db.queryengine.plan.relational.security.AccessControl;
 import 
org.apache.iotdb.db.queryengine.plan.relational.security.AccessControlImpl;
 import 
org.apache.iotdb.db.queryengine.plan.relational.security.ITableAuthCheckerImpl;
 import 
org.apache.iotdb.db.queryengine.plan.relational.security.TreeAccessCheckVisitor;
@@ -97,18 +98,18 @@ public class AuthorityChecker {
   private static final PerformanceOverviewMetrics PERFORMANCE_OVERVIEW_METRICS 
=
       PerformanceOverviewMetrics.getInstance();
 
-  private static AccessControlImpl accessControl =
+  private static AccessControl accessControl =
       new AccessControlImpl(new ITableAuthCheckerImpl(), new 
TreeAccessCheckVisitor());
 
   private AuthorityChecker() {
     // empty constructor
   }
 
-  public static AccessControlImpl getAccessControl() {
+  public static AccessControl getAccessControl() {
     return accessControl;
   }
 
-  public static void setAccessControl(AccessControlImpl accessControl) {
+  public static void setAccessControl(AccessControl accessControl) {
     AuthorityChecker.accessControl = accessControl;
   }
 

Reply via email to