From d3d0a5c1932612a733b1ac0a3911c162d57f46e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Sat, 17 Mar 2012 00:56:35 +0800 Subject: [PATCH] refactor --- .../alibaba/druid/filter/wall/WallConfig.java | 25 +++++ .../filter/wall/spi/MySqlWallProvider.java | 22 +---- .../filter/wall/spi/MySqlWallVisitor.java | 39 +++++++- .../filter/wall/spi/OracleWallProvider.java | 21 +---- .../filter/wall/spi/OracleWallVisitor.java | 91 ++++++++++++++----- 5 files changed, 133 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/alibaba/druid/filter/wall/WallConfig.java b/src/main/java/com/alibaba/druid/filter/wall/WallConfig.java index c639e00c52..5467318296 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/WallConfig.java +++ b/src/main/java/com/alibaba/druid/filter/wall/WallConfig.java @@ -1,5 +1,7 @@ package com.alibaba.druid.filter.wall; +import static com.alibaba.druid.filter.wall.spi.WallVisitorUtils.loadResource; + import java.util.HashSet; import java.util.Set; @@ -24,6 +26,29 @@ public class WallConfig { protected final Set permitNames = new HashSet(); protected final Set permitObjects = new HashSet(); + public void loadDefault(String dir) { + if (dir.endsWith("/")) { + dir = dir.substring(0, dir.length() - 1); + } + loadResource(getPermitNames(), dir + "/permit-name-default.txt"); + loadResource(getPermitSchemas(), dir + "/permit-schema-default.txt"); + loadResource(getPermitFunctions(), dir + "/permit-function-default.txt"); + loadResource(getPermitTables(), dir + "/permit-table-default.txt"); + loadResource(getPermitObjects(), dir + "/permit-object-default.txt"); + } + + public void loadExtend(String dir) { + if (dir.endsWith("/")) { + dir = dir.substring(0, dir.length() - 1); + } + + loadResource(getPermitNames(), dir + "permit-name.txt"); + loadResource(getPermitSchemas(), dir + "permit-schema.txt"); + loadResource(getPermitFunctions(), dir + "permit-function.txt"); + loadResource(getPermitTables(), dir + "permit-table.txt"); + loadResource(getPermitObjects(), dir + "permit-object.txt"); + } + public boolean isSelelctAllow() { return selelctAllow; } diff --git a/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallProvider.java b/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallProvider.java index e00e80bef3..cb6f297f91 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallProvider.java +++ b/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallProvider.java @@ -1,7 +1,5 @@ package com.alibaba.druid.filter.wall.spi; -import static com.alibaba.druid.filter.wall.spi.WallVisitorUtils.loadResource; - import com.alibaba.druid.filter.wall.WallConfig; import com.alibaba.druid.filter.wall.WallProvider; import com.alibaba.druid.filter.wall.WallVisitor; @@ -22,30 +20,14 @@ public class MySqlWallProvider extends WallProvider { super(config); if (loadDefault) { - loadDefault(); + config.loadDefault("META-INF/druid/wall/mysql"); } if (loadExtend) { - loadExtend(); + config.loadExtend("META-INF/druid/wall/mysql"); } } - public void loadExtend() { - loadResource(config.getPermitNames(), "META-INF/druid/wall/mysql/permit-name.txt"); - loadResource(config.getPermitSchemas(), "META-INF/druid/wall/mysql/permit-schema.txt"); - loadResource(config.getPermitFunctions(), "META-INF/druid/wall/mysql/permit-function.txt"); - loadResource(config.getPermitTables(), "META-INF/druid/wall/mysql/permit-table.txt"); - loadResource(config.getPermitObjects(), "META-INF/druid/wall/mysql/permit-object.txt"); - } - - public void loadDefault() { - loadResource(config.getPermitNames(), "META-INF/druid/wall/mysql/permit-name-default.txt"); - loadResource(config.getPermitSchemas(), "META-INF/druid/wall/mysql/permit-schema-default.txt"); - loadResource(config.getPermitFunctions(), "META-INF/druid/wall/mysql/permit-function-default.txt"); - loadResource(config.getPermitTables(), "META-INF/druid/wall/mysql/permit-table-default.txt"); - loadResource(config.getPermitObjects(), "META-INF/druid/wall/mysql/permit-object-default.txt"); - } - @Override public SQLStatementParser createParser(String sql) { return new MySqlStatementParser(sql); diff --git a/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallVisitor.java b/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallVisitor.java index d655fb0e7c..d849ed3cea 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallVisitor.java +++ b/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallVisitor.java @@ -26,6 +26,7 @@ import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectGroupBy; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; @@ -88,22 +89,56 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi @Override public boolean visit(MySqlDeleteStatement x) { - WallVisitorUtils.checkCondition(this, x.getWhere()); - return true; + return visit((SQLDeleteStatement) x); } @Override public boolean visit(SQLDeleteStatement x) { + if (!config.isDeleteAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + WallVisitorUtils.checkCondition(this, x.getWhere()); return true; } @Override public boolean visit(SQLUpdateStatement x) { + if (!config.isUpdateAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + WallVisitorUtils.checkCondition(this, x.getWhere()); return true; } + @Override + public boolean visit(MySqlInsertStatement x) { + return visit((SQLInsertStatement) x); + } + + @Override + public boolean visit(SQLInsertStatement x) { + if (!config.isInsertAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + return true; + } + + @Override + public boolean visit(SQLSelectStatement x) { + if (!config.isSelelctAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + return true; + } + @Override public boolean visit(Limit x) { if (x.getRowCount() instanceof SQLNumericLiteralExpr) { diff --git a/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallProvider.java b/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallProvider.java index 0e64de19dd..b71cf60aff 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallProvider.java +++ b/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallProvider.java @@ -1,7 +1,5 @@ package com.alibaba.druid.filter.wall.spi; -import static com.alibaba.druid.filter.wall.spi.WallVisitorUtils.loadResource; - import com.alibaba.druid.filter.wall.WallConfig; import com.alibaba.druid.filter.wall.WallProvider; import com.alibaba.druid.filter.wall.WallVisitor; @@ -22,29 +20,14 @@ public class OracleWallProvider extends WallProvider { super(config); if (loadDefault) { - loadDefault(); + config.loadDefault("META-INF/druid/wall/oracle"); } if (loadExtend) { - loadExtend(); + config.loadExtend("META-INF/druid/wall/oracle"); } } - public void loadExtend() { - loadResource(config.getPermitNames(), "META-INF/druid/wall/oracle/permit-name.txt"); - loadResource(config.getPermitSchemas(), "META-INF/druid/wall/oracle/permit-schema.txt"); - loadResource(config.getPermitFunctions(), "META-INF/druid/wall/oracle/permit-function.txt"); - loadResource(config.getPermitTables(), "META-INF/druid/wall/oracle/permit-table.txt"); - loadResource(config.getPermitObjects(), "META-INF/druid/wall/oracle/permit-object.txt"); - } - - public void loadDefault() { - loadResource(config.getPermitNames(), "META-INF/druid/wall/oracle/permit-name-default.txt"); - loadResource(config.getPermitSchemas(), "META-INF/druid/wall/oracle/permit-schema-default.txt"); - loadResource(config.getPermitFunctions(), "META-INF/druid/wall/oracle/permit-function-default.txt"); - loadResource(config.getPermitTables(), "META-INF/druid/wall/oracle/permit-table-default.txt"); - loadResource(config.getPermitObjects(), "META-INF/druid/wall/oracle/permit-object-default.txt"); - } @Override public SQLStatementParser createParser(String sql) { diff --git a/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallVisitor.java b/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallVisitor.java index 79ab9c6c8a..18ded5ae2f 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallVisitor.java +++ b/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallVisitor.java @@ -25,6 +25,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; 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.OracleSelectQueryBlock; @@ -119,30 +120,6 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi return true; } - @Override - public boolean visit(OracleDeleteStatement x) { - WallVisitorUtils.checkCondition(this, x.getWhere()); - return true; - } - - @Override - public boolean visit(SQLDeleteStatement x) { - WallVisitorUtils.checkCondition(this, x.getWhere()); - return true; - } - - @Override - public boolean visit(SQLUpdateStatement x) { - WallVisitorUtils.checkCondition(this, x.getWhere()); - return true; - } - - @Override - public boolean visit(OracleUpdateStatement x) { - WallVisitorUtils.checkCondition(this, x.getWhere()); - return true; - } - @Override public String toSQL(SQLObject obj) { return SQLUtils.toOracleString(obj); @@ -182,4 +159,70 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi return config.getPermitObjects().contains(name); } + @Override + public boolean visit(SQLSelectStatement x) { + if (!config.isSelelctAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + return true; + } + + @Override + public boolean visit(OracleInsertStatement x) { + return visit((SQLInsertStatement) x); + } + + @Override + public boolean visit(SQLInsertStatement x) { + if (!config.isInsertAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + return true; + } + + @Override + public boolean visit(OracleMultiInsertStatement x) { + if (!config.isInsertAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + return true; + } + + @Override + public boolean visit(OracleDeleteStatement x) { + return visit((SQLDeleteStatement) x); + } + + @Override + public boolean visit(SQLDeleteStatement x) { + if (!config.isDeleteAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + WallVisitorUtils.checkCondition(this, x.getWhere()); + return true; + } + + @Override + public boolean visit(OracleUpdateStatement x) { + return visit((SQLUpdateStatement) x); + } + + @Override + public boolean visit(SQLUpdateStatement x) { + if (!config.isUpdateAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + WallVisitorUtils.checkCondition(this, x.getWhere()); + return true; + } }