Skip to content

Commit bfc7056

Browse files
In IoTDB, users are prohibited from creating a database with the name __audit. (#17634)
1 parent 487b7cd commit bfc7056

5 files changed

Lines changed: 43 additions & 2 deletions

File tree

integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBTemplateAuthIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void manageDataBaseTest() {
8383
assertNonQueryTestFail(
8484
adminStmt,
8585
"create database root.__audit",
86-
"803: The database 'root.__audit' is read-only");
86+
"803: The database name \"root.__audit\" is reserved, please use another valid database name.");
8787

8888
assertNonQueryTestFail(
8989
adminStmt,

integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBAuthenticationTableIT.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@ public void testInsert() throws IoTDBConnectionException, StatementExecutionExce
101101
sessionRoot.executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS __audit");
102102
fail("Should have thrown an exception");
103103
} catch (StatementExecutionException e) {
104-
assertEquals("803: Access Denied: The database '__audit' is read-only.", e.getMessage());
104+
assertEquals(
105+
"803: Access Denied: The database name \"__audit\" is reserved, please use another valid database name.",
106+
e.getMessage());
105107
}
106108

107109
sessionRoot.executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS \"汉化\"");

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControlImpl.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848

4949
import static org.apache.iotdb.commons.schema.table.Audit.TABLE_MODEL_AUDIT_DATABASE;
5050
import static org.apache.iotdb.commons.schema.table.Audit.TREE_MODEL_AUDIT_DATABASE;
51+
import static org.apache.iotdb.commons.schema.table.Audit.getReservedDatabaseNameErrorMsg;
5152
import static org.apache.iotdb.commons.schema.table.Audit.includeByAuditTreeDB;
5253
import static org.apache.iotdb.db.auth.AuthorityChecker.ONLY_ADMIN_ALLOWED;
5354
import static org.apache.iotdb.db.auth.AuthorityChecker.SUCCEED;
@@ -77,6 +78,18 @@ private void checkAuditDatabase(String databaseName) {
7778
@Override
7879
public void checkCanCreateDatabase(
7980
String userName, String databaseName, IAuditEntity auditEntity) {
81+
if (!AuthorityChecker.INTERNAL_AUDIT_USER.equals(userName)
82+
&& TABLE_MODEL_AUDIT_DATABASE.equalsIgnoreCase(databaseName)) {
83+
DNAuditLogger.getInstance()
84+
.recordObjectAuthenticationAuditLog(
85+
auditEntity
86+
.setAuditLogOperation(AuditLogOperation.DDL)
87+
.setDatabase(databaseName)
88+
.setPrivilegeType(PrivilegeType.CREATE)
89+
.setResult(false),
90+
() -> databaseName);
91+
throw new AccessDeniedException(getReservedDatabaseNameErrorMsg(TABLE_MODEL_AUDIT_DATABASE));
92+
}
8093
InformationSchemaUtils.checkDBNameInWrite(databaseName);
8194
authChecker.checkDatabasePrivilege(
8295
userName, databaseName, TableModelPrivilege.CREATE, auditEntity.setDatabase(databaseName));

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,9 @@
181181

182182
import static org.apache.iotdb.commons.schema.table.Audit.TREE_MODEL_AUDIT_DATABASE;
183183
import static org.apache.iotdb.commons.schema.table.Audit.TREE_MODEL_AUDIT_DATABASE_PATH;
184+
import static org.apache.iotdb.commons.schema.table.Audit.getReservedDatabaseNameErrorMsg;
184185
import static org.apache.iotdb.commons.schema.table.Audit.includeByAuditTreeDB;
186+
import static org.apache.iotdb.commons.schema.table.Audit.isAuditTreeDatabase;
185187
import static org.apache.iotdb.db.auth.AuthorityChecker.SUCCEED;
186188
import static org.apache.iotdb.db.auth.AuthorityChecker.getAuthorizedPathTree;
187189
import static org.apache.iotdb.db.queryengine.plan.relational.security.AccessControlImpl.READ_ONLY_DB_ERROR_MSG;
@@ -985,6 +987,17 @@ public TSStatus visitShowExternalService(
985987
@Override
986988
public TSStatus visitSetDatabase(
987989
DatabaseSchemaStatement statement, TreeAccessCheckContext context) {
990+
if (!AuthorityChecker.INTERNAL_AUDIT_USER.equals(context.getUsername())
991+
&& isAuditTreeDatabase(statement.getDatabasePath())) {
992+
context
993+
.setDatabase(statement.getDatabasePath().getFullPath())
994+
.setPrivilegeType(PrivilegeType.MANAGE_DATABASE)
995+
.setAuditLogOperation(AuditLogOperation.DDL);
996+
AUDIT_LOGGER.recordObjectAuthenticationAuditLog(
997+
context.setResult(false), statement.getDatabasePath()::getFullPath);
998+
return new TSStatus(TSStatusCode.NO_PERMISSION.getStatusCode())
999+
.setMessage(getReservedDatabaseNameErrorMsg(TREE_MODEL_AUDIT_DATABASE));
1000+
}
9881001
return checkCreateOrAlterDatabasePermission(
9891002
context.setAuditLogOperation(AuditLogOperation.DDL), statement.getDatabasePath());
9901003
}

iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/Audit.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ public class Audit {
2828
public static final String TABLE_MODEL_AUDIT_DATABASE = "__audit";
2929
public static final String TREE_MODEL_AUDIT_DATABASE =
3030
String.format("%s.%s", ROOT, TABLE_MODEL_AUDIT_DATABASE);
31+
public static final String RESERVED_DATABASE_NAME_ERROR_MSG =
32+
"The database name \"%s\" is reserved, please use another valid database name.";
3133
public static final PartialPath TREE_MODEL_AUDIT_DATABASE_PATH =
3234
new PartialPath(new String[] {"root", TABLE_MODEL_AUDIT_DATABASE});
3335
public static final PartialPath TREE_MODEL_AUDIT_DATABASE_PATH_PATTERN =
@@ -42,4 +44,15 @@ public static boolean includeByAuditTreeDB(PartialPath prefixPath) {
4244
String[] nodes = prefixPath.getNodes();
4345
return nodes.length >= 2 && TABLE_MODEL_AUDIT_DATABASE.equalsIgnoreCase(nodes[1]);
4446
}
47+
48+
public static boolean isAuditTreeDatabase(PartialPath databasePath) {
49+
String[] nodes = databasePath.getNodes();
50+
return nodes.length == 2
51+
&& ROOT.equalsIgnoreCase(nodes[0])
52+
&& TABLE_MODEL_AUDIT_DATABASE.equalsIgnoreCase(nodes[1]);
53+
}
54+
55+
public static String getReservedDatabaseNameErrorMsg(String databaseName) {
56+
return String.format(RESERVED_DATABASE_NAME_ERROR_MSG, databaseName);
57+
}
4558
}

0 commit comments

Comments
 (0)