From 20583a40f18397cc1fafeb989579e021dbfa0bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Fri, 16 Mar 2012 20:38:38 +0800 Subject: [PATCH] refactor --- .../alibaba/druid/filter/wall/WallFilter.java | 61 ++++++++----- .../druid/filter/wall/WallProvider.java | 31 ++++++- .../druid/filter/wall/WallVisitor.java | 13 +-- .../filter/wall/spi/MySqlWallProvider.java | 34 +++++++- .../filter/wall/spi/MySqlWallVisitor.java | 67 +++------------ .../filter/wall/spi/OracleWallProvider.java | 34 +++++++- .../filter/wall/spi/OracleWallVisitor.java | 86 +++---------------- .../filter/wall/spi/WallVisitorUtils.java | 4 +- 8 files changed, 161 insertions(+), 169 deletions(-) diff --git a/src/main/java/com/alibaba/druid/filter/wall/WallFilter.java b/src/main/java/com/alibaba/druid/filter/wall/WallFilter.java index 795927b3ec..ce54acf4c2 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/filter/wall/WallFilter.java @@ -3,12 +3,11 @@ package com.alibaba.druid.filter.wall; import java.sql.SQLException; import java.util.Properties; +import com.alibaba.druid.DruidRuntimeException; import com.alibaba.druid.filter.FilterAdapter; import com.alibaba.druid.filter.FilterChain; import com.alibaba.druid.filter.wall.spi.MySqlWallProvider; -import com.alibaba.druid.filter.wall.spi.MySqlWallVisitor; import com.alibaba.druid.filter.wall.spi.OracleWallProvider; -import com.alibaba.druid.filter.wall.spi.OracleWallVisitor; import com.alibaba.druid.proxy.jdbc.CallableStatementProxy; import com.alibaba.druid.proxy.jdbc.ConnectionProxy; import com.alibaba.druid.proxy.jdbc.DataSourceProxy; @@ -19,13 +18,45 @@ import com.alibaba.druid.util.JdbcUtils; public class WallFilter extends FilterAdapter { + private boolean inited = false; + private WallProvider provider; + private boolean loadDefault; + + private boolean loadExtend; + @Override public void init(DataSourceProxy dataSource) { this.dataSource = dataSource; provider = createWallProvider(dataSource.getDbType()); + + this.inited = true; + } + + public boolean isLoadDefault() { + return loadDefault; + } + + public void checkInit() { + if (inited) { + throw new DruidRuntimeException("wall filter is inited"); + } + } + + public void setLoadDefault(boolean loadDefault) { + checkInit(); + this.loadDefault = loadDefault; + } + + public boolean isLoadExtend() { + return loadExtend; + } + + public void setLoadExtend(boolean loadExtend) { + checkInit(); + this.loadExtend = loadExtend; } @Override @@ -100,9 +131,9 @@ public class WallFilter extends FilterAdapter { check(connection, sql); return chain.connection_prepareCall(connection, sql, resultSetType, resultSetConcurrency, resultSetHoldability); } - - //////////////// - + + // ////////////// + @Override public boolean statement_execute(FilterChain chain, StatementProxy statement, String sql) throws SQLException { check(statement.getConnectionProxy(), sql); @@ -129,7 +160,7 @@ public class WallFilter extends FilterAdapter { check(statement.getConnectionProxy(), sql); return chain.statement_execute(statement, sql, columnNames); } - + @Override public ResultSetProxy statement_executeQuery(FilterChain chain, StatementProxy statement, String sql) throws SQLException { @@ -170,26 +201,14 @@ public class WallFilter extends FilterAdapter { public WallProvider createWallProvider(String dbType) { if (JdbcUtils.MYSQL.equals(dbType)) { - return new MySqlWallProvider(); + return new MySqlWallProvider(this.loadDefault, this.loadExtend); } - + if (JdbcUtils.ORACLE.equals(dbType)) { - return new OracleWallProvider(); + return new OracleWallProvider(this.loadDefault, this.loadExtend); } throw new IllegalStateException("dbType not support : " + dbType); } - public WallVisitor createWallVisitor(String dbType) throws SQLException { - if (JdbcUtils.ORACLE.equals(dbType)) { - return new OracleWallVisitor(); - } - - if (JdbcUtils.MYSQL.equals(dbType)) { - return new MySqlWallVisitor(); - } - - throw new SQLException("dbType not support : " + dbType); - } - } diff --git a/src/main/java/com/alibaba/druid/filter/wall/WallProvider.java b/src/main/java/com/alibaba/druid/filter/wall/WallProvider.java index 0d883b4870..5d0ba36d41 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/filter/wall/WallProvider.java @@ -1,8 +1,10 @@ package com.alibaba.druid.filter.wall; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; +import java.util.Set; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.parser.NotAllowCommentException; @@ -18,7 +20,13 @@ public abstract class WallProvider { private int whileListMaxSize = 1024; - private int whiteSqlMaxLength = 1024; // 1k + private int whiteSqlMaxLength = 1024; // 1k + + protected final Set permitFunctions = new HashSet(); + protected final Set permitTables = new HashSet(); + protected final Set permitSchemas = new HashSet(); + protected final Set permitNames = new HashSet(); + protected final Set permitObjects = new HashSet(); public synchronized void addWhiteSql(String sql) { if (whiteList == null) { @@ -98,4 +106,25 @@ public abstract class WallProvider { return true; } + + public Set getPermitFunctions() { + return permitFunctions; + } + + public Set getPermitTables() { + return permitTables; + } + + public Set getPermitSchemas() { + return permitSchemas; + } + + public Set getPermitNames() { + return permitNames; + } + + public Set getPermitObjects() { + return permitObjects; + } + } diff --git a/src/main/java/com/alibaba/druid/filter/wall/WallVisitor.java b/src/main/java/com/alibaba/druid/filter/wall/WallVisitor.java index 5066f06534..6126578e04 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/WallVisitor.java +++ b/src/main/java/com/alibaba/druid/filter/wall/WallVisitor.java @@ -1,26 +1,19 @@ package com.alibaba.druid.filter.wall; import java.util.List; -import java.util.Set; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public interface WallVisitor extends SQLASTVisitor { + WallProvider getWallProvider(); + List getViolations(); - Set getPermitFunctions(); - - Set getPermitSchemas(); - - Set getPermitTables(); - boolean containsPermitTable(String name); - + boolean containsPermitObjects(String name); - Set getPermitNames(); - String toSQL(SQLObject obj); } 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 5b5b35cbe3..165a731727 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 @@ -5,9 +5,39 @@ import com.alibaba.druid.filter.wall.WallVisitor; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; import com.alibaba.druid.sql.parser.SQLStatementParser; - public class MySqlWallProvider extends WallProvider { + public MySqlWallProvider(){ + this(true, true); + } + + public MySqlWallProvider(boolean loadDefault, boolean loadExtend){ + if (loadDefault) { + loadDefault(); + } + + if (loadExtend) { + loadExtend(); + } + } + + public void loadExtend() { + WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-mysql.txt"); + WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-mysql.txt"); + WallVisitorUtils.loadResource(this.permitFunctions, "META-INF/druid-filter-wall-permit-function-mysql.txt"); + WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-mysql.txt"); + WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-mysql.txt"); + } + + public void loadDefault() { + WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-mysql-default.txt"); + WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-mysql-default.txt"); + WallVisitorUtils.loadResource(this.permitFunctions, + "META-INF/druid-filter-wall-permit-function-mysql-default.txt"); + WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-mysql-default.txt"); + WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-mysql-default.txt"); + } + @Override public SQLStatementParser createParser(String sql) { return new MySqlStatementParser(sql); @@ -15,7 +45,7 @@ public class MySqlWallProvider extends WallProvider { @Override public WallVisitor createWallVisitor() { - return new MySqlWallVisitor(); + return new MySqlWallVisitor(this); } } 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 8f07849349..e85b7b84dd 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 @@ -1,12 +1,11 @@ package com.alibaba.druid.filter.wall.spi; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; import com.alibaba.druid.filter.wall.IllegalSQLObjectViolation; import com.alibaba.druid.filter.wall.Violation; +import com.alibaba.druid.filter.wall.WallProvider; import com.alibaba.druid.filter.wall.WallVisitor; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLName; @@ -35,67 +34,20 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter; public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisitor, MySqlASTVisitor { - private final Set permitFunctions = new HashSet(); - private final Set permitTables = new HashSet(); - private final Set permitSchemas = new HashSet(); - private final Set permitNames = new HashSet(); - private final Set permitObjects = new HashSet(); + private final MySqlWallProvider provider; + private final List violations = new ArrayList(); - private final List violations; - - public MySqlWallVisitor(){ - this(new ArrayList(), true); + public MySqlWallVisitor(MySqlWallProvider provider){ + this.provider = provider; } - public MySqlWallVisitor(boolean loadDefault){ - this(new ArrayList(), loadDefault); - } - - public MySqlWallVisitor(List violations, boolean loadDefault){ - this.violations = violations; - - if (loadDefault) { - loadDefault(); - } - - WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-mysql.txt"); - WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-mysql.txt"); - WallVisitorUtils.loadResource(this.permitFunctions, "META-INF/druid-filter-wall-permit-function-mysql.txt"); - WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-mysql.txt"); - WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-mysql.txt"); - } - - public void loadDefault() { - WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-mysql-default.txt"); - WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-mysql-default.txt"); - WallVisitorUtils.loadResource(this.permitFunctions, "META-INF/druid-filter-wall-permit-function-mysql-default.txt"); - WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-mysql-default.txt"); - WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-mysql-default.txt"); - } - - public Set getPermitNames() { - return permitNames; - } - - public Set getPermitFunctions() { - return permitFunctions; - } - - public Set getPermitTables() { - return permitTables; - } - - public Set getPermitSchemas() { - return permitSchemas; + public WallProvider getWallProvider() { + return provider; } public boolean containsPermitObjects(String name) { name = name.toLowerCase(); - return permitObjects.contains(name); - } - - public Set getPermitObjects() { - return permitObjects; + return provider.getPermitObjects().contains(name); } public List getViolations() { @@ -216,7 +168,7 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi @Override public boolean containsPermitTable(String name) { name = WallVisitorUtils.form(name); - return permitTables.contains(name); + return provider.getPermitTables().contains(name); } public void preVisit(SQLObject x) { @@ -236,4 +188,5 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi violations.add(new IllegalSQLObjectViolation(SQLUtils.toMySqlString(x))); } } + } 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 87c6630282..7297724789 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 @@ -5,9 +5,39 @@ import com.alibaba.druid.filter.wall.WallVisitor; import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; import com.alibaba.druid.sql.parser.SQLStatementParser; - public class OracleWallProvider extends WallProvider { + public OracleWallProvider(){ + this(true, true); + } + + public OracleWallProvider(boolean loadDefault, boolean loadExtend){ + if (loadDefault) { + loadDefault(); + } + + if (loadExtend) { + loadExtend(); + } + } + + public void loadExtend() { + WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-oracle.txt"); + WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-oracle.txt"); + WallVisitorUtils.loadResource(this.permitFunctions, "META-INF/druid-filter-wall-permit-function-oracle.txt"); + WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-oracle.txt"); + WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-oracle.txt"); + } + + public void loadDefault() { + WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-oracle-default.txt"); + WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-oracle-default.txt"); + WallVisitorUtils.loadResource(this.permitFunctions, + "META-INF/druid-filter-wall-permit-function-oracle-default.txt"); + WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-oracle-default.txt"); + WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-oracle-default.txt"); + } + @Override public SQLStatementParser createParser(String sql) { return new OracleStatementParser(sql); @@ -15,7 +45,7 @@ public class OracleWallProvider extends WallProvider { @Override public WallVisitor createWallVisitor() { - return new OracleWallVisitor(); + return new OracleWallVisitor(this); } } 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 586f88eeb5..7a4a96a688 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 @@ -1,12 +1,11 @@ package com.alibaba.druid.filter.wall.spi; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; import com.alibaba.druid.filter.wall.IllegalSQLObjectViolation; import com.alibaba.druid.filter.wall.Violation; +import com.alibaba.druid.filter.wall.WallProvider; import com.alibaba.druid.filter.wall.WallVisitor; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLName; @@ -35,82 +34,16 @@ import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVIsitorAdapter; public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVisitor { - private final Set permitFunctions = new HashSet(); - private final Set permitTables = new HashSet(); - private final Set permitSchemas = new HashSet(); - private final Set permitNames = new HashSet(); - private final Set permitObjects = new HashSet(); + private OracleWallProvider provider; + private final List violations = new ArrayList(); - private final List violations; - - public OracleWallVisitor(){ - this(new ArrayList(), true); - } - - public OracleWallVisitor(boolean loadDefault){ - this(new ArrayList(), loadDefault); - } - - public OracleWallVisitor(List violations, boolean loadDefault){ - this.violations = violations; - - if (loadDefault) { - loadDefault(); - } - - WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-oracle.txt"); - WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-oracle.txt"); - WallVisitorUtils.loadResource(this.permitFunctions, "META-INF/druid-filter-wall-permit-function-oracle.txt"); - WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-oracle.txt"); - WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-oracle.txt"); - } - - public void loadDefault() { - WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-oracle-default.txt"); - WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-oracle-default.txt"); - WallVisitorUtils.loadResource(this.permitFunctions, "META-INF/druid-filter-wall-permit-function-oracle-default.txt"); - WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-oracle-default.txt"); - WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-oracle-default.txt"); - } - - public void addPermitName(String name) { - name = name.toLowerCase(); - permitNames.add(name); - } - - public void addPermitFunction(String name) { - name = name.toLowerCase(); - permitFunctions.add(name); - } - - public void addPermitTable(String name) { - name = name.toLowerCase(); - permitTables.add(name); + public OracleWallVisitor(OracleWallProvider provider){ + this.provider = provider; } public boolean containsPermitObjects(String name) { name = name.toLowerCase(); - return permitObjects.contains(name); - } - - public Set getPermitObjects() { - return permitObjects; - } - - public Set getPermitNames() { - return permitNames; - } - - public Set getPermitFunctions() { - return permitFunctions; - } - - public Set getPermitTables() { - return permitTables; - } - - public Set getPermitSchemas() { - return permitSchemas; + return provider.getPermitObjects().contains(name); } public List getViolations() { @@ -220,7 +153,7 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi if (name.startsWith("v$") || name.startsWith("v_$")) { return true; } - return permitTables.contains(name); + return provider.getPermitTables().contains(name); } public void preVisit(SQLObject x) { @@ -242,4 +175,9 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi violations.add(new IllegalSQLObjectViolation(SQLUtils.toMySqlString(x))); } } + + @Override + public WallProvider getWallProvider() { + return this.provider; + } } diff --git a/src/main/java/com/alibaba/druid/filter/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/filter/wall/spi/WallVisitorUtils.java index 985e18b7aa..8cd5ca8085 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/filter/wall/spi/WallVisitorUtils.java @@ -304,7 +304,7 @@ public class WallVisitorUtils { public static void check(WallVisitor visitor, SQLMethodInvokeExpr x) { String methodName = x.getMethodName(); - if (visitor.getPermitFunctions().contains(methodName.toLowerCase())) { + if (visitor.getWallProvider().getPermitFunctions().contains(methodName.toLowerCase())) { visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x))); } @@ -322,7 +322,7 @@ public class WallVisitorUtils { ownerName = form(ownerName); - if (visitor.getPermitSchemas().contains(ownerName.toLowerCase())) { + if (visitor.getWallProvider().getPermitSchemas().contains(ownerName.toLowerCase())) { visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x))); } }