From 78b56629509b8275eade44ca552d3b959ecedde3 Mon Sep 17 00:00:00 2001 From: kkhan Date: Tue, 12 Feb 2008 18:55:46 +0000 Subject: [PATCH] Make ProxyFactory use privileged blocks when a security manager is present git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@420 30ef5769-5b8d-40dd-aea6-55b5d6557bb3 --- .../javassist/util/proxy/FactoryHelper.java | 12 +- .../javassist/util/proxy/ProxyFactory.java | 43 +---- .../javassist/util/proxy/SecurityActions.java | 164 ++++++++++++++++++ 3 files changed, 174 insertions(+), 45 deletions(-) create mode 100755 src/main/javassist/util/proxy/SecurityActions.java diff --git a/src/main/javassist/util/proxy/FactoryHelper.java b/src/main/javassist/util/proxy/FactoryHelper.java index d844639f..50d1944b 100644 --- a/src/main/javassist/util/proxy/FactoryHelper.java +++ b/src/main/javassist/util/proxy/FactoryHelper.java @@ -39,11 +39,15 @@ public class FactoryHelper { static { try { Class cl = Class.forName("java.lang.ClassLoader"); - defineClass1 = cl.getDeclaredMethod("defineClass", + defineClass1 = SecurityActions.getDeclaredMethod( + cl, + "defineClass", new Class[] { String.class, byte[].class, int.class, int.class }); - defineClass2 = cl.getDeclaredMethod("defineClass", + defineClass2 = SecurityActions.getDeclaredMethod( + cl, + "defineClass", new Class[] { String.class, byte[].class, int.class, int.class, ProtectionDomain.class }); } @@ -173,9 +177,9 @@ public class FactoryHelper { ClassLoader loader, Object[] args) throws Exception { - method.setAccessible(true); + SecurityActions.setAccessible(method, true); Class clazz = (Class)method.invoke(loader, args); - method.setAccessible(false); + SecurityActions.setAccessible(method, false); return clazz; } diff --git a/src/main/javassist/util/proxy/ProxyFactory.java b/src/main/javassist/util/proxy/ProxyFactory.java index 452768b7..6459f1d8 100644 --- a/src/main/javassist/util/proxy/ProxyFactory.java +++ b/src/main/javassist/util/proxy/ProxyFactory.java @@ -21,8 +21,6 @@ import java.lang.reflect.Method; import java.lang.reflect.Constructor; import java.lang.reflect.Member; import java.lang.reflect.Modifier; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.security.ProtectionDomain; import java.util.HashMap; import java.util.WeakHashMap; @@ -350,9 +348,9 @@ public class ProxyFactory { if (thisClass != null && value != null) try { Field f = thisClass.getField(fieldName); - f.setAccessible(true); + SecurityActions.setAccessible(f, true); f.set(null, value); - f.setAccessible(false); + SecurityActions.setAccessible(f, false); } catch (Exception e) { throw new RuntimeException(e); @@ -1043,41 +1041,4 @@ public class ProxyFactory { minfo.setCodeAttribute(code.toCodeAttribute()); return minfo; } - - private static class SecurityActions - { - private static Method[] getDeclaredMethods(final Class clazz) - { - if (System.getSecurityManager() == null) - { - return clazz.getDeclaredMethods(); - } - else - { - return (Method[])AccessController.doPrivileged(new PrivilegedAction() { - - public Object run() - { - return clazz.getDeclaredMethods(); - }}); - } - } - - private static Constructor[] getDeclaredConstructors(final Class clazz) - { - if (System.getSecurityManager() == null) - { - return clazz.getDeclaredConstructors(); - } - else - { - return (Constructor[])AccessController.doPrivileged(new PrivilegedAction() { - - public Object run() - { - return clazz.getDeclaredConstructors(); - }}); - } - } - } } diff --git a/src/main/javassist/util/proxy/SecurityActions.java b/src/main/javassist/util/proxy/SecurityActions.java new file mode 100755 index 00000000..e7784b89 --- /dev/null +++ b/src/main/javassist/util/proxy/SecurityActions.java @@ -0,0 +1,164 @@ +/* + * Javassist, a Java-bytecode translator toolkit. + * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved. + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. Alternatively, the contents of this file may be used under + * the terms of the GNU Lesser General Public License Version 2.1 or later. + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + */ +package javassist.util.proxy; + +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; + +class SecurityActions +{ + static Method[] getDeclaredMethods(final Class clazz) + { + if (System.getSecurityManager() == null) + { + return clazz.getDeclaredMethods(); + } + else + { + return (Method[])AccessController.doPrivileged(new PrivilegedAction() { + + public Object run() + { + return clazz.getDeclaredMethods(); + }}); + } + } + + static Constructor[] getDeclaredConstructors(final Class clazz) + { + if (System.getSecurityManager() == null) + { + return clazz.getDeclaredConstructors(); + } + else + { + return (Constructor[])AccessController.doPrivileged(new PrivilegedAction() { + + public Object run() + { + return clazz.getDeclaredConstructors(); + }}); + } + } + + static Method getDeclaredMethod(final Class clazz, final String name, final Class[] types) throws NoSuchMethodException + { + if (System.getSecurityManager() == null) + { + return clazz.getDeclaredMethod(name, types); + } + else + { + try + { + return (Method)AccessController.doPrivileged(new PrivilegedExceptionAction() { + + public Object run()throws Exception + { + return clazz.getDeclaredMethod(name, types); + }}); + } + catch(PrivilegedActionException e) + { + if (e.getCause() instanceof NoSuchMethodException) + { + throw (NoSuchMethodException)e.getCause(); + } + throw new RuntimeException(e.getCause()); + } + } + } + + static Constructor getDeclaredConstructor(final Class clazz, final Class[] types) throws NoSuchMethodException + { + if (System.getSecurityManager() == null) + { + return clazz.getDeclaredConstructor(types); + } + else + { + try + { + return (Constructor)AccessController.doPrivileged(new PrivilegedExceptionAction() { + + public Object run() throws Exception + { + return clazz.getDeclaredConstructor(types); + }}); + } + catch (PrivilegedActionException e) + { + if (e.getCause() instanceof NoSuchMethodException) + { + throw (NoSuchMethodException)e.getCause(); + } + throw new RuntimeException(e.getCause()); + } + } + } + + static void setAccessible(final AccessibleObject ao, final boolean accessible) + { + if (System.getSecurityManager() == null) + { + ao.setAccessible(accessible); + } + else + { + AccessController.doPrivileged(new PrivilegedAction() { + + public Object run() + { + ao.setAccessible(accessible); + return null; + }}); + } + } + + static void set(final Field fld, final Object target, final Object value) throws IllegalAccessException + { + if (System.getSecurityManager() == null) + { + fld.set(target, value); + } + else + { + try + { + AccessController.doPrivileged(new PrivilegedExceptionAction() { + + public Object run() throws Exception + { + fld.set(target, value); + return null; + }}); + } + catch (PrivilegedActionException e) + { + if (e.getCause() instanceof NoSuchMethodException) + { + throw (IllegalAccessException)e.getCause(); + } + throw new RuntimeException(e.getCause()); + } + } + } +} \ No newline at end of file -- 2.39.5