diff --git a/CHANGES.txt b/CHANGES.txt index 2468da5c98..7b59c07081 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,8 @@ +3.11 +Merged from 3.0: + * Prevent reloading of logback.xml from UDF sandbox (CASSANDRA-12535) + + 3.10 * Fix CommitLogSegmentManagerTest (CASSANDRA-12283) * Fix cassandra-stress truncate option (CASSANDRA-12695) diff --git a/src/java/org/apache/cassandra/cql3/functions/ThreadAwareSecurityManager.java b/src/java/org/apache/cassandra/cql3/functions/ThreadAwareSecurityManager.java index b96c80f4e5..676117d297 100644 --- a/src/java/org/apache/cassandra/cql3/functions/ThreadAwareSecurityManager.java +++ b/src/java/org/apache/cassandra/cql3/functions/ThreadAwareSecurityManager.java @@ -29,6 +29,14 @@ import java.security.ProtectionDomain; import java.util.Collections; import java.util.Enumeration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.TurboFilterList; +import ch.qos.logback.classic.turbo.ReconfigureOnChangeFilter; +import ch.qos.logback.classic.turbo.TurboFilter; + /** * Custom {@link SecurityManager} and {@link Policy} implementation that only performs access checks * if explicitly enabled. @@ -69,9 +77,44 @@ public final class ThreadAwareSecurityManager extends SecurityManager if (installed) return; System.setSecurityManager(new ThreadAwareSecurityManager()); + + Logger l = LoggerFactory.getLogger(ThreadAwareSecurityManager.class); + ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger) l; + LoggerContext ctx = logbackLogger.getLoggerContext(); + + TurboFilterList turboFilterList = ctx.getTurboFilterList(); + for (int i = 0; i < turboFilterList.size(); i++) + { + TurboFilter turboFilter = turboFilterList.get(i); + if (turboFilter instanceof ReconfigureOnChangeFilter) + { + ReconfigureOnChangeFilter reconfigureOnChangeFilter = (ReconfigureOnChangeFilter) turboFilter; + turboFilterList.set(i, new SMAwareReconfigureOnChangeFilter(reconfigureOnChangeFilter)); + break; + } + } + installed = true; } + /** + * The purpose of this class is + */ + private static class SMAwareReconfigureOnChangeFilter extends ReconfigureOnChangeFilter + { + SMAwareReconfigureOnChangeFilter(ReconfigureOnChangeFilter reconfigureOnChangeFilter) + { + setRefreshPeriod(reconfigureOnChangeFilter.getRefreshPeriod()); + } + + protected boolean changeDetected(long now) + { + if (isSecuredThread()) + return false; + return super.changeDetected(now); + } + } + static { // diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java index c2094f42e5..90887fb001 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java @@ -1791,7 +1791,8 @@ public class AggregationTest extends CQLTester " STYPE map\n" + " INITCOND { };"); - for (int i = 0; i < 1000; i++) + long tEnd = System.currentTimeMillis() + 150; + while (System.currentTimeMillis() < tEnd) { execute("SELECT " + releasesByCountry + "(country,title) FROM %s WHERE year=1980"); } @@ -1814,6 +1815,7 @@ public class AggregationTest extends CQLTester if (turboFilter instanceof ReconfigureOnChangeFilter) { ReconfigureOnChangeFilter reconfigureFilter = (ReconfigureOnChangeFilter) turboFilter; + reconfigureFilter.setContext(ctx); reconfigureFilter.setRefreshPeriod(millis); reconfigureFilter.stop(); reconfigureFilter.start(); // start() sets the next check timestammp