Преглед изворни кода

Fixes related to offline startup.

Fixed incorrect function name for local distro index loading.
Fixed mojang tooltip not showing statuses when offline.
Added timeout of 2500ms to news loading, remote distro index retrieval, and mojang status loading.
Updates async to fix lodash vulnerability.
Daniel Scalzi пре 7 година
родитељ
комит
a67dac23cf
6 измењених фајлова са 82 додато и 59 уклоњено
  1. 5 1
      app/assets/js/assetguard.js
  2. 7 2
      app/assets/js/mojang.js
  3. 1 1
      app/assets/js/preloader.js
  4. 61 47
      app/assets/js/scripts/landing.js
  5. 7 7
      package-lock.json
  6. 1 1
      package.json

+ 5 - 1
app/assets/js/assetguard.js

@@ -382,8 +382,12 @@ class AssetGuard extends EventEmitter {
     static refreshDistributionDataRemote(launcherPath){
     static refreshDistributionDataRemote(launcherPath){
         return new Promise((resolve, reject) => {
         return new Promise((resolve, reject) => {
             const distroURL = 'http://mc.westeroscraft.com/WesterosCraftLauncher/westeroscraft.json'
             const distroURL = 'http://mc.westeroscraft.com/WesterosCraftLauncher/westeroscraft.json'
+            const opts = {
+                url: distroURL,
+                timeout: 2500
+            }
             const distroDest = path.join(launcherPath, 'westeroscraft.json')
             const distroDest = path.join(launcherPath, 'westeroscraft.json')
-            request(distroURL, (error, resp, body) => {
+            request(opts, (error, resp, body) => {
                 if(!error){
                 if(!error){
                     distributionData = JSON.parse(body)
                     distributionData = JSON.parse(body)
 
 

+ 7 - 2
app/assets/js/mojang.js

@@ -89,14 +89,19 @@ exports.status = function(){
     return new Promise((resolve, reject) => {
     return new Promise((resolve, reject) => {
         request.get('https://status.mojang.com/check',
         request.get('https://status.mojang.com/check',
         {
         {
-            json: true
+            json: true,
+            timeout: 2500
         },
         },
         function(error, response, body){
         function(error, response, body){
 
 
             if(error || response.statusCode !== 200){
             if(error || response.statusCode !== 200){
                 console.warn('Unable to retrieve Mojang status.')
                 console.warn('Unable to retrieve Mojang status.')
                 console.debug('Error while retrieving Mojang statuses:', error)
                 console.debug('Error while retrieving Mojang statuses:', error)
-                reject(error || response.statusCode)
+                //reject(error || response.statusCode)
+                for(let i=0; i<statuses.length; i++){
+                    statuses[i].status = 'grey'
+                }
+                resolve(statuses)
             } else {
             } else {
                 for(let i=0; i<body.length; i++){
                 for(let i=0; i<body.length; i++){
                     const key = Object.keys(body[i])[0]
                     const key = Object.keys(body[i])[0]

+ 1 - 1
app/assets/js/preloader.js

@@ -35,7 +35,7 @@ AssetGuard.refreshDistributionDataRemote(ConfigManager.getLauncherDirectory()).t
 
 
     console.log('%c[Preloader]', 'color: #a02d2a; font-weight: bold', 'Attempting to load an older version of the distribution index.')
     console.log('%c[Preloader]', 'color: #a02d2a; font-weight: bold', 'Attempting to load an older version of the distribution index.')
     // Try getting a local copy, better than nothing.
     // Try getting a local copy, better than nothing.
-    AssetGuard.refreshDistributionDateLocal(ConfigManager.getLauncherDirectory()).then((data) => {
+    AssetGuard.refreshDistributionDataLocal(ConfigManager.getLauncherDirectory()).then((data) => {
         console.log('%c[Preloader]', 'color: #a02d2a; font-weight: bold', 'Successfully loaded an older version of the distribution index.')
         console.log('%c[Preloader]', 'color: #a02d2a; font-weight: bold', 'Successfully loaded an older version of the distribution index.')
 
 
         onDistroLoad(data)
         onDistroLoad(data)

+ 61 - 47
app/assets/js/scripts/landing.js

@@ -149,6 +149,7 @@ const refreshMojangStatuses = async function(){
     try {
     try {
         const statuses = await Mojang.status()
         const statuses = await Mojang.status()
         greenCount = 0
         greenCount = 0
+        greyCount = 0
 
 
         for(let i=0; i<statuses.length; i++){
         for(let i=0; i<statuses.length; i++){
             const service = statuses[i]
             const service = statuses[i]
@@ -167,17 +168,23 @@ const refreshMojangStatuses = async function(){
 
 
             if(service.status === 'yellow' && status !== 'red'){
             if(service.status === 'yellow' && status !== 'red'){
                 status = 'yellow'
                 status = 'yellow'
-                continue
             } else if(service.status === 'red'){
             } else if(service.status === 'red'){
                 status = 'red'
                 status = 'red'
-                break
+            } else {
+                if(service.status === 'grey'){
+                    ++greyCount
+                }
+                ++greenCount
             }
             }
 
 
-            ++greenCount
         }
         }
 
 
-        if(greenCount == statuses.length){
-            status = 'green'
+        if(greenCount === statuses.length){
+            if(greyCount === statuses.length){
+                status = 'grey'
+            } else {
+                status = 'green'
+            }
         }
         }
 
 
     } catch (err) {
     } catch (err) {
@@ -915,51 +922,58 @@ function loadNews(){
         const distroData = AssetGuard.getDistributionData()
         const distroData = AssetGuard.getDistributionData()
         const newsFeed = distroData['news_feed']
         const newsFeed = distroData['news_feed']
         const newsHost = new URL(newsFeed).origin + '/'
         const newsHost = new URL(newsFeed).origin + '/'
-        $.get(newsFeed, (data) => {
-            const items = $(data).find('item')
-            const articles = []
-
-            for(let i=0; i<items.length; i++){
-                // JQuery Element
-                const el = $(items[i])
-
-                // Resolve date.
-                const date = new Date(el.find('pubDate').text()).toLocaleDateString('en-US', {month: 'short', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric'})
-
-                // Resolve comments.
-                let comments = el.find('slash\\:comments').text() || '0'
-                comments = comments + ' Comment' + (comments === '1' ? '' : 's')
-
-                // Fix relative links in content.
-                let content = el.find('content\\:encoded').text()
-                let regex = /src="(?!http:\/\/|https:\/\/)(.+)"/g
-                let matches
-                while(matches = regex.exec(content)){
-                    content = content.replace(matches[1], newsHost + matches[1])
-                }
-
-                let link   = el.find('link').text()
-                let title  = el.find('title').text()
-                let author = el.find('dc\\:creator').text()
-
-                // Generate article.
-                articles.push(
-                    {
-                        link,
-                        title,
-                        date,
-                        author,
-                        content,
-                        comments,
-                        commentsLink: link + '#comments'
+        $.ajax(
+        {
+            url: newsFeed,
+            success: (data) => {
+                const items = $(data).find('item')
+                const articles = []
+
+                for(let i=0; i<items.length; i++){
+                    // JQuery Element
+                    const el = $(items[i])
+
+                    // Resolve date.
+                    const date = new Date(el.find('pubDate').text()).toLocaleDateString('en-US', {month: 'short', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric'})
+
+                    // Resolve comments.
+                    let comments = el.find('slash\\:comments').text() || '0'
+                    comments = comments + ' Comment' + (comments === '1' ? '' : 's')
+
+                    // Fix relative links in content.
+                    let content = el.find('content\\:encoded').text()
+                    let regex = /src="(?!http:\/\/|https:\/\/)(.+)"/g
+                    let matches
+                    while(matches = regex.exec(content)){
+                        content = content.replace(matches[1], newsHost + matches[1])
                     }
                     }
-                )
-            }
+
+                    let link   = el.find('link').text()
+                    let title  = el.find('title').text()
+                    let author = el.find('dc\\:creator').text()
+
+                    // Generate article.
+                    articles.push(
+                        {
+                            link,
+                            title,
+                            date,
+                            author,
+                            content,
+                            comments,
+                            commentsLink: link + '#comments'
+                        }
+                    )
+                }
+                resolve({
+                    articles
+                })
+            },
+            timeout: 2500
+        }).catch(err => {
             resolve({
             resolve({
-                articles
+                articles: null
             })
             })
-        }).catch(err => {
-            reject(err)
         })
         })
     })
     })
 }
 }

+ 7 - 7
package-lock.json

@@ -178,11 +178,11 @@
       "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
       "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
     },
     },
     "async": {
     "async": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
-      "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
+      "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
       "requires": {
       "requires": {
-        "lodash": "^4.14.0"
+        "lodash": "^4.17.10"
       }
       }
     },
     },
     "async-exit-hook": {
     "async-exit-hook": {
@@ -1755,9 +1755,9 @@
       }
       }
     },
     },
     "lodash": {
     "lodash": {
-      "version": "4.17.4",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
-      "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
+      "version": "4.17.10",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+      "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
     },
     },
     "lodash.isequal": {
     "lodash.isequal": {
       "version": "4.5.0",
       "version": "4.5.0",

+ 1 - 1
package.json

@@ -29,7 +29,7 @@
   "homepage": "http://www.westeroscraft.com/",
   "homepage": "http://www.westeroscraft.com/",
   "dependencies": {
   "dependencies": {
     "adm-zip": "^0.4.11",
     "adm-zip": "^0.4.11",
-    "async": "^2.6.0",
+    "async": "^2.6.1",
     "discord-rpc": "^3.0.0-beta.10",
     "discord-rpc": "^3.0.0-beta.10",
     "ejs": "^2.6.1",
     "ejs": "^2.6.1",
     "ejs-electron": "^2.0.3",
     "ejs-electron": "^2.0.3",