diff --git a/app/src/main/java/io/legado/app/App.kt b/app/src/main/java/io/legado/app/App.kt index 03e52e43c..cc8ce2329 100644 --- a/app/src/main/java/io/legado/app/App.kt +++ b/app/src/main/java/io/legado/app/App.kt @@ -216,4 +216,12 @@ class App : Application() { } } + companion object { + init { + if (BuildConfig.DEBUG) { + System.setProperty("kotlinx.coroutines.debug", "on") + } + } + } + } diff --git a/app/src/main/java/io/legado/app/model/ReadManga.kt b/app/src/main/java/io/legado/app/model/ReadManga.kt index 4c13a2629..b7701f3cc 100644 --- a/app/src/main/java/io/legado/app/model/ReadManga.kt +++ b/app/src/main/java/io/legado/app/model/ReadManga.kt @@ -206,7 +206,7 @@ object ReadManga : CoroutineScope by MainScope() { mCallback?.loadFail(errorMsg) return } - if (content.isEmpty()) { + if (content.isEmpty() && !chapter.isVolume) { mCallback?.loadFail("正文内容为空") return } diff --git a/modules/rhino/build.gradle b/modules/rhino/build.gradle index 1b2c7998e..35a5dc293 100644 --- a/modules/rhino/build.gradle +++ b/modules/rhino/build.gradle @@ -39,6 +39,7 @@ dependencies { api libs.mozilla.rhino implementation(libs.kotlinx.coroutines.core) + implementation(libs.okhttp) // def coroutines_version = '1.7.3' // implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version") 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 30763f6c6..5d9488a3e 100644 --- a/modules/rhino/src/main/java/com/script/rhino/RhinoClassShutter.kt +++ b/modules/rhino/src/main/java/com/script/rhino/RhinoClassShutter.kt @@ -24,7 +24,14 @@ */ package com.script.rhino +import android.os.Build import org.mozilla.javascript.ClassShutter +import org.mozilla.javascript.Context +import java.io.ObjectInputStream +import java.io.ObjectOutputStream +import java.lang.reflect.Member +import java.nio.file.FileSystem +import java.nio.file.Path /** * This class prevents script access to certain sensitive classes. @@ -38,30 +45,75 @@ object RhinoClassShutter : ClassShutter { private val protectedClasses by lazy { hashSetOf( - "dalvik.system", "java.lang.Class", "java.lang.ClassLoader", "java.net.URLClassLoader", "cn.hutool.core.lang.JarClassLoader", + "cn.hutool.core.util.RuntimeUtil", + "cn.hutool.core.util.ClassLoaderUtil", "org.mozilla.javascript.DefiningClassLoader", "java.lang.Runtime", + "java.lang.ProcessBuilder", + "java.lang.ProcessImpl", + "java.lang.UNIXProcess", "java.io.File", + "java.io.FileInputStream", + "java.io.FileOutputStream", + "java.io.FileReader", + "java.io.FileWriter", + "java.io.RandomAccessFile", + "java.io.ObjectInputStream", + "java.io.ObjectOutputStream", "java.security.AccessController", "java.nio.file.Paths", "java.nio.file.Files", + "java.nio.file.FileSystems", "io.legado.app.data.AppDatabase", "io.legado.app.data.AppDatabaseKt", "io.legado.app.utils.ContextExtensionsKt", "android.content.Intent", "androidx.core.content.FileProvider", "android.provider.Settings", - "androidx.sqlite.db", "splitties.init.AppCtxKt", "android.app.ActivityThread", - "android.app.AppGlobals" + "android.app.AppGlobals", + "okio.JvmSystemFileSystem", + "okio.JvmFileHandle", + "okio.NioSystemFileSystem", + "okio.NioFileSystemFileHandle", + "okio.Path", + + "android.system", + "android.database", + "androidx.sqlite.db", + "cn.hutool.core.io", + "dalvik.system", + "java.nio.file", ) } + fun visibleToScripts(obj: Any): Boolean { + when (obj) { + is ClassLoader, + is Class<*>, + is Member, + is Context, + is ObjectInputStream, + is ObjectOutputStream, + is okio.FileSystem, + is okio.FileHandle, + is okio.Path, + is android.content.Context -> return false + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + when (obj) { + is FileSystem, + is Path -> return false + } + } + return visibleToScripts(obj.javaClass.name) + } + override fun visibleToScripts(fullClassName: String): Boolean { if (!protectedClasses.contains(fullClassName)) { var className = fullClassName 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 12ea77dd5..4f36a4792 100644 --- a/modules/rhino/src/main/java/com/script/rhino/RhinoWrapFactory.kt +++ b/modules/rhino/src/main/java/com/script/rhino/RhinoWrapFactory.kt @@ -27,7 +27,6 @@ package com.script.rhino import org.mozilla.javascript.Context import org.mozilla.javascript.Scriptable import org.mozilla.javascript.WrapFactory -import java.lang.reflect.Member /** * This wrap factory is used for security reasons. JSR 223 script @@ -50,25 +49,10 @@ object RhinoWrapFactory : WrapFactory() { javaObject: Any, staticType: Class<*>? ): Scriptable? { - val classShutter = RhinoClassShutter - return when (javaObject) { - is ClassLoader, - is Class<*>, - is Member, - is Context, - is android.content.Context -> { - null - } - - else -> { - val name = javaObject.javaClass.name - if (classShutter.visibleToScripts(name)) { - super.wrapAsJavaObject(cx, scope, javaObject, staticType) - } else { - null - } - } + if (!RhinoClassShutter.visibleToScripts(javaObject)) { + return null } + return super.wrapAsJavaObject(cx, scope, javaObject, staticType) } } \ No newline at end of file