diff --git a/modules/rhino/src/main/java/com/script/rhino/RhinoClassShutter.kt b/modules/rhino/src/main/java/com/script/rhino/RhinoClassShutter.kt index ee486e431..7639ccfca 100644 --- a/modules/rhino/src/main/java/com/script/rhino/RhinoClassShutter.kt +++ b/modules/rhino/src/main/java/com/script/rhino/RhinoClassShutter.kt @@ -45,7 +45,7 @@ import java.util.Collections */ object RhinoClassShutter : ClassShutter { - private val protectedClasses by lazy { + private val protectedClassNames by lazy { hashSetOf( "java.lang.Class", "java.lang.ClassLoader", @@ -120,6 +120,25 @@ object RhinoClassShutter : ClassShutter { 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 { when (obj) { is ClassLoader, @@ -142,6 +161,15 @@ object RhinoClassShutter : ClassShutter { 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 { return when (javaClass) { System::class.java -> { @@ -153,17 +181,14 @@ object RhinoClassShutter : ClassShutter { } override fun visibleToScripts(fullClassName: String): Boolean { - if (!protectedClasses.contains(fullClassName)) { - var className = fullClassName - while (className.contains(".")) { - className = className.substringBeforeLast(".") - if (protectedClasses.contains(className)) { - return false - } + var className = fullClassName + while (className.isNotEmpty()) { + if (protectedClassNames.contains(className)) { + return false } - return true + className = className.substringBeforeLast(".", "") } - return false + return true } } \ No newline at end of file diff --git a/modules/rhino/src/main/java/com/script/rhino/RhinoWrapFactory.kt b/modules/rhino/src/main/java/com/script/rhino/RhinoWrapFactory.kt index 56ec4ef21..f5a1989b3 100644 --- a/modules/rhino/src/main/java/com/script/rhino/RhinoWrapFactory.kt +++ b/modules/rhino/src/main/java/com/script/rhino/RhinoWrapFactory.kt @@ -25,6 +25,8 @@ package com.script.rhino import org.mozilla.javascript.Context +import org.mozilla.javascript.NativeJavaPackage +import org.mozilla.javascript.ScriptRuntime import org.mozilla.javascript.Scriptable import org.mozilla.javascript.WrapFactory @@ -56,10 +58,16 @@ object RhinoWrapFactory : WrapFactory() { } override fun wrapJavaClass( - cx: Context?, + cx: Context, scope: Scriptable, 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) }