Horis 1 سال پیش
والد
کامیت
009f2b0439

+ 35 - 10
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
     }
 
 }

+ 10 - 2
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)
     }