mirror of
https://github.com/gedoor/legado.git
synced 2025-08-10 00:52:30 +00:00
优化
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user