瀏覽代碼

More updates for Java validations on darwin.

Also, now require version 8u52+, as pack200 algo changed after 8u45.
Daniel Scalzi 7 年之前
父節點
當前提交
fc81016dc6
共有 1 個文件被更改,包括 57 次插入6 次删除
  1. 57 6
      app/assets/js/assetguard.js

+ 57 - 6
app/assets/js/assetguard.js

@@ -612,7 +612,27 @@ class AssetGuard extends EventEmitter {
     }
 
     /**
-     * Validates the output of a JVM's properties. Currently validates that a JRE is x64.
+     * Parses a **full** Java Runtime version string and resolves
+     * the version information. Uses Java 8 formatting.
+     * 
+     * @param {string} verString Full version string to parse.
+     * @returns Object containing the version information.
+     */
+    static parseJavaRuntimeVersion(verString){
+        // 1.{major}.0_{update}-b{build}
+        // ex. 1.8.0_152-b16
+        const ret = {}
+        let pts = verString.split('-')
+        ret.build = parseInt(pts[1].substring(1))
+        pts = verString[0].split('_')
+        ret.update = parseInt(pts[1])
+        ret.major = parseInt(pts[0].split['.'][1])
+        return ret
+    }
+
+    /**
+     * Validates the output of a JVM's properties. Currently validates that a JRE is x64
+     * and that the major = 8, update > 52.
      * 
      * @param {string} stderr The output to validate.
      * 
@@ -622,15 +642,34 @@ class AssetGuard extends EventEmitter {
     static _validateJVMProperties(stderr){
         const res = stderr
         const props = res.split('\n')
+
+        const goal = 2
+        let checksum = 0
+
         for(let i=0; i<props.length; i++){
             if(props[i].indexOf('sun.arch.data.model') > -1){
                 let arch = props[i].split('=')[1].trim()
                 console.log(props[i].trim())
-                return parseInt(arch) >= 64
+                if(parseInt(arch) === 64){
+                    ++checksum
+                    if(checksum === goal){
+                        return true
+                    }
+                }
+            } else if(props[i].indexOf('java.runtime.version') > -1){
+                let verString = props[i].split('=')[1].trim()
+                console.log(props[i].trim())
+                const verOb = AssetGuard.parseJavaRuntimeVersion(verString)
+                if(verOb.major === 8 && verOb.update > 52){
+                    ++checksum
+                    if(checksum === goal){
+                        return true
+                    }
+                }
             }
         }
-        // sun.arch.data.model not found?
-        return false
+        
+        return checksum === goal
     }
 
     /**
@@ -722,7 +761,12 @@ class AssetGuard extends EventEmitter {
                             console.log(err)
                         } else {
                             for(let i=0; i<files.length; i++){
-                               res.add(path.join(x64RuntimeDir, files[i]))
+                                if(process.platform === 'darwin'){
+                                    // On darwin, Java home is root/Contents/Home
+                                    res.add(path.join(x64RuntimeDir, files[i], 'Contents', 'Home'))
+                                } else {
+                                    res.add(path.join(x64RuntimeDir, files[i]))
+                                }
                             }
                             resolve(res)
                         }
@@ -902,17 +946,24 @@ class AssetGuard extends EventEmitter {
 
         const pathSet = new Set()
 
+        // Check Internet Plugins folder.
         const iPPath = AssetGuard._scanInternetPlugins()
         if(iPPath != null){
             pathSet.add(iPPath)
         }
 
+        // Check the JAVA_HOME environment variable.
         const jHome = AssetGuard._scanJavaHome()
         if(jHome != null){
             pathSet.add(jHome)
         }
 
-        let pathArr = Array.from(pathSet)
+        // Get possible paths from the data directory.
+        const pathSet2 = await AssetGuard._scanDataFolder(dataDir)
+
+        // TODO Sort by highest version.
+
+        let pathArr = Array.from(pathSet2).concat(Array.from(pathSet))
         for(let i=0; i<pathArr.length; i++) {
             const execPath = AssetGuard.javaExecFromRoot(pathArr[i])
             let res = await AssetGuard._validateJavaBinary(execPath)