This commit is contained in:
Horis
2025-05-02 14:31:30 +08:00
parent 1156698a4a
commit 6514af7178
2 changed files with 45 additions and 12 deletions

View File

@@ -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
}
}

View File

@@ -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)
}