mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
support readonly table
This commit is contained in:
@@ -41,6 +41,8 @@ public class WallConfig {
|
||||
protected final Set<String> permitVariants = new HashSet<String>();
|
||||
protected final Set<String> permitObjects = new HashSet<String>();
|
||||
|
||||
protected final Set<String> readOnlyTables = new HashSet<String>();
|
||||
|
||||
private String dir;
|
||||
|
||||
private boolean inited;
|
||||
@@ -256,6 +258,10 @@ public class WallConfig {
|
||||
return permitObjects;
|
||||
}
|
||||
|
||||
public Set<String> getReadOnlyTables() {
|
||||
return readOnlyTables;
|
||||
}
|
||||
|
||||
public boolean isPermitObjects(String name) {
|
||||
if (!objectCheck) {
|
||||
return false;
|
||||
@@ -269,7 +275,7 @@ public class WallConfig {
|
||||
if (!schemaCheck) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
name = WallVisitorUtils.form(name);
|
||||
return this.permitSchemas.contains(name);
|
||||
}
|
||||
@@ -278,7 +284,7 @@ public class WallConfig {
|
||||
if (!functionCheck) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
name = WallVisitorUtils.form(name);
|
||||
return this.permitFunctions.contains(name);
|
||||
}
|
||||
|
||||
@@ -107,10 +107,7 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLInsertStatement x) {
|
||||
if (!config.isInsertAllow()) {
|
||||
this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x)));
|
||||
return false;
|
||||
}
|
||||
WallVisitorUtils.checkInsert(this, x);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement;
|
||||
@@ -155,7 +156,7 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
|
||||
} else if (x instanceof OracleMergeStatement) {
|
||||
} else if (x instanceof SQLTruncateStatement) {
|
||||
if (!config.isTruncateAllow()) {
|
||||
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
|
||||
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
|
||||
}
|
||||
} else {
|
||||
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
|
||||
@@ -179,13 +180,17 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLInsertStatement x) {
|
||||
if (!config.isInsertAllow()) {
|
||||
this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x)));
|
||||
return false;
|
||||
}
|
||||
WallVisitorUtils.checkInsert(this, x);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(InsertIntoClause x) {
|
||||
WallVisitorUtils.checkInsert(this, x);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleMultiInsertStatement x) {
|
||||
|
||||
@@ -29,6 +29,8 @@ import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLInsertInto;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelect;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
|
||||
@@ -56,7 +58,19 @@ public class WallVisitorUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkInsert(WallVisitor visitor, SQLInsertInto x) {
|
||||
checkReadOnly(visitor, x.getTableSource());
|
||||
|
||||
if (!visitor.getConfig().isInsertAllow()) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkSelelct(WallVisitor visitor, SQLSelectQueryBlock x) {
|
||||
if (x.getInto() != null) {
|
||||
checkReadOnly(visitor, x.getInto());
|
||||
}
|
||||
|
||||
if (!visitor.getConfig().isSelectIntoAllow() && x.getInto() != null) {
|
||||
addViolation(visitor, x);
|
||||
return;
|
||||
@@ -98,6 +112,8 @@ public class WallVisitorUtils {
|
||||
}
|
||||
|
||||
public static void checkDelete(WallVisitor visitor, SQLDeleteStatement x) {
|
||||
checkReadOnly(visitor, x.getTableSource());
|
||||
|
||||
if (!visitor.getConfig().isDeleteAllow()) {
|
||||
addViolation(visitor, x);
|
||||
return;
|
||||
@@ -112,7 +128,33 @@ public class WallVisitorUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkReadOnly(WallVisitor visitor, SQLTableSource tableSource) {
|
||||
if (tableSource instanceof SQLExprTableSource) {
|
||||
String tableName = null;
|
||||
SQLExpr tableNameExpr = ((SQLExprTableSource) tableSource).getExpr();
|
||||
if (tableNameExpr instanceof SQLIdentifierExpr) {
|
||||
tableName = tableNameExpr.toString();
|
||||
} else if (tableNameExpr instanceof SQLPropertyExpr) {
|
||||
tableName = ((SQLPropertyExpr) tableNameExpr).getName();
|
||||
}
|
||||
|
||||
if (tableName != null) {
|
||||
tableName = form(tableName);
|
||||
if (visitor.getConfig().getReadOnlyTables().contains(tableName)) {
|
||||
addViolation(visitor, tableSource);
|
||||
}
|
||||
}
|
||||
} else if (tableSource instanceof SQLJoinTableSource) {
|
||||
SQLJoinTableSource join = (SQLJoinTableSource) tableSource;
|
||||
|
||||
checkReadOnly(visitor, join.getLeft());
|
||||
checkReadOnly(visitor, join.getRight());
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkUpdate(WallVisitor visitor, SQLUpdateStatement x) {
|
||||
checkReadOnly(visitor, x.getTableSource());
|
||||
|
||||
if (!visitor.getConfig().isUpdateAllow()) {
|
||||
addViolation(visitor, x);
|
||||
return;
|
||||
@@ -455,7 +497,7 @@ public class WallVisitorUtils {
|
||||
if (!visitor.getConfig().isSelectUnionCheck()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (WallVisitorUtils.queryBlockFromIsNull(x.getLeft()) || WallVisitorUtils.queryBlockFromIsNull(x.getRight())) {
|
||||
addViolation(visitor, x);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user