|
@@ -29,7 +29,6 @@ import org.mozilla.javascript.NativeJavaObject
|
|
|
import org.mozilla.javascript.Scriptable
|
|
import org.mozilla.javascript.Scriptable
|
|
|
import org.mozilla.javascript.WrapFactory
|
|
import org.mozilla.javascript.WrapFactory
|
|
|
import java.lang.reflect.Member
|
|
import java.lang.reflect.Member
|
|
|
-import java.lang.reflect.Modifier
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* This wrap factory is used for security reasons. JSR 223 script
|
|
* This wrap factory is used for security reasons. JSR 223 script
|
|
@@ -52,50 +51,15 @@ object RhinoWrapFactory : WrapFactory() {
|
|
|
javaObject: Any,
|
|
javaObject: Any,
|
|
|
staticType: Class<*>?
|
|
staticType: Class<*>?
|
|
|
): Scriptable? {
|
|
): Scriptable? {
|
|
|
- scope?.delete("Packages")
|
|
|
|
|
- val sm = System.getSecurityManager()
|
|
|
|
|
val classShutter = RhinoClassShutter
|
|
val classShutter = RhinoClassShutter
|
|
|
- return if (javaObject is ClassLoader) {
|
|
|
|
|
- sm?.checkPermission(RuntimePermission("getClassLoader"))
|
|
|
|
|
- super.wrapAsJavaObject(cx, scope, javaObject, staticType)
|
|
|
|
|
- } else {
|
|
|
|
|
- var name: String? = null
|
|
|
|
|
- if (javaObject is Class<*>) {
|
|
|
|
|
- name = javaObject.name
|
|
|
|
|
- } else if (javaObject is Member) {
|
|
|
|
|
- if (sm != null && !Modifier.isPublic(javaObject.modifiers)) {
|
|
|
|
|
- return null
|
|
|
|
|
- }
|
|
|
|
|
- name = javaObject.declaringClass.name
|
|
|
|
|
- }
|
|
|
|
|
- if (name != null) {
|
|
|
|
|
- if (!classShutter.visibleToScripts(name)) null else super.wrapAsJavaObject(
|
|
|
|
|
- cx,
|
|
|
|
|
- scope,
|
|
|
|
|
- javaObject,
|
|
|
|
|
- staticType
|
|
|
|
|
- )
|
|
|
|
|
- } else {
|
|
|
|
|
- var dynamicType: Class<*>? = javaObject.javaClass
|
|
|
|
|
- name = dynamicType!!.name
|
|
|
|
|
|
|
+ return when (javaObject) {
|
|
|
|
|
+ is ClassLoader, is Class<*>, is Member, is android.content.Context -> null
|
|
|
|
|
+ else -> {
|
|
|
|
|
+ val name = javaObject.javaClass.name
|
|
|
if (classShutter.visibleToScripts(name)) {
|
|
if (classShutter.visibleToScripts(name)) {
|
|
|
super.wrapAsJavaObject(cx, scope, javaObject, staticType)
|
|
super.wrapAsJavaObject(cx, scope, javaObject, staticType)
|
|
|
} else {
|
|
} else {
|
|
|
- var type: Class<*>? = null
|
|
|
|
|
- if (staticType != null && staticType.isInterface) {
|
|
|
|
|
- type = staticType
|
|
|
|
|
- } else {
|
|
|
|
|
- while (dynamicType != null) {
|
|
|
|
|
- dynamicType = dynamicType.superclass
|
|
|
|
|
- name = dynamicType.name
|
|
|
|
|
- if (classShutter.visibleToScripts(name)) {
|
|
|
|
|
- type = dynamicType
|
|
|
|
|
- break
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- assert(type != null) { "java.lang.Object 不可访问" }
|
|
|
|
|
- }
|
|
|
|
|
- RhinoJavaObject(scope, javaObject, type)
|
|
|
|
|
|
|
+ null
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|