This commit is contained in:
kunfei
2023-04-21 00:17:59 +08:00
parent f704db3384
commit 48bec1efe7
7 changed files with 175 additions and 181 deletions
+7 -1
View File
@@ -10,13 +10,18 @@ import android.os.Build
import com.github.liuyueyi.quick.transfer.ChineseUtils import com.github.liuyueyi.quick.transfer.ChineseUtils
import com.github.liuyueyi.quick.transfer.constants.TransType import com.github.liuyueyi.quick.transfer.constants.TransType
import com.jeremyliao.liveeventbus.LiveEventBus import com.jeremyliao.liveeventbus.LiveEventBus
import com.script.rhino.RhinoScriptEngine
import io.legado.app.base.AppContextWrapper import io.legado.app.base.AppContextWrapper
import io.legado.app.constant.AppConst.channelIdDownload import io.legado.app.constant.AppConst.channelIdDownload
import io.legado.app.constant.AppConst.channelIdReadAloud import io.legado.app.constant.AppConst.channelIdReadAloud
import io.legado.app.constant.AppConst.channelIdWeb import io.legado.app.constant.AppConst.channelIdWeb
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.help.* import io.legado.app.help.AppWebDav
import io.legado.app.help.CrashHandler
import io.legado.app.help.DefaultData
import io.legado.app.help.LifecycleHelp
import io.legado.app.help.RuleBigDataHelp
import io.legado.app.help.book.BookHelp import io.legado.app.help.book.BookHelp
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ThemeConfig.applyDayNight import io.legado.app.help.config.ThemeConfig.applyDayNight
@@ -36,6 +41,7 @@ class App : Application() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
RhinoScriptEngine
oldConfig = Configuration(resources.configuration) oldConfig = Configuration(resources.configuration)
CrashHandler(this) CrashHandler(this)
//预下载Cronet so //预下载Cronet so
@@ -1,6 +1,8 @@
package io.legado.app.data.entities package io.legado.app.data.entities
import cn.hutool.crypto.symmetric.AES import cn.hutool.crypto.symmetric.AES
import com.script.SimpleBindings
import com.script.rhino.RhinoScriptEngine
import io.legado.app.constant.AppConst import io.legado.app.constant.AppConst
import io.legado.app.constant.AppLog import io.legado.app.constant.AppLog
import io.legado.app.data.entities.rule.RowUi import io.legado.app.data.entities.rule.RowUi
@@ -10,9 +12,6 @@ import io.legado.app.help.config.AppConfig
import io.legado.app.help.http.CookieStore import io.legado.app.help.http.CookieStore
import io.legado.app.model.SharedJsScope import io.legado.app.model.SharedJsScope
import io.legado.app.rhino.Bindings import io.legado.app.rhino.Bindings
import io.legado.app.rhino.Rhino
import io.legado.app.rhino.evaluate
import io.legado.app.rhino.putBindings
import io.legado.app.utils.* import io.legado.app.utils.*
import org.intellij.lang.annotations.Language import org.intellij.lang.annotations.Language
import org.mozilla.javascript.Scriptable import org.mozilla.javascript.Scriptable
@@ -237,14 +236,15 @@ interface BaseSource : JsExtensions {
bindings["baseUrl"] = getKey() bindings["baseUrl"] = getKey()
bindings["cookie"] = CookieStore bindings["cookie"] = CookieStore
bindings["cache"] = CacheManager bindings["cache"] = CacheManager
return Rhino.use { // return Rhino.use {
val scope = initStandardObjects() // val scope = initStandardObjects()
scope.putBindings(bindings) // scope.putBindings(bindings)
getShareScope()?.let { // getShareScope()?.let {
scope.prototype = it // scope.prototype = it
} // }
evaluate(scope, jsStr) // evaluate(scope, jsStr)
} // }
return RhinoScriptEngine.eval(jsStr, SimpleBindings(bindings))
} }
fun getShareScope(): Scriptable? { fun getShareScope(): Scriptable? {
@@ -2,6 +2,8 @@ package io.legado.app.model.analyzeRule
import android.text.TextUtils import android.text.TextUtils
import androidx.annotation.Keep import androidx.annotation.Keep
import com.script.SimpleBindings
import com.script.rhino.RhinoScriptEngine
import io.legado.app.constant.AppPattern.JS_PATTERN import io.legado.app.constant.AppPattern.JS_PATTERN
import io.legado.app.data.entities.* import io.legado.app.data.entities.*
import io.legado.app.help.CacheManager import io.legado.app.help.CacheManager
@@ -9,9 +11,6 @@ import io.legado.app.help.JsExtensions
import io.legado.app.help.http.CookieStore import io.legado.app.help.http.CookieStore
import io.legado.app.model.webBook.WebBook import io.legado.app.model.webBook.WebBook
import io.legado.app.rhino.Bindings import io.legado.app.rhino.Bindings
import io.legado.app.rhino.Rhino
import io.legado.app.rhino.evaluate
import io.legado.app.rhino.putBindings
import io.legado.app.utils.* import io.legado.app.utils.*
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeout import kotlinx.coroutines.withTimeout
@@ -695,14 +694,15 @@ class AnalyzeRule(
bindings["title"] = chapter?.title bindings["title"] = chapter?.title
bindings["src"] = content bindings["src"] = content
bindings["nextChapterUrl"] = nextChapterUrl bindings["nextChapterUrl"] = nextChapterUrl
return Rhino.use { // return Rhino.use {
val scope = initStandardObjects() // val scope = initStandardObjects()
scope.putBindings(bindings) // scope.putBindings(bindings)
source?.getShareScope()?.let { // source?.getShareScope()?.let {
scope.prototype = it // scope.prototype = it
} // }
evaluate(scope, jsStr) // evaluate(scope, jsStr)
} // }
return RhinoScriptEngine.eval(jsStr, SimpleBindings(bindings))
} }
override fun getSource(): BaseSource? { override fun getSource(): BaseSource? {
@@ -5,6 +5,8 @@ import android.util.Base64
import androidx.annotation.Keep import androidx.annotation.Keep
import cn.hutool.core.util.HexUtil import cn.hutool.core.util.HexUtil
import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.load.model.GlideUrl
import com.script.SimpleBindings
import com.script.rhino.RhinoScriptEngine
import io.legado.app.constant.AppConst.UA_NAME import io.legado.app.constant.AppConst.UA_NAME
import io.legado.app.constant.AppPattern import io.legado.app.constant.AppPattern
import io.legado.app.constant.AppPattern.JS_PATTERN import io.legado.app.constant.AppPattern.JS_PATTERN
@@ -19,9 +21,6 @@ import io.legado.app.help.config.AppConfig
import io.legado.app.help.glide.GlideHeaders import io.legado.app.help.glide.GlideHeaders
import io.legado.app.help.http.* import io.legado.app.help.http.*
import io.legado.app.rhino.Bindings import io.legado.app.rhino.Bindings
import io.legado.app.rhino.Rhino
import io.legado.app.rhino.evaluate
import io.legado.app.rhino.putBindings
import io.legado.app.utils.* import io.legado.app.utils.*
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@@ -267,14 +266,15 @@ class AnalyzeUrl(
bindings["book"] = ruleData as? Book bindings["book"] = ruleData as? Book
bindings["source"] = source bindings["source"] = source
bindings["result"] = result bindings["result"] = result
return Rhino.use { // return Rhino.use {
val scope = initStandardObjects() // val scope = initStandardObjects()
scope.putBindings(bindings) // scope.putBindings(bindings)
source?.getShareScope()?.let { // source?.getShareScope()?.let {
scope.prototype = it // scope.prototype = it
} // }
evaluate(scope, jsStr) // evaluate(scope, jsStr)
} // }
return RhinoScriptEngine.eval(jsStr, SimpleBindings(bindings))
} }
fun put(key: String, value: String): String { fun put(key: String, value: String): String {
+13 -16
View File
@@ -1,8 +1,6 @@
package io.legado.app.rhino package io.legado.app.rhino
import com.script.RhinoContextFactory
import org.mozilla.javascript.Context import org.mozilla.javascript.Context
import org.mozilla.javascript.ContextFactory
import org.mozilla.javascript.Undefined import org.mozilla.javascript.Undefined
import org.mozilla.javascript.Wrapper import org.mozilla.javascript.Wrapper
@@ -25,19 +23,18 @@ object Rhino {
return if (result1 is Undefined) null else result1 return if (result1 is Undefined) null else result1
} }
init { // init {
ContextFactory.initGlobal(object : RhinoContextFactory() { // ContextFactory.initGlobal(object : RhinoContextFactory() {
//
override fun makeContext(): Context { // override fun makeContext(): Context {
val cx = super.makeContext() // val cx = super.makeContext()
cx.languageVersion = 200 // cx.languageVersion = 200
cx.optimizationLevel = -1 // cx.optimizationLevel = -1
cx.setClassShutter(RhinoClassShutter) // cx.setClassShutter(RhinoClassShutter)
//cx.wrapFactory = RhinoWrapFactory // return cx
return cx // }
} //
// })
}) // }
}
} }
@@ -42,7 +42,7 @@ import java.security.*
* @since 1.6 * @since 1.6
*/ */
@Suppress("MemberVisibilityCanBePrivate") @Suppress("MemberVisibilityCanBePrivate")
class RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable { object RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
var accessContext: AccessControlContext? = null var accessContext: AccessControlContext? = null
private var topLevel: RhinoTopLevel? = null private var topLevel: RhinoTopLevel? = null
private val indexedProps: MutableMap<Any, Any?> private val indexedProps: MutableMap<Any, Any?>
@@ -198,6 +198,62 @@ class RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
} }
init { init {
ContextFactory.initGlobal(object : ContextFactory() {
override fun makeContext(): Context {
val cx = super.makeContext()
cx.languageVersion = 200
cx.optimizationLevel = -1
cx.setClassShutter(RhinoClassShutter)
cx.wrapFactory = RhinoWrapFactory
return cx
}
override fun hasFeature(cx: Context, featureIndex: Int): Boolean {
@Suppress("UNUSED_EXPRESSION")
return when (featureIndex) {
//Context.FEATURE_ENABLE_JAVA_MAP_ACCESS -> true
else -> super.hasFeature(cx, featureIndex)
}
}
override fun doTopCall(
callable: Callable,
cx: Context,
scope: Scriptable,
thisObj: Scriptable,
args: Array<Any>
): Any? {
var accContext: AccessControlContext? = null
val global = ScriptableObject.getTopLevelScope(scope)
val globalProto = global.prototype
if (globalProto is RhinoTopLevel) {
accContext = globalProto.accessContext
}
return if (accContext != null) AccessController.doPrivileged(
PrivilegedAction {
superDoTopCall(callable, cx, scope, thisObj, args)
}, accContext
) else superDoTopCall(
callable,
cx,
scope,
thisObj,
args
)
}
private fun superDoTopCall(
callable: Callable,
cx: Context,
scope: Scriptable,
thisObj: Scriptable,
args: Array<Any>
): Any? {
return super.doTopCall(callable, cx, scope, thisObj, args)
}
})
if (System.getSecurityManager() != null) { if (System.getSecurityManager() != null) {
try { try {
AccessController.checkPermission(AllPermission()) AccessController.checkPermission(AllPermission())
@@ -251,65 +307,4 @@ class RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
} }
} }
@Suppress("unused")
companion object {
init {
ContextFactory.initGlobal(object : ContextFactory() {
override fun makeContext(): Context {
val cx = super.makeContext()
cx.languageVersion = 200
cx.optimizationLevel = -1
cx.setClassShutter(RhinoClassShutter)
cx.wrapFactory = RhinoWrapFactory
return cx
}
override fun hasFeature(cx: Context, featureIndex: Int): Boolean {
@Suppress("UNUSED_EXPRESSION")
return when (featureIndex) {
//Context.FEATURE_ENABLE_JAVA_MAP_ACCESS -> true
else -> super.hasFeature(cx, featureIndex)
}
}
override fun doTopCall(
callable: Callable,
cx: Context,
scope: Scriptable,
thisObj: Scriptable,
args: Array<Any>
): Any? {
var accContext: AccessControlContext? = null
val global = ScriptableObject.getTopLevelScope(scope)
val globalProto = global.prototype
if (globalProto is RhinoTopLevel) {
accContext = globalProto.accessContext
}
return if (accContext != null) AccessController.doPrivileged(
PrivilegedAction {
superDoTopCall(callable, cx, scope, thisObj, args)
}, accContext
) else superDoTopCall(
callable,
cx,
scope,
thisObj,
args
)
}
private fun superDoTopCall(
callable: Callable,
cx: Context,
scope: Scriptable,
thisObj: Scriptable,
args: Array<Any>
): Any? {
return super.doTopCall(callable, cx, scope, thisObj, args)
}
})
}
}
} }
@@ -34,15 +34,15 @@ import java.lang.reflect.Method
import java.security.* import java.security.*
/** /**
* Implementation of `ScriptEngine` using the Mozilla Rhino * Implementation of `ScriptEngine` using the Mozilla Rhino
* interpreter. * interpreter.
* *
* @author Mike Grogan * @author Mike Grogan
* @author A. Sundararajan * @author A. Sundararajan
* @since 1.6 * @since 1.6
*/ */
@Suppress("MemberVisibilityCanBePrivate") @Suppress("MemberVisibilityCanBePrivate")
class RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable { object RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
var accessContext: AccessControlContext? = null var accessContext: AccessControlContext? = null
private var topLevel: RhinoTopLevel? = null private var topLevel: RhinoTopLevel? = null
private val indexedProps: MutableMap<Any, Any?> private val indexedProps: MutableMap<Any, Any?>
@@ -198,6 +198,62 @@ class RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
} }
init { init {
ContextFactory.initGlobal(object : ContextFactory() {
override fun makeContext(): Context {
val cx = super.makeContext()
cx.languageVersion = 200
cx.optimizationLevel = -1
cx.setClassShutter(RhinoClassShutter)
cx.wrapFactory = RhinoWrapFactory
return cx
}
override fun hasFeature(cx: Context, featureIndex: Int): Boolean {
return when (featureIndex) {
Context.FEATURE_ENABLE_JAVA_MAP_ACCESS -> true
else -> super.hasFeature(cx, featureIndex)
}
}
override fun doTopCall(
callable: Callable,
cx: Context,
scope: Scriptable,
thisObj: Scriptable,
args: Array<Any>
): Any? {
var accContext: AccessControlContext? = null
val global = ScriptableObject.getTopLevelScope(scope)
val globalProto = global.prototype
if (globalProto is RhinoTopLevel) {
accContext = globalProto.accessContext
}
return if (accContext != null) AccessController.doPrivileged(
PrivilegedAction {
superDoTopCall(callable, cx, scope, thisObj, args)
}, accContext
) else superDoTopCall(
callable,
cx,
scope,
thisObj,
args
)
}
private fun superDoTopCall(
callable: Callable,
cx: Context,
scope: Scriptable,
thisObj: Scriptable,
args: Array<Any>
): Any? {
return super.doTopCall(callable, cx, scope, thisObj, args)
}
})
if (System.getSecurityManager() != null) { if (System.getSecurityManager() != null) {
try { try {
AccessController.checkPermission(AllPermission()) AccessController.checkPermission(AllPermission())
@@ -251,64 +307,4 @@ class RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
} }
} }
@Suppress("unused")
companion object {
init {
ContextFactory.initGlobal(object : ContextFactory() {
override fun makeContext(): Context {
val cx = super.makeContext()
cx.languageVersion = 200
cx.optimizationLevel = -1
cx.setClassShutter(RhinoClassShutter)
cx.wrapFactory = RhinoWrapFactory
return cx
}
override fun hasFeature(cx: Context, featureIndex: Int): Boolean {
return when (featureIndex) {
Context.FEATURE_ENABLE_JAVA_MAP_ACCESS -> true
else -> super.hasFeature(cx, featureIndex)
}
}
override fun doTopCall(
callable: Callable,
cx: Context,
scope: Scriptable,
thisObj: Scriptable,
args: Array<Any>
): Any? {
var accContext: AccessControlContext? = null
val global = ScriptableObject.getTopLevelScope(scope)
val globalProto = global.prototype
if (globalProto is RhinoTopLevel) {
accContext = globalProto.accessContext
}
return if (accContext != null) AccessController.doPrivileged(
PrivilegedAction {
superDoTopCall(callable, cx, scope, thisObj, args)
}, accContext
) else superDoTopCall(
callable,
cx,
scope,
thisObj,
args
)
}
private fun superDoTopCall(
callable: Callable,
cx: Context,
scope: Scriptable,
thisObj: Scriptable,
args: Array<Any>
): Any? {
return super.doTopCall(callable, cx, scope, thisObj, args)
}
})
}
}
} }