From f34cef64c25bdd35f06b522c569d391b09cc5ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Wed, 21 Mar 2012 10:32:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81DoPrivileged?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/alibaba/druid/wall/WallProvider.java | 33 ++++++++++++++----- .../bvt/filter/wall/DoPrivilegedTest.java | 28 ++++++++++++++++ .../alibaba/druid/sql/SQLExprParserTest.java | 26 +++++++++++++++ 3 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/wall/DoPrivilegedTest.java create mode 100644 src/test/java/com/alibaba/druid/sql/SQLExprParserTest.java diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index b393167e58..dff31e7b9d 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -1,5 +1,6 @@ package com.alibaba.druid.wall; +import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -18,17 +19,19 @@ import com.alibaba.druid.wall.violation.SyntaxErrorViolation; public abstract class WallProvider { // Dummy value to associate with an Object in the backing Map - private static final Object PRESENT = new Object(); + private static final Object PRESENT = new Object(); - private LinkedHashMap whiteList; + private LinkedHashMap whiteList; - private int whileListMaxSize = 1024; + private int whileListMaxSize = 1024; - private int whiteSqlMaxLength = 1024; // 1k + private int whiteSqlMaxLength = 1024; // 1k - protected final WallConfig config; + protected final WallConfig config; - private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + + private static final ThreadLocal privileged = new ThreadLocal(); public WallProvider(WallConfig config){ this.config = config; @@ -50,7 +53,7 @@ public abstract class WallProvider { lock.writeLock().unlock(); } } - + public Set getWhiteList() { Set hashSet = new HashSet(); lock.readLock().lock(); @@ -61,10 +64,10 @@ public abstract class WallProvider { } finally { lock.readLock().unlock(); } - + return hashSet; } - + public void clearCache() { lock.writeLock().lock(); try { @@ -98,6 +101,10 @@ public abstract class WallProvider { } public List check(String sql) { + if (privileged.get() == Boolean.TRUE) { + return Collections.emptyList(); + } + // first step, check whiteList boolean isWhite = whiteContains(sql); if (isWhite) { @@ -145,4 +152,12 @@ public abstract class WallProvider { return visitor.getViolations(); } + public static T doPrivileged(PrivilegedAction action) { + privileged.set(Boolean.TRUE); + try { + return action.run(); + } finally { + privileged.set(null); + } + } } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/DoPrivilegedTest.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/DoPrivilegedTest.java new file mode 100644 index 0000000000..579b2f2960 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/DoPrivilegedTest.java @@ -0,0 +1,28 @@ +package com.alibaba.druid.bvt.filter.wall; + +import java.security.PrivilegedAction; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.wall.WallProvider; +import com.alibaba.druid.wall.WallUtils; + +public class DoPrivilegedTest extends TestCase { + + public void test_0() throws Exception { + Assert.assertFalse(WallUtils.isValidateMySql("select @@version_compile_os")); + } + + public void test_1() throws Exception { + WallProvider.doPrivileged(new PrivilegedAction() { + @Override + public Object run() { + Assert.assertTrue(WallUtils.isValidateMySql("select @@version_compile_os")); + return null; + } + }); + + } +} diff --git a/src/test/java/com/alibaba/druid/sql/SQLExprParserTest.java b/src/test/java/com/alibaba/druid/sql/SQLExprParserTest.java new file mode 100644 index 0000000000..3fe82c5792 --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/SQLExprParserTest.java @@ -0,0 +1,26 @@ +package com.alibaba.druid.sql; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; +import com.alibaba.druid.sql.parser.SQLExprParser; + + +public class SQLExprParserTest extends TestCase { + public void test_binary() throws Exception { + SQLExprParser exprParser = new SQLExprParser("AGE > 5"); + SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) exprParser.expr(); + + Assert.assertEquals(SQLBinaryOperator.GreaterThan, binaryOpExpr.getOperator()); + + SQLIdentifierExpr left = (SQLIdentifierExpr) binaryOpExpr.getLeft(); + SQLIntegerExpr right = (SQLIntegerExpr) binaryOpExpr.getRight(); + + Assert.assertEquals("AGE", left.getName()); + Assert.assertEquals(5, right.getNumber().intValue()); + } +}