优化
This commit is contained in:
@@ -45,7 +45,7 @@ import java.util.Collections
|
|||||||
*/
|
*/
|
||||||
object RhinoClassShutter : ClassShutter {
|
object RhinoClassShutter : ClassShutter {
|
||||||
|
|
||||||
private val protectedClasses by lazy {
|
private val protectedClassNames by lazy {
|
||||||
hashSetOf(
|
hashSetOf(
|
||||||
"java.lang.Class",
|
"java.lang.Class",
|
||||||
"java.lang.ClassLoader",
|
"java.lang.ClassLoader",
|
||||||
@@ -120,6 +120,25 @@ object RhinoClassShutter : ClassShutter {
|
|||||||
Collections.unmodifiableSet(hashSetOf("load", "loadLibrary", "exit"))
|
Collections.unmodifiableSet(hashSetOf("load", "loadLibrary", "exit"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val protectedClasses by lazy {
|
||||||
|
arrayOf(
|
||||||
|
ClassLoader::class.java,
|
||||||
|
Class::class.java,
|
||||||
|
Member::class.java,
|
||||||
|
Context::class.java,
|
||||||
|
ObjectInputStream::class.java,
|
||||||
|
ObjectOutputStream::class.java,
|
||||||
|
okio.FileSystem::class.java,
|
||||||
|
okio.FileHandle::class.java,
|
||||||
|
okio.Path::class.java,
|
||||||
|
android.content.Context::class.java,
|
||||||
|
) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
arrayOf(FileSystem::class.java, Path::class.java)
|
||||||
|
} else {
|
||||||
|
emptyArray()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun visibleToScripts(obj: Any): Boolean {
|
fun visibleToScripts(obj: Any): Boolean {
|
||||||
when (obj) {
|
when (obj) {
|
||||||
is ClassLoader,
|
is ClassLoader,
|
||||||
@@ -142,6 +161,15 @@ object RhinoClassShutter : ClassShutter {
|
|||||||
return visibleToScripts(obj.javaClass.name)
|
return visibleToScripts(obj.javaClass.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun visibleToScripts(clazz: Class<*>): Boolean {
|
||||||
|
protectedClasses.forEach {
|
||||||
|
if (it.isAssignableFrom(clazz)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
fun wrapJavaClass(scope: Scriptable, javaClass: Class<*>): Scriptable {
|
fun wrapJavaClass(scope: Scriptable, javaClass: Class<*>): Scriptable {
|
||||||
return when (javaClass) {
|
return when (javaClass) {
|
||||||
System::class.java -> {
|
System::class.java -> {
|
||||||
@@ -153,17 +181,14 @@ object RhinoClassShutter : ClassShutter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visibleToScripts(fullClassName: String): Boolean {
|
override fun visibleToScripts(fullClassName: String): Boolean {
|
||||||
if (!protectedClasses.contains(fullClassName)) {
|
var className = fullClassName
|
||||||
var className = fullClassName
|
while (className.isNotEmpty()) {
|
||||||
while (className.contains(".")) {
|
if (protectedClassNames.contains(className)) {
|
||||||
className = className.substringBeforeLast(".")
|
return false
|
||||||
if (protectedClasses.contains(className)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true
|
className = className.substringBeforeLast(".", "")
|
||||||
}
|
}
|
||||||
return false
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -25,6 +25,8 @@
|
|||||||
package com.script.rhino
|
package com.script.rhino
|
||||||
|
|
||||||
import org.mozilla.javascript.Context
|
import org.mozilla.javascript.Context
|
||||||
|
import org.mozilla.javascript.NativeJavaPackage
|
||||||
|
import org.mozilla.javascript.ScriptRuntime
|
||||||
import org.mozilla.javascript.Scriptable
|
import org.mozilla.javascript.Scriptable
|
||||||
import org.mozilla.javascript.WrapFactory
|
import org.mozilla.javascript.WrapFactory
|
||||||
|
|
||||||
@@ -56,10 +58,16 @@ object RhinoWrapFactory : WrapFactory() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun wrapJavaClass(
|
override fun wrapJavaClass(
|
||||||
cx: Context?,
|
cx: Context,
|
||||||
scope: Scriptable,
|
scope: Scriptable,
|
||||||
javaClass: Class<*>
|
javaClass: Class<*>
|
||||||
): Scriptable? {
|
): Scriptable {
|
||||||
|
if (!RhinoClassShutter.visibleToScripts(javaClass)) {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
val pkg = NativeJavaPackage(javaClass.name, null)
|
||||||
|
ScriptRuntime.setObjectProtoAndParent(pkg, scope)
|
||||||
|
return pkg
|
||||||
|
}
|
||||||
return RhinoClassShutter.wrapJavaClass(scope, javaClass)
|
return RhinoClassShutter.wrapJavaClass(scope, javaClass)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user