You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mb...@apache.org on 2013/07/30 19:54:59 UTC
svn commit: r1508553 - in /commons/sandbox/weaver/trunk:
modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/
processor/src/main/java/org/apache/commons/weaver/
processor/src/main/java/org/apache/commons/weaver/model/
Author: mbenson
Date: Tue Jul 30 17:54:58 2013
New Revision: 1508553
URL: http://svn.apache.org/r1508553
Log:
promote logging to the WeaveEnvironment; create a new one for every Weaver/Cleaner invoked, with its very own logger
Modified:
commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/ActionGenerator.java
commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/BlueprintingVisitor.java
commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/InlineNestedPrivilegedCalls.java
commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java
commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizingVisitor.java
commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java
commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java
commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java
Modified: commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/ActionGenerator.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/ActionGenerator.java?rev=1508553&r1=1508552&r2=1508553&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/ActionGenerator.java (original)
+++ commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/ActionGenerator.java Tue Jul 30 17:54:58 2013
@@ -114,7 +114,7 @@ class ActionGenerator extends Privilizer
init();
impl();
visitEnd();
- owner.privilizer().debug("Generated %s implementation %s to call %s#%s", actionInterface.getClassName(),
+ owner.privilizer().env.debug("Generated %s implementation %s to call %s#%s", actionInterface.getClassName(),
action.getClassName(), owner.target.getClassName(), helper);
return action;
}
@@ -125,7 +125,7 @@ class ActionGenerator extends Privilizer
* (__privileged_):
*/
private void generateHelper() {
- owner.privilizer().debug("Generating static helper method %s.%s to call %s", owner.target.getClassName(),
+ owner.privilizer().env.debug("Generating static helper method %s.%s to call %s", owner.target.getClassName(),
helper, impl);
final GeneratorAdapter mg =
new GeneratorAdapter(Opcodes.ACC_STATIC | Opcodes.ACC_SYNTHETIC, helper, null, exceptions, owner);
Modified: commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/BlueprintingVisitor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/BlueprintingVisitor.java?rev=1508553&r1=1508552&r2=1508553&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/BlueprintingVisitor.java (original)
+++ commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/BlueprintingVisitor.java Tue Jul 30 17:54:58 2013
@@ -142,8 +142,7 @@ class BlueprintingVisitor extends Privil
new StringBuilder(key.getLeft().getInternalName().replace('/', '_')).append("$$")
.append(key.getRight().getName()).toString();
importedMethods.put(key, result);
-
- privilizer().debug("importing %s#%s as %s", key.getLeft().getClassName(), key.getRight(), result);
+ privilizer().env.debug("importing %s#%s as %s", key.getLeft().getClassName(), key.getRight(), result);
final int access = Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC + Opcodes.ACC_SYNTHETIC;
final MethodNode source = getMethods(key.getLeft()).get(key.getRight());
@@ -154,7 +153,17 @@ class BlueprintingVisitor extends Privil
// non-public fields accessed
final Set<FieldAccess> fieldAccesses = new LinkedHashSet<FieldAccess>();
- source.accept(new FieldAccessAccumulator(fieldAccesses));
+ source.accept(new MethodVisitor(Opcodes.ASM4) {
+ @Override
+ public void visitFieldInsn(int opcode, String owner, String name, String desc) {
+ final FieldAccess fieldAccess = fieldAccess(Type.getObjectType(owner), name, Type.getType(desc));
+
+ super.visitFieldInsn(opcode, owner, name, desc);
+ if (!Modifier.isPublic(fieldAccess.access)) {
+ fieldAccesses.add(fieldAccess);
+ }
+ }
+ });
final MethodNode withAccessibleAdvice =
new MethodNode(access, result, source.desc, source.signature, exceptions);
@@ -227,11 +236,6 @@ class BlueprintingVisitor extends Privil
@Override
public void visitEnd() {
super.visitEnd();
-// if (privilizer().verify) {
-// final ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
-// ((ClassNode) cv).accept(classWriter);
-// privilizer().verify(target, classWriter.toByteArray());
-// }
((ClassNode) cv).accept(next);
}
@@ -287,26 +291,10 @@ class BlueprintingVisitor extends Privil
}
}
- private class FieldAccessAccumulator extends MethodVisitor {
- final Set<FieldAccess> fieldAccesses;
-
- FieldAccessAccumulator(Set<FieldAccess> fieldAccesses) {
- super(Opcodes.ASM4);
- this.fieldAccesses = fieldAccesses;
- }
-
- @Override
- public void visitFieldInsn(int opcode, String owner, String name, String desc) {
- final FieldAccess fieldAccess = fieldAccess(Type.getObjectType(owner), name, Type.getType(desc));
-
- super.visitFieldInsn(opcode, owner, name, desc);
- if (!Modifier.isPublic(fieldAccess.access)) {
- fieldAccesses.add(fieldAccess);
- }
- }
-
- }
-
+ /**
+ * For every non-public referenced field of an imported method, replaces with reflective calls. Additionally, for
+ * every such field that is not accessible, sets the field's accessibility and clears it as the method exits.
+ */
private class AccessibleAdvisor extends AdviceAdapter {
final Type bitSetType = Type.getType(BitSet.class);
final Type classType = Type.getType(Class.class);
@@ -396,8 +384,6 @@ class BlueprintingVisitor extends Privil
final FieldAccess fieldAccess = fieldAccessMap.get(key);
Validate.isTrue(fieldAccesses.contains(fieldAccess), "Cannot find field %s", key);
final int fieldIndex = fieldAccesses.indexOf(fieldAccess);
-
- privilizer().debug("accessing field %s with opcode %s", fieldIndex, opcode);
visitInsn(NOP);
loadLocal(localFieldArray);
push(fieldIndex);
Modified: commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/InlineNestedPrivilegedCalls.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/InlineNestedPrivilegedCalls.java?rev=1508553&r1=1508552&r2=1508553&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/InlineNestedPrivilegedCalls.java (original)
+++ commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/InlineNestedPrivilegedCalls.java Tue Jul 30 17:54:58 2013
@@ -66,7 +66,8 @@ class InlineNestedPrivilegedCalls extend
final Method m = new Method(name, desc);
if (privilegedMethods.containsKey(m)) {
name = privilegedMethods.get(m);
- privilizer.debug("Inlining call from %s to %s as %s", outer, m, name);
+ privilizer.env.debug("Inlining call from %s to %s as %s", outer, m,
+ name);
}
}
super.visitMethodInsn(opcode, owner, name, desc);
Modified: commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java?rev=1508553&r1=1508552&r2=1508553&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java (original)
+++ commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java Tue Jul 30 17:54:58 2013
@@ -26,7 +26,6 @@ import java.net.URLClassLoader;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.BooleanUtils;
@@ -102,50 +101,28 @@ public class Privilizer {
public static final String CONFIG_VERIFY = CONFIG_WEAVER + "verify";
- private static final Logger log = Logger.getLogger(PrivilizerWeaver.class.getName());
-
private static final String GENERATE_NAME = "__privileged_%s";
static final Type[] EMPTY_TYPE_ARRAY = new Type[0];
- public final AccessLevel accessLevel;
- public final ClassLoader classLoader;
- public final FileArchive fileArchive;
- public final Policy policy;
- public final boolean verify;
+ final WeaveEnvironment env;
+ final AccessLevel accessLevel;
+ final ClassLoader classLoader;
+ final FileArchive fileArchive;
+ final Policy policy;
+ final boolean verify;
private final List<String> classpath;
- final Set<Class<?>> woven;
- public Privilizer(WeaveEnvironment weaveEnvironment) {
+ public Privilizer(WeaveEnvironment env) {
super();
- this.policy = Policy.parse(weaveEnvironment.config.getProperty(CONFIG_POLICY));
- this.accessLevel = AccessLevel.parse(weaveEnvironment.config.getProperty(CONFIG_ACCESS_LEVEL));
- this.classpath = weaveEnvironment.classpath;
- classLoader = new URLClassLoader(URLArray.fromPaths(weaveEnvironment.classpath));
- fileArchive = new FileArchive(classLoader, weaveEnvironment.target);
- verify = BooleanUtils.toBoolean(weaveEnvironment.config.getProperty(CONFIG_VERIFY));
- woven = new HashSet<Class<?>>();
- }
-
- protected void debug(String message, Object... args) {
- log.fine(String.format(message, args));
- }
-
- protected void verbose(String message, Object... args) {
- log.fine(String.format(message, args));
- }
-
- protected void warn(String message, Object... args) {
- log.warning(String.format(message, args));
- }
-
- protected void info(String message, Object... args) {
- log.info(String.format(message, args));
- }
-
- protected void error(String message, Object... args) {
- log.severe(String.format(message, args));
+ this.env = env;
+ this.policy = Policy.parse(env.config.getProperty(CONFIG_POLICY));
+ this.accessLevel = AccessLevel.parse(env.config.getProperty(CONFIG_ACCESS_LEVEL));
+ this.classpath = env.classpath;
+ classLoader = new URLClassLoader(URLArray.fromPaths(env.classpath));
+ fileArchive = new FileArchive(classLoader, env.target);
+ verify = BooleanUtils.toBoolean(env.config.getProperty(CONFIG_VERIFY));
}
String generateName(String simple) {
@@ -178,7 +155,8 @@ public class Privilizer {
}
void blueprint(final Class<?> type, final Privilizing privilizing) {
- debug("blueprinting class %s %s", type.getName(), privilizing);
+ Object[] args = { type.getName(), privilizing };
+ env.debug("blueprinting class %s %s", args);
try {
final ClassReader classReader = new ClassReader(fileArchive.getBytecode(type.getName()));
@@ -194,7 +172,8 @@ public class Privilizer {
}
void privilize(final Class<?> type) {
- debug("privilizing class %s", type.getName());
+ Object[] args = { type.getName() };
+ env.debug("privilizing class %s", args);
try {
final ClassReader classReader = new ClassReader(fileArchive.getBytecode(type.getName()));
ClassVisitor cv;
@@ -227,10 +206,10 @@ public class Privilizer {
CheckClassAdapter.verify(reader, verifyClassLoader, false, new PrintWriter(w));
final String error = w.toString();
if (!error.isEmpty()) {
- error(error);
+ env.error(error);
final StringWriter trace = new StringWriter();
reader.accept(new TraceClassVisitor(new PrintWriter(trace)), ClassReader.SKIP_DEBUG);
- debug(trace.toString());
+ env.debug(trace.toString());
throw new IllegalStateException();
}
Validate.validState(StringUtils.isBlank(error), error);
Modified: commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizingVisitor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizingVisitor.java?rev=1508553&r1=1508552&r2=1508553&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizingVisitor.java (original)
+++ commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizingVisitor.java Tue Jul 30 17:54:58 2013
@@ -99,8 +99,8 @@ class PrivilizingVisitor extends Privili
+ localAccessLevel + "')"));
}
if (AccessLevel.PACKAGE.compareTo(accessLevel) > 0) {
- privilizer().warn("Possible security leak: granting privileges to %s method %s.%s",
- localAccessLevel, className, m);
+ Object[] args = { localAccessLevel, className, m };
+ privilizer().env.warn("Possible security leak: granting privileges to %s method %s.%s", args);
}
privilegedMethods.put(m, privilizer().generateName(name));
}
Modified: commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java?rev=1508553&r1=1508552&r2=1508553&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java (original)
+++ commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java Tue Jul 30 17:54:58 2013
@@ -25,6 +25,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Properties;
import java.util.ServiceLoader;
+import java.util.logging.Logger;
import org.apache.commons.lang3.Validate;
import org.apache.commons.weaver.model.WeaveEnvironment;
@@ -65,12 +66,9 @@ public class CleanProcessor {
/**
* Create a new {@link CleanProcessor} instance.
*
- * @param classpath
- * not {@code null}
- * @param target
- * not {@code null}
- * @param configuration
- * not {@code null}
+ * @param classpath not {@code null}
+ * @param target not {@code null}
+ * @param configuration not {@code null}
*/
public CleanProcessor(List<String> classpath, File target, Properties configuration) {
super();
@@ -85,8 +83,9 @@ public class CleanProcessor {
public void clean() {
final ClassLoader classLoader = new URLClassLoader(URLArray.fromPaths(classpath));
final Finder finder = new Finder(new FileArchive(classLoader, target));
- final WeaveEnvironment env = new WeaveEnvironment(classpath, target, configuration);
for (Cleaner cleaner : CLEANERS) {
+ final WeaveEnvironment env =
+ new WeaveEnvironment(classpath, target, configuration, Logger.getLogger(cleaner.getClass().getName()));
cleaner.clean(env, finder);
}
}
Modified: commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java?rev=1508553&r1=1508552&r2=1508553&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java (original)
+++ commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java Tue Jul 30 17:54:58 2013
@@ -25,6 +25,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Properties;
import java.util.ServiceLoader;
+import java.util.logging.Logger;
import org.apache.commons.lang3.Validate;
import org.apache.commons.weaver.model.WeaveEnvironment;
@@ -66,12 +67,9 @@ public class WeaveProcessor {
/**
* Create a new {@link WeaveProcessor} instance.
*
- * @param classpath
- * not {@code null}
- * @param target
- * not {@code null}
- * @param configuration
- * not {@code null}
+ * @param classpath not {@code null}
+ * @param target not {@code null}
+ * @param configuration not {@code null}
*/
public WeaveProcessor(List<String> classpath, File target, Properties configuration) {
super();
@@ -86,8 +84,9 @@ public class WeaveProcessor {
public void weave() {
final ClassLoader classLoader = new URLClassLoader(URLArray.fromPaths(classpath));
final Finder finder = new Finder(new FileArchive(classLoader, target));
- final WeaveEnvironment env = new WeaveEnvironment(classpath, target, configuration);
for (Weaver weaver : WEAVERS) {
+ final WeaveEnvironment env =
+ new WeaveEnvironment(classpath, target, configuration, Logger.getLogger(weaver.getClass().getName()));
weaver.process(env, finder);
}
}
Modified: commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java?rev=1508553&r1=1508552&r2=1508553&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java (original)
+++ commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java Tue Jul 30 17:54:58 2013
@@ -22,6 +22,7 @@ import java.io.File;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
+import java.util.logging.Logger;
import org.apache.commons.lang3.Validate;
import org.apache.commons.weaver.spi.Cleaner;
@@ -46,6 +47,8 @@ public class WeaveEnvironment {
* "privilizer".
*/
public final Properties config;
+
+ private final Logger log;
/**
* Create a new {@link WeaveEnvironment}.
@@ -53,12 +56,34 @@ public class WeaveEnvironment {
* @param classpath
* @param target
* @param config
+ * @param log
*/
- public WeaveEnvironment(List<String> classpath, File target, Properties config) {
+ public WeaveEnvironment(List<String> classpath, File target, Properties config, Logger log) {
super();
this.classpath = Collections.unmodifiableList(Validate.notNull(classpath, "classpath"));
this.target = Validate.notNull(target, "target");
this.config = (Properties) Validate.notNull(config, "config").clone();
+ this.log = log;
+ }
+
+ public void debug(String message, Object... args) {
+ log.fine(String.format(message, args));
+ }
+
+ public void verbose(String message, Object... args) {
+ log.fine(String.format(message, args));
+ }
+
+ public void warn(String message, Object... args) {
+ log.warning(String.format(message, args));
+ }
+
+ public void info(String message, Object... args) {
+ log.info(String.format(message, args));
+ }
+
+ public void error(String message, Object... args) {
+ log.severe(String.format(message, args));
}
}