修改有问题,先改回
This commit is contained in:
@@ -29,6 +29,7 @@ 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
|
||||||
@@ -51,15 +52,50 @@ 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 when (javaObject) {
|
return if (javaObject is ClassLoader) {
|
||||||
is ClassLoader, is Class<*>, is Member, is android.content.Context -> null
|
sm?.checkPermission(RuntimePermission("getClassLoader"))
|
||||||
else -> {
|
super.wrapAsJavaObject(cx, scope, javaObject, staticType)
|
||||||
val name = javaObject.javaClass.name
|
} 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
|
||||||
if (classShutter.visibleToScripts(name)) {
|
if (classShutter.visibleToScripts(name)) {
|
||||||
super.wrapAsJavaObject(cx, scope, javaObject, staticType)
|
super.wrapAsJavaObject(cx, scope, javaObject, staticType)
|
||||||
} else {
|
} else {
|
||||||
null
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user