From 0574e92ce1fb4efe9236ab4858881deb158a4351 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 15 May 2017 09:36:13 +0300 Subject: [PATCH 001/197] CloudCart CDN recognition added --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 61ce78ccf..3317e9fd6 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1431,7 +1431,7 @@ "meta": { "author": "^CloudCart LLC$" }, - "script": "/cloudcart-(?:assets|storage)/", + "script": "^cdncloudcart.com$", "icon": "cloudcart.svg", "website": "cloudcart.com" }, From 062fec7d954ffb8ae816e09ed4c3e1fa43946605 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 15 May 2017 09:38:56 +0300 Subject: [PATCH 002/197] CloudCart CDN recognition added --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 3317e9fd6..91a2c08de 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1431,7 +1431,7 @@ "meta": { "author": "^CloudCart LLC$" }, - "script": "^cdncloudcart.com$", + "script": "^cdncloudcart$", "icon": "cloudcart.svg", "website": "cloudcart.com" }, From efa5938400c640678b73b7769619c638ce988619 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 15 May 2017 09:49:35 +0300 Subject: [PATCH 003/197] Another pull request --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 91a2c08de..f9287c167 100755 --- a/src/apps.json +++ b/src/apps.json @@ -9878,4 +9878,4 @@ "51": "Landing Page Builders", "52": "Live Chat" } -} +} \ No newline at end of file From d4b9a93b09ca8774908a8bf06c292a1e4f55f46e Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 18 May 2017 09:18:28 +0300 Subject: [PATCH 004/197] CloudCart detection fixes --- src/apps.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index f9287c167..92404ff06 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1432,8 +1432,9 @@ "author": "^CloudCart LLC$" }, "script": "^cdncloudcart$", - "icon": "cloudcart.svg", - "website": "cloudcart.com" + + "website": "cloudcart.com", + "icon": "cloudcart.svg" }, "CodeIgniter": { "cats": [ From b00061de8c5909bf12dcaa8efdf39976ed04c5b7 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 18 May 2017 09:20:33 +0300 Subject: [PATCH 005/197] Fix --- src/apps.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 92404ff06..60e2f3f55 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1432,7 +1432,6 @@ "author": "^CloudCart LLC$" }, "script": "^cdncloudcart$", - "website": "cloudcart.com", "icon": "cloudcart.svg" }, From 3f5def738903a2414b8a22b8f69a20ae53831b2b Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 18 May 2017 10:18:01 +0300 Subject: [PATCH 006/197] Some fixes --- src/apps.json | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/apps.json b/src/apps.json index ce997356f..e87544803 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1449,17 +1449,6 @@ "script": "clipboard(?:\\.min)?\\.js", "website": "https://clipboardjs.com/" }, - "CloudCart": { - "cats": [ - "6" - ], - "icon": "cloudcart.svg", - "meta": { - "author": "^CloudCart LLC$" - }, - "script": "/cloudcart-(?:assets|storage)/", - "website": "http://cloudcart.com" - }, "CloudFlare": { "cats": [ "31" From 168a65cd1170add9284e35b011c7654bb9e00de5 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 18 May 2017 10:23:02 +0300 Subject: [PATCH 007/197] added https at the website line --- src/apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index e87544803..b33d0f073 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1468,7 +1468,7 @@ "Server": "cloudera" }, "icon": "Cloudera.png", - "website": "www.cloudera.com" + "website": "https://www.cloudera.com/" }, "CloudCart": { "cats": [ @@ -1478,7 +1478,7 @@ "author": "^CloudCart LLC$" }, "script": "^cdncloudcart$", - "website": "cloudcart.com", + "website": "https://cloudcart.com", "icon": "cloudcart.svg" }, "CodeIgniter": { From 3a04d493e0442112c550833879d651aec31ef57f Mon Sep 17 00:00:00 2001 From: Ali Aghaie Date: Mon, 15 Jan 2018 15:14:11 +0330 Subject: [PATCH 008/197] Add Shopfa --- src/apps.json | 13 +++++++++++++ src/icons/Shopfa.svg | 19 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/icons/Shopfa.svg diff --git a/src/apps.json b/src/apps.json index cb7e0418d..01fcc548e 100644 --- a/src/apps.json +++ b/src/apps.json @@ -8469,6 +8469,19 @@ ], "website": "http://shopery.com" }, + "Shopfa": { + "cats": [ + "6" + ], + "js": { + "shopfa": "" + }, + "meta": { + "generator": "^ShopFA ([\\d.]+)$\\;version:\\1" + }, + "icon": "Shopfa.svg", + "website": "https://shopfa.com" + }, "Shopify": { "cats": [ "6" diff --git a/src/icons/Shopfa.svg b/src/icons/Shopfa.svg new file mode 100644 index 000000000..dafcfd5c3 --- /dev/null +++ b/src/icons/Shopfa.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + From a2a18e12b592dda2f1ab6abd4aba1f06572a275f Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Sat, 27 Oct 2018 09:17:23 +1100 Subject: [PATCH 009/197] Improve parsing of minified HTML --- src/apps.json | 10 ++++---- src/drivers/npm/driver.js | 9 ++++--- src/drivers/npm/npm-shrinkwrap.json | 2 +- src/drivers/npm/package.json | 2 +- src/drivers/webextension/js/content.js | 29 +++++++++++++--------- src/drivers/webextension/js/lib/network.js | 2 +- src/drivers/webextension/manifest.json | 2 +- 7 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/apps.json b/src/apps.json index 24247a389..2be018fc0 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2205,7 +2205,7 @@ "criteo_pubtag": "", "criteo_q": "" }, - "script":[ + "script": [ "//(?:cas\\.criteo\\.com|(?:[^/]\\.)?criteo\\.net)/", "//static.criteo.net/js/ld/ld.js" ], @@ -3710,7 +3710,7 @@ "_gat": "" }, "icon": "Google Analytics.svg", - "html": "]*type=[\"']googleanalytics[\"']", + "html": "]*type=[\"']googleanalytics[\"']", "js": { "GoogleAnalyticsObject": "", "gaGlobal": "" @@ -6767,7 +6767,7 @@ ], "headers": { "Server": "nginx(?:/([\\d.]+))?\\;version:\\1", - "X-Fastcgi-Cache": "" + "X-Fastcgi-Cache": "" }, "icon": "Nginx.svg", "website": "http://nginx.org/en" @@ -9704,7 +9704,7 @@ "script": [ "^//tags\\.tiqcdn\\.com/", "/tealium/utag\\.js$" - ], + ], "website": "http://tealium.com" }, "TeamCity": { @@ -11234,7 +11234,7 @@ "cats": [ 42 ], - "html":"", + "html": "", "script": "b\\.yjtag\\.jp/iframe", "icon": "yahoo.png", "website": "https://tagmanager.yahoo.co.jp/" diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js index d039c0eed..0bf265de3 100644 --- a/src/drivers/npm/driver.js +++ b/src/drivers/npm/driver.js @@ -1,5 +1,3 @@ - - const url = require('url'); const fs = require('fs'); const path = require('path'); @@ -77,7 +75,7 @@ class Driver { chunkSize: 5, debug: false, delay: 500, - htmlMaxCols: 2000, + htmlMaxCols: 200, htmlMaxRows: 3000, maxDepth: 3, maxUrls: 10, @@ -214,11 +212,14 @@ class Driver { } const headers = getHeaders(browser); - const html = this.getHtml(browser); + const html = this.getHtml(browser) + ;//.replace(new RegExp(`(.{${this.options.htmlMaxCols},}[^>]*>)<`, 'g'), (match, p1) => `${p1}\n<`); const scripts = getScripts(browser); const js = this.getJs(browser); const cookies = getCookies(browser); + // console.log({ html, foo: html.split('\n').length }); + this.wappalyzer.analyze(pageUrl, { headers, html, diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index 84a0377e5..f76d89198 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.5.3", + "version": "5.5.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index 0ffe06f8a..0d4e60cec 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "5.5.4", + "version": "5.5.5", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { diff --git a/src/drivers/webextension/js/content.js b/src/drivers/webextension/js/content.js index 4d29c981a..c28acab76 100644 --- a/src/drivers/webextension/js/content.js +++ b/src/drivers/webextension/js/content.js @@ -1,12 +1,25 @@ /** global: browser */ /** global: XMLSerializer */ +/* global browser, chrome */ +/* eslint-env browser */ + +function sendMessage(id, subject, callback) { + (chrome || browser).runtime.sendMessage({ + id, + subject, + source: 'content.js', + }, callback || (() => {})); +} + if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') { try { sendMessage('init', {}); // HTML - let html = new XMLSerializer().serializeToString(document).split('\n'); + let html = new XMLSerializer().serializeToString(document) + .replace(new RegExp('(.{1000,}[^>]*>)<', 'g'), (match, p1) => `${p1}\n<`) + .split('\n'); html = html .slice(0, 1000).concat(html.slice(html.length - 1000)) @@ -31,14 +44,14 @@ if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') { return; } - removeEventListener('message', onMessage); + window.removeEventListener('message', onMessage); sendMessage('analyze', { js: event.data.js }); script.remove(); }; - addEventListener('message', onMessage); + window.addEventListener('message', onMessage); sendMessage('get_js_patterns', {}, (response) => { if (response) { @@ -58,14 +71,6 @@ if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') { } } -function sendMessage(id, subject, callback) { - (chrome || browser).runtime.sendMessage({ - id, - subject, - source: 'content.js', - }, callback || (() => {})); -} - // https://stackoverflow.com/a/44774834 // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value -undefined; +undefined; // eslint-disable-line no-unused-expressions diff --git a/src/drivers/webextension/js/lib/network.js b/src/drivers/webextension/js/lib/network.js index ddcb6b2d4..5831a2e04 100644 --- a/src/drivers/webextension/js/lib/network.js +++ b/src/drivers/webextension/js/lib/network.js @@ -81,7 +81,7 @@ } function getFrame(getFrameDetails, callback) { - if (typeof chrome !== 'undefined') { + if (isChrome()) { chrome.webNavigation.getFrame(getFrameDetails, callback); } else if (typeof browser !== 'undefined') { const gettingFrame = browser.webNavigation.getFrame(getFrameDetails); diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index ab541bb2d..41b1b0886 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://www.wappalyzer.com", "description": "Identify web technologies", - "version": "5.5.4", + "version": "5.5.5", "default_locale": "en", "manifest_version": 2, "icons": { From ad3186060aaad0e38732ca4b6fd8c0706cd69443 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Sat, 27 Oct 2018 09:25:42 +1100 Subject: [PATCH 010/197] Improve parsing of minified HTML --- src/drivers/npm/driver.js | 8 +++----- src/drivers/npm/npm-shrinkwrap.json | 2 +- src/drivers/npm/package.json | 2 +- src/drivers/webextension/manifest.json | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js index 0bf265de3..aa9e6a78b 100644 --- a/src/drivers/npm/driver.js +++ b/src/drivers/npm/driver.js @@ -75,7 +75,7 @@ class Driver { chunkSize: 5, debug: false, delay: 500, - htmlMaxCols: 200, + htmlMaxCols: 2000, htmlMaxRows: 3000, maxDepth: 3, maxUrls: 10, @@ -212,14 +212,11 @@ class Driver { } const headers = getHeaders(browser); - const html = this.getHtml(browser) - ;//.replace(new RegExp(`(.{${this.options.htmlMaxCols},}[^>]*>)<`, 'g'), (match, p1) => `${p1}\n<`); + const html = this.getHtml(browser); const scripts = getScripts(browser); const js = this.getJs(browser); const cookies = getCookies(browser); - // console.log({ html, foo: html.split('\n').length }); - this.wappalyzer.analyze(pageUrl, { headers, html, @@ -286,6 +283,7 @@ class Driver { try { html = browser.html() + .replace(new RegExp(`(.{${this.options.htmlMaxCols},}[^>]*>)<`, 'g'), (match, p1) => `${p1}\n<`) .split('\n') .slice(0, this.options.htmlMaxRows / 2) .concat(html.slice(html.length - this.options.htmlMaxRows / 2)) diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index f76d89198..ae0b7f7cc 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.5.4", + "version": "5.5.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index 0d4e60cec..88df89fd2 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "5.5.5", + "version": "5.5.3", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 41b1b0886..a17e6b097 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://www.wappalyzer.com", "description": "Identify web technologies", - "version": "5.5.5", + "version": "5.5.3", "default_locale": "en", "manifest_version": 2, "icons": { From 4454694e026c69497f5961a01d1e2e6e71d7961f Mon Sep 17 00:00:00 2001 From: thivalle Date: Sun, 4 Nov 2018 20:35:46 -0200 Subject: [PATCH 011/197] Create bigbangshop.svg --- src/icons/bigbangshop.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/icons/bigbangshop.svg diff --git a/src/icons/bigbangshop.svg b/src/icons/bigbangshop.svg new file mode 100644 index 000000000..cfbeefd7b --- /dev/null +++ b/src/icons/bigbangshop.svg @@ -0,0 +1 @@ +logo_bbs From 8731b99ff40a8b54ae34206d3fa830e8006a22cc Mon Sep 17 00:00:00 2001 From: thivalle Date: Sun, 4 Nov 2018 20:47:04 -0200 Subject: [PATCH 012/197] Update apps.json List of 10 sites that use Big Bang Shop https://www.leschemises.com.br/ https://www.lojavirtualbacker.com.br/ https://www.klus.com.br/ https://www.bamaqconsorcio.com.br/ https://gifties.store/ https://www.goodiesinabox.com.br/ https://www.dashuniformes.com.br/ https://www.carroavenda.com.br/ https://zak.com.br/ https://www.lettebeachwear.com.br/ Thanks --- src/apps.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/apps.json b/src/apps.json index 2be018fc0..73c834a15 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1112,6 +1112,16 @@ "implies": "Python", "website": "http://docs.python.org/2/library/basehttpserver.html" }, + "BigBangShop": { + "cats": [ + 6 + ], + "headers": { + "X-SERVER": "BIGBANGSHOP*\w+" + }, + "icon": "bigbangshop.svg", + "website": "https://www.bigbangshop.com.br" + }, "BigDump": { "cats": [ 3 From b06ba0eab0c410087286b9bf102a1647a7578e04 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sat, 24 Nov 2018 03:03:09 +0000 Subject: [PATCH 013/197] Remove unused technologies (#2479) * Remove AMPcms - It's not used: https://www.wappalyzer.com/technologies/ampcms - Its website is dead: https://www.ampcms.org/ * Remove the icon as well * Remove Accessible Portal - It's not used: https://www.wappalyzer.com/technologies/accessible-portal - Its website is dead: http://www.accessibleportal.com/ * Remove WebOptimizer - Not used https://www.wappalyzer.com/technologies/web-optimizer - Website dead: https://www.web-optimizer.us/ * Remove SHopalyize - Not used: https://www.wappalyzer.com/technologies/shopalize - Website dead: http://www.shopalize.com/ * Remove NetMonitor - Not used: https://www.wappalyzer.com/technologies/netmonitor - Website dead: https://netmonitor.fi/en * Remove Gravity Insights Not used: https://www.wappalyzer.com/technologies/gravity-insights Website dead: http://insights.gravity.com/ * Remove Co2Stats Not used: https://www.wappalyzer.com/technologies/co2stats Website dead: http://ww12.co2stats.com/ * Remove bugsense - Not used: https://www.wappalyzer.com/technologies/bugsense - Website dead: http://bugsense.com/ --- src/apps.json | 87 -------------------------------- src/icons/AMPcms.png | Bin 779 -> 0 bytes src/icons/Accessible Portal.png | Bin 682 -> 0 bytes src/icons/BugSense.png | Bin 274 -> 0 bytes src/icons/CO2Stats.png | Bin 642 -> 0 bytes src/icons/Gravity Insights.png | Bin 256 -> 0 bytes src/icons/Netmonitor.png | Bin 902 -> 0 bytes src/icons/Shopalize.png | Bin 711 -> 0 bytes src/icons/Web Optimizer.png | Bin 520 -> 0 bytes 9 files changed, 87 deletions(-) delete mode 100644 src/icons/AMPcms.png delete mode 100644 src/icons/Accessible Portal.png delete mode 100644 src/icons/BugSense.png delete mode 100644 src/icons/CO2Stats.png delete mode 100644 src/icons/Gravity Insights.png delete mode 100644 src/icons/Netmonitor.png delete mode 100644 src/icons/Shopalize.png delete mode 100644 src/icons/Web Optimizer.png diff --git a/src/apps.json b/src/apps.json index 2be018fc0..559ba20ba 100644 --- a/src/apps.json +++ b/src/apps.json @@ -56,23 +56,6 @@ "icon": "ebis.png", "website": "http://www.ebis.ne.jp" }, - "AMPcms": { - "cats": [ - 1 - ], - "cookies": { - "AMP": "" - }, - "headers": { - "X-AMP-Version": "([\\d.]+)\\;version:\\1" - }, - "icon": "AMPcms.png", - "implies": "PHP", - "js": { - "amp_js_init": "" - }, - "website": "http://www.ampcms.org" - }, "AOLserver": { "cats": [ 22 @@ -124,17 +107,6 @@ "icon": "Accelerated-Mobile-Pages.svg", "website": "https://www.ampproject.org" }, - "Accessible Portal": { - "cats": [ - 1 - ], - "icon": "Accessible Portal.png", - "implies": "PHP", - "meta": { - "generator": "Accessible Portal" - }, - "website": "http://www.accessibleportal.com" - }, "Acquia Cloud": { "cats": [ 22 @@ -1376,17 +1348,6 @@ }, "website": "http://bubble.is" }, - "BugSense": { - "cats": [ - 10 - ], - "icon": "BugSense.png", - "js": { - "Bugsense": "" - }, - "script": "bugsense\\.js", - "website": "http://bugsense.com" - }, "BugSnag": { "cats": [ 10 @@ -1524,14 +1485,6 @@ }, "website": "http://www.cmsimple.org/en" }, - "CO2Stats": { - "cats": [ - 10 - ], - "html": "src=[^>]+co2stats\\.com/propres\\.php", - "icon": "CO2Stats.png", - "website": "http://co2stats.com" - }, "CPG Dragonfly": { "cats": [ 1 @@ -3924,16 +3877,6 @@ "script": "/wp-content/plugins/gravityforms/js/[^/]+\\.js\\?ver=([\\d.]+)$\\;version:\\1", "website": "http://gravityforms.com" }, - "Gravity Insights": { - "cats": [ - 10 - ], - "icon": "Gravity Insights.png", - "js": { - "gravityInsightsParams": "" - }, - "website": "http://insights.gravity.com" - }, "Green Valley CMS": { "cats": [ 1 @@ -6662,17 +6605,6 @@ "icon": "Netlify.svg", "website": "https://www.netlify.com/" }, - "Netmonitor": { - "cats": [ - 10 - ], - "icon": "Netmonitor.png", - "js": { - "netmonitor": "" - }, - "script": "netmonitor\\.fi/nmtracker\\.js", - "website": "http://netmonitor.fi/en" - }, "Neto": { "cats": [ 6 @@ -8773,17 +8705,6 @@ "script": "^https?://codice(?:business|ssl|pro|isp)?\\.shinystat\\.com/cgi-bin/getcod\\.cgi", "website": "http://shinystat.com" }, - "Shopalize": { - "cats": [ - 5, - 10 - ], - "icon": "Shopalize.png", - "js": { - "Shopalize": "" - }, - "website": "http://shopalize.com" - }, "Shopatron": { "cats": [ 6 @@ -10621,14 +10542,6 @@ "implies": "Haskell", "website": "http://www.stackage.org/package/warp" }, - "Web Optimizer": { - "cats": [ - 10 - ], - "html": "]*lang=\"wo\">", - "icon": "Web Optimizer.png", - "website": "http://www.web-optimizer.us" - }, "Web2py": { "cats": [ 18 diff --git a/src/icons/AMPcms.png b/src/icons/AMPcms.png deleted file mode 100644 index 1d528c84bdb09aba8603e3d4e108d919c1965c70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008gNkl<ZcmajL zeQ1nv00;2jHiK+nyJtO~d!BoqJ-54?=iJM-J-2al$8OJKcXrR&8*MUX!ZtRMVQ4{` zQVj}9D7A$m(j=Eupz<Hs7D9q(VUXtQDO=Tb_>jLTEG$$bkw{N%ZEasoP0e#n)1rRA zztv)~q>z81X*xkw)vl`QY81`!L6$x6dc9Cp6_H2;fk5D%D2iqhkJ)Ta@OV5sa`Qa> zY3YW|44tmB(+vSCgKpwXVzi*30HI(IvMk?a7$$|p;(0#Z$O<i1o|-^(^~$ud%S#Ls z$p`~QH_G|)x8mYr@I2o@Vx?0|645Q5JKeOcwc^Z~Q-@!l?LPUTbLZM<bG4)rosl&) z`u%>`Y_>}zo=pw2+0Naq{hvO*1n>^{eh)tfAE2lE#LxD1Wg5{roH=(SNqRzJZCoZN z)RpHRym@Xt@IDIs_yl~pfnNh{cyp@-t807@n-|#=9ZuIqo6UBgjN&+MiXdc`W@eca zrI|BtUua^1r@QdS5b!D+1Dz94UN~d8ZK;$c=Q%5RUg#pDoK9!0-EKcXbaIaC_Vqdn zxSs+1dIaDi@HhqUc8)>4-#WauO0;K*oXcorU1XG^DBad<={nIhFI5hnUd#hmQh_h4 zfqpB{n}~r;X=n^PAMf9~Ace$I6y>tl>-}nES#IT$dCZ2&yr;d3SiEUZ!so7Jyf|dQ zku|pAEsgUlNjz@1yCW0|!j>(aC%Ww|;mi$H_MUy!_P0k{W(@9Fk$tmXbA*X*%2X<e z#Ns$EtEi}GC>RPNFW+-q&Ua5Dx{d~E{N8$gG8y4==hO*;P(b1lMRAYM=R-IgMp;?7 zZ<g2B5mW=A(EQ@L!P3%((1LK(;c#4K7$%j(!!XP^p68FrvW$|F5@?!+h2<59EUbW{ zsxX_)cMJxDk^B!$)0!X%=d4z1pT%N%W-^(sQ53a`rs-r7$8Y{&3<MPMz%T#+002ov JPDHLkV1kJGa-skL diff --git a/src/icons/Accessible Portal.png b/src/icons/Accessible Portal.png deleted file mode 100644 index 688c1122ec2e721696fa7ec48fc25053cae77085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 682 zcmV;b0#*HqP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007UNkl<ZcmdtO z;WHC_00;12=X%qtT&2289bme;U0v7W60W7Lth&S{x;ph-xR%U1qv@Qoumyv0B)2;_ zCZoC9Ba*PIZLralZ7xAGE4p1Wwr}-fZ#sWK*N6OF+D2MJuGKLc!-W4S8D-h^>8<ie z^LQp5)8RZ!28l7x$bqfPhpeT4s%LL-G0jT3Ps8~~Y2C%mDIHnmr;uD6i=K9Gz(9aW z0(|kF01R%#2{UFF2&EqR;&>57;Dyr_7Y%bGIf>}q`5Ao#CWZg(z4{_~ZQJ#Cc9Z`Q zrU+onU=t^>@(XY*`RTn5_5(jY1#zNKD`c)qkh@@3o77Y>I(J2Ev<KuppO1Ue-_OMN zO%sr(cA~}{i)F_;0&0XBo>7L5uIdEeaw<ZLg78(k8KyBFOE8Aev_WugtB{+k1DzwW z+|uZREO0c_5TjB-q<=^tmR-R5K&)(MELKE^*$#7$K=eOXLVgjxM+j>aDJ&h*YNtRQ znHi&INFEPEqu&ok*F3^r&63|x`{ED+69=*39IRVopbtn|utyYDEpeJT${KCz>q>3H za?5x)1f>ny=xT>8<k<rDwF1n6m&6G}qDW-9V>0T*iq7Y<!@4U0aAyG?T);CM@Dl*L zs~q+N^{~;~tVmavVt8R2ae_LF0kI1f`_6Q-TPsC0c03{zIp8LVj7om4LSIl)BI6I_ zAHVbl4N`M7`4hewH=^a>2Q<2_{?H_67d2h&qhvDSmdb<IoifLsyVB_`H@a7SStAzZ z$CVvqEifs(@G3%xo?tmNXA9Lze(cS<_PnFK1{IAf`*f1`wpXIC(8<5$Cm1<)GO3=D Q<p2Nx07*qoM6N<$g8Z&Gg#Z8m diff --git a/src/icons/BugSense.png b/src/icons/BugSense.png deleted file mode 100644 index 13eafe257606623a9b5decc348a53902ff891f4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ipSBACkNkTd{2g-nY8B2ov zf*Bm1-ADs+CV09yhDb=BJ-9LVkb^|S#r2z6j_!Yz%TT?fK(_NxZcEFJ19FXKq3e`S z+>p0BH}QtTp5y<sgx1gUo?m%&{#%&^$*D!gj;H0n7e9HCVp=gz>3>YB>8!i8m9tkK zx|d`k<Qnl;YGzWp=_?n(F!iaA?)_%jA|f}ZUu#3^#ToW?4{vPra5z)JzCPrw`HKd% dc|!Rw8H1PRxM`_Bt^>M_!PC{xWt~$(699fmb8`Ry diff --git a/src/icons/CO2Stats.png b/src/icons/CO2Stats.png deleted file mode 100644 index 47689c3be86c32a880ebb3acfe9820705e24c2fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 642 zcmV-|0)737P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0006>Nkl<ZILoDz z%}bO~6vlt=eEI5tS&=eXQG}R55$%PH#43XN52{rHK|s(t+O!I&Wt*s#1QB8d5)cFh zC1`32n%{~!Iy26UGxOei?wuPjG9;4(bm43+_j&j|_nZU&dAxr;7#!_)$^<y)XsC;` zv6bXt(_to8#^^eEk;rbsiRJHZIlaKd$|&i=2F^MBs86<-ValIiX!a`y8WV*6Ce9R6 zZe-ybgQNW@2?&QG6;#i|xH7Sb&sHf<EF7zi@MY?w8yJ2?V($@_)AKY$<7lIhvY|c} zXDKyDXZr;@Pn@TDPog$LHpsGB$`bcC(ME`P8f^u!nn*ZGQI!xY9B*m&fSnOmGK)@& zLW{;2gBXoiL5v{AAVvsu2{BUDR0)18kGKb~@6p!Mfh(6$5}=JH5{{v*MvM>*M+tNZ zV|CS_N{}z*N#{~z3Tc$pm8udL#0uKT_MNFU&_*%yYnqZOqI7_Wu9OkPD#R$PHLPV< zDd<A2L0h7O8|QjC*4#$6xQQtXVid+`thE$WfyRa=Zg=0M`_$#yKS(sSdH^p!J#z)M zh1d#iovp+OL?KqV({q1E>uUz7q>ChTYXqWD+a1tGFlCGRBYTx#VrA6z5A|{B%r!oY zzoW6fk)G3635CMUtWD!bd~Df}$|uP+wbmGfrdB6;JN$;>xgq*Kzu?gRqddL&+}ju5 zPuTNlsH?}1`rPX3<;vOXwR1neKI@*mf8>@n=H26ghi*N$<^Yyb^KNW$*v%z>y78qE cx7*VF2D<KMRN`m1KL7v#07*qoM6N<$f<_xGz5oCK diff --git a/src/icons/Gravity Insights.png b/src/icons/Gravity Insights.png deleted file mode 100644 index 57aeabc135e03b17ab4375896c413c263f2eae5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmV+b0ssDqP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0002TNkl<ZIE`aq znEBrlh#vy+e-iOkAeLhQ5>Lp`48z+QD9{YT-*6h>u=)T0hBN>F8>}H<2)cm6vj6`t zy!np;KK%UuKVT=31{`<>(e&W+|NjNY{{NqF8DWUPd;$i5Y=;35n<(#~`x^v6UVs@0 z(g?#Kd7=yeIUn6cAOJFiXfGf;cfm~}4L}Y=P@sV{!ZZ_Y04StkhQI*G5RkWsG604_ zUI2v&$q9)>`~hUZ843)T4>CXwh&KZ9Pm*k&`F{lv^8)~D(#$gF?~i)`0000<MNUMn GLSTa9*<)=0 diff --git a/src/icons/Netmonitor.png b/src/icons/Netmonitor.png deleted file mode 100644 index 45da0d73325886db8c175199e158b94508731f07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 902 zcmV;119|+3P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0009`Nkl<ZcmV}~ zZAhGT0Kk9$=fyjpQ@vB~MNPNN*Ob(Vjay_5!y*VaU`BpxMVnQFHJGCSRzU?(UkkR@ zfJFl$kch<!+1TdB=F)ZIn%bs%&bhl&@1A?^?Rg6U0000m75n$Onfc{|i>vF;XLH4f zBnh#d(bpfWtX-R%zke3E2><{f003t1&Z`qsvtKT*rH%vx0W}h=!B_4@0H$e^$>q4e z8n-8|-TH1OcK0}t2T%ZRPv7zUbm7YRk|XVVroENgKo$N<4WH&k0J%bmt&Bm1RxZ~C z0v}XVXzf?8-`)@86o3npcTVbgdtYzYlZ1l-+M6SUYpU>+sR*EGS|ql0=2sqJ+YW<! zb`7OA(_aBc#JTZ{ofmKXGt=AE>1k>V5$$QEq0Wya2><{9T-Rk|Q|EeYf%tlYnYnw; z&*K+%$*q0SF`;+{>cc_$J9g666he{&uH$g)=1o>sR;aJ9N0wzOG!GzHO>E)Vj(E87 z*p-&n6MHQOkl=|>4MGTP+v4+2KV$UWLyR68W$gF~ilzlXV<d>Is^~=vzuzB~w)I?- zX<G=O+*<~~^xxB*K6RSBVW64@<LA#Y`R5<lMjEw{K`rRm`W98f4l1T)QYw}xl}rQx z;J7Y@LV+@`m$#l$>BOe)*JEt_rI9bXG$)H_=@L(8Eg^Yi5!bT@4-+XeMjn9v{(gqv z7{)MiOcWcb+7YHBXy9{`XikC(DNWd$Lx^Hhj=uDA=Xxp=6|zDw;HRxQf-K7nz4{9M zeZ6Rb5Y=6~X_o)PTV_%aDg{@dVzO4-{hK^|;J~BU;_5q!qDt}P7CRflglnsjB#D-m z7P9FSc_l#3*Fc?EAYp<ffh9@oJ#pqk0Wk9Z*tfCe<k9+u2$4{b{ew{kp6y1#;nKte z86(Hs$|eE*3j1~}p(i$}?0NG?;GhC9(AV)vJelsEU3f4Q-_n^`en|cAmkCw-*jip> zJEOCi&SK;(vWCLQ;NXow^u3P&1OUMIr_N}<T%G><^4!v4Q&J_$HDm#rk;Jhq%t9W; zbs2f>#UD-{J$wvE0|)>B0DzCb_-4;!Y~k&D@r~W7Og8MZa&E1^@^MdF%hc<GFPsG~ c0RRB}54kRG7qdG?xc~qF07*qoM6N<$f~8@u)Bpeg diff --git a/src/icons/Shopalize.png b/src/icons/Shopalize.png deleted file mode 100644 index c73389954e3db02e4b4bad89d89d26fe40ffe1aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 711 zcmV;&0yzDNP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007xNkl<ZILn37 zTS!v@9LMnyu(zThD1?Blm!1mrC5Q+FBts=cER-N4P_2=KN@O8rX)J{>h15c+W-NzU zmP_4q7k6`4-HvBBrn{VNZF6(BvpTc$>nUh$(jUGrfBt-){u}^%{%vSr_LS2>C4y8O z4w8zE4oi#j-2vFc$+vXashCJh;mn-{OzDDfIfGmO1%#bKu14ef;&6syiS0D5JX;3M zWY9cpL2Nq>qtQcrow4wC1r&<4@npmgM%4@2_y*RIn^@N`qHe^FUP%Z-H3ce?gjj5D z$O~9W%9UDv0gN9;X0jT1UI;?afxT^3RE_$;z3ax<QV^z9uP!fOSn(M{P7Ua(dNA{) zVCQO)@>}szmq3jujtl*3c&7`(Oa$zC0gY*WnlelR1ILhAs0Yik_%o@WJ1BZ=Max?f zrnP`CFCbI9`rQ^S(7Ye%kR2?`W+hk(pi4wRPxv=?0h~Q5hXcHcDtxEYU>GK=l-`D| zvPP(^epV>7adQBr(epu|6`{CqA6#JvXqwI{F)agIPy(^R1IZ#;ode7pJeH?YKFTMK zphwe)WHOo6R?|b^+*POrvzT9Af1eAOH$r?_H@dYvlqn8j%=QG)%{ao;H$;2KkSe(b z@5Ng%^a&s}Z+LS6iN*V)YwkYIzB-6Dc^&SlFQa_C5aew>aI_SW7Cyi!M(lhOBo<#L z2avA%f3-?$P$?_Gjn5UR{&*ax2M<8q{s7>d1aqPS;Y)2Gdq%Oa>PzRovMmrFT6&Fk zaV@&%9-;Nqb#zX5U`C>Wd{POq-i6r}FJweu$Ks0easbjBuT+x3w49)zASgyj24gCF tnAADL5|cYR=%!K)RD>zA0o=d;;5V2i6V`32&_e(K002ovPDHLkV1f~KIxzqM diff --git a/src/icons/Web Optimizer.png b/src/icons/Web Optimizer.png deleted file mode 100644 index 64fe47fae0ccea8b8dd9aeda43d035d844a66fbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 520 zcmV+j0{8uiP)<h;3K|Lk000e1NJLTq000mG000mO0{{R3C@l|D0002<P)t-s00030 z|Nj61Knx5$oSe1P)ZFFe>ihfr0s=K4AWSJKR4OV|qN25<qqVB4zdSu{KtN{h?(#@T zZA(jUOiXZ1O>t3CbW~J!S66sgSb1Y(f@*4raBz%paE)+rlyPy6a&nJ)dX;>Aor8m% zhK8Pqh@gpypoxj6lar{Elc^vfSOx|-BqUIwp|h*2yt1;wxw*%?yUEJR)zZ@2)6?EH zHC@)$-re2g<KyY$<LVL;K@t;9^78fe_W1Yr`1kku`T6?!`TG_ZP#76fBO^~GB~btX zGdMYFot?IypR%8yv!9>0IXPfDI$}CIYyJKHl9H&Z>a{rl0004WQchC<K<3zH0002P zNkl<Z7#S_V1C|6a00hvgbSFKwZQJJB_dm^M^7`W;IvoW9qiGbbare*Yj$wQ>S`&4- zs7b5w4sBR%DjKR;9Res;Hgs(&MWB-lQgeQ(1#=w~vg?KTq;2y}EY{fq(uotpKTfab zyoPy7q!Ei884{)az9d3CMq)@USG?XtyDe^4u9hj}eRZ;SKcDY4vhK?R-e<|JP1;+^ zCoh1^&OfIy_wO>$zWY{rb~wz+R{sk|-1B01;&932z_JEO3GE+nLm1jVfMf6g0000< KMNUMnLSTZ7FYjRh From 4b4a667b30351cb08487f00edb287262d9fc2b35 Mon Sep 17 00:00:00 2001 From: Maruthi Adithya <maruthi12@protonmail.com> Date: Sat, 24 Nov 2018 08:33:54 +0530 Subject: [PATCH 014/197] FreshChat Application Added (#2481) - FreshChat Application Added --- src/apps.json | 8 ++++++++ src/icons/freshchat.png | Bin 0 -> 580 bytes 2 files changed, 8 insertions(+) create mode 100644 src/icons/freshchat.png diff --git a/src/apps.json b/src/apps.json index 559ba20ba..faadfe896 100644 --- a/src/apps.json +++ b/src/apps.json @@ -3260,6 +3260,14 @@ "script": "analytics\\.freespee\\.com/js/external/fs\\.(?:min\\.)?js", "website": "https://www.freespee.com" }, + "Freshchat": { + "cats": [ + 52 + ], + "icon": "freshchat.png", + "script": "wchat\\.freshchat\\.com/js/widget\\.js", + "website": "https://www.freshworks.com/live-chat-software/" + }, "Freshmarketer": { "cats": [ 10 diff --git a/src/icons/freshchat.png b/src/icons/freshchat.png new file mode 100644 index 0000000000000000000000000000000000000000..b79a05767d4f75dbba841393784abb05316d55ac GIT binary patch literal 580 zcmV-K0=xZ*P)<h;3K|Lk000e1NJLTq001Na001Ni1^@s6;Q*MJ0006DNkl<ZScT1) zu~Nc75QcdK9>GWO5i-MF&jUE4rKK}Gfc7+0wo&&O#|CUHl)^OHSO_*WIu;h_+(JO2 zhze(+(Vz#n2?_C^`HRe4a$k1$?l#F}Ldvq;Y);@R1FSNEr(DQOE>K0cykzC}W>}6) zPT=Y%z&w-B1|xwmkXEuFKV~4eX2NiR_98$6zSV+Qwwqm4RDN3vGk>AR2$WW2v_L7; z%yb|I(n=d<5-8<VO#tySu7$a&Q0uAf3s3Dfo@RRc!c&ElZUi8Z4rTEAk*lsd?<%ZX z-bfW{JsQyGGB*!gsdiL<I1UZtt3Mp8m1@TfL`~Q6%}Zn$UuSniGY}JaNC66_s(9X4 zg<6l~;(7o3zLqy4M2J{FK~X~QJAcrgNVOS=cud440ub#@|20shIZ%67&sv*`pHf5h zut27<-s|-3A(5hPc_UT7f7QC>ji$mh9^Pip1JWTc`#7}eJeua&A#aTHs?r=7=U}3} zK|VSv&4Fq>yoGk9IUt{7*1o&sw;rUlC2Ek)|7y<4xHj3o5?5P7(W(D!?o*5s18Hf$ z$2eeV@zKGO7ADYJFRs9KsroI;cC*yuWL_A{cC$txA1cvEfpo|)K_yXB#y=cJsIt2p z%a#DrnYx;y=<7dG=rl5chp~d_lmpCjz!C@PaF7lY*kuB{{xt_I<pA?hp8WyW8wH;$ Sq#3sW0000<MNUMnLSTY290qd$ literal 0 HcmV?d00001 From d9b7f6167622173b92f5a67441ec853fdfa6d3ef Mon Sep 17 00:00:00 2001 From: Nacim Goura <nacim.goura.dev@gmail.com> Date: Sat, 24 Nov 2018 04:04:33 +0100 Subject: [PATCH 015/197] add tailwindcss (#2483) I added tailwindcss to the detection list. Tested in Chrome. github : https://github.com/tailwindcss/tailwindcss --- src/apps.json | 8 ++++++++ src/icons/tailwindcss.svg | 1 + 2 files changed, 9 insertions(+) create mode 100644 src/icons/tailwindcss.svg diff --git a/src/apps.json b/src/apps.json index faadfe896..1e8d5c1b3 100644 --- a/src/apps.json +++ b/src/apps.json @@ -9577,6 +9577,14 @@ "script": "(?:TWikiJavascripts|twikilib(?:\\.min)?\\.js)", "website": "http://twiki.org" }, + "tailwindcss": { + "cats": [ + "18" + ], + "html": "<link[^>]+?href=\"[^\"]+tailwindcss(?:\\.min)?\\.css", + "icon": "tailwindcss.svg", + "website": "https://tailwindcss.com/" + }, "TYPO3 CMS": { "cats": [ 1 diff --git a/src/icons/tailwindcss.svg b/src/icons/tailwindcss.svg new file mode 100644 index 000000000..5b0424030 --- /dev/null +++ b/src/icons/tailwindcss.svg @@ -0,0 +1 @@ +<svg class="mx-auto block h-24 mb-3" viewBox="0 0 90 90" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><circle id="b" cx="40" cy="40" r="40"></circle><filter x="-8.8%" y="-6.2%" width="117.5%" height="117.5%" filterUnits="objectBoundingBox" id="a"><feOffset dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset><feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" in="shadowBlurOuter1"></feColorMatrix></filter><linearGradient x1="0%" y1="0%" y2="100%" id="c"><stop stop-color="#2383AE" offset="0%"></stop><stop stop-color="#6DD7B9" offset="100%"></stop></linearGradient></defs><g fill="none" fill-rule="evenodd"><g transform="translate(5 5)"><use fill="#000" filter="url(#a)" xlink:href="#b"></use><use fill="#FFF" xlink:href="#b"></use></g><path d="M25.6 33.92C27.52 26.24 32.32 22.4 40 22.4c11.52 0 12.96 8.64 18.72 10.08 3.84.96 7.2-.48 10.08-4.32-1.92 7.68-6.72 11.52-14.4 11.52-11.52 0-12.96-8.64-18.72-10.08-3.84-.96-7.2.48-10.08 4.32zM11.2 51.2c1.92-7.68 6.72-11.52 14.4-11.52 11.52 0 12.96 8.64 18.72 10.08 3.84.96 7.2-.48 10.08-4.32-1.92 7.68-6.72 11.52-14.4 11.52-11.52 0-12.96-8.64-18.72-10.08-3.84-.96-7.2.48-10.08 4.32z" fill="url(#c)" transform="translate(5 5)"></path></g></svg> \ No newline at end of file From dea7130531734cdbaa17a16148d1b840de1eee21 Mon Sep 17 00:00:00 2001 From: Nacim Goura <nacim.goura.dev@gmail.com> Date: Sat, 24 Nov 2018 04:04:52 +0100 Subject: [PATCH 016/197] improve detection docusaurus (#2486) This technology is not detected on all sites that use it. That's why I improved the detection to get more results. --- src/apps.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps.json b/src/apps.json index 1e8d5c1b3..4a07cfc61 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2484,6 +2484,9 @@ "React", "webpack" ], + "js": { + "search.indexName": "" + }, "meta": { "generator": "^Docusaurus$" }, From 6a4f21125a2c5d185e82fc8d1e4ec5beda46d4a1 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:05:09 +0000 Subject: [PATCH 017/197] Tighten a bit nelify detection (#2487) - The server header always _start_ with Netlify - Change the capitalization of the x-nf-request-id header --- src/apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index 4a07cfc61..f4353429d 100644 --- a/src/apps.json +++ b/src/apps.json @@ -6610,8 +6610,8 @@ 31 ], "headers": { - "x-nf-request-id": "", - "Server": "Netlify" + "X-NF-Request-ID": "", + "Server": "^Netlify" }, "icon": "Netlify.svg", "website": "https://www.netlify.com/" From 2a2265fe1f2948797397cad88bb478189ad574f4 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:05:25 +0000 Subject: [PATCH 018/197] Improve a bit wordpress detection via headers (#2488) * Improve a bit wordpress detection via headers This can be tested [here](https://thelion.ch/) * Remove a `$` --- src/apps.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps.json b/src/apps.json index f4353429d..7cdb26d57 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10895,6 +10895,9 @@ "PHP", "MySQL" ], + "headers": { + "link": "rel=\"https://api\\.w\\.org/\"" + }, "js": { "wp_username": "" }, From a8df962dfa582d675e01317fb10d0424e51935b6 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:05:37 +0000 Subject: [PATCH 019/197] Improve cloudflare detection (#2491) This can be checked [here](https://hellfest.fr/) --- src/apps.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps.json b/src/apps.json index 7cdb26d57..f38d9fc04 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1798,6 +1798,9 @@ "cf-ray": "" }, "icon": "CloudFlare.svg", + "cookies": { + "__cfduid": "" + }, "js": { "CloudFlare": "" }, From e492510f4e6e80fe32ccb9665a9cc088fd80fdec Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:05:51 +0000 Subject: [PATCH 020/197] Improve FluxBB detection (#2492) - Wappalyzer is now able to detect localized fluxbb forums, like [this one](http://www.hellfest-forum.fr/) - use https for the website --- src/apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index f38d9fc04..9b2d06f0e 100644 --- a/src/apps.json +++ b/src/apps.json @@ -3161,10 +3161,10 @@ "cats": [ 2 ], - "html": "Powered by (?:<strong>)?<a href=\"[^>]+fluxbb", + "html": "<p id=\"poweredby\">[^<]+<a href=\"https?://fluxbb\\.org/\">", "icon": "FluxBB.png", "implies": "PHP", - "website": "http://fluxbb.org" + "website": "https://fluxbb.org" }, "Flyspray": { "cats": [ From 4b047657b547f4ba633981c48b7561a3c5782f79 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:06:11 +0000 Subject: [PATCH 021/197] Add docker detection (#2493) This can be tested [here](https://www.qwant.com/?q=wappalyzer&t=web) --- src/apps.json | 9 +++++++++ src/icons/docker.png | Bin 0 -> 1871 bytes 2 files changed, 9 insertions(+) create mode 100644 src/icons/docker.png diff --git a/src/apps.json b/src/apps.json index 9b2d06f0e..b8934e930 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2495,6 +2495,15 @@ }, "website": "https://docusaurus.io/" }, + "Docker": { + "cats": [ + 28 + ], + "icon": "docker.png", + "implies": "Linux", + "html": "<!-- This comment is expected by the docker HEALTHCHECK -->", + "website": "https://www.docker.com/" + }, "Dojo": { "cats": [ 59 diff --git a/src/icons/docker.png b/src/icons/docker.png new file mode 100644 index 0000000000000000000000000000000000000000..307dd8f34f9f90c149752619e33a1f8aebfca950 GIT binary patch literal 1871 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 JPDHLkV1gxAfusNc literal 0 HcmV?d00001 From 4d4d9ae8b2e93e6f7c1316c47a54aace5823e653 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:06:23 +0000 Subject: [PATCH 022/197] Add detection of apache coyote detection (#2495) This can be tested [here](https://www.computerworld.com/article/3288925/computer-hardware/as-bitcoin-values-slide-high-end-gpu-prices-drop-too.html) --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index b8934e930..f894a797d 100644 --- a/src/apps.json +++ b/src/apps.json @@ -715,7 +715,7 @@ 22 ], "headers": { - "Server": "^Apache-Coyote", + "Server": "^Apache-Coyote(?:/([\\d.]+))?\\;version:\\1", "X-Powered-By": "\\bTomcat\\b(?:-([\\d.]+))?\\;version:\\1" }, "icon": "Apache Tomcat.svg", From e7296ae31565e94735c6fd7cf8d3aff3ff677545 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:06:31 +0000 Subject: [PATCH 023/197] Detect font awesome version (#2497) This common pattern is present, for example [here](https://www.corben.io//advanced-cors-techniques/) --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index f894a797d..d578c9c7d 100644 --- a/src/apps.json +++ b/src/apps.json @@ -3192,7 +3192,7 @@ 17 ], "html": [ - "<link[^>]* href=[^>]+font-awesome(?:\\.min)?\\.css", + "<link[^>]* href=[^>]+(?:([\\d.]+)/)?(?:css/)?font-awesome(?:\\.min)?\\.css\\;version:\\1", "<script[^>]* src=[^>]+fontawesome(?:\\.js)?" ], "icon": "Font Awesome.png", From caae139e74e59e2b2b36e17cd200eb523d9c1b59 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:06:42 +0000 Subject: [PATCH 024/197] Add AWS ELB detection (#2498) * Add AWS ELB detection This can be tested [here](https://aphextwin.warp.net/) * oups --- src/apps.json | 10 ++++++++++ src/icons/aws-elb.png | Bin 0 -> 1444 bytes 2 files changed, 10 insertions(+) create mode 100644 src/icons/aws-elb.png diff --git a/src/apps.json b/src/apps.json index d578c9c7d..fd59755e9 100644 --- a/src/apps.json +++ b/src/apps.json @@ -527,6 +527,16 @@ "icon": "aws-ec2.svg", "website": "http://aws.amazon.com/ec2/" }, + "Amazon ELB": { + "cats": [ + 31 + ], + "cookies": { + "AWSELB": "" + }, + "icon": "aws-elb.png", + "website": "https://aws.amazon.com/elasticloadbalancing/" + }, "Amazon S3": { "cats": [ 19 diff --git a/src/icons/aws-elb.png b/src/icons/aws-elb.png new file mode 100644 index 0000000000000000000000000000000000000000..8db61179600fd3682e7f5531f8c0b340701d3396 GIT binary patch literal 1444 zcmZuvdpMM76rVA6YBf@*+-k>Mn6wy%`9>;)(2mcbl$ti7hKi;cWYg9#V=hPuVJ@+h zhYhXTQp!^yTTyK`C2X78?eaVm!dwmZoo4^s^PKN|=e+OlocG)$3^>fv!odQ8Kv+hE zhs1z?pz&LX0#ebIt3)8oY8dn_p};KKggdzjR~6|ZkH#yaapz)PYGC|N@ou%dJnFXM z&(n#+nH1#-cV!`EBFFo)*n5gkQ=JM^3;Z-<ik1&)MSg}N&pFBZ`BKun;kZr&iG!Ub zA<oY^<QE(=h%b+Fsov^3ndb*|qsbu7joh6UKxzS1oe!;9v4|gpEvMrv7_O>(Xd;(t zC=NLL9Ra|`bA8A2d{y~W1%o)-->SQ?A1J^y+>^EJAOU5*0GcnN%|2;X38=u-iXZ?` zL=nq2;{hA>FKmj?k+eo7q;{r|M>4%kaZKk%$9&3+7y^nEHpVxx3De444a_NlF$bU= z33LKdBm55o&THa`r(ox2hsof)Ula%AhdQnaY?7v{vvk4$hYaulV30ty+X;=^K)uv! zNvrks2Yb^!-X5c9%3zIxDUTxFOkC5I>IH69g@MHpxN-&#xL1G{(Fv6?xXM_36-<!Q zaneW}NLUt$m%#*C6j8PX4}3x2z`NCPgt~Ylc%qT%a%B&xJ<$!6-?7iFgXPxA`nEI0 zv-<$0C&j%d)%|{Ez{7O+Cv1;?w&x#g&jF4X7~IQD@<^7~=uz*td4Wovk1~&@EQ$Wa z^ZCs8o#gw1Dy9L0^!OB&z(*wjGct||j87%@S5+se^QmefRW0#X7l&#D6woe>5Yn8D z)(XM4Kw1S;Tbl&-L|1=6*O0DjWa}<+bxj$%<|De6Y`qwokwCKr&|Cp+u9<V#z*`BH zrZ6K0j{UMe|1XdzK;~%lf`t~AR@T<mHnz65%a$*<vvYKGbXxTd))_}|b#+}$T^kBV z#l-GpCLGEa3Pobc$<p$Qib|RM{Dq56Ev>Cr+itYC-|Kle`119~vGMWGlao_Z(`t=I ztJCTA`k5I6pjjg^p8N<BF(XBU1Z~;gm6Txjl{sP&3S||FW`A%9KYd9iyX)3c>+(t( zB&VaEZG7MN@ite>uCzz-v3}_6N4a+F>+2%<L1%0g2Qipy^%%@KGKz=oE+%Xv5npWG zyEX@F&%VAPv?@rjefAaiUEg28n|K)+_&Qh+=Ye+dOBG_pNXMrbu}cqUs$pdMwK)?_ zYS;UbCnRrv@5OZYaQ8I@aI=>!MkT-ROTE3M@xdKzQDlHWAFe4}I>;-hVNO?3SWol2 z{*mZ0W`pzz#jm<<_!zp|n`enIJJIw#3F+{QWi?V2pT<CKZgpUU+~;-W?C~J2@=Xxi zvn$L{&mT!CbveCb!xf(L^<23V>RQ^4D;cA=B<pSVJyx_OJQ#AnsfMLjwXZ()vfw4D z2wSIs<8QjbtFTkRtwZry`{A_USnjF_G&Xl?X<(+?(9aez$qsCq_3k}B-WZzA<2yC! zqbW%dXON=BE7xUD{9O_(vKrs1*gZHn)ISg(C`S&rjnT5^-!(hFxU{Q-^YP7%*f0&O zxNMlt<%`6T636-|*~k&r{2Xe*;?BuV<uX=yAHAdDMo9)rA7*Knh+fjfyjVI^gHE`_ z{5o#j3qxL^E&cNj!k%{}H;8V-%KEJ;+}$bCsn#Jr9jV6LO3ar1P&8TQJ9XMox;NR! zr$pLr50527nL#JhYziEP%cz>hfzg`ly(sghqe6qNYKUfUC)nhFTYx}3P~GP=bQW$f OZf`^=9MZBeA@5(HqK%#a literal 0 HcmV?d00001 From 9ec61155b9e9bc96e7bd8b71d3d0af352a9b3312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Kowalski?= <pavelloz@Gmail.com> Date: Sat, 24 Nov 2018 04:07:00 +0100 Subject: [PATCH 025/197] Add PlatformOS (#2499) --- src/apps.json | 10 ++++++++++ src/icons/PlatformOS.svg | 1 + 2 files changed, 11 insertions(+) create mode 100644 src/icons/PlatformOS.svg diff --git a/src/apps.json b/src/apps.json index fd59755e9..64082e36a 100644 --- a/src/apps.json +++ b/src/apps.json @@ -7504,6 +7504,16 @@ }, "website": "http://planetplanet.org" }, + "PlatformOS": { + "cats": [ + 1 + ], + "icon": "PlatformOS.svg", + "headers": { + "x-powered-by": "^PlatformOS$" + }, + "website": "https://www.platform-os.com" + }, "Play": { "cats": [ 18 diff --git a/src/icons/PlatformOS.svg b/src/icons/PlatformOS.svg new file mode 100644 index 000000000..7388d841e --- /dev/null +++ b/src/icons/PlatformOS.svg @@ -0,0 +1 @@ +<svg height="700pt" preserveAspectRatio="xMidYMid meet" viewBox="0 0 700 700" width="700pt" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.1 0 0 -.1 0 700)"><path d="m3322 4704c-466-78-816-447-903-952-37-220-23-482 38-692 118-409 436-694 848-761 112-18 330-16 440 5 496 93 807 421 902 951 25 141 23 410-6 553-96 491-414 817-875 897-109 19-329 18-444-1zm288-415c280-45 468-323 487-719 14-297-58-542-204-700-106-115-245-169-398-156-192 15-336 119-431 311-149 302-131 759 41 1025 83 129 189 205 327 235 79 17 97 17 178 4z"/><path d="m5617 4704c-289-52-501-199-602-419-43-92-55-154-55-281 0-122 26-218 85-310 102-160 255-265 540-374 244-93 335-147 380-223 76-130 15-276-141-338-54-21-74-23-219-23-146 1-170 3-277 32-64 17-156 47-203 67-47 21-89 35-92 31-3-3-29-103-58-221l-53-216 57-25c73-33 199-69 314-91 134-25 480-25 595 0 349 77 548 239 633 517 27 88 32 259 10 350-46 191-193 356-417 468-34 17-126 57-205 88-341 134-423 204-406 350 5 51 41 103 95 139 119 78 388 73 619-10 54-20 102-37 107-38 6-1 37 94 69 212 49 173 57 215 46 222-35 22-210 71-315 89-139 24-386 26-507 4z"/><path d="m1299 4050c-77-12-173-46-238-82-63-36-166-130-206-189-25-35-30-38-36-22-4 10-8 63-8 118-2 158 11 146-150 143l-136-3 3-25c2-14 6-550 9-1192l5-1168h154 154v456 457l40-51c82-102 233-180 391-202 334-46 663 154 788 479 91 235 97 563 14 794-85 240-260 413-479 471-73 20-230 28-305 16zm193-270c165-62 277-210 323-425 43-206-1-472-104-624-217-319-716-245-840 126-19 56-21 86-21 284 0 247 8 300 63 404 65 122 177 213 308 250 73 20 196 14 271-15z"/></g></svg> \ No newline at end of file From 1e42e581e3e2b81b2384ff6f6270055d0b5673a5 Mon Sep 17 00:00:00 2001 From: Raz Ohad <admin@bainternet.info> Date: Sat, 24 Nov 2018 05:08:14 +0200 Subject: [PATCH 026/197] Added Elementor Detection (#2500) * Added Elementor Icon * added Elementor detection to apps.json * avoid overkill with patterns --- src/apps.json | 20 ++++++++++++++++++++ src/icons/Elementor.png | Bin 0 -> 2564 bytes 2 files changed, 20 insertions(+) create mode 100644 src/icons/Elementor.png diff --git a/src/apps.json b/src/apps.json index 64082e36a..4ff93980d 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2705,6 +2705,26 @@ ], "website": "http://www.ec-cube.net" }, + "Elementor": { + "cats": [ + 1, + 11, + 51 + ], + "html": [ + "<div class=(?:\"|')[^\"']*elementor", + "<section class=(?:\"|')[^\"']*elementor", + "<link [^>]*href=(?:\"|')[^\"']*elementor/assets", + "<link [^>]*href=(?:\"|')[^\"']*uploads/elementor/css" + ], + "js": { + "elementorFrontend.getElements": "" + }, + "script": "elementor/assets/js/[^/]+\\.js\\?ver=([\\d.]+)$\\;version:\\1", + "icon": "Elementor.png", + "implies": "WordPress", + "website": "https://elementor.com" + }, "ELOG": { "cats": [ 19 diff --git a/src/icons/Elementor.png b/src/icons/Elementor.png new file mode 100644 index 0000000000000000000000000000000000000000..87fc23e014e907cd2999e32faf2c3c26d7c9b6c8 GIT binary patch literal 2564 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 T<;mA7I0C@J^qR?=%Q(WnLRGZl literal 0 HcmV?d00001 From 823a5477845b08b29df09ce9ecee9b83dfec3a87 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:08:29 +0000 Subject: [PATCH 027/197] Remove unused (#2501) * Remove Moxa - [Undetected](https://www.wappalyzer.com/technologies/moxa) - [Website](https://www.moxa.com/) says "Industrial IOT", unlikely to be detected/useful * Remove Sparql - [undetected](https://www.wappalyzer.com/technologies/sparql) - no way to be detected, must have been a dependency at some point in the past * Remove ARC Forum - [Undetected](https://www.wappalyzer.com/technologies/arc-forum) - The [website](AAA) says: "This site is about Arc, a new dialect of Lisp.", and also "Arc is unfinished. It's missing things you'd need to solve some types of problems. But it works well for basic web apps.". I dont think that anyone is using it in production * Remove C++, since it can't be detected * Remove Gazelle - What.cd is dead - The project isn't maintained anymore --- src/apps.json | 46 +--------------------------------------- src/icons/Arc Forum.png | Bin 384 -> 0 bytes src/icons/C++.png | Bin 743 -> 0 bytes src/icons/Moxa.png | Bin 497 -> 0 bytes 4 files changed, 1 insertion(+), 45 deletions(-) delete mode 100644 src/icons/Arc Forum.png delete mode 100644 src/icons/C++.png delete mode 100644 src/icons/Moxa.png diff --git a/src/apps.json b/src/apps.json index 4ff93980d..c714adc68 100644 --- a/src/apps.json +++ b/src/apps.json @@ -805,14 +805,6 @@ "script": "arastta\\.js", "website": "http://arastta.org" }, - "Arc Forum": { - "cats": [ - 2 - ], - "html": "ping\\.src = node\\.href;\\s+[^>]+\\s+}\\s+</script>", - "icon": "Arc Forum.png", - "website": "http://arclanguage.org" - }, "ArcGIS API for JavaScript": { "cats": [ 35 @@ -1435,13 +1427,6 @@ "script": "^https?://s\\d\\.buysellads\\.com/", "website": "http://buysellads.com" }, - "C++": { - "cats": [ - 27 - ], - "icon": "C++.png", - "website": "http://isocpp.org" - }, "CDN77": { "cats": [ 31 @@ -3441,20 +3426,7 @@ }, "website": "https://get.gaug.es" }, - "Gazelle": { - "cats": [ - 29 - ], - "html": [ - "<!-- Extra divs, for stylesheet developers to add imagery -->", - "<link rel=\"alternate\" type=\"application/rss+xml\" href=\"[^\"]+\" title=\"[^\"]+ - Gazelle Change Log\"" - ], - "js": { - "GazURL": "" - }, - "website": "https://whatcd.github.io/Gazelle/" - }, - "Gentoo": { + "Gentoo": { "cats": [ 28 ], @@ -6487,16 +6459,6 @@ }, "website": "http://movabletype.org" }, - "Moxa": { - "cats": [ - 37 - ], - "headers": { - "Server": "MoxaHttp(?:/([\\d.]+))?\\;version:\\1" - }, - "icon": "Moxa.png", - "website": "http://moxa.com" - }, "Mozard Suite": { "cats": [ 1 @@ -9220,12 +9182,6 @@ }, "website": "http://www.schillmania.com/projects/soundmanager2" }, - "Sparql": { - "cats": [ - 27 - ], - "website": "https://www.w3.org/TR/sparql11-overview/" - }, "Sphinx": { "cats": [ 4 diff --git a/src/icons/Arc Forum.png b/src/icons/Arc Forum.png deleted file mode 100644 index c01f4e466af4dc06132c4001cea5bf0b5a567778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 384 zcmV-`0e}99P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0003;Nkl<ZC=~_3 zF-}!M6adh3=goZdn^-9tLq|nnLFp0<JF#{FZotMpum@LQYhghJok5Ht(F8QSdH0&2 zjq#EKFsCYr&^rLcy8h^6yf{7mo|&`=b2>h@-^2aA%S*khLblevetp%cIc5H(jp6pT z&d(1{P68Jf&dwYjT2~|uoj5qKZI2^b?;bs}ZGbtU3IOzN`*U^mzG@}LSgx;sXMW&_ z>OBwv0D9)#&CN$(x7%et%=wNZiU0thLkvI+9tZ$MQJ_G_QY+9Zu+0_B+}cuFS_;`} zhj`AHG45%s9P+m68+a`~xBinsvgghEuVXN1U`KA7Dr^xwa$zA@P}PwnNRk3TX+=>K zYz+Va0001>0RYeeIsgE4Bngsa0!)%5NfPv64;sbf)3V%yJ(H&d$(|q@&nST6NyGv+ e?y3SH_{D!k(UV_&QMph60000<MNUMnLSTY{hn%$l diff --git a/src/icons/C++.png b/src/icons/C++.png deleted file mode 100644 index bfb1f9856c161bbc8d825a3a4b5e2fd280a115a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmV<D0vP>?P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800086Nkl<ZSi|j? zPl!)Z6vuz>-S=jGjk3Tflku~V5(|@rA{!~Bgl0J#@@KD*$bzv!mSQKCCJRL&l9cSG z#=r5m*@&#nSWWnx>AX7by!+m7{N7I%bL-o=@7?pxIrrZ4@6~Fv<3Aq}a3Jvz>ss4J ztcuD;W=y5SDz2w#y2d%zAII@Q=mD^ocdJ?J@C>e0`Fs?f18-6ID-W!_0)z1ORAt1J z@+3*NqTs8i>?8CUc*^`WbkeMU=bMcx!?mOwVLQB?UgNmevD9UFQ?MLEj(~S+;32d2 zR}Lqm7hw}d`9L5l?5M+c(-@GH@E7j>x;gUWW=Dx9C{oznE|`hJys;$PJ<3PTU4{fY zb9zw$uWQOE6z?;;KU;E~3*mbpG{*=}th*0gSsEoUUN(2XJ;$Tv<4&D7Fmg<&K6e`7 zvE~Q)whrGXb>fWAg$%f($|reT<yq`oo*?*T&IwHu4&R7eZ@}sQFyM(AFu~(e!x(FB z*aR*h@D%hCeBXrfd{W+n%~KwmrhUxM^ZvA4rSO5P%un$CBJ-WOMidy}bbSwa1ctyp zFs^h+-}kGbTbMrtx4>;lQsA+Ks!$9$95UdpxdPv5d<W~2H0&j(+@sa2T2`7HP<+KW z;kKMRwQ=8z;P=qQCRapW`4-wCnUZT+Yxv@j6Ye)*cqR~r*~dM)vqgbe&*l!k7vdMq z6srcxf2aX(3L+pgtYH)vC8CB2-_lfk!<@n~vz8b|QJ`<=ZY34lVl-Y-jQlZ2BB7ud zHQgfw%Q2y~fu*^&0)iDNJqkWlQI4lIBnbTMH6&xu=hBo&v4Z|I>tArR^{qA}{=LqV zc1z;Dpd}lY%xFq+<$a-M*R&6XyR~8pc4@tc+R>EGv@K8Dp*-|sl9~?5)!O`HGCTg+ Z_zlsxkTqS(vS$DQ002ovPDHLkV1i5eZe9QY diff --git a/src/icons/Moxa.png b/src/icons/Moxa.png deleted file mode 100644 index 03a2e6f931765e9ab685480ef3ffc5f4aacecb73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmV<N0S^9&P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0005FNkl<ZILpP8 z+be@%9LJv~rNku{l>fq|lz%{R&6RTDoO4VLkr`q$%pulHIg?m243lMzM9pDpUWYk^ zIfU5z^?2Ubn`OCK@zm3M@qB-u-}m?H`w|3p2>Bxb51!}!1Df}2sI!})+**d`<=KBZ z?`2=>C5M`gMbz6@(0;Hb07!2oNNX`jV;<6$#=kf9IcJX^MC%kxM_LLItXBvCnL!De zwg#k4P9KV(-Q5to^6-kby<Q#(Q+*)K`5>K@>_!Z$L<f`<(p`&m^Av@YAw*LSi~CqC z6s#9oj35oUh#l=j;;f$PN)S1u76AhdAng^{zCMTCI!}e!h|x9S{OO(*8}>J8=K_Rw zRKRg_fgH;Wa~df*_ylO=SaZAB-0_n=AoZC@HX2}ca|qW~Gk|VylL1pq;}lSgh#{4) zgQe3WCg2|K5Y<nYr7A@j9gQ^RBWrb9T4w6Pm;f058lk(2iA*Pll4zcDf~ZSC6d8z{ z=)&v!oAj1s9Hb625TsWMfU4bflv_=3dal^!zXCJsa-fA~gL}C33Dk&l2W4w>P&#Zs nlgI#mgCyng-~NT)0Ri0)w<lQunJ>UC00000NkvXXu0mjf)cf6T From 21a7bdef049da1d12aad9c4c058d3e937f888417 Mon Sep 17 00:00:00 2001 From: benzel <info@witt-it.de> Date: Sat, 24 Nov 2018 04:08:42 +0100 Subject: [PATCH 028/197] Updated new Translations (#2502) * Added german folder - copy en * Translations to german * Changed few translations Yesterday I may have missed some. Also I did some rethinking on better translations. * Update messages.json --- src/drivers/webextension/_locales/de/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/drivers/webextension/_locales/de/messages.json b/src/drivers/webextension/_locales/de/messages.json index 80cbfbecd..86c640c72 100644 --- a/src/drivers/webextension/_locales/de/messages.json +++ b/src/drivers/webextension/_locales/de/messages.json @@ -68,6 +68,6 @@ "categoryName55": { "message": "Buchhaltung" }, "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Statischer Seitengenerator" }, - "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName58": { "message": "Benutzer-Einbindung" }, + "categoryName59": { "message": "JavaScript Bibliotheken" } } From f4b455c6a62aa7cad952eae7e1b605b918f9a488 Mon Sep 17 00:00:00 2001 From: Brad Johnson <resuni@users.noreply.github.com> Date: Fri, 23 Nov 2018 20:09:04 -0700 Subject: [PATCH 029/197] GoJS support (#2480) * GoJS support * Improved GoJS detection --- src/apps.json | 11 +++++++++++ src/icons/GoJS.png | Bin 0 -> 5709 bytes 2 files changed, 11 insertions(+) create mode 100644 src/icons/GoJS.png diff --git a/src/apps.json b/src/apps.json index c714adc68..77388080f 100644 --- a/src/apps.json +++ b/src/apps.json @@ -3618,6 +3618,17 @@ "icon": "GoAhead.png", "website": "http://embedthis.com/products/goahead/index.html" }, + "GoJS": { + "cats": [ + 25 + ], + "icon": "GoJS.png", + "website": "https://gojs.net/", + "js": { + "go.version": "(.*)\\;version:\\1", + "go.GraphObject": "" + } + }, "GoSquared": { "cats": [ 10, diff --git a/src/icons/GoJS.png b/src/icons/GoJS.png new file mode 100644 index 0000000000000000000000000000000000000000..5a91ade5468c9605aa169b6dd095499979ae846c GIT binary patch literal 5709 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 literal 0 HcmV?d00001 From 28d517236705c31df05cb332b1506db22f16beae Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:10:10 +0000 Subject: [PATCH 030/197] Improve fastly detection (#2494) This can be verified [here](https://www.computerworld.com/article/3288925/computer-hardware/as-bitcoin-values-slide-high-end-gpu-prices-drop-too.html) --- src/apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps.json b/src/apps.json index 77388080f..7575a8b38 100644 --- a/src/apps.json +++ b/src/apps.json @@ -3039,6 +3039,7 @@ "headers": { "Fastly-Debug-Digest": "", "Vary": "Fastly-SSL", + "x-via-fastly:": "", "X-Fastly-Request-ID": "" }, "icon": "Fastly.svg", From 161a65eefd628c08249af116a8e9e829f8f37e0c Mon Sep 17 00:00:00 2001 From: Chawye Hsu <chawyehsu@hotmail.com> Date: Sat, 24 Nov 2018 11:10:22 +0800 Subject: [PATCH 031/197] Correct discuz website (#2504) --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 7575a8b38..0df9edf9d 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2436,7 +2436,7 @@ "meta": { "generator": "Discuz! X([\\d\\.]+)?\\;version:\\1" }, - "website": "http://discuz.com" + "website": "http://www.discuz.net" }, "Disqus": { "cats": [ From ec56589c261df85892b0a936cc8627ba6c224a29 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:10:33 +0000 Subject: [PATCH 032/197] Add datadome detection (#2505) * Add datadome detection Datadome is a piece of crap branded as a "Bot management solution", used by a [lot of websites]( https://www.shodan.io/search?query=X-DataDome ), preventing people using vpn, Tor, or a web browser without javascript support (eg. used by some blind people) to access websites. * Detect datadome via scripts too --- src/apps.json | 16 ++++++++++++++++ src/icons/datadome.png | Bin 0 -> 4164 bytes 2 files changed, 16 insertions(+) create mode 100644 src/icons/datadome.png diff --git a/src/apps.json b/src/apps.json index 0df9edf9d..d29ec247c 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2344,6 +2344,22 @@ "icon": "Apple.svg", "website": "https://opensource.apple.com" }, + "Datadome": { + "cats": [ + 19 + ], + "cookies": { + "datadome": "" + }, + "script": "^https://ct\\.datadome\\.co/[a-z]\\.js$", + "headers": { + "X-DataDome": "", + "Server": "^DataDome$", + "X-DataDome-CID": "" + }, + "icon": "datadome.png", + "website": "https://datadome.co/" + }, "DataLife Engine": { "cats": [ 1 diff --git a/src/icons/datadome.png b/src/icons/datadome.png new file mode 100644 index 0000000000000000000000000000000000000000..9c19fb1d7f19b35f95a376e95c4d0031bab95164 GIT binary patch literal 4164 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 O0000<MNUMnLSTXnRqy%$ literal 0 HcmV?d00001 From 55ad0ad5155587cf7fab00f97ef933d648eadd87 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:10:46 +0000 Subject: [PATCH 033/197] Sphinx doesn't imply Python (#2506) Python is used to compile the markdown/ReST to html, but it doesn't mean that the page is _served_ using Python. --- src/apps.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index d29ec247c..faf207c60 100644 --- a/src/apps.json +++ b/src/apps.json @@ -9216,7 +9216,6 @@ ], "html": "Created using <a href=\"https?://sphinx-doc\\.org/\">Sphinx</a> ([.\\d+])+\\.\\;version:\\1", "icon": "Sphinx.png", - "implies": "Python", "js": { "DOCUMENTATION_OPTIONS": "" }, From a7e82d43a690d08bc3764fb0d28f78e4736d6cd9 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:10:59 +0000 Subject: [PATCH 034/197] PUNBB can now ne detected via javascript (#2507) This can be verified [here](https://www.teeworlds.com/forum/viewtopic.php?id=12547) --- src/apps.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps.json b/src/apps.json index faf207c60..94ba91479 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12323,6 +12323,9 @@ "cats": [ 2 ], + "js": { + "PUNBB": "" + }, "html": "Powered by <a href=\"[^>]+punbb", "icon": "punBB.png", "implies": "PHP", From 5a517c1cd81e9dee49e98cbaa81a261e055a2416 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:11:07 +0000 Subject: [PATCH 035/197] Add chevereto (#2508) * Add chevereto Chevereto is a pretty popular gallery hosting php thingy. The free version doesn't have many stars on github, but it's used by a lot of various torrent trackers as image hosting facility. See examples on [whatcms.com](https://whatcms.org/c/Chevereto) * Fix a typo --- src/apps.json | 13 +++++++++++++ src/icons/chevereto.png | Bin 0 -> 2505 bytes 2 files changed, 13 insertions(+) create mode 100644 src/icons/chevereto.png diff --git a/src/apps.json b/src/apps.json index 94ba91479..00c12725f 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1691,6 +1691,19 @@ "implies": "Python", "website": "http://www.cherrypy.org" }, + "Chevereto": { + "cats": [ + 7 + ], + "meta": { + "generator": "^Chevereto ?([0-9.]+)?$\\;version:\\1" + }, + "script": "/chevereto\\.js", + "html": "Powered by <a href=\"https?://chevereto\\.com\">", + "icon": "chevereto.png", + "implies": "PHP", + "website": "https://chevereto.com/" + }, "Chitika": { "cats": [ 36 diff --git a/src/icons/chevereto.png b/src/icons/chevereto.png new file mode 100644 index 0000000000000000000000000000000000000000..81e189814c0aa7ef496817b71795029b4ea28230 GIT binary patch literal 2505 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 TY6!g<00000NkvXXu0mjfPP4o_ literal 0 HcmV?d00001 From 5c32cc2c08f76c89aa3b90953a14837482c189ef Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:11:25 +0000 Subject: [PATCH 036/197] Add websocket detection (#2509) This can be tested on github.com --- src/apps.json | 11 +++++++++++ src/icons/websocket.png | Bin 0 -> 990 bytes 2 files changed, 11 insertions(+) create mode 100644 src/icons/websocket.png diff --git a/src/apps.json b/src/apps.json index 00c12725f..d14390431 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10704,6 +10704,17 @@ "icon": "Webs.png", "website": "http://webs.com" }, + "Websocket": { + "cats": [ + 19 + ], + "html": [ + "<link[^>]+rel=[\"']web-socket[\"']", + "<(?:link|a)[^>]+href=[\"']wss?://" + ], + "icon": "websocket.png", + "website": "https://en.wikipedia.org/wiki/WebSocket" + }, "WebsPlanet": { "cats": [ 1 diff --git a/src/icons/websocket.png b/src/icons/websocket.png new file mode 100644 index 0000000000000000000000000000000000000000..7d94f1073717ab8511cb229d460a86cc42d20f8c GIT binary patch literal 990 zcmWlY`#04G0KmVlM>j*#tfHD|8a<Zw(xPD`TRBu)PG@!OoGpet^Q!Aj$fFqZC}qf_ zP)Eacl6NQFVreaTKdK>gP*RD{?1#_i^A~(#?QE@8m9>-wK~S~XWx02uX8$9WUvO4s z*q9)QcG~UUZ-tYHKpiHBi81EwD_j?IJ%O=4n$F>=j*}eSH;LJXtC+tln4jbI3y!T| zex6?ynR|z19dBo7Ddyc<dYcJaPe&b-LxdP`_YwhXD38QT1D8cSf6P!j?rPjf;;0J$ zJ|x+O)>0~?3I3S2Ysm6Rw4k#A&!yZvPxeoEzfWrk)6Z$Y!3jOa2Pim-yDBqN+$rR& z1BLDcen`(PUW_s~OP`GPY6e=kdIJAd^xvT-nM+=j1~B{xXL)8{bIOFc9SpYe^Z{?C zxt@rufIKH6w&15l`aaV3QlCbMAr(=awqm%02qQ+i2;D&9H-v4Xqn12poE3;OCH`xU z>+-0EW6Md|P0M96zQ;$C`g9(*;ky!#CB&PN?MPc0ky{z<;np8?)-(Htq+K**Ff~HH zD^~(Zv#0MiLHbBOqW><@U-C~CqrLcifS)$^|72#8oS#YGPsK^jA3_?-s|jjTDe*%Z zLy14Bwp5>?Dvrzpr0n5YH_6{}rwISm<o-gw3k7a8WKx^LC2zVK`Q47PU>;QBwT$pj zXgtgL!^Cdqs)XZfDfXqii6ReNlqip&DU08}!%dl!U(lS#Uso9G=k`U82!Oft)K)=| z+h=2GzTcs7ynVa7$VgquQLk-h@eg8q3vY!yv7v6VQmpdQi-RHq@5?W@HMF*b8uynE z&1~r%$?+YzRrxBwEpYY9xY4i>xp$wv$vInpPybxn#1W0nM#c`2eL9;}!~3Fw{0BU= zM_U^{Us7=>%1zgFgW}p{Np(gBsTp=*BQZ{EHSdN0*jd%%a8slbE4K7WAIz53m6|G6 zZ_=GeOjDoMkXzLx)t1*XuDPABw5W8?HRB5hq{~H;F0BhOCTGOUg7XbmTo&SW<+5Z6 zD*fheni^&Sc5-G@)|$dVSD|o5QME2I`iZ{uy)6Sq51tA7)!i<sW;@gl)`g635F#EX z6pJK%r*&2Zm8_X~`l;AQcF06MeL{QKL81GrjrWZULl0sWUMGDLs~Fl|W}SIX))Q)< zYiL!padBe2NWmp*VqIQYuv%h#xL$65v%X}8-KL%f>kkaP9F-lmbzk^au(7hWEVXb9 F{}10wO%(tD literal 0 HcmV?d00001 From 8574d27a3495cf924b6a41e83777186afe359a6e Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:11:36 +0000 Subject: [PATCH 037/197] Add jquery-pjax detection (#2510) It's a [fairly popular](https://github.com/defunkt/jquery-pjax) library, used by github.com --- src/apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/apps.json b/src/apps.json index d14390431..7ca6c7a55 100644 --- a/src/apps.json +++ b/src/apps.json @@ -11890,6 +11890,23 @@ "script": "jquery[.-]mobile(?:-([\\d.]))?(?:\\.min)?\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1?\\1:\\2", "website": "https://jquerymobile.com" }, + "jQuery-pjax": { + "cats": [ + 26 + ], + "implies": "jQuery", + "meta": { + "pjax-timeout": "", + "pjax-replace": "", + "pjax-push": "" + }, + "js": { + "jQuery.pjax": "" + }, + "script": "jquery[.-]pjax(?:-([\\d.]))?(?:\\.min)?\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1?\\1:\\2", + "html": "<div[^>]+data-pjax-container", + "website": "https://github.com/defunkt/jquery-pjax" + }, "jQuery Sparklines": { "cats": [ 25 From a7267598807ed994ecdfb46ff7f1d28670564ff2 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:11:46 +0000 Subject: [PATCH 038/197] Add ahoy detection (#2511) This is a [pretty popular](https://github.com/ankane/ahoy) analytics for RoR, used by [instacart](https://www.instacart.com) for example Unfortunately, it doesn't have a logo :/ --- src/apps.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/apps.json b/src/apps.json index 7ca6c7a55..5a0c1bae4 100644 --- a/src/apps.json +++ b/src/apps.json @@ -397,6 +397,20 @@ "script": "shop-static\\.afterbuy\\.de", "website": "http://www.afterbuy.de" }, + "Ahoy": { + "cats": [ + 10 + ], + "js": { + "ahoy": "" + }, + "cookies": { + "ahoy_track": "", + "ahoy_visit": "", + "ahoy_visitor": "" + }, + "website": "https://github.com/ankane/ahoy" + }, "Aircall": { "cats": [ 52 From 2c90e40f83deace38666d56d364f2538c7e5e319 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:12:04 +0000 Subject: [PATCH 039/197] Improve a bit RoR detection (#2512) RoR [usually](https://www.google.com/search?hl=en&q=_session_id%20cookie) sets a _session_id cookie --- src/apps.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps.json b/src/apps.json index 5a0c1bae4..d2c14335f 100644 --- a/src/apps.json +++ b/src/apps.json @@ -8387,6 +8387,9 @@ "meta": { "csrf-param": "^authenticity_token$\\;confidence:50" }, + "cookies": { + "_session_id": "\\;confidence:75" + }, "script": "/assets/application-[a-z\\d]{32}/\\.js\\;confidence:50", "website": "https://rubyonrails.org" }, From c6f328992215648480eab1e912dd9eba6201409f Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:12:12 +0000 Subject: [PATCH 040/197] Improve a bit bugsnag detection (#2513) According to the [documentation](https://docs.bugsnag.com/platforms/browsers/v3/) --- src/apps.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index d2c14335f..d5ba06262 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1370,9 +1370,11 @@ ], "icon": "BugSnag.png", "js": { - "Bugsnag": "" + "Bugsnag": "", + "bugsnag": "", + "bugsnagClient": "" }, - "script": "bugsnag.*\\.js", + "script": "/bugsnag.*\\.js", "website": "http://bugsnag.com" }, "Bugzilla": { From 66719a285abb20f95b50a00a853241825dcaf69b Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:12:21 +0000 Subject: [PATCH 041/197] Improve Chartjs detection (#2514) Accordingly to the [documentation]( https://www.chartjs.org/docs/latest/charts/doughnut.html ) --- src/apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps.json b/src/apps.json index d5ba06262..3a0a9de2c 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1662,6 +1662,7 @@ "icon": "Chart.js.svg", "js": { "Chart": "\\;confidence:50", + "Chart.defaults.doughnut": "", "chart.ctx.bezierCurveTo": "" }, "script": [ From f37623b30f31dc261685ec1413e1fa05a87cf8d2 Mon Sep 17 00:00:00 2001 From: Mostafa Soufi <mostafa.soufi@hotmail.com> Date: Sat, 24 Nov 2018 06:42:43 +0330 Subject: [PATCH 042/197] Add WP-Statistics (#2515) * Added WP-Statistics * Added the icon --- src/apps.json | 11 +++++++++++ src/icons/WP-Statistics.png | Bin 0 -> 1672 bytes 2 files changed, 11 insertions(+) create mode 100644 src/icons/WP-Statistics.png diff --git a/src/apps.json b/src/apps.json index 3a0a9de2c..f96a478cc 100644 --- a/src/apps.json +++ b/src/apps.json @@ -11345,6 +11345,17 @@ "implies": "WordPress", "website": "http://yoast.com" }, + "WP-Statistics": { + "cats": [ + 59 + ], + "html": [ + "<!-- Analytics by WP-Statistics v([\\d.]+) -\\;version:\\1" + ], + "icon": "WP-Statistics.png", + "implies": "WordPress", + "website": "https://wp-statistics.com" + }, "YouTrack": { "cats": [ 13 diff --git a/src/icons/WP-Statistics.png b/src/icons/WP-Statistics.png new file mode 100644 index 0000000000000000000000000000000000000000..22d1c580f3863e3940700ee5ac96e885268d35f8 GIT binary patch literal 1672 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 Sg`x=n0000<MNUMnLSTYURu;$r literal 0 HcmV?d00001 From e7d7003225f14d60181eda2eaa321400e5f439ee Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:12:58 +0000 Subject: [PATCH 043/197] Detect wordpress sites, even if they're using amp (#2516) This can be tested [here](view-source:https://www.konbini.com/fr/entertainment-2/tommy-wiseau-rejoue-joker-cest-mauvais-the-room/amp/) --- src/apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps.json b/src/apps.json index f96a478cc..a921c4f74 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10967,6 +10967,7 @@ ], "html": [ "<link rel=[\"']stylesheet[\"'] [^>]+wp-(?:content|includes)", + "<div[^>]*class=[\"']amp-wp-", "<link[^>]+s\\d+\\.wp\\.com" ], "icon": "WordPress.svg", From 19ea96d6a1a921edb84fb43e3df9c8ba8a53cb0a Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:13:13 +0000 Subject: [PATCH 044/197] Fix Sphinx version detection (#2517) --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index a921c4f74..8ca588de0 100644 --- a/src/apps.json +++ b/src/apps.json @@ -9247,7 +9247,7 @@ "cats": [ 4 ], - "html": "Created using <a href=\"https?://sphinx-doc\\.org/\">Sphinx</a> ([.\\d+])+\\.\\;version:\\1", + "html": "Created using <a href=\"https?://sphinx-doc\\.org/\">Sphinx</a> ([0-9.]+)\\.\\;version:\\1", "icon": "Sphinx.png", "js": { "DOCUMENTATION_OPTIONS": "" From 9c2835e577dc935aaf5af043b81a1c69e1cbd1a6 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:13:34 +0000 Subject: [PATCH 045/197] Refactor a bit chartjs detection (#2518) --- src/apps.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/apps.json b/src/apps.json index 8ca588de0..ef741967a 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1666,13 +1666,12 @@ "chart.ctx.bezierCurveTo": "" }, "script": [ - "Chart(?:\\.bundle)?(?:\\.min)?\\.js\\;confidence:50", + "/Chart(?:\\.bundle)?(?:\\.min)?\\.js\\;confidence:75", "chartjs\\.org/dist/([\\d.]+(?:-[^/]+)?|master|latest)/Chart.*\\.js\\;version:\\1", "cdnjs\\.cloudflare\\.com/ajax/libs/Chart\\.js/([\\d.]+(?:-[^/]+)?)/Chart.*\\.js\\;version:\\1", - "cdn\\.jsdelivr\\.net/npm/chart\\.js@([\\d.]+(?:-[^/]+)?|latest)/dist/Chart.*\\.js\\;version:\\1", - "cdn\\.jsdelivr\\.net/gh/chartjs/Chart\\.js@([\\d.]+(?:-[^/]+)?|latest)/dist/Chart.*\\.js\\;version:\\1" + "cdn\\.jsdelivr\\.net/(?:npm|gh/chartjs)/chart\\.js@([\\d.]+(?:-[^/]+)?|latest)/dist/Chart.*\\.js\\;version:\\1" ], - "website": "http://www.chartjs.org" + "website": "https://www.chartjs.org" }, "Chartbeat": { "cats": [ From ea0aba1f3a44e56689b98609d2b1b6e57be30b99 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:13:59 +0000 Subject: [PATCH 046/197] Remove some superfluous escaping (#2519) * Remove some superfluous escaping - There is no need to escape . or - outside of a [] - (?:-|.) can be replaced with [.-] - Simplify some convoluted regexp * Fix some mistakes * Remove even more --- src/apps.json | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/apps.json b/src/apps.json index ef741967a..0e72c1e49 100644 --- a/src/apps.json +++ b/src/apps.json @@ -634,14 +634,11 @@ 18 ], "icon": "AngularJS.svg", - "implies": "AngularJS", + "implies": "AngularJS", "js": { "ngMaterial": "" }, - "script": [ - "/([\\d.]+(?:\\-?rc[.\\d]*)*)/angular-material(?:\\.min)?\\.js\\;version:\\1", - "angular-material.*\\.js" - ], + "script": "/([\\d.rc-]+)?/angular-material(?:\\.min)?\\.js\\;version:\\1", "website": "https://material.angularjs.org" }, "AngularDart": { @@ -673,8 +670,8 @@ "angular.version.full": "(.*)\\;version:\\1" }, "script": [ - "angular(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", - "/([\\d.]+(?:\\-?rc[.\\d]*)*)/angular(?:\\.min)?\\.js\\;version:\\1", + "angular[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "/([\\d.]+(?:-?rc[.\\d]*)*)/angular(?:\\.min)?\\.js\\;version:\\1", "angular.*\\.js" ], "website": "https://angularjs.org" @@ -1287,7 +1284,7 @@ }, "script": [ "twitter\\.github\\.com/bootstrap", - "bootstrap(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "bootstrap[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "(?:/([\\d.]+))?(?:/js)?/bootstrap(?:\\.min)?\\.js\\;version:\\1" ], "website": "https://getbootstrap.com" @@ -2586,7 +2583,7 @@ "icon": "DokuWiki.png", "implies": "PHP", "meta": { - "generator": "^DokuWiki( Release [\\-\\d]+)?\\;version:\\1" + "generator": "^DokuWiki( Release [\\d-]+)?\\;version:\\1" }, "website": "https://www.dokuwiki.org" }, @@ -2768,7 +2765,7 @@ 22 ], "headers": { - "Server": "ELOG HTTP( \\d[\\-\\d\\.]+)?\\;version:\\1" + "Server": "ELOG HTTP ?([\\d.-]+)?\\;version:\\1" }, "icon": "ELOG.png", "implies": "ELOG", @@ -2932,7 +2929,7 @@ 27 ], "headers": { - "Server": "Erlang( OTP/(?:[\\-\\d\\.ABR]+))?\\;version:\\1" + "Server": "Erlang( OTP/(?:[\\d.ABR-]+))?\\;version:\\1" }, "icon": "Erlang.png", "website": "http://www.erlang.org" @@ -4189,7 +4186,7 @@ ], "html": "<svg[^>]*><desc>Created with Highstock ([\\d.]*)\\;version:\\1", "icon": "Highcharts.png", - "script": "highstock(?:\\-|\\.)?([\\d\\.]*\\d).*\\.js\\;version:\\1", + "script": "highstock[.-]?([\\d\\.]*\\d).*\\.js\\;version:\\1", "website": "http://highcharts.com/products/highstock" }, "Hinza Advanced CMS": { @@ -4221,7 +4218,7 @@ "Hogan": "" }, "script": [ - "hogan-(?:-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "hogan-[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "([\\d.]+)/hogan(?:\\.min)?\\.js\\;version:\\1" ], "website": "https://twitter.github.io/hogan.js/" @@ -5294,7 +5291,7 @@ "meta": { "laterpay:connector:callbacks:on_user_has_access": "deobfuscateText" }, - "script": "https?://connectormwi\\.laterpay\\.net/([0-9.]+)[a-zA-z\\-]*/live/[\\w-]+\\.js\\;version:\\1", + "script": "https?://connectormwi\\.laterpay\\.net/([0-9.]+)[a-zA-z-]*/live/[\\w-]+\\.js\\;version:\\1", "website": "https://www.laterpay.net/" }, "Lazy.js": { @@ -6356,7 +6353,7 @@ ], "icon": "Moment.js.svg", "implies": "Moment.js", - "script": "moment-timezone(?:\\-data)?(?:\\.min)?\\.js", + "script": "moment-timezone(?:-data)?(?:\\.min)?\\.js", "website": "http://momentjs.com/timezone/" }, "Moment.js": { @@ -8138,7 +8135,7 @@ "react.version": "(.*)\\;version:\\1" }, "script": [ - "react(?:\\-with\\-addons)?(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "react(?:-with-addons)?[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "/([\\d.]+)/react(?:\\.min)?\\.js\\;version:\\1", "react.*\\.js" ], @@ -10559,7 +10556,7 @@ "Vue.version": "(.*)\\;version:\\1" }, "script": [ - "vue(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "vue[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "(?:/([\\d.]+))?/vue(?:\\.min)?\\.js\\;version:\\1" ], "website": "http://vuejs.org" @@ -11077,7 +11074,7 @@ "XRegExp.version": "(.*)\\;version:\\1" }, "script": [ - "xregexp(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "xregexp[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "/([\\d.]+)/xregexp(?:\\.min)?\\.js\\;version:\\1", "xregexp.*\\.js" ], @@ -11380,7 +11377,7 @@ "cats": [ 18 ], - "html": "<!-- ZK [\\.\\d\\s]+-->", + "html": "<!-- ZK [.\\d\\s]+-->", "icon": "ZK.png", "implies": "Java", "script": "zkau/", @@ -11889,7 +11886,7 @@ "jQuery.fn.jquery": "([\\d.]+)\\;version:\\1" }, "script": [ - "jquery(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "jquery[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "/([\\d.]+)/jquery(?:\\.min)?\\.js\\;version:\\1", "jquery.*\\.js(?:\\?ver(?:sion)?=([\\d.]+))?\\;version:\\1" ], @@ -11956,7 +11953,7 @@ "jQuery.ui.version": "(.*)\\;version:\\1" }, "script": [ - "jquery-ui(?:-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "jquery-ui[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "([\\d.]+)/jquery-ui(?:\\.min)?\\.js\\;version:\\1", "jquery-ui.*\\.js" ], @@ -12241,7 +12238,7 @@ "cats": [ 25 ], - "html": "<div id=\"particles\\-js\">", + "html": "<div id=\"particles-js\">", "js": { "particlesJS": "" }, From d39b665311123f2dd0592a20fc31b089570af025 Mon Sep 17 00:00:00 2001 From: Adam Dutton <adam.dutton@volusion.com> Date: Fri, 23 Nov 2018 21:14:38 -0600 Subject: [PATCH 047/197] Separate Volusion into two technologies (V1 and V2) (#2520) * Separating Volusion to V1 and V2 * Adding new Volusion logo icon SVG * Removing old PNG file * Added `implies` fields Tech implications are changing and we'll update Wappalyzer after changes are made. --- src/apps.json | 16 +++++++++++++--- src/icons/Volusion.png | Bin 334 -> 0 bytes src/icons/Volusion.svg | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) delete mode 100644 src/icons/Volusion.png create mode 100644 src/icons/Volusion.svg diff --git a/src/apps.json b/src/apps.json index 0e72c1e49..53052e61b 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10534,17 +10534,27 @@ "script": "visualpath[^/]*\\.trackset\\.it/[^/]+/track/include\\.js", "website": "http://www.trackset.com/web-analytics-software/visualpath" }, - "Volusion": { + "Volusion (V1)": { "cats": [ 6 ], "html": "<link [^>]*href=\"[^\"]*/vspfiles/", - "icon": "Volusion.png", + "icon": "Volusion.svg", + "implies": "Microsoft ASP.NET", "js": { "volusion": "" }, "script": "/volusion\\.js(?:\\?([\\d.]*))?\\;version:\\1", - "website": "http://volusion.com" + "website": "https://www.volusion.com" + }, + "Volusion (V2)": { + "cats": [ + 6 + ], + "html": "<body [^>]*data-vn-page-name", + "icon": "Volusion.svg", + "implies": "AngularJS", + "website": "https://www.volusion.com" }, "Vue.js": { "cats": [ diff --git a/src/icons/Volusion.png b/src/icons/Volusion.png deleted file mode 100644 index 20e6d109a822f959a4eb346ab9abbf2a6d956252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmV-U0kQsxP)<h;3K|Lk000e1NJLTq000mG000mO0{{R3C@l|D0001rP)t-s00003 zLTdm2{{}>C3`uXAv%`_Cz8h3{vc=Ko?eQK~da1w6xXRV``1(O{k2`FOM01fcW`-nM zeHBl2-skKpUxB8)%D&FnS%RHtj;7e+=<4tDwa3#|fSXNvmTQow{Qdofq_^$z^dVS$ zcbTqklBuJ*$r4R-2}W)>YKmoxq?E6~N_UiipR^LQYHR=i00DGTPE!Ct=GbNc0044H zL_t(|UVYCs76UN=15uCcWe77f-~W1P{IYfvb^6^HLp1+G$&%T^g@8@99C)x343MiR z0hg{+4Gl0Fs|KcO=3oF?simi;j|bLDsI=h+TkXpIfe!5Pbk1!6T)5r{;hsI75x}c( gF}&+f2mf--7qemoM&5s@MF0Q*07*qoM6N<$f)JgQcK`qY diff --git a/src/icons/Volusion.svg b/src/icons/Volusion.svg new file mode 100644 index 000000000..34dd13831 --- /dev/null +++ b/src/icons/Volusion.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256"><path fill="#8759F2" d="M128.928 163.067L81.066 80.152H32.898c-19.702.055-31.987 21.368-22.187 38.44L82.65 243.22c9.787 16.957 34.5 17.13 44.415-.023l46.277-80.15c-9.912 17.165-34.637 16.953-44.415.02z"/><path fill="#FF3E80" d="M176.806 80.152h-95.75l47.862 82.918c9.788 16.96 34.5 17.13 44.415-.023l25.665-44.422c9.908-17.17-2.642-38.475-22.192-38.473z"/><path fill="#FFC300" d="M223.083 0H79.176C59.473.055 47.188 21.367 56.988 38.44c0 .02 24.078 41.71 24.078 41.71h95.75c19.775 0 32 21.485 22.185 38.475l46.277-80.15C255.101 21.445 242.808 0 223.083 0z"/><path fill="#00D4E6" d="M56.998 38.442a25.638 25.638 0 0 1 .025-25.612L10.748 92.977A25.638 25.638 0 0 1 32.911 80.15h48.165L56.998 38.442z"/></svg> \ No newline at end of file From c9a5576c72dc46b3f1e6e343502d9d4453f52ddf Mon Sep 17 00:00:00 2001 From: Kyle Lawson <klawson3@babson.edu> Date: Fri, 23 Nov 2018 22:15:23 -0500 Subject: [PATCH 048/197] added LOU to apps.json (#2522) * added LOU to apps.json * removed implies field from LOU --- src/apps.json | 8 ++++++++ src/icons/LOU.png | Bin 0 -> 1685 bytes 2 files changed, 8 insertions(+) create mode 100644 src/icons/LOU.png diff --git a/src/apps.json b/src/apps.json index 53052e61b..a68082de7 100644 --- a/src/apps.json +++ b/src/apps.json @@ -5591,6 +5591,14 @@ "implies": "Java", "website": "http://www-01.ibm.com/software/lotus/products/domino" }, + "LOU": { + "cats": [ + 58 + ], + "icon": "LOU.png", + "script": "cdn\\.louassist\\.com*", + "website": "https://www.louassist.com" + }, "Lua": { "cats": [ 27 diff --git a/src/icons/LOU.png b/src/icons/LOU.png new file mode 100644 index 0000000000000000000000000000000000000000..c2836cab445c17b77ce4e0902d8b70aaf20427e3 GIT binary patch literal 1685 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 Mp)A_h!QA}+0fF4&^Z)<= literal 0 HcmV?d00001 From e7888170940ff18d9da8f7cc11bd8a59b163b0b1 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:15:44 +0000 Subject: [PATCH 049/197] Improve dreamweaver (#2524) --- src/apps.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/apps.json b/src/apps.json index a68082de7..835aae55b 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2659,9 +2659,14 @@ "cats": [ 20 ], - "html": "(?:<!--[^>]*(?:InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) \\{)\\;version:\\1", - "icon": "DreamWeaver.png", - "website": "http://www.adobe.com/products/dreamweaver" + "html": "<!--[^>]*(?:InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)\\;version:\\1", + "js": { + "MM_showMenu": "", + "MM_preloadImages": "", + "MM_showHideLayers": "" + }, + "icon": "DreamWeaver.png", + "website": "https://www.adobe.com/products/dreamweaver.html" }, "Drupal": { "cats": [ From 2b5c26db291436c29011b6d98f2ecd56155c280b Mon Sep 17 00:00:00 2001 From: kkadosh <32873649+kkadosh@users.noreply.github.com> Date: Sat, 24 Nov 2018 04:16:06 +0100 Subject: [PATCH 050/197] Improve gatsby fingerprinting (#2525) * Improve gatsby fingerprinting * Fix typo * Improve the regex --- src/apps.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps.json b/src/apps.json index 835aae55b..5990395c0 100644 --- a/src/apps.json +++ b/src/apps.json @@ -3454,6 +3454,9 @@ "<div id=\"___gatsby\">", "<style id=\"gatsby-inlined-css\">" ], + "meta": { + "generator": "^Gatsby(?: ([0-9.]+))?$\\;version:\\1" + }, "icon": "Gatsby.svg", "implies": [ "React", From 6681f69b7fb38860d677b0ffac33dfc3e6ae70f7 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:17:39 +0000 Subject: [PATCH 051/197] Improve angularjs detection via html (#2526) --- src/apps.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/apps.json b/src/apps.json index 5990395c0..2a0dd1055 100644 --- a/src/apps.json +++ b/src/apps.json @@ -665,6 +665,10 @@ "AngularDart" ], "icon": "AngularJS.svg", + "html": [ + "<(?:div|html)[^>]+ng-app=", + "<ng-app" + ], "js": { "angular": "", "angular.version.full": "(.*)\\;version:\\1" From 1e565706af9086abfdc1f613f5a96856f61d7811 Mon Sep 17 00:00:00 2001 From: kkadosh <32873649+kkadosh@users.noreply.github.com> Date: Sat, 24 Nov 2018 04:17:57 +0100 Subject: [PATCH 052/197] Improve tiny mce detection (#2527) * Improve tiny mce detection * Fix regex * Dummy commit :) --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 2a0dd1055..372baee41 100644 --- a/src/apps.json +++ b/src/apps.json @@ -9904,7 +9904,7 @@ "js": { "tinyMCE.majorVersion": "([\\d.]+)\\;version:\\1" }, - "script": "/tinymce(?:\\.min)?\\.js", + "script": "/tiny_?mce(?:\\.min)?\\.js", "website": "http://tinymce.com" }, "Titan": { From da02555174e9965e7df889fdb079bed5f79e744f Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:18:14 +0000 Subject: [PATCH 053/197] Improve a bit dokuwiki detection (#2528) This can be checked here : view-source:https://wiki.php.net/todo/php73 --- src/apps.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/apps.json b/src/apps.json index 372baee41..de862b384 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2584,6 +2584,10 @@ "cookies": { "DokuWiki": "" }, + "html": [ + "<div[^>]+id=\"dokuwiki__>", + "<a[^>]+href=\"#dokuwiki__" + ], "icon": "DokuWiki.png", "implies": "PHP", "meta": { From bda15e50fd274a1e1ace9a50227c0127a27a7688 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:23:11 +0000 Subject: [PATCH 054/197] Improve phpwind detection (#2529) This can be tested [here](view-source:http://s.erji.hk/) and [here](view-source:http://bbs.mydigit.cn/). --- src/apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index de862b384..39ecb7728 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12386,11 +12386,11 @@ 1, 2 ], - "html": "Powered by <a href=\"[^\"]+phpwind\\.net", + "html": "(?:Powered|Code) by <a href=\"[^\"]+phpwind\\.net", "icon": "phpwind.png", "implies": "PHP", "meta": { - "generator": "^phpwind" + "generator": "^phpwind(?: v([0-9-]+))?\\;version:\\1" }, "website": "https://www.phpwind.net" }, From 29d2d379ec93a1e9ea3bf41bb5ed8727f82d799b Mon Sep 17 00:00:00 2001 From: Nathan Pinciak <natepinciak@live.com> Date: Fri, 23 Nov 2018 22:23:39 -0500 Subject: [PATCH 055/197] Shopline and 91app detection (#2532) --- src/apps.json | 18 ++++++++++++++++++ src/icons/91app.png | Bin 0 -> 16267 bytes src/icons/shopline.png | Bin 0 -> 6316 bytes 3 files changed, 18 insertions(+) create mode 100644 src/icons/91app.png create mode 100644 src/icons/shopline.png diff --git a/src/apps.json b/src/apps.json index 39ecb7728..1a752f75b 100644 --- a/src/apps.json +++ b/src/apps.json @@ -15,6 +15,14 @@ "script": "1c-bitrix", "website": "http://www.1c-bitrix.ru" }, + "91App": { + "cats": [ + 6 + ], + "icon": "91app.png", + "script": "https\\:\/\/track\\.91app\\.io\/track\\.js\\?", + "website": "https://www.91app.com/" + }, "3dCart": { "cats": [ 1, @@ -8888,6 +8896,16 @@ }, "website": "http://shopify.com" }, + "Shopline": { + "cats": [ + 6 + ], + "icon": "shopline.png", + "meta": { + "og:image":"https\\:\/\/img\\.shoplineapp\\.com" + }, + "website": "https://shoplineapp.com/" + }, "Shoptet": { "cats": [ 6 diff --git a/src/icons/91app.png b/src/icons/91app.png new file mode 100644 index 0000000000000000000000000000000000000000..3963238b1b19bafcd4d578dc72f6551f117d6d8f GIT binary patch literal 16267 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 literal 0 HcmV?d00001 diff --git a/src/icons/shopline.png b/src/icons/shopline.png new file mode 100644 index 0000000000000000000000000000000000000000..ebdb09d1486d8a31109349f0dd89a12aafed08d3 GIT binary patch literal 6316 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 literal 0 HcmV?d00001 From 5b420b67f12003f82b39533991943d8b0363bd00 Mon Sep 17 00:00:00 2001 From: Avaroth <klemens.forster@hotmail.de> Date: Sat, 24 Nov 2018 04:25:24 +0100 Subject: [PATCH 056/197] added Website Creator CMS (#2537) --- src/apps.json | 16 ++++++++++++++++ src/icons/WebsiteCreator.png | Bin 0 -> 18990 bytes 2 files changed, 16 insertions(+) create mode 100644 src/icons/WebsiteCreator.png diff --git a/src/apps.json b/src/apps.json index 1a752f75b..58fe83f9d 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10801,6 +10801,22 @@ "url": "/websale7/", "website": "http://websale.de" }, + "Website Creator": { + "cats": [ + 1 + ], + "icon": "WebsiteCreator.png", + "implies": [ + "PHP", + "MySQL", + "Vue.js" + ], + "meta": { + "generator": "Website Creator by hosttech", + "wsc_rendermode": "" + }, + "website": "https://www.hosttech.ch/websitecreator" + }, "WebsiteBaker": { "cats": [ 1 diff --git a/src/icons/WebsiteCreator.png b/src/icons/WebsiteCreator.png new file mode 100644 index 0000000000000000000000000000000000000000..3c25e14aae94a4507e642156a0b1619bbf216bc6 GIT binary patch literal 18990 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 a>CN%F_u#;{KJfRZm9)5mSe1yr|NjLdT^cF? literal 0 HcmV?d00001 From ace60ab1d298d988bf1ed5121873bf11918722a9 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:26:13 +0000 Subject: [PATCH 057/197] Vastly improve rainloop detection (#2541) - Remove two super-slow regexps - Tighten some regexps - Add more patterns I tested this PR on Wappalyzer's [top10](https://www.wappalyzer.com/technologies/rainloop), and on the [official demo](https://mail.rainloop.net/). --- src/apps.json | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/apps.json b/src/apps.json index 58fe83f9d..c85903728 100644 --- a/src/apps.json +++ b/src/apps.json @@ -8044,19 +8044,22 @@ 30 ], "headers": { - "Server": "RainLoop" + "Server": "^RainLoop" }, "html": [ - "<meta [^>]*(?:content=\"([^\"]+)[^>]+ id=\"rlAppVersion\"|id=\"rlAppVersion\"[^>]+ content=\"([^\"]+))\\;version:\\1?\\1:\\2", - "<link[^>]* href=\"[^\"]*rainloop/v/([^/]+)\\;version:\\1" + "<link[^>]href=\"rainloop/v/([0-9.]+)/static/apple-touch-icon\\.png/>\\;version:\\1" ], + "meta": { + "rlAppVersion": "^([0-9.]+)$\\;version:\\1" + }, "icon": "RainLoop.png", "implies": "PHP", "js": { + "rainloopI18N": "", "rainloop": "" }, - "script": "rainloop/v/([^/]+)\\;version:\\1", - "website": "http://rainloop.net" + "script": "^rainloop/v/([0-9.]+)/\\;version:\\1", + "website": "https://www.rainloop.net/" }, "Rakuten DBCore": { "cats": [ From ad5bba7b25f6e07eb028be79715f49634fbf1d65 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:26:34 +0000 Subject: [PATCH 058/197] Optimize moguta's detection regexp (#2542) --- src/apps.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index c85903728..d3e47a8f7 100644 --- a/src/apps.json +++ b/src/apps.json @@ -6338,10 +6338,11 @@ 1, 6 ], - "html": "(?:<script|link)[^>]*(?:src=|href=)[\"'][^\"]*mg-(?:core|plugins|templates)", + "html": "<link[^>]+href=[\"'][^\"]+mg-(?:core|plugins|templates)/", + "script": "mg-(?:core|plugins|templates)/", "icon": "Moguta.CMS.png", "implies": "PHP", - "website": "http://moguta.ru" + "website": "https://moguta.ru" }, "MoinMoin": { "cats": [ From 32fc8021ad7d94f2709a7017a812508581f1f57c Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:26:49 +0000 Subject: [PATCH 059/197] Remove a useless regexp for segment's detection (#2543) --- src/apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index d3e47a8f7..e3c2736aa 100644 --- a/src/apps.json +++ b/src/apps.json @@ -8706,13 +8706,12 @@ "cats": [ 10 ], - "html": "<script[\\s\\S]*cdn\\.segment\\.com/analytics\\.js[\\s\\S]*script>", "icon": "Segment.png", "js": { "analytics": "" }, "script": "cdn\\.segment\\.com/analytics\\.js", - "website": "http://segment.com" + "website": "https://segment.com" }, "Select2": { "cats": [ From 8c452182a0f36e3ced7f8c8e66abd94c33f31504 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:27:02 +0000 Subject: [PATCH 060/197] Remove NOIX (#2544) - The official website is dead: http://www.noix.com.br/ - 0 detections: https://www.wappalyzer.com/technologies/noix --- src/apps.json | 8 -------- src/icons/NOIX.png | Bin 430 -> 0 bytes 2 files changed, 8 deletions(-) delete mode 100644 src/icons/NOIX.png diff --git a/src/apps.json b/src/apps.json index e3c2736aa..4c838fc65 100644 --- a/src/apps.json +++ b/src/apps.json @@ -6630,14 +6630,6 @@ "icon": "Plataforma NEO.svg", "website": "http://www.jetecommerce.com.br/" }, - "NOIX": { - "cats": [ - 19 - ], - "html": "(?:<[^>]+(?:src|href)=[^>]*/media/noix|<!-- NOIX)", - "icon": "NOIX.png", - "website": "http://www.noix.com.br/tecnologias/joomla" - }, "NVD3": { "cats": [ 25 diff --git a/src/icons/NOIX.png b/src/icons/NOIX.png deleted file mode 100644 index ae6f9fee616eb87866ac3f7d72a82df95418e4e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430 zcmV;f0a5;mP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0004XNkl<ZILm$0 z!7D{U6vy$KC`AyY*icHOBq~KIDk~*LcBsJ4U!YW!gpGtsq*y&sL@J7;2q{H8c@+f} zNI~&E`n{T7m+Dh@&YU^ToSEx=k9%H(a*W{!A)F$B79>XIyMq)A;tt<F-m#7{zXBOp zc9P$)g$1nP+L^QO8n-|!W}Ji-R6E<X`F!-@RXITvg$p#|LlbjI^65)hn^R=kihF91 z1<sI-Xf>=*ixSX{VvVPi|A2Z6Tq-c2giM^M`?-k6IodT}g%_=v_na*?DIp6xxWz6? zv4Li%;X$oA@GD@)*hVcTaDyu}I0Y`W=From4SJQ3qa)Z &GD;Q|$SR4m}>+J37c zT}|r=UlY<)yhP(6<y(<v3v@bfU<6VBTw|@eZ@G(h<rYlFs)ApbM4q<qsbDHPoELeI zO7|(-OWSvL64FEI$0+ukIoo=x-_K-sK8vS6ex^_LsqU}8(Zrz(o4USdo%tBUD2VLK Y4~PE}Id?khYXATM07*qoM6N<$g3ckosQ>@~ From f1773a68c08605ce778f40da2d71f1dba8622031 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:27:15 +0000 Subject: [PATCH 061/197] Add ckan version detection (#2546) --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 4c838fc65..242335ccc 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1757,7 +1757,7 @@ "PostgreSQL" ], "meta": { - "generator": ".*ckan.*" + "generator": "^ckan ?([0-9.]+)$\\;version:\\1" }, "website": "http://ckan.org/" }, From 0bc4ef7915854adafc238129536e035bbacc2a61 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:27:28 +0000 Subject: [PATCH 062/197] Improve a bit virtuoso detection (#2547) - Optimize the `url` regexp - simplify the `Server` one --- src/apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index 242335ccc..774ffb6ee 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10521,13 +10521,13 @@ 34 ], "headers": { - "Server": "Virtuoso\\/?(\\d{2}\\.\\d{2}\\.\\d{4})?\\;version:\\1" + "Server": "Virtuoso/?([0-9.]+)?\\;version:\\1" }, "meta": { "Copyright": "^Copyright © \\d{4} OpenLink Software", "Keywords": "^OpenLink Virtuoso Sparql" }, - "url": ".*/sparql\\.*", + "url": "/sparql", "website": "https://virtuoso.openlinksw.com/" }, "Visual WebGUI": { From b8cfbf5bcdab27b9a4b0daf7dcfb72a30c02f523 Mon Sep 17 00:00:00 2001 From: kkadosh <32873649+kkadosh@users.noreply.github.com> Date: Sat, 24 Nov 2018 04:27:41 +0100 Subject: [PATCH 063/197] improve tray regex (#2548) --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 774ffb6ee..f9c1df8d6 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10019,7 +10019,7 @@ 6 ], "icon": "tray.png", - "script": ".+tcdn\\.com\\.br", + "script": "tcdn\\.com\\.br", "website": "https://www.tray.com.br" }, "Tumblr": { From 0f4dcdb1a7a3b4eade65826efb7f34af31a802e5 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:27:53 +0000 Subject: [PATCH 064/197] Improve mediawiki detection (#2549) - Optimize the regex - Add a js detection - Use https for the website --- src/apps.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index f9c1df8d6..4394cdb77 100644 --- a/src/apps.json +++ b/src/apps.json @@ -6007,13 +6007,20 @@ "cats": [ 8 ], - "html": "(?:<a[^>]+>Powered by MediaWiki</a>|<[^>]+id=\"t-specialpages)", + "html": [ + "<body[^>]+class=\"mediawiki\"", + "<(?:a|img)[^>]+>Powered by MediaWiki</a>", + "<a[^>]+/Special:WhatLinksHere/" + ], "icon": "MediaWiki.png", "implies": "PHP", + "js": { + "mw.util.toggleToc": "" + }, "meta": { "generator": "^MediaWiki ?(.+)$\\;version:\\1" }, - "website": "http://www.mediawiki.org" + "website": "https://www.mediawiki.org" }, "Medium": { "cats": [ From 22bda9f65f876013bb6ed3e4168c35084b30641b Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:28:05 +0000 Subject: [PATCH 065/197] Optimize a bit oscommerce detection (#2550) - Split the regexp in 3 parts - Improve a regex, accordingly to the [source code](https://github.com/osCommerce/oscommerce/blob/1705380eadfd14572764ba7c783d75951ef9d299/osCommerce/OM/Core/Site/Shop/Languages/en_US.xml#L205) of oscommerce - Fix some mistakes --- src/apps.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 4394cdb77..e1a5244ec 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12251,7 +12251,11 @@ "cookies": { "osCsid": "" }, - "html": "(?:<a[^>]*(?:\\?|&)osCsid|Powered by (?:<[^>]+>)?osCommerce</a>|<[^>]+class=\"[^>]*infoBoxHeading)", + "html": [ + "<br />Powered by <a href=\"https?://www\\.oscommerce\\.com", + "<(?:input|a)[^>]+name=\"osCsid\"", + "<(?:tr|td|table)class=\"[^\"]*infoBoxHeading" + ], "icon": "osCommerce.png", "implies": [ "PHP", From 88c77fed21483828da1d7e8d043052c901f64e70 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:28:22 +0000 Subject: [PATCH 066/197] Remove wikispaces (#2552) https://www.wikispaces.com is now dead </3 --- src/apps.json | 11 ----------- src/icons/Wikispaces.png | Bin 2412 -> 0 bytes 2 files changed, 11 deletions(-) delete mode 100644 src/icons/Wikispaces.png diff --git a/src/apps.json b/src/apps.json index e1a5244ec..a12208a68 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10880,17 +10880,6 @@ "icon": "wikinggruppen.png", "website": "https://wikinggruppen.se/" }, - "Wikispaces": { - "cats": [ - 8 - ], - "html": [ - "<script[^>]*>[^<]*session_url:\\s*'https://session\\.wikispaces\\.com/", - "<\\w+[^>]*\\s+class=\"[^\"]*WikispacesContent\\s+WikispacesBs3[^\"]*\"" - ], - "icon": "Wikispaces.png", - "website": "http://www.wikispaces.com" - }, "WikkaWiki": { "cats": [ 8 diff --git a/src/icons/Wikispaces.png b/src/icons/Wikispaces.png deleted file mode 100644 index 91034ccf26d36da8d9c8941c19ee2b479b2aabc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2412 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 From cbe6c19be926b425392b4880792111c4221eee0e Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:28:38 +0000 Subject: [PATCH 067/197] Detect concrete5 via cookies (#2554) This can be checked on cartus.com --- src/apps.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps.json b/src/apps.json index a12208a68..65a19fc2e 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2002,6 +2002,9 @@ "js": { "CCM_IMAGE_PATH": "" }, + "cookies": { + "CONCRETE5": "" + }, "meta": { "generator": "^concrete5 - ([\\d.]+)$\\;version:\\1" }, From ca2f54f67f325917249519143963d3e64c468121 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:28:50 +0000 Subject: [PATCH 068/197] Improve a bit bugzilla's version detection (#2555) --- src/apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps.json b/src/apps.json index 65a19fc2e..2a1258b22 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1393,6 +1393,7 @@ "html": [ "href=\"enter_bug\\.cgi\">", "<main id=\"bugzilla-body\"", + "<a href=\"https?://www\\.bugzilla\\.org/docs/([0-9.]+)/[^>]+>Help<\\;version:\\1", "<span id=\"information\" class=\"header_addl_info\">version ([\\d.]+)<\\;version:\\1" ], "cookies": { From e0d20056393698bd8294d68bb50ae7621f2c164f Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:29:35 +0000 Subject: [PATCH 069/197] Replace the .* pattern with something else when possible (#2558) This should give some performance boost, along with a cleaner code. --- src/apps.json | 174 +++++++++++++++++++++++++------------------------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/src/apps.json b/src/apps.json index 2a1258b22..6242b3378 100644 --- a/src/apps.json +++ b/src/apps.json @@ -46,7 +46,7 @@ "icon": "A-Frame.svg", "implies": "three.js", "js": { - "AFRAME.version": "(.*)\\;version:\\1" + "AFRAME.version": "^(.+)$\\;version:\\1" }, "script": "/?([\\d.]+)?/aframe(?:\\.min)?\\.js\\;version:\\1", "website": "https://aframe.io" @@ -353,7 +353,7 @@ ], "icon": "Adyen.svg", "js": { - "adyen.encrypt.version": "(.*)\\;version:\\1" + "adyen.encrypt.version": "^(.+)$\\;version:\\1" }, "website": "https://www.adyen.com" }, @@ -480,7 +480,7 @@ "icon": "Algolia Realtime Search.svg", "js": { "AlgoliaSearch": "", - "algoliasearch.version": "(.*)\\;version:\\1" + "algoliasearch.version": "^(.+)$\\;version:\\1" }, "website": "http://www.algolia.com" }, @@ -679,7 +679,7 @@ ], "js": { "angular": "", - "angular.version.full": "(.*)\\;version:\\1" + "angular.version.full": "^(.+)$\\;version:\\1" }, "script": [ "angular[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", @@ -819,7 +819,7 @@ ], "excludes": "OpenCart", "headers": { - "Arastta": "(.*)\\;version:\\1", + "Arastta": "^(.+)$\\;version:\\1", "X-Arastta": "" }, "html": "Powered by <a [^>]*href=\"https?://(?:www\\.)?arastta\\.org[^>]+>Arastta", @@ -1055,7 +1055,7 @@ "implies": "Underscore.js", "js": { "Backbone": "", - "Backbone.VERSION": "(.*)\\;version:\\1" + "Backbone.VERSION": "^(.+)$\\;version:\\1" }, "script": "backbone.*\\.js", "website": "http://backbonejs.org" @@ -1291,8 +1291,8 @@ ], "icon": "Bootstrap.png", "js": { - "bootstrap.Alert.VERSION": "(.*)\\;version:\\1", - "jQuery.fn.tooltip.Constructor.VERSION": "(.*)\\;version:\\1" + "bootstrap.Alert.VERSION": "^(.+)$\\;version:\\1", + "jQuery.fn.tooltip.Constructor.VERSION": "^(.+)$\\;version:\\1" }, "script": [ "twitter\\.github\\.com/bootstrap", @@ -1333,7 +1333,7 @@ "icon": "Braintree.svg", "js": { "Braintree": "", - "Braintree.version": "(.*)\\;version:\\1" + "Braintree.version": "^(.+)$\\;version:\\1" }, "website": "https://www.braintreepayments.com" }, @@ -1477,7 +1477,7 @@ "icon": "CKEditor.png", "js": { "CKEDITOR": "", - "CKEDITOR.version": "(.*)\\;version:\\1", + "CKEDITOR.version": "^(.+)$\\;version:\\1", "CKEDITOR_BASEPATH": "" }, "website": "http://ckeditor.com" @@ -1621,7 +1621,7 @@ "implies": "Node.js", "js": { "catberry": "", - "catberry.version": "(.*)\\;version:\\1" + "catberry.version": "^(.+)$\\;version:\\1" }, "website": "http://catberry.org" }, @@ -1876,7 +1876,7 @@ 18 ], "cookies": { - "ci_csrf_token": "(.*)\\;version:\\1?2+:", + "ci_csrf_token": "^(.+)$\\;version:\\1?2+:", "ci_session": "", "exp_last_activity": "", "exp_tracker": "" @@ -1893,7 +1893,7 @@ "icon": "CodeMirror.png", "js": { "CodeMirror": "", - "CodeMirror.version": "(.*)\\;version:\\1" + "CodeMirror.version": "^(.+)$\\;version:\\1" }, "website": "http://codemirror.net" }, @@ -2261,7 +2261,7 @@ ], "icon": "D3.png", "js": { - "d3.version": "(.*)\\;version:\\1" + "d3.version": "^(.+)$\\;version:\\1" }, "script": "/d3(?:\\. v\\d+)?(?:\\.min)?\\.js", "website": "http://d3js.org" @@ -2303,7 +2303,7 @@ "implies": "Microsoft ASP.NET", "js": { "DotNetNuke": "", - "dnn.apiversion": "(.*)\\;version:\\1" + "dnn.apiversion": "^(.+)$\\;version:\\1" }, "meta": { "generator": "DotNetNuke" @@ -2488,7 +2488,7 @@ "implies": "PHP", "js": { "DISCUZCODE": "", - "discuzVersion": "(.*)\\;version:\\1", + "discuzVersion": "^(.+)$\\;version:\\1", "discuz_uid": "" }, "meta": { @@ -2564,7 +2564,7 @@ "icon": "Dojo.png", "js": { "dojo": "", - "dojo.version.major": "(.*)\\;version:\\1" + "dojo.version.major": "^(.+)$\\;version:\\1" }, "script": "([\\d.]+)/dojo/dojo(?:\\.xd)?\\.js\\;version:\\1", "website": "https://dojotoolkit.org" @@ -2905,7 +2905,7 @@ "implies": "Handlebars", "js": { "Ember": "", - "Ember.VERSION": "(.*)\\;version:\\1" + "Ember.VERSION": "^(.+)$\\;version:\\1" }, "website": "http://emberjs.com" }, @@ -2984,7 +2984,7 @@ "icon": "Exhibit.png", "js": { "Exhibit": "", - "Exhibit.version": "(.*)\\;version:\\1" + "Exhibit.version": "^(.+)$\\;version:\\1" }, "script": "exhibit.*\\.js", "website": "http://simile-widgets.org/exhibit/" @@ -3021,8 +3021,8 @@ "icon": "ExtJS.png", "js": { "Ext": "", - "Ext.version": "(.*)\\;version:\\1", - "Ext.versions.extjs.version": "(.*)\\;version:\\1" + "Ext.version": "^(.+)$\\;version:\\1", + "Ext.versions.extjs.version": "^(.+)$\\;version:\\1" }, "script": "ext-base\\.js", "website": "https://www.sencha.com" @@ -3084,7 +3084,7 @@ "icon": "FancyBox.png", "implies": "jQuery", "js": { - "$.fancybox.version": "(.*)\\;version:\\1" + "$.fancybox.version": "^(.+)$\\;version:\\1" }, "script": "jquery\\.fancybox(?:\\.pack|\\.min)?\\.js(?:\\?v=([\\d.]+))?$\\;version:\\1", "website": "http://fancyapps.com/fancybox" @@ -3150,7 +3150,7 @@ "js": { "Fingerprint": "(\\d)?$\\;version:\\1", "Fingerprint2": "", - "Fingerprint2.VERSION": "(.*)\\;version:\\1" + "Fingerprint2.VERSION": "^(.+)$\\;version:\\1" }, "script": "fingerprint(\\d)?(?:\\.min)?\\.js\\;version:\\1", "website": "https://valve.github.io/fingerprintjs2/" @@ -4088,9 +4088,9 @@ ], "icon": "Hammer.js.png", "js": { - "Ha.VERSION": "(.*)\\;version:\\1", + "Ha.VERSION": "^(.+)$\\;version:\\1", "Hammer": "", - "Hammer.VERSION": "(.*)\\;version:\\1" + "Hammer.VERSION": "^(.+)$\\;version:\\1" }, "script": "hammer(?:\\.min)?\\.js", "website": "https://hammerjs.github.io" @@ -4103,7 +4103,7 @@ "icon": "Handlebars.png", "js": { "Handlebars": "", - "Handlebars.VERSION": "(.*)\\;version:\\1" + "Handlebars.VERSION": "^(.+)$\\;version:\\1" }, "script": "handlebars(?:\\.runtime)?(?:-v([\\d.]+?))?(?:\\.min)?\\.js\\;version:\\1", "website": "http://handlebarsjs.com" @@ -4191,7 +4191,7 @@ "icon": "Highcharts.png", "js": { "Highcharts": "", - "Highcharts.version": "(.*)\\;version:\\1" + "Highcharts.version": "^(.+)$\\;version:\\1" }, "script": "highcharts.*\\.js", "website": "https://www.highcharts.com" @@ -4457,7 +4457,7 @@ "icon": "Immutable.js.png", "js": { "Immutable": "", - "Immutable.version": "(.*)\\;version:\\1" + "Immutable.version": "^(.+)$\\;version:\\1" }, "script": "^immutable\\.(?:min\\.)?js$", "website": "https://facebook.github.io/immutable-js/" @@ -4560,7 +4560,7 @@ "icon": "InfernoJS.png", "js": { "Inferno": "", - "Inferno.version": "(.*)\\;version:\\1" + "Inferno.version": "^(.+)$\\;version:\\1" }, "website": "https://infernojs.org" }, @@ -4797,7 +4797,7 @@ "icon": "JavaScript Infovis Toolkit.png", "js": { "$jit": "", - "$jit.version": "(.*)\\;version:\\1" + "$jit.version": "^(.+)$\\;version:\\1" }, "script": "jit(?:-yc)?\\.js", "website": "https://philogb.github.io/jit/" @@ -5039,7 +5039,7 @@ "implies": "jQuery", "js": { "kendo": "", - "kendo.version": "(.*)\\;version:\\1" + "kendo.version": "^(.+)$\\;version:\\1" }, "website": "https://www.telerik.com/kendo-ui" }, @@ -5088,7 +5088,7 @@ "icon": "KineticJS.png", "js": { "Kinetic": "", - "Kinetic.version": "(.*)\\;version:\\1" + "Kinetic.version": "^(.+)$\\;version:\\1" }, "script": "kinetic(?:-v?([\\d.]+))?(?:\\.min)?\\.js\\;version:\\1", "website": "https://github.com/ericdrowell/KineticJS/" @@ -5111,7 +5111,7 @@ ], "icon": "Knockout.js.png", "js": { - "ko.version": "(.*)\\;version:\\1" + "ko.version": "^(.+)$\\;version:\\1" }, "website": "http://knockoutjs.com" }, @@ -5253,7 +5253,7 @@ 1 ], "headers": { - "X-KoobooCMS-Version": "(.*)\\;version:\\1" + "X-KoobooCMS-Version": "^(.+)$\\;version:\\1" }, "icon": "Kooboo CMS.png", "implies": "Microsoft ASP.NET", @@ -5337,7 +5337,7 @@ "js": { "L.DistanceGrid": "", "L.PosAnimation": "", - "L.version": "(.*)\\;version:\\1\\;confidence:0" + "L.version": "^(.+)$\\;version:\\1\\;confidence:0" }, "script": "leaflet.*\\.js", "website": "http://leafletjs.com" @@ -5551,7 +5551,7 @@ "icon": "Livefyre.png", "js": { "FyreLoader": "", - "L.version": "(.*)\\;confidence:0\\;version:\\1", + "L.version": "^(.+)$\\;confidence:0\\;version:\\1", "LF.CommentCount": "", "fyre": "" }, @@ -5591,7 +5591,7 @@ "excludes": "Underscore.js", "icon": "Lo-dash.png", "js": { - "_.VERSION": "(.*)\\;confidence:0\\;version:\\1", + "_.VERSION": "^(.+)$\\;confidence:0\\;version:\\1", "_.differenceBy": "" }, "script": "lodash.*\\.js", @@ -5838,7 +5838,7 @@ ], "js": { "Marionette": "", - "Marionette.VERSION": "(.*)\\;version:\\1" + "Marionette.VERSION": "^(.+)$\\;version:\\1" }, "script": "backbone\\.marionette.*\\.js", "website": "https://marionettejs.com" @@ -5894,7 +5894,7 @@ "icon": "MathJax.png", "js": { "MathJax": "", - "MathJax.version": "(.*)\\;version:\\1" + "MathJax.version": "^(.+)$\\;version:\\1" }, "script": "([\\d.]+)?/mathjax\\.js\\;version:\\1", "website": "https://www.mathjax.org" @@ -5993,7 +5993,7 @@ "icon": "MediaElement.js.png", "js": { "mejs": "", - "mejs.version": "(.*)\\;version:\\1" + "mejs.version": "^(.+)$\\;version:\\1" }, "website": "http://www.mediaelementjs.com" }, @@ -6170,7 +6170,7 @@ 1 ], "headers": { - "MicrosoftSharePointTeamServices": "(.*)\\;version:\\1", + "MicrosoftSharePointTeamServices": "^(.+)$\\;version:\\1", "SPRequestGuid": "", "SharePointHealthScore": "", "X-SharePointHealthScore": "" @@ -6307,7 +6307,7 @@ "icon": "MochiKit.png", "js": { "MochiKit": "", - "MochiKit.MochiKit.VERSION": "(.*)\\;version:\\1" + "MochiKit.MochiKit.VERSION": "^(.+)$\\;version:\\1" }, "script": "MochiKit(?:\\.min)?\\.js", "website": "https://mochi.github.io/mochikit/" @@ -6327,7 +6327,7 @@ ], "icon": "Modernizr.svg", "js": { - "Modernizr._version": "(.*)\\;version:\\1" + "Modernizr._version": "^(.+)$\\;version:\\1" }, "script": [ "([\\d.]+)?/modernizr(?:.([\\d.]+))?.*\\.js\\;version:\\1?\\1:\\2" @@ -6407,7 +6407,7 @@ "icon": "Moment.js.svg", "js": { "moment": "", - "moment.version": "(.*)\\;version:\\1" + "moment.version": "^(.+)$\\;version:\\1" }, "script": "moment(?:\\.min)?\\.js", "website": "https://momentjs.com" @@ -6487,7 +6487,7 @@ "icon": "MooTools.png", "js": { "MooTools": "", - "MooTools.version": "(.*)\\;version:\\1" + "MooTools.version": "^(.+)$\\;version:\\1" }, "script": "mootools.*\\.js", "website": "https://mootools.net" @@ -6586,7 +6586,7 @@ ], "icon": "Mustache.png", "js": { - "Mustache.version": "(.*)\\;version:\\1" + "Mustache.version": "^(.+)$\\;version:\\1" }, "script": "mustache(?:\\.min)?\\.js", "website": "https://mustache.github.io" @@ -6650,7 +6650,7 @@ "implies": "D3", "js": { "nv.addGraph": "", - "nv.version": "(.*)\\;confidence:0\\;version:\\1" + "nv.version": "^(.+)$\\;confidence:0\\;version:\\1" }, "script": "nv\\.d3(?:\\.min)?\\.js", "website": "http://nvd3.org" @@ -6750,7 +6750,7 @@ "implies": "PHP", "js": { "Nette": "", - "Nette.version": "(.*)\\;version:\\1" + "Nette.version": "^(.+)$\\;version:\\1" }, "website": "https://nette.org" }, @@ -7108,7 +7108,7 @@ ], "icon": "OpenUI5.png", "js": { - "sap.ui.version": "(.*)\\;version:\\1" + "sap.ui.version": "^(.+)$\\;version:\\1" }, "script": "sap-ui-core\\.js", "website": "http://openui5.org/" @@ -7131,12 +7131,12 @@ 18 ], "headers": { - "X-Powered-By": "Ophal(?: (.*))? \\(ophal\\.org\\)\\;version:\\1" + "X-Powered-By": "Ophal(?: (.+))? \\(ophal\\.org\\)\\;version:\\1" }, "icon": "Ophal.png", "implies": "Lua", "meta": { - "generator": "Ophal(?: (.*))? \\(ophal\\.org\\)\\;version:\\1" + "generator": "Ophal(?: (.+))? \\(ophal\\.org\\)\\;version:\\1" }, "script": "ophal\\.js", "website": "http://ophal.org" @@ -7178,7 +7178,7 @@ 6 ], "headers": { - "OracleCommerceCloud-Version": "(.*)\\;version:\\1" + "OracleCommerceCloud-Version": "^(.+)$\\;version:\\1" }, "html": "<[^>]+id=\"oracle-cc\"", "icon": "Oracle.png", @@ -7239,7 +7239,7 @@ ], "icon": "Outbrain.png", "js": { - "OB_releaseVer": "(.*)\\;version:\\1", + "OB_releaseVer": "^(.+)$\\;version:\\1", "OutbrainPermaLink": "" }, "script": "widgets\\.outbrain\\.com/outbrain\\.js", @@ -7276,7 +7276,7 @@ "icon": "PDF.js.svg", "js": { "PDFJS": "", - "PDFJS.version": "(.*)\\;version:\\1" + "PDFJS.version": "^(.+)$\\;version:\\1" }, "url": "/web/viewer\\.html?file=[^&]\\.pdf", "website": "https://mozilla.github.io/pdf.js/" @@ -7370,7 +7370,7 @@ ], "icon": "paperjs.png", "js": { - "paper.version": "(.*)\\;version:\\1" + "paper.version": "^(.+)$\\;version:\\1" }, "website": "http://paperjs.org/" }, @@ -7516,7 +7516,7 @@ "icon": "Phaser.png", "js": { "Phaser": "", - "Phaser.VERSION": "(.*)\\;version:\\1" + "Phaser.VERSION": "^(.+)$\\;version:\\1" }, "website": "https://phaser.io" }, @@ -7684,7 +7684,7 @@ "html": "(?:<polymer-[^>]+|<link[^>]+rel=\"import\"[^>]+/polymer\\.html\")", "icon": "Polymer.png", "js": { - "Polymer.version": "(.*)\\;version:\\1" + "Polymer.version": "^(.+)$\\;version:\\1" }, "script": "polymer\\.js", "website": "http://polymer-project.org" @@ -7825,7 +7825,7 @@ ], "icon": "Prototype.png", "js": { - "Prototype.Version": "(.*)\\;version:\\1" + "Prototype.Version": "^(.+)$\\;version:\\1" }, "script": "(?:prototype|protoaculous)(?:-([\\d.]*[\\d]))?.*\\.js\\;version:\\1", "website": "http://www.prototypejs.org" @@ -7884,7 +7884,7 @@ "PUBLICCMS_USER": "" }, "headers": { - "X-Powered-PublicCMS": "(.*)\\;version:\\1" + "X-Powered-PublicCMS": "^(.+)$\\;version:\\1" }, "icon": "Public CMS.png", "implies": "Java", @@ -8100,7 +8100,7 @@ ], "icon": "Raphael.png", "js": { - "Raphael.version": "(.*)\\;version:\\1" + "Raphael.version": "^(.+)$\\;version:\\1" }, "script": "raphael(?:-([\\d.]+))?(?:\\.min)?\\.js\\;version:\\1", "website": "https://dmitrybaranovskiy.github.io/raphael/" @@ -8158,7 +8158,7 @@ "icon": "redoc.png", "implies": "React", "js": { - "Redoc.version": "(.*)\\;version:\\1" + "Redoc.version": "^(.+)$\\;version:\\1" }, "script": "/redoc\\.(?:min\\.)?js", "website": "https://github.com/Rebilly/ReDoc" @@ -8170,8 +8170,8 @@ "html": "<[^>]+data-react", "icon": "React.png", "js": { - "React.version": "(.*)\\;version:\\1", - "react.version": "(.*)\\;version:\\1" + "React.version": "^(.+)$\\;version:\\1", + "react.version": "^(.+)$\\;version:\\1" }, "script": [ "react(?:-with-addons)?[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", @@ -8235,7 +8235,7 @@ ], "icon": "RequireJS.png", "js": { - "requirejs.version": "(.*)\\;version:\\1" + "requirejs.version": "^(.+)$\\;version:\\1" }, "script": "require.*\\.js", "website": "http://requirejs.org" @@ -8258,7 +8258,7 @@ "icon": "Reveal.js.png", "implies": "Highlight.js", "js": { - "Reveal.VERSION": "(.*)\\;version:\\1" + "Reveal.VERSION": "^(.+)$\\;version:\\1" }, "script": "(?:^|/)reveal(?:\\.min)?\\.js", "website": "http://lab.hakim.se/reveal-js" @@ -8377,7 +8377,7 @@ "Microsoft ASP.NET" ], "meta": { - "generator": "^Rock v.*" + "generator": "^Rock v([0-9.]+)\\;version:\\1" }, "website": "http://www.rockrms.com" }, @@ -9156,7 +9156,7 @@ ], "icon": "Snap.svg.png", "js": { - "Snap.version": "(.*)\\;version:\\1" + "Snap.version": "^(.+)$\\;version:\\1" }, "script": "snap\\.svg(?:-min)?\\.js", "website": "http://snapsvg.io" @@ -9191,7 +9191,7 @@ "implies": "Node.js", "js": { "io.Socket": "", - "io.version": "(.*)\\;version:\\1" + "io.version": "^(.+)$\\;version:\\1" }, "script": "socket\\.io.*\\.js", "website": "https://socket.io" @@ -9491,7 +9491,7 @@ "html": "<input[^>]+data-stripe", "icon": "Stripe.png", "js": { - "Stripe.version": "(.*)\\;version:\\1" + "Stripe.version": "^(.+)$\\;version:\\1" }, "script": "js\\.stripe\\.com", "website": "http://stripe.com" @@ -9885,7 +9885,7 @@ "application-name": "^TiddlyWiki$", "copyright": "^TiddlyWiki created by Jeremy Ruston", "generator": "^TiddlyWiki$", - "tiddlywiki-version": "(.*)\\;version:\\1" + "tiddlywiki-version": "^(.+)$\\;version:\\1" }, "website": "http://tiddlywiki.com" }, @@ -10051,7 +10051,7 @@ ], "icon": "TweenMax.png", "js": { - "TweenMax.version": "(.*)\\;version:\\1" + "TweenMax.version": "^(.+)$\\;version:\\1" }, "script": "TweenMax(?:\\.min)?\\.js", "website": "http://greensock.com/tweenmax" @@ -10160,7 +10160,7 @@ ], "icon": "Typekit.png", "js": { - "Typekit.config.js": "(.*)\\;version:\\1" + "Typekit.config.js": "^(.+)$\\;version:\\1" }, "script": "use\\.typekit\\.com", "website": "http://typekit.com" @@ -10224,8 +10224,8 @@ "js": { "ucCatalog": "" }, - "script": "cgi-bin\\/UCJavaScript\\?(?:[^\"]*&)?merchantid=", - "url": "/cgi-bin/UCEditor\\?(?:.*&)?merchantid=", + "script": "cgi-bin\\/UCJavaScript\\?", + "url": "/cgi-bin/UCEditor\\?", "website": "http://ultracart.com" }, "Umbraco": { @@ -10233,7 +10233,7 @@ 1 ], "headers": { - "X-Umbraco-Version": "(.*)\\;version:\\1" + "X-Umbraco-Version": "^(.+)$\\;version:\\1" }, "html": "powered by <a href=[^>]+umbraco", "icon": "Umbraco.png", @@ -10269,7 +10269,7 @@ "excludes": "Lodash", "icon": "Underscore.js.png", "js": { - "_.VERSION": "(.*)\\;confidence:0\\;version:\\1", + "_.VERSION": "^(.+)$\\;confidence:0\\;version:\\1", "_.restArguments": "" }, "script": "underscore.*\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1", @@ -10611,7 +10611,7 @@ "html": "<[^>]+data-v(?:ue)-", "icon": "Vue.js.png", "js": { - "Vue.version": "(.*)\\;version:\\1" + "Vue.version": "^(.+)$\\;version:\\1" }, "script": [ "vue[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", @@ -10922,7 +10922,7 @@ ], "icon": "Wink.png", "js": { - "wink.version": "(.*)\\;version:\\1" + "wink.version": "^(.+)$\\;version:\\1" }, "script": "(?:_base/js/base|wink).*\\.js", "website": "http://winktoolkit.org" @@ -11134,7 +11134,7 @@ ], "icon": "XRegExp.png", "js": { - "XRegExp.version": "(.*)\\;version:\\1" + "XRegExp.version": "^(.+)$\\;version:\\1" }, "script": [ "xregexp[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", @@ -11253,8 +11253,8 @@ ], "icon": "YUI.png", "js": { - "YAHOO.VERSION": "(.*)\\;version:\\1", - "YUI.version": "(.*)\\;version:\\1" + "YAHOO.VERSION": "^(.+)$\\;version:\\1", + "YUI.version": "^(.+)$\\;version:\\1" }, "script": "(?:/yui/|yui\\.yahooapis\\.com)", "website": "http://yuilibrary.com" @@ -11756,7 +11756,7 @@ ], "icon": "ef.js.svg", "js": { - "ef.version": "(.*)\\;version:\\1", + "ef.version": "^(.+)$\\;version:\\1", "efCore": "" }, "script": "/ef(?:-core)?(?:\\.min|\\.dev)?\\.js", @@ -11976,7 +11976,7 @@ "icon": "jQuery Mobile.svg", "implies": "jQuery", "js": { - "jQuery.mobile.version": "(.*)\\;version:\\1" + "jQuery.mobile.version": "^(.+)$\\;version:\\1" }, "script": "jquery[.-]mobile(?:-([\\d.]))?(?:\\.min)?\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1?\\1:\\2", "website": "https://jquerymobile.com" @@ -12013,7 +12013,7 @@ "icon": "jQuery UI.svg", "implies": "jQuery", "js": { - "jQuery.ui.version": "(.*)\\;version:\\1" + "jQuery.ui.version": "^(.+)$\\;version:\\1" }, "script": [ "jquery-ui[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", @@ -12512,7 +12512,7 @@ ], "icon": "script.aculo.us.png", "js": { - "Scriptaculous.Version": "(.*)\\;version:\\1" + "Scriptaculous.Version": "^(.+)$\\;version:\\1" }, "script": "/(?:scriptaculous|protoaculous)(?:\\.js|/)", "website": "https://script.aculo.us" @@ -12524,7 +12524,7 @@ "icon": "scrollreveal.svg", "html": "<[^>]+data-sr(?:-id)", "js": { - "ScrollReveal().version": "(.*)\\;version:\\1" + "ScrollReveal().version": "^(.+)$\\;version:\\1" }, "script": "scrollreveal(?:\\.min)(?:\\.js)", "website": "https://scrollrevealjs.org" @@ -12570,7 +12570,7 @@ ], "icon": "three.js.png", "js": { - "THREE.REVISION": "(.*)\\;version:\\1" + "THREE.REVISION": "^(.+)$\\;version:\\1" }, "script": "three(?:\\.min)?\\.js", "website": "https://threejs.org" From 34e488b44344ead8c78cc3ba728c43605cda1b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D9=81=D8=B1=D9=88=D8=B4=DA=AF=D8=A7=D9=87=20=D8=B3=D8=A7?= =?UTF-8?q?=D8=B2=20=D8=B1=D8=A7=DB=8C=DA=AF=D8=A7=D9=86=20=D8=B4=D8=A7?= =?UTF-8?q?=D9=BE=D8=B1=D9=81=D8=A7?= <45184786+shoperfa@users.noreply.github.com> Date: Sat, 24 Nov 2018 07:00:07 +0330 Subject: [PATCH 070/197] added Shoperfa to apps.json (#2561) * add shoperfa e-commerce icon add shoperfa e-commerce icon to icon package * add shoperfa website add shoperfa website to Ecommerce Technologies --- src/apps.json | 11 +++++++++++ src/icons/Shoperfa.png | Bin 0 -> 2046 bytes 2 files changed, 11 insertions(+) create mode 100644 src/icons/Shoperfa.png diff --git a/src/apps.json b/src/apps.json index 6242b3378..e0dd3b66d 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12684,6 +12684,17 @@ "url": "^https?://(?:www\\.)?virgool\\.io", "website": "https://virgool.io" }, + "shoperfa": { + "cats": [ + 6 + ], + "headers": { + "X-Powered-By": "^Shoperfa$" + }, + "icon": "Shoperfa.png", + "url": "^https?://(?:www\\.)?shoperfa\\.com", + "website": "https://shoperfa.com" + }, "webEdition": { "cats": [ 1 diff --git a/src/icons/Shoperfa.png b/src/icons/Shoperfa.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bc62af867d75ff890432b0ae6c4ad45d8974de GIT binary patch literal 2046 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 P_eT!!4Q4da;<En>!{kk$ literal 0 HcmV?d00001 From 1b47bf311ff83b0896aa6acdddc973d4f8e380fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsombor=20Par=C3=B3czi?= <zsombor.paroczi@gmail.com> Date: Sat, 24 Nov 2018 04:30:54 +0100 Subject: [PATCH 071/197] Less meta regex (#2565) --- src/wappalyzer.js | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/wappalyzer.js b/src/wappalyzer.js index c8300c916..05e9121ba 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -160,6 +160,8 @@ class Wappalyzer { this.detected[url.canonical] = {}; } + const metas = []; + // Additional information let language = null; @@ -171,6 +173,20 @@ class Wappalyzer { const matches = data.html.match(/<html[^>]*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"/i); language = matches && matches.length ? matches[1] : null; + + // grab metas + const regex = /<meta[^>]+>/ig; + let metaMatches; + do { + metaMatches = regex.exec(html); + + if (!metaMatches) { + break; + } + + const [match] = metaMatches; + metas.push(match); + } while (metaMatches); } Object.keys(this.apps).forEach((appName) => { @@ -184,7 +200,7 @@ class Wappalyzer { if (html) { promises.push(this.analyzeHtml(app, html)); - promises.push(this.analyzeMeta(app, html)); + promises.push(this.analyzeMeta(app, metas)); } if (scripts) { @@ -556,8 +572,7 @@ class Wappalyzer { /** * Analyze meta tag */ - analyzeMeta(app, html) { - const regex = /<meta[^>]+>/ig; + analyzeMeta(app, metas) { const patterns = this.parsePatterns(app.props.meta); const promises = []; @@ -565,17 +580,7 @@ class Wappalyzer { return Promise.resolve(); } - let matches; - - do { - matches = regex.exec(html); - - if (!matches) { - break; - } - - const [match] = matches; - + metas.forEach((match) => { Object.keys(patterns).forEach((meta) => { const r = new RegExp(`(?:name|property)=["']${meta}["']`, 'i'); @@ -589,7 +594,7 @@ class Wappalyzer { })); } }); - } while (matches); + }); return Promise.all(promises); } From aca25bfb071e2303cc1d73ac2d882780094c2fd7 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:31:05 +0000 Subject: [PATCH 072/197] Improve a bit typo3 detection (#2533) This can be checked [here](http://www.gertrudhof.ch/index.php?id=1) --- src/apps.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index e0dd3b66d..5e65b7615 100644 --- a/src/apps.json +++ b/src/apps.json @@ -9704,14 +9704,18 @@ "cats": [ 1 ], - "html": "<(?:script[^>]+ src|link[^>]+ href)=[^>]+typo3temp/", + "html": [ + "<link[^>]+ href=\"typo3(?:conf|temp)/", + "<img[^>]+ src=\"typo3(?:conf|temp)/" + ], "icon": "TYPO3.svg", "implies": "PHP", + "script": "^typo3(?:conf|temp)/", "meta": { "generator": "TYPO3\\s+(?:CMS\\s+)?([\\d.]+)?(?:\\s+CMS)?\\;version:\\1" }, "url": "/typo3/", - "website": "http://www.typo3.org" + "website": "https://typo3.org/" }, "Taiga": { "cats": [ From ba6487640d12a659888d8b857523fc798ee9bc9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsombor=20Par=C3=B3czi?= <zsombor.paroczi@gmail.com> Date: Sat, 24 Nov 2018 04:32:33 +0100 Subject: [PATCH 073/197] Remove split / concat when htmlMaxRows and htmlMaxCols is 0 (#2539) --- src/drivers/npm/driver.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js index aa9e6a78b..8d099add3 100644 --- a/src/drivers/npm/driver.js +++ b/src/drivers/npm/driver.js @@ -282,13 +282,17 @@ class Driver { let html = ''; try { - html = browser.html() - .replace(new RegExp(`(.{${this.options.htmlMaxCols},}[^>]*>)<`, 'g'), (match, p1) => `${p1}\n<`) - .split('\n') - .slice(0, this.options.htmlMaxRows / 2) - .concat(html.slice(html.length - this.options.htmlMaxRows / 2)) - .map(line => line.substring(0, this.options.htmlMaxCols)) - .join('\n'); + if ((this.options.htmlMaxCols === 0) && (this.options.htmlMaxRows === 0)) { + html = browser.html().replace(new RegExp('<', 'g'), '\n<'); + } else { + html = browser.html() + .replace(new RegExp(`(.{${this.options.htmlMaxCols},}[^>]*>)<`, 'g'), (match, p1) => `${p1}\n<`) + .split('\n') + .slice(0, this.options.htmlMaxRows / 2) + .concat(html.slice(html.length - this.options.htmlMaxRows / 2)) + .map(line => line.substring(0, this.options.htmlMaxCols)) + .join('\n'); + } } catch (error) { this.wappalyzer.log(error.message, 'browser', 'error'); } From cb71babf0dc4944237811965dd392c699776a1ff Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:32:48 +0000 Subject: [PATCH 074/197] Improve a bit the regexp for phpbb (#2551) - Split the regexp - Simplify some parts --- src/apps.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 5e65b7615..911d57dd9 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12332,7 +12332,13 @@ "cookies": { "phpbb": "" }, - "html": "(?:Powered by <a[^>]+phpbb|<a[^>]+phpbb[^>]+class=\\.copyright|\\tphpBB style name|<[^>]+styles/(?:sub|pro)silver/theme|<img[^>]+i_icon_mini|<table class=\"forumline)", + "html": [ + "Powered by <a[^>]+phpBB", + "<div class=phpbb_copyright>", + "<[^>]+styles/(?:sub|pro)silver/theme", + "<img[^>]+i_icon_mini", + "<table class=\"[^\"]*forumline" + ], "icon": "phpBB.png", "implies": "PHP", "js": { From 655261781fe90fad80fe7177eec1a3e00847746c Mon Sep 17 00:00:00 2001 From: Antoni Kepinski <keppi@o2.pl> Date: Sat, 24 Nov 2018 04:33:02 +0100 Subject: [PATCH 075/197] Update styled-components detection (#2556) * Update styled-components detection * Add version detection & support older style tag * Fix typo --- src/apps.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 911d57dd9..a91091a05 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12554,7 +12554,10 @@ 12, 47 ], - "html": "<style[^>]*data-styled-components", + "html": [ + "<style[^>]*data-styled(?:-components)?[\\s\"]", + "<style[^>]+data-styled-version=\"([0-9]+)\"\\;version:\\1" + ], "icon": "styled-components.png", "implies": [ "React" From 243c33cd1781563f051483a7c4e47d207714f45a Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:40:52 +0000 Subject: [PATCH 076/197] Move <script regex to the "script" section (#2553) --- src/apps.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/apps.json b/src/apps.json index a91091a05..e0040da64 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1318,7 +1318,7 @@ "cats": [ 32 ], - "html": "<script[^>]*>[^>]+\\.src\\s*=\\s*['\"](?:https?:)?//tag\\.bounceexchange\\.com/", + "script": "//tag\\.bounceexchange\\.com/", "icon": "Bounce Exchange.svg", "js": { "bouncex": "" @@ -1442,7 +1442,7 @@ "cats": [ 36 ], - "html": "<script[^>]*>[^<]+?bsa\\.src\\s*=\\s*['\"](?:https?:)?\\/{2}\\w\\d\\.buysellads\\.com\\/[\\w\\d\\/]+?bsa\\.js['\"]", + "script": "\\.buysellads\\.com/", "icon": "BuySellAds.png", "js": { "_bsa": "", @@ -9943,7 +9943,6 @@ "cats": [ 36 ], - "html": "<script[^>]+>var titan", "icon": "Titan.png", "js": { "titan": "", From ed12267808104dc799a0a7d63a8f04fbb2f263e3 Mon Sep 17 00:00:00 2001 From: jvoisin <jvoisin@users.noreply.github.com> Date: Sat, 24 Nov 2018 03:42:56 +0000 Subject: [PATCH 077/197] Improve a bit wordpress detection (#2534) --- src/apps.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps.json b/src/apps.json index e0040da64..0759ee03a 100644 --- a/src/apps.json +++ b/src/apps.json @@ -11028,7 +11028,7 @@ 11 ], "html": [ - "<link rel=[\"']stylesheet[\"'] [^>]+wp-(?:content|includes)", + "<link rel=[\"']stylesheet[\"'] [^>]+/wp-(?:content|includes)/", "<div[^>]*class=[\"']amp-wp-", "<link[^>]+s\\d+\\.wp\\.com" ], @@ -11044,10 +11044,10 @@ "wp_username": "" }, "meta": { - "generator": "WordPress( [\\d.]+)?\\;version:\\1" + "generator": "^WordPress ?([\\d.]+)?\\;version:\\1" }, - "script": "/wp-includes/", - "website": "http://wordpress.org" + "script": "/wp-(?:content|includes)/", + "website": "https://wordpress.org" }, "WordPress Super Cache": { "cats": [ From 519f190b780d48bf4fec71a9926cb47f16fafd30 Mon Sep 17 00:00:00 2001 From: Kirtan Gajjar <kirtangajjar95@gmail.com> Date: Fri, 30 Nov 2018 03:03:06 +0530 Subject: [PATCH 078/197] Add EasyEngine app (#2566) --- src/apps.json | 14 ++++++++++++++ src/icons/EasyEngine.png | Bin 0 -> 4635 bytes 2 files changed, 14 insertions(+) create mode 100644 src/icons/EasyEngine.png diff --git a/src/apps.json b/src/apps.json index 0759ee03a..8a796fa0d 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2745,6 +2745,20 @@ "script": "dtagent.*\\.js", "website": "http://dynatrace.com" }, + "EasyEngine": { + "cats": [ + 47, + 9 + ], + "icon": "EasyEngine.png", + "implies": [ + "Docker" + ], + "headers": { + "x-powered-by": "^EasyEngine (.*)$\\;version:\\1" + }, + "website": "https://easyengine.io" + }, "EC-CUBE": { "cats": [ 6 diff --git a/src/icons/EasyEngine.png b/src/icons/EasyEngine.png new file mode 100644 index 0000000000000000000000000000000000000000..737ecd1b7931f593a6d3e1f310cba060595d77e0 GIT binary patch literal 4635 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 KV~a5M;r{`vyfN$m literal 0 HcmV?d00001 From 1c43b42e54525cbc699ca504ec912200fecc5176 Mon Sep 17 00:00:00 2001 From: Arnaud Ligny <arnaud@ligny.org> Date: Thu, 29 Nov 2018 22:33:56 +0100 Subject: [PATCH 079/197] PHPoole is now Cecil! \o/ (#2568) * PHPoole is now Cecil! \o/ * PHPoole -> Cecil --- src/apps.json | 8 ++++---- src/icons/{PHPoole.png => Cecil.png} | Bin 2 files changed, 4 insertions(+), 4 deletions(-) rename src/icons/{PHPoole.png => Cecil.png} (100%) diff --git a/src/apps.json b/src/apps.json index 8a796fa0d..080229888 100644 --- a/src/apps.json +++ b/src/apps.json @@ -7345,15 +7345,15 @@ ], "website": "http://phpdebugbar.com/" }, - "PHPoole": { + "Cecil": { "cats": [ 57 ], - "icon": "PHPoole.png", + "icon": "Cecil.png", "meta": { - "generator": "^PHPoole$" + "generator": "^Cecil|PHPoole$" }, - "website": "https://phpoole.org" + "website": "https://cecil.app" }, "Pagekit": { "cats": [ diff --git a/src/icons/PHPoole.png b/src/icons/Cecil.png similarity index 100% rename from src/icons/PHPoole.png rename to src/icons/Cecil.png From c1de3aec6068142c6c7fff7ace61c51bff8f7c3f Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Fri, 30 Nov 2018 13:52:00 +1100 Subject: [PATCH 080/197] NPM performance improvements --- src/drivers/npm/driver.js | 26 ++++++++++++++++++-------- src/drivers/npm/npm-shrinkwrap.json | 2 +- src/drivers/npm/package.json | 2 +- src/drivers/webextension/manifest.json | 2 +- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js index aa9e6a78b..c934eb7f9 100644 --- a/src/drivers/npm/driver.js +++ b/src/drivers/npm/driver.js @@ -106,7 +106,8 @@ class Driver { this.wappalyzer.parseJsPatterns(); this.wappalyzer.driver.log = (message, source, type) => this.log(message, source, type); - this.wappalyzer.driver.displayApps = (detected, meta, context) => this.displayApps(detected, meta, context); + this.wappalyzer.driver + .displayApps = (detected, meta, context) => this.displayApps(detected, meta, context); process.on('uncaughtException', e => this.wappalyzer.log(`Uncaught exception: ${e.message}`, 'driver', 'error')); } @@ -282,17 +283,26 @@ class Driver { let html = ''; try { - html = browser.html() - .replace(new RegExp(`(.{${this.options.htmlMaxCols},}[^>]*>)<`, 'g'), (match, p1) => `${p1}\n<`) - .split('\n') - .slice(0, this.options.htmlMaxRows / 2) - .concat(html.slice(html.length - this.options.htmlMaxRows / 2)) - .map(line => line.substring(0, this.options.htmlMaxCols)) - .join('\n'); + html = browser.html(); } catch (error) { this.wappalyzer.log(error.message, 'browser', 'error'); } + const chunks = []; + const maxCols = this.options.htmlMaxCols; + const maxRows = this.options.htmlMaxRows; + const rows = html.length / maxCols; + + let i; + + for (i = 0; i < rows; i += 1) { + if (i < maxRows / 2 || i > rows - maxRows / 2) { + chunks.push(html.slice(i * maxCols, (i + 1) * maxCols)); + } + } + + html = chunks.join('\n'); + return html; } diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index ae0b7f7cc..f76d89198 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.5.5", + "version": "5.5.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index 88df89fd2..0d4e60cec 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "5.5.3", + "version": "5.5.5", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index a17e6b097..41b1b0886 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://www.wappalyzer.com", "description": "Identify web technologies", - "version": "5.5.3", + "version": "5.5.5", "default_locale": "en", "manifest_version": 2, "icons": { From da42ffa47a8bd2e596852bce6b4a98040f95e829 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Fri, 7 Dec 2018 13:41:25 +1100 Subject: [PATCH 081/197] Rename Contens to Contensis --- src/apps.json | 10 +++++----- src/drivers/npm/index.js | 4 ++++ src/icons/{Contens.png => Contensis.png} | Bin 3 files changed, 9 insertions(+), 5 deletions(-) rename src/icons/{Contens.png => Contensis.png} (100%) diff --git a/src/apps.json b/src/apps.json index 080229888..85a182a1c 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2049,11 +2049,11 @@ }, "website": "http://contenido.org/en" }, - "Contens": { + "Contensis": { "cats": [ 1 ], - "icon": "Contens.png", + "icon": "Contensis.png", "implies": [ "Java", "CFML" @@ -2061,7 +2061,7 @@ "meta": { "generator": "Contensis CMS Version ([\\d.]+)\\;version:\\1" }, - "website": "http://www.contens.com/en/pub/index.cfm" + "website": "https://zengenti.com/en-gb/products/contensis" }, "ContentBox": { "cats": [ @@ -2772,7 +2772,7 @@ "website": "http://www.ec-cube.net" }, "Elementor": { - "cats": [ + "cats": [ 1, 11, 51 @@ -2783,7 +2783,7 @@ "<link [^>]*href=(?:\"|')[^\"']*elementor/assets", "<link [^>]*href=(?:\"|')[^\"']*uploads/elementor/css" ], - "js": { + "js": { "elementorFrontend.getElements": "" }, "script": "elementor/assets/js/[^/]+\\.js\\?ver=([\\d.]+)$\\;version:\\1", diff --git a/src/drivers/npm/index.js b/src/drivers/npm/index.js index cdff2ba3d..46640915a 100755 --- a/src/drivers/npm/index.js +++ b/src/drivers/npm/index.js @@ -32,6 +32,10 @@ do { const wappalyzer = new Wappalyzer(url, options); +wappalyzer.log = (message) => { + process.stdout.write('xx'); +}; + wappalyzer.analyze() .then((json) => { process.stdout.write(`${JSON.stringify(json)}\n`); diff --git a/src/icons/Contens.png b/src/icons/Contensis.png similarity index 100% rename from src/icons/Contens.png rename to src/icons/Contensis.png From d62e99e1dedcbde11cd79b2f5e31bf208c9415ba Mon Sep 17 00:00:00 2001 From: HazCod <HazCod@users.noreply.github.com> Date: Fri, 7 Dec 2018 04:35:33 +0100 Subject: [PATCH 082/197] Remove typo string (#2571) --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 080229888..24a54a4a5 100644 --- a/src/apps.json +++ b/src/apps.json @@ -9708,7 +9708,7 @@ }, "tailwindcss": { "cats": [ - "18" + 18 ], "html": "<link[^>]+?href=\"[^\"]+tailwindcss(?:\\.min)?\\.css", "icon": "tailwindcss.svg", From ebb5dfbd8f4e2c9dd80f8268dfe3f5d7b5284e28 Mon Sep 17 00:00:00 2001 From: Alexander Lichter <manniL@gmx.net> Date: Fri, 7 Dec 2018 03:36:00 +0000 Subject: [PATCH 083/197] feat: add Nuxt.js (#2572) * Add Nuxt.js * fix HTML pattern * fix json * fix script regex * Add icon * Remove unncecessary capture groups * add window nuxt check * fix slash --- src/apps.json | 18 ++++++++++++++++++ src/icons/Nuxt.js.png | Bin 0 -> 1303 bytes 2 files changed, 18 insertions(+) create mode 100644 src/icons/Nuxt.js.png diff --git a/src/apps.json b/src/apps.json index 24a54a4a5..77cb7fbbd 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10636,6 +10636,24 @@ ], "website": "http://vuejs.org" }, + "Nuxt.js": { + "cats": [ + 12 + ], + "html": [ + "<div [^>]*id=\"__nuxt\"", + "<script [^>]*>window\\.__NUXT__" + ], + "icon": "Nuxt.js.png", + "js": { + "$nuxt": "" + }, + "script": [ + "/_nuxt/" + ], + "implies": "Vue.js", + "website": "https://nuxtjs.org" + }, "W3 Total Cache": { "cats": [ 23 diff --git a/src/icons/Nuxt.js.png b/src/icons/Nuxt.js.png new file mode 100644 index 0000000000000000000000000000000000000000..cb014676b5c1d79042448afe43325a6317bc1157 GIT binary patch literal 1303 zcmV+y1?c*TP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;tT`;7&ee=XTJad1f)qs zK~z}7?N(b%6lWCvW_M?I1)&JBl`6)*5RyK$A!sSpf+#m(0Re4|lv+R}ZM0HLb+s|H z<=Pg!Mky7wX`7(d!WK=lT<Qi8qDGp~Cauw=#o8hP<hDD^?#};DA7EhzhRae+Up!AU z=bSn7&G-H1%mJR5i<W3A!)8;N$NvgqLtVkmO^u(uun@Hrt|SN69E8qP8b~Nz%?q~k zljD27{z8G&sK*DOJ+TmGexwEfs7PPjSYMb50GrG50014GcTM=l`1k-sHx%ndh<=WH zN@*nkRKJ&p_4&Dxc0pJdS#)6Uf&)lvISl}?65)`upNgV7qQ3A100=}d0sv>T7P<m} znQP+4y24t4lDH`a7(mfs$>S}2p2MeBsf?_OjjlUTv~Us#l*G#U>9ByIw(dOVN;W}= z4DemWE|>)2#)A8@Y^fOVb=?p-0y<!q5c6~Aoj(EK^p7?FO#+>%G;o;bZp+2UUmQj* zJphyp7_|cGpd|ni$K&1}o*}jSK5m;A18+2+0sxqKu2mMfRtetN4Jb#yL9|kkPEL~3 zZyss{faGJJ%#VTShT;!+!CoR4v)%58t*Hl4Fp_H8U~h<Y!lhMfavBeo9CZnR?x#}p z*m@OOxDk2Y7?_XU1*kYR^b`v=z(dj|zMh_{e};!h>)|7Flb|+yA3T(vHPb=nuXaha zmUP9S9T1#iqKG~VXOMgOv;cJ1K7Yne1f5(=v=9it56vi^?UzAG+$Pv#BTMvtvjW)K zbR1*TtV6c4iowX`zooj%fwWQ3K|$i<t=8)RP}ORh`3yug6o**_`!(6N>*O$U`N8<f zpUpJE-hh)DZW?W5y}r0!7C^G;C^Tvf`*8S?jXED=r?0o1ya&-r=RD_C%iW+{p`D;x zp@9Fg6{=p#5HaNBO=Tdap(MddgaSx#kLh^p5v;AfF8n>l+VCYGDJ!hHpg~_;H6^jF z{nuHGy{-Rr{Ca0@{=By!uYfT5Gq5#V?{%@fXuxqFl8~V#0^x65J&)J24=uY;UhvR4 ze@oVWpGy@beXk~Eu?m(ImM`@YySjU@)Mp7psi<*x)9}CD>s&(!(E?BcAgoG7+iK6Y z$Rb-4yF&zku#{{7Ku}EDM?o=Z3IGUA%9^t31jVG~0zlkbIqWM585bP>(4?&GlXF*Z zdUJfPtPG5rb`F?A;xkO9@5)`G^vby-b}EXcp()wnA@Lc0B4D1W<?pu}rv;!?Diz5g z@#!aB)wS)1vo|Rr0Stq(rtd2Z^IplCtH106!+e#H{=S!FAt6MNn>ms>LFn@UqjUwh zYO-T(LMB=aXKsbWr&j{_V*&u>BDcNEj_{m)@nUyqS=H0sef>k@&n0H++}#)DbDVYL zWnKF5w#Mswz}<0~0k;;z83f1fz^awcW-<)3pVHC6bK}anEf&sP1t4i~a5$@{e;~Kj zP+74qaVOR$X8JP><8S=-L|1cl#eiDPUJQ@h5HN|VMYE!bOUsc=jnJfB?%Q`C1^`67 z{tf_OeM<IoVJX?Z01&Zl)EAn(%iZzJ?hi-ThfS$_B@)I@s{O<q_AfK#&>&pT$+rLi N002ovPDHLkV1nk?W1Ij0 literal 0 HcmV?d00001 From ea900bfd1f1855424f1fd346f3ced47694d8711f Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Fri, 7 Dec 2018 15:34:00 +1100 Subject: [PATCH 084/197] Fix options --- src/drivers/npm/index.js | 4 ---- src/drivers/webextension/js/driver.js | 20 +++++++++----------- src/drivers/webextension/js/options.js | 8 +++++--- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/drivers/npm/index.js b/src/drivers/npm/index.js index 46640915a..cdff2ba3d 100755 --- a/src/drivers/npm/index.js +++ b/src/drivers/npm/index.js @@ -32,10 +32,6 @@ do { const wappalyzer = new Wappalyzer(url, options); -wappalyzer.log = (message) => { - process.stdout.write('xx'); -}; - wappalyzer.analyze() .then((json) => { process.stdout.write(`${JSON.stringify(json)}\n`); diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index 6f339da05..f698fba57 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -25,20 +25,18 @@ browser.tabs.onRemoved.addListener((tabId) => { * Get a value from localStorage */ function getOption(name, defaultValue = null) { - return new Promise((resolve, reject) => { - const callback = (item) => { - options[name] = item[name] ? item[name] : defaultValue; + return new Promise(async (resolve) => { + let option = defaultValue; - resolve(options[name]); - }; + try { + option = await browser.storage.local.get(name); + } catch (error) { + wappalyzer.log(error, 'driver', 'error'); + } - browser.storage.local.get(name) - .then(callback) - .catch((error) => { - wappalyzer.log(error, 'driver', 'error'); + options[name] = option; - reject(); - }); + resolve(option); }); } diff --git a/src/drivers/webextension/js/options.js b/src/drivers/webextension/js/options.js index 935d11318..2282498df 100644 --- a/src/drivers/webextension/js/options.js +++ b/src/drivers/webextension/js/options.js @@ -1,5 +1,7 @@ /** global: browser */ /** global: Wappalyzer */ +/* globals browser chrome Wappalyzer */ +/* eslint-env browser */ const wappalyzer = new Wappalyzer(); @@ -26,15 +28,15 @@ document.addEventListener('DOMContentLoaded', () => { }); document.querySelector('#github').addEventListener('click', () => { - open(wappalyzer.config.githubURL); + window.open(wappalyzer.config.githubURL); }); document.querySelector('#twitter').addEventListener('click', () => { - open(wappalyzer.config.twitterURL); + window.open(wappalyzer.config.twitterURL); }); document.querySelector('#wappalyzer').addEventListener('click', () => { - open(wappalyzer.config.websiteURL); + window.open(wappalyzer.config.websiteURL); }); getOption('upgradeMessage', true, (value) => { From 518b1d1462df8a804cb11a1affa2ed58a7dd8e67 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Fri, 7 Dec 2018 15:51:30 +1100 Subject: [PATCH 085/197] Build 5.5.6 --- src/apps.json | 130 ++++++++++++------------- src/drivers/npm/npm-shrinkwrap.json | 2 +- src/drivers/npm/package.json | 2 +- src/drivers/webextension/manifest.json | 2 +- 4 files changed, 67 insertions(+), 69 deletions(-) diff --git a/src/apps.json b/src/apps.json index fe379ed19..d5fc00f67 100644 --- a/src/apps.json +++ b/src/apps.json @@ -20,7 +20,7 @@ 6 ], "icon": "91app.png", - "script": "https\\:\/\/track\\.91app\\.io\/track\\.js\\?", + "script": "https\\:\\/\\/track\\.91app\\.io\\/track\\.js\\?", "website": "https://www.91app.com/" }, "3dCart": { @@ -642,7 +642,7 @@ 18 ], "icon": "AngularJS.svg", - "implies": "AngularJS", + "implies": "AngularJS", "js": { "ngMaterial": "" }, @@ -674,9 +674,9 @@ ], "icon": "AngularJS.svg", "html": [ - "<(?:div|html)[^>]+ng-app=", - "<ng-app" - ], + "<(?:div|html)[^>]+ng-app=", + "<ng-app" + ], "js": { "angular": "", "angular.version.full": "^(.+)$\\;version:\\1" @@ -1318,12 +1318,11 @@ "cats": [ 32 ], - "script": "//tag\\.bounceexchange\\.com/", + "script": "^https?://tag\\.bounceexchange\\.com/", "icon": "Bounce Exchange.svg", "js": { "bouncex": "" }, - "script": "^https?://tag\\.bounceexchange\\.com/", "website": "http://www.bounceexchange.com" }, "Braintree": { @@ -1393,7 +1392,7 @@ "html": [ "href=\"enter_bug\\.cgi\">", "<main id=\"bugzilla-body\"", - "<a href=\"https?://www\\.bugzilla\\.org/docs/([0-9.]+)/[^>]+>Help<\\;version:\\1", + "<a href=\"https?://www\\.bugzilla\\.org/docs/([0-9.]+)/[^>]+>Help<\\;version:\\1", "<span id=\"information\" class=\"header_addl_info\">version ([\\d.]+)<\\;version:\\1" ], "cookies": { @@ -1442,7 +1441,7 @@ "cats": [ 36 ], - "script": "\\.buysellads\\.com/", + "script": "^https?://s\\d\\.buysellads\\.com/", "icon": "BuySellAds.png", "js": { "_bsa": "", @@ -1450,7 +1449,6 @@ "_bsap": "", "_bsap_serving_callback": "" }, - "script": "^https?://s\\d\\.buysellads\\.com/", "website": "http://buysellads.com" }, "CDN77": { @@ -1672,7 +1670,7 @@ "icon": "Chart.js.svg", "js": { "Chart": "\\;confidence:50", - "Chart.defaults.doughnut": "", + "Chart.defaults.doughnut": "", "chart.ctx.bezierCurveTo": "" }, "script": [ @@ -1724,8 +1722,8 @@ "meta": { "generator": "^Chevereto ?([0-9.]+)?$\\;version:\\1" }, - "script": "/chevereto\\.js", - "html": "Powered by <a href=\"https?://chevereto\\.com\">", + "script": "/chevereto\\.js", + "html": "Powered by <a href=\"https?://chevereto\\.com\">", "icon": "chevereto.png", "implies": "PHP", "website": "https://chevereto.com/" @@ -2003,9 +2001,9 @@ "js": { "CCM_IMAGE_PATH": "" }, - "cookies": { - "CONCRETE5": "" - }, + "cookies": { + "CONCRETE5": "" + }, "meta": { "generator": "^concrete5 - ([\\d.]+)$\\;version:\\1" }, @@ -2391,9 +2389,9 @@ 19 ], "cookies": { - "datadome": "" - }, - "script": "^https://ct\\.datadome\\.co/[a-z]\\.js$", + "datadome": "" + }, + "script": "^https://ct\\.datadome\\.co/[a-z]\\.js$", "headers": { "X-DataDome": "", "Server": "^DataDome$", @@ -2596,10 +2594,10 @@ "cookies": { "DokuWiki": "" }, - "html": [ - "<div[^>]+id=\"dokuwiki__>", - "<a[^>]+href=\"#dokuwiki__" - ], + "html": [ + "<div[^>]+id=\"dokuwiki__>", + "<a[^>]+href=\"#dokuwiki__" + ], "icon": "DokuWiki.png", "implies": "PHP", "meta": { @@ -2680,12 +2678,12 @@ 20 ], "html": "<!--[^>]*(?:InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)\\;version:\\1", - "js": { - "MM_showMenu": "", - "MM_preloadImages": "", - "MM_showHideLayers": "" - }, - "icon": "DreamWeaver.png", + "js": { + "MM_showMenu": "", + "MM_preloadImages": "", + "MM_showHideLayers": "" + }, + "icon": "DreamWeaver.png", "website": "https://www.adobe.com/products/dreamweaver.html" }, "Drupal": { @@ -2777,7 +2775,7 @@ 11, 51 ], - "html": [ + "html": [ "<div class=(?:\"|')[^\"']*elementor", "<section class=(?:\"|')[^\"']*elementor", "<link [^>]*href=(?:\"|')[^\"']*elementor/assets", @@ -3511,7 +3509,7 @@ }, "website": "https://get.gaug.es" }, - "Gentoo": { + "Gentoo": { "cats": [ 28 ], @@ -6026,15 +6024,15 @@ 8 ], "html": [ - "<body[^>]+class=\"mediawiki\"", - "<(?:a|img)[^>]+>Powered by MediaWiki</a>", - "<a[^>]+/Special:WhatLinksHere/" - ], + "<body[^>]+class=\"mediawiki\"", + "<(?:a|img)[^>]+>Powered by MediaWiki</a>", + "<a[^>]+/Special:WhatLinksHere/" + ], "icon": "MediaWiki.png", "implies": "PHP", - "js": { - "mw.util.toggleToc": "" - }, + "js": { + "mw.util.toggleToc": "" + }, "meta": { "generator": "^MediaWiki ?(.+)$\\;version:\\1" }, @@ -6364,7 +6362,7 @@ 6 ], "html": "<link[^>]+href=[\"'][^\"]+mg-(?:core|plugins|templates)/", - "script": "mg-(?:core|plugins|templates)/", + "script": "mg-(?:core|plugins|templates)/", "icon": "Moguta.CMS.png", "implies": "PHP", "website": "https://moguta.ru" @@ -8065,15 +8063,15 @@ "Server": "^RainLoop" }, "html": [ - "<link[^>]href=\"rainloop/v/([0-9.]+)/static/apple-touch-icon\\.png/>\\;version:\\1" + "<link[^>]href=\"rainloop/v/([0-9.]+)/static/apple-touch-icon\\.png/>\\;version:\\1" ], - "meta": { - "rlAppVersion": "^([0-9.]+)$\\;version:\\1" - }, + "meta": { + "rlAppVersion": "^([0-9.]+)$\\;version:\\1" + }, "icon": "RainLoop.png", "implies": "PHP", "js": { - "rainloopI18N": "", + "rainloopI18N": "", "rainloop": "" }, "script": "^rainloop/v/([0-9.]+)/\\;version:\\1", @@ -8922,7 +8920,7 @@ ], "icon": "shopline.png", "meta": { - "og:image":"https\\:\/\/img\\.shoplineapp\\.com" + "og:image": "https\\:\\/\\/img\\.shoplineapp\\.com" }, "website": "https://shoplineapp.com/" }, @@ -9719,12 +9717,12 @@ 1 ], "html": [ - "<link[^>]+ href=\"typo3(?:conf|temp)/", - "<img[^>]+ src=\"typo3(?:conf|temp)/" - ], + "<link[^>]+ href=\"typo3(?:conf|temp)/", + "<img[^>]+ src=\"typo3(?:conf|temp)/" + ], "icon": "TYPO3.svg", "implies": "PHP", - "script": "^typo3(?:conf|temp)/", + "script": "^typo3(?:conf|temp)/", "meta": { "generator": "TYPO3\\s+(?:CMS\\s+)?([\\d.]+)?(?:\\s+CMS)?\\;version:\\1" }, @@ -10817,10 +10815,10 @@ "cats": [ 19 ], - "html": [ - "<link[^>]+rel=[\"']web-socket[\"']", - "<(?:link|a)[^>]+href=[\"']wss?://" - ], + "html": [ + "<link[^>]+rel=[\"']web-socket[\"']", + "<(?:link|a)[^>]+href=[\"']wss?://" + ], "icon": "websocket.png", "website": "https://en.wikipedia.org/wiki/WebSocket" }, @@ -11061,7 +11059,7 @@ ], "html": [ "<link rel=[\"']stylesheet[\"'] [^>]+/wp-(?:content|includes)/", - "<div[^>]*class=[\"']amp-wp-", + "<div[^>]*class=[\"']amp-wp-", "<link[^>]+s\\d+\\.wp\\.com" ], "icon": "WordPress.svg", @@ -12030,7 +12028,7 @@ "jQuery.pjax": "" }, "script": "jquery[.-]pjax(?:-([\\d.]))?(?:\\.min)?\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1?\\1:\\2", - "html": "<div[^>]+data-pjax-container", + "html": "<div[^>]+data-pjax-container", "website": "https://github.com/defunkt/jquery-pjax" }, "jQuery Sparklines": { @@ -12280,10 +12278,10 @@ "osCsid": "" }, "html": [ - "<br />Powered by <a href=\"https?://www\\.oscommerce\\.com", - "<(?:input|a)[^>]+name=\"osCsid\"", - "<(?:tr|td|table)class=\"[^\"]*infoBoxHeading" - ], + "<br />Powered by <a href=\"https?://www\\.oscommerce\\.com", + "<(?:input|a)[^>]+name=\"osCsid\"", + "<(?:tr|td|table)class=\"[^\"]*infoBoxHeading" + ], "icon": "osCommerce.png", "implies": [ "PHP", @@ -12364,12 +12362,12 @@ "phpbb": "" }, "html": [ - "Powered by <a[^>]+phpBB", - "<div class=phpbb_copyright>", - "<[^>]+styles/(?:sub|pro)silver/theme", - "<img[^>]+i_icon_mini", - "<table class=\"[^\"]*forumline" - ], + "Powered by <a[^>]+phpBB", + "<div class=phpbb_copyright>", + "<[^>]+styles/(?:sub|pro)silver/theme", + "<img[^>]+i_icon_mini", + "<table class=\"[^\"]*forumline" + ], "icon": "phpBB.png", "implies": "PHP", "js": { @@ -12502,7 +12500,7 @@ ], "js": { "PUNBB": "" - }, + }, "html": "Powered by <a href=\"[^>]+punbb", "icon": "punBB.png", "implies": "PHP", diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index f76d89198..ae0b7f7cc 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.5.4", + "version": "5.5.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index 0d4e60cec..7f0b16551 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "5.5.5", + "version": "5.5.6", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 41b1b0886..f24911431 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://www.wappalyzer.com", "description": "Identify web technologies", - "version": "5.5.5", + "version": "5.5.6", "default_locale": "en", "manifest_version": 2, "icons": { From 879cb32d305e6fa7d7f27a2ace1604e1554593bd Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Sat, 8 Dec 2018 10:37:01 +1100 Subject: [PATCH 086/197] Fix options, replace Promises with async/await, build v5.5.7 --- src/drivers/npm/npm-shrinkwrap.json | 2 +- src/drivers/npm/package.json | 2 +- src/drivers/webextension/js/driver.js | 402 +++++++++---------- src/drivers/webextension/js/popup.js | 61 +-- src/drivers/webextension/manifest.json | 151 +++---- src/drivers/webextension/npm-shrinkwrap.json | 6 +- src/drivers/webextension/package.json | 2 +- 7 files changed, 317 insertions(+), 309 deletions(-) diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index ae0b7f7cc..e82437f27 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.5.5", + "version": "5.5.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index 7f0b16551..d6d3e197a 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "5.5.6", + "version": "5.5.7", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index f698fba57..0d3efcd40 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -3,20 +3,19 @@ */ /* eslint-env browser */ -/* global browser, chrome, fetch, Wappalyzer */ +/* global browser, fetch, Wappalyzer */ /** global: browser */ -/** global: chrome */ /** global: fetch */ /** global: Wappalyzer */ const wappalyzer = new Wappalyzer(); const tabCache = {}; -let categoryOrder = []; -const options = {}; const robotsTxtQueue = {}; +let categoryOrder = []; + browser.tabs.onRemoved.addListener((tabId) => { tabCache[tabId] = null; }); @@ -26,17 +25,19 @@ browser.tabs.onRemoved.addListener((tabId) => { */ function getOption(name, defaultValue = null) { return new Promise(async (resolve) => { - let option = defaultValue; + let value = defaultValue; try { - option = await browser.storage.local.get(name); + const option = await browser.storage.local.get(name); + + if (option[name]) { + value = option[name]; + } } catch (error) { wappalyzer.log(error, 'driver', 'error'); } - options[name] = option; - - resolve(option); + resolve(value); }); } @@ -44,13 +45,15 @@ function getOption(name, defaultValue = null) { * Set a value in localStorage */ function setOption(name, value) { - const option = {}; - - option[name] = value; - - browser.storage.local.set(option); + return new Promise(async (resolve) => { + try { + await browser.storage.local.set({ [name]: value }); + } catch (error) { + wappalyzer.log(error, 'driver', 'error'); + } - options[name] = value; + resolve(); + }); } /** @@ -66,159 +69,110 @@ function openTab(args) { /** * Make a POST request */ -function post(url, body) { - fetch(url, { - method: 'POST', - body: JSON.stringify(body), - }) - .then(response => wappalyzer.log(`POST ${url}: ${response.status}`, 'driver')) - .catch(error => wappalyzer.log(`POST ${url}: ${error}`, 'driver', 'error')); +async function post(url, body) { + try { + const response = await fetch(url, { + method: 'POST', + body: JSON.stringify(body), + }); + + wappalyzer.log(`POST ${url}: ${response.status}`, 'driver'); + } catch (error) { + wappalyzer.log(`POST ${url}: ${error}`, 'driver', 'error'); + } } -fetch('../apps.json') - .then(response => response.json()) - .then((json) => { - wappalyzer.apps = json.apps; - wappalyzer.categories = json.categories; +// Capture response headers +browser.webRequest.onCompleted.addListener(async (request) => { + const headers = {}; - wappalyzer.parseJsPatterns(); + if (request.responseHeaders) { + const url = wappalyzer.parseUrl(request.url); - categoryOrder = Object.keys(wappalyzer.categories) - .map(categoryId => parseInt(categoryId, 10)) - .sort((a, b) => wappalyzer.categories[a].priority - wappalyzer.categories[b].priority); - }) - .catch(error => wappalyzer.log(`GET apps.json: ${error}`, 'driver', 'error')); + let tab; -// Version check -const { version } = browser.runtime.getManifest(); + try { + [tab] = await browser.tabs.query({ url: [url.href] }); + } catch (error) { + wappalyzer.log(error, 'driver', 'error'); + } -getOption('version') - .then((previousVersion) => { - if (previousVersion === null) { - openTab({ - url: `${wappalyzer.config.websiteURL}installed`, + if (tab) { + request.responseHeaders.forEach((header) => { + const name = header.name.toLowerCase(); + + headers[name] = headers[name] || []; + + headers[name].push((header.value || header.binaryValue || '').toString()); }); - } else if (version !== previousVersion) { - getOption('upgradeMessage', true) - .then((upgradeMessage) => { - if (upgradeMessage) { - openTab({ - url: `${wappalyzer.config.websiteURL}upgraded?v${version}`, - background: true, - }); - } - }); + + if (headers['content-type'] && /\/x?html/.test(headers['content-type'][0])) { + wappalyzer.analyze(url, { headers }, { tab }); + } } + } +}, { urls: ['http://*/*', 'https://*/*'], types: ['main_frame'] }, ['responseHeaders']); - setOption('version', version); - }); +// Listen for messages +browser.runtime.onMessage.addListener(async (message, sender) => { + if (message.id === undefined) { + return Promise.resolve(); + } -getOption('dynamicIcon', true); -getOption('pinnedCategory'); + if (message.id !== 'log') { + wappalyzer.log(`Message${message.source ? ` from ${message.source}` : ''}: ${message.id}`, 'driver'); + } -getOption('hostnameCache', {}) - .then((hostnameCache) => { - wappalyzer.hostnameCache = hostnameCache; + const pinnedCategory = await getOption('pinnedCategory'); - return hostnameCache; - }); + const url = wappalyzer.parseUrl(sender.tab ? sender.tab.url : ''); -// Run content script on all tabs -browser.tabs.query({ url: ['http://*/*', 'https://*/*'] }) - .then((tabs) => { - tabs.forEach((tab) => { - browser.tabs.executeScript(tab.id, { - file: '../js/content.js', - }); - }); - }) - .catch(error => wappalyzer.log(error, 'driver', 'error')); + const cookies = await browser.cookies.getAll({ domain: `.${url.hostname}` }); -// Capture response headers -browser.webRequest.onCompleted.addListener((request) => { - const headers = {}; + let response; - if (request.responseHeaders) { - const url = wappalyzer.parseUrl(request.url); + switch (message.id) { + case 'log': + wappalyzer.log(message.subject, message.source); - browser.tabs.query({ url: [url.href] }) - .then((tabs) => { - const tab = tabs[0] || null; + break; + case 'init': + wappalyzer.analyze(url, { cookies }, { tab: sender.tab }); - if (tab) { - request.responseHeaders.forEach((header) => { - const name = header.name.toLowerCase(); + break; + case 'analyze': + wappalyzer.analyze(url, message.subject, { tab: sender.tab }); - headers[name] = headers[name] || []; + await setOption('hostnameCache', wappalyzer.hostnameCache); - headers[name].push((header.value || header.binaryValue || '').toString()); - }); + break; + case 'ad_log': + wappalyzer.cacheDetectedAds(message.subject); - if (headers['content-type'] && /\/x?html/.test(headers['content-type'][0])) { - wappalyzer.analyze(url, { headers }, { tab }); - } - } - }) - .catch(error => wappalyzer.log(error, 'driver', 'error')); - } -}, { urls: ['http://*/*', 'https://*/*'], types: ['main_frame'] }, ['responseHeaders']); + break; + case 'get_apps': + response = { + tabCache: tabCache[message.tab.id], + apps: wappalyzer.apps, + categories: wappalyzer.categories, + pinnedCategory, + }; -// Listen for messages -(chrome || browser).runtime.onMessage.addListener((message, sender, sendResponse) => { - if (typeof message.id !== 'undefined') { - if (message.id !== 'log') { - wappalyzer.log(`Message${message.source ? ` from ${message.source}` : ''}: ${message.id}`, 'driver'); - } + break; + case 'set_option': + await setOption(message.key, message.value); - const url = wappalyzer.parseUrl(sender.tab ? sender.tab.url : ''); - let response; + break; + case 'get_js_patterns': + response = { + patterns: wappalyzer.jsPatterns, + }; - switch (message.id) { - case 'log': - wappalyzer.log(message.subject, message.source); - - break; - case 'init': - browser.cookies.getAll({ domain: `.${url.hostname}` }) - .then(cookies => wappalyzer.analyze(url, { cookies }, { tab: sender.tab })); - - break; - case 'analyze': - wappalyzer.analyze(url, message.subject, { tab: sender.tab }); - - setOption('hostnameCache', wappalyzer.hostnameCache); - - break; - case 'ad_log': - wappalyzer.cacheDetectedAds(message.subject); - - break; - case 'get_apps': - response = { - tabCache: tabCache[message.tab.id], - apps: wappalyzer.apps, - categories: wappalyzer.categories, - pinnedCategory: options.pinnedCategory, - }; - - break; - case 'set_option': - setOption(message.key, message.value); - - break; - case 'get_js_patterns': - response = { - patterns: wappalyzer.jsPatterns, - }; - - break; - default: - } - - sendResponse(response); + break; + default: } - return true; + return Promise.resolve(response); }); wappalyzer.driver.document = document; @@ -227,13 +181,15 @@ wappalyzer.driver.document = document; * Log messages to console */ wappalyzer.driver.log = (message, source, type) => { - console.log(`[wappalyzer ${type}]`, `[${source}]`, message); + const log = ['warn', 'error'].indexOf(type) !== -1 ? type : 'log'; + + console[log](`[wappalyzer ${type}]`, `[${source}]`, message); }; /** * Display apps */ -wappalyzer.driver.displayApps = (detected, meta, context) => { +wappalyzer.driver.displayApps = async (detected, meta, context) => { const { tab } = context; if (tab === undefined) { @@ -246,20 +202,19 @@ wappalyzer.driver.displayApps = (detected, meta, context) => { tabCache[tab.id].detected = detected; + const pinnedCategory = await getOption('pinnedCategory'); + const dynamicIcon = await getOption('dynamicIcon', true); + let found = false; // Find the main application to display - [options.pinnedCategory].concat(categoryOrder).forEach((match) => { + [pinnedCategory].concat(categoryOrder).forEach((match) => { Object.keys(detected).forEach((appName) => { const app = detected[appName]; app.props.cats.forEach((category) => { if (category === match && !found) { - let icon = app.props.icon || 'default.svg'; - - if (!options.dynamicIcon) { - icon = 'default.svg'; - } + let icon = app.props.icon && dynamicIcon ? app.props.icon : 'default.svg'; if (/\.svg$/i.test(icon)) { icon = `converted/${icon.replace(/\.svg$/, '.png')}`; @@ -280,61 +235,53 @@ wappalyzer.driver.displayApps = (detected, meta, context) => { }); }); - if (typeof chrome !== 'undefined') { - // Browser polyfill doesn't seem to work here - chrome.pageAction.show(tab.id); - } else { - browser.pageAction.show(tab.id); - } + browser.pageAction.show(tab.id); }; /** * Fetch and cache robots.txt for host */ -wappalyzer.driver.getRobotsTxt = (host, secure = false) => { +wappalyzer.driver.getRobotsTxt = async (host, secure = false) => { if (robotsTxtQueue[host]) { return robotsTxtQueue[host]; } - robotsTxtQueue[host] = new Promise((resolve) => { - getOption('tracking', true) - .then((tracking) => { - if (!tracking) { - resolve([]); + const tracking = await getOption('tracking', true); + const robotsTxtCache = await getOption('robotsTxtCache', {}); - return; - } + robotsTxtQueue[host] = new Promise(async (resolve) => { + if (!tracking) { + return resolve([]); + } + + if (host in robotsTxtCache) { + return resolve(robotsTxtCache[host]); + } - getOption('robotsTxtCache') - .then((robotsTxtCache) => { - robotsTxtCache = robotsTxtCache || {}; + const timeout = setTimeout(() => resolve([]), 3000); - if (host in robotsTxtCache) { - resolve(robotsTxtCache[host]); + let response; - return; - } + try { + response = await fetch(`http${secure ? 's' : ''}://${host}/robots.txt`, { redirect: 'follow' }); + } catch (error) { + wappalyzer.log(error, 'driver', 'error'); - const timeout = setTimeout(() => resolve([]), 3000); + return resolve([]); + } - fetch(`http${secure ? 's' : ''}://${host}/robots.txt`, { redirect: 'follow' }) - .then((response) => { - clearTimeout(timeout); + clearTimeout(timeout); - return response.ok ? response.text() : ''; - }) - .then((robotsTxt) => { - robotsTxtCache[host] = Wappalyzer.parseRobotsTxt(robotsTxt); + const robotsTxt = response.ok ? await response.text() : ''; - setOption('robotsTxtCache', robotsTxtCache); + robotsTxtCache[host] = Wappalyzer.parseRobotsTxt(robotsTxt); - resolve(robotsTxtCache[host]); - }) - .catch(() => resolve([])); - }); - }); - }) - .finally(() => delete robotsTxtQueue[host]); + await setOption('robotsTxtCache', robotsTxtCache); + + delete robotsTxtQueue[host]; + + return resolve(robotsTxtCache[host]); + }); return robotsTxtQueue[host]; }; @@ -342,19 +289,72 @@ wappalyzer.driver.getRobotsTxt = (host, secure = false) => { /** * Anonymously track detected applications for research purposes */ -wappalyzer.driver.ping = (hostnameCache = {}, adCache = []) => { - getOption('tracking', true) - .then((tracking) => { - if (tracking) { - if (Object.keys(hostnameCache).length) { - post('https://api.wappalyzer.com/ping/v1/', hostnameCache); - } +wappalyzer.driver.ping = async (hostnameCache = {}, adCache = []) => { + const tracking = await getOption('tracking', true); - if (adCache.length) { - post('https://ad.wappalyzer.com/log/wp/', adCache); - } + if (tracking) { + if (Object.keys(hostnameCache).length) { + post('https://api.wappalyzer.com/ping/v1/', hostnameCache); + } - setOption('robotsTxtCache', {}); - } - }); + if (adCache.length) { + post('https://ad.wappalyzer.com/log/wp/', adCache); + } + + await setOption('robotsTxtCache', {}); + } }; + +// Init +(async () => { + // Technologies + try { + const response = await fetch('../apps.json'); + const json = await response.json(); + + wappalyzer.apps = json.apps; + wappalyzer.categories = json.categories; + } catch (error) { + wappalyzer.log(`GET apps.json: ${error.message}`, 'driver', 'error'); + } + + wappalyzer.parseJsPatterns(); + + categoryOrder = Object.keys(wappalyzer.categories) + .map(categoryId => parseInt(categoryId, 10)) + .sort((a, b) => wappalyzer.categories[a].priority - wappalyzer.categories[b].priority); + + // Version check + const { version } = browser.runtime.getManifest(); + const previousVersion = await getOption('version'); + const upgradeMessage = await getOption('upgradeMessage', true); + + if (previousVersion === null) { + openTab({ + url: `${wappalyzer.config.websiteURL}installed`, + }); + } else if (version !== previousVersion && upgradeMessage) { + //openTab({ + // url: `${wappalyzer.config.websiteURL}upgraded?v${version}`, + // background: true, + //}); + } + + await setOption('version', version); + + // Hostname cache + wappalyzer.hostnameCache = await getOption('hostnameCache', {}); + + // Run content script on all tabs + try { + const tabs = await browser.tabs.query({ url: ['http://*/*', 'https://*/*'] }); + + tabs.forEach((tab) => { + browser.tabs.executeScript(tab.id, { + file: '../js/content.js', + }); + }); + } catch (error) { + wappalyzer.log(error, 'driver', 'error'); + } +})(); diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js index e560162fd..61e21ec21 100644 --- a/src/drivers/webextension/js/popup.js +++ b/src/drivers/webextension/js/popup.js @@ -1,32 +1,14 @@ +/* eslint-env browser */ +/* global browser, chrome, jsonToDOM */ + /** global: chrome */ /** global: browser */ +/** global: jsonToDOM */ let pinnedCategory = null; -const func = (tabs) => { - (chrome || browser).runtime.sendMessage({ - id: 'get_apps', - tab: tabs[0], - source: 'popup.js', - }, (response) => { - pinnedCategory = response.pinnedCategory; - - replaceDomWhenReady(appsToDomTemplate(response)); - }); -}; - -browser.tabs.query({ active: true, currentWindow: true }) - .then(func) - .catch(console.error); - -function replaceDomWhenReady(dom) { - if (/complete|interactive|loaded/.test(document.readyState)) { - replaceDom(dom); - } else { - document.addEventListener('DOMContentLoaded', () => { - replaceDom(dom); - }); - } +function slugify(string) { + return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, ''); } function replaceDom(domTemplate) { @@ -73,6 +55,16 @@ function replaceDom(domTemplate) { }); } +function replaceDomWhenReady(dom) { + if (/complete|interactive|loaded/.test(document.readyState)) { + replaceDom(dom); + } else { + document.addEventListener('DOMContentLoaded', () => { + replaceDom(dom); + }); + } +} + function appsToDomTemplate(response) { let template = []; @@ -92,8 +84,7 @@ function appsToDomTemplate(response) { const apps = []; for (const appName in categories[cat].apps) { - const confidence = response.tabCache.detected[appName].confidenceTotal; - const version = response.tabCache.detected[appName].version; + const { confidence, version } = response.tabCache.detected[appName]; apps.push( [ @@ -190,6 +181,18 @@ function appsToDomTemplate(response) { return template; } -function slugify(string) { - return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, ''); -} +const func = (tabs) => { + (chrome || browser).runtime.sendMessage({ + id: 'get_apps', + tab: tabs[0], + source: 'popup.js', + }, (response) => { + pinnedCategory = response.pinnedCategory; + + replaceDomWhenReady(appsToDomTemplate(response)); + }); +}; + +browser.tabs.query({ active: true, currentWindow: true }) + .then(func) + .catch(console.error); diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index f24911431..3e3021605 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -1,78 +1,83 @@ { - "name": "Wappalyzer", - "short_name": "Wappalyzer", - "author": "Elbert Alias", - "homepage_url": "https://www.wappalyzer.com", - "description": "Identify web technologies", - "version": "5.5.6", - "default_locale": "en", - "manifest_version": 2, - "icons": { - "16": "images/icon_16.png", - "19": "images/icon_19.png", - "32": "images/icon_32.png", - "38": "images/icon_38.png", - "128": "images/icon_128.png" - }, - "page_action": { - "default_icon": { - "16": "images/icon_16.png", - "19": "images/icon_19.png", - "32": "images/icon_32.png", - "38": "images/icon_38.png", - "128": "images/icon_128.png" - }, - "default_title": "Wappalyzer", - "default_popup": "html/popup.html" - }, - "background": { - "page": "html/background.html" + "name": "Wappalyzer", + "short_name": "Wappalyzer", + "author": "Elbert Alias", + "homepage_url": "https://www.wappalyzer.com", + "description": "Identify web technologies", + "version": "5.5.7", + "default_locale": "en", + "manifest_version": 2, + "icons": { + "16": "images/icon_16.png", + "19": "images/icon_19.png", + "32": "images/icon_32.png", + "38": "images/icon_38.png", + "128": "images/icon_128.png" + }, + "page_action": { + "default_icon": { + "16": "images/icon_16.png", + "19": "images/icon_19.png", + "32": "images/icon_32.png", + "38": "images/icon_38.png", + "128": "images/icon_128.png" + }, + "default_title": "Wappalyzer", + "default_popup": "html/popup.html" + }, + "background": { + "page": "html/background.html" - }, - "content_scripts": [ - { - "matches": [ - "http://*/*", - "https://*/*" - ], - "js": [ - "node_modules/webextension-polyfill/dist/browser-polyfill.js", - "js/content.js" - ], - "run_at": "document_idle" - }, - { - "matches": [ + }, + "content_scripts": [ + { + "matches": [ "http://*/*", - "https://*/*" - ], - "exclude_matches": [ - "https://*.modirum.com/*", - "https://www.alphaecommerce.gr/*" - ], - "js": [ - "js/lib/iframe.js" - ], - "run_at": "document_start", - "all_frames": true - } - ], - "web_accessible_resources": [ - "js/inject.js" - ], - "options_page": "html/options.html", - "options_ui": { - "page": "html/options.html", - "open_in_tab": false - }, - "permissions": [ + "https://*/*" + ], + "js": [ + "node_modules/webextension-polyfill/dist/browser-polyfill.js", + "js/content.js" + ], + "run_at": "document_idle" + }, + { + "matches": [ + "http://*/*", + "https://*/*" + ], + "exclude_matches": [ + "https://*.modirum.com/*", + "https://www.alphaecommerce.gr/*" + ], + "js": [ + "js/lib/iframe.js" + ], + "run_at": "document_start", + "all_frames": true + } + ], + "web_accessible_resources": [ + "js/inject.js" + ], + "options_ui": { + "page": "html/options.html", + "open_in_tab": false + }, + "permissions": [ "cookies", - "storage", - "tabs", - "webRequest", - "webNavigation", - "http://*/*", - "https://*/*" - ], - "content_security_policy": "script-src 'self'; object-src 'self'" + "storage", + "tabs", + "webRequest", + "webNavigation", + "http://*/*", + "https://*/*" + ], + "content_security_policy": "script-src 'self'; object-src 'self'", + "applications": { + "gecko": { + "id": "wappalyzer@crunchlabz.com", + "strict_min_version": "42.0" + } + } } diff --git a/src/drivers/webextension/npm-shrinkwrap.json b/src/drivers/webextension/npm-shrinkwrap.json index ebcf0d9eb..7dfcf7d96 100644 --- a/src/drivers/webextension/npm-shrinkwrap.json +++ b/src/drivers/webextension/npm-shrinkwrap.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "webextension-polyfill": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.2.1.tgz", - "integrity": "sha1-zfyRJgMwOfFxNVMVfTW+/x1Nb0o=" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.3.1.tgz", + "integrity": "sha512-ISB42vlgMyM7xE1u6pREeCqmmXjLsYu/nqAR8Dl/gIAnylb+KpRpvKbVkUYNFePhhXn0Obkkc3jasOII9ztUtg==" } } } diff --git a/src/drivers/webextension/package.json b/src/drivers/webextension/package.json index 9b344ae21..19c18bd9a 100644 --- a/src/drivers/webextension/package.json +++ b/src/drivers/webextension/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "webextension-polyfill": "^0.2.1" + "webextension-polyfill": "^0.3.1" } } From 2cb284594fc2e7c939ad00be5740f71c684e0a70 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Sat, 8 Dec 2018 15:32:58 +1100 Subject: [PATCH 087/197] Add the ability to use a different headless browser in NPM driver --- src/apps.json | 2 +- src/drivers/npm/browser.js | 20 ++ src/drivers/npm/browsers/zombie copy.js | 114 +++++++++++ src/drivers/npm/browsers/zombie.js | 119 ++++++++++++ src/drivers/npm/driver.js | 248 ++++++++---------------- src/drivers/npm/index.js | 7 +- src/drivers/npm/npm-shrinkwrap.json | 2 +- src/drivers/npm/package.json | 2 +- src/drivers/webextension/manifest.json | 2 +- src/wappalyzer.js | 85 ++++---- 10 files changed, 379 insertions(+), 222 deletions(-) create mode 100644 src/drivers/npm/browser.js create mode 100644 src/drivers/npm/browsers/zombie copy.js create mode 100644 src/drivers/npm/browsers/zombie.js diff --git a/src/apps.json b/src/apps.json index d5fc00f67..269daf989 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2695,7 +2695,7 @@ "X-Drupal-Cache": "", "X-Generator": "^Drupal(?:\\s([\\d.]+))?\\;version:\\1" }, - "html": "<(?:link|style)[^>]+sites/(?:default|all)/(?:themes|modules)/", + "html": "<(?:link|style)[^>]+\"/sites/(?:default|all)/(?:themes|modules)/", "icon": "Drupal.svg", "implies": "PHP", "js": { diff --git a/src/drivers/npm/browser.js b/src/drivers/npm/browser.js new file mode 100644 index 000000000..532a75aa3 --- /dev/null +++ b/src/drivers/npm/browser.js @@ -0,0 +1,20 @@ +class Browser { + constructor(options) { + this.options = options; + + this.window = null; + this.document = null; + this.statusCode = null; + this.contentType = null; + this.headers = null; + this.statusCode = null; + this.contentType = null; + this.html = null; + this.js = null; + this.links = null; + this.scripts = null; + this.cookies = null; + } +} + +module.exports = Browser; diff --git a/src/drivers/npm/browsers/zombie copy.js b/src/drivers/npm/browsers/zombie copy.js new file mode 100644 index 000000000..d33d9cb92 --- /dev/null +++ b/src/drivers/npm/browsers/zombie copy.js @@ -0,0 +1,114 @@ +const Zombie = require('zombie'); + +class Browser { + constructor(options) { + this.options = options; + + this.browser = new Zombie({ + proxy: options.proxy, + silent: true, + strictSSL: false, + userAgent: options.userAgent, + waitDuration: options.maxWait, + }); + + this.statusCode = null; + this.contentType = null; + this.headers = null; + this.statusCode = null; + this.contentType = null; + this.html = null; + this.scripts = null; + this.cookies = null; + + this.window = this.browser.window; + this.document = this.browser.document; + + this.browser.on('authenticate', (auth) => { + auth.username = this.options.username; + auth.password = this.options.password; + }); + } + + visit(url) { + return new Promise((resolve) => { + this.browser.visit(url, () => { + const resource = this.browser.resources.length + ? this.browser.resources.filter(_resource => _resource.response).shift() : null; + + this.headers = this.getHeaders(); + this.statusCode = resource ? resource.response.status : 0; + this.contentType = this.headers['content-type'] ? this.headers['content-type'].shift() : null; + this.html = this.getHtml(); + this.scripts = this.getScripts(); + this.cookies = this.getCookies(); + + resolve(); + }); + }); + } + + getHeaders() { + const headers = {}; + + const resource = this.browser.resources.length + ? this.browser.resources.filter(_resource => _resource.response).shift() : null; + + if (resource) { + // eslint-disable-next-line no-underscore-dangle + resource.response.headers._headers.forEach((header) => { + if (!headers[header[0]]) { + headers[header[0]] = []; + } + + headers[header[0]].push(header[1]); + }); + } + + return headers; + } + + getHtml() { + let html = ''; + + if (this.browser.document && this.browser.document.documentElement) { + try { + html = this.browser.html(); + } catch (error) { + this.log(error.message, 'error'); + } + } + + return html; + } + + getScripts() { + if (!this.browser.document || !this.browser.document.scripts) { + return []; + } + + const scripts = Array.prototype.slice + .apply(this.browser.document.scripts) + .filter(script => script.src) + .map(script => script.src); + + return scripts; + } + + getCookies() { + const cookies = []; + + if (this.browser.cookies) { + this.browser.cookies.forEach(cookie => cookies.push({ + name: cookie.key, + value: cookie.value, + domain: cookie.domain, + path: cookie.path, + })); + } + + return cookies; + } +} + +export default Browser; diff --git a/src/drivers/npm/browsers/zombie.js b/src/drivers/npm/browsers/zombie.js new file mode 100644 index 000000000..0e091d697 --- /dev/null +++ b/src/drivers/npm/browsers/zombie.js @@ -0,0 +1,119 @@ +const Zombie = require('zombie'); +const Browser = require('../browser'); + +class ZombieBrowser extends Browser { + constructor(options) { + super(options); + + this.browser = new Zombie({ + proxy: options.proxy, + silent: true, + strictSSL: false, + userAgent: options.userAgent, + waitDuration: options.maxWait, + }); + + this.browser.on('authenticate', (auth) => { + auth.username = this.options.username; + auth.password = this.options.password; + }); + } + + visit(url) { + return new Promise((resolve) => { + this.browser.visit(url, () => { + const resource = this.browser.resources.length + ? this.browser.resources.filter(_resource => _resource.response).shift() : null; + + this.headers = this.getHeaders(); + this.statusCode = resource ? resource.response.status : 0; + this.contentType = this.headers['content-type'] ? this.headers['content-type'].shift() : null; + this.html = this.getHtml(); + this.js = this.getJs(); + this.links = this.getLinks(); + this.scripts = this.getScripts(); + this.cookies = this.getCookies(); + + resolve(); + }); + }); + } + + getHeaders() { + const headers = {}; + + const resource = this.browser.resources.length + ? this.browser.resources.filter(_resource => _resource.response).shift() : null; + + if (resource) { + // eslint-disable-next-line no-underscore-dangle + resource.response.headers._headers.forEach((header) => { + if (!headers[header[0]]) { + headers[header[0]] = []; + } + + headers[header[0]].push(header[1]); + }); + } + + return headers; + } + + getHtml() { + let html = ''; + + if (this.browser.document && this.browser.document.documentElement) { + try { + html = this.browser.html(); + } catch (error) { + this.log(error.message, 'error'); + } + } + + return html; + } + + getScripts() { + let scripts = []; + + if (this.browser.document && this.browser.document.scripts) { + scripts = Array.prototype.slice + .apply(this.browser.document.scripts) + .filter(script => script.src) + .map(script => script.src); + } + + return scripts; + } + + getJs() { + return this.browser.window; + } + + getLinks() { + let links = []; + + if (this.browser.document) { + links = Array.from(this.browser.document.getElementsByTagName('a')); + } + + return links; + } + + getCookies() { + const cookies = []; + + if (this.browser.cookies) { + this.browser.cookies.forEach(cookie => cookies.push({ + name: cookie.key, + value: cookie.value, + domain: cookie.domain, + path: cookie.path, + })); + } + + return cookies; + } +} + +module.exports = ZombieBrowser; diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js index 5c343c22c..cf4bfce61 100644 --- a/src/drivers/npm/driver.js +++ b/src/drivers/npm/driver.js @@ -1,7 +1,6 @@ const url = require('url'); const fs = require('fs'); const path = require('path'); -const Browser = require('zombie'); const Wappalyzer = require('./wappalyzer'); const json = JSON.parse(fs.readFileSync(path.resolve(`${__dirname}/apps.json`))); @@ -18,56 +17,8 @@ function sleep(ms) { return ms ? new Promise(resolve => setTimeout(resolve, ms)) : Promise.resolve(); } -function getHeaders(browser) { - const headers = {}; - - const resource = browser.resources.length - ? browser.resources.filter(_resource => _resource.response).shift() : null; - - if (resource) { - // eslint-disable-next-line no-underscore-dangle - resource.response.headers._headers.forEach((header) => { - if (!headers[header[0]]) { - headers[header[0]] = []; - } - - headers[header[0]].push(header[1]); - }); - } - - return headers; -} - -function getScripts(browser) { - if (!browser.document || !browser.document.scripts) { - return []; - } - - const scripts = Array.prototype.slice - .apply(browser.document.scripts) - .filter(script => script.src) - .map(script => script.src); - - return scripts; -} - -function getCookies(browser) { - const cookies = []; - - if (browser.cookies) { - browser.cookies.forEach(cookie => cookies.push({ - name: cookie.key, - value: cookie.value, - domain: cookie.domain, - path: cookie.path, - })); - } - - return cookies; -} - class Driver { - constructor(pageUrl, options) { + constructor(Browser, pageUrl, options) { this.options = Object.assign({}, { password: '', proxy: null, @@ -98,6 +49,8 @@ class Driver { this.apps = []; this.meta = {}; + this.Browser = Browser; + this.wappalyzer = new Wappalyzer(); this.wappalyzer.apps = json.apps; @@ -175,119 +128,70 @@ class Driver { this.timer(`fetch; url: ${pageUrl.href}; depth: ${depth}; delay: ${this.options.delay * index}ms`, timerScope); - return new Promise((resolve, reject) => { - sleep(this.options.delay * index) - .then(() => this.visit(pageUrl, timerScope, resolve, reject)); - }); - } - - visit(pageUrl, timerScope, resolve, reject) { - const browser = new Browser({ - proxy: this.options.proxy, - silent: true, - strictSSL: false, - userAgent: this.options.userAgent, - waitDuration: this.options.maxWait, - }); + return new Promise(async (resolve, reject) => { + await sleep(this.options.delay * index); - browser.on('authenticate', (auth) => { - auth.username = this.options.username; - auth.password = this.options.password; + this.visit(pageUrl, timerScope, resolve, reject); }); + } - this.timer(`browser.visit start; url: ${pageUrl.href}`, timerScope); + async visit(pageUrl, timerScope, resolve, reject) { + const browser = new this.Browser(this.options); - browser.visit(pageUrl.href, () => { - this.timer(`browser.visit end; url: ${pageUrl.href}`, timerScope); + browser.log = (message, type) => this.wappalyzer.log(message, 'browser', type); - try { - if (!this.checkResponse(browser, pageUrl)) { - resolve(); + this.timer(`visit start; url: ${pageUrl.href}`, timerScope); - return; - } - } catch (error) { - reject(error); + await browser.visit(pageUrl.href); - return; - } + this.timer(`visit end; url: ${pageUrl.href}`, timerScope); - const headers = getHeaders(browser); - const html = this.getHtml(browser); - const scripts = getScripts(browser); - const js = this.getJs(browser); - const cookies = getCookies(browser); - - this.wappalyzer.analyze(pageUrl, { - headers, - html, - scripts, - js, - cookies, - }) - .then(() => { - const links = Array.prototype.reduce.call( - browser.document.getElementsByTagName('a'), (results, link) => { - if (link.protocol.match(/https?:/) && link.hostname === this.origPageUrl.hostname && extensions.test(link.pathname)) { - link.hash = ''; - - results.push(url.parse(link.href)); - } - - return results; - }, [], - ); - - return resolve(links); - }); - }); - } + this.analyzedPageUrls[pageUrl.href].status = browser.statusCode; - checkResponse(browser, pageUrl) { // Validate response - const resource = browser.resources.length - ? browser.resources.filter(_resource => _resource.response).shift() : null; + if (!browser.statusCode) { + reject(new Error('NO_RESPONSE')); + } - if (!resource) { - throw new Error('NO_RESPONSE'); + if (browser.statusCode !== 200) { + reject(new Error('RESPONSE_NOT_OK')); } - this.analyzedPageUrls[pageUrl.href].status = resource.response.status; + if (!browser.contentType || !/\btext\/html\b/.test(browser.contentType)) { + this.wappalyzer.log(`Skipping; url: ${pageUrl.href}; content type: ${browser.contentType}`, 'driver'); - if (resource.response.status !== 200) { - throw new Error('RESPONSE_NOT_OK'); + delete this.analyzedPageUrls[pageUrl.href]; } - const headers = getHeaders(browser); + const { cookies, headers, scripts } = browser; - // Validate content type - const contentType = headers['content-type'] ? headers['content-type'].shift() : null; + const html = this.processHtml(browser.html); + const js = this.processJs(browser.js); - if (!contentType || !/\btext\/html\b/.test(contentType)) { - this.wappalyzer.log(`Skipping; url: ${pageUrl.href}; content type: ${contentType}`, 'driver'); + await this.wappalyzer.analyze(pageUrl, { + cookies, + headers, + html, + js, + scripts, + }); - delete this.analyzedPageUrls[pageUrl.href]; + const reducedLinks = Array.prototype.reduce.call( + browser.links, (results, link) => { + if (link.protocol.match(/https?:/) && link.hostname === this.origPageUrl.hostname && extensions.test(link.pathname)) { + link.hash = ''; - return false; - } + results.push(url.parse(link.href)); + } - // Validate document - if (!browser.document || !browser.document.documentElement) { - throw new Error('NO_HTML_DOCUMENT'); - } + return results; + }, [], + ); - return true; + return resolve(reducedLinks); } - getHtml(browser) { - let html = ''; - - try { - html = browser.html(); - } catch (error) { - this.wappalyzer.log(error.message, 'browser', 'error'); - } - + processHtml(html) { if (this.options.htmlMaxCols || this.options.htmlMaxRows) { const chunks = []; const maxCols = this.options.htmlMaxCols; @@ -308,7 +212,7 @@ class Driver { return html; } - getJs(browser) { + processJs(window) { const patterns = this.wappalyzer.jsPatterns; const js = {}; @@ -323,7 +227,7 @@ class Driver { let value = properties .reduce((parent, property) => (parent && parent[property] - ? parent[property] : null), browser.window); + ? parent[property] : null), window); value = typeof value === 'string' || typeof value === 'number' ? value : !!value; @@ -340,32 +244,32 @@ class Driver { crawl(pageUrl, index = 1, depth = 1) { pageUrl.canonical = `${pageUrl.protocol}//${pageUrl.host}${pageUrl.pathname}`; - return new Promise((resolve) => { - this.fetch(pageUrl, index, depth) - .catch((error) => { - const type = error.message && errorTypes[error.message] ? error.message : 'UNKNOWN_ERROR'; - const message = error.message && errorTypes[error.message] ? errorTypes[error.message] : 'Unknown error'; - - this.analyzedPageUrls[pageUrl.href].error = { - type, - message, - }; - - this.wappalyzer.log(`${message}; url: ${pageUrl.href}`, 'driver', 'error'); - }) - .then((links) => { - if (links && this.options.recursive && depth < this.options.maxDepth) { - return this.chunk(links.slice(0, this.options.maxUrls), depth + 1); - } - return Promise.resolve(); - }) - .then(() => { - resolve({ - urls: this.analyzedPageUrls, - applications: this.apps, - meta: this.meta, - }); - }); + return new Promise(async (resolve) => { + let links; + + try { + links = await this.fetch(pageUrl, index, depth); + } catch (error) { + const type = error.message && errorTypes[error.message] ? error.message : 'UNKNOWN_ERROR'; + const message = error.message && errorTypes[error.message] ? errorTypes[error.message] : 'Unknown error'; + + this.analyzedPageUrls[pageUrl.href].error = { + type, + message, + }; + + this.wappalyzer.log(`${message}; url: ${pageUrl.href}`, 'driver', 'error'); + } + + if (links && this.options.recursive && depth < this.options.maxDepth) { + await this.chunk(links.slice(0, this.options.maxUrls), depth + 1); + } + + return resolve({ + urls: this.analyzedPageUrls, + applications: this.apps, + meta: this.meta, + }); }); } @@ -376,10 +280,12 @@ class Driver { const chunked = links.splice(0, this.options.chunkSize); - return new Promise((resolve) => { - Promise.all(chunked.map((link, index) => this.crawl(link, index, depth))) - .then(() => this.chunk(links, depth, chunk + 1)) - .then(() => resolve()); + return new Promise(async (resolve) => { + await Promise.all(chunked.map((link, index) => this.crawl(link, index, depth))); + + await this.chunk(links, depth, chunk + 1); + + resolve(); }); } diff --git a/src/drivers/npm/index.js b/src/drivers/npm/index.js index cdff2ba3d..9436159ed 100755 --- a/src/drivers/npm/index.js +++ b/src/drivers/npm/index.js @@ -1,6 +1,6 @@ #!/usr/bin/env node - +const Browser = require('./browsers/zombie'); const Wappalyzer = require('./driver'); const args = process.argv.slice(2); @@ -30,7 +30,10 @@ do { } } while (arg); -const wappalyzer = new Wappalyzer(url, options); +const wappalyzer = new Wappalyzer(Browser, url, options); + +// Optionally define a custom log function +// wappalyzer.log = (message, source, type) => console.log(message); wappalyzer.analyze() .then((json) => { diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index e82437f27..19f89d6b8 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.5.6", + "version": "5.5.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index d6d3e197a..f89284174 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "5.5.7", + "version": "5.6.0", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 3e3021605..ef7dc4df8 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://www.wappalyzer.com", "description": "Identify web technologies", - "version": "5.5.7", + "version": "5.6.0", "default_locale": "en", "manifest_version": 2, "icons": { diff --git a/src/wappalyzer.js b/src/wappalyzer.js index 05e9121ba..a50ddb913 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -160,7 +160,7 @@ class Wappalyzer { this.detected[url.canonical] = {}; } - const metas = []; + const metaTags = []; // Additional information let language = null; @@ -170,23 +170,22 @@ class Wappalyzer { html = ''; } - const matches = data.html.match(/<html[^>]*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"/i); + let matches = data.html.match(new RegExp('<html[^>]*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"', 'i')); language = matches && matches.length ? matches[1] : null; - // grab metas + // Meta tags const regex = /<meta[^>]+>/ig; - let metaMatches; + do { - metaMatches = regex.exec(html); + matches = regex.exec(html); - if (!metaMatches) { + if (!matches) { break; } - const [match] = metaMatches; - metas.push(match); - } while (metaMatches); + metaTags.push(matches[0]); + } while (matches); } Object.keys(this.apps).forEach((appName) => { @@ -200,7 +199,7 @@ class Wappalyzer { if (html) { promises.push(this.analyzeHtml(app, html)); - promises.push(this.analyzeMeta(app, metas)); + promises.push(this.analyzeMeta(app, metaTags)); } if (scripts) { @@ -224,33 +223,32 @@ class Wappalyzer { }); } - return new Promise((resolve) => { - Promise.all(promises) - .then(() => { - Object.keys(apps).forEach((appName) => { - const app = apps[appName]; + return new Promise(async (resolve) => { + await Promise.all(promises); - if (!app.detected || !app.getConfidence()) { - delete apps[app.name]; - } - }); + Object.keys(apps).forEach((appName) => { + const app = apps[appName]; - resolveExcludes(apps, this.detected[url]); - this.resolveImplies(apps, url.canonical); + if (!app.detected || !app.getConfidence()) { + delete apps[app.name]; + } + }); - this.cacheDetectedApps(apps, url.canonical); - this.trackDetectedApps(apps, url, language); + resolveExcludes(apps, this.detected[url]); + this.resolveImplies(apps, url.canonical); - this.log(`Processing ${Object.keys(data).join(', ')} took ${((new Date() - startTime) / 1000).toFixed(2)}s (${url.hostname})`, 'core'); + this.cacheDetectedApps(apps, url.canonical); + this.trackDetectedApps(apps, url, language); - if (Object.keys(apps).length) { - this.log(`Identified ${Object.keys(apps).join(', ')} (${url.hostname})`, 'core'); - } + this.log(`Processing ${Object.keys(data).join(', ')} took ${((new Date() - startTime) / 1000).toFixed(2)}s (${url.hostname})`, 'core'); - this.driver.displayApps(this.detected[url.canonical], { language }, context); + if (Object.keys(apps).length) { + this.log(`Identified ${Object.keys(apps).join(', ')} (${url.hostname})`, 'core'); + } - return resolve(); - }); + this.driver.displayApps(this.detected[url.canonical], { language }, context); + + return resolve(); }); } @@ -265,23 +263,20 @@ class Wappalyzer { * */ robotsTxtAllows(url) { - return new Promise((resolve, reject) => { + return new Promise(async (resolve, reject) => { const parsed = this.parseUrl(url); if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') { - reject(); - - return; + return reject(); } - this.driver.getRobotsTxt(parsed.host, parsed.protocol === 'https:') - .then((robotsTxt) => { - if (robotsTxt.some(disallowedPath => parsed.pathname.indexOf(disallowedPath) === 0)) { - return reject(); - } + const robotsTxt = await this.driver.getRobotsTxt(parsed.host, parsed.protocol === 'https:'); + + if (robotsTxt.some(disallowedPath => parsed.pathname.indexOf(disallowedPath) === 0)) { + return reject(); + } - return resolve(); - }, () => resolve()); + return resolve(); }); } @@ -376,10 +371,10 @@ class Wappalyzer { try { attrs.regex = new RegExp(attr.replace('/', '\\/'), 'i'); // Escape slashes in regular expression - } catch (e) { + } catch (error) { attrs.regex = new RegExp(); - this.log(`${e}: ${attr}`, 'error', 'core'); + this.log(`${error.message}: ${attr}`, 'error', 'core'); } } }); @@ -572,7 +567,7 @@ class Wappalyzer { /** * Analyze meta tag */ - analyzeMeta(app, metas) { + analyzeMeta(app, metaTags) { const patterns = this.parsePatterns(app.props.meta); const promises = []; @@ -580,7 +575,7 @@ class Wappalyzer { return Promise.resolve(); } - metas.forEach((match) => { + metaTags.forEach((match) => { Object.keys(patterns).forEach((meta) => { const r = new RegExp(`(?:name|property)=["']${meta}["']`, 'i'); From 9c14100dbd269bc2980d4d01a904ab51cc6a5f7d Mon Sep 17 00:00:00 2001 From: Andrey <kovirolikovich@gmail.com> Date: Sat, 8 Dec 2018 12:29:01 +0200 Subject: [PATCH 088/197] mithril --- src/apps.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/apps.json b/src/apps.json index 269daf989..55858f41f 100644 --- a/src/apps.json +++ b/src/apps.json @@ -6267,6 +6267,17 @@ "script": "mint/\\?js", "website": "https://haveamint.com" }, + "Mithril": { + "cats": [ + 12 + ], + "icon": "Mithril.svg", + "js": { + "m": "" + }, + "script": "mithril/\\?js", + "website": "https://mithril.js.org" + }, "Mixpanel": { "cats": [ 10 From 1cdf8e49a2bc7a08bec1680065c773677871fe0e Mon Sep 17 00:00:00 2001 From: littlefluffycat <31353991+littlefluffycat@users.noreply.github.com> Date: Sat, 8 Dec 2018 12:34:28 +0200 Subject: [PATCH 089/197] Add files via upload --- src/icons/Mithril.svg | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/icons/Mithril.svg diff --git a/src/icons/Mithril.svg b/src/icons/Mithril.svg new file mode 100644 index 000000000..04cb102f1 --- /dev/null +++ b/src/icons/Mithril.svg @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="windows-1252"?> +<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 38.044 38.044" style="enable-background:new 0 0 38.044 38.044;" xml:space="preserve"> +<g> + <g> + <path style="fill:#010002;" d="M31.716,13.5C31.699,6.47,25.974,0.755,18.94,0.755c-7.045,0-12.777,5.732-12.777,12.777 c0,0.022,0.004,0.043,0.004,0.065C2.477,15.84,0,19.887,0,24.511c0,7.046,5.731,12.777,12.777,12.777 c2.268,0,4.395-0.601,6.244-1.642c1.849,1.041,3.977,1.642,6.245,1.642c7.046,0,12.777-5.732,12.777-12.777 C38.043,19.82,35.495,15.722,31.716,13.5z M19.021,32.961c-2.312-1.713-3.906-4.341-4.22-7.352c1.3,0.448,2.689,0.702,4.139,0.702 c1.514,0,2.96-0.278,4.307-0.764C22.949,28.584,21.349,31.236,19.021,32.961z M8.517,14.898c1.303-0.579,2.743-0.909,4.26-0.909 c1.475,0,2.879,0.307,4.154,0.858c-2.114,1.826-3.629,4.325-4.195,7.167C10.473,20.352,8.898,17.814,8.517,14.898z M18.94,24.055 c-1.457,0-2.846-0.298-4.109-0.837c0.361-2.928,1.929-5.482,4.19-7.157c2.243,1.662,3.802,4.187,4.18,7.085 C21.897,23.727,20.457,24.055,18.94,24.055z M21.111,14.846c1.275-0.55,2.679-0.858,4.154-0.858c1.457,0,2.846,0.298,4.11,0.837 c-0.356,2.885-1.883,5.404-4.089,7.082C24.704,19.108,23.199,16.65,21.111,14.846z M18.94,3.01c5.432,0,9.915,4.137,10.466,9.425 c-1.3-0.447-2.689-0.702-4.14-0.702c-2.268,0-4.396,0.601-6.245,1.642c-1.848-1.041-3.975-1.642-6.244-1.642 c-1.514,0-2.96,0.278-4.307,0.763C8.993,7.179,13.488,3.01,18.94,3.01z M12.777,35.034c-5.803,0-10.523-4.72-10.523-10.523 c0-3.418,1.645-6.451,4.177-8.375c0.744,3.581,2.999,6.607,6.059,8.408c0.011,3.847,1.735,7.293,4.442,9.631 C15.656,34.727,14.253,35.034,12.777,35.034z M25.266,35.034c-1.475,0-2.879-0.307-4.154-0.858 c2.715-2.345,4.444-5.804,4.444-9.664c0-0.022-0.004-0.044-0.004-0.065c3.007-1.829,5.209-4.852,5.918-8.416 c2.613,1.917,4.319,4.999,4.319,8.48C35.788,30.313,31.068,35.034,25.266,35.034z"/> + </g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +</svg> \ No newline at end of file From 81bb646b2a234e4b258d7ccacf410a06d414d000 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Sun, 9 Dec 2018 13:58:43 +1100 Subject: [PATCH 090/197] Add Container, SaaS, Paas and IaaS categories. Add Amazon Web Services and Amazon ECS detection --- src/apps.json | 47 +++++- src/drivers/npm/browsers/zombie copy.js | 114 -------------- src/drivers/npm/npm-shrinkwrap.json | 2 +- .../webextension/_locales/de/messages.json | 6 +- .../webextension/_locales/el/messages.json | 6 +- .../webextension/_locales/en/messages.json | 6 +- .../webextension/_locales/es/messages.json | 6 +- .../webextension/_locales/fa/messages.json | 6 +- .../webextension/_locales/fr/messages.json | 6 +- .../webextension/_locales/gr/messages.json | 6 +- .../webextension/_locales/id/messages.json | 6 +- .../webextension/_locales/it/messages.json | 6 +- .../webextension/_locales/pl/messages.json | 6 +- .../webextension/_locales/pt/messages.json | 146 +++++++++--------- .../webextension/_locales/pt_BR/messages.json | 6 +- .../webextension/_locales/ro/messages.json | 6 +- .../webextension/_locales/ru/messages.json | 136 ++++++++-------- .../webextension/_locales/sk/messages.json | 6 +- .../webextension/_locales/tr/messages.json | 6 +- .../webextension/_locales/uk/messages.json | 6 +- .../webextension/_locales/uz/messages.json | 6 +- .../webextension/_locales/zh_CN/messages.json | 6 +- .../webextension/_locales/zh_TW/messages.json | 6 +- src/icons/Docker.svg | 18 +++ src/icons/aws.svg | 1 + src/icons/docker.png | Bin 1871 -> 0 bytes 26 files changed, 299 insertions(+), 273 deletions(-) delete mode 100644 src/drivers/npm/browsers/zombie copy.js create mode 100644 src/icons/Docker.svg create mode 100644 src/icons/aws.svg delete mode 100644 src/icons/docker.png diff --git a/src/apps.json b/src/apps.json index 269daf989..c2fd5c6e3 100644 --- a/src/apps.json +++ b/src/apps.json @@ -537,6 +537,7 @@ "X-Amz-Cf-Id": "" }, "icon": "Amazon-Cloudfront.svg", + "implies": "Amazon Web Services", "website": "http://aws.amazon.com/cloudfront/" }, "Amazon EC2": { @@ -547,16 +548,39 @@ "Server": "\\(Amazon\\)" }, "icon": "aws-ec2.svg", + "implies": "Amazon Web Services", "website": "http://aws.amazon.com/ec2/" }, + "Amazon Web Services": { + "cats": [ + 62 + ], + "icon": "aws.svg", + "website": "https://aws.amazon.com/" + }, + "Amazon ECS": { + "cats": [ + 63 + ], + "headers": { + "Server": "^ECS" + }, + "icon": "aws.svg", + "implies": [ + "Amazon Web Services", + "Docker" + ], + "website": "https://aws.amazon.com/elasticloadbalancing/" + }, "Amazon ELB": { "cats": [ - 31 + 63 ], "cookies": { "AWSELB": "" }, "icon": "aws-elb.png", + "implies": "Amazon Web Services", "website": "https://aws.amazon.com/elasticloadbalancing/" }, "Amazon S3": { @@ -567,6 +591,7 @@ "Server": "^AmazonS3$" }, "icon": "aws-s3.svg", + "implies": "Amazon Web Services", "website": "http://aws.amazon.com/s3/" }, "Amber": { @@ -2548,9 +2573,9 @@ }, "Docker": { "cats": [ - 28 + 60 ], - "icon": "docker.png", + "icon": "Docker.svg", "implies": "Linux", "html": "<!-- This comment is expected by the docker HEALTHCHECK -->", "website": "https://www.docker.com/" @@ -13040,6 +13065,22 @@ "59": { "name": "JavaScript Libraries", "priority": 9 + }, + "60": { + "name": "Containers", + "priority": 8 + }, + "61": { + "name": "SaaS", + "priority": 8 + }, + "62": { + "name": "PaaS", + "priority": 8 + }, + "63": { + "name": "IaaS", + "priority": 8 } } } diff --git a/src/drivers/npm/browsers/zombie copy.js b/src/drivers/npm/browsers/zombie copy.js deleted file mode 100644 index d33d9cb92..000000000 --- a/src/drivers/npm/browsers/zombie copy.js +++ /dev/null @@ -1,114 +0,0 @@ -const Zombie = require('zombie'); - -class Browser { - constructor(options) { - this.options = options; - - this.browser = new Zombie({ - proxy: options.proxy, - silent: true, - strictSSL: false, - userAgent: options.userAgent, - waitDuration: options.maxWait, - }); - - this.statusCode = null; - this.contentType = null; - this.headers = null; - this.statusCode = null; - this.contentType = null; - this.html = null; - this.scripts = null; - this.cookies = null; - - this.window = this.browser.window; - this.document = this.browser.document; - - this.browser.on('authenticate', (auth) => { - auth.username = this.options.username; - auth.password = this.options.password; - }); - } - - visit(url) { - return new Promise((resolve) => { - this.browser.visit(url, () => { - const resource = this.browser.resources.length - ? this.browser.resources.filter(_resource => _resource.response).shift() : null; - - this.headers = this.getHeaders(); - this.statusCode = resource ? resource.response.status : 0; - this.contentType = this.headers['content-type'] ? this.headers['content-type'].shift() : null; - this.html = this.getHtml(); - this.scripts = this.getScripts(); - this.cookies = this.getCookies(); - - resolve(); - }); - }); - } - - getHeaders() { - const headers = {}; - - const resource = this.browser.resources.length - ? this.browser.resources.filter(_resource => _resource.response).shift() : null; - - if (resource) { - // eslint-disable-next-line no-underscore-dangle - resource.response.headers._headers.forEach((header) => { - if (!headers[header[0]]) { - headers[header[0]] = []; - } - - headers[header[0]].push(header[1]); - }); - } - - return headers; - } - - getHtml() { - let html = ''; - - if (this.browser.document && this.browser.document.documentElement) { - try { - html = this.browser.html(); - } catch (error) { - this.log(error.message, 'error'); - } - } - - return html; - } - - getScripts() { - if (!this.browser.document || !this.browser.document.scripts) { - return []; - } - - const scripts = Array.prototype.slice - .apply(this.browser.document.scripts) - .filter(script => script.src) - .map(script => script.src); - - return scripts; - } - - getCookies() { - const cookies = []; - - if (this.browser.cookies) { - this.browser.cookies.forEach(cookie => cookies.push({ - name: cookie.key, - value: cookie.value, - domain: cookie.domain, - path: cookie.path, - })); - } - - return cookies; - } -} - -export default Browser; diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index 19f89d6b8..0152d40c4 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.5.7", + "version": "5.6.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/webextension/_locales/de/messages.json b/src/drivers/webextension/_locales/de/messages.json index 86c640c72..2406d1ecc 100644 --- a/src/drivers/webextension/_locales/de/messages.json +++ b/src/drivers/webextension/_locales/de/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Statischer Seitengenerator" }, "categoryName58": { "message": "Benutzer-Einbindung" }, - "categoryName59": { "message": "JavaScript Bibliotheken" } + "categoryName59": { "message": "JavaScript Bibliotheken" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/el/messages.json b/src/drivers/webextension/_locales/el/messages.json index 72e6d453f..f55d876e8 100644 --- a/src/drivers/webextension/_locales/el/messages.json +++ b/src/drivers/webextension/_locales/el/messages.json @@ -65,5 +65,9 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Static Site Generator" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/en/messages.json b/src/drivers/webextension/_locales/en/messages.json index 4739f7678..e240fa94b 100644 --- a/src/drivers/webextension/_locales/en/messages.json +++ b/src/drivers/webextension/_locales/en/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Static Site Generator" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/es/messages.json b/src/drivers/webextension/_locales/es/messages.json index 4a4238e0f..4544705d9 100644 --- a/src/drivers/webextension/_locales/es/messages.json +++ b/src/drivers/webextension/_locales/es/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Static Site Generator" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/fa/messages.json b/src/drivers/webextension/_locales/fa/messages.json index 02816f9b7..47c3d5cc4 100644 --- a/src/drivers/webextension/_locales/fa/messages.json +++ b/src/drivers/webextension/_locales/fa/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "کریپتوماینر" }, "categoryName57": { "message": "تولید کننده سایت ایستا" }, "categoryName58": { "message": "آن بوردینگ کاربر" }, - "categoryName59": { "message": "کتابخانه های جاوا اسکریپت" } + "categoryName59": { "message": "کتابخانه های جاوا اسکریپت" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/fr/messages.json b/src/drivers/webextension/_locales/fr/messages.json index 81c8c3884..2075992f9 100644 --- a/src/drivers/webextension/_locales/fr/messages.json +++ b/src/drivers/webextension/_locales/fr/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "Crypto-mineur" }, "categoryName57": { "message": "Générateur de site statique" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/gr/messages.json b/src/drivers/webextension/_locales/gr/messages.json index 4caa0b8c6..25b1ed991 100644 --- a/src/drivers/webextension/_locales/gr/messages.json +++ b/src/drivers/webextension/_locales/gr/messages.json @@ -65,5 +65,9 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Static Site Generator" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/id/messages.json b/src/drivers/webextension/_locales/id/messages.json index 97b49c72a..c701cc5a3 100644 --- a/src/drivers/webextension/_locales/id/messages.json +++ b/src/drivers/webextension/_locales/id/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Static Site Generator" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/it/messages.json b/src/drivers/webextension/_locales/it/messages.json index 3057b5205..fc5bca2a3 100644 --- a/src/drivers/webextension/_locales/it/messages.json +++ b/src/drivers/webextension/_locales/it/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Static Site Generator" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/pl/messages.json b/src/drivers/webextension/_locales/pl/messages.json index 6544df5bf..c0bb41051 100644 --- a/src/drivers/webextension/_locales/pl/messages.json +++ b/src/drivers/webextension/_locales/pl/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "Koparka kryptowalut" }, "categoryName57": { "message": "Generator stron statycznych" }, "categoryName58": { "message": "Wdrażanie użytkownika" }, - "categoryName59": { "message": "Biblioteki JavaScript" } + "categoryName59": { "message": "Biblioteki JavaScript" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/pt/messages.json b/src/drivers/webextension/_locales/pt/messages.json index c7ace9e31..42d670b84 100644 --- a/src/drivers/webextension/_locales/pt/messages.json +++ b/src/drivers/webextension/_locales/pt/messages.json @@ -1,73 +1,77 @@ { - "github": { "message": "Fork Wappalyzer no GitHub!" }, - "noAppsDetected": { "message": "Não foi detectada nenhuma tecnologia." }, - "nothingToDo": { "message": "Nada a fazer aqui." }, - "optionDynamicIcon": { "message": "Utilizar o ícone da tecnologia em vez do logótipo do Wappalyzer" }, - "optionTracking": { "message": "Envie anonimamente tecnologias identificadas para wappalyzer.com" }, - "optionUpgradeMessage": { "message": "Fale-me sobre actualizações" }, - "options": { "message": "Opções" }, - "optionsSave": { "message": "Opções de Guardar" }, - "optionsSaved": { "message": "Guardado" }, - "twitter": { "message": "Seguir Wappalyzer no Twitter" }, - "website": { "message": "Ir para wappalyzer.com" }, - "categoryPin": { "message": "Mostrar sempre ícone" }, - "categoryName1": { "message": "CMS" }, - "categoryName2": { "message": "Fórum" }, - "categoryName3": { "message": "Gestor de Base de Dados" }, - "categoryName4": { "message": "Ferramenta de Documentação" }, - "categoryName5": { "message": "Widget" }, - "categoryName6": { "message": "Comércio Eletrónico" }, - "categoryName7": { "message": "Galeria de Fotos" }, - "categoryName8": { "message": "Wikis" }, - "categoryName9": { "message": "Painéis de Hospedagem" }, - "categoryName10": { "message": "Analítica" }, - "categoryName11": { "message": "Blog" }, - "categoryName12": { "message": "Framework JavaScript" }, - "categoryName13": { "message": "Rastreador de Problemas" }, - "categoryName14": { "message": "Leitor Vídeo" }, - "categoryName15": { "message": "Sistema de Comentários" }, - "categoryName16": { "message": "Captcha" }, - "categoryName17": { "message": "Script de Tipos de Letra" }, - "categoryName18": { "message": "Framework Web" }, - "categoryName19": { "message": "Diversos" }, - "categoryName20": { "message": "Editor" }, - "categoryName21": { "message": "LMS" }, - "categoryName22": { "message": "Servidor Web" }, - "categoryName23": { "message": "Ferramenta de Cache" }, - "categoryName24": { "message": "Editor WYSIWYG" }, - "categoryName25": { "message": "Gráficos JavaScript" }, - "categoryName26": { "message": "Framework Mobile" }, - "categoryName27": { "message": "Linguagem de Programação" }, - "categoryName28": { "message": "Sistema Operativo" }, - "categoryName29": { "message": "Motor de Busca" }, - "categoryName30": { "message": "Web Mail" }, - "categoryName31": { "message": "CDN" }, - "categoryName32": { "message": "Automação de Marketing" }, - "categoryName33": { "message": "Extensão de Servidor Web" }, - "categoryName34": { "message": "Base de Dados" }, - "categoryName35": { "message": "Mapa" }, - "categoryName36": { "message": "Rede de Publicidade" }, - "categoryName37": { "message": "Serviço de Rede" }, - "categoryName38": { "message": "Servidor de Média" }, - "categoryName39": { "message": "Webcam" }, - "categoryName40": { "message": "Impressão" }, - "categoryName41": { "message": "Processador de Pagamento" }, - "categoryName42": { "message": "Gestor de Etiquetas" }, - "categoryName43": { "message": "Sistema de Subscrição Paga" }, - "categoryName44": { "message": "Sistema Build/CI" }, - "categoryName45": { "message": "Sistema SCADA" }, - "categoryName46": { "message": "Acesso Remoto" }, - "categoryName47": { "message": "Ferramenta de Desenvolvimento" }, - "categoryName48": { "message": "Rede de Armazenamento" }, - "categoryName49": { "message": "Leitores de Feed" }, - "categoryName50": { "message": "Sistema de Gestão de Documentos" }, - "categoryName51": { "message": "Criador de Páginas de Destino" }, - "categoryName52": { "message": "Chat ao Vivo" }, - "categoryName53": { "message": "CRM" }, - "categoryName54": { "message": "SEO" }, - "categoryName55": { "message": "Contabilidade" }, - "categoryName56": { "message": "Cryptominer" }, - "categoryName57": { "message": "Gerador de Site Estático" }, - "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "github": { "message": "Fork Wappalyzer no GitHub!" }, + "noAppsDetected": { "message": "Não foi detectada nenhuma tecnologia." }, + "nothingToDo": { "message": "Nada a fazer aqui." }, + "optionDynamicIcon": { "message": "Utilizar o ícone da tecnologia em vez do logótipo do Wappalyzer" }, + "optionTracking": { "message": "Envie anonimamente tecnologias identificadas para wappalyzer.com" }, + "optionUpgradeMessage": { "message": "Fale-me sobre actualizações" }, + "options": { "message": "Opções" }, + "optionsSave": { "message": "Opções de Guardar" }, + "optionsSaved": { "message": "Guardado" }, + "twitter": { "message": "Seguir Wappalyzer no Twitter" }, + "website": { "message": "Ir para wappalyzer.com" }, + "categoryPin": { "message": "Mostrar sempre ícone" }, + "categoryName1": { "message": "CMS" }, + "categoryName2": { "message": "Fórum" }, + "categoryName3": { "message": "Gestor de Base de Dados" }, + "categoryName4": { "message": "Ferramenta de Documentação" }, + "categoryName5": { "message": "Widget" }, + "categoryName6": { "message": "Comércio Eletrónico" }, + "categoryName7": { "message": "Galeria de Fotos" }, + "categoryName8": { "message": "Wikis" }, + "categoryName9": { "message": "Painéis de Hospedagem" }, + "categoryName10": { "message": "Analítica" }, + "categoryName11": { "message": "Blog" }, + "categoryName12": { "message": "Framework JavaScript" }, + "categoryName13": { "message": "Rastreador de Problemas" }, + "categoryName14": { "message": "Leitor Vídeo" }, + "categoryName15": { "message": "Sistema de Comentários" }, + "categoryName16": { "message": "Captcha" }, + "categoryName17": { "message": "Script de Tipos de Letra" }, + "categoryName18": { "message": "Framework Web" }, + "categoryName19": { "message": "Diversos" }, + "categoryName20": { "message": "Editor" }, + "categoryName21": { "message": "LMS" }, + "categoryName22": { "message": "Servidor Web" }, + "categoryName23": { "message": "Ferramenta de Cache" }, + "categoryName24": { "message": "Editor WYSIWYG" }, + "categoryName25": { "message": "Gráficos JavaScript" }, + "categoryName26": { "message": "Framework Mobile" }, + "categoryName27": { "message": "Linguagem de Programação" }, + "categoryName28": { "message": "Sistema Operativo" }, + "categoryName29": { "message": "Motor de Busca" }, + "categoryName30": { "message": "Web Mail" }, + "categoryName31": { "message": "CDN" }, + "categoryName32": { "message": "Automação de Marketing" }, + "categoryName33": { "message": "Extensão de Servidor Web" }, + "categoryName34": { "message": "Base de Dados" }, + "categoryName35": { "message": "Mapa" }, + "categoryName36": { "message": "Rede de Publicidade" }, + "categoryName37": { "message": "Serviço de Rede" }, + "categoryName38": { "message": "Servidor de Média" }, + "categoryName39": { "message": "Webcam" }, + "categoryName40": { "message": "Impressão" }, + "categoryName41": { "message": "Processador de Pagamento" }, + "categoryName42": { "message": "Gestor de Etiquetas" }, + "categoryName43": { "message": "Sistema de Subscrição Paga" }, + "categoryName44": { "message": "Sistema Build/CI" }, + "categoryName45": { "message": "Sistema SCADA" }, + "categoryName46": { "message": "Acesso Remoto" }, + "categoryName47": { "message": "Ferramenta de Desenvolvimento" }, + "categoryName48": { "message": "Rede de Armazenamento" }, + "categoryName49": { "message": "Leitores de Feed" }, + "categoryName50": { "message": "Sistema de Gestão de Documentos" }, + "categoryName51": { "message": "Criador de Páginas de Destino" }, + "categoryName52": { "message": "Chat ao Vivo" }, + "categoryName53": { "message": "CRM" }, + "categoryName54": { "message": "SEO" }, + "categoryName55": { "message": "Contabilidade" }, + "categoryName56": { "message": "Cryptominer" }, + "categoryName57": { "message": "Gerador de Site Estático" }, + "categoryName58": { "message": "User Onboarding" }, + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/pt_BR/messages.json b/src/drivers/webextension/_locales/pt_BR/messages.json index 3649f89a3..0ff89115f 100644 --- a/src/drivers/webextension/_locales/pt_BR/messages.json +++ b/src/drivers/webextension/_locales/pt_BR/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "Minerador de cryptomoedas" }, "categoryName57": { "message": "Gerador de sites estáticos" }, "categoryName58": { "message": "Integração com usuário" }, - "categoryName59": { "message": "Biblioteca JavaScript" } + "categoryName59": { "message": "Biblioteca JavaScript" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/ro/messages.json b/src/drivers/webextension/_locales/ro/messages.json index 571bdd462..c19f3b3be 100644 --- a/src/drivers/webextension/_locales/ro/messages.json +++ b/src/drivers/webextension/_locales/ro/messages.json @@ -65,5 +65,9 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Static Site Generator" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/ru/messages.json b/src/drivers/webextension/_locales/ru/messages.json index 7ee442fd3..dc7bf4f04 100644 --- a/src/drivers/webextension/_locales/ru/messages.json +++ b/src/drivers/webextension/_locales/ru/messages.json @@ -1,73 +1,77 @@ { - "categoryName1" : { "message" : "CMS" }, - "categoryName2" : { "message" : "Форум" }, - "categoryName3" : { "message" : "Менеджер БД" }, - "categoryName4" : { "message" : "Документация" }, - "categoryName5" : { "message" : "Виджет" }, - "categoryName6" : { "message" : "Электронная коммерция" }, - "categoryName7" : { "message" : "Фотогалерея" }, - "categoryName8" : { "message" : "Вики" }, - "categoryName9" : { "message" : "Панель управления хостингом" }, - "categoryName10" : { "message" : "Аналитика" }, - "categoryName11" : { "message" : "Блог" }, - "categoryName12" : { "message" : "JS фреймворк" }, - "categoryName13" : { "message" : "Баг трекер" }, - "categoryName14" : { "message" : "Видео плеер" }, - "categoryName15" : { "message" : "Система комментариев" }, - "categoryName16" : { "message" : "Капча" }, - "categoryName17" : { "message" : "Шрифт" }, - "categoryName18" : { "message" : "Веб фреймворк" }, - "categoryName19" : { "message" : "Прочее" }, - "categoryName20" : { "message" : "HTML редактор" }, - "categoryName21" : { "message" : "LMS" }, - "categoryName22" : { "message" : "Веб сервер" }, - "categoryName23" : { "message" : "Кеширование" }, - "categoryName24" : { "message" : "WYSIWYG редактор" }, - "categoryName25" : { "message" : "JS графика" }, - "categoryName26" : { "message" : "Мобильный фреймворк" }, - "categoryName27" : { "message" : "Язык программирования" }, - "categoryName28" : { "message" : "Операционная система" }, - "categoryName29" : { "message" : "Поисковый движок" }, - "categoryName30" : { "message" : "Веб почта" }, - "categoryName31" : { "message" : "CDN" }, - "categoryName32" : { "message" : "Управление маркетингом" }, - "categoryName33" : { "message" : "Расширение Веб сервера" }, - "categoryName34" : { "message" : "База данных" }, - "categoryName35" : { "message" : "Карта" }, - "categoryName36" : { "message" : "Рекламная сеть" }, - "categoryName37" : { "message" : "Сетевая служба" }, - "categoryName38" : { "message" : "Медиа сервер" }, - "categoryName39" : { "message" : "Вебкамера" }, - "categoryName40" : { "message" : "Принтер" }, - "categoryName41" : { "message" : "Платёжная система" }, - "categoryName42" : { "message" : "Менеджер тэгов" }, - "categoryName43" : { "message" : "Paywall" }, - "categoryName44" : { "message" : "Система непрерывной интеграции" }, - "categoryName45" : { "message" : "Система SCADA" }, - "categoryName46" : { "message" : "Удаленное управление" }, - "categoryName47" : { "message" : "Утилита для разработчиков" }, - "categoryName48" : { "message" : "Сетевое хранилище" }, - "categoryName49" : { "message" : "Граббер контента" }, - "categoryName50" : { "message" : "Управление документами" }, - "categoryName51" : { "message": "Генератор лендингов" }, - "categoryName52" : { "message": "Live Chat" }, - "categoryName53" : { "message": "CRM" }, - "github" : { "message" : "Форкнуть на GitHub!" }, - "noAppsDetected" : { "message" : "Нет данных о сайте" }, - "nothingToDo" : { "message" : "Тут нечего искать" }, - "optionTracking" : { "message" : "Анонимно отправлять статистику распознанных данных на сервер (для исследований)" }, - "optionDynamicIcon" : { "message": "Использовать значок приложения вместо логотипа Wappalyzer" }, - "optionUpgradeMessage" : { "message" : "Оповещать меня об обновлениях" }, - "options" : { "message" : "Настройки" }, - "optionsSave" : { "message" : "Сохранить" }, - "optionsSaved" : { "message" : "Успешно сохранено!" }, - "twitter" : { "message" : "Следите за новостями в Твиттере" }, - "website" : { "message" : "Перейти на Wappalyzer.com" }, - "categoryPin": { "message": "Always show icon" }, + "categoryName1": { "message": "CMS" }, + "categoryName2": { "message": "Форум" }, + "categoryName3": { "message": "Менеджер БД" }, + "categoryName4": { "message": "Документация" }, + "categoryName5": { "message": "Виджет" }, + "categoryName6": { "message": "Электронная коммерция" }, + "categoryName7": { "message": "Фотогалерея" }, + "categoryName8": { "message": "Вики" }, + "categoryName9": { "message": "Панель управления хостингом" }, + "categoryName10": { "message": "Аналитика" }, + "categoryName11": { "message": "Блог" }, + "categoryName12": { "message": "JS фреймворк" }, + "categoryName13": { "message": "Баг трекер" }, + "categoryName14": { "message": "Видео плеер" }, + "categoryName15": { "message": "Система комментариев" }, + "categoryName16": { "message": "Капча" }, + "categoryName17": { "message": "Шрифт" }, + "categoryName18": { "message": "Веб фреймворк" }, + "categoryName19": { "message": "Прочее" }, + "categoryName20": { "message": "HTML редактор" }, + "categoryName21": { "message": "LMS" }, + "categoryName22": { "message": "Веб сервер" }, + "categoryName23": { "message": "Кеширование" }, + "categoryName24": { "message": "WYSIWYG редактор" }, + "categoryName25": { "message": "JS графика" }, + "categoryName26": { "message": "Мобильный фреймворк" }, + "categoryName27": { "message": "Язык программирования" }, + "categoryName28": { "message": "Операционная система" }, + "categoryName29": { "message": "Поисковый движок" }, + "categoryName30": { "message": "Веб почта" }, + "categoryName31": { "message": "CDN" }, + "categoryName32": { "message": "Управление маркетингом" }, + "categoryName33": { "message": "Расширение Веб сервера" }, + "categoryName34": { "message": "База данных" }, + "categoryName35": { "message": "Карта" }, + "categoryName36": { "message": "Рекламная сеть" }, + "categoryName37": { "message": "Сетевая служба" }, + "categoryName38": { "message": "Медиа сервер" }, + "categoryName39": { "message": "Вебкамера" }, + "categoryName40": { "message": "Принтер" }, + "categoryName41": { "message": "Платёжная система" }, + "categoryName42": { "message": "Менеджер тэгов" }, + "categoryName43": { "message": "Paywall" }, + "categoryName44": { "message": "Система непрерывной интеграции" }, + "categoryName45": { "message": "Система SCADA" }, + "categoryName46": { "message": "Удаленное управление" }, + "categoryName47": { "message": "Утилита для разработчиков" }, + "categoryName48": { "message": "Сетевое хранилище" }, + "categoryName49": { "message": "Граббер контента" }, + "categoryName50": { "message": "Управление документами" }, + "categoryName51": { "message": "Генератор лендингов" }, + "categoryName52": { "message": "Live Chat" }, + "categoryName53": { "message": "CRM" }, + "github": { "message": "Форкнуть на GitHub!" }, + "noAppsDetected": { "message": "Нет данных о сайте" }, + "nothingToDo": { "message": "Тут нечего искать" }, + "optionTracking": { "message": "Анонимно отправлять статистику распознанных данных на сервер (для исследований)" }, + "optionDynamicIcon": { "message": "Использовать значок приложения вместо логотипа Wappalyzer" }, + "optionUpgradeMessage": { "message": "Оповещать меня об обновлениях" }, + "options": { "message": "Настройки" }, + "optionsSave": { "message": "Сохранить" }, + "optionsSaved": { "message": "Успешно сохранено!" }, + "twitter": { "message": "Следите за новостями в Твиттере" }, + "website": { "message": "Перейти на Wappalyzer.com" }, + "categoryPin": { "message": "Always show icon" }, "categoryName54": { "message": "SEO" }, "categoryName55": { "message": "Бухгалтерский учёт" }, "categoryName56": { "message": "Криптомайнер" }, "categoryName57": { "message": "Генератор статических сайтов" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/sk/messages.json b/src/drivers/webextension/_locales/sk/messages.json index 55d251d31..3ee7b0574 100644 --- a/src/drivers/webextension/_locales/sk/messages.json +++ b/src/drivers/webextension/_locales/sk/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Static Site Generator" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/tr/messages.json b/src/drivers/webextension/_locales/tr/messages.json index 0acc50e22..8ea12ccb8 100644 --- a/src/drivers/webextension/_locales/tr/messages.json +++ b/src/drivers/webextension/_locales/tr/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Static Site Generator" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/uk/messages.json b/src/drivers/webextension/_locales/uk/messages.json index ab1dc4c43..f159d8be5 100644 --- a/src/drivers/webextension/_locales/uk/messages.json +++ b/src/drivers/webextension/_locales/uk/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Static Site Generator" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/uz/messages.json b/src/drivers/webextension/_locales/uz/messages.json index 6703c3f06..97b26ce87 100644 --- a/src/drivers/webextension/_locales/uz/messages.json +++ b/src/drivers/webextension/_locales/uz/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Static Site Generator" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" } + "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/zh_CN/messages.json b/src/drivers/webextension/_locales/zh_CN/messages.json index 9c0a95cea..c37a1799e 100644 --- a/src/drivers/webextension/_locales/zh_CN/messages.json +++ b/src/drivers/webextension/_locales/zh_CN/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "加密货币挖矿器" }, "categoryName57": { "message": "静态网站生成器" }, "categoryName58": { "message": "用户引导" }, - "categoryName59": { "message": "JavaScript 库" } + "categoryName59": { "message": "JavaScript 库" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/drivers/webextension/_locales/zh_TW/messages.json b/src/drivers/webextension/_locales/zh_TW/messages.json index 643f6da7c..6c543217d 100644 --- a/src/drivers/webextension/_locales/zh_TW/messages.json +++ b/src/drivers/webextension/_locales/zh_TW/messages.json @@ -69,5 +69,9 @@ "categoryName56": { "message": "加密貨幣礦工" }, "categoryName57": { "message": "靜態網站產生器" }, "categoryName58": { "message": "使用者指引" }, - "categoryName59": { "message": "JavaScript 函式庫" } + "categoryName59": { "message": "JavaScript 函式庫" }, + "categoryName60": { "message": "Containers" }, + "categoryName61": { "message": "SaaS" }, + "categoryName62": { "message": "PaaS" }, + "categoryName63": { "message": "IaaS" } } diff --git a/src/icons/Docker.svg b/src/icons/Docker.svg new file mode 100644 index 000000000..b8b16676e --- /dev/null +++ b/src/icons/Docker.svg @@ -0,0 +1,18 @@ +<svg width="2491" height="1415" viewBox="0 0 2491 1415" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M1435.43 446.797V451.68H1440.31H1658.73V675.068V679.951H1663.61H1776.51C1829.22 679.951 1883.37 670.568 1933.23 653.677L1933.23 653.677C1957.71 645.37 1985.28 633.792 2009.61 619.154L2014.29 616.338L2010.97 612.001C1980.15 571.768 1964.28 520.759 1959.61 470.186L1959.61 470.185C1953.22 401.14 1967.29 312.037 2013.21 258.936L2033.6 235.351L2057.9 254.889L2057.9 254.891C2127.76 311.016 2185.96 389.028 2196.19 477.408L2196.86 483.166L2202.42 481.53C2286.19 456.892 2384.32 462.819 2457.7 505.167L2460.14 500.938L2457.7 505.167L2484.34 520.541L2470.32 547.911C2408.38 668.793 2278.67 706.796 2150.35 700.075L2146.87 699.892L2145.57 703.132C1953.12 1182.47 1534.27 1409.57 1025.52 1409.57C763.051 1409.57 523.044 1311.52 386.405 1079.49L386.398 1079.47L384.24 1075.83L364.29 1035.23C318.142 933.144 302.775 821.231 313.192 709.281L315.932 679.951H502.441H507.324V675.068V451.68H725.732H730.615V446.797V228.379H1172.34H1177.23V223.496V5.07812H1435.43V446.797Z" fill="#364548" stroke="black" stroke-width="9.76562"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M2163.77 531.25C2178.74 414.883 2091.66 323.486 2037.66 280.088C1975.42 352.041 1965.75 540.615 2063.39 620.01C2008.9 668.408 1894.08 712.275 1776.51 712.275H345.41C333.984 835 355.527 948.018 404.736 1044.75L421.016 1074.53C431.323 1092.01 442.587 1108.91 454.756 1125.16C513.594 1128.94 567.842 1130.23 617.471 1129.14H617.49C715.019 1126.99 794.6 1115.47 854.912 1094.57C859.176 1093.24 863.788 1093.63 867.774 1095.64C871.76 1097.65 874.806 1101.14 876.269 1105.36C877.731 1109.58 877.495 1114.2 875.611 1118.25C873.727 1122.3 870.342 1125.45 866.172 1127.05C858.144 1129.84 849.785 1132.44 841.152 1134.91H841.123C793.633 1148.48 742.705 1157.6 677.002 1161.65C680.908 1161.72 672.939 1162.24 672.92 1162.24C670.684 1162.38 667.871 1162.71 665.625 1162.82C639.766 1164.28 611.855 1164.58 583.32 1164.58C552.109 1164.58 521.377 1163.99 487.012 1162.24L486.133 1162.82C605.371 1296.85 791.816 1377.23 1025.53 1377.23C1520.14 1377.23 1939.67 1157.97 2125.45 665.732C2257.25 679.258 2383.92 645.645 2441.53 533.164C2349.76 480.205 2231.73 497.09 2163.77 531.25" fill="#22A0C8"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M2163.77 531.25C2178.74 414.883 2091.66 323.486 2037.66 280.088C1975.42 352.041 1965.75 540.615 2063.39 620.01C2008.9 668.408 1894.08 712.275 1776.51 712.275H430.156C424.316 900.225 494.063 1042.89 617.461 1129.14H617.49C715.02 1126.99 794.6 1115.47 854.912 1094.57C859.176 1093.24 863.788 1093.63 867.774 1095.64C871.76 1097.65 874.806 1101.14 876.269 1105.36C877.731 1109.58 877.495 1114.2 875.611 1118.25C873.727 1122.3 870.342 1125.45 866.172 1127.05C858.145 1129.84 849.785 1132.44 841.152 1134.91H841.123C793.633 1148.48 738.33 1158.77 672.627 1162.82C672.607 1162.82 671.035 1161.31 671.016 1161.31C839.346 1247.66 1083.42 1247.34 1363.25 1139.85C1677.02 1019.31 1969 789.658 2172.72 526.992C2169.66 528.379 2166.67 529.795 2163.77 531.25" fill="#37B1D9"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M348.096 861.387C356.982 927.129 376.221 988.682 404.736 1044.75L421.016 1074.53C431.322 1092.01 442.586 1108.92 454.756 1125.16C513.604 1128.94 567.852 1130.23 617.49 1129.14C715.02 1126.99 794.6 1115.47 854.912 1094.57C859.176 1093.24 863.788 1093.63 867.774 1095.64C871.76 1097.65 874.806 1101.14 876.269 1105.36C877.731 1109.58 877.495 1114.2 875.611 1118.25C873.727 1122.3 870.342 1125.45 866.172 1127.05C858.145 1129.84 849.785 1132.44 841.152 1134.91H841.123C793.633 1148.48 738.623 1158.18 672.92 1162.25C670.664 1162.38 666.729 1162.41 664.453 1162.54C638.613 1163.98 610.986 1164.87 582.441 1164.87C551.24 1164.87 519.326 1164.28 484.98 1162.53C604.219 1296.55 791.816 1377.23 1025.53 1377.23C1448.96 1377.23 1817.36 1216.5 2031.18 861.387H348.096Z" fill="#1B81A5"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M443.037 861.387C468.35 976.816 529.18 1067.43 617.49 1129.14C715.02 1126.99 794.6 1115.47 854.912 1094.57C859.176 1093.24 863.788 1093.63 867.774 1095.64C871.76 1097.65 874.806 1101.14 876.269 1105.36C877.731 1109.58 877.495 1114.2 875.611 1118.25C873.727 1122.3 870.342 1125.45 866.172 1127.05C858.145 1129.84 849.785 1132.44 841.152 1134.91H841.123C793.633 1148.48 737.461 1158.18 671.748 1162.25C840.068 1248.57 1083.44 1247.33 1363.25 1139.85C1532.53 1074.81 1695.45 977.998 1841.61 861.387H443.037Z" fill="#1D91B4"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M539.648 484.014H733.184V677.549H539.648V484.014ZM555.771 500.146H571.045V661.426H555.771V500.146ZM584.482 500.146H600.371V661.426H584.492V500.146H584.482ZM613.799 500.146H629.688V661.426H613.799V500.146ZM643.135 500.146H659.014V661.426H643.135V500.146ZM672.461 500.146H688.34V661.426H672.461V500.146ZM701.777 500.146H717.061V661.426H701.777V500.146ZM762.949 260.713H956.494V454.238H762.939V260.713H762.949ZM779.082 276.846H794.346V438.115H779.082V276.846ZM807.793 276.846H823.672V438.115H807.803V276.846H807.793ZM837.109 276.846H852.988V438.115H837.109V276.846ZM866.436 276.846H882.314V438.115H866.436V276.846ZM895.762 276.846H911.65V438.115H895.762V276.846ZM925.078 276.846H940.371V438.115H925.078V276.846Z" fill="#23A3C2"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M762.949 486.014H956.494V679.549H762.939V486.014H762.949ZM779.082 502.146H794.346V663.426H779.082V502.146ZM807.793 502.146H823.672V663.426H807.803V502.146H807.793ZM837.109 502.146H852.988V663.426H837.109V502.146ZM866.436 502.146H882.314V663.426H866.436V502.146ZM895.762 502.146H911.65V663.426H895.762V502.146ZM925.078 502.146H940.371V663.426H925.078V502.146Z" fill="#34BBDE"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M986.26 484.014H1179.79V677.549H986.26V484.014ZM1002.38 500.146H1017.65V661.426H1002.38V500.146ZM1031.09 500.146H1046.97V661.426H1031.09V500.146ZM1060.42 500.146H1076.3V661.426H1060.42V500.146ZM1089.75 500.146H1105.63V661.426H1089.75V500.146ZM1119.06 500.146H1134.96V661.426H1119.06V500.146ZM1148.39 500.146H1163.66V661.426H1148.39V500.146V500.146Z" fill="#23A3C2"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M986.26 260.713H1179.79V454.238H986.26V260.713ZM1002.38 276.846H1017.65V438.115H1002.38V276.846ZM1031.09 276.846H1046.97V438.115H1031.09V276.846ZM1060.42 276.846H1076.3V438.115H1060.42V276.846ZM1089.75 276.846H1105.63V438.115H1089.75V276.846ZM1119.06 276.846H1134.96V438.115H1119.06V276.846ZM1148.39 276.846H1163.66V438.115H1148.39V276.846V276.846ZM1209.56 484.014H1403.1V677.549H1209.56V484.014ZM1225.69 500.146H1240.96V661.426H1225.69V500.146ZM1254.4 500.146H1270.28V661.426H1254.4V500.146ZM1283.72 500.146H1299.6V661.426H1283.72V500.146ZM1313.05 500.146H1328.94V661.426H1313.05V500.146ZM1342.37 500.146H1358.26V661.426H1342.37V500.146ZM1371.7 500.146H1386.97V661.426H1371.7V500.146Z" fill="#34BBDE"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M1209.56 260.713H1403.1V454.238H1209.56V260.713ZM1225.69 276.846H1240.96V438.115H1225.69V276.846ZM1254.4 276.846H1270.28V438.115H1254.4V276.846ZM1283.72 276.846H1299.6V438.115H1283.72V276.846ZM1313.05 276.846H1328.94V438.115H1313.05V276.846ZM1342.37 276.846H1358.26V438.115H1342.37V276.846ZM1371.7 276.846H1386.97V438.115H1371.7V276.846Z" fill="#23A3C2"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M1209.56 37.4023H1403.1V230.957H1209.56V37.4023ZM1225.69 53.5254H1240.96V214.814H1225.69V53.5156V53.5254ZM1254.4 53.5254H1270.28V214.814H1254.4V53.5156V53.5254ZM1283.72 53.5254H1299.6V214.814H1283.72V53.5156V53.5254ZM1313.05 53.5254H1328.94V214.814H1313.05V53.5156V53.5254ZM1342.37 53.5254H1358.26V214.814H1342.37V53.5156V53.5254ZM1371.7 53.5254H1386.97V214.814H1371.7V53.5156V53.5254Z" fill="#34BBDE"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M1432.86 484.014H1626.4V677.549H1432.86V484.014ZM1448.97 500.146H1464.26V661.426H1448.98V500.146H1448.97ZM1477.69 500.146H1493.57V661.426H1477.7V500.146H1477.69ZM1507.02 500.146H1522.91V661.426H1507.02V500.146ZM1536.34 500.146H1552.23V661.426H1536.34V500.146ZM1565.67 500.146H1581.55V661.426H1565.67V500.146ZM1594.99 500.146H1610.26V661.426H1594.99V500.146Z" fill="#23A3C2"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M944.375 991.328C951.448 991.234 958.468 992.545 965.03 995.187C971.591 997.829 977.562 1001.75 982.597 1006.72C987.631 1011.68 991.628 1017.6 994.355 1024.13C997.083 1030.66 998.487 1037.66 998.486 1044.73C998.484 1051.8 997.078 1058.81 994.348 1065.33C991.618 1071.86 987.619 1077.77 982.583 1082.74C977.546 1087.71 971.574 1091.62 965.012 1094.26C958.449 1096.9 951.428 1098.21 944.356 1098.12C930.32 1097.92 916.924 1092.21 907.068 1082.22C897.211 1072.22 891.686 1058.75 891.689 1044.71C891.691 1030.67 897.221 1017.2 907.081 1007.21C916.942 997.222 930.339 991.515 944.375 991.328Z" fill="#D3ECEC"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M944.375 1006.47C949.258 1006.47 953.916 1007.39 958.213 1009.06C955.248 1010.78 952.932 1013.43 951.624 1016.6C950.315 1019.77 950.087 1023.28 950.973 1026.6C951.86 1029.91 953.813 1032.83 956.53 1034.93C959.247 1037.02 962.577 1038.15 966.006 1038.16C971.914 1038.16 977.041 1034.89 979.697 1030.05C982.842 1037.62 983.467 1046.01 981.48 1053.97C979.492 1061.93 974.998 1069.04 968.66 1074.25C962.323 1079.45 954.478 1082.48 946.285 1082.89C938.092 1083.3 929.986 1081.06 923.163 1076.51C916.34 1071.95 911.162 1065.33 908.395 1057.6C905.628 1049.88 905.418 1041.47 907.796 1033.62C910.174 1025.77 915.013 1018.9 921.6 1014.01C928.187 1009.12 936.172 1006.48 944.375 1006.47V1006.47ZM0 880.684H2483.66C2429.59 866.973 2312.57 848.437 2331.87 777.559C2233.53 891.348 1996.39 857.393 1936.53 801.289C1869.89 897.949 1481.9 861.201 1454.84 785.898C1371.29 883.955 1112.39 883.955 1028.84 785.898C1001.76 861.201 613.779 897.949 547.129 801.279C487.285 857.393 250.156 891.348 151.816 777.568C171.113 848.437 54.0918 866.973 0 880.693" fill="#364548"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M1086.3 1376.07C954.072 1313.33 881.504 1228.03 841.123 1134.92C792.002 1148.94 732.969 1157.9 664.365 1161.75C638.525 1163.19 611.338 1163.94 582.822 1163.94C549.932 1163.94 515.273 1162.96 478.887 1161.04C600.146 1282.23 749.316 1375.53 1025.53 1377.23C1045.92 1377.23 1066.15 1376.84 1086.3 1376.07" fill="#BDD9D7"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M890.234 1220.84C871.943 1196.01 854.199 1164.79 841.152 1134.9C792.031 1148.94 732.979 1157.9 664.365 1161.76C711.494 1187.33 778.887 1211.04 890.244 1220.84" fill="#D3ECEC"/> +</svg> diff --git a/src/icons/aws.svg b/src/icons/aws.svg new file mode 100644 index 000000000..48209aef8 --- /dev/null +++ b/src/icons/aws.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="2500" height="2273" viewBox="0 0 1100 1000"><path d="M2 776c3.333-5.333 8.666-5.667 16-1 166.666 96.667 348 145 544 145 130.666 0 259.666-24.333 387-73 3.333-1.333 8.166-3.333 14.5-6 6.333-2.667 10.833-4.667 13.5-6 10-4 17.833-2 23.5 6 5.666 8 3.833 15.333-5.5 22-12 8.667-27.334 18.667-46 30-57.334 34-121.334 60.333-192 79-70.667 18.667-139.667 28-207 28-104 0-202.334-18.167-295-54.5C162.333 909.167 79.333 858 6 792c-4-3.333-6-6.667-6-10 0-2 .666-4 2-6zm301-285c0-46 11.333-85.333 34-118 22.666-32.667 53.666-57.333 93-74 36-15.333 80.333-26.333 133-33 18-2 47.333-4.667 88-8v-17c0-42.667-4.667-71.333-14-86-14-20-36-30-66-30h-8c-22 2-41 9-57 21s-26.334 28.667-31 50c-2.667 13.333-9.334 21-20 23l-115-14c-11.334-2.667-17-8.667-17-18 0-2 .333-4.333 1-7 11.333-59.333 39.166-103.333 83.5-132C451.833 19.333 503.666 3.333 563 0h25c76 0 135.333 19.667 178 59a190.52 190.52 0 0 1 18.5 21.5c5.666 7.667 10.166 14.5 13.5 20.5 3.333 6 6.333 14.667 9 26 2.666 11.333 4.666 19.167 6 23.5 1.333 4.333 2.333 13.667 3 28 .666 14.333 1 22.833 1 25.5v242c0 17.333 2.5 33.167 7.5 47.5s9.833 24.667 14.5 31c4.666 6.333 12.333 16.5 23 30.5 4 6 6 11.333 6 16 0 5.333-2.667 10-8 14-55.334 48-85.334 74-90 78-8 6-17.667 6.667-29 2-9.334-8-17.5-15.667-24.5-23s-12-12.667-15-16-7.834-9.833-14.5-19.5c-6.667-9.667-11.334-16.167-14-19.5-37.334 40.667-74 66-110 76-22.667 6.667-50.667 10-84 10-51.334 0-93.5-15.833-126.5-47.5S303 549 303 491zm172-20c0 26 6.5 46.833 19.5 62.5S525 557 547 557c2 0 4.833-.333 8.5-1 3.666-.667 6.166-1 7.5-1 28-7.333 49.666-25.333 65-54 7.333-12.667 12.833-26.5 16.5-41.5 3.666-15 5.666-27.167 6-36.5.333-9.333.5-24.667.5-46v-25c-38.667 0-68 2.667-88 8-58.667 16.667-88 53.667-88 111zm420 322c1.333-2.667 3.333-5.333 6-8 16.666-11.333 32.666-19 48-23 25.333-6.667 50-10.333 74-11 6.666-.667 13-.333 19 1 30 2.667 48 7.667 54 15 2.666 4 4 10 4 18v7c0 23.333-6.334 50.833-19 82.5-12.667 31.667-30.334 57.167-53 76.5-3.334 2.667-6.334 4-9 4-1.334 0-2.667-.333-4-1-4-2-5-5.667-3-11 24.666-58 37-98.333 37-121 0-7.333-1.334-12.667-4-16-6.667-8-25.334-12-56-12-11.334 0-24.667.667-40 2-16.667 2-32 4-46 6-4 0-6.667-.667-8-2-1.334-1.333-1.667-2.667-1-4 0-.667.333-1.667 1-3z"/></svg> \ No newline at end of file diff --git a/src/icons/docker.png b/src/icons/docker.png deleted file mode 100644 index 307dd8f34f9f90c149752619e33a1f8aebfca950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1871 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 JPDHLkV1gxAfusNc From 31a436474f75ed868b1642862ef6be57e25c9860 Mon Sep 17 00:00:00 2001 From: Pooya Parsa <pyapar@gmail.com> Date: Sun, 9 Dec 2018 22:58:44 +0330 Subject: [PATCH 091/197] fix: use svg icon for Nuxt.js --- src/apps.json | 2 +- src/icons/Nuxt.js.png | Bin 1303 -> 0 bytes src/icons/Nuxt.js.svg | 10 ++++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) delete mode 100644 src/icons/Nuxt.js.png create mode 100644 src/icons/Nuxt.js.svg diff --git a/src/apps.json b/src/apps.json index c2fd5c6e3..e147edaaf 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10667,7 +10667,7 @@ "<div [^>]*id=\"__nuxt\"", "<script [^>]*>window\\.__NUXT__" ], - "icon": "Nuxt.js.png", + "icon": "Nuxt.js.svg", "js": { "$nuxt": "" }, diff --git a/src/icons/Nuxt.js.png b/src/icons/Nuxt.js.png deleted file mode 100644 index cb014676b5c1d79042448afe43325a6317bc1157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1303 zcmV+y1?c*TP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;tT`;7&ee=XTJad1f)qs zK~z}7?N(b%6lWCvW_M?I1)&JBl`6)*5RyK$A!sSpf+#m(0Re4|lv+R}ZM0HLb+s|H z<=Pg!Mky7wX`7(d!WK=lT<Qi8qDGp~Cauw=#o8hP<hDD^?#};DA7EhzhRae+Up!AU z=bSn7&G-H1%mJR5i<W3A!)8;N$NvgqLtVkmO^u(uun@Hrt|SN69E8qP8b~Nz%?q~k zljD27{z8G&sK*DOJ+TmGexwEfs7PPjSYMb50GrG50014GcTM=l`1k-sHx%ndh<=WH zN@*nkRKJ&p_4&Dxc0pJdS#)6Uf&)lvISl}?65)`upNgV7qQ3A100=}d0sv>T7P<m} znQP+4y24t4lDH`a7(mfs$>S}2p2MeBsf?_OjjlUTv~Us#l*G#U>9ByIw(dOVN;W}= z4DemWE|>)2#)A8@Y^fOVb=?p-0y<!q5c6~Aoj(EK^p7?FO#+>%G;o;bZp+2UUmQj* zJphyp7_|cGpd|ni$K&1}o*}jSK5m;A18+2+0sxqKu2mMfRtetN4Jb#yL9|kkPEL~3 zZyss{faGJJ%#VTShT;!+!CoR4v)%58t*Hl4Fp_H8U~h<Y!lhMfavBeo9CZnR?x#}p z*m@OOxDk2Y7?_XU1*kYR^b`v=z(dj|zMh_{e};!h>)|7Flb|+yA3T(vHPb=nuXaha zmUP9S9T1#iqKG~VXOMgOv;cJ1K7Yne1f5(=v=9it56vi^?UzAG+$Pv#BTMvtvjW)K zbR1*TtV6c4iowX`zooj%fwWQ3K|$i<t=8)RP}ORh`3yug6o**_`!(6N>*O$U`N8<f zpUpJE-hh)DZW?W5y}r0!7C^G;C^Tvf`*8S?jXED=r?0o1ya&-r=RD_C%iW+{p`D;x zp@9Fg6{=p#5HaNBO=Tdap(MddgaSx#kLh^p5v;AfF8n>l+VCYGDJ!hHpg~_;H6^jF z{nuHGy{-Rr{Ca0@{=By!uYfT5Gq5#V?{%@fXuxqFl8~V#0^x65J&)J24=uY;UhvR4 ze@oVWpGy@beXk~Eu?m(ImM`@YySjU@)Mp7psi<*x)9}CD>s&(!(E?BcAgoG7+iK6Y z$Rb-4yF&zku#{{7Ku}EDM?o=Z3IGUA%9^t31jVG~0zlkbIqWM585bP>(4?&GlXF*Z zdUJfPtPG5rb`F?A;xkO9@5)`G^vby-b}EXcp()wnA@Lc0B4D1W<?pu}rv;!?Diz5g z@#!aB)wS)1vo|Rr0Stq(rtd2Z^IplCtH106!+e#H{=S!FAt6MNn>ms>LFn@UqjUwh zYO-T(LMB=aXKsbWr&j{_V*&u>BDcNEj_{m)@nUyqS=H0sef>k@&n0H++}#)DbDVYL zWnKF5w#Mswz}<0~0k;;z83f1fz^awcW-<)3pVHC6bK}anEf&sP1t4i~a5$@{e;~Kj zP+74qaVOR$X8JP><8S=-L|1cl#eiDPUJQ@h5HN|VMYE!bOUsc=jnJfB?%Q`C1^`67 z{tf_OeM<IoVJX?Z01&Zl)EAn(%iZzJ?hi-ThfS$_B@)I@s{O<q_AfK#&>&pT$+rLi N002ovPDHLkV1nk?W1Ij0 diff --git a/src/icons/Nuxt.js.svg b/src/icons/Nuxt.js.svg new file mode 100644 index 000000000..e0bd713f8 --- /dev/null +++ b/src/icons/Nuxt.js.svg @@ -0,0 +1,10 @@ +<svg width="486px" height="346px" viewBox="0 0 486 346" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>Nuxt Logo + + + + + + + + From 29760c9865715ebca042759f747dc6c05c17bf83 Mon Sep 17 00:00:00 2001 From: Sang Nguyen Date: Thu, 13 Dec 2018 07:49:28 +0700 Subject: [PATCH 092/197] Add Botble CMS version detection --- src/apps.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps.json b/src/apps.json index c2fd5c6e3..27a8555e7 100644 --- a/src/apps.json +++ b/src/apps.json @@ -5763,6 +5763,9 @@ "cookies": { "botble_session": "" }, + "headers": { + "CMS-Version": "^(.+)$\\;version:\\1" + }, "icon": "mypage-platform.png", "implies": "Laravel", "website": "https://www.mypage.vn" From 013377d37783c994a61c590fc9136cb11c272ae0 Mon Sep 17 00:00:00 2001 From: osben Date: Fri, 14 Dec 2018 15:10:17 +0200 Subject: [PATCH 093/197] fix: update icon for ionicons --- src/icons/Ionicons.png | Bin 671 -> 19373 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/icons/Ionicons.png b/src/icons/Ionicons.png index ace620764f506bba30df3764dfea922f07dccb0f..67497c434a99d28e3f5a842182ba184833ef9ddf 100644 GIT binary patch literal 19373 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 ZU~PIbEayi~2Cr#=so@TTQhnD${{!eOft&yU literal 671 zcmV;Q0$}}#P)0(}TdC{09?>_Jd4=&6K+eh5WBh}5Qp>q^CfJJaSk=&pD%&-pn?_J?Ts$x zi#G4zuO{*t8-farq1zSd(xH`!*@4^s9~&_1N^}wH74~F*aW`;WayPIUCvgdvaXQN4 zBf&A{eW;YNH&!geD8Bk8mH4j7R2bWuMYY@<#|2}h$$-Fq(|Mos|84c-tT#hj3>AhA z!98P!_GI2o%FVniyCH?E@FhY5KTvBJ&Wzlo4cQ)x5Zu#kXm`$5@8PTm@5x z;OVd))%JQZ=ybc3F|LH=`qo?y2>cT_!q$|mwq&c9@IJ^+w=KfUB!NC$#{>pYA90hC z%Kk!jvoj@p9Y4oD|CiTrq6EQ@N{{E-hJTQAKoNu2>z=bJSAnD!NE9KstR?Tz8dh+x z_C!OB!RvIx+itCp)U!cn48f1!qh-(Gueb@fbOYH`Kwx>Yp6DZ9y_SE_jAy!V^yfRY zXjh-XYh5+>$2o~=HGvm;6ra~~-n5>E<%s?g=c1gfRsmm+R_4 Date: Fri, 14 Dec 2018 15:11:35 +0200 Subject: [PATCH 094/197] fix: add rule ignore dir .idea (JetBrains IDE) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8343ce16c..2f6ceae5b 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ Desktop.ini ._* tags tags.* +.idea \ No newline at end of file From 474b658c9ca06481acb2168d147729b58d746421 Mon Sep 17 00:00:00 2001 From: osben Date: Fri, 14 Dec 2018 15:12:09 +0200 Subject: [PATCH 095/197] feat: add ionic --- src/apps.json | 12 ++++++++++++ src/icons/ionic.png | Bin 0 -> 3654 bytes 2 files changed, 12 insertions(+) create mode 100644 src/icons/ionic.png diff --git a/src/apps.json b/src/apps.json index c2fd5c6e3..245e2878b 100644 --- a/src/apps.json +++ b/src/apps.json @@ -4703,6 +4703,18 @@ "script": "https?://cdn\\.inwemo\\.com/inwemo\\.min\\.js", "website": "https://inwemo.com/" }, + "Ionic": { + "cats": [ + 18 + ], + "icon": "ionic.png", + "implies": "Angular", + "js": { + "Ionic.config": "", + "Ionic.version": "^(.+)$\\;version:\\1" + }, + "website": "https://ionicframework.com" + }, "Ionicons": { "cats": [ 17 diff --git a/src/icons/ionic.png b/src/icons/ionic.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b7f2ec572203fc85ac04c770dd1601bb0bce6c GIT binary patch literal 3654 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 Date: Sat, 15 Dec 2018 09:40:45 +1100 Subject: [PATCH 096/197] Update README --- src/drivers/npm/README.md | 12 +++++++++--- src/drivers/npm/index.js | 5 +---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/drivers/npm/README.md b/src/drivers/npm/README.md index 8d7ea19f8..71ff7a3d8 100644 --- a/src/drivers/npm/README.md +++ b/src/drivers/npm/README.md @@ -45,6 +45,9 @@ node index.js [url] [options] ## Run from a script +const Wappalyzer = require('./driver'); +const Browser = require('./browsers/zombie'); + ```javascript const options = { debug: false, @@ -58,16 +61,19 @@ const options = { htmlMaxRows: 2000, }; -const wappalyzer = new Wappalyzer('https://www.wappalyzer.com', options); +const wappalyzer = new Wappalyzer(Browser, 'https://www.wappalyzer.com', options); + +// Optionally override the default logger +// wappalyzer.log = (message, source, type) => console.log(message); wappalyzer.analyze() .then(json => { - process.stdout.write(JSON.stringify(json, null, 2) + '\n') + process.stdout.write(`${JSON.stringify(json, null, 2)}\n`); process.exit(0); }) .catch(error => { - process.stderr.write(error + '\n') + process.stderr.write(`${error}\n`); process.exit(1); }); diff --git a/src/drivers/npm/index.js b/src/drivers/npm/index.js index 9436159ed..3ca29287e 100755 --- a/src/drivers/npm/index.js +++ b/src/drivers/npm/index.js @@ -1,7 +1,7 @@ #!/usr/bin/env node -const Browser = require('./browsers/zombie'); const Wappalyzer = require('./driver'); +const Browser = require('./browsers/zombie'); const args = process.argv.slice(2); @@ -32,9 +32,6 @@ do { const wappalyzer = new Wappalyzer(Browser, url, options); -// Optionally define a custom log function -// wappalyzer.log = (message, source, type) => console.log(message); - wappalyzer.analyze() .then((json) => { process.stdout.write(`${JSON.stringify(json)}\n`); From ecb9f80f63e9eedb85f00d5ffb87c7742de531d7 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Sat, 15 Dec 2018 09:41:45 +1100 Subject: [PATCH 097/197] Update README --- src/drivers/npm/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drivers/npm/README.md b/src/drivers/npm/README.md index 71ff7a3d8..b6f3ae7cc 100644 --- a/src/drivers/npm/README.md +++ b/src/drivers/npm/README.md @@ -45,10 +45,10 @@ node index.js [url] [options] ## Run from a script +```javascript const Wappalyzer = require('./driver'); const Browser = require('./browsers/zombie'); -```javascript const options = { debug: false, delay: 500, From c728d7f0664b5a967975f1ee4ddb3f1581a5feb2 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Sat, 15 Dec 2018 11:01:06 +1100 Subject: [PATCH 098/197] Build 5.6.1 --- src/drivers/npm/README.md | 6 +- src/drivers/npm/package.json | 3 +- src/drivers/webextension/js/driver.js | 26 ++++---- src/drivers/webextension/js/options.js | 89 +++++++++++++++++--------- src/drivers/webextension/manifest.json | 2 +- 5 files changed, 78 insertions(+), 48 deletions(-) diff --git a/src/drivers/npm/README.md b/src/drivers/npm/README.md index b6f3ae7cc..29078d2f3 100644 --- a/src/drivers/npm/README.md +++ b/src/drivers/npm/README.md @@ -27,9 +27,9 @@ node index.js [url] [options] ### Options ``` - --password Password to be used for basic HTTP authentication - --proxy Proxy URL, e.g. 'http://user:pass@proxy:8080' - --username Username to be used for basic HTTP authentication + --password Password to be used for basic HTTP authentication + --proxy Proxy URL, e.g. 'http://user:pass@proxy:8080' + --username Username to be used for basic HTTP authentication --chunk-size=num Process links in chunks. --debug=0|1 Output debug messages. --delay=ms Wait for ms milliseconds between requests. diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index f89284174..0067fa0d5 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "5.6.0", + "version": "5.6.1", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { @@ -12,6 +12,7 @@ "main": "driver.js", "files": [ "apps.json", + "browsers/zombie.js", "index.js", "driver.js", "wappalyzer.js" diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index 0d3efcd40..1336809d4 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -24,20 +24,22 @@ browser.tabs.onRemoved.addListener((tabId) => { * Get a value from localStorage */ function getOption(name, defaultValue = null) { - return new Promise(async (resolve) => { + return new Promise(async (resolve, reject) => { let value = defaultValue; try { const option = await browser.storage.local.get(name); - if (option[name]) { + if (option[name] !== undefined) { value = option[name]; } } catch (error) { - wappalyzer.log(error, 'driver', 'error'); + wappalyzer.log(error.message, 'driver', 'error'); + + return reject(error.message); } - resolve(value); + return resolve(value); }); } @@ -45,14 +47,16 @@ function getOption(name, defaultValue = null) { * Set a value in localStorage */ function setOption(name, value) { - return new Promise(async (resolve) => { + return new Promise(async (resolve, reject) => { try { await browser.storage.local.set({ [name]: value }); } catch (error) { - wappalyzer.log(error, 'driver', 'error'); + wappalyzer.log(error.message, 'driver', 'error'); + + return reject(error.message); } - resolve(); + return resolve(); }); } @@ -334,10 +338,10 @@ wappalyzer.driver.ping = async (hostnameCache = {}, adCache = []) => { url: `${wappalyzer.config.websiteURL}installed`, }); } else if (version !== previousVersion && upgradeMessage) { - //openTab({ - // url: `${wappalyzer.config.websiteURL}upgraded?v${version}`, - // background: true, - //}); + openTab({ + url: `${wappalyzer.config.websiteURL}upgraded?v${version}`, + background: true, + }); } await setOption('version', version); diff --git a/src/drivers/webextension/js/options.js b/src/drivers/webextension/js/options.js index 2282498df..4666b0045 100644 --- a/src/drivers/webextension/js/options.js +++ b/src/drivers/webextension/js/options.js @@ -1,26 +1,51 @@ /** global: browser */ /** global: Wappalyzer */ -/* globals browser chrome Wappalyzer */ +/* globals browser Wappalyzer */ /* eslint-env browser */ const wappalyzer = new Wappalyzer(); -function getOption(name, defaultValue, callback) { - browser.storage.local.get(name) - .then((item) => { - callback(item.hasOwnProperty(name) ? item[name] : defaultValue); - }); +/** + * Get a value from localStorage + */ +function getOption(name, defaultValue = null) { + return new Promise(async (resolve, reject) => { + let value = defaultValue; + + try { + const option = await browser.storage.local.get(name); + + if (option[name] !== undefined) { + value = option[name]; + } + } catch (error) { + wappalyzer.log(error.message, 'driver', 'error'); + + return reject(error.message); + } + + return resolve(value); + }); } +/** + * Set a value in localStorage + */ function setOption(name, value) { - (chrome || browser).runtime.sendMessage({ - id: 'set_option', - key: name, - value, + return new Promise(async (resolve, reject) => { + try { + await browser.storage.local.set({ [name]: value }); + } catch (error) { + wappalyzer.log(error.message, 'driver', 'error'); + + return reject(error.message); + } + + return resolve(); }); } -document.addEventListener('DOMContentLoaded', () => { +document.addEventListener('DOMContentLoaded', async () => { const nodes = document.querySelectorAll('[data-i18n]'); Array.prototype.forEach.call(nodes, (node) => { @@ -39,33 +64,33 @@ document.addEventListener('DOMContentLoaded', () => { window.open(wappalyzer.config.websiteURL); }); - getOption('upgradeMessage', true, (value) => { - const el = document.querySelector('#option-upgrade-message'); + let el; + let value; - el.checked = value; + // Upgrade message + value = await getOption('upgradeMessage', true); - el.addEventListener('change', () => { - setOption('upgradeMessage', el.checked); - }); - }); + el = document.querySelector('#option-upgrade-message'); - getOption('dynamicIcon', true, (value) => { - const el = document.querySelector('#option-dynamic-icon'); + el.checked = value; - el.checked = value; + el.addEventListener('change', e => setOption('upgradeMessage', e.target.checked)); - el.addEventListener('change', () => { - setOption('dynamicIcon', el.checked); - }); - }); + // Dynamic icon + value = await getOption('dynamicIcon', true); - getOption('tracking', true, (value) => { - const el = document.querySelector('#option-tracking'); + el = document.querySelector('#option-dynamic-icon'); - el.checked = value; + el.checked = value; - el.addEventListener('change', () => { - setOption('tracking', el.checked); - }); - }); + el.addEventListener('change', e => setOption('dynamicIcon', e.target.checked)); + + // Tracking + value = await getOption('tracking', true); + + el = document.querySelector('#option-tracking'); + + el.checked = value; + + el.addEventListener('change', e => setOption('tracking', e.target.checked)); }); diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index ef7dc4df8..bb1146b10 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://www.wappalyzer.com", "description": "Identify web technologies", - "version": "5.6.0", + "version": "5.6.1", "default_locale": "en", "manifest_version": 2, "icons": { From 87e829ee00836b09660fcb11ce8095f1b05273a5 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Sun, 16 Dec 2018 11:26:23 +1100 Subject: [PATCH 099/197] Emit log and visit events in NPM driver --- src/drivers/npm/README.md | 15 ++++++++++++--- src/drivers/npm/browsers/zombie.js | 2 ++ src/drivers/npm/driver.js | 23 +++++++++++++++++++++-- src/drivers/npm/npm-shrinkwrap.json | 2 +- src/drivers/npm/package.json | 5 +++-- src/drivers/webextension/js/driver.js | 4 ++-- src/drivers/webextension/manifest.json | 2 +- 7 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/drivers/npm/README.md b/src/drivers/npm/README.md index 29078d2f3..3214b693c 100644 --- a/src/drivers/npm/README.md +++ b/src/drivers/npm/README.md @@ -49,6 +49,8 @@ node index.js [url] [options] const Wappalyzer = require('./driver'); const Browser = require('./browsers/zombie'); +const url = 'https://www.wappalyzer.com; + const options = { debug: false, delay: 500, @@ -61,10 +63,17 @@ const options = { htmlMaxRows: 2000, }; -const wappalyzer = new Wappalyzer(Browser, 'https://www.wappalyzer.com', options); +const wappalyzer = new Wappalyzer(Browser, url, options); + +// Optional: capture log output +// wappalyzer.on('log', params => { +// const { message, source, type } = params; +// }); -// Optionally override the default logger -// wappalyzer.log = (message, source, type) => console.log(message); +// Optional: do something on page visit +// wappalyzer.on('visit', params => { +// const { browser, pageUrl } = params; +// }); wappalyzer.analyze() .then(json => { diff --git a/src/drivers/npm/browsers/zombie.js b/src/drivers/npm/browsers/zombie.js index 0e091d697..28f6ba3ce 100644 --- a/src/drivers/npm/browsers/zombie.js +++ b/src/drivers/npm/browsers/zombie.js @@ -25,6 +25,8 @@ class ZombieBrowser extends Browser { const resource = this.browser.resources.length ? this.browser.resources.filter(_resource => _resource.response).shift() : null; + this.window = this.browser.window; + this.document = this.browser.document; this.headers = this.getHeaders(); this.statusCode = resource ? resource.response.status : 0; this.contentType = this.headers['content-type'] ? this.headers['content-type'].shift() : null; diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js index cf4bfce61..53746b326 100644 --- a/src/drivers/npm/driver.js +++ b/src/drivers/npm/driver.js @@ -48,6 +48,7 @@ class Driver { this.analyzedPageUrls = {}; this.apps = []; this.meta = {}; + this.listeners = {}; this.Browser = Browser; @@ -65,6 +66,20 @@ class Driver { process.on('uncaughtException', e => this.wappalyzer.log(`Uncaught exception: ${e.message}`, 'driver', 'error')); } + on(event, callback) { + if (!this.listeners[event]) { + this.listeners[event] = []; + } + + this.listeners[event].push(callback); + } + + emit(event, params) { + if (this.listeners[event]) { + this.listeners[event].forEach(listener => listener(params)); + } + } + analyze() { this.time = { start: new Date().getTime(), @@ -78,6 +93,8 @@ class Driver { if (this.options.debug) { console.log(`[wappalyzer ${type}]`, `[${source}]`, message); } + + this.emit('log', { message, source, type }); } displayApps(detected, meta) { @@ -150,11 +167,11 @@ class Driver { // Validate response if (!browser.statusCode) { - reject(new Error('NO_RESPONSE')); + return reject(new Error('NO_RESPONSE')); } if (browser.statusCode !== 200) { - reject(new Error('RESPONSE_NOT_OK')); + return reject(new Error('RESPONSE_NOT_OK')); } if (!browser.contentType || !/\btext\/html\b/.test(browser.contentType)) { @@ -188,6 +205,8 @@ class Driver { }, [], ); + this.emit('visit', { browser, pageUrl }); + return resolve(reducedLinks); } diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index 0152d40c4..238a9bf90 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.6.0", + "version": "5.6.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index 0067fa0d5..14a7c6645 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "5.6.1", + "version": "5.6.2", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { @@ -12,9 +12,10 @@ "main": "driver.js", "files": [ "apps.json", + "browser.js", "browsers/zombie.js", - "index.js", "driver.js", + "index.js", "wappalyzer.js" ], "bin": { diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index 1336809d4..c1703ed5c 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -339,8 +339,8 @@ wappalyzer.driver.ping = async (hostnameCache = {}, adCache = []) => { }); } else if (version !== previousVersion && upgradeMessage) { openTab({ - url: `${wappalyzer.config.websiteURL}upgraded?v${version}`, - background: true, + url: `${wappalyzer.config.websiteURL}upgraded?v${version}`, + background: true, }); } diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index bb1146b10..3f12953c8 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://www.wappalyzer.com", "description": "Identify web technologies", - "version": "5.6.1", + "version": "5.6.2", "default_locale": "en", "manifest_version": 2, "icons": { From 919df84df59d0b61759f9ab284c37663fffe9ba6 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Sun, 16 Dec 2018 11:28:18 +1100 Subject: [PATCH 100/197] Build v5.6.3 --- src/drivers/npm/npm-shrinkwrap.json | 2 +- src/drivers/npm/package.json | 2 +- src/drivers/webextension/manifest.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index 238a9bf90..13f73e610 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.6.1", + "version": "5.6.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index 14a7c6645..9f13dce1b 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "5.6.2", + "version": "5.6.3", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 3f12953c8..9c71e4ade 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://www.wappalyzer.com", "description": "Identify web technologies", - "version": "5.6.2", + "version": "5.6.3", "default_locale": "en", "manifest_version": 2, "icons": { From 44011e846ecf815bc90b779509446a702fac3022 Mon Sep 17 00:00:00 2001 From: "Edson Celio (aka tuxpilgrim)" Date: Sun, 16 Dec 2018 10:26:44 -0300 Subject: [PATCH 101/197] Change MAINTAINER to LABEL --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index d781318ad..e7c9e6806 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM alpine -MAINTAINER Elbert Alias +LABEL maintainer="elbert@alias.io" ENV WAPPALYZER_DIR=/opt/wappalyzer From 4e86d56d8ad1c77af691d1557ef5b4d34fe849d1 Mon Sep 17 00:00:00 2001 From: Jimmy Ng Date: Wed, 19 Dec 2018 17:19:13 -0500 Subject: [PATCH 102/197] added new app 'Instabot' --- src/apps.json | 15 +++++++++++++++ src/drivers/npm/npm-shrinkwrap.json | 2 +- src/icons/Instabot.png | Bin 0 -> 2877 bytes 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/icons/Instabot.png diff --git a/src/apps.json b/src/apps.json index c2fd5c6e3..b2a5830aa 100644 --- a/src/apps.json +++ b/src/apps.json @@ -4629,6 +4629,21 @@ ], "website": "https://www.inspectlet.com/" }, + "Instabot": { + "cats": [ + 5, + 10, + 32, + 52, + 58 + ], + "icon": "Instabot.png", + "js": { + "Instabot": "" + }, + "script": "rokoInstabot\\.js", + "website": "https://instabot.io/" + }, "InstantCMS": { "cats": [ 1 diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index 13f73e610..bbb0edafc 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.6.2", + "version": "5.6.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/icons/Instabot.png b/src/icons/Instabot.png new file mode 100644 index 0000000000000000000000000000000000000000..3b49095d355d20c1abc8c8a1f785f847d0184c93 GIT binary patch literal 2877 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 Date: Wed, 26 Dec 2018 15:40:47 +0100 Subject: [PATCH 103/197] Add Strapi --- src/apps.json | 10 ++++++++++ src/icons/Strapi.png | Bin 0 -> 8670 bytes 2 files changed, 10 insertions(+) create mode 100644 src/icons/Strapi.png diff --git a/src/apps.json b/src/apps.json index c2fd5c6e3..7d3acfdd5 100644 --- a/src/apps.json +++ b/src/apps.json @@ -9513,6 +9513,16 @@ "script": "strapdown\\.js", "website": "http://strapdownjs.com" }, + "Strapi": { + "cats": [ + 1 + ], + "headers": { + "X-Powered-By": "^Strapi" + }, + "icon": "Strapi.png", + "website": "https://strapi.io" + }, "Strato": { "cats": [ 6 diff --git a/src/icons/Strapi.png b/src/icons/Strapi.png new file mode 100644 index 0000000000000000000000000000000000000000..065887ab78a9a29f1f3fdc90adab8d20c59c6d2c GIT binary patch literal 8670 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 literal 0 HcmV?d00001 From 9677e694deb5029d0afba68287885ce75caf2ef2 Mon Sep 17 00:00:00 2001 From: ruibaby Date: Fri, 28 Dec 2018 14:46:34 +0800 Subject: [PATCH 104/197] Add Halo --- src/apps.json | 13 +++++++++++++ src/icons/Halo.svg | 30 ++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 src/icons/Halo.svg diff --git a/src/apps.json b/src/apps.json index c2fd5c6e3..c3777f79a 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12835,6 +12835,19 @@ "generator": "xt:Commerce" }, "website": "https://www.xt-commerce.com" + }, + "Halo": { + "cats": [ + 1, + 11 + ], + "html": [ + "]+/halo-(?:backend|frontend|common)/" + ], + "icon": "Halo.svg", + "implies": "Java", + "script": "/halo-(?:backend|frontend|common)/", + "website": "https://github.com/ruibaby/halo" } }, "categories": { diff --git a/src/icons/Halo.svg b/src/icons/Halo.svg new file mode 100644 index 000000000..cce2a59db --- /dev/null +++ b/src/icons/Halo.svg @@ -0,0 +1,30 @@ + + + + + + + + + + From cb1db873c220bf7fe3d3dbe74ea2f8ef6d7010b4 Mon Sep 17 00:00:00 2001 From: Mehdi Rejraji Date: Wed, 2 Jan 2019 15:50:08 +0100 Subject: [PATCH 105/197] Added Weglot to apps --- src/apps.json | 14 ++++++++++++++ src/icons/Weglot.png | Bin 0 -> 3607 bytes 2 files changed, 14 insertions(+) create mode 100644 src/icons/Weglot.png diff --git a/src/apps.json b/src/apps.json index c2fd5c6e3..05857b888 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10932,6 +10932,20 @@ "script": "cdn\\d+\\.editmysite\\.com", "website": "https://www.weebly.com" }, + "Weglot": { + "cats": [ + 19 + ], + "headers": { + "Weglot-Translated": "" + }, + "icon": "Weglot.png", + "script": [ + "cdn\\.weglot\\.com", + "wp-content/plugins/weglot" + ], + "website": "https://www.weglot.com" + }, "Wikinggruppen": { "cats": [ 6 diff --git a/src/icons/Weglot.png b/src/icons/Weglot.png new file mode 100644 index 0000000000000000000000000000000000000000..33da33a8aa270d26b71632089fc58bd7caf2717e GIT binary patch literal 3607 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 literal 0 HcmV?d00001 From bd8aa3be49eab37b15fd9ff0c8b40a2bcc4fdce1 Mon Sep 17 00:00:00 2001 From: Marat Dyatko Date: Tue, 8 Jan 2019 21:14:55 +0100 Subject: [PATCH 106/197] Klarna logo update --- src/apps.json | 2 +- src/icons/Klarna.png | Bin 0 -> 18931 bytes src/icons/Klarna.svg | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 src/icons/Klarna.png delete mode 100644 src/icons/Klarna.svg diff --git a/src/apps.json b/src/apps.json index c2fd5c6e3..8e0120cd1 100644 --- a/src/apps.json +++ b/src/apps.json @@ -5136,7 +5136,7 @@ 6, 5 ], - "icon": "Klarna.svg", + "icon": "Klarna.png", "js": { "_klarnaCheckout": "" }, diff --git a/src/icons/Klarna.png b/src/icons/Klarna.png new file mode 100644 index 0000000000000000000000000000000000000000..812922de138d857d8708374290b63e3c22d30617 GIT binary patch literal 18931 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 z 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 literal 0 HcmV?d00001 diff --git a/src/icons/Klarna.svg b/src/icons/Klarna.svg deleted file mode 100644 index 0bb061c85..000000000 --- a/src/icons/Klarna.svg +++ /dev/null @@ -1 +0,0 @@ -klarna \ No newline at end of file From c839927ec2de7c899828f84506e33c9ae4ce100e Mon Sep 17 00:00:00 2001 From: Sang Nguyen Date: Mon, 14 Jan 2019 12:15:01 +0700 Subject: [PATCH 107/197] Update regex to detect Botble CMS version --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 27a8555e7..82aadbfa6 100644 --- a/src/apps.json +++ b/src/apps.json @@ -5764,7 +5764,7 @@ "botble_session": "" }, "headers": { - "CMS-Version": "^(.+)$\\;version:\\1" + "CMS-Version": "^(.+)$\\;version:\\1;confidence:0" }, "icon": "mypage-platform.png", "implies": "Laravel", From 6edd7560bf46d3509a13ca6d392407b9d78dc5b2 Mon Sep 17 00:00:00 2001 From: Christian Hellsten Date: Mon, 14 Jan 2019 09:11:12 +0200 Subject: [PATCH 108/197] Better detection of Tealium Better detection of Tealium. See https://regex101.com/r/3T16wo/1 --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index c2fd5c6e3..45928e986 100644 --- a/src/apps.json +++ b/src/apps.json @@ -9795,7 +9795,7 @@ "TEALIUMENABLED": "" }, "script": [ - "^//tags\\.tiqcdn\\.com/", + "^(https?:)?//tags\\.tiqcdn\\.com/", "/tealium/utag\\.js$" ], "website": "http://tealium.com" From 4838717c274a53c9c1d84027a5ae4515ef66e143 Mon Sep 17 00:00:00 2001 From: Marat Dyatko Date: Mon, 14 Jan 2019 18:38:10 +0100 Subject: [PATCH 109/197] Klarna logo update --- src/apps.json | 2 +- src/icons/Klarna.png | Bin 18931 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 src/icons/Klarna.png diff --git a/src/apps.json b/src/apps.json index 8e0120cd1..c2fd5c6e3 100644 --- a/src/apps.json +++ b/src/apps.json @@ -5136,7 +5136,7 @@ 6, 5 ], - "icon": "Klarna.png", + "icon": "Klarna.svg", "js": { "_klarnaCheckout": "" }, diff --git a/src/icons/Klarna.png b/src/icons/Klarna.png deleted file mode 100644 index 812922de138d857d8708374290b63e3c22d30617..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18931 zcmd_R^;=a@(=fcwp-Yfb8jJ334k##%qzFhJy1O|l7$}0$iiC87q9`DsC|wGuAf-sR zbe?Z*yzl3Iet56gO z;U4Wwg@2g*)UNp%dOG+8+W26BioK^TmQ%ys#u00PwXqNOZpSLXSv1Z@*Zi*OXv^7o zx(nGLG(th{UT`)53d%uVHg>L9KTcb$qqB$N*_FD+vz*TMif2tFbwqT$E@GXWuY~wu z4MTK|>_S}aWbMx?D{(3W$w3D0SU(%iAa^$pU%4Q~v&Vep;23!_4Th z>F9G_^z^}UN(xB{+KEbtaZ1YyiAsscib)7?iiwCy3yVk#i;4@1h{}mb$%)Hy{^#c` zl;&gaAZKt%{XeoGqfzPY+Inqm8Ynzn|h+sOdiw+`V*k{)e%L?|&QxT_zl4<0ULA zBqHqYj@Wff?dxZN{Xc5_U#WeKg1xZ923TKDe;+%z9uDXJI~n@!|1Idhg!Xp-L+9o1 z<92MPy`3=D4eO5e@biUAi5_bNHJ8)#afSQTv9yi@9%6cCwWOsL(n5t)lJh%kh~|DFh+2-(BAGUBo_B2v!Z{XBi0JiRzCUPMAel9NZr#?ILTdB}^b=703X`Zxz*?bUre-8qk!L(cjCqJ@~f zIMzl|TvkxlRzgxxLPknT&{j-VR!~|DYi}=VD`_Kc?{M}%^X>na>;8o^d;%@;`maKA zA~w<@BI34^f-<6_VuGTg(l&xJlAcCgO0I4;J{~q!Zk~>wR=&aRww`VZ!bp_5Im3y^ zqklYv{}<=u$Nwv=|4RvT1sVQNl0x8r(j4mnbK3_dadW065di2zeQhH(3JQu}zkYdm zcq}a~ojP?YIy(CA-@mc3u_zSk;NW0?e}8Lh>+tXpjYbm?5bW*k5fT#a?(Wvq)DROB zZ*FdGZ*P;6lM@jU?d)6~?| z>+978aKI`FUw+>6w|C#l^)77cR`s&USTmefaR<_3PJ6OiWW#Q>?74%gf6P3kzq@ zo*f(7qp8Zt66($Uembm{rK^tv$ONXix(Oi8k3Wgu%PASCuUuSQEG#UpUcIWR zsTmg+XJ}~n`}gnn@87qyv{Y7BzI^#oNJz-W#wIf})6~>-WMo8AQj(dOd3=2Q$&)8N zJv}8QCH?*VW@ctmQc{J5g?V{-zP`R9A|hYEeiauN|M>BvlarH}nAoF7k32m+4GavD zl9IHvwA9qpczJo_YyuH02Jb3Wz*)v5&MN3OdH#av22M1A6QEhGQh=>SV zTU#s^Yhq#|Cnr}_RP_A$a~~g{($doO^z@*hp!W9mrlzK_urOCw*YNQ0+}zx2*REZ^ ze%;vE*xK3}hr{XW>fXP9KO`i?-`~Hnu~9`uB|AI&?%lf`9UaBR#rF30US3|Qsj2VY zy-Q3?jERYHcX!Xv&yR|Vx_$e$o}S*ld-trYtdf(HA3uJ4V#gM)+N{)flo+i*(M$jHw? z*ARmLKmGv@2Qg*I36C27Qsc^}Xjbxvs2X)-&i9Z}>ulL`Wdd|$|I1((fGH4iqOapP{ zex(b3$_p35DAPoZrpA|EM}%dGZhqQSt`7+<^gy*0sgGHWet)d{Ea@XhL;1dQkw#5i){=z;@^(Fb>HD*9hyJLN`g7e@?^T9->GkhTrS4Bpn)Deqb( z%Ue}B2V2!1?3T@BMn?3PFM1AUFtRPD9mEL~A*=u&me~1><$-^d2kN*HnpqAU-(klE%Y*ghaO=gt^Squ?-n@psN3B1fJU?r3Z61vf$&qAf z{%q0EU0d%8_f*kmj{JJ`Zom71@?nndn$|@Wq`-VnK|QFB4G)PHexp_KbneimqRQ&C zvL%IA#ag{E!oyyjYwBgkkJCMWg7*S1MaHjPF0oxtE#Rh*3El61Hq00ibeIz#_Y;I#RZm`J#CBa=+C~D}PYh2Hr@1$Ava! zz7F9MFt(82RGrC>jeg8@(4@S!Pts65@&{iw$*mVr+E&v6_4pCs5ydOAMAcy)Vas688Od3)Z6D#?QU6>^zNYd}ZVQRYxV^V7Y@E*O&;2w*V44WMQ#tzQ9s$nLV1Dw`ib7#b$$fBoGE>Wk(pn}}ru+l}vW{+2 z+z-L3b^}NJYHUtI#jiXH+;)|u#*x!&EZNG5cEx;27=Yal$>jYJ6){+nsfACTVP8d! z0W*iW)HdF^cIKJ;FFlXb5vhLyY~rNuvk(TEB7%n`3~h!3jb6>B4rHdShBpg27ojWh za~)ZoTg`%WR&;*9tiLLcaIO{nR6q(TC{5iKl;>iZq-*f(mn+GB+udrU(;4wn5Oe z+d4kTYjwFFIE5?NaA$2|6C!q9e*bPd2hrx;Zs5wv=2{Ihj(p*TXT+Gkyr_$JzO*0R zRk|-tDD6%K1wE_sL;+q}5k8x9t1X7AIs{FQK4=j7Bz!L>;#rWez98iD?4fV>R}grHnW{k&+v|z$`R_4;EYBf{|W+j?=Gn`SEx8bBdL=DYw(VB-n}?odOT%;|~Z+NR2v z<|p_yzGrkMbi@pPuvk@o*kR>qIf;omWAOX6`;3#Aai-fZ|Tr}y>gN$ z0l#)O~kBc@Q!i4nPB%hz{-jv9mt-w{7(h(RU`s<9!b|P+hg#B8p>6Y#iy$H&=7df0pOn;?$4y-Ok;iU>;t;7j( zWhK*suw~bF6;b-dzdJt}SDp%91QuIdVMX4L9D4z+w1wh0Tq@|c22*baheLS^>dx6H z!);i_2{9~BcLXLH9Ji=z|D?TDErfJGY{^&jf2m{aSRh^JeU?4p?$fxF+-Er=%l2F7 zwI1K;ysvEK2(5XheaHmjHNSai?6d^FaUjKI8}7GSQKTCy?s6hJo+#2;DR2@I2F}+oZ&n~)Z=y4FKwZiTO-;ED!b>m0! zmIYjqo?baK!jAZv1#aJOVF%F}_qmB$eqWY=qF8i_DvVOs-$pEzibxTKD8K94dHHTX zI0?VmPQ5)v11ZdPZesbmfhmCf*l6tCf4WGQKfk+>uJiHVw8&^JK z8~cIj%Vzs{-_hnvhl4ns0EOUBUzH0GA9d$HAzvYuX51h9&X?2g&^VJ2O4ZvXz8e|3 z)?4{$A8q?cdH@P@ld3Ta5>EC06F^<^@X>mpWX1v8XJwH!i?M|y&x|AcMx}k1lZc1f z=`Xw?;B_psdZjiN$%m^Nx<;ohTn)ZtGX(kNeF1t$TYixpMw&rzSy_tU1J@Y zu{$&7qgsF6)N1mOS|d2~lo?!GF{zuE&p49wIAQ6L7h3*nWIkdk^?amK0W3Kc!#Yy8LS7s9amFB^MDh0h-t^^ca! z7`eQBJ<&3FxhK|xiIy%s%qrUKC*0?Od2b<#PkXnz$fV)Na@~YQM`J&4pj(aYS^~MH z(~zLt*PpzfBg^)#qL9k^toOUIaq8b?t+I%k?s^tGZFrbnEPWtUyUzn~pSs$hZNf^4 zWHmoy71?cO>_1XZGAjA_s<1`S1B`7Czvxt?K<~pUpYUasO3`!Z^oPMW__8|V(BO(T z#fAL(-~??ZfeN?qUhIa@=Hs|;)#6a(>^ZC{kLXmlCiWXH)_iAe)@RK5;B$nv}Z6BJ>YARNkTnCSA1=%H7?DR60Nd;-69{rFs^$sr`GJ zmh&mB&VQxT=y*DxOFjLkGNEl06q}m)Eif_Fv$yxUcnZ|e!LfmP|7LIxPuD+5Hd7FZ z*DLvlEXZU&g?jHvB=V2+KJ)rgw=o7zTQ~eeCpj%&$>mE1>z{{(eC$=b1}z~+F~qP~ zo5`RH`9H%6`jLhzAl*07$hNk5S<3bww)Khig?#y5D{PuJ8v4M+^%mUUf`m?jMbQ2d}$D z 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 From afed538949b45d2f3af40653ea7e1d8e12424a0b Mon Sep 17 00:00:00 2001 From: Marat Dyatko Date: Mon, 14 Jan 2019 18:38:21 +0100 Subject: [PATCH 110/197] Klarna logo update --- src/icons/Klarna.svg | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/icons/Klarna.svg diff --git a/src/icons/Klarna.svg b/src/icons/Klarna.svg new file mode 100644 index 000000000..56524058c --- /dev/null +++ b/src/icons/Klarna.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + From c06da38330262961f3e29009e579aa545b32995f Mon Sep 17 00:00:00 2001 From: Jimmy Ng Date: Mon, 14 Jan 2019 13:48:08 -0500 Subject: [PATCH 111/197] corrected the 'script' syntax per @jvoisin's suggestion re: false positives --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index b2a5830aa..ee218d9e1 100644 --- a/src/apps.json +++ b/src/apps.json @@ -4641,7 +4641,7 @@ "js": { "Instabot": "" }, - "script": "rokoInstabot\\.js", + "script": "/rokoInstabot\\.js", "website": "https://instabot.io/" }, "InstantCMS": { From a2af9595643f75a8e70791544256b5d44819e78e Mon Sep 17 00:00:00 2001 From: Lay Date: Thu, 17 Jan 2019 02:40:45 +0800 Subject: [PATCH 112/197] Update messages.json --- src/drivers/webextension/_locales/zh_TW/messages.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/drivers/webextension/_locales/zh_TW/messages.json b/src/drivers/webextension/_locales/zh_TW/messages.json index 6c543217d..3fb900f08 100644 --- a/src/drivers/webextension/_locales/zh_TW/messages.json +++ b/src/drivers/webextension/_locales/zh_TW/messages.json @@ -70,8 +70,8 @@ "categoryName57": { "message": "靜態網站產生器" }, "categoryName58": { "message": "使用者指引" }, "categoryName59": { "message": "JavaScript 函式庫" }, - "categoryName60": { "message": "Containers" }, - "categoryName61": { "message": "SaaS" }, - "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName60": { "message": "容器" }, + "categoryName61": { "message": "軟體即服務(SaaS)" }, + "categoryName62": { "message": "平台即服務(PaaS)" }, + "categoryName63": { "message": "基礎設施即服務(IaaS)" } } From cee1a12588cb7af998a72bf5ed3a6049104d66f1 Mon Sep 17 00:00:00 2001 From: RobiNN Date: Thu, 17 Jan 2019 21:37:29 +0100 Subject: [PATCH 113/197] Update apps.json --- src/apps.json | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/apps.json b/src/apps.json index c2fd5c6e3..e077d28bf 100644 --- a/src/apps.json +++ b/src/apps.json @@ -7337,10 +7337,19 @@ "cats": [ 1 ], - "html": "Powered by ]+php-fusion", + "html": [ + "Powered by ]+php-fusion", + "Powered by PHP-Fusion" + ], + "headers": { + "X-Powered-By": "PHP-Fusion (.+)$\\;version:\\1" + }, "icon": "PHP-Fusion.png", - "implies": "PHP", - "website": "http://www.php-fusion.co.uk" + "implies": [ + "PHP", + "MySQL" + ], + "website": "https://www.php-fusion.co.uk" }, "PHP-Nuke": { "cats": [ From 91bbde4468237e0b76a6775ecbfdfce9f1e3edb6 Mon Sep 17 00:00:00 2001 From: Sergii Bondarenko Date: Fri, 18 Jan 2019 17:24:33 +0200 Subject: [PATCH 114/197] #2421: [NPM] Make "processJs" and "processHtml" top-level functions to allow their reuse --- src/drivers/npm/driver.js | 103 +++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 52 deletions(-) diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js index 53746b326..df75a60fa 100644 --- a/src/drivers/npm/driver.js +++ b/src/drivers/npm/driver.js @@ -17,6 +17,53 @@ function sleep(ms) { return ms ? new Promise(resolve => setTimeout(resolve, ms)) : Promise.resolve(); } +function processJs(window, patterns) { + const js = {}; + + Object.keys(patterns).forEach((appName) => { + js[appName] = {}; + + Object.keys(patterns[appName]).forEach((chain) => { + js[appName][chain] = {}; + + patterns[appName][chain].forEach((pattern, index) => { + const properties = chain.split('.'); + + let value = properties + .reduce((parent, property) => (parent && parent[property] + ? parent[property] : null), window); + + value = typeof value === 'string' || typeof value === 'number' ? value : !!value; + + if (value) { + js[appName][chain][index] = value; + } + }); + }); + }); + + return js; +} + +function processHtml(html, maxCols, maxRows) { + if (maxCols || maxRows) { + const chunks = []; + const rows = html.length / maxCols; + + let i; + + for (i = 0; i < rows; i += 1) { + if (i < maxRows / 2 || i > rows - maxRows / 2) { + chunks.push(html.slice(i * maxCols, (i + 1) * maxCols)); + } + } + + html = chunks.join('\n'); + } + + return html; +} + class Driver { constructor(Browser, pageUrl, options) { this.options = Object.assign({}, { @@ -182,8 +229,8 @@ class Driver { const { cookies, headers, scripts } = browser; - const html = this.processHtml(browser.html); - const js = this.processJs(browser.js); + const html = processHtml(browser.html, this.options.htmlMaxCols, this.options.htmlMaxRows); + const js = processJs(browser.js, this.wappalyzer.jsPatterns); await this.wappalyzer.analyze(pageUrl, { cookies, @@ -210,56 +257,6 @@ class Driver { return resolve(reducedLinks); } - processHtml(html) { - if (this.options.htmlMaxCols || this.options.htmlMaxRows) { - const chunks = []; - const maxCols = this.options.htmlMaxCols; - const maxRows = this.options.htmlMaxRows; - const rows = html.length / maxCols; - - let i; - - for (i = 0; i < rows; i += 1) { - if (i < maxRows / 2 || i > rows - maxRows / 2) { - chunks.push(html.slice(i * maxCols, (i + 1) * maxCols)); - } - } - - html = chunks.join('\n'); - } - - return html; - } - - processJs(window) { - const patterns = this.wappalyzer.jsPatterns; - const js = {}; - - Object.keys(patterns).forEach((appName) => { - js[appName] = {}; - - Object.keys(patterns[appName]).forEach((chain) => { - js[appName][chain] = {}; - - patterns[appName][chain].forEach((pattern, index) => { - const properties = chain.split('.'); - - let value = properties - .reduce((parent, property) => (parent && parent[property] - ? parent[property] : null), window); - - value = typeof value === 'string' || typeof value === 'number' ? value : !!value; - - if (value) { - js[appName][chain][index] = value; - } - }); - }); - }); - - return js; - } - crawl(pageUrl, index = 1, depth = 1) { pageUrl.canonical = `${pageUrl.protocol}//${pageUrl.host}${pageUrl.pathname}`; @@ -320,3 +317,5 @@ class Driver { } module.exports = Driver; +module.exports.processJs = processJs; +module.exports.processHtml = processHtml; From 48950d988f4bb1dfea4fa36e993e556d27cdc155 Mon Sep 17 00:00:00 2001 From: Christian Hellsten Date: Sat, 19 Jan 2019 10:11:12 +0200 Subject: [PATCH 115/197] Use non-capturing group --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 45928e986..f8d0be728 100644 --- a/src/apps.json +++ b/src/apps.json @@ -9795,7 +9795,7 @@ "TEALIUMENABLED": "" }, "script": [ - "^(https?:)?//tags\\.tiqcdn\\.com/", + "^(?:https?:)?//tags\\.tiqcdn\\.com/", "/tealium/utag\\.js$" ], "website": "http://tealium.com" From 2dc8ebfb3da131fbf748d4c8549cb739f1eefff1 Mon Sep 17 00:00:00 2001 From: yoel Date: Mon, 21 Jan 2019 16:35:27 +0200 Subject: [PATCH 116/197] add envoy --- src/apps.json | 11 +++++++++++ src/icons/Envoy.svg | 30 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/icons/Envoy.svg diff --git a/src/apps.json b/src/apps.json index c2fd5c6e3..aba4215b4 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2954,6 +2954,17 @@ "icon": "ensighten.png", "website": "https://success.ensighten.com/hc/en-us" }, + "Envoy": { + "cats": [ + 22 + ], + "icon": "Envoy.svg", + "headers": { + "Server": "^envoy$", + "x-envoy-upstream-service-time" : "" + }, + "website": "https://www.envoyproxy.io/" + }, "Enyo": { "cats": [ 12, diff --git a/src/icons/Envoy.svg b/src/icons/Envoy.svg new file mode 100644 index 000000000..f8b0d8aad --- /dev/null +++ b/src/icons/Envoy.svg @@ -0,0 +1,30 @@ + + + + From 8701d3823bae20fbcf160fa237a522cd432e28d2 Mon Sep 17 00:00:00 2001 From: yoel Date: Mon, 21 Jan 2019 23:06:19 +0200 Subject: [PATCH 117/197] replace embedded png in svg with a png --- src/apps.json | 2 +- src/icons/Envoy.png | Bin 0 -> 3553 bytes src/icons/Envoy.svg | 30 ------------------------------ 3 files changed, 1 insertion(+), 31 deletions(-) create mode 100644 src/icons/Envoy.png delete mode 100644 src/icons/Envoy.svg diff --git a/src/apps.json b/src/apps.json index aba4215b4..209734008 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2958,7 +2958,7 @@ "cats": [ 22 ], - "icon": "Envoy.svg", + "icon": "Envoy.png", "headers": { "Server": "^envoy$", "x-envoy-upstream-service-time" : "" diff --git a/src/icons/Envoy.png b/src/icons/Envoy.png new file mode 100644 index 0000000000000000000000000000000000000000..5d69d481c4656f8c9811b24ce948e76abd321f23 GIT binary patch literal 3553 zcmV<74Ic7|P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 bG%zbLGCD9YxL)rO00000NkvXXu0mjfcOl{@ literal 0 HcmV?d00001 diff --git a/src/icons/Envoy.svg b/src/icons/Envoy.svg deleted file mode 100644 index f8b0d8aad..000000000 --- a/src/icons/Envoy.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - From 1a6adb688ea13aca8859b41ebcc5f8f66cfdb409 Mon Sep 17 00:00:00 2001 From: Vincenzo Luongo Date: Mon, 28 Jan 2019 06:27:24 +0100 Subject: [PATCH 118/197] FIX #2563 wrong detect JSECoin (#2573) --- .gitignore | 1 + src/apps.json | 2 +- src/drivers/npm/npm-shrinkwrap.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 8343ce16c..f3d723c27 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ Desktop.ini ._* tags tags.* +/nbproject/private/ \ No newline at end of file diff --git a/src/apps.json b/src/apps.json index c2fd5c6e3..7efc63c4e 100644 --- a/src/apps.json +++ b/src/apps.json @@ -4773,7 +4773,7 @@ "js": { "jseMine": "" }, - "script": "^(?:https):?//load\\.jsecoin\\.com/server/load/", + "script": "^(?:https):?//load\\.jsecoin\\.com/load/", "website": "https://jsecoin.com/" }, "JTL Shop": { diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index 13f73e610..e82437f27 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.6.2", + "version": "5.5.6", "lockfileVersion": 1, "requires": true, "dependencies": { From 88b5452ff7c98a630db12a420c7f59f1cfec8183 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Mon, 28 Jan 2019 16:27:36 +1100 Subject: [PATCH 119/197] Updated Webpack website (#2575) --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 7efc63c4e..aec4fdb5c 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12781,7 +12781,7 @@ "js": { "webpackJsonp": "" }, - "website": "https://webpack.github.io" + "website": "https://webpack.js.org/" }, "parcel": { "cats": [ From 7c14a6d525034cdd3fd6d9d83b13b1361a643a83 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Mon, 28 Jan 2019 16:29:12 +1100 Subject: [PATCH 120/197] Build 5.7.1 --- src/drivers/npm/README.md | 2 +- src/drivers/npm/npm-shrinkwrap.json | 2 +- src/drivers/npm/package.json | 2 +- .../webextension/_locales/de/messages.json | 2 + .../webextension/_locales/el/messages.json | 2 + .../webextension/_locales/en/messages.json | 3 + .../webextension/_locales/es/messages.json | 2 + .../webextension/_locales/fa/messages.json | 2 + .../webextension/_locales/fr/messages.json | 2 + .../webextension/_locales/gr/messages.json | 2 + .../webextension/_locales/id/messages.json | 2 + .../webextension/_locales/it/messages.json | 2 + .../webextension/_locales/pl/messages.json | 2 + .../webextension/_locales/pt/messages.json | 2 + .../webextension/_locales/pt_BR/messages.json | 2 + .../webextension/_locales/ro/messages.json | 2 + .../webextension/_locales/ru/messages.json | 2 + .../webextension/_locales/sk/messages.json | 2 + .../webextension/_locales/tr/messages.json | 2 + .../webextension/_locales/uk/messages.json | 2 + .../webextension/_locales/uz/messages.json | 2 + .../webextension/_locales/zh_CN/messages.json | 2 + .../webextension/_locales/zh_TW/messages.json | 2 + src/drivers/webextension/css/popup.css | 45 + src/drivers/webextension/html/popup.html | 12 +- src/drivers/webextension/js/content.js | 2 +- src/drivers/webextension/js/driver.js | 23 +- src/drivers/webextension/js/inject.js | 2 +- src/drivers/webextension/js/lib/iframe.js | 4 +- src/drivers/webextension/js/lib/network.js | 1383 ++++++++--------- src/drivers/webextension/js/popup.js | 38 +- src/drivers/webextension/manifest.json | 4 +- 32 files changed, 849 insertions(+), 711 deletions(-) diff --git a/src/drivers/npm/README.md b/src/drivers/npm/README.md index 3214b693c..964d008c3 100644 --- a/src/drivers/npm/README.md +++ b/src/drivers/npm/README.md @@ -49,7 +49,7 @@ node index.js [url] [options] const Wappalyzer = require('./driver'); const Browser = require('./browsers/zombie'); -const url = 'https://www.wappalyzer.com; +const url = 'https://www.wappalyzer.com'; const options = { debug: false, diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index 13f73e610..591fba283 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.6.2", + "version": "5.7.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index 9f13dce1b..58c102d85 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "5.6.3", + "version": "5.7.2", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { diff --git a/src/drivers/webextension/_locales/de/messages.json b/src/drivers/webextension/_locales/de/messages.json index 2406d1ecc..c8b72145d 100644 --- a/src/drivers/webextension/_locales/de/messages.json +++ b/src/drivers/webextension/_locales/de/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Nichts zu tun." }, "noAppsDetected": { "message": "Keine Applikation entdeckt." }, "categoryPin": { "message": "Immer Icon anzeigen" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Nachrichten Board" }, "categoryName3": { "message": "Datenbankverwaltung" }, diff --git a/src/drivers/webextension/_locales/el/messages.json b/src/drivers/webextension/_locales/el/messages.json index f55d876e8..f336695de 100644 --- a/src/drivers/webextension/_locales/el/messages.json +++ b/src/drivers/webextension/_locales/el/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Καμία ενέργεια." }, "noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." }, "categoryPin": { "message": "Always show icon" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Διαδικτυακό Φόρουμ" }, "categoryName3": { "message": "Διαχειριστής Βάσης Δεδομένων" }, diff --git a/src/drivers/webextension/_locales/en/messages.json b/src/drivers/webextension/_locales/en/messages.json index e240fa94b..df884a399 100644 --- a/src/drivers/webextension/_locales/en/messages.json +++ b/src/drivers/webextension/_locales/en/messages.json @@ -11,6 +11,9 @@ "nothingToDo": { "message": "Nothing to do here." }, "noAppsDetected": { "message": "No technologies detected." }, "categoryPin": { "message": "Always show icon" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, + "privacyPolicy": { "message": "Privacy policy" }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Message Board" }, "categoryName3": { "message": "Database Manager" }, diff --git a/src/drivers/webextension/_locales/es/messages.json b/src/drivers/webextension/_locales/es/messages.json index 4544705d9..741b88c9a 100644 --- a/src/drivers/webextension/_locales/es/messages.json +++ b/src/drivers/webextension/_locales/es/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Nada que hacer aquí." }, "noAppsDetected": { "message": "Aplicaciones no detectadas." }, "categoryPin": { "message": "Always show icon" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "Gestor de Contenido" }, "categoryName2": { "message": "Foro" }, "categoryName3": { "message": "Gestor de Bases de Datos" }, diff --git a/src/drivers/webextension/_locales/fa/messages.json b/src/drivers/webextension/_locales/fa/messages.json index 47c3d5cc4..c5b190c30 100644 --- a/src/drivers/webextension/_locales/fa/messages.json +++ b/src/drivers/webextension/_locales/fa/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "هیچ چیز برای انجام اینجا نیست." }, "noAppsDetected": { "message": "هیچ فن آوری شناسایی نشده است." }, "categoryPin": { "message": "همیشه نماد را نشان بده" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "سیستم مدیریت محتوا" }, "categoryName2": { "message": "انجمن پیام" }, "categoryName3": { "message": "مدیر پایگاه داده" }, diff --git a/src/drivers/webextension/_locales/fr/messages.json b/src/drivers/webextension/_locales/fr/messages.json index 2075992f9..a0f34b1ed 100644 --- a/src/drivers/webextension/_locales/fr/messages.json +++ b/src/drivers/webextension/_locales/fr/messages.json @@ -11,6 +11,8 @@ "twitter": { "message": "Suivre Wappalyzer sur Twitter" }, "website": { "message": "Aller sur wappalyzer.com" }, "categoryPin": { "message": " Toujours afficher l'icône" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Forum" }, "categoryName3": { "message": "Gestionnaire de base de données" }, diff --git a/src/drivers/webextension/_locales/gr/messages.json b/src/drivers/webextension/_locales/gr/messages.json index 25b1ed991..4ea87768e 100644 --- a/src/drivers/webextension/_locales/gr/messages.json +++ b/src/drivers/webextension/_locales/gr/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Καμία ενέργεια." }, "noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." }, "categoryPin": { "message": "Always show icon" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Διαδικτυακό Φόρουμ" }, "categoryName3": { "message": "Διαχειριστής Βάσης Δεδομένων" }, diff --git a/src/drivers/webextension/_locales/id/messages.json b/src/drivers/webextension/_locales/id/messages.json index c701cc5a3..e0b350859 100644 --- a/src/drivers/webextension/_locales/id/messages.json +++ b/src/drivers/webextension/_locales/id/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Tak ada yang dilakukan disini." }, "noAppsDetected": { "message": "Tidak ada aplikasi yang terdeteksi." }, "categoryPin": { "message": "Always show icon" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "Sistem Pengelola Konten" }, "categoryName2": { "message": "Papan Pesan" }, "categoryName3": { "message": "Pengelola Basis Data" }, diff --git a/src/drivers/webextension/_locales/it/messages.json b/src/drivers/webextension/_locales/it/messages.json index fc5bca2a3..7fba4c39d 100644 --- a/src/drivers/webextension/_locales/it/messages.json +++ b/src/drivers/webextension/_locales/it/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Niente da fare qui." }, "noAppsDetected": { "message": "Nessuna applicazione rilevata." }, "categoryPin": { "message": "Always show icon" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Forum" }, "categoryName3": { "message": "Gestore di Database" }, diff --git a/src/drivers/webextension/_locales/pl/messages.json b/src/drivers/webextension/_locales/pl/messages.json index c0bb41051..e6eb2720f 100644 --- a/src/drivers/webextension/_locales/pl/messages.json +++ b/src/drivers/webextension/_locales/pl/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Nic tu nie ma." }, "noAppsDetected": { "message": "Nie wykryto żadnych aplikacji." }, "categoryPin": { "message": "Zawsze pokazuj tą ikonę" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "System zarządzania treścią" }, "categoryName2": { "message": "Forum" }, "categoryName3": { "message": "Menedżer baz danych" }, diff --git a/src/drivers/webextension/_locales/pt/messages.json b/src/drivers/webextension/_locales/pt/messages.json index 42d670b84..e4ab9fb3c 100644 --- a/src/drivers/webextension/_locales/pt/messages.json +++ b/src/drivers/webextension/_locales/pt/messages.json @@ -11,6 +11,8 @@ "twitter": { "message": "Seguir Wappalyzer no Twitter" }, "website": { "message": "Ir para wappalyzer.com" }, "categoryPin": { "message": "Mostrar sempre ícone" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Fórum" }, "categoryName3": { "message": "Gestor de Base de Dados" }, diff --git a/src/drivers/webextension/_locales/pt_BR/messages.json b/src/drivers/webextension/_locales/pt_BR/messages.json index 0ff89115f..085701851 100644 --- a/src/drivers/webextension/_locales/pt_BR/messages.json +++ b/src/drivers/webextension/_locales/pt_BR/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Nada a fazer aqui." }, "noAppsDetected": { "message": "Nenhuma tecnologia identificada." }, "categoryPin": { "message": "Sempre mostrar ícone" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Fórum" }, "categoryName3": { "message": "Gestão de banco de dados" }, diff --git a/src/drivers/webextension/_locales/ro/messages.json b/src/drivers/webextension/_locales/ro/messages.json index c19f3b3be..09ef0b8b5 100644 --- a/src/drivers/webextension/_locales/ro/messages.json +++ b/src/drivers/webextension/_locales/ro/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Nimic de făcut pe pagina curentă." }, "noAppsDetected": { "message": "Nici o aplicație detectată." }, "categoryPin": { "message": "Afișează icon tot timpul" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Forum de discuții" }, "categoryName3": { "message": "Manager baze de date" }, diff --git a/src/drivers/webextension/_locales/ru/messages.json b/src/drivers/webextension/_locales/ru/messages.json index dc7bf4f04..5e165a189 100644 --- a/src/drivers/webextension/_locales/ru/messages.json +++ b/src/drivers/webextension/_locales/ru/messages.json @@ -64,6 +64,8 @@ "twitter": { "message": "Следите за новостями в Твиттере" }, "website": { "message": "Перейти на Wappalyzer.com" }, "categoryPin": { "message": "Always show icon" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName54": { "message": "SEO" }, "categoryName55": { "message": "Бухгалтерский учёт" }, "categoryName56": { "message": "Криптомайнер" }, diff --git a/src/drivers/webextension/_locales/sk/messages.json b/src/drivers/webextension/_locales/sk/messages.json index 3ee7b0574..96eec610c 100644 --- a/src/drivers/webextension/_locales/sk/messages.json +++ b/src/drivers/webextension/_locales/sk/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Nie je tu čo robiť." }, "noAppsDetected": { "message": "Žiadne aplikácie neboli zistené." }, "categoryPin": { "message": "Always show icon" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Message Board" }, "categoryName3": { "message": "Správca databáz" }, diff --git a/src/drivers/webextension/_locales/tr/messages.json b/src/drivers/webextension/_locales/tr/messages.json index 8ea12ccb8..1c886d971 100644 --- a/src/drivers/webextension/_locales/tr/messages.json +++ b/src/drivers/webextension/_locales/tr/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Burada yapacak birşey yok." }, "noAppsDetected": { "message": "Uygulamalar tespit edilemedi." }, "categoryPin": { "message": "Always show icon" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Mesaj Tahtası" }, "categoryName3": { "message": "Veritabanı Yöneticisi" }, diff --git a/src/drivers/webextension/_locales/uk/messages.json b/src/drivers/webextension/_locales/uk/messages.json index f159d8be5..2f99dbb8c 100644 --- a/src/drivers/webextension/_locales/uk/messages.json +++ b/src/drivers/webextension/_locales/uk/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Тут нічого робити." }, "noAppsDetected": { "message": "Нічого не знайдено." }, "categoryPin": { "message": "Always show icon" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Форум" }, "categoryName3": { "message": "Менеджер БД" }, diff --git a/src/drivers/webextension/_locales/uz/messages.json b/src/drivers/webextension/_locales/uz/messages.json index 97b26ce87..ae5e62cdb 100644 --- a/src/drivers/webextension/_locales/uz/messages.json +++ b/src/drivers/webextension/_locales/uz/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "Bu yerda tekshirib bolmaydi." }, "noAppsDetected": { "message": "Hech qanday dastur aniqlanmadi." }, "categoryPin": { "message": "Always show icon" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "CMS (KBT)" }, "categoryName2": { "message": "Forum" }, "categoryName3": { "message": "MB boshqaruvi" }, diff --git a/src/drivers/webextension/_locales/zh_CN/messages.json b/src/drivers/webextension/_locales/zh_CN/messages.json index c37a1799e..86ba50ca1 100644 --- a/src/drivers/webextension/_locales/zh_CN/messages.json +++ b/src/drivers/webextension/_locales/zh_CN/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "这儿啥也没有。" }, "noAppsDetected": { "message": "未检测到任何应用。" }, "categoryPin": { "message": "Always show icon" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "内容管理系统(CMS)" }, "categoryName2": { "message": "消息板" }, "categoryName3": { "message": "数据库管理器" }, diff --git a/src/drivers/webextension/_locales/zh_TW/messages.json b/src/drivers/webextension/_locales/zh_TW/messages.json index 6c543217d..50a094f6e 100644 --- a/src/drivers/webextension/_locales/zh_TW/messages.json +++ b/src/drivers/webextension/_locales/zh_TW/messages.json @@ -11,6 +11,8 @@ "nothingToDo": { "message": "這裡什麼也沒有。" }, "noAppsDetected": { "message": "未識別到技術。" }, "categoryPin": { "message": "永遠顯示圖示" }, + "termsAccept": { "message": "Accept" }, + "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to wappalyzer.com. This can be disabled in the settings." }, "categoryName1": { "message": "內容管理系統(CMS)" }, "categoryName2": { "message": "留言板/討論區" }, "categoryName3": { "message": "資料庫管理" }, diff --git a/src/drivers/webextension/css/popup.css b/src/drivers/webextension/css/popup.css index b9d7c90fb..bd5efa916 100644 --- a/src/drivers/webextension/css/popup.css +++ b/src/drivers/webextension/css/popup.css @@ -155,3 +155,48 @@ body { .empty__text { } + +.terms { + align-items: center; + display: flex; + flex-direction: column; + justify-content: center; + height: 100%; + width: 100%; +} + +.terms__wrapper { + display: none; + height: 100%; + width: 100%; +} + +.terms__wrapper--active { + display: block; +} + +.terms__content { + font-size: .9rem; + line-height: 150%; + text-align: center; + margin-bottom: 1rem; + width: 80%; +} + +.terms__accept { + background-color: #4608ad; + border: none; + border-radius: 3px; + color: white; + cursor: pointer; + font-size: .9rem; + padding: .8rem 3rem; +} + +.terms__accept:hover { + background-color: #4107a1; +} + +.terms__privacy { + margin-top: 1rem; +} diff --git a/src/drivers/webextension/html/popup.html b/src/drivers/webextension/html/popup.html index b453b70c3..2a7d662dc 100644 --- a/src/drivers/webextension/html/popup.html +++ b/src/drivers/webextension/html/popup.html @@ -17,6 +17,16 @@ -
+
+
+
+
+ + + + +
+
+
diff --git a/src/drivers/webextension/js/content.js b/src/drivers/webextension/js/content.js index f5f350c49..6111d1830 100644 --- a/src/drivers/webextension/js/content.js +++ b/src/drivers/webextension/js/content.js @@ -66,7 +66,7 @@ if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') { postMessage({ id: 'patterns', patterns: response.patterns, - }, '*'); + }, window.location.href); } }); }; diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index c1703ed5c..5d8962f17 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -3,9 +3,10 @@ */ /* eslint-env browser */ -/* global browser, fetch, Wappalyzer */ +/* global browser, chrome, fetch, Wappalyzer */ /** global: browser */ +/** global: chrome */ /** global: fetch */ /** global: Wappalyzer */ @@ -20,6 +21,22 @@ browser.tabs.onRemoved.addListener((tabId) => { tabCache[tabId] = null; }); +function userAgent() { + const url = chrome.extension.getURL('/'); + + if (url.match(/^chrome-/)) { + return 'chrome'; + } + + if (url.match(/^moz-/)) { + return 'firefox'; + } + + if (url.match(/^ms-browser-/)) { + return 'edge'; + } +} + /** * Get a value from localStorage */ @@ -160,6 +177,7 @@ browser.runtime.onMessage.addListener(async (message, sender) => { apps: wappalyzer.apps, categories: wappalyzer.categories, pinnedCategory, + termsAccepted: userAgent() === 'chrome' || await getOption('termsAccepted', false), }; break; @@ -295,8 +313,9 @@ wappalyzer.driver.getRobotsTxt = async (host, secure = false) => { */ wappalyzer.driver.ping = async (hostnameCache = {}, adCache = []) => { const tracking = await getOption('tracking', true); + const termsAccepted = userAgent() === 'chrome' || await getOption('termsAccepted', false); - if (tracking) { + if (tracking && termsAccepted) { if (Object.keys(hostnameCache).length) { post('https://api.wappalyzer.com/ping/v1/', hostnameCache); } diff --git a/src/drivers/webextension/js/inject.js b/src/drivers/webextension/js/inject.js index 1d790efe2..3e9a6658f 100644 --- a/src/drivers/webextension/js/inject.js +++ b/src/drivers/webextension/js/inject.js @@ -53,7 +53,7 @@ } } - postMessage({ id: 'js', js }, '*'); + postMessage({ id: 'js', js }, window.location.href); }; addEventListener('message', onMessage); diff --git a/src/drivers/webextension/js/lib/iframe.js b/src/drivers/webextension/js/lib/iframe.js index 651e9e547..491d26257 100644 --- a/src/drivers/webextension/js/lib/iframe.js +++ b/src/drivers/webextension/js/lib/iframe.js @@ -882,7 +882,7 @@ let win = window; while (win !== win.top) { win = win.parent; - win.postMessage(adData, '*'); + win.postMessage(adData, win.location.href); } } @@ -998,7 +998,7 @@ } if (!adData) return; - + if (adData.postMessageId === POST_MSG_ID) { delete adData.postMessageId; diff --git a/src/drivers/webextension/js/lib/network.js b/src/drivers/webextension/js/lib/network.js index 5831a2e04..ebae3bc7a 100644 --- a/src/drivers/webextension/js/lib/network.js +++ b/src/drivers/webextension/js/lib/network.js @@ -1,795 +1,792 @@ -(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + const lastIndex = subjectString.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; + }; + } - let browserProxy; + function getFrame(getFrameDetails, callback) { if (isChrome()) { - browserProxy = chrome; - } else { - browserProxy = browser; - } - - const MIN_FF_MAJOR_VERSION = 51; - - const requiredBrowserApis = [ - browserProxy.webNavigation, - browserProxy.tabs, - browserProxy.webRequest, - browserProxy.runtime, - ]; - let areListenersRegistered = false; - const secBefore = 2000; - const secAfter = 5000; - const secBetweenDupAssets = 10e3; - const minVidSize = 500e3; - const maxVidSize = 25e6; - const maxContentRange = 25e6; - const videoExtensions = [ - 'af', '3gp', 'asf', 'avchd', 'avi', 'cam', 'dsh', 'flv', 'm1v', 'm2v', - 'fla', 'flr', 'sol', 'm4v', 'mkv', 'wrap', 'mng', 'mov', 'mpeg', 'mpg', - 'mpe', 'mp4', 'mxf', 'nsv', 'ogg', 'rm', 'svi', 'smi', 'wmv', 'webm', - ]; - const extensionsReg = new RegExp(`\\.${videoExtensions.join('$|\\.')}$`); - const videoContentTypesPrefixes = ['binary/octet-stream', 'video/', 'flv-application/', 'media']; - - const bannedContentTypes = ['video/mp2t', 'video/f4m', 'video/f4f']; - const bannedFiletypes = ['ts']; - const bannedFiletypesReg = new RegExp(`\\.${bannedFiletypes.join('$|\\.')}$`); - const whitelistReqTypes = ['object', 'xmlhttprequest', 'other']; - - const topVideoAssetDomains = [ - '2mdn.net', - 'adap.tv', - 'adnxs.com', - 'adsrvr.org', - 'btrll.com', - 'celtra.com', - 'flashtalking.com', - 'flite.com', - 'innovid.com', - 'jivox.com', - 'mixpo.com', - 'nytimes.com', - 'playwire.com', - 'selectmedia.asia', - 'serving-sys.com', - 'solvemedia.com', - 'spotible.com', - 'teads.tv', - 'tribalfusion.com', - 'tubemogul.com', - 'videologygroup.com', - 'washingtonpost.com', - ]; - - const robotsTxtAllows = wappalyzer.robotsTxtAllows.bind(wappalyzer); - if (!String.prototype.endsWith) { - String.prototype.endsWith = function (searchString, position) { - const subjectString = this.toString(); - if (typeof position !== 'number' || !isFinite(position) - || Math.floor(position) !== position || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - const lastIndex = subjectString.indexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; - }; - } - - function getFrame(getFrameDetails, callback) { - if (isChrome()) { - chrome.webNavigation.getFrame(getFrameDetails, callback); - } else if (typeof browser !== 'undefined') { - const gettingFrame = browser.webNavigation.getFrame(getFrameDetails); - gettingFrame.then(callback); - } + chrome.webNavigation.getFrame(getFrameDetails, callback); + } else if (typeof browser !== 'undefined') { + const gettingFrame = browser.webNavigation.getFrame(getFrameDetails); + gettingFrame.then(callback); } + } - function ifBrowserValid(callback, elseCallback) { - if (isChrome()) { - callback(); - } else if (typeof browser !== 'undefined') { - try { - const gettingInfo = browser.runtime.getBrowserInfo(); - gettingInfo.then((browserInfo) => { - const browserVersion = parseInt(browserInfo.version.split('.')[0]); - - if (browserInfo.name === 'Firefox' - && browserVersion >= MIN_FF_MAJOR_VERSION) { - callback(); - } else { - elseCallback(); - } - }); - } catch (err) { - elseCallback(); - } - } else { - elseCallback(); - } - } - - function ifTrackingEnabled(details, ifCallback, elseCallback) { - const fullIfCallback = function () { - allowedByRobotsTxt(details, ifCallback, elseCallback); - }; - - browser.storage.local.get('tracking').then((item) => { - if (item.hasOwnProperty('tracking')) { - if (item.tracking) { - fullIfCallback(); + function ifBrowserValid(callback, elseCallback) { + if (isChrome()) { + callback(); + } else if (typeof browser !== 'undefined') { + try { + const gettingInfo = browser.runtime.getBrowserInfo(); + gettingInfo.then((browserInfo) => { + const browserVersion = parseInt(browserInfo.version.split('.')[0]); + + if (browserInfo.name === 'Firefox' + && browserVersion >= MIN_FF_MAJOR_VERSION) { + callback(); } else { elseCallback(); } - } else { - fullIfCallback(); - } - }); - } - - function allowedByRobotsTxt(details, ifCallback, elseCallback) { - if (details.url && !details.url.startsWith('chrome://')) { - robotsTxtAllows(details.url).then(ifCallback, elseCallback); - } else { + }); + } catch (err) { elseCallback(); } + } else { + elseCallback(); } + } - function isPixelRequest(request) { - return (request.type === 'image' || request.responseStatus === 204) - && request.size <= 1000; - } - - function isVpaidOrVastRequest(request) { - const lowerCaseUrl = request.url.toLowerCase(); - return lowerCaseUrl.indexOf('vpaid') !== -1 || lowerCaseUrl.indexOf('vast') !== -1; - } - - function hasValidRequestType(request) { - return whitelistReqTypes.indexOf(request.type) >= 0; - } - - function stripQueryParams(url) { - return url.split('?', 1)[0]; - } - - function parseHostnameFromUrl(url) { - const parser = document.createElement('a'); - parser.href = url; - return parser.hostname; - } - - function hasDomain(url, domain) { - return parseHostnameFromUrl(url).endsWith(domain); - } + function ifTrackingEnabled(details, ifCallback, elseCallback) { + const fullIfCallback = function () { + allowedByRobotsTxt(details, ifCallback, elseCallback); + }; - function findHeader(headers, key) { - let header; - for (let i = 0; i < headers.length; i += 1) { - header = headers[i]; - if (header.name.toLowerCase() === key) { - return header; + browser.storage.local.get('tracking').then((item) => { + if (item.hasOwnProperty('tracking')) { + if (item.tracking) { + fullIfCallback(); + } else { + elseCallback(); } + } else { + fullIfCallback(); } - return null; - } + }); + } - function validVideoType(vtype) { - const goodType = videoContentTypesPrefixes.some(prefix => vtype.indexOf(prefix) === 0); - return goodType; + function allowedByRobotsTxt(details, ifCallback, elseCallback) { + if (details.url && !details.url.startsWith('chrome://')) { + robotsTxtAllows(details.url).then(ifCallback, elseCallback); + } else { + elseCallback(); } - - function assetMsgKey(assetReq) { - const url = stripQueryParams(assetReq.url); - const key = `${assetReq.frameId}-${url}`; - return key; + } + + function isPixelRequest(request) { + return (request.type === 'image' || request.responseStatus === 204) + && request.size <= 1000; + } + + function isVpaidOrVastRequest(request) { + const lowerCaseUrl = request.url.toLowerCase(); + return lowerCaseUrl.indexOf('vpaid') !== -1 || lowerCaseUrl.indexOf('vast') !== -1; + } + + function hasValidRequestType(request) { + return whitelistReqTypes.indexOf(request.type) >= 0; + } + + function stripQueryParams(url) { + return url.split('?', 1)[0]; + } + + function parseHostnameFromUrl(url) { + const parser = document.createElement('a'); + parser.href = url; + return parser.hostname; + } + + function hasDomain(url, domain) { + return parseHostnameFromUrl(url).endsWith(domain); + } + + function findHeader(headers, key) { + let header; + for (let i = 0; i < headers.length; i += 1) { + header = headers[i]; + if (header.name.toLowerCase() === key) { + return header; + } } + return null; + } + + function validVideoType(vtype) { + const goodType = videoContentTypesPrefixes.some(prefix => vtype.indexOf(prefix) === 0); + return goodType; + } + + function assetMsgKey(assetReq) { + const url = stripQueryParams(assetReq.url); + const key = `${assetReq.frameId}-${url}`; + return key; + } + + const PageNetworkTrafficCollector = function (tabId) { + this.tabId = tabId; + this.displayAdFound = false; + this.requests = {}; + this.msgsBeingSent = {}; + this.assetsSeen = {}; + this.allRedirects = {}; + }; + + var globalPageContainer = { + collectors: {}, + dyingCollectors: {}, + + cleanupCollector(tabId) { + if (tabId in this.collectors) { + delete globalPageContainer.collectors[tabId]; + } + }, + + onNewNavigation(details) { + const tabId = details.tabId; + this.cleanupCollector(tabId); + + ifTrackingEnabled( + details, + () => { + if (!areListenersRegistered) { + registerListeners(); + } + this.collectors[tabId] = new PageNetworkTrafficCollector(tabId); + }, + () => { + if (areListenersRegistered) { + unregisterListeners(); + } + }, + ); + }, - const PageNetworkTrafficCollector = function (tabId) { - this.tabId = tabId; - this.displayAdFound = false; - this.requests = {}; - this.msgsBeingSent = {}; - this.assetsSeen = {}; - this.allRedirects = {}; - }; - - var globalPageContainer = { - collectors: {}, - dyingCollectors: {}, - - cleanupCollector(tabId) { - if (tabId in this.collectors) { - delete globalPageContainer.collectors[tabId]; - } - }, - - onNewNavigation(details) { - const tabId = details.tabId; - this.cleanupCollector(tabId); + onNavigationCommitted(details) { - ifTrackingEnabled( - details, - () => { - if (!areListenersRegistered) { - registerListeners(); - } - this.collectors[tabId] = new PageNetworkTrafficCollector(tabId); - }, - () => { - if (areListenersRegistered) { - unregisterListeners(); - } - }, - ); - }, + }, - onNavigationCommitted(details) { + onNavigationCompleted(details) { - }, + }, - onNavigationCompleted(details) { + onTabClose(tabId, closeInfo) { + this.cleanupCollector(tabId); + delete this.collectors[tabId]; + }, - }, + onDisplayAdFound(tabId) { + this.collectors[tabId].displayAdFound = true; + }, - onTabClose(tabId, closeInfo) { - this.cleanupCollector(tabId); - delete this.collectors[tabId]; - }, + getRandId() { + return String(Math.floor(Math.random() * 1e9)); + }, - onDisplayAdFound(tabId) { - this.collectors[tabId].displayAdFound = true; - }, + getCollector(tabId) { + if (this.collectors.hasOwnProperty(tabId)) { + return this.collectors[tabId]; + } + return null; + }, + + forwardCall(details, collectorMemberFunction) { + const collector = this.getCollector(details.tabId); + if (collector !== null) { + collectorMemberFunction.apply(collector, [details]); + } + }, + }; + + PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function () { + const logMessage = Array.from(arguments).join(' '); + const message = { message: logMessage, event: 'console-log-message' }; + browserProxy.tabs.sendMessage(this.tabId, message); + }; + + PageNetworkTrafficCollector.prototype.sendToTab = function (assetReq, reqs, curPageUrl, adTrackingEvent) { + const msg = {}; + msg.assets = []; + msg.requests = []; + msg.event_data = {}; + msg.event = adTrackingEvent; + if (adTrackingEvent === 'new-video-ad') { + msg.requests = reqs; + msg.requests.sort((reqA, reqB) => reqA.requestTimestamp - reqB.requestTimestamp); + if (assetReq) { + msg.assets = [assetReq]; + } + } else if (adTrackingEvent === 'new-invalid-video-ad') { + msg.requests = reqs.map(request => parseHostnameFromUrl(request.url)); + msg.assets = [{ + + url: parseHostnameFromUrl(assetReq.url), + + contentType: assetReq.contentType, + size: assetReq.size, + }]; + } + msg.origUrl = curPageUrl; + msg.displayAdFound = this.displayAdFound; - getRandId() { - return String(Math.floor(Math.random() * 1e9)); - }, + browserProxy.tabs.sendMessage(this.tabId, msg); + }; - getCollector(tabId) { - if (this.collectors.hasOwnProperty(tabId)) { - return this.collectors[tabId]; - } - return null; - }, + PageNetworkTrafficCollector.prototype.getRedirKey = function (url, frameId) { + return `${url}:${frameId}`; + }; - forwardCall(details, collectorMemberFunction) { - const collector = this.getCollector(details.tabId); - if (collector !== null) { - collectorMemberFunction.apply(collector, [details]); - } - }, + PageNetworkTrafficCollector.prototype.seenBefore = function (request) { + const oldTime = this.assetsSeen[assetMsgKey(request)]; + if (oldTime && (request.requestTimestamp - oldTime < secBetweenDupAssets)) { + return true; + } + return false; + }; + + PageNetworkTrafficCollector.prototype.recordSeenAsset = function (request) { + this.assetsSeen[assetMsgKey(request)] = request.requestTimestamp; + }; + + PageNetworkTrafficCollector.prototype.onBeforeRequest = function (details) { + const req = { + url: details.url, + type: details.type, + httpMethod: details.method, + frameId: details.frameId, + parentFrameId: details.parentFrameId, + requestTimestamp: details.timeStamp, }; + this.requests[details.requestId] = req; + }; + + PageNetworkTrafficCollector.prototype.onSendHeaders = function (details) { + let request, + header; + request = this.requests[details.requestId]; + header = request && findHeader(details.requestHeaders, 'x-requested-with'); + if (header && header.value.toLowerCase().indexOf('flash') > -1) { + request.from_flash = true; + } + }; - PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function () { - const logMessage = Array.from(arguments).join(' '); - const message = { message: logMessage, event: 'console-log-message' }; - browserProxy.tabs.sendMessage(this.tabId, message); + PageNetworkTrafficCollector.prototype.onHeadersReceived = function (details) { + const getFrameDetails = { + tabId: details.tabId, + processId: null, + frameId: details.frameId, }; - - PageNetworkTrafficCollector.prototype.sendToTab = function (assetReq, reqs, curPageUrl, adTrackingEvent) { - const msg = {}; - msg.assets = []; - msg.requests = []; - msg.event_data = {}; - msg.event = adTrackingEvent; - if (adTrackingEvent === 'new-video-ad') { - msg.requests = reqs; - msg.requests.sort((reqA, reqB) => reqA.requestTimestamp - reqB.requestTimestamp); - if (assetReq) { - msg.assets = [assetReq]; - } - } else if (adTrackingEvent === 'new-invalid-video-ad') { - msg.requests = reqs.map(request => parseHostnameFromUrl(request.url)); - msg.assets = [{ - - url: parseHostnameFromUrl(assetReq.url), - - contentType: assetReq.contentType, - size: assetReq.size, - }]; + const pageNetworkTrafficController = this; + getFrame(getFrameDetails, (frameDetails) => { + if (frameDetails && frameDetails.url) { + pageNetworkTrafficController._onHeadersReceived(details, frameDetails); } - msg.origUrl = curPageUrl; - msg.displayAdFound = this.displayAdFound; + }); + }; - browserProxy.tabs.sendMessage(this.tabId, msg); - }; + PageNetworkTrafficCollector.prototype._onHeadersReceived = function (details, frameDetails) { + let contentSize, + contentRange; - PageNetworkTrafficCollector.prototype.getRedirKey = function (url, frameId) { - return `${url}:${frameId}`; - }; + const request = this.requests[details.requestId]; + if (request) { + const redirParent = this.allRedirects[this.getRedirKey(details.url, details.frameId)]; + let header = request && findHeader(details.responseHeaders, 'content-type'); + const contentType = header && header.value.toLowerCase(); - PageNetworkTrafficCollector.prototype.seenBefore = function (request) { - const oldTime = this.assetsSeen[assetMsgKey(request)]; - if (oldTime && (request.requestTimestamp - oldTime < secBetweenDupAssets)) { - return true; + if (contentType) { + request.contentType = contentType; } - return false; - }; - - PageNetworkTrafficCollector.prototype.recordSeenAsset = function (request) { - this.assetsSeen[assetMsgKey(request)] = request.requestTimestamp; - }; - - PageNetworkTrafficCollector.prototype.onBeforeRequest = function (details) { - const req = { - url: details.url, - type: details.type, - httpMethod: details.method, - frameId: details.frameId, - parentFrameId: details.parentFrameId, - requestTimestamp: details.timeStamp, - }; - this.requests[details.requestId] = req; - }; - - PageNetworkTrafficCollector.prototype.onSendHeaders = function (details) { - let request, - header; - request = this.requests[details.requestId]; - header = request && findHeader(details.requestHeaders, 'x-requested-with'); - if (header && header.value.toLowerCase().indexOf('flash') > -1) { - request.from_flash = true; + header = request && findHeader(details.responseHeaders, 'content-length'); + contentSize = header && header.value; + if (contentSize) { + request.size = request.size || 0; + request.size += parseInt(contentSize); + } + header = request && findHeader(details.responseHeaders, 'content-range'); + contentRange = header && header.value; + if (contentRange) { + request.contentRange = parseInt(contentRange.split('/')[1]); } - }; - PageNetworkTrafficCollector.prototype.onHeadersReceived = function (details) { - const getFrameDetails = { - tabId: details.tabId, - processId: null, - frameId: details.frameId, - }; - const pageNetworkTrafficController = this; - getFrame(getFrameDetails, (frameDetails) => { - if (frameDetails && frameDetails.url) { - pageNetworkTrafficController._onHeadersReceived(details, frameDetails); - } - }); - }; + let frameUrl = null; + if (frameDetails && frameDetails.url) { + frameUrl = frameDetails.url; + } + if (!this.bannedRequest(request) + && (this.isVideoReq(frameUrl, request) || (redirParent && redirParent.isVideo))) { + request.isVideo = true; + } + } + }; - PageNetworkTrafficCollector.prototype._onHeadersReceived = function (details, frameDetails) { - let contentSize, - contentRange; + PageNetworkTrafficCollector.prototype.onBeforeRedirect = function (details) { + const request = this.requests[details.requestId]; + if (request) { + if (request.redirects) { + request.redirects.push(details.redirectUrl); + } else { + request.redirects = [details.redirectUrl]; + } + this.allRedirects[this.getRedirKey(details.redirectUrl, details.frameId)] = request; + } + }; + + PageNetworkTrafficCollector.prototype.isYoutubeMastheadRequest = function (url) { + const re = /video_masthead/; + return this.hasYoutubeDomain(url) && re.test(url); + }; + PageNetworkTrafficCollector.prototype.isYoutubeVideoRequest = function (srcUrl, destUrl) { + if (!this.hasYoutubeDomain(srcUrl)) { + return false; + } - const request = this.requests[details.requestId]; + const re = /https?:\/\/r.*?\.googlevideo\.com\/videoplayback\?/; + return re.test(destUrl); + }; + PageNetworkTrafficCollector.prototype.processResponse = function (requestDetails, frameDetails) { + let request; + if (requestDetails) { + request = this.requests[requestDetails.requestId]; if (request) { - const redirParent = this.allRedirects[this.getRedirKey(details.url, details.frameId)]; - let header = request && findHeader(details.responseHeaders, 'content-type'); - const contentType = header && header.value.toLowerCase(); - - if (contentType) { - request.contentType = contentType; - } - header = request && findHeader(details.responseHeaders, 'content-length'); - contentSize = header && header.value; - if (contentSize) { - request.size = request.size || 0; - request.size += parseInt(contentSize); - } - header = request && findHeader(details.responseHeaders, 'content-range'); - contentRange = header && header.value; - if (contentRange) { - request.contentRange = parseInt(contentRange.split('/')[1]); - } + request.responseStatus = requestDetails.statusCode; + request.responseTimestamp = requestDetails.timeStamp; let frameUrl = null; if (frameDetails && frameDetails.url) { frameUrl = frameDetails.url; } - if (!this.bannedRequest(request) - && (this.isVideoReq(frameUrl, request) || (redirParent && redirParent.isVideo))) { - request.isVideo = true; - } - } - }; - PageNetworkTrafficCollector.prototype.onBeforeRedirect = function (details) { - const request = this.requests[details.requestId]; - if (request) { - if (request.redirects) { - request.redirects.push(details.redirectUrl); - } else { - request.redirects = [details.redirectUrl]; + let requestUrl = null; + if (request.url) { + requestUrl = request.url; } - this.allRedirects[this.getRedirKey(details.redirectUrl, details.frameId)] = request; - } - }; - - PageNetworkTrafficCollector.prototype.isYoutubeMastheadRequest = function (url) { - const re = /video_masthead/; - return this.hasYoutubeDomain(url) && re.test(url); - }; - PageNetworkTrafficCollector.prototype.isYoutubeVideoRequest = function (srcUrl, destUrl) { - if (!this.hasYoutubeDomain(srcUrl)) { - return false; - } - - const re = /https?:\/\/r.*?\.googlevideo\.com\/videoplayback\?/; - return re.test(destUrl); - }; - PageNetworkTrafficCollector.prototype.processResponse = function (requestDetails, frameDetails) { - let request; - if (requestDetails) { - request = this.requests[requestDetails.requestId]; - if (request) { - request.responseStatus = requestDetails.statusCode; - request.responseTimestamp = requestDetails.timeStamp; - - let frameUrl = null; - if (frameDetails && frameDetails.url) { - frameUrl = frameDetails.url; - } - let requestUrl = null; - if (request.url) { - requestUrl = request.url; - } - - if (this.isYoutubeAdReq(frameUrl, requestUrl)) { - const destVideoId = this.parseYoutubeVideoIdFromUrl(requestUrl); - const srcVideoId = this.parseYoutubeVideoIdFromUrl(frameUrl); - if (srcVideoId && destVideoId) { - request.isYoutubeAd = true; - request.isVideo = true; - request.rawSrcUrl = frameUrl; - request.rawDestUrl = requestUrl; - request.url = `https://www.youtube.com/watch?v=${this.parseYoutubeVideoIdFromUrl(requestUrl)}`; - } - } else if (!this.bannedRequest(request) - && (this.isVideo || this.isVideoReq(frameUrl, request))) { + if (this.isYoutubeAdReq(frameUrl, requestUrl)) { + const destVideoId = this.parseYoutubeVideoIdFromUrl(requestUrl); + const srcVideoId = this.parseYoutubeVideoIdFromUrl(frameUrl); + if (srcVideoId && destVideoId) { + request.isYoutubeAd = true; request.isVideo = true; + request.rawSrcUrl = frameUrl; + request.rawDestUrl = requestUrl; + request.url = `https://www.youtube.com/watch?v=${this.parseYoutubeVideoIdFromUrl(requestUrl)}`; } - - if (request.isVideo) { - const msgKey = assetMsgKey(request); - this.msgsBeingSent[msgKey] = request; - if (!this.seenBefore(request)) { - this.sendMsgWhenQuiet(msgKey); - } - this.recordSeenAsset(request); - } + } else if (!this.bannedRequest(request) + && (this.isVideo || this.isVideoReq(frameUrl, request))) { + request.isVideo = true; } - } - }; - PageNetworkTrafficCollector.prototype.onResponseStarted = function (responseDetails) { - if (responseDetails.frameId < 0) { - responseDetails.frameId = 99999; - } - const getFrameDetails = { - tabId: responseDetails.tabId, - processId: null, - frameId: responseDetails.frameId, - }; - const pageNetworkTrafficController = this; - getFrame(getFrameDetails, (frameDetails) => { - if (frameDetails && frameDetails.url) { - pageNetworkTrafficController.processResponse(responseDetails, frameDetails); + if (request.isVideo) { + const msgKey = assetMsgKey(request); + this.msgsBeingSent[msgKey] = request; + if (!this.seenBefore(request)) { + this.sendMsgWhenQuiet(msgKey); + } + this.recordSeenAsset(request); } - }); - }; - - PageNetworkTrafficCollector.prototype.hasBannedFiletype = function (request) { - const url = stripQueryParams(request.url); - if (bannedFiletypesReg.exec(url)) { - return true; - } - return false; - }; - - PageNetworkTrafficCollector.prototype.checkContentHeaders = function (request) { - if (request.contentType && validVideoType(request.contentType)) { - return true; - } - return false; - }; - - PageNetworkTrafficCollector.prototype.checkUrlExtension = function (request) { - const url = stripQueryParams(request.url); - if (extensionsReg.exec(url)) { - return true; } - return false; - }; + } + }; - PageNetworkTrafficCollector.prototype.isVideoReq = function (srcUrl, request) { - if (this.isYoutubeVideoRequest(srcUrl, request.url)) { - return false; - } - return this.checkUrlExtension(request) || this.checkContentHeaders(request); - }; - PageNetworkTrafficCollector.prototype.hasYoutubeDomain = function (url) { - const hostname = parseHostnameFromUrl(url); - if (hostname === 'www.youtube.com') { - return true; - } - return false; + PageNetworkTrafficCollector.prototype.onResponseStarted = function (responseDetails) { + if (responseDetails.frameId < 0) { + responseDetails.frameId = 99999; + } + const getFrameDetails = { + tabId: responseDetails.tabId, + processId: null, + frameId: responseDetails.frameId, }; - PageNetworkTrafficCollector.prototype.parseYoutubeVideoIdFromUrl = function (url) { - let re = /^https?:\/\/www\.youtube\.com\/get_video_info.*(?:\?|&)video_id=(.*?)(?:$|&)/; - let match = re.exec(url); - if (match && match.length > 1) { - return match[1]; - } - - re = /^https?:\/\/www\.youtube\.com\/embed\/(.*?)(?:$|\?)/; - match = re.exec(url); - if (match && match.length > 1) { - return match[1]; - } - - re = /^https?:\/\/www\.youtube\.com\/watch.*(\?|&)v=([^&]*)/; - match = re.exec(url); - if (match && match.length > 1) { - return match[1]; + const pageNetworkTrafficController = this; + getFrame(getFrameDetails, (frameDetails) => { + if (frameDetails && frameDetails.url) { + pageNetworkTrafficController.processResponse(responseDetails, frameDetails); } - return null; - }; + }); + }; - PageNetworkTrafficCollector.prototype.isYoutubeGetVideoInfoReq = function (url) { - const re = /^https?:\/\/www\.youtube\.com\/get_video_info\?/; - return re.test(url); - }; - PageNetworkTrafficCollector.prototype.isYoutubeAdReq = function (srcUrl, destUrl) { - if (!this.hasYoutubeDomain(srcUrl) - || !this.isYoutubeGetVideoInfoReq(destUrl)) { - return false; - } - if (this.parseYoutubeVideoIdFromUrl(srcUrl) - === this.parseYoutubeVideoIdFromUrl(destUrl) - && !this.isYoutubeMastheadRequest(destUrl)) { - return false; - } + PageNetworkTrafficCollector.prototype.hasBannedFiletype = function (request) { + const url = stripQueryParams(request.url); + if (bannedFiletypesReg.exec(url)) { return true; - }; + } + return false; + }; - PageNetworkTrafficCollector.prototype.bannedRequest = function (request) { - return this.bannedVideoType(request) || this.hasBannedFiletype(request) || this.bannedVideoSize(request); - }; + PageNetworkTrafficCollector.prototype.checkContentHeaders = function (request) { + if (request.contentType && validVideoType(request.contentType)) { + return true; + } + return false; + }; - PageNetworkTrafficCollector.prototype.bannedVideoType = function (request) { - let badType = false; - if (request.contentType) { - badType = bannedContentTypes.some(prefix => request.contentType.indexOf(prefix) >= 0); - } - return badType; - }; + PageNetworkTrafficCollector.prototype.checkUrlExtension = function (request) { + const url = stripQueryParams(request.url); + if (extensionsReg.exec(url)) { + return true; + } + return false; + }; - PageNetworkTrafficCollector.prototype.bannedVideoSize = function (request) { - if (request.size !== null) { - if (request.size < minVidSize || request.size > maxVidSize || request.contentRange > maxContentRange) { - return true; - } - } + PageNetworkTrafficCollector.prototype.isVideoReq = function (srcUrl, request) { + if (this.isYoutubeVideoRequest(srcUrl, request.url)) { return false; - }; - - PageNetworkTrafficCollector.prototype.grabTagReqs = function (tabRequests, assetRequest) { - let minTimestamp, - maxTimestamp; - minTimestamp = assetRequest.requestTimestamp - secBefore; - maxTimestamp = assetRequest.requestTimestamp + secAfter; - - const filteredRequests = tabRequests.filter(request => (request.requestTimestamp > minTimestamp - && request.requestTimestamp < maxTimestamp - && request.frameId === assetRequest.frameId - && request.url !== assetRequest.url - && (hasValidRequestType(request) - || isPixelRequest(request)))); - - return filteredRequests; - }; - - PageNetworkTrafficCollector.prototype.isValidVideoAd = function (assetRequest, tagRequests) { - const hasVpaidOrVastRequest = tagRequests.some(tagRequest => isVpaidOrVastRequest(tagRequest)); - - if (assetRequest.isYoutubeAd) { - return true; - } - if (hasVpaidOrVastRequest) { - return true; - } - const hasTopVideoAssetDomain = topVideoAssetDomains.some(assetDomain => hasDomain(assetRequest.url, assetDomain)); - - return hasTopVideoAssetDomain; - }; - - PageNetworkTrafficCollector.prototype.sendMsgWhenQuiet = function (msgKey) { - let _this = this, - origPageUrl, - msgAssetReq; - msgAssetReq = this.msgsBeingSent[msgKey]; - browserProxy.tabs.get(this.tabId, (tab) => { origPageUrl = tab.url; }); - - setTimeout(() => { - const rawRequests = []; - if (globalPageContainer.collectors[_this.tabId] === _this) { - for (const reqId in _this.requests) { - rawRequests.push(_this.requests[reqId]); - } - const tagReqs = _this.grabTagReqs(rawRequests, msgAssetReq); - - if (_this.isValidVideoAd(msgAssetReq, tagReqs)) { - _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, 'new-video-ad'); - } else { - _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, 'new-invalid-video-ad'); - } - } else { - - } - delete _this.msgsBeingSent[msgKey]; - }, secAfter + secBefore); - }; - - PageNetworkTrafficCollector.prototype.existingMessage = function (candidateRequest) { - const frameMsg = this.msgsBeingSent[candidateRequest.frameId]; - if (frameMsg) { - return frameMsg; - } - return null; - }; - - function onBeforeRequestListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest); } - - function onSendHeadersListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders); + return this.checkUrlExtension(request) || this.checkContentHeaders(request); + }; + PageNetworkTrafficCollector.prototype.hasYoutubeDomain = function (url) { + const hostname = parseHostnameFromUrl(url); + if (hostname === 'www.youtube.com') { + return true; } - - function onHeadersReceivedListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived); + return false; + }; + PageNetworkTrafficCollector.prototype.parseYoutubeVideoIdFromUrl = function (url) { + let re = /^https?:\/\/www\.youtube\.com\/get_video_info.*(?:\?|&)video_id=(.*?)(?:$|&)/; + let match = re.exec(url); + if (match && match.length > 1) { + return match[1]; } - function onBeforeRedirectListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect); + re = /^https?:\/\/www\.youtube\.com\/embed\/(.*?)(?:$|\?)/; + match = re.exec(url); + if (match && match.length > 1) { + return match[1]; } - function onResponseStartedListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onResponseStarted); + re = /^https?:\/\/www\.youtube\.com\/watch.*(\?|&)v=([^&]*)/; + match = re.exec(url); + if (match && match.length > 1) { + return match[1]; } - - function onCommittedListener(details) { - if (details.frameId === 0) { - globalPageContainer.onNavigationCommitted(details); - } + return null; + }; + + PageNetworkTrafficCollector.prototype.isYoutubeGetVideoInfoReq = function (url) { + const re = /^https?:\/\/www\.youtube\.com\/get_video_info\?/; + return re.test(url); + }; + PageNetworkTrafficCollector.prototype.isYoutubeAdReq = function (srcUrl, destUrl) { + if (!this.hasYoutubeDomain(srcUrl) + || !this.isYoutubeGetVideoInfoReq(destUrl)) { + return false; } - - function onCompletedListener(details) { - if (details.frameId === 0) { - globalPageContainer.onNavigationCompleted(details); - } + if (this.parseYoutubeVideoIdFromUrl(srcUrl) + === this.parseYoutubeVideoIdFromUrl(destUrl) + && !this.isYoutubeMastheadRequest(destUrl)) { + return false; } + return true; + }; - function onRemovedListener(tabId, closeInfo) { - globalPageContainer.onTabClose(tabId, closeInfo); + PageNetworkTrafficCollector.prototype.bannedRequest = function (request) { + return this.bannedVideoType(request) || this.hasBannedFiletype(request) || this.bannedVideoSize(request); + }; + + PageNetworkTrafficCollector.prototype.bannedVideoType = function (request) { + let badType = false; + if (request.contentType) { + badType = bannedContentTypes.some(prefix => request.contentType.indexOf(prefix) >= 0); } + return badType; + }; - function onMessageListener(message, sender, sendResponse) { - if (message.event === 'new-ad' && message.data.event === 'ad') { - const tabId = sender.tab.id; - if (tabId) { - globalPageContainer.onDisplayAdFound(tabId); - } + PageNetworkTrafficCollector.prototype.bannedVideoSize = function (request) { + if (request.size !== null) { + if (request.size < minVidSize || request.size > maxVidSize || request.contentRange > maxContentRange) { + return true; } } + return false; + }; - function registerListeners() { - browserProxy.webRequest.onBeforeRequest.addListener( - onBeforeRequestListener, - { urls: ['http://*/*', 'https://*/*'] }, - [], - ); + PageNetworkTrafficCollector.prototype.grabTagReqs = function (tabRequests, assetRequest) { + let minTimestamp, + maxTimestamp; + minTimestamp = assetRequest.requestTimestamp - secBefore; + maxTimestamp = assetRequest.requestTimestamp + secAfter; - browserProxy.webRequest.onSendHeaders.addListener( - onSendHeadersListener, - { urls: ['http://*/*', 'https://*/*'] }, - ['requestHeaders'], - ); + const filteredRequests = tabRequests.filter(request => (request.requestTimestamp > minTimestamp + && request.requestTimestamp < maxTimestamp + && request.frameId === assetRequest.frameId + && request.url !== assetRequest.url + && (hasValidRequestType(request) + || isPixelRequest(request)))); - browserProxy.webRequest.onHeadersReceived.addListener( - onHeadersReceivedListener, - { urls: ['http://*/*', 'https://*/*'] }, - ['responseHeaders'], - ); + return filteredRequests; + }; - browserProxy.webRequest.onBeforeRedirect.addListener( - onBeforeRedirectListener, - { urls: ['http://*/*', 'https://*/*'] }, - [], - ); + PageNetworkTrafficCollector.prototype.isValidVideoAd = function (assetRequest, tagRequests) { + const hasVpaidOrVastRequest = tagRequests.some(tagRequest => isVpaidOrVastRequest(tagRequest)); - browserProxy.webRequest.onResponseStarted.addListener( - onResponseStartedListener, - { urls: ['http://*/*', 'https://*/*'] }, - ['responseHeaders'], - ); + if (assetRequest.isYoutubeAd) { + return true; + } + if (hasVpaidOrVastRequest) { + return true; + } + const hasTopVideoAssetDomain = topVideoAssetDomains.some(assetDomain => hasDomain(assetRequest.url, assetDomain)); + + return hasTopVideoAssetDomain; + }; + + PageNetworkTrafficCollector.prototype.sendMsgWhenQuiet = function (msgKey) { + let _this = this, + origPageUrl, + msgAssetReq; + msgAssetReq = this.msgsBeingSent[msgKey]; + browserProxy.tabs.get(this.tabId, (tab) => { origPageUrl = tab.url; }); + + setTimeout(() => { + const rawRequests = []; + if (globalPageContainer.collectors[_this.tabId] === _this) { + for (const reqId in _this.requests) { + rawRequests.push(_this.requests[reqId]); + } + const tagReqs = _this.grabTagReqs(rawRequests, msgAssetReq); + + if (_this.isValidVideoAd(msgAssetReq, tagReqs)) { + _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, 'new-video-ad'); + } else { + _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, 'new-invalid-video-ad'); + } + } else { - browserProxy.webNavigation.onCommitted.addListener(onCommittedListener); - browserProxy.webNavigation.onCompleted.addListener(onCompletedListener); - browserProxy.tabs.onRemoved.addListener(onRemovedListener); - browserProxy.runtime.onMessage.addListener(onMessageListener); + } + delete _this.msgsBeingSent[msgKey]; + }, secAfter + secBefore); + }; - areListenersRegistered = true; + PageNetworkTrafficCollector.prototype.existingMessage = function (candidateRequest) { + const frameMsg = this.msgsBeingSent[candidateRequest.frameId]; + if (frameMsg) { + return frameMsg; } + return null; + }; - function unregisterListeners() { - browserProxy.webRequest.onBeforeRequest.removeListener( - onBeforeRequestListener, - ); + function onBeforeRequestListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest); + } - browserProxy.webRequest.onSendHeaders.removeListener( - onSendHeadersListener, - ); + function onSendHeadersListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders); + } - browserProxy.webRequest.onHeadersReceived.removeListener( - onHeadersReceivedListener, - ); + function onHeadersReceivedListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived); + } - browserProxy.webRequest.onBeforeRedirect.removeListener( - onBeforeRedirectListener, - ); + function onBeforeRedirectListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect); + } - browserProxy.webRequest.onResponseStarted.removeListener( - onResponseStartedListener, - ); + function onResponseStartedListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onResponseStarted); + } - browserProxy.webNavigation.onCommitted.removeListener(onCommittedListener); - browserProxy.webNavigation.onCompleted.removeListener(onCompletedListener); - browserProxy.tabs.onRemoved.removeListener(onRemovedListener); - browserProxy.runtime.onMessage.removeListener(onMessageListener); + function onCommittedListener(details) { + if (details.frameId === 0) { + globalPageContainer.onNavigationCommitted(details); + } + } - areListenersRegistered = false; + function onCompletedListener(details) { + if (details.frameId === 0) { + globalPageContainer.onNavigationCompleted(details); } + } + + function onRemovedListener(tabId, closeInfo) { + globalPageContainer.onTabClose(tabId, closeInfo); + } - function areRequiredBrowserApisAvailable() { - return requiredBrowserApis.every(api => typeof api !== 'undefined'); + function onMessageListener(message, sender, sendResponse) { + if (message.event === 'new-ad' && message.data.event === 'ad') { + const tabId = sender.tab.id; + if (tabId) { + globalPageContainer.onDisplayAdFound(tabId); + } } + } + + function registerListeners() { + browserProxy.webRequest.onBeforeRequest.addListener( + onBeforeRequestListener, + { urls: ['http://*/*', 'https://*/*'] }, + [], + ); + + browserProxy.webRequest.onSendHeaders.addListener( + onSendHeadersListener, + { urls: ['http://*/*', 'https://*/*'] }, + ['requestHeaders'], + ); + + browserProxy.webRequest.onHeadersReceived.addListener( + onHeadersReceivedListener, + { urls: ['http://*/*', 'https://*/*'] }, + ['responseHeaders'], + ); + + browserProxy.webRequest.onBeforeRedirect.addListener( + onBeforeRedirectListener, + { urls: ['http://*/*', 'https://*/*'] }, + [], + ); + + browserProxy.webRequest.onResponseStarted.addListener( + onResponseStartedListener, + { urls: ['http://*/*', 'https://*/*'] }, + ['responseHeaders'], + ); + + browserProxy.webNavigation.onCommitted.addListener(onCommittedListener); + browserProxy.webNavigation.onCompleted.addListener(onCompletedListener); + browserProxy.tabs.onRemoved.addListener(onRemovedListener); + browserProxy.runtime.onMessage.addListener(onMessageListener); + + areListenersRegistered = true; + } + + function unregisterListeners() { + browserProxy.webRequest.onBeforeRequest.removeListener( + onBeforeRequestListener, + ); + + browserProxy.webRequest.onSendHeaders.removeListener( + onSendHeadersListener, + ); + + browserProxy.webRequest.onHeadersReceived.removeListener( + onHeadersReceivedListener, + ); + + browserProxy.webRequest.onBeforeRedirect.removeListener( + onBeforeRedirectListener, + ); + + browserProxy.webRequest.onResponseStarted.removeListener( + onResponseStartedListener, + ); + + browserProxy.webNavigation.onCommitted.removeListener(onCommittedListener); + browserProxy.webNavigation.onCompleted.removeListener(onCompletedListener); + browserProxy.tabs.onRemoved.removeListener(onRemovedListener); + browserProxy.runtime.onMessage.removeListener(onMessageListener); + + areListenersRegistered = false; + } + + function areRequiredBrowserApisAvailable() { + return requiredBrowserApis.every(api => typeof api !== 'undefined'); + } + + if (areRequiredBrowserApisAvailable()) { + ifBrowserValid( + () => { + browserProxy.webNavigation.onBeforeNavigate.addListener( + (details) => { + if (details.frameId === 0) { + globalPageContainer.onNewNavigation(details); + } + }, + { + url: [{ urlMatches: 'http://*/*' }, { urlMatches: 'https://*/*' }], + }, + ); + }, () => { + + }, + ); + } - if (areRequiredBrowserApisAvailable()) { + browserProxy.runtime.onMessage.addListener((request, sender, sendResponse) => { + if (request === 'is_browser_valid') { ifBrowserValid( - () => { - browserProxy.webNavigation.onBeforeNavigate.addListener( - (details) => { - if (details.frameId === 0) { - globalPageContainer.onNewNavigation(details); - } - }, - { - url: [{ urlMatches: 'http://*/*' }, { urlMatches: 'https://*/*' }], - }, - ); - }, () => { + sendResponse({ browser_valid: true }), + sendResponse({ browser_valid: false }), + ); + } + }); + browserProxy.runtime.onMessage.addListener((request, sender, sendResponse) => { + if (request === 'is_tracking_enabled') { + ifTrackingEnabled( + sender.tab, + () => { + try { sendResponse({ tracking_enabled: true }); } catch (err) {} + }, + () => { + try { sendResponse({ tracking_enabled: false }); } catch (err) {} }, ); } - - browserProxy.runtime.onMessage.addListener((request, sender, sendResponse) => { - if (request === 'is_browser_valid') { - ifBrowserValid( - sendResponse({ browser_valid: true }), - sendResponse({ browser_valid: false }), - ); - } - }); - - browserProxy.runtime.onMessage.addListener((request, sender, sendResponse) => { - if (request === 'is_tracking_enabled') { - ifTrackingEnabled( - sender.tab, - () => { - try { sendResponse({ tracking_enabled: true }); } catch (err) {} - }, - () => { - try { sendResponse({ tracking_enabled: false }); } catch (err) {} - }, - ); - } - return true; - }); - }()); -},{}]},{},[1]); + return true; + }); +}()); diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js index 61e21ec21..58d14867e 100644 --- a/src/drivers/webextension/js/popup.js +++ b/src/drivers/webextension/js/popup.js @@ -6,11 +6,20 @@ /** global: jsonToDOM */ let pinnedCategory = null; +let termsAccepted = false; function slugify(string) { return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, ''); } +function i18n() { + const nodes = document.querySelectorAll('[data-i18n]'); + + Array.prototype.forEach.call(nodes, (node) => { + node.innerHTML = browser.i18n.getMessage(node.dataset.i18n); + }); +} + function replaceDom(domTemplate) { const container = document.getElementsByClassName('container')[0]; @@ -20,11 +29,7 @@ function replaceDom(domTemplate) { container.appendChild(jsonToDOM(domTemplate, document, {})); - const nodes = document.querySelectorAll('[data-i18n]'); - - Array.prototype.forEach.call(nodes, (node) => { - node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n); - }); + i18n(); Array.from(document.querySelectorAll('.detected__category-pin-wrapper')).forEach((pin) => { pin.addEventListener('click', () => { @@ -188,8 +193,29 @@ const func = (tabs) => { source: 'popup.js', }, (response) => { pinnedCategory = response.pinnedCategory; + termsAccepted = response.termsAccepted; + + if (termsAccepted) { + replaceDomWhenReady(appsToDomTemplate(response)); + } else { + i18n(); + + const wrapper = document.querySelector('.terms__wrapper'); + + document.querySelector('.terms__accept').addEventListener('click', () => { + (chrome || browser).runtime.sendMessage({ + id: 'set_option', + key: 'termsAccepted', + value: true, + }); - replaceDomWhenReady(appsToDomTemplate(response)); + wrapper.classList.remove('terms__wrapper--active'); + + func(tabs); + }); + + wrapper.classList.add('terms__wrapper--active'); + } }); }; diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 9c71e4ade..d946555f6 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://www.wappalyzer.com", "description": "Identify web technologies", - "version": "5.6.3", + "version": "5.7.2", "default_locale": "en", "manifest_version": 2, "icons": { @@ -77,7 +77,7 @@ "applications": { "gecko": { "id": "wappalyzer@crunchlabz.com", - "strict_min_version": "42.0" + "strict_min_version": "60.0" } } } From 1114f1fed4e9d577372575b3e7c1813afe6e8f6a Mon Sep 17 00:00:00 2001 From: RobiNN Date: Mon, 28 Jan 2019 08:26:43 +0100 Subject: [PATCH 121/197] Update apps.json --- src/apps.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/apps.json b/src/apps.json index e077d28bf..457a02df8 100644 --- a/src/apps.json +++ b/src/apps.json @@ -7337,10 +7337,7 @@ "cats": [ 1 ], - "html": [ - "Powered by ]+php-fusion", - "Powered by PHP-Fusion" - ], + "html": "Powered by ]+php-fusion", "headers": { "X-Powered-By": "PHP-Fusion (.+)$\\;version:\\1" }, From 329588cb2a4cfbb92ceb5ca1bcbe28162d8b3f4b Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 30 Jan 2019 14:21:06 +0800 Subject: [PATCH 122/197] feat(dayjs): add Day.js 2KB immutable date library alternative to Moment.js with the same modern API --- src/apps.json | 10 ++++++++++ src/icons/Day.js.svg | 1 + 2 files changed, 11 insertions(+) create mode 100644 src/icons/Day.js.svg diff --git a/src/apps.json b/src/apps.json index b6662c0fe..75dcca140 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2451,6 +2451,16 @@ "script": "dataTables.*\\.js", "website": "http://datatables.net" }, + "Day.js": { + "cats": [ + 59 + ], + "icon": "Day.js.svg", + "js": { + "dayjs": "" + }, + "website": "https://github.com/iamkun/dayjs" + }, "Debian": { "cats": [ 28 diff --git a/src/icons/Day.js.svg b/src/icons/Day.js.svg new file mode 100644 index 000000000..6ceade70d --- /dev/null +++ b/src/icons/Day.js.svg @@ -0,0 +1 @@ + \ No newline at end of file From 5598c4bdf3bceb85dbbb892a2c8d7bc4143fe05a Mon Sep 17 00:00:00 2001 From: Vasile FLorin Vilsan Date: Wed, 30 Jan 2019 07:58:00 +0000 Subject: [PATCH 123/197] added Rocket to apps.json --- src/apps.json | 20 ++++++++++++++++++++ src/icons/Rocket.svg | 27 +++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 src/icons/Rocket.svg diff --git a/src/apps.json b/src/apps.json index b6662c0fe..9f458999a 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12921,6 +12921,26 @@ "implies": "Java", "script": "/halo-(?:backend|frontend|common)/", "website": "https://github.com/ruibaby/halo" + }, + "Rocket": { + "cats": [ + 1, + 6 + ], + "meta": { + "_csrf": "" + }, + "cookies": { + "PHPSESSID": "" + }, + "html": [ + "", + "" + ], + "icon": "Rocket.svg", + "implies": ["React","PHP", "Bootstrap", "webpack", "Node.js", "MySQL", "Apache", "jQuery", "Moment.js", "Less"], + "script": "/dist/frontend-(.+)\\.js", + "website": "https://rocketcms.io" } }, "categories": { diff --git a/src/icons/Rocket.svg b/src/icons/Rocket.svg new file mode 100644 index 000000000..feadcf82b --- /dev/null +++ b/src/icons/Rocket.svg @@ -0,0 +1,27 @@ + + + + + + + + + + From 3e166b69e68d5f61abf6ccd0a55839e17e3672e4 Mon Sep 17 00:00:00 2001 From: Vasile FLorin Vilsan Date: Thu, 31 Jan 2019 06:09:23 +0000 Subject: [PATCH 124/197] Updated RegEx to include non-capturing group as per Travis CI logs --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 9f458999a..292a8a8a8 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12934,7 +12934,7 @@ "PHPSESSID": "" }, "html": [ - "", + "", "" ], "icon": "Rocket.svg", From c8e031db1ab75cfac274b53d61b0cac7318aadf2 Mon Sep 17 00:00:00 2001 From: Vasile FLorin Vilsan Date: Thu, 31 Jan 2019 06:30:46 +0000 Subject: [PATCH 125/197] Refactored usage of non-capturing group as recommended by Travis CI logs --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 292a8a8a8..cf3d75591 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12934,7 +12934,7 @@ "PHPSESSID": "" }, "html": [ - "", + "", "" ], "icon": "Rocket.svg", From a91a1a5feeea7948c061c37a42be442f8d8ef5ce Mon Sep 17 00:00:00 2001 From: Vasile FLorin Vilsan Date: Thu, 31 Jan 2019 06:35:45 +0000 Subject: [PATCH 126/197] Refactored second capturing group as recommended by Travis CI logs --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index cf3d75591..9aa78475f 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12939,7 +12939,7 @@ ], "icon": "Rocket.svg", "implies": ["React","PHP", "Bootstrap", "webpack", "Node.js", "MySQL", "Apache", "jQuery", "Moment.js", "Less"], - "script": "/dist/frontend-(.+)\\.js", + "script": "/dist/frontend-[^\\.]+\\.js", "website": "https://rocketcms.io" } }, From d7d6d526e39edc5ada259f29a2023e8630a69f0e Mon Sep 17 00:00:00 2001 From: Aghaie Date: Thu, 31 Jan 2019 16:22:01 +0330 Subject: [PATCH 127/197] Update ShopFA --- src/apps.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps.json b/src/apps.json index 01fcc548e..23350f68f 100644 --- a/src/apps.json +++ b/src/apps.json @@ -8476,6 +8476,9 @@ "js": { "shopfa": "" }, + "headers": { + "X-Powered-By": "^ShopFA ([\\d.]+)$\\;version:\\1" + }, "meta": { "generator": "^ShopFA ([\\d.]+)$\\;version:\\1" }, From f6c00d563c8fe037be5e1fa84f1f0fb220982148 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 30 Jan 2019 14:21:06 +0800 Subject: [PATCH 128/197] add Element UI --- src/apps.json | 13 +++++++++++++ src/icons/ElementUI.svg | 11 +++++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/icons/ElementUI.svg diff --git a/src/apps.json b/src/apps.json index b6662c0fe..3361b5337 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2910,6 +2910,19 @@ }, "website": "http://eleanor-cms.ru" }, + "Element UI": { + "cats": [ + 12 + ], + "icon": "ElementUI.svg", + "implies": [ + "Vue" + ], + "html": [ + "<(?:div|button) class=\"el-(?:table-column|table-filter|popper|pagination|pager|select-group|form|form-item|color-predefine|color-hue-slider|color-svpanel|color-alpha-slider|color-dropdown|color-picker|badge|tree|tree-node|select|message|dialog|checkbox|checkbox-button|checkbox-group|container|steps|carousel|menu|menu-item|submenu|menu-item-group|button|button-group|card|table|select-dropdown|row|tabs|notification|radio|progress|progress-bar|tag|popover|tooltip|cascader|cascader-menus|cascader-menu|time-spinner|spinner|spinner-inner|transfer|transfer-panel|rate|slider|dropdown|dropdown-menu|textarea|input|input-group|popup-parent|radio-group|main|breadcrumb|time-range-picker|date-range-picker|year-table|date-editor|range-editor|time-spinner|date-picker|time-panel|date-table|month-table|picker-panel|collapse|collapse-item|alert|select-dropdown|select-dropdown__empty|select-dropdown__wrap|select-dropdown__list|scrollbar|switch|carousel|upload|upload-dragger|upload-list|upload-cover|aside|input-number|header|message-box|footer|radio-button|step|autocomplete|autocomplete-suggestion|loading-parent|loading-mask|loading-spinner|)" + ], + "website": "https://element.eleme.io/" + }, "Eloqua": { "cats": [ 32 diff --git a/src/icons/ElementUI.svg b/src/icons/ElementUI.svg new file mode 100644 index 000000000..4c05f8d2b --- /dev/null +++ b/src/icons/ElementUI.svg @@ -0,0 +1,11 @@ + + + + element-logo + Created with Sketch. + + + + \ No newline at end of file From eb33a1fbb27e9c4b888c21cf11984e6587987501 Mon Sep 17 00:00:00 2001 From: Vasile FLorin Vilsan Date: Sun, 3 Feb 2019 09:09:13 +0000 Subject: [PATCH 129/197] PR requests resolution --- src/apps.json | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/apps.json b/src/apps.json index 9aa78475f..e2d3369b6 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12930,16 +12930,8 @@ "meta": { "_csrf": "" }, - "cookies": { - "PHPSESSID": "" - }, - "html": [ - "", - "" - ], "icon": "Rocket.svg", - "implies": ["React","PHP", "Bootstrap", "webpack", "Node.js", "MySQL", "Apache", "jQuery", "Moment.js", "Less"], - "script": "/dist/frontend-[^\\.]+\\.js", + "implies": ["webpack", "Node.js", "MySQL", "Less"], "website": "https://rocketcms.io" } }, From ecd0387fda3edd45ce4642dd36365781ebae3adf Mon Sep 17 00:00:00 2001 From: Vasile FLorin Vilsan Date: Sun, 3 Feb 2019 13:40:12 +0000 Subject: [PATCH 130/197] Second resolution round of PR requested changes --- src/apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index e2d3369b6..080771e69 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12927,8 +12927,8 @@ 1, 6 ], - "meta": { - "_csrf": "" + "headers": { + "x-powered-by": "Rocket=https://rocketcms.io/" }, "icon": "Rocket.svg", "implies": ["webpack", "Node.js", "MySQL", "Less"], From 3415e51231ad23c907965936ee4739ce4658368a Mon Sep 17 00:00:00 2001 From: Vasile FLorin Vilsan Date: Sun, 3 Feb 2019 13:51:13 +0000 Subject: [PATCH 131/197] modified header as requested --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 080771e69..8c443e6bb 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12928,7 +12928,7 @@ 6 ], "headers": { - "x-powered-by": "Rocket=https://rocketcms.io/" + "x-powered-by": "^Rocket=https://rocketcms.io/" }, "icon": "Rocket.svg", "implies": ["webpack", "Node.js", "MySQL", "Less"], From 63bafacacf1fd320589e2ddf1161afaacbe49be4 Mon Sep 17 00:00:00 2001 From: bestirani2 Date: Mon, 4 Feb 2019 15:26:02 +0330 Subject: [PATCH 132/197] Add webzi site builder Hello. Have a nice time Please add Webzi to apps.json 300 websites are built using Webzi. Contact me if there is any problem: masoud.sabaghi@gmail.com Check dns lookup http://reversens.domaintools.com/search/?q=webzidns.ir Sample sites: http://iefm.eu http://nikaniroo.com https://paverzz.com http://pishrooabrpars.com https://veggie-snack.com http://deltatechnicalgroup.com https://berenjonline.com http://coopalbag.com http://mehrakco.com http://banesell.com http://amoghnad.com http://dekland.com https://fardingraphic.ir http://mohsena.ir http://samashimi.ir http://yasilyol.ir --- src/apps.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/apps.json b/src/apps.json index b6662c0fe..7a31b185c 100644 --- a/src/apps.json +++ b/src/apps.json @@ -11005,6 +11005,20 @@ ], "website": "https://www.weglot.com" }, + "Webzi": { + "cats": [ + 1 + ], + "icon": "Webzi.svg", + "js": { + "Webzi": "" + }, + "meta": { + "generator": "^Webzi" + }, + "script": "cdn\\.6th\\.ir", + "website": "https://webzi.ir" + }, "Wikinggruppen": { "cats": [ 6 From 46d057382169e06b35926d981f83779c8cdd961b Mon Sep 17 00:00:00 2001 From: bestirani2 Date: Mon, 4 Feb 2019 15:29:28 +0330 Subject: [PATCH 133/197] Create Webzi.svg Icon for webzi --- src/icons/Webzi.svg | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/icons/Webzi.svg diff --git a/src/icons/Webzi.svg b/src/icons/Webzi.svg new file mode 100644 index 000000000..fe3ed90d6 --- /dev/null +++ b/src/icons/Webzi.svg @@ -0,0 +1,18 @@ + + + + + logo + + + + + + + + + From f2f770b6360616db98bf9e8b0ff64e6ebe300266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Kowalski?= Date: Wed, 30 Jan 2019 17:06:28 +0100 Subject: [PATCH 134/197] Update platformOS --- src/apps.json | 5 +++-- src/icons/PlatformOS.svg | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps.json b/src/apps.json index b6662c0fe..ddefb985b 100644 --- a/src/apps.json +++ b/src/apps.json @@ -7664,11 +7664,12 @@ }, "PlatformOS": { "cats": [ - 1 + 1, + 62 ], "icon": "PlatformOS.svg", "headers": { - "x-powered-by": "^PlatformOS$" + "x-powered-by": "^platformOS$" }, "website": "https://www.platform-os.com" }, diff --git a/src/icons/PlatformOS.svg b/src/icons/PlatformOS.svg index 7388d841e..d0f4281e2 100644 --- a/src/icons/PlatformOS.svg +++ b/src/icons/PlatformOS.svg @@ -1 +1 @@ - \ No newline at end of file + From 65909230f29ee323fc8c68022470e66fd6d924aa Mon Sep 17 00:00:00 2001 From: jvoisin Date: Thu, 7 Feb 2019 21:07:02 +0100 Subject: [PATCH 135/197] Add cpanel detection via cookies This can be tested [here](https://demo.cpanel.net:2083/) --- src/apps.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/apps.json b/src/apps.json index b6662c0fe..df1c7ba8d 100644 --- a/src/apps.json +++ b/src/apps.json @@ -11777,6 +11777,10 @@ "headers": { "Server": "cpsrvd/([\\d.]+)\\;version:\\1" }, + "cookies": { + "cpsession": "", + "cprelogin": "" + }, "html": " + logo wap + Created with Sketch. + + + + \ No newline at end of file From 797b7b3f13d3762b6e0a6bb9f972af6ceb28287f Mon Sep 17 00:00:00 2001 From: Yoel Fialkoff <16785684+Yofial@users.noreply.github.com> Date: Sun, 10 Feb 2019 16:18:59 +0200 Subject: [PATCH 137/197] added load balancer and reverse proxy categories --- src/apps.json | 17 +++++++++++++---- .../webextension/_locales/en/messages.json | 4 +++- src/icons/UserEngage.png | Bin 432 -> 0 bytes 3 files changed, 16 insertions(+), 5 deletions(-) delete mode 100644 src/icons/UserEngage.png diff --git a/src/apps.json b/src/apps.json index 20d15edab..ec53633ad 100644 --- a/src/apps.json +++ b/src/apps.json @@ -574,7 +574,7 @@ }, "Amazon ELB": { "cats": [ - 63 + 65 ], "cookies": { "AWSELB": "" @@ -2979,7 +2979,7 @@ }, "Envoy": { "cats": [ - 22 + 64 ], "icon": "Envoy.png", "headers": { @@ -6909,7 +6909,8 @@ }, "Nginx": { "cats": [ - 22 + 22, + 64 ], "headers": { "Server": "nginx(?:/([\\d.]+))?\\;version:\\1", @@ -8996,7 +8997,7 @@ }, "Shopfa": { "cats": [ - "6" + 6 ], "js": { "shopfa": "" @@ -13221,6 +13222,14 @@ "63": { "name": "IaaS", "priority": 8 + }, + "64": { + "name": "Reverse Proxy", + "priority": 7 + }, + "65": { + "name": "Load Balancer", + "priority": 7 } } } diff --git a/src/drivers/webextension/_locales/en/messages.json b/src/drivers/webextension/_locales/en/messages.json index df884a399..1490c73d0 100644 --- a/src/drivers/webextension/_locales/en/messages.json +++ b/src/drivers/webextension/_locales/en/messages.json @@ -76,5 +76,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/icons/UserEngage.png b/src/icons/UserEngage.png deleted file mode 100644 index 49f2d16afc3e4fd4a3b03692c0064c1373f9888d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy`2jv5u0ENC4BZcjLI3~%2Px}% zSbg~Y^|!zHrap07^NOke@vp!C12(*#bLq4C{O8$w-aY^FM{3s7ufP9UE`NFE#m_aj zzHYnst^3r+{g1xSy7)OxbjBp0)qEvEe!&dSb)_B!dH)TK^ZK=Oe@OP<7@*7}PZ!4! zi_=#pX9_hd@U-S`y_#p(ZqE|+2v_Xn+0SGESOSTaRx x+kthLQ{QcAyXV%zxA)$gi*9^({|5gls6W%E;%FA_H3#Th22WQ%mvv4FO#tlD%6b3* From e9a4f5acae83820433b3bdcbeebeebb921d51bd1 Mon Sep 17 00:00:00 2001 From: Yoel Fialkoff <16785684+Yofial@users.noreply.github.com> Date: Sun, 10 Feb 2019 18:27:10 +0200 Subject: [PATCH 138/197] added ibm datapower --- src/apps.json | 11 +++++++++++ src/icons/DataPower.png | Bin 0 -> 6727 bytes 2 files changed, 11 insertions(+) create mode 100644 src/icons/DataPower.png diff --git a/src/apps.json b/src/apps.json index ec53633ad..61bff71a3 100644 --- a/src/apps.json +++ b/src/apps.json @@ -4404,6 +4404,17 @@ "script": "cmdatatagutils\\.js", "website": "http://ibm.com/software/marketing-solutions/coremetrics" }, + "IBM DataPower": { + "cats": [ + 64 + ], + "headers": { + "X-Backside-Transport": "", + "X-Global-Transaction-ID": "" + }, + "icon": "DataPower.png", + "website": "https://www.ibm.com/products/datapower-gateway" + }, "IBM HTTP Server": { "cats": [ 22 diff --git a/src/icons/DataPower.png b/src/icons/DataPower.png new file mode 100644 index 0000000000000000000000000000000000000000..0cee484aa1bbeb07f68c1fb961df7fda7a3e6032 GIT binary patch literal 6727 zcmV-N8o1?&P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 z Date: Tue, 12 Feb 2019 22:32:48 +0700 Subject: [PATCH 139/197] Fix Botble CMS's version detection --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 20d15edab..4698e4ebb 100644 --- a/src/apps.json +++ b/src/apps.json @@ -5825,7 +5825,7 @@ "botble_session": "" }, "headers": { - "CMS-Version": "^(.+)$\\;version:\\1;confidence:0" + "CMS-Version": "^(.+)$\\;version:\\1\\;confidence:0" }, "icon": "mypage-platform.png", "implies": "Laravel", From 116bf70f10a763496c24b4bafa1366dfc85cc66f Mon Sep 17 00:00:00 2001 From: Yoel Fialkoff <16785684+Yofial@users.noreply.github.com> Date: Thu, 14 Feb 2019 14:00:02 +0200 Subject: [PATCH 140/197] added BigIP F5 --- src/apps.json | 24 ++++++++++++++++++++++-- src/icons/F5.png | Bin 0 -> 4769 bytes 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/icons/F5.png diff --git a/src/apps.json b/src/apps.json index 61bff71a3..d1ab54518 100644 --- a/src/apps.json +++ b/src/apps.json @@ -3098,6 +3098,26 @@ "script": "ext-base\\.js", "website": "https://www.sencha.com" }, + "F5 BigIP": { + "cats": [ + 64 + ], + "headers": { + "server": "BigIP|BIG-IP" + }, + "cookies": { + "F5_ST": "", + "MRHSHint": "", + "F5_HT_shrinked": "", + "F5_fullWT": "", + "MRHSequence": "", + "MRHSession": "", + "LastMRH_Session": "", + "TIN": "" + }, + "icon": "F5.png", + "website": "https://www.f5.com/products/big-ip-services" + }, "FAST ESP": { "cats": [ 29 @@ -13236,11 +13256,11 @@ }, "64": { "name": "Reverse Proxy", - "priority": 7 + "priority": 1 }, "65": { "name": "Load Balancer", "priority": 7 } } -} +} \ No newline at end of file diff --git a/src/icons/F5.png b/src/icons/F5.png new file mode 100644 index 0000000000000000000000000000000000000000..fba894586e496018d86d99f30e472f96eaa73ee8 GIT binary patch literal 4769 zcmV;S5?<|zP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 From 0421560970fa045f25f5380d7d46cb72eedb9c7e Mon Sep 17 00:00:00 2001 From: ormaechea Date: Thu, 14 Feb 2019 15:44:18 +0100 Subject: [PATCH 141/197] Remove double escaping and add tests --- package.json | 2 +- src/wappalyzer.js | 2 +- test/analyze.spec.js | 144 +++++++++++++++++++++++++++++++ {src => test}/wappalyzer.spec.js | 0 4 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 test/analyze.spec.js rename {src => test}/wappalyzer.spec.js (100%) diff --git a/package.json b/package.json index e7bee5930..be41133c7 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "mocha": "^5.2.0" }, "scripts": { - "test": "mocha -R spec src", + "test": "mocha -R spec ./test", "lint": "eslint src", "lint:fix": "eslint src --fix" } diff --git a/src/wappalyzer.js b/src/wappalyzer.js index a50ddb913..7a2c3e368 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -370,7 +370,7 @@ class Wappalyzer { attrs.string = attr; try { - attrs.regex = new RegExp(attr.replace('/', '\\/'), 'i'); // Escape slashes in regular expression + attrs.regex = new RegExp(attr.replace('/', '\/'), 'i'); // Escape slashes in regular expression } catch (error) { attrs.regex = new RegExp(); diff --git a/test/analyze.spec.js b/test/analyze.spec.js new file mode 100644 index 000000000..99cf6a516 --- /dev/null +++ b/test/analyze.spec.js @@ -0,0 +1,144 @@ +/* eslint-env mocha */ + +'use strict'; + +const assert = require('chai').assert; +const Wappalyzer = require('../src/wappalyzer'); + +describe('should analyze website elements properly', function () { + + it('should analyze html', async () => { + const html = ` + + + + Page title | Html detection + + + +

Technologies Test Page | Html detection

+ + + + + + `; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Google Tag Manager": { + "html": [ + "googletagmanager\\.com/ns\\.html[^>]+>", + "" + ] + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + await wappalyzer.analyze({ canonical: 'example.com' }, { html }); + assert.equal(applications['Google Tag Manager'].name, 'Google Tag Manager'); + }); + + it('should analyze scripts', async () => { + const scripts = [ + 'http://www.google-analytics.com/analytics.js', + 'http://example.com/assets/js/jquery.min.js' + ]; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Google Analytics": { + "cats": [ + 10 + ], + "script": "google-analytics\\.com\\/(?:ga|urchin|(analytics))\\.js\\;version:\\1?UA:" + }, + "jQuery": { + "script": [ + "jquery(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "/([\\d.]+)/jquery(?:\\.min)?\\.js\\;version:\\1", + "jquery.*\\.js(?:\\?ver(?:sion)?=([\\d.]+))?\\;version:\\1" + ] + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + await wappalyzer.analyze({ canonical: 'example.com' }, { scripts }); + assert.equal(applications['Google Analytics'].name, 'Google Analytics'); + assert.equal(applications['jQuery'].name, 'jQuery'); + }); + + it('should analyze headers', async () => { + const headers = { + 'date': [ 'Thu, 01 Feb 2018 11:34:18 GMT' ], + 'connection': [ 'keep-alive' ], + 'x-powered-by': [ 'Express'], + 'etag': [ 'W/125-1jQLmiya7mfec43xR3Eb3pjdu64s' ], + 'content-length': [ '293' ], + 'content-type': [ 'text/html; charset=utf-8' ] + }; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Express": { + "headers": { + "X-Powered-By": "^Express$" + } + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + await wappalyzer.analyze({ canonical: 'example.com' }, { headers }); + assert.equal(applications['Express'].name, 'Express'); + }); + + it('should analyze js globals', async () => { + const js = { + 'Moment.js': { 'moment': { '0': true } }, + 'Google Font API': { 'WebFonts': { '0': true } } + }; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Moment.js": { + "js": { + "moment": "", + "moment.version": "(.*)\\;version:\\1" + } + }, + "Google Font API": { + "js": { + "WebFonts": "" + } + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + wappalyzer.parseJsPatterns(); + await wappalyzer.analyze({ canonical: 'example.com' }, { js }); + + assert.equal(applications['Google Font API'].name, 'Google Font API'); + assert.equal(applications['Moment.js'].name, 'Moment.js'); + }); +}); diff --git a/src/wappalyzer.spec.js b/test/wappalyzer.spec.js similarity index 100% rename from src/wappalyzer.spec.js rename to test/wappalyzer.spec.js From 0f711679d7a9a52c8b9ec637bf9ec43a754cf75b Mon Sep 17 00:00:00 2001 From: ormaechea Date: Thu, 14 Feb 2019 16:31:36 +0100 Subject: [PATCH 142/197] Keep the same project-folder structure --- package.json | 2 +- src/wappalyzer.spec.js | 278 ++++++++++++++++++++++++++++++++++++++++ test/analyze.spec.js | 144 --------------------- test/wappalyzer.spec.js | 143 --------------------- 4 files changed, 279 insertions(+), 288 deletions(-) create mode 100644 src/wappalyzer.spec.js delete mode 100644 test/analyze.spec.js delete mode 100644 test/wappalyzer.spec.js diff --git a/package.json b/package.json index be41133c7..e7bee5930 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "mocha": "^5.2.0" }, "scripts": { - "test": "mocha -R spec ./test", + "test": "mocha -R spec src", "lint": "eslint src", "lint:fix": "eslint src --fix" } diff --git a/src/wappalyzer.spec.js b/src/wappalyzer.spec.js new file mode 100644 index 000000000..f51d7fb10 --- /dev/null +++ b/src/wappalyzer.spec.js @@ -0,0 +1,278 @@ +/* eslint-env mocha */ + +const { assert, expect } = require('chai'); +const Wappalyzer = require('../src/wappalyzer'); + +const appsJson = { + appUrl: { + url: 'test', + }, + appCookies: { + cookies: { + test: 'test', + }, + }, + appUppercaseCookies: { + cookies: { + Test: 'Test', + }, + }, + appHeaders: { + headers: { + 'X-Powered-By': 'test', + }, + }, + appHtml: { + html: 'test v(\\d)\\;confidence:50\\;version:\\1', + implies: 'appImplies', + excludes: 'appExcludes', + }, + appMeta: { + meta: { + generator: 'test', + }, + }, + appScript: { + script: 'test', + }, + appJs: { + js: { + key: 'value', + }, + }, + appImplies: { + }, + appExcludes: { + html: 'test', + }, +}; + +const driverData = { + cookies: [ + { + name: 'test', + value: 'test', + domain: '', + path: '', + }, + ], + headers: { + 'x-powered-by': [ + 'test', + ], + }, + html: ' html test v1', + scripts: [ + 'test', + ], + js: { + appJs: { + key: [ + 'value', + ], + }, + }, +}; + +describe('Wappalyzer', () => { + describe('#analyze()', () => { + let apps; + + before(async () => { + const wappalyzer = new Wappalyzer(); + + wappalyzer.apps = appsJson; + + wappalyzer.parseJsPatterns(); + + wappalyzer.driver.displayApps = (detected) => { + apps = detected; + }; + + await wappalyzer.analyze({ canonical: 'test' }, driverData); + }); + + it('should identify technologies using URLs', () => { + expect(apps).to.have.any.keys('appUrl'); + }); + + it('should identify technologies using HTML', () => { + expect(apps).to.have.any.keys('appHtml'); + }); + + it('should identify technologies using meta tags', () => { + expect(apps).to.have.any.keys('appMeta'); + }); + + it('should identify technologies using script URLs', () => { + expect(apps).to.have.any.keys('appScript'); + }); + + it('should identify technologies using headers', () => { + expect(apps).to.have.any.keys('appHeaders'); + }); + + it('should identify technologies using cookies', () => { + expect(apps).to.have.any.keys('appCookies'); + }); + + it('should identify technologies using uppercase named cookies', () => { + expect(apps).to.have.any.keys('appUppercaseCookies'); + }); + + it('should identify technologies using JavaScript', () => { + expect(apps).to.have.any.keys('appJs'); + }); + + it('should return the implied technology', () => { + expect(apps).to.have.any.keys('appImplies'); + }); + + it('should not return the excluded technology', () => { + expect(apps).to.not.have.any.keys('appExcludes'); + }); + + it('should return the confidence value', () => { + assert.equal(apps.appHtml.confidenceTotal, 50); + }); + + it('should return the version number', () => { + assert.equal(apps.appHtml.version, '1'); + }); + + it('should analyze html', async () => { + const html = ` + + + + Page title | Html detection + + + +

Technologies Test Page | Html detection

+ + + + + + `; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Google Tag Manager": { + "html": [ + "googletagmanager\\.com/ns\\.html[^>]+>", + "" + ] + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + await wappalyzer.analyze({ canonical: 'example.com' }, { html }); + assert.equal(applications['Google Tag Manager'].name, 'Google Tag Manager'); + }); + + it('should analyze scripts', async () => { + const scripts = [ + 'http://www.google-analytics.com/analytics.js', + 'http://example.com/assets/js/jquery.min.js' + ]; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Google Analytics": { + "cats": [ + 10 + ], + "script": "google-analytics\\.com\\/(?:ga|urchin|(analytics))\\.js\\;version:\\1?UA:" + }, + "jQuery": { + "script": [ + "jquery(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "/([\\d.]+)/jquery(?:\\.min)?\\.js\\;version:\\1", + "jquery.*\\.js(?:\\?ver(?:sion)?=([\\d.]+))?\\;version:\\1" + ] + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + await wappalyzer.analyze({ canonical: 'example.com' }, { scripts }); + assert.equal(applications['Google Analytics'].name, 'Google Analytics'); + assert.equal(applications['jQuery'].name, 'jQuery'); + }); + + it('should analyze headers', async () => { + const headers = { + 'date': [ 'Thu, 01 Feb 2018 11:34:18 GMT' ], + 'connection': [ 'keep-alive' ], + 'x-powered-by': [ 'Express'], + 'etag': [ 'W/125-1jQLmiya7mfec43xR3Eb3pjdu64s' ], + 'content-length': [ '293' ], + 'content-type': [ 'text/html; charset=utf-8' ] + }; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Express": { + "headers": { + "X-Powered-By": "^Express$" + } + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + await wappalyzer.analyze({ canonical: 'example.com' }, { headers }); + assert.equal(applications['Express'].name, 'Express'); + }); + + it('should analyze js globals', async () => { + const js = { + 'Moment.js': { 'moment': { '0': true } }, + 'Google Font API': { 'WebFonts': { '0': true } } + }; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Moment.js": { + "js": { + "moment": "", + "moment.version": "(.*)\\;version:\\1" + } + }, + "Google Font API": { + "js": { + "WebFonts": "" + } + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + wappalyzer.parseJsPatterns(); + await wappalyzer.analyze({ canonical: 'example.com' }, { js }); + + assert.equal(applications['Google Font API'].name, 'Google Font API'); + assert.equal(applications['Moment.js'].name, 'Moment.js'); + }); + }); +}); diff --git a/test/analyze.spec.js b/test/analyze.spec.js deleted file mode 100644 index 99cf6a516..000000000 --- a/test/analyze.spec.js +++ /dev/null @@ -1,144 +0,0 @@ -/* eslint-env mocha */ - -'use strict'; - -const assert = require('chai').assert; -const Wappalyzer = require('../src/wappalyzer'); - -describe('should analyze website elements properly', function () { - - it('should analyze html', async () => { - const html = ` - - - - Page title | Html detection - - - -

Technologies Test Page | Html detection

- - - - - - `; - const wappalyzer = new Wappalyzer(); - wappalyzer.apps = { - "Google Tag Manager": { - "html": [ - "googletagmanager\\.com/ns\\.html[^>]+>", - "" - ] - } - }; - var applications = null; - wappalyzer.driver = { - log () {}, - displayApps (detectedMap) { - applications = detectedMap; - } - }; - - await wappalyzer.analyze({ canonical: 'example.com' }, { html }); - assert.equal(applications['Google Tag Manager'].name, 'Google Tag Manager'); - }); - - it('should analyze scripts', async () => { - const scripts = [ - 'http://www.google-analytics.com/analytics.js', - 'http://example.com/assets/js/jquery.min.js' - ]; - const wappalyzer = new Wappalyzer(); - wappalyzer.apps = { - "Google Analytics": { - "cats": [ - 10 - ], - "script": "google-analytics\\.com\\/(?:ga|urchin|(analytics))\\.js\\;version:\\1?UA:" - }, - "jQuery": { - "script": [ - "jquery(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", - "/([\\d.]+)/jquery(?:\\.min)?\\.js\\;version:\\1", - "jquery.*\\.js(?:\\?ver(?:sion)?=([\\d.]+))?\\;version:\\1" - ] - } - }; - var applications = null; - wappalyzer.driver = { - log () {}, - displayApps (detectedMap) { - applications = detectedMap; - } - }; - - await wappalyzer.analyze({ canonical: 'example.com' }, { scripts }); - assert.equal(applications['Google Analytics'].name, 'Google Analytics'); - assert.equal(applications['jQuery'].name, 'jQuery'); - }); - - it('should analyze headers', async () => { - const headers = { - 'date': [ 'Thu, 01 Feb 2018 11:34:18 GMT' ], - 'connection': [ 'keep-alive' ], - 'x-powered-by': [ 'Express'], - 'etag': [ 'W/125-1jQLmiya7mfec43xR3Eb3pjdu64s' ], - 'content-length': [ '293' ], - 'content-type': [ 'text/html; charset=utf-8' ] - }; - const wappalyzer = new Wappalyzer(); - wappalyzer.apps = { - "Express": { - "headers": { - "X-Powered-By": "^Express$" - } - } - }; - var applications = null; - wappalyzer.driver = { - log () {}, - displayApps (detectedMap) { - applications = detectedMap; - } - }; - - await wappalyzer.analyze({ canonical: 'example.com' }, { headers }); - assert.equal(applications['Express'].name, 'Express'); - }); - - it('should analyze js globals', async () => { - const js = { - 'Moment.js': { 'moment': { '0': true } }, - 'Google Font API': { 'WebFonts': { '0': true } } - }; - const wappalyzer = new Wappalyzer(); - wappalyzer.apps = { - "Moment.js": { - "js": { - "moment": "", - "moment.version": "(.*)\\;version:\\1" - } - }, - "Google Font API": { - "js": { - "WebFonts": "" - } - } - }; - var applications = null; - wappalyzer.driver = { - log () {}, - displayApps (detectedMap) { - applications = detectedMap; - } - }; - - wappalyzer.parseJsPatterns(); - await wappalyzer.analyze({ canonical: 'example.com' }, { js }); - - assert.equal(applications['Google Font API'].name, 'Google Font API'); - assert.equal(applications['Moment.js'].name, 'Moment.js'); - }); -}); diff --git a/test/wappalyzer.spec.js b/test/wappalyzer.spec.js deleted file mode 100644 index ea68c22e0..000000000 --- a/test/wappalyzer.spec.js +++ /dev/null @@ -1,143 +0,0 @@ -/* eslint-env mocha */ - -const { assert, expect } = require('chai'); -const Wappalyzer = require('../src/wappalyzer'); - -const appsJson = { - appUrl: { - url: 'test', - }, - appCookies: { - cookies: { - test: 'test', - }, - }, - appUppercaseCookies: { - cookies: { - Test: 'Test', - }, - }, - appHeaders: { - headers: { - 'X-Powered-By': 'test', - }, - }, - appHtml: { - html: 'test v(\\d)\\;confidence:50\\;version:\\1', - implies: 'appImplies', - excludes: 'appExcludes', - }, - appMeta: { - meta: { - generator: 'test', - }, - }, - appScript: { - script: 'test', - }, - appJs: { - js: { - key: 'value', - }, - }, - appImplies: { - }, - appExcludes: { - html: 'test', - }, -}; - -const driverData = { - cookies: [ - { - name: 'test', - value: 'test', - domain: '', - path: '', - }, - ], - headers: { - 'x-powered-by': [ - 'test', - ], - }, - html: ' html test v1', - scripts: [ - 'test', - ], - js: { - appJs: { - key: [ - 'value', - ], - }, - }, -}; - -describe('Wappalyzer', () => { - describe('#analyze()', () => { - let apps; - - before(async () => { - const wappalyzer = new Wappalyzer(); - - wappalyzer.apps = appsJson; - - wappalyzer.parseJsPatterns(); - - wappalyzer.driver.displayApps = (detected) => { - apps = detected; - }; - - await wappalyzer.analyze({ canonical: 'test' }, driverData); - }); - - it('should identify technologies using URLs', () => { - expect(apps).to.have.any.keys('appUrl'); - }); - - it('should identify technologies using HTML', () => { - expect(apps).to.have.any.keys('appHtml'); - }); - - it('should identify technologies using meta tags', () => { - expect(apps).to.have.any.keys('appMeta'); - }); - - it('should identify technologies using script URLs', () => { - expect(apps).to.have.any.keys('appScript'); - }); - - it('should identify technologies using headers', () => { - expect(apps).to.have.any.keys('appHeaders'); - }); - - it('should identify technologies using cookies', () => { - expect(apps).to.have.any.keys('appCookies'); - }); - - it('should identify technologies using uppercase named cookies', () => { - expect(apps).to.have.any.keys('appUppercaseCookies'); - }); - - it('should identify technologies using JavaScript', () => { - expect(apps).to.have.any.keys('appJs'); - }); - - it('should return the implied technology', () => { - expect(apps).to.have.any.keys('appImplies'); - }); - - it('should not return the excluded technology', () => { - expect(apps).to.not.have.any.keys('appExcludes'); - }); - - it('should return the confidence value', () => { - assert.equal(apps.appHtml.confidenceTotal, 50); - }); - - it('should return the version number', () => { - assert.equal(apps.appHtml.version, '1'); - }); - }); -}); From 4a0dbdd77013dd5179f392427054e8d495915bff Mon Sep 17 00:00:00 2001 From: Yoel Fialkoff <16785684+Yofial@users.noreply.github.com> Date: Sun, 17 Feb 2019 11:06:38 +0200 Subject: [PATCH 143/197] optimize server header regex --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index d1ab54518..7ac39c0c2 100644 --- a/src/apps.json +++ b/src/apps.json @@ -3103,7 +3103,7 @@ 64 ], "headers": { - "server": "BigIP|BIG-IP" + "server": "^big-?ip$" }, "cookies": { "F5_ST": "", From 9da89258c2537f85f644290a435c5f92d16eb662 Mon Sep 17 00:00:00 2001 From: Lucas Cordeiro Date: Sun, 17 Feb 2019 11:20:07 -0300 Subject: [PATCH 144/197] Add VTEX IO support --- src/apps.json | 12 +++++++++++- src/icons/VTEX Enterprise.png | Bin 812 -> 0 bytes src/icons/VTEX.svg | 3 +++ 3 files changed, 14 insertions(+), 1 deletion(-) delete mode 100644 src/icons/VTEX Enterprise.png create mode 100644 src/icons/VTEX.svg diff --git a/src/apps.json b/src/apps.json index 20d15edab..49b0ed0de 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10523,7 +10523,7 @@ "headers": { "powered": "vtex" }, - "icon": "VTEX Enterprise.png", + "icon": "VTEX.svg", "website": "http://vtex.com" }, "VTEX Integrated Store": { @@ -10536,6 +10536,16 @@ "icon": "VTEX Integrated Store.png", "website": "http://lojaintegrada.com.br" }, + "VTEX IO": { + "cats": [ + 6 + ], + "headers": { + "Server": "VTEX IO" + }, + "icon": "VTEX.svg", + "website": "https://vtex.io/" + }, "Vaadin": { "cats": [ 18 diff --git a/src/icons/VTEX Enterprise.png b/src/icons/VTEX Enterprise.png deleted file mode 100644 index 7678318113ffe13f9e769de53bd3cf1df6960cdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 812 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U@Q#q32_B-LBPS`e?0?(R;Y?+ zu8d{ji*5!{hb$56Bq8%$bI*Dum$Y{?859f(fKre9_@vFUC5_YMZ3|?a3e_wNRUC2+ z9131cV^?-BRIn_5H<3Zfu293JP}#0X-LX{G8py6tvMthatx$F-RJJdEH-TBvzC_if zOwp!D&7sKIJ4wT}RKum@)nr~}`w|7a0%f~mbs)p0NX4P_%|sSO`(hRQVkNtx*ORyu z?SX>Ds*c6V4#jE?B|!4cMD{n6*p(fMl!09PLPeWGc^jZDB|!B`_Qi^}g{qFFKsJz6 zb}Ry#tY};GW+E$4MA5EL&8Y;aM#Zs2(XI&Su-B8=6o9(yihx!F#epI~aiGhAmVy{S zGr=N2jUW+QknEd@Y(TaW&{(iWAOoldYBf-eeev5#tcpNEhypNo&EHvjfdO7w666=m zz{tYF#?Hyj!^_9V&o3Y(BrGB+EiI#)`C>;pyWW6dE288I_!xmX=vo zQCU@0-`LdN+1)c?%Cs3XX3m+ra?Qp~Tefc9v+wZXqbE+BI&<#axhq%h-@pIx$&0sd z-@X6z^FSF~}CSBYPK zcf;&UN}MOG)mQ3y2^wzH5!1Hba_#$p7s5w-xc6V0rm^n!x3B5RM;VV6issze+?BFo zwN1K;%fr)dTRw_UlHa>qMEz^Qh3^ihlNA{Iq7IwHUQ=jmET2{OU`;{v#iALF|ApA| zJ?nn=Yn#N!B6x$ZD0Vz2eh0>IUm7RlW0A uH8sTI)Y + + From 1670f4fa22cbd7f74c8329929613132b997aa87f Mon Sep 17 00:00:00 2001 From: Yoel Fialkoff <16785684+Yofial@users.noreply.github.com> Date: Sun, 17 Feb 2019 18:27:58 +0200 Subject: [PATCH 145/197] fix reverse proxy priority --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 7ac39c0c2..26cb178ff 100644 --- a/src/apps.json +++ b/src/apps.json @@ -13256,7 +13256,7 @@ }, "64": { "name": "Reverse Proxy", - "priority": 1 + "priority": 7 }, "65": { "name": "Load Balancer", From ed7c76e9287891152be663a6f80951bf9c13a136 Mon Sep 17 00:00:00 2001 From: Lucas Cordeiro Date: Mon, 18 Feb 2019 17:47:17 -0300 Subject: [PATCH 146/197] Remove VTEX IO and replace enterprise by VTEX --- src/apps.json | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/apps.json b/src/apps.json index 49b0ed0de..006538759 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10516,15 +10516,16 @@ "script": "vs350\\.js", "website": "http://www.vpasp.com" }, - "VTEX Enterprise": { + "VTEX": { "cats": [ 6 ], "headers": { + "Server": "VTEX IO", "powered": "vtex" }, "icon": "VTEX.svg", - "website": "http://vtex.com" + "website": "https://vtex.io/" }, "VTEX Integrated Store": { "cats": [ @@ -10536,16 +10537,6 @@ "icon": "VTEX Integrated Store.png", "website": "http://lojaintegrada.com.br" }, - "VTEX IO": { - "cats": [ - 6 - ], - "headers": { - "Server": "VTEX IO" - }, - "icon": "VTEX.svg", - "website": "https://vtex.io/" - }, "Vaadin": { "cats": [ 18 From 1c5d1fac637a581c5c60c4f3aadbedb858949714 Mon Sep 17 00:00:00 2001 From: Lucas Cordeiro Date: Mon, 18 Feb 2019 18:10:57 -0300 Subject: [PATCH 147/197] Update VTEX website url --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 006538759..f06cb45d1 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10525,7 +10525,7 @@ "powered": "vtex" }, "icon": "VTEX.svg", - "website": "https://vtex.io/" + "website": "https://vtex.com/" }, "VTEX Integrated Store": { "cats": [ From 9dd93eef898e8f54fc6b83a90bd745f357a4ff8f Mon Sep 17 00:00:00 2001 From: Lucas Cordeiro Date: Wed, 20 Feb 2019 10:24:49 -0300 Subject: [PATCH 148/197] Update server regex --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index f06cb45d1..a8fc7fa8f 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10521,7 +10521,7 @@ 6 ], "headers": { - "Server": "VTEX IO", + "Server": "^VTEX IO$", "powered": "vtex" }, "icon": "VTEX.svg", From 026987f952270378747c809ebc02d52650822c21 Mon Sep 17 00:00:00 2001 From: Lucas Cordeiro Date: Wed, 20 Feb 2019 10:37:08 -0300 Subject: [PATCH 149/197] Add cookie detection --- src/apps.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps.json b/src/apps.json index a8fc7fa8f..95acac209 100644 --- a/src/apps.json +++ b/src/apps.json @@ -10520,6 +10520,9 @@ "cats": [ 6 ], + "cookies": { + "VtexWorkspace": "" + }, "headers": { "Server": "^VTEX IO$", "powered": "vtex" From fd1823c61d92872a04c25765c09347ee330e3ea5 Mon Sep 17 00:00:00 2001 From: Gifford Nowland Date: Thu, 21 Feb 2019 00:06:22 -0700 Subject: [PATCH 150/197] Add PhotoShelter --- src/apps.json | 16 ++++++++++++++++ src/icons/PhotoShelter.png | Bin 0 -> 3655 bytes 2 files changed, 16 insertions(+) create mode 100644 src/icons/PhotoShelter.png diff --git a/src/apps.json b/src/apps.json index 20d15edab..77c52cb9c 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12480,6 +12480,22 @@ "script": "/particles(?:\\.min)?\\.js", "website": "https://vincentgarreau.com/particles.js/" }, + "PhotoShelter": { + "cats": [ + 1 + ], + "html": [ + " + logo + Created with Sketch. + + + + + From 21cae171731410edcc45584bd0c35ce4225f58fa Mon Sep 17 00:00:00 2001 From: Ivan Donchev Date: Fri, 22 Feb 2019 21:07:24 +0200 Subject: [PATCH 153/197] [clarity] move line to script section --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index cc7761c68..dc6b009c8 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1791,12 +1791,12 @@ ], "html": [ "]*href=\"[^\"]*clr-angular(?:\\.umd)?(?:\\.min)?\\.js", "]*href=\"[^\"]*clr-ui(?:\\.min)?\\.css" ], "js": { "ClarityIcons": "" }, + "script": "clr-angular(?:\\.umd)?(?:\\.min)?\\.js", "icon": "clarity.svg", "implies": [ "Angular" From 70964488e6ce000c4cea356c336b9cb942e72dee Mon Sep 17 00:00:00 2001 From: Yoel Fialkoff <16785684+Yofial@users.noreply.github.com> Date: Sun, 24 Feb 2019 08:07:56 +0200 Subject: [PATCH 154/197] add zipkin --- src/apps.json | 14 ++++++++++++++ src/icons/Zipkin.png | Bin 0 -> 11438 bytes 2 files changed, 14 insertions(+) create mode 100644 src/icons/Zipkin.png diff --git a/src/apps.json b/src/apps.json index 20d15edab..124e4cda1 100644 --- a/src/apps.json +++ b/src/apps.json @@ -12975,6 +12975,20 @@ "Less" ], "website": "https://rocketcms.io" + }, + "Zipkin": { + "cats": [ + 10 + ], + "headers": { + "X-B3-TraceId": "", + "X-B3-SpanId": "", + "X-B3-ParentSpanId": "", + "X-B3-Sampled": "", + "X-B3-Flags": "" + }, + "icon": "Zipkin.png", + "website": "https://zipkin.io/" } }, "categories": { diff --git a/src/icons/Zipkin.png b/src/icons/Zipkin.png new file mode 100644 index 0000000000000000000000000000000000000000..e783a2ca10f7f43d93171606129154f2ff33b265 GIT binary patch literal 11438 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 R9e4+Tf~=}cjT9vG{{bbWK#%|c literal 0 HcmV?d00001 From 7c2357ae3dd83b231c5f74a722d9a9b4f70864c6 Mon Sep 17 00:00:00 2001 From: Shamsudin Date: Mon, 4 Mar 2019 14:56:29 +0300 Subject: [PATCH 155/197] Update apps.json --- src/apps.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/apps.json b/src/apps.json index 20d15edab..217d0fff3 100644 --- a/src/apps.json +++ b/src/apps.json @@ -11600,6 +11600,26 @@ "icon": "YouTube.png", "website": "http://www.youtube.com" }, + + "iEXExchanger": { + "cats": [ + 1 + ], + "implies": [ + "PHP", + "Apache" + ], + + "cookies": { + "iexexchanger_session": "" + }, + "meta": { + "generator": "^iEXExchanger ?([\\d.]+)?\\;version:\\1" + }, + "script": "iexexchanger", + "website": "https://exchanger.iexbase.com" + }, + "ZK": { "cats": [ 18 From 642f36a1e811bc5571e3ec5270ed56251af915ac Mon Sep 17 00:00:00 2001 From: Shamsudin Date: Mon, 4 Mar 2019 14:59:55 +0300 Subject: [PATCH 156/197] Update apps.json --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 217d0fff3..a5ce682b1 100644 --- a/src/apps.json +++ b/src/apps.json @@ -11614,7 +11614,7 @@ "iexexchanger_session": "" }, "meta": { - "generator": "^iEXExchanger ?([\\d.]+)?\\;version:\\1" + "generator": "iEXExchanger" }, "script": "iexexchanger", "website": "https://exchanger.iexbase.com" From 93ddace3705d1b4206a9d0b9540850cd3d74e202 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Mon, 18 Mar 2019 16:52:22 +1100 Subject: [PATCH 157/197] Use ports for messaging --- src/drivers/npm/npm-shrinkwrap.json | 2 +- src/drivers/webextension/js/content.js | 45 ++++--- src/drivers/webextension/js/driver.js | 129 ++++++++++--------- src/drivers/webextension/js/lib/network.js | 2 + src/drivers/webextension/js/popup.js | 84 +++++++----- src/drivers/webextension/npm-shrinkwrap.json | 6 +- src/drivers/webextension/package.json | 2 +- 7 files changed, 154 insertions(+), 116 deletions(-) diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index 445bbc609..26c32eed6 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.7.2", + "version": "5.7.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/webextension/js/content.js b/src/drivers/webextension/js/content.js index 6111d1830..82713d79b 100644 --- a/src/drivers/webextension/js/content.js +++ b/src/drivers/webextension/js/content.js @@ -1,20 +1,16 @@ /** global: browser */ /** global: XMLSerializer */ -/* global browser, chrome */ +/* global browser */ /* eslint-env browser */ -function sendMessage(id, subject, callback) { - (chrome || browser).runtime.sendMessage({ - id, - subject, - source: 'content.js', - }, callback || (() => {})); -} +const port = browser.runtime.connect({ + name: 'content.js', +}); if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') { try { - sendMessage('init', {}); + port.postMessage({ id: 'init' }); // HTML let html = new XMLSerializer().serializeToString(document); @@ -41,7 +37,7 @@ if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') { .map(script => script.src) .filter(script => script.indexOf('data:text/javascript;') !== 0); - sendMessage('analyze', { html, scripts }); + port.postMessage({ id: 'analyze', subject: { html, scripts } }); // JavaScript variables const script = document.createElement('script'); @@ -54,31 +50,38 @@ if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') { window.removeEventListener('message', onMessage); - sendMessage('analyze', { js: event.data.js }); + port.postMessage({ id: 'analyze', subject: { js: event.data.js } }); script.remove(); }; window.addEventListener('message', onMessage); - sendMessage('get_js_patterns', {}, (response) => { - if (response) { - postMessage({ - id: 'patterns', - patterns: response.patterns, - }, window.location.href); - } - }); + port.postMessage({ id: 'get_js_patterns' }); }; script.setAttribute('src', browser.extension.getURL('js/inject.js')); document.body.appendChild(script); - } catch (e) { - sendMessage('log', e); + } catch (error) { + port.postMessage({ id: 'log', subject: error }); } } +port.onMessage.addListener((message) => { + switch (message.id) { + case 'get_js_patterns': + postMessage({ + id: 'patterns', + patterns: message.response.patterns, + }, window.location.href); + + break; + default: + // Do nothing + } +}); + // https://stackoverflow.com/a/44774834 // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value undefined; // eslint-disable-line no-unused-expressions diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index 5d8962f17..327d31717 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -134,67 +134,74 @@ browser.webRequest.onCompleted.addListener(async (request) => { } }, { urls: ['http://*/*', 'https://*/*'], types: ['main_frame'] }, ['responseHeaders']); -// Listen for messages -browser.runtime.onMessage.addListener(async (message, sender) => { - if (message.id === undefined) { - return Promise.resolve(); - } - - if (message.id !== 'log') { - wappalyzer.log(`Message${message.source ? ` from ${message.source}` : ''}: ${message.id}`, 'driver'); - } - - const pinnedCategory = await getOption('pinnedCategory'); - - const url = wappalyzer.parseUrl(sender.tab ? sender.tab.url : ''); - - const cookies = await browser.cookies.getAll({ domain: `.${url.hostname}` }); - - let response; - - switch (message.id) { - case 'log': - wappalyzer.log(message.subject, message.source); - - break; - case 'init': - wappalyzer.analyze(url, { cookies }, { tab: sender.tab }); - - break; - case 'analyze': - wappalyzer.analyze(url, message.subject, { tab: sender.tab }); +browser.runtime.onConnect.addListener((port) => { + port.onMessage.addListener(async (message) => { + if (message.id === undefined) { + return; + } - await setOption('hostnameCache', wappalyzer.hostnameCache); + if (message.id !== 'log') { + wappalyzer.log(`Message from ${port.name}: ${message.id}`, 'driver'); + } - break; - case 'ad_log': - wappalyzer.cacheDetectedAds(message.subject); + const pinnedCategory = await getOption('pinnedCategory'); - break; - case 'get_apps': - response = { - tabCache: tabCache[message.tab.id], - apps: wappalyzer.apps, - categories: wappalyzer.categories, - pinnedCategory, - termsAccepted: userAgent() === 'chrome' || await getOption('termsAccepted', false), - }; + const url = wappalyzer.parseUrl(port.sender.tab ? port.sender.tab.url : ''); - break; - case 'set_option': - await setOption(message.key, message.value); + const cookies = await browser.cookies.getAll({ domain: `.${url.hostname}` }); - break; - case 'get_js_patterns': - response = { - patterns: wappalyzer.jsPatterns, - }; + let response; - break; - default: - } + switch (message.id) { + case 'log': + wappalyzer.log(message.subject, message.source); + + break; + case 'init': + wappalyzer.analyze(url, { cookies }, { tab: port.sender.tab }); + + break; + case 'analyze': + wappalyzer.analyze(url, message.subject, { tab: port.sender.tab }); + + await setOption('hostnameCache', wappalyzer.hostnameCache); + + break; + case 'ad_log': + wappalyzer.cacheDetectedAds(message.subject); + + break; + case 'get_apps': + response = { + tabCache: tabCache[message.tab.id], + apps: wappalyzer.apps, + categories: wappalyzer.categories, + pinnedCategory, + termsAccepted: userAgent() === 'chrome' || await getOption('termsAccepted', false), + }; + + break; + case 'set_option': + await setOption(message.key, message.value); + + break; + case 'get_js_patterns': + response = { + patterns: wappalyzer.jsPatterns, + }; + + break; + default: + // Do nothing + } - return Promise.resolve(response); + if (response) { + port.postMessage({ + id: message.id, + response, + }); + } + }); }); wappalyzer.driver.document = document; @@ -205,7 +212,7 @@ wappalyzer.driver.document = document; wappalyzer.driver.log = (message, source, type) => { const log = ['warn', 'error'].indexOf(type) !== -1 ? type : 'log'; - console[log](`[wappalyzer ${type}]`, `[${source}]`, message); + console[log](`[wappalyzer ${type}]`, `[${source}]`, message); // eslint-disable-line no-console }; /** @@ -372,10 +379,14 @@ wappalyzer.driver.ping = async (hostnameCache = {}, adCache = []) => { try { const tabs = await browser.tabs.query({ url: ['http://*/*', 'https://*/*'] }); - tabs.forEach((tab) => { - browser.tabs.executeScript(tab.id, { - file: '../js/content.js', - }); + tabs.forEach(async (tab) => { + try { + await browser.tabs.executeScript(tab.id, { + file: '../js/content.js', + }); + } catch (error) { + // + } }); } catch (error) { wappalyzer.log(error, 'driver', 'error'); diff --git a/src/drivers/webextension/js/lib/network.js b/src/drivers/webextension/js/lib/network.js index ebae3bc7a..fc0a22d16 100644 --- a/src/drivers/webextension/js/lib/network.js +++ b/src/drivers/webextension/js/lib/network.js @@ -780,9 +780,11 @@ ifTrackingEnabled( sender.tab, () => { + console.log('enabled'); try { sendResponse({ tracking_enabled: true }); } catch (err) {} }, () => { + console.log('not enabled'); try { sendResponse({ tracking_enabled: false }); } catch (err) {} }, ); diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js index 58d14867e..42ed70089 100644 --- a/src/drivers/webextension/js/popup.js +++ b/src/drivers/webextension/js/popup.js @@ -1,13 +1,16 @@ /* eslint-env browser */ -/* global browser, chrome, jsonToDOM */ +/* global browser, jsonToDOM */ -/** global: chrome */ /** global: browser */ /** global: jsonToDOM */ let pinnedCategory = null; let termsAccepted = false; +const port = browser.runtime.connect({ + name: 'popup.js', +}); + function slugify(string) { return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, ''); } @@ -51,7 +54,7 @@ function replaceDom(domTemplate) { pinnedCategory = categoryId; } - (chrome || browser).runtime.sendMessage({ + port.postMessage({ id: 'set_option', key: 'pinnedCategory', value: pinnedCategory, @@ -186,39 +189,58 @@ function appsToDomTemplate(response) { return template; } -const func = (tabs) => { - (chrome || browser).runtime.sendMessage({ - id: 'get_apps', - tab: tabs[0], - source: 'popup.js', - }, (response) => { - pinnedCategory = response.pinnedCategory; - termsAccepted = response.termsAccepted; +async function getApps() { + try { + const tabs = await browser.tabs.query({ + active: true, + currentWindow: true, + }); - if (termsAccepted) { - replaceDomWhenReady(appsToDomTemplate(response)); - } else { - i18n(); + port.postMessage({ + id: 'get_apps', + tab: tabs[0], + }); + } catch (error) { + console.error(error); // eslint-disable-line no-console + } +} - const wrapper = document.querySelector('.terms__wrapper'); +function displayApps(response) { + pinnedCategory = response.pinnedCategory; // eslint-disable-line prefer-destructuring + termsAccepted = response.termsAccepted; // eslint-disable-line prefer-destructuring - document.querySelector('.terms__accept').addEventListener('click', () => { - (chrome || browser).runtime.sendMessage({ - id: 'set_option', - key: 'termsAccepted', - value: true, - }); + if (termsAccepted) { + replaceDomWhenReady(appsToDomTemplate(response)); + } else { + i18n(); - wrapper.classList.remove('terms__wrapper--active'); + const wrapper = document.querySelector('.terms__wrapper'); - func(tabs); + document.querySelector('.terms__accept').addEventListener('click', () => { + port.postMessage({ + id: 'set_option', + key: 'termsAccepted', + value: true, }); - wrapper.classList.add('terms__wrapper--active'); - } - }); -}; + wrapper.classList.remove('terms__wrapper--active'); + + getApps(); + }); + + wrapper.classList.add('terms__wrapper--active'); + } +} + +port.onMessage.addListener((message) => { + switch (message.id) { + case 'get_apps': + displayApps(message.response); + + break; + default: + // Do nothing + } +}); -browser.tabs.query({ active: true, currentWindow: true }) - .then(func) - .catch(console.error); +getApps(); diff --git a/src/drivers/webextension/npm-shrinkwrap.json b/src/drivers/webextension/npm-shrinkwrap.json index 7dfcf7d96..9934b3a1c 100644 --- a/src/drivers/webextension/npm-shrinkwrap.json +++ b/src/drivers/webextension/npm-shrinkwrap.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "webextension-polyfill": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.3.1.tgz", - "integrity": "sha512-ISB42vlgMyM7xE1u6pREeCqmmXjLsYu/nqAR8Dl/gIAnylb+KpRpvKbVkUYNFePhhXn0Obkkc3jasOII9ztUtg==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.4.0.tgz", + "integrity": "sha512-oreMp+EoAo1pzRMigx4jB5jInIpx6NTCySPSjGyLLee/dCIPiRqowCEfbFP8o20wz9SOtNwSsfkaJ9D/tRgpag==" } } } diff --git a/src/drivers/webextension/package.json b/src/drivers/webextension/package.json index 19c18bd9a..837c5acf8 100644 --- a/src/drivers/webextension/package.json +++ b/src/drivers/webextension/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "webextension-polyfill": "^0.3.1" + "webextension-polyfill": "^0.4.0" } } From 6b3cca8e41865c17c506aecb95a9dab2a6a35075 Mon Sep 17 00:00:00 2001 From: Thor Galle Date: Mon, 18 Mar 2019 12:09:27 +0200 Subject: [PATCH 158/197] Add LocalFocus --- src/apps.json | 12 ++++++++++++ src/icons/LocalFocus.png | Bin 0 -> 3428 bytes 2 files changed, 12 insertions(+) create mode 100644 src/icons/LocalFocus.png diff --git a/src/apps.json b/src/apps.json index 20d15edab..726596be7 100644 --- a/src/apps.json +++ b/src/apps.json @@ -5670,6 +5670,18 @@ "script": "/js/al/common\\.js\\?[0-9_]+", "website": "http://liveinternet.ru/rating/" }, + "LocalFocus": { + "cats": [ + 61 + ], + "html": "]+localfocus", + "icon": "LocalFocus.png", + "implies": [ + "Angular", + "D3" + ], + "website": "https://www.localfocus.nl/en/" + }, "Locomotive": { "cats": [ 1 diff --git a/src/icons/LocalFocus.png b/src/icons/LocalFocus.png new file mode 100644 index 0000000000000000000000000000000000000000..0571a349b925e4b1ef6a154ae0bc223e0bce7b6b GIT binary patch literal 3428 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 literal 0 HcmV?d00001 From 3ac6e424a49011f6360215986ad12051eb628301 Mon Sep 17 00:00:00 2001 From: J0N4S Date: Tue, 19 Mar 2019 02:21:18 +0000 Subject: [PATCH 159/197] Update language PT-PT --- .../webextension/_locales/pt/messages.json | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/drivers/webextension/_locales/pt/messages.json b/src/drivers/webextension/_locales/pt/messages.json index e4ab9fb3c..21918a376 100644 --- a/src/drivers/webextension/_locales/pt/messages.json +++ b/src/drivers/webextension/_locales/pt/messages.json @@ -11,25 +11,26 @@ "twitter": { "message": "Seguir Wappalyzer no Twitter" }, "website": { "message": "Ir para wappalyzer.com" }, "categoryPin": { "message": "Mostrar sempre ícone" }, - "termsAccept": { "message": "Accept" }, - "termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to
wappalyzer.com. This can be disabled in the settings." }, + "termsAccept": { "message": "Aceitar" }, + "termsContent": { "message": "Esta extensão envia informações anónimas sobre os sites que visitas, incluindo o nome de domínio e as tecnologias identificadas, para o wappalyzer.com. Isso pode ser desativado nas configurações." }, + "privacyPolicy": { "message": "Políticas de Privacidade" }, "categoryName1": { "message": "CMS" }, "categoryName2": { "message": "Fórum" }, "categoryName3": { "message": "Gestor de Base de Dados" }, "categoryName4": { "message": "Ferramenta de Documentação" }, "categoryName5": { "message": "Widget" }, - "categoryName6": { "message": "Comércio Eletrónico" }, + "categoryName6": { "message": "Ecommerce" }, "categoryName7": { "message": "Galeria de Fotos" }, "categoryName8": { "message": "Wikis" }, "categoryName9": { "message": "Painéis de Hospedagem" }, "categoryName10": { "message": "Analítica" }, "categoryName11": { "message": "Blog" }, "categoryName12": { "message": "Framework JavaScript" }, - "categoryName13": { "message": "Rastreador de Problemas" }, + "categoryName13": { "message": "Localizador de Problemas" }, "categoryName14": { "message": "Leitor Vídeo" }, "categoryName15": { "message": "Sistema de Comentários" }, "categoryName16": { "message": "Captcha" }, - "categoryName17": { "message": "Script de Tipos de Letra" }, + "categoryName17": { "message": "Tipos de Letra" }, "categoryName18": { "message": "Framework Web" }, "categoryName19": { "message": "Diversos" }, "categoryName20": { "message": "Editor" }, @@ -42,7 +43,7 @@ "categoryName27": { "message": "Linguagem de Programação" }, "categoryName28": { "message": "Sistema Operativo" }, "categoryName29": { "message": "Motor de Busca" }, - "categoryName30": { "message": "Web Mail" }, + "categoryName30": { "message": "WebMail" }, "categoryName31": { "message": "CDN" }, "categoryName32": { "message": "Automação de Marketing" }, "categoryName33": { "message": "Extensão de Servidor Web" }, @@ -71,7 +72,7 @@ "categoryName56": { "message": "Cryptominer" }, "categoryName57": { "message": "Gerador de Site Estático" }, "categoryName58": { "message": "User Onboarding" }, - "categoryName59": { "message": "JavaScript Libraries" }, + "categoryName59": { "message": "Bibliotecas de JavaScript" }, "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, From 8bd68c788ceb6f24c8ecd6ca117642e6586d4198 Mon Sep 17 00:00:00 2001 From: Patrick Ecker Date: Fri, 22 Mar 2019 11:35:46 +0100 Subject: [PATCH 160/197] Add Combeenation --- src/apps.json | 8 ++++++++ src/icons/Combeenation.png | Bin 0 -> 4176 bytes 2 files changed, 8 insertions(+) create mode 100644 src/icons/Combeenation.png diff --git a/src/apps.json b/src/apps.json index 20d15edab..50e5236ca 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1996,6 +1996,14 @@ }, "website": "http://comandia.com" }, + "Combeenation": { + "cats": [ + 6 + ], + "html": "]+src=\"[^>]+portal\\.combeenation\\.com", + "icon": "Combeenation.png", + "website": "https://combeenation.com" + }, "Commerce Server": { "cats": [ 6 diff --git a/src/icons/Combeenation.png b/src/icons/Combeenation.png new file mode 100644 index 0000000000000000000000000000000000000000..86792253e375667078ee4b4352a2d43a24c73b44 GIT binary patch literal 4176 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 Date: Fri, 22 Mar 2019 11:38:12 +0100 Subject: [PATCH 161/197] Add Combeenation --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 50e5236ca..6dd8826fb 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2002,7 +2002,7 @@ ], "html": "]+src=\"[^>]+portal\\.combeenation\\.com", "icon": "Combeenation.png", - "website": "https://combeenation.com" + "website": "https://www.combeenation.com" }, "Commerce Server": { "cats": [ From 1cca98b405a65479a8407854ce2a87ad8cbeca99 Mon Sep 17 00:00:00 2001 From: Elbert Alias <77259+AliasIO@users.noreply.github.com> Date: Sat, 23 Mar 2019 15:17:38 +1100 Subject: [PATCH 162/197] Build v5.7.4 --- src/apps.json | 11 +- src/drivers/npm/npm-shrinkwrap.json | 2 +- src/drivers/npm/package.json | 2 +- .../webextension/_locales/de/messages.json | 4 +- .../webextension/_locales/el/messages.json | 4 +- .../webextension/_locales/es/messages.json | 4 +- .../webextension/_locales/fa/messages.json | 4 +- .../webextension/_locales/fr/messages.json | 4 +- .../webextension/_locales/gr/messages.json | 4 +- .../webextension/_locales/id/messages.json | 4 +- .../webextension/_locales/it/messages.json | 4 +- .../webextension/_locales/pl/messages.json | 4 +- .../webextension/_locales/pt/messages.json | 4 +- .../webextension/_locales/pt_BR/messages.json | 4 +- .../webextension/_locales/ro/messages.json | 4 +- .../webextension/_locales/ru/messages.json | 4 +- .../webextension/_locales/sk/messages.json | 4 +- .../webextension/_locales/tr/messages.json | 4 +- .../webextension/_locales/uk/messages.json | 4 +- .../webextension/_locales/uz/messages.json | 4 +- .../webextension/_locales/zh_CN/messages.json | 4 +- .../webextension/_locales/zh_TW/messages.json | 4 +- src/drivers/webextension/js/lib/iframe.js | 2321 +++++++++-------- src/drivers/webextension/js/lib/network.js | 1616 ++++++------ src/drivers/webextension/manifest.json | 3 +- 25 files changed, 2068 insertions(+), 1963 deletions(-) diff --git a/src/apps.json b/src/apps.json index 4c95d0fce..cf1c1022c 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1139,7 +1139,7 @@ 6 ], "headers": { - "X-SERVER": "BIGBANGSHOP*\w+" + "X-SERVER": "BIGBANGSHOP" }, "icon": "bigbangshop.svg", "website": "https://www.bigbangshop.com.br" @@ -5738,7 +5738,7 @@ "website": "http://liveinternet.ru/rating/" }, "LocalFocus": { - "cats": [ + "cats": [ 61 ], "html": "]+localfocus", @@ -11698,7 +11698,6 @@ "icon": "YouTube.png", "website": "http://www.youtube.com" }, - "iEXExchanger": { "cats": [ 1 @@ -11707,8 +11706,7 @@ "PHP", "Apache" ], - - "cookies": { + "cookies": { "iexexchanger_session": "" }, "meta": { @@ -11717,7 +11715,6 @@ "script": "iexexchanger", "website": "https://exchanger.iexbase.com" }, - "ZK": { "cats": [ 18 @@ -13379,4 +13376,4 @@ "priority": 7 } } -} \ No newline at end of file +} diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index 26c32eed6..43be434cc 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.7.3", + "version": "5.7.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index ffbc1a38b..18fed21ea 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "5.7.3", + "version": "5.7.4", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { diff --git a/src/drivers/webextension/_locales/de/messages.json b/src/drivers/webextension/_locales/de/messages.json index c8b72145d..a3735830c 100644 --- a/src/drivers/webextension/_locales/de/messages.json +++ b/src/drivers/webextension/_locales/de/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/el/messages.json b/src/drivers/webextension/_locales/el/messages.json index f336695de..0076ca754 100644 --- a/src/drivers/webextension/_locales/el/messages.json +++ b/src/drivers/webextension/_locales/el/messages.json @@ -71,5 +71,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/es/messages.json b/src/drivers/webextension/_locales/es/messages.json index 741b88c9a..134f044cb 100644 --- a/src/drivers/webextension/_locales/es/messages.json +++ b/src/drivers/webextension/_locales/es/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/fa/messages.json b/src/drivers/webextension/_locales/fa/messages.json index c5b190c30..51bd2a555 100644 --- a/src/drivers/webextension/_locales/fa/messages.json +++ b/src/drivers/webextension/_locales/fa/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/fr/messages.json b/src/drivers/webextension/_locales/fr/messages.json index a0f34b1ed..23dcfd19f 100644 --- a/src/drivers/webextension/_locales/fr/messages.json +++ b/src/drivers/webextension/_locales/fr/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/gr/messages.json b/src/drivers/webextension/_locales/gr/messages.json index 4ea87768e..bb73d8c94 100644 --- a/src/drivers/webextension/_locales/gr/messages.json +++ b/src/drivers/webextension/_locales/gr/messages.json @@ -71,5 +71,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/id/messages.json b/src/drivers/webextension/_locales/id/messages.json index e0b350859..1d5f7c2f3 100644 --- a/src/drivers/webextension/_locales/id/messages.json +++ b/src/drivers/webextension/_locales/id/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/it/messages.json b/src/drivers/webextension/_locales/it/messages.json index 7fba4c39d..171cc6c32 100644 --- a/src/drivers/webextension/_locales/it/messages.json +++ b/src/drivers/webextension/_locales/it/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/pl/messages.json b/src/drivers/webextension/_locales/pl/messages.json index e6eb2720f..2e5b0df13 100644 --- a/src/drivers/webextension/_locales/pl/messages.json +++ b/src/drivers/webextension/_locales/pl/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/pt/messages.json b/src/drivers/webextension/_locales/pt/messages.json index 21918a376..896b8f91f 100644 --- a/src/drivers/webextension/_locales/pt/messages.json +++ b/src/drivers/webextension/_locales/pt/messages.json @@ -76,5 +76,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/pt_BR/messages.json b/src/drivers/webextension/_locales/pt_BR/messages.json index 085701851..86402cf1e 100644 --- a/src/drivers/webextension/_locales/pt_BR/messages.json +++ b/src/drivers/webextension/_locales/pt_BR/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/ro/messages.json b/src/drivers/webextension/_locales/ro/messages.json index 09ef0b8b5..14e832699 100644 --- a/src/drivers/webextension/_locales/ro/messages.json +++ b/src/drivers/webextension/_locales/ro/messages.json @@ -71,5 +71,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/ru/messages.json b/src/drivers/webextension/_locales/ru/messages.json index 5e165a189..9438baef7 100644 --- a/src/drivers/webextension/_locales/ru/messages.json +++ b/src/drivers/webextension/_locales/ru/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/sk/messages.json b/src/drivers/webextension/_locales/sk/messages.json index 96eec610c..b9ee93169 100644 --- a/src/drivers/webextension/_locales/sk/messages.json +++ b/src/drivers/webextension/_locales/sk/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/tr/messages.json b/src/drivers/webextension/_locales/tr/messages.json index 1c886d971..f7a1c98ec 100644 --- a/src/drivers/webextension/_locales/tr/messages.json +++ b/src/drivers/webextension/_locales/tr/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/uk/messages.json b/src/drivers/webextension/_locales/uk/messages.json index 2f99dbb8c..5f6b8089d 100644 --- a/src/drivers/webextension/_locales/uk/messages.json +++ b/src/drivers/webextension/_locales/uk/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/uz/messages.json b/src/drivers/webextension/_locales/uz/messages.json index ae5e62cdb..edd7df369 100644 --- a/src/drivers/webextension/_locales/uz/messages.json +++ b/src/drivers/webextension/_locales/uz/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/zh_CN/messages.json b/src/drivers/webextension/_locales/zh_CN/messages.json index 86ba50ca1..de4afab07 100644 --- a/src/drivers/webextension/_locales/zh_CN/messages.json +++ b/src/drivers/webextension/_locales/zh_CN/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "Containers" }, "categoryName61": { "message": "SaaS" }, "categoryName62": { "message": "PaaS" }, - "categoryName63": { "message": "IaaS" } + "categoryName63": { "message": "IaaS" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/_locales/zh_TW/messages.json b/src/drivers/webextension/_locales/zh_TW/messages.json index de64b78fc..b1213d6ef 100644 --- a/src/drivers/webextension/_locales/zh_TW/messages.json +++ b/src/drivers/webextension/_locales/zh_TW/messages.json @@ -75,5 +75,7 @@ "categoryName60": { "message": "容器" }, "categoryName61": { "message": "軟體即服務(SaaS)" }, "categoryName62": { "message": "平台即服務(PaaS)" }, - "categoryName63": { "message": "基礎設施即服務(IaaS)" } + "categoryName63": { "message": "基礎設施即服務(IaaS)" }, + "categoryName64": { "message": "Reverse Proxy" }, + "categoryName65": { "message": "Load Balancer" } } diff --git a/src/drivers/webextension/js/lib/iframe.js b/src/drivers/webextension/js/lib/iframe.js index 491d26257..1c65cf074 100644 --- a/src/drivers/webextension/js/lib/iframe.js +++ b/src/drivers/webextension/js/lib/iframe.js @@ -1,1142 +1,1183 @@ +'use strict'; +(function(win) { -(function (win) { - const exports = {}; - - (function (exports) { - const utils = { - normalizeUrl(url) { - return this.hashUrl(url) || null; - }, - - getReferrer() { - return this.normalizeUrl(document.referrer); - }, - - getPageUrl() { - return this.normalizeUrl(window.location.href); - }, - hashUrl(url) { - let a, - result; - - if (!url || url.indexOf('http') !== 0) { - return null; - } - - a = document.createElement('a'); - a.href = url; - - result = `${a.protocol}//${a.hostname}/`; - - if (a.pathname && a.pathname !== '/') { - result += this.hashCode(a.pathname); - } - - if (a.search) { - result += `?${this.hashCode(a.search)}`; - } - - if (a.hash) { - result += `#${this.hashCode(a.hash)}`; - } - - return result; - }, - - hashCode(str) { - let hash = 0, - kar, - i; - - if (str.length === 0) { - return hash; - } - - for (i = 0; i < str.length; i++) { - kar = str.charCodeAt(i); - hash = ((hash << 5) - hash) + kar; - hash &= hash; - } - - return hash + Math.pow(2, 32); - }, - - realArray(a) { - return Array.prototype.slice.apply(a); - }, - - onDocLoaded(doc, callback) { - if (doc.readyState === 'loading') { - doc.addEventListener('DOMContentLoaded', callback); - } else { - callback(); - } - }, - - SCRIPT_IN_WINDOW_TOP: window === window.top, - - isFriendlyWindow(win) { - let href; - try { - href = win.location.href; - } catch (e) { - return false; - } - return true; - }, - - elementWindow(el) { - return el.ownerDocument.defaultView; - }, - - viewport(win) { - return { width: win.innerWidth, height: win.innerHeight }; - }, - - parseQS(qs) { - if (qs.indexOf('http') === 0) { - qs = qs.split('?')[1]; - } - let i, - kvs, - key, - val; - const dict = {}; - qs = qs.split('&'); - for (i = 0; i < qs.length; i++) { - kvs = qs[i].split('='); - key = kvs[0]; - val = kvs.slice(1).join('='); - try { - dict[key] = window.decodeURIComponent(val); - } catch (e) { - continue; - } - } - return dict; - }, - sendToBackground(message, event, responseMessage, onResponse) { - if (typeof browser !== 'undefined') { - const response = browser.runtime.sendMessage(message); - response.then(onResponse); - } else if (typeof chrome !== 'undefined') { - chrome.runtime.sendMessage(message, onResponse); - } else if (window.self.port) { - window.self.port.on(responseMessage, onResponse); - window.self.port.emit(event, message); - } - }, - - askIfTrackingEnabled(callback, elseCallback) { - this.sendToBackground( - 'is_tracking_enabled', - '', - 'tracking_enabled_response', - (message) => { - if (message && message.tracking_enabled) { - callback(); - } else { - elseCallback(); - } - } - ); - }, - }; - - utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent); - utils.SCRIPT_IN_HOSTILE_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && !utils.SCRIPT_IN_FRIENDLY_IFRAME; - - function LogGenerator() { - this.msgNum = 0; - this.pageMeta = { - url: utils.getPageUrl(), - isHP: window.location.pathname === '/', - referrer: utils.getReferrer(), - rand: Math.floor(Math.random() * 10e12), - startTime: new Date().getTime(), - }; - } - - LogGenerator.prototype = { - log(event, opt_assets, opt_pageTags) { - let opt_video_assets; - if (event === 'video' || event === 'invalid-video') { - opt_video_assets = opt_assets || []; - opt_assets = []; - } else { - opt_video_assets = []; - opt_assets = opt_assets || []; - } - const result = { - doc: this.pageMeta, - event, - video_assets: opt_video_assets, - assets: opt_assets, - version: '3', - mrev: 'fe20291-c', - msgNum: this.msgNum, - timestamp: new Date().getTime(), - pageVis: document.visibilityState, - pageFoc: document.hasFocus(), - pageTags: opt_pageTags || [], - }; - this.msgNum++; - return result; - }, - }; - - utils.LogGenerator = LogGenerator; - - exports.utils = utils; - }(exports)); - - (function (exports) { - const SizeMatcher = { - VALID_AD_SIZES: [ - [300, 50], - [320, 50], - [160, 600], - [300, 250], - [300, 600], - [300, 1050], - [336, 280], - [336, 850], - [468, 60], - [728, 90], - [728, 250], - [728, 270], - [970, 66], - [970, 90], - [970, 125], - [970, 250], - [970, 400], - [970, 415], - [1280, 100], - ], - - PX_SIZE_TOL: 10, - - getMatchedAdSize(width, height) { - if (!this.set) { - this.set = this._makeSizeSet(); - } - - return this.set[`${Math.round(width)}x${Math.round(height)}`]; - }, - - elementIsAdShaped(el) { - return !!this.getMatchedAdSizeForElement(el); - }, - - getMatchedAdSizeForElement(el) { - const rect = el.getBoundingClientRect(); - return this.getMatchedAdSize(rect.width, rect.height); - }, - - _makeSizeSet() { - const set = {}; - let i; - let xfuz; - let yfuz; - let size; - let width; - let height; - - for (i = 0; i < this.VALID_AD_SIZES.length; i++) { - for (xfuz = -this.PX_SIZE_TOL; xfuz <= this.PX_SIZE_TOL; xfuz++) { - for (yfuz = -this.PX_SIZE_TOL; yfuz <= this.PX_SIZE_TOL; yfuz++) { - size = this.VALID_AD_SIZES[i]; - width = size[0] + xfuz; - height = size[1] + yfuz; - set[`${width}x${height}`] = size; - } - } - } - return set; - }, - }; - - const Throttler = { - MAX_SEARCHES_PER_WINDOW: 10, - MAX_SEARCHES_PER_ELEMENT: 2, - - countSearch(el) { - if (typeof el.searches !== 'number') { - el.searches = 0; - } - - el.searches += 1; - }, - - throttle(el, max) { - if (typeof el.searches === 'number' && el.searches >= max) { - return true; - } - return false; - }, - - throttleElement(el) { - return this.throttle(el, this.MAX_SEARCHES_PER_ELEMENT); - }, - - throttleWin(win) { - return this.throttle(win, this.MAX_SEARCHES_PER_WINDOW); - }, - - getCount(el) { - return el.searches || 0; - }, - }; - - function TopSearcher(win) { - this.win = win; - this.doc = win.document; - } - - TopSearcher.prototype.search = function () { - let candidates = exports.utils.realArray(this.doc.querySelectorAll('img, object, embed')), - html5Ad, - ads = []; - - ads = ads.concat(candidates.filter((el) => { - if (!el.mpAdFound && !Throttler.throttleElement(el)) { - Throttler.countSearch(el); - if ((el.tagName !== 'IMG' || isStandardImage(el)) && SizeMatcher.elementIsAdShaped(el)) { - el.mpAdFound = true; - return true; - } - } - return false; - })); - - html5Ad = this._mainGetHTMLAd(); - if (html5Ad) { - html5Ad.html5 = true; - html5Ad.mpAdFound = true; - ads.push(html5Ad); - } - - return ads; - }; - - TopSearcher.prototype._mainGetHTMLAd = function () { - let styles = this.doc.querySelectorAll('div > style, div > link[rel="stylesheet"]'), - i, - div; - for (i = 0; i < styles.length; i++) { - div = styles[i].parentNode; - if (!div.mpAdFound && SizeMatcher.elementIsAdShaped(div) && this._jumpedOut(div)) { - return div; - } - } - }; - - TopSearcher.prototype._jumpedOut = function (el) { - let siblings, - ifrs; - siblings = exports.utils.realArray(el.parentNode.children); - ifrs = siblings.filter(el => el.tagName === 'IFRAME' && el.offsetWidth === 0 && el.offsetHeight === 0); - return ifrs.length > 0; - }; - - function IframeSearcher(win) { - this.MIN_AD_AREA = 14000; - this.MIN_WINDOW_PX = 10; - - this.win = win; - this.doc = win.document; - this.body = win.document.body; - this.winClickTag = win.clickTag; - this.adSizeMeta = this._getAdSizeMeta(); - this.numElementsInBody = (this.body && this.body.querySelectorAll('*').length) || 0; - - this.shouldSearchWindow = false; - if (!this.win.mpAdFound && this.body && !Throttler.throttleWin(this.win)) { - this.winWidth = this.win.innerWidth; - this.winHeight = this.win.innerHeight; - if (this._meetsMinAdSize(this.winWidth, this.winHeight) && !this._containsLargeIframes()) { - this.shouldSearchWindow = true; - } - } - } - - IframeSearcher.prototype.search = function () { - let ad; - - if (this.shouldSearchWindow) { - ad = this._search(); - if (ad) { - ad.mpAdFound = true; - win.mpAdFound = true; - return ad; - } - Throttler.countSearch(this.win); - } - - return null; - }; - - IframeSearcher.prototype._search = function () { - let _this = this, - stdCandidates, - html5Candidates, - stdEl, - html5El; - - stdCandidates = this.body.querySelectorAll('img, object, embed'); - - stdEl = getFirst(stdCandidates, (el) => { - if (!el.mpAdFound - && !Throttler.throttleElement(el) - && (el.tagName !== 'IMG' || isStandardImage(el)) - && _this._elementIsAtLeastAsBigAsWindow(el)) { - return true; - } - Throttler.countSearch(el); - return false; - }); - - if (stdEl) { - return stdEl; - } - - if (this._isHTML5Iframe()) { - html5Candidates = this.doc.querySelectorAll('body, canvas, button, video, svg, div'); - html5El = getFirst(html5Candidates, (el) => { - if (_this._elementIsAtLeastAsBigAsWindow(el)) { - return true; - } - Throttler.countSearch(el); - return false; - }); - } - - if (html5El) { - html5El.html5 = true; - html5El.winClickTag = this.winClickTag; - html5El.adSizeMeta = this.adSizeMeta; - return html5El; - } - - return null; - }; - - IframeSearcher.prototype._isHTML5Iframe = function () { - if (this.winClickTag || this.adSizeMeta) { - return true; - } - - if (this.doc.querySelectorAll('canvas', 'button', 'video', 'svg').length > 0) { - return true; - } - - if (this.numElementsInBody >= 5 && Throttler.getCount(this.win) > 0 && this.doc.querySelectorAll('div').length > 0) { - return true; - } - - return false; - }; - - IframeSearcher.prototype._elementIsAtLeastAsBigAsWindow = function (el) { - let rect = el.getBoundingClientRect(), - tol = 0.95; - - return rect.width >= (tol * this.winWidth) && rect.height >= (tol * this.winHeight); - }; - - IframeSearcher.prototype._meetsMinAdSize = function (width, height) { - return (width * height) >= this.MIN_AD_AREA; - }; - - IframeSearcher.prototype._containsLargeIframes = function () { - const iframes = this.doc.querySelectorAll('iframe'); - let rect; - let i; - for (i = 0; i < iframes.length; i++) { - rect = iframes[i].getBoundingClientRect(); - if (rect.width > this.MIN_WINDOW_PX || rect.height > this.MIN_WINDOW_PX) { - return true; - } - } - return false; - }; - - IframeSearcher.prototype._getAdSizeMeta = function () { - const adSizeMeta = this.doc.querySelectorAll('meta[name="ad.size"]'); - if (adSizeMeta.length > 0) { - return adSizeMeta[0].content; - } - return null; - }; - - function getFirst(arr, testFn) { - let i, - el; - for (i = 0; i < arr.length; i++) { - el = arr[i]; - if (testFn(el)) { - return el; - } - } - return null; - } - - function isStandardImage(img) { - return img.src && (img.parentNode.tagName === 'A' || img.getAttribute('onclick')); - } - - function getFriendlyIframes(win) { - let iframes = win.document.querySelectorAll('iframe'); - iframes = exports.utils.realArray(iframes); - const friendlyIframes = iframes.filter(ifr => exports.utils.isFriendlyWindow(ifr.contentWindow)); - return friendlyIframes; - } - - function findAds(win) { - let i, - iframes, - searcher, - ad, - ads = []; - - if (win === win.top) { - searcher = new TopSearcher(win); - ads = ads.concat(searcher.search()); - } else { - searcher = new IframeSearcher(win); - ad = searcher.search(); - if (ad) { - ads.push(ad); - } - } - - iframes = getFriendlyIframes(win); - for (i = 0; i < iframes.length; i++) { - ads = ads.concat(findAds(iframes[i].contentWindow)); - } - - return ads; - } - - exports.adfinder = { - getMatchedAdSize: SizeMatcher.getMatchedAdSize.bind(SizeMatcher), - findAds, - }; - }(exports)); - - (function (exports) { - const parser = { - TAGS_WITH_SRC_ATTR: { - IMG: true, - SCRIPT: true, - IFRAME: true, - EMBED: true, - }, - - MAX_ATTR_LEN: 100, - - getUrl(el, params) { - let url; - - if (this.TAGS_WITH_SRC_ATTR.hasOwnProperty(el.tagName)) { - url = el.src; - } else if (el.tagName === 'OBJECT') { - url = el.data || (params && params.movie) || null; - } else if (el.tagName === 'A') { - url = el.href; - } - - if (url && url.indexOf('http') === 0) { - return url; - } - return null; - }, - - getParams(el) { - if (el.tagName !== 'OBJECT') { - return null; - } - - let i, - child; - const params = {}; - const children = el.children; - for (i = 0; i < children.length; i++) { - child = children[i]; - if (child.tagName === 'PARAM' && child.name) { - params[child.name.toLowerCase()] = child.value; - } - } - return params; - }, - - getPosition(el) { - const rect = el.getBoundingClientRect(); - const win = exports.utils.elementWindow(el); - - return { - width: Math.round(rect.width), - height: Math.round(rect.height), - left: Math.round(rect.left + win.pageXOffset), - top: Math.round(rect.top + win.pageYOffset), - }; - }, - - getFlashvars(el, params, url) { - let flashvars; - const urlQS = url && url.split('?')[1]; - - if (el.tagName === 'EMBED') { - flashvars = el.getAttribute('flashvars') || urlQS; - } else if (el.tagName === 'OBJECT') { - flashvars = params.flashvars || el.getAttribute('flashvars') || urlQS; - } - - return (flashvars && exports.utils.parseQS(flashvars)) || null; - }, - - findClickThru(el, flashvars) { - let key; - if (el.tagName === 'IMG' && el.parentElement.tagName === 'A') { - return el.parentElement.href; - } if (flashvars) { - for (key in flashvars) { - if (flashvars.hasOwnProperty(key)) { - if (key.toLowerCase().indexOf('clicktag') === 0) { - return flashvars[key]; - } - } - } - } - return null; - }, - - getAttr(el, name) { - const val = el.getAttribute(name); - - if (val && val.slice && val.toString) { - return val.slice(0, this.MAX_ATTR_LEN).toString(); - } - return null; - }, - - putPropIfExists(obj, name, val) { - if (val) { - obj[name] = val; - } - }, - - putAttrIfExists(obj, el, name) { - const val = this.getAttr(el, name); - this.putPropIfExists(obj, name, val); - }, - - elementToJSON(el, opt_findClickThru) { - const pos = this.getPosition(el); - const params = this.getParams(el); - const url = this.getUrl(el, params); - const flashvars = this.getFlashvars(el, params, url); - const clickThru = opt_findClickThru && this.findClickThru(el, flashvars); - const json = { - tagName: el.tagName, - width: pos.width, - height: pos.height, - left: pos.left, - top: pos.top, - children: [], - }; - - if (params) { - delete params.flashvars; - } - - this.putAttrIfExists(json, el, 'id'); - this.putAttrIfExists(json, el, 'class'); - this.putAttrIfExists(json, el, 'name'); - - this.putPropIfExists(json, 'flashvars', flashvars); - this.putPropIfExists(json, 'url', url); - this.putPropIfExists(json, 'params', params); - this.putPropIfExists(json, 'clickThru', clickThru); - - return json; - }, - }; - - exports.parser = { elementToJSON: parser.elementToJSON.bind(parser) }; - }(exports)); - - (function (exports) { - const ContextManager = function (adData) { - this.adData = adData; - }; - - ContextManager.prototype = { - CONTAINER_SIZE_TOL: 0.4, - ASPECT_RATIO_FOR_LEADERBOARDS: 2, - - isValidContainer(el, opt_curWin) { - const cWidth = el.clientWidth; - const cHeight = el.clientHeight; - - const adWidth = this.adData.width; - const adHeight = this.adData.height; - - const winWidth = opt_curWin && opt_curWin.innerWidth; - const winHeight = opt_curWin && opt_curWin.innerHeight; - const similarWin = opt_curWin && this.withinTol(adWidth, winWidth) && this.withinTol(adHeight, winHeight); - - const similarSizeX = this.withinTol(adWidth, cWidth); - const similarSizeY = this.withinTol(adHeight, cHeight); - const adAspect = adWidth / adHeight; - - return similarWin || el.tagName === 'A' || (adAspect >= this.ASPECT_RATIO_FOR_LEADERBOARDS && similarSizeY) || (similarSizeX && similarSizeY); - }, - - withinTol(adlen, conlen) { - const pct = (conlen - adlen) / adlen; - - return pct <= this.CONTAINER_SIZE_TOL; - }, - - serializeElements(el) { - if (!el) { - return; - } - let i; - let ifrWin; - const adId = this.adData.adId; - let elIsAd = false; - - if (adId && el[adId] && el[adId].isAd === true) { - elIsAd = true; - } - - const json = exports.parser.elementToJSON(el, elIsAd); - let childJSON; - - if (elIsAd) { - json.adId = adId; - this.adData.element = {}; - - const keys = Object.keys(json); - for (i = 0; i < keys.length; i++) { - const key = keys[i]; - if (key !== 'children' && key !== 'contents') { - this.adData.element[key] = json[key]; - } - } - } - - const children = exports.utils.realArray(el.children).filter((el) => { - const param = el.tagName === 'PARAM'; - const inlineScript = el.tagName === 'SCRIPT' && !(el.src && el.src.indexOf('http') >= 0); - const noScript = el.tagName === 'NOSCRIPT'; - return !(param || inlineScript || noScript); - }); - - for (i = 0; i < children.length; i++) { - childJSON = this.serializeElements(children[i]); - if (childJSON) { - json.children.push(childJSON); - } - } - - if (el.tagName === 'IFRAME') { - ifrWin = el.contentWindow; - - if (adId && el[adId] && el[adId].needsWindow) { - json.contents = this.adData.serializedIframeContents; - el[adId].needsWindow = false; - delete this.adData.serializedIframeContents; - } else if (exports.utils.isFriendlyWindow(ifrWin)) { - childJSON = this.serializeElements(ifrWin.document.documentElement); - if (childJSON) { - json.contents = childJSON; - } - } - } - - if (json.children.length > 0 || json.adId || json.tagName === 'IFRAME' || json.url) { - return json; - } - return null; - }, - - captureHTML(containerEl) { - this.adData.context = this.serializeElements(containerEl); - }, - - nodeCount(el) { - return el.getElementsByTagName('*').length + 1; - }, - - highestContainer(curWin, referenceElement) { - let curContainer = referenceElement; - const docEl = curWin.document.documentElement; - let parentContainer; - - if (curWin !== curWin.top && this.isValidContainer(docEl, curWin)) { - return docEl; - } - - while (true) { - parentContainer = curContainer.parentElement; - if (parentContainer && this.isValidContainer(parentContainer)) { - curContainer = parentContainer; - } else { - return curContainer; - } - } - }, - }; - - const tagfinder = { - - setPositions(adData, opt_el, opt_winPos) { - const el = opt_el || adData.context; - const winPos = opt_winPos || { left: 0, top: 0 }; - let ifrPos; - - el.left += winPos.left; - el.top += winPos.top; - - if (el.children) { - el.children.forEach(function (child) { - this.setPositions(adData, child, winPos); - }, this); - } - - if (el.contents) { - ifrPos = { left: el.left, top: el.top }; - this.setPositions(adData, el.contents, ifrPos); - } - - if (el.adId === adData.adId) { - adData.element.left = el.left; - adData.element.top = el.top; - } - }, - - appendTags(adData, referenceElement) { - const mgr = new ContextManager(adData); - let curWin = exports.utils.elementWindow(referenceElement); - let highestContainer; - - while (true) { - highestContainer = mgr.highestContainer(curWin, referenceElement); - mgr.captureHTML(highestContainer); - if (curWin === curWin.top) { - break; - } else { - curWin.mpAdFound = true; - - mgr.adData.serializedIframeContents = mgr.adData.context; - - if (exports.utils.isFriendlyWindow(curWin.parent)) { - referenceElement = curWin.frameElement; - referenceElement[mgr.adData.adId] = { needsWindow: true }; - curWin = curWin.parent; - } else { - break; - } - } - } - return { - referenceElement, - highestContainer, - }; - }, - }; - - exports.tagfinder = tagfinder; - }(exports)); - - (function (exports) { - let _onAdFound; - const _logGen = new exports.utils.LogGenerator(); - let _pageTags; - const INIT_MS_BW_SEARCHES = 2000; - const PAGE_TAG_RE = new RegExp('gpt|oascentral'); - const POST_MSG_ID = '1532387537-31575-24732-11173-32339'; - const AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)'); - - function getPageTags(doc) { - let scripts = doc.getElementsByTagName('script'); - const pageTags = []; - scripts = exports.utils.realArray(scripts); - scripts.forEach((script) => { - if (PAGE_TAG_RE.exec(script.src)) { - pageTags.push({ tagName: 'SCRIPT', url: script.src }); - } - }); - return pageTags; - } - - function messageAllParentFrames(adData) { - adData.postMessageId = POST_MSG_ID; - - adData = JSON.stringify(adData); - - let win = window; - while (win !== win.top) { - win = win.parent; - win.postMessage(adData, win.location.href); - } - } - - function appendTagsAndSendToParent(adData, referenceElement) { - const results = exports.tagfinder.appendTags(adData, referenceElement); - if (exports.utils.SCRIPT_IN_HOSTILE_IFRAME) { - messageAllParentFrames(adData); - } else if (exports.utils.SCRIPT_IN_WINDOW_TOP) { - exports.tagfinder.setPositions(adData); - - adData.matchedSize = exports.adfinder.getMatchedAdSize(adData.width, adData.height); - if (!adData.matchedSize) { - if (AD_SERVER_RE.exec(results.referenceElement.id)) { - adData.matchedSize = [adData.width, adData.height]; - adData.oddSize = true; - } else { - return; - } - } - delete adData.width; - delete adData.height; - adData.curPageUrl = exports.utils.getPageUrl(); - _pageTags = _pageTags || getPageTags(document); - const log = _logGen.log('ad', [adData], _pageTags); - - if (_onAdFound) { - _onAdFound(log, results.referenceElement); - } - } - } - - function extractAdsWrapper() { - if (exports.utils.SCRIPT_IN_WINDOW_TOP || document.readyState === 'complete') { - extractAds(); - } - setTimeout( - () => { extractAdsWrapper(); }, INIT_MS_BW_SEARCHES, - ); - } - - function extractAds() { - const ads = exports.adfinder.findAds(window); - ads.forEach((ad) => { - const startTime = new Date().getTime(); - const adId = `${startTime}-${Math.floor(Math.random() * 10e12)}`; - - const adData = { - width: Math.round(ad.offsetWidth), - height: Math.round(ad.offsetHeight), - startTime, - adId, - html5: ad.html5 || false, - }; - - if (ad.html5) { - adData.adSizeMeta = ad.adSizeMeta || null; - adData.winClickTag = ad.winClickTag || null; - } - - ad[adId] = { isAd: true }; - - appendTagsAndSendToParent(adData, ad); - }); - } - - function isChildWin(myWin, otherWin) { - let parentWin = otherWin.parent; - while (parentWin !== otherWin) { - if (parentWin === myWin) { - return true; - } - otherWin = parentWin; - parentWin = parentWin.parent; - } - return false; - } - - function iframeFromWindow(win, winToMatch) { - let i, - ifr, - ifrWin, - iframes = win.document.querySelectorAll('iframe'); - - for (i = 0; i < iframes.length; i++) { - ifr = iframes[i]; - if (ifr.contentWindow === winToMatch) { - return ifr; - } - } - - for (i = 0; i < iframes.length; i++) { - ifrWin = iframes[i].contentWindow; - if (exports.utils.isFriendlyWindow(ifrWin)) { - ifr = iframeFromWindow(ifrWin, winToMatch); - if (ifr) { - return ifr; - } - } - } - } - - function onPostMessage(event) { - let adData, - ifrWin = event.source, - - myWin = window.document.defaultView, - ifrTag; - - try { - adData = JSON.parse(event.data); - } catch (e) { - return; - } - - if (!adData) return; - - if (adData.postMessageId === POST_MSG_ID) { - delete adData.postMessageId; - - event.stopImmediatePropagation(); - - if (isChildWin(myWin, ifrWin)) { - if (exports.utils.isFriendlyWindow(ifrWin)) { - ifrTag = ifrWin.frameElement; - } else { - ifrTag = iframeFromWindow(myWin, ifrWin); - } - - if (ifrTag) { - ifrTag[adData.adId] = { needsWindow: true }; - appendTagsAndSendToParent(adData, ifrTag); - } - } - } - } - - function onVideoMessage(msg, sender, callback) { - let log; - if (msg.event === 'new-video-ad') { - msg.assets.forEach((asset) => { - - }); - log = _logGen.log('video', msg.assets); - } else { - log = _logGen.log('invalid-video', msg.assets); - } - - msg.assets.forEach((a) => { delete a.isVideo; }); - log.displayAdFound = msg.displayAdFound; - log.requests = msg.requests; - log.data = msg.event_data; - - log.doc.finalPageUrl = log.doc.url; - log.doc.url = exports.utils.normalizeUrl(msg.origUrl); - - _onAdFound(log); - } - - function addBackgroundListener(event, callback) { - if (typeof browser !== 'undefined') { - browser.runtime.onMessage.addListener((msg) => { - if (msg.event === event) { - callback(msg); - } - }); - } else if (typeof chrome !== 'undefined') { - chrome.runtime.onMessage.addListener((msg) => { - if (msg.event === event) { - callback(msg); - } - }); - } else if (window.self.port) { - window.self.port.on(event, callback); - } - } - - exports.coordinator = { - addPostMessageListener() { - if (!exports.utils.SCRIPT_IN_FRIENDLY_IFRAME) { - window.addEventListener('message', onPostMessage, false); - } - }, - - blockedRobotsMsgGen(sendFcn, origUrl) { - if (origUrl.indexOf('google.com/_/chrome/newtab') === -1) { - const onBlockedRobotsMessage = function () { - let log; - log = _logGen.log('invalid-robotstxt', []); - log.doc.finalPageUrl = log.doc.url; - log.doc.url = exports.utils.normalizeUrl(origUrl); - - sendFcn(log); - }; - return onBlockedRobotsMessage; - } - return function () {}; - }, - - init(onAdFound) { - if (exports.utils.SCRIPT_IN_FRIENDLY_IFRAME) { - return false; - } - - _onAdFound = onAdFound; - if (exports.utils.SCRIPT_IN_WINDOW_TOP) { - const log = _logGen.log('page'); - onAdFound(log); - - window.addEventListener('beforeunload', (event) => { - const log = _logGen.log('unload'); - log.timing = window.performance.timing; - onAdFound(log); - }); - - addBackgroundListener('new-video-ad', onVideoMessage); - addBackgroundListener('new-invalid-video-ad', onVideoMessage); - } - - exports.utils.onDocLoaded(document, extractAdsWrapper); - }, - }; - }(exports)); - - if (exports.utils.SCRIPT_IN_WINDOW_TOP) { - window.adparser = { - init: exports.coordinator.init, - addPostMessageListener: exports.coordinator.addPostMessageListener, - askIfTrackingEnabled: exports.utils.askIfTrackingEnabled, - blockedRobotsMsgGen: exports.coordinator.blockedRobotsMsgGen, - inWindowTop: exports.utils.SCRIPT_IN_WINDOW_TOP, - sendToBackground: exports.utils.sendToBackground, - }; - } else { - exports.coordinator.addPostMessageListener(); - exports.utils.askIfTrackingEnabled( - () => { - exports.coordinator.init(() => {}); - }, - () => {}, - ); - } -}(window)); -(function (adparser, pageUrl) { - function onAdFound(log) { - adparser.sendToBackground({ id: 'ad_log', subject: log }, 'ad_log', '', () => {}); - } - - if (adparser && adparser.inWindowTop) { - adparser.addPostMessageListener(); - adparser.askIfTrackingEnabled( - () => { - adparser.init(onAdFound); - }, - adparser.blockedRobotsMsgGen(onAdFound, pageUrl), - ); - } -}(window.adparser, window.location.href)); +var exports = {}; + +(function(exports) { + + var port = browser.runtime.connect({name:"adparser"}); + var utils = { + normalizeUrl: function(url) { + + return this.hashUrl(url) || null; + + }, + + getReferrer: function() { + return this.normalizeUrl(document.referrer); + }, + + getPageUrl: function() { + return this.normalizeUrl(window.location.href); + }, + hashUrl: function(url) { + var a, + result; + + if ( !url || url.indexOf('http') !== 0 ) { + return null; + } + + a = document.createElement('a'); + a.href = url; + + result = a.protocol + '//' + a.hostname + '/'; + + if ( a.pathname && a.pathname !== '/' ) { + result += this.hashCode(a.pathname); + } + + if ( a.search ) { + result += '?' + this.hashCode(a.search); + } + + if ( a.hash ) { + result += '#' + this.hashCode(a.hash); + } + + return result; + }, + + hashCode: function(str) { + var hash = 0, + kar, + i; + + if ( str.length === 0 ) { + return hash; + } + + for ( i = 0; i < str.length; i++ ) { + kar = str.charCodeAt(i); + hash = ((hash << 5) - hash) + kar; + hash = hash & hash; + } + + return hash + Math.pow(2, 32); + }, + + realArray: function(a) { + return Array.prototype.slice.apply(a); + }, + + onDocLoaded: function(doc, callback) { + if ( doc.readyState === 'loading' ) { + doc.addEventListener('DOMContentLoaded', callback); + } else { + callback(); + } + }, + + SCRIPT_IN_WINDOW_TOP: window === window.top, + + isFriendlyWindow: function(win) { + + var href; + try { + href = win.location.href; + } catch(e) { + return false; + } + return true; + }, + + elementWindow: function(el) { + return el.ownerDocument.defaultView; + }, + + viewport: function(win) { + return {width: win.innerWidth, height: win.innerHeight}; + }, + + parseQS: function(qs) { + if ( qs.indexOf('http') === 0 ) { + qs = qs.split('?')[1]; + } + var i, kvs, key, val; + var dict = {}; + qs = qs.split('&'); + for ( i = 0; i < qs.length; i++ ) { + kvs = qs[i].split('='); + key = kvs[0]; + val = kvs.slice(1).join('='); + try { + dict[key] = window.decodeURIComponent(val); + } catch (e) { + + continue; + } + } + return dict; + }, + sendToBackground: function(message, event, responseMessage) { + if ( typeof browser !== 'undefined' || typeof chrome !== 'undefined' ) { + port.postMessage(message); + } else if ( window.self.port ) { + window.self.port.on(responseMessage, onResponse); + window.self.port.emit(event, message); + } + }, + + askIfTrackingEnabled: function(callback, elseCallback) { + utilCallback = callback; + utilElseCallback = elseCallback; + + this.sendToBackground( + 'is_tracking_enabled', + '', + 'tracking_enabled_response' + ); + + } + }; + + port.onMessage.addListener((message) => { + if ( message && message.tracking_enabled ) { + + utilCallback(); + } else { + + utilElseCallback(); + } + }); + + utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent); + utils.SCRIPT_IN_HOSTILE_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && !utils.SCRIPT_IN_FRIENDLY_IFRAME; + + function LogGenerator() { + this.msgNum = 0; + this.pageMeta = { + 'url': utils.getPageUrl(), + 'isHP': window.location.pathname === '/', + 'referrer': utils.getReferrer(), + 'rand': Math.floor(Math.random() * 10e12), + 'startTime': new Date().getTime() + }; + } + + LogGenerator.prototype = { + log: function(event, opt_assets, opt_pageTags) { + var opt_video_assets; + if ( event === 'video' || event === 'invalid-video' ) { + opt_video_assets = opt_assets || []; + opt_assets = []; + } else { + opt_video_assets = []; + opt_assets = opt_assets || []; + } + var result = { + doc: this.pageMeta, + event: event, + video_assets: opt_video_assets, + assets: opt_assets, + version: '3', + mrev: 'dfd96a9-d', + msgNum: this.msgNum, + timestamp: new Date().getTime(), + pageVis: document.visibilityState, + pageFoc: document.hasFocus(), + pageTags: opt_pageTags || [] + }; + this.msgNum++; + return result; + } + }; + + utils.LogGenerator = LogGenerator; + + let utilCallback, utilElseCallback; + + exports.utils = utils; +})(exports); + +(function(exports) { + + var SizeMatcher = { + VALID_AD_SIZES: [ + [300, 50], + [320, 50], + [160, 600], + [300, 250], + [300, 600], + [300, 1050], + [336, 280], + [336, 850], + [468, 60], + [728, 90], + [728, 250], + [728, 270], + [970, 66], + [970, 90], + [970, 125], + [970, 250], + [970, 400], + [970, 415], + [1280, 100] + ], + + PX_SIZE_TOL: 10, + + getMatchedAdSize: function(width, height) { + + if ( !this.set ) { + this.set = this._makeSizeSet(); + } + + return this.set[Math.round(width) + 'x' + Math.round(height)]; + }, + + elementIsAdShaped: function(el) { + return !!this.getMatchedAdSizeForElement(el); + }, + + getMatchedAdSizeForElement: function(el) { + var rect = el.getBoundingClientRect(); + return this.getMatchedAdSize(rect.width, rect.height); + }, + + _makeSizeSet: function() { + var set = {}; + var i; + var xfuz; + var yfuz; + var size; + var width; + var height; + + for ( i = 0; i < this.VALID_AD_SIZES.length; i++ ) { + for ( xfuz = -this.PX_SIZE_TOL; xfuz <= this.PX_SIZE_TOL; xfuz++ ) { + for ( yfuz = -this.PX_SIZE_TOL; yfuz <= this.PX_SIZE_TOL; yfuz++ ) { + size = this.VALID_AD_SIZES[i]; + width = size[0] + xfuz; + height = size[1] + yfuz; + set[width + 'x' + height] = size; + } + } + } + return set; + } + }; + + var Throttler = { + MAX_SEARCHES_PER_WINDOW: 10, + MAX_SEARCHES_PER_ELEMENT: 2, + + countSearch: function(el) { + if ( typeof el.searches !== 'number' ) { + el.searches = 0; + } + + el.searches += 1; + }, + + throttle: function(el, max) { + if ( typeof el.searches === 'number' && el.searches >= max ) { + return true; + } + return false; + }, + + throttleElement: function(el) { + return this.throttle(el, this.MAX_SEARCHES_PER_ELEMENT); + }, + + throttleWin: function(win) { + return this.throttle(win, this.MAX_SEARCHES_PER_WINDOW); + }, + + getCount: function(el) { + return el.searches || 0; + } + }; + + function TopSearcher(win) { + this.win = win; + this.doc = win.document; + } + + TopSearcher.prototype.search = function() { + var candidates = exports.utils.realArray(this.doc.querySelectorAll('img, object, embed')), + html5Ad, + ads = []; + + ads = ads.concat(candidates.filter(function(el) { + if ( !el.mpAdFound && !Throttler.throttleElement(el) ) { + Throttler.countSearch(el); + if ( (el.tagName !== 'IMG' || isStandardImage(el)) && SizeMatcher.elementIsAdShaped(el) ) { + el.mpAdFound = true; + return true; + } + } + return false; + })); + + html5Ad = this._mainGetHTMLAd(); + if ( html5Ad ) { + html5Ad.html5 = true; + html5Ad.mpAdFound = true; + ads.push(html5Ad); + } + + return ads; + }; + + TopSearcher.prototype._mainGetHTMLAd = function() { + var styles = this.doc.querySelectorAll('div > style, div > link[rel="stylesheet"]'), + i, div; + for ( i = 0; i < styles.length; i++ ) { + div = styles[i].parentNode; + if ( !div.mpAdFound && SizeMatcher.elementIsAdShaped(div) && this._jumpedOut(div) ) { + return div; + } + } + }; + + TopSearcher.prototype._jumpedOut = function(el) { + var siblings, ifrs; + siblings = exports.utils.realArray(el.parentNode.children); + ifrs = siblings.filter(function(el) { + return el.tagName === 'IFRAME' && el.offsetWidth === 0 && el.offsetHeight === 0; + }); + return ifrs.length > 0; + }; + + function IframeSearcher(win) { + this.MIN_AD_AREA = 14000; + this.MIN_WINDOW_PX = 10; + + this.win = win; + this.doc = win.document; + this.body = win.document.body; + this.winClickTag = win.clickTag; + this.adSizeMeta = this._getAdSizeMeta(); + this.numElementsInBody = (this.body && this.body.querySelectorAll('*').length) || 0; + + this.shouldSearchWindow = false; + if ( !this.win.mpAdFound && this.body && !Throttler.throttleWin(this.win) ) { + this.winWidth = this.win.innerWidth; + this.winHeight = this.win.innerHeight; + if ( this._meetsMinAdSize(this.winWidth, this.winHeight) && !this._containsLargeIframes() ) { + this.shouldSearchWindow = true; + } + } + + } + + IframeSearcher.prototype.search = function() { + var ad; + + if ( this.shouldSearchWindow ) { + ad = this._search(); + if ( ad ) { + ad.mpAdFound = true; + win.mpAdFound = true; + return ad; + } + Throttler.countSearch(this.win); + } + + return null; + }; + + IframeSearcher.prototype._search = function() { + var _this = this, + stdCandidates, + html5Candidates, + stdEl, + html5El; + + stdCandidates = this.body.querySelectorAll('img, object, embed'); + + stdEl = getFirst(stdCandidates, function(el) { + if ( !el.mpAdFound && + !Throttler.throttleElement(el) && + (el.tagName !== 'IMG' || isStandardImage(el)) && + _this._elementIsAtLeastAsBigAsWindow(el)) + { + return true; + } + Throttler.countSearch(el); + return false; + }); + + if ( stdEl ) { + return stdEl; + } + + if ( this._isHTML5Iframe() ) { + html5Candidates = this.doc.querySelectorAll('body, canvas, button, video, svg, div'); + html5El = getFirst(html5Candidates, function(el) { + + if ( _this._elementIsAtLeastAsBigAsWindow(el) ) { + return true; + } + Throttler.countSearch(el); + return false; + }); + } + + if ( html5El ) { + html5El.html5 = true; + html5El.winClickTag = this.winClickTag; + html5El.adSizeMeta = this.adSizeMeta; + return html5El; + } + + return null; + }; + + IframeSearcher.prototype._isHTML5Iframe = function() { + if ( this.winClickTag || this.adSizeMeta ) { + return true; + } + + if ( this.doc.querySelectorAll('canvas', 'button', 'video', 'svg').length > 0 ) { + return true; + } + + if ( this.numElementsInBody >= 5 && Throttler.getCount(this.win) > 0 && this.doc.querySelectorAll('div').length > 0 ) { + return true; + } + + return false; + }; + + IframeSearcher.prototype._elementIsAtLeastAsBigAsWindow = function(el) { + var rect = el.getBoundingClientRect(), + tol = 0.95; + + return rect.width >= (tol * this.winWidth) && rect.height >= (tol * this.winHeight); + }; + + IframeSearcher.prototype._meetsMinAdSize = function(width, height) { + return (width * height) >= this.MIN_AD_AREA; + }; + + IframeSearcher.prototype._containsLargeIframes = function() { + var iframes = this.doc.querySelectorAll('iframe'); + var rect; + var i; + for ( i = 0; i < iframes.length; i++ ) { + rect = iframes[i].getBoundingClientRect(); + if ( rect.width > this.MIN_WINDOW_PX || rect.height > this.MIN_WINDOW_PX ) { + return true; + } + } + return false; + }; + + IframeSearcher.prototype._getAdSizeMeta = function() { + var adSizeMeta = this.doc.querySelectorAll('meta[name="ad.size"]'); + if ( adSizeMeta.length > 0 ) { + return adSizeMeta[0].content; + } else { + return null; + } + }; + + function getFirst(arr, testFn) { + var i, el; + for ( i = 0; i < arr.length; i++ ) { + el = arr[i]; + if ( testFn(el) ) { + return el; + } + } + return null; + } + + function isStandardImage(img) { + + return img.src && (img.parentNode.tagName === 'A' || img.getAttribute('onclick')); + } + + function getFriendlyIframes(win) { + var iframes = win.document.querySelectorAll('iframe'); + iframes = exports.utils.realArray(iframes); + var friendlyIframes = iframes.filter(function(ifr) { + return exports.utils.isFriendlyWindow(ifr.contentWindow); + }); + return friendlyIframes; + } + + function findAds(win) { + var i, + iframes, + searcher, + ad, + ads = []; + + if ( win === win.top ) { + searcher = new TopSearcher(win); + ads = ads.concat(searcher.search()); + } else { + searcher = new IframeSearcher(win); + ad = searcher.search(); + if ( ad ) { + ads.push(ad); + } + } + + iframes = getFriendlyIframes(win); + for ( i = 0; i < iframes.length; i++ ) { + ads = ads.concat(findAds(iframes[i].contentWindow)); + } + + return ads; + } + + exports.adfinder = { + getMatchedAdSize: SizeMatcher.getMatchedAdSize.bind(SizeMatcher), + findAds: findAds + }; +})(exports); + +(function(exports) { + + var parser = { + TAGS_WITH_SRC_ATTR: { + 'IMG': true, + 'SCRIPT': true, + 'IFRAME': true, + 'EMBED': true + }, + + MAX_ATTR_LEN: 100, + + getUrl: function(el, params) { + var url; + + if ( this.TAGS_WITH_SRC_ATTR.hasOwnProperty(el.tagName) ) { + url = el.src; + + } else if ( el.tagName === 'OBJECT' ) { + url = el.data || (params && params.movie) || null; + + } else if ( el.tagName === 'A' ) { + url = el.href; + } + + if ( url && url.indexOf('http') === 0 ) { + return url; + } else { + return null; + } + }, + + getParams: function(el) { + if ( el.tagName !== 'OBJECT' ) { + return null; + } + + var i, child; + var params = {}; + var children = el.children; + for ( i = 0; i < children.length; i++ ) { + child = children[i]; + if ( child.tagName === 'PARAM' && child.name ) { + + params[child.name.toLowerCase()] = child.value; + } + } + return params; + }, + + getPosition: function(el) { + var rect = el.getBoundingClientRect(); + var win = exports.utils.elementWindow(el); + + return { + width: Math.round(rect.width), + height: Math.round(rect.height), + left: Math.round(rect.left + win.pageXOffset), + top: Math.round(rect.top + win.pageYOffset) + }; + }, + + getFlashvars: function(el, params, url) { + var flashvars; + var urlQS = url && url.split('?')[1]; + + if ( el.tagName === 'EMBED' ) { + flashvars = el.getAttribute('flashvars') || urlQS; + + } else if ( el.tagName === 'OBJECT' ) { + flashvars = params.flashvars || el.getAttribute('flashvars') || urlQS; + } + + return (flashvars && exports.utils.parseQS(flashvars)) || null; + }, + + findClickThru: function(el, flashvars) { + var key; + if ( el.tagName === 'IMG' && el.parentElement.tagName === 'A' ) { + return el.parentElement.href; + } else if ( flashvars ) { + for ( key in flashvars ) { + if ( flashvars.hasOwnProperty(key) ) { + + if ( key.toLowerCase().indexOf('clicktag') === 0 ) { + return flashvars[key]; + } + } + } + } + return null; + }, + + getAttr: function(el, name) { + var val = el.getAttribute(name); + + if ( val && val.slice && val.toString ) { + + return val.slice(0, this.MAX_ATTR_LEN).toString(); + } else { + return null; + } + }, + + putPropIfExists: function(obj, name, val) { + if ( val ) { + obj[name] = val; + } + }, + + putAttrIfExists: function(obj, el, name) { + var val = this.getAttr(el, name); + this.putPropIfExists(obj, name, val); + }, + + elementToJSON: function(el, opt_findClickThru) { + var pos = this.getPosition(el); + var params = this.getParams(el); + var url = this.getUrl(el, params); + var flashvars = this.getFlashvars(el, params, url); + var clickThru = opt_findClickThru && this.findClickThru(el, flashvars); + var json = { + tagName: el.tagName, + width: pos.width, + height: pos.height, + left: pos.left, + top: pos.top, + children: [] + }; + + if ( params ) { + + delete params.flashvars; + } + + this.putAttrIfExists(json, el, 'id'); + this.putAttrIfExists(json, el, 'class'); + this.putAttrIfExists(json, el, 'name'); + + this.putPropIfExists(json, 'flashvars', flashvars); + this.putPropIfExists(json, 'url', url); + this.putPropIfExists(json, 'params', params); + this.putPropIfExists(json, 'clickThru', clickThru); + + return json; + } + }; + + exports.parser = { elementToJSON: parser.elementToJSON.bind(parser) }; +})(exports); + +(function(exports) { + + var ContextManager = function(adData) { + this.adData = adData; + }; + + ContextManager.prototype = { + CONTAINER_SIZE_TOL: 0.4, + ASPECT_RATIO_FOR_LEADERBOARDS: 2, + + isValidContainer: function(el, opt_curWin) { + + var cWidth = el.clientWidth; + var cHeight = el.clientHeight; + + var adWidth = this.adData.width; + var adHeight = this.adData.height; + + var winWidth = opt_curWin && opt_curWin.innerWidth; + var winHeight = opt_curWin && opt_curWin.innerHeight; + var similarWin = opt_curWin && this.withinTol(adWidth, winWidth) && this.withinTol(adHeight, winHeight); + + var similarSizeX = this.withinTol(adWidth, cWidth); + var similarSizeY = this.withinTol(adHeight, cHeight); + var adAspect = adWidth / adHeight; + + return similarWin || el.tagName === 'A' || (adAspect >= this.ASPECT_RATIO_FOR_LEADERBOARDS && similarSizeY) || (similarSizeX && similarSizeY); + }, + + withinTol: function(adlen, conlen) { + var pct = (conlen - adlen) / adlen; + + return pct <= this.CONTAINER_SIZE_TOL; + }, + + serializeElements: function(el) { + if ( !el ) { + return; + } + var i; + var ifrWin; + var adId = this.adData.adId; + var elIsAd = false; + + if ( adId && el[adId] && el[adId].isAd === true ) { + elIsAd = true; + } + + var json = exports.parser.elementToJSON(el, elIsAd); + var childJSON; + + if ( elIsAd ) { + json.adId = adId; + this.adData.element = {}; + + var keys = Object.keys(json); + for ( i = 0; i < keys.length; i++ ) { + var key = keys[i]; + if ( key !== 'children' && key !== 'contents' ) { + this.adData.element[key] = json[key]; + } + } + } + + var children = exports.utils.realArray(el.children).filter(function(el) { + var param = el.tagName === 'PARAM'; + var inlineScript = el.tagName === 'SCRIPT' && !(el.src && el.src.indexOf('http') >= 0); + var noScript = el.tagName === 'NOSCRIPT'; + return !(param || inlineScript || noScript); + }); + + for ( i = 0; i < children.length; i++ ) { + childJSON = this.serializeElements(children[i]); + if ( childJSON ) { + json.children.push(childJSON); + } + } + + if ( el.tagName === 'IFRAME' ) { + ifrWin = el.contentWindow; + + if ( adId && el[adId] && el[adId].needsWindow ) { + + json.contents = this.adData.serializedIframeContents; + el[adId].needsWindow = false; + delete this.adData.serializedIframeContents; + + } else if ( exports.utils.isFriendlyWindow(ifrWin) ) { + + childJSON = this.serializeElements(ifrWin.document.documentElement); + if ( childJSON ) { + json.contents = childJSON; + } + } + } + + if ( json.children.length > 0 || json.adId || json.tagName === 'IFRAME' || json.url ) { + return json; + } else { + return null; + } + }, + + captureHTML: function(containerEl) { + this.adData.context = this.serializeElements(containerEl); + }, + + nodeCount: function(el) { + return el.getElementsByTagName('*').length + 1; + }, + + highestContainer: function(curWin, referenceElement) { + var curContainer = referenceElement; + var docEl = curWin.document.documentElement; + var parentContainer; + + if ( curWin !== curWin.top && this.isValidContainer(docEl, curWin) ) { + return docEl; + } + + while ( true ) { + parentContainer = curContainer.parentElement; + if ( parentContainer && this.isValidContainer(parentContainer) ) { + curContainer = parentContainer; + } else { + return curContainer; + } + } + } + }; + + var tagfinder = { + + setPositions: function(adData, opt_el, opt_winPos) { + var el = opt_el || adData.context; + var winPos = opt_winPos || {left: 0, top: 0}; + var ifrPos; + + el.left += winPos.left; + el.top += winPos.top; + + if ( el.children ) { + el.children.forEach(function(child) { + this.setPositions(adData, child, winPos); + }, this); + } + + if ( el.contents ) { + ifrPos = {left: el.left, top: el.top}; + this.setPositions(adData, el.contents, ifrPos); + } + + if ( el.adId === adData.adId ) { + adData.element.left = el.left; + adData.element.top = el.top; + } + }, + + appendTags: function(adData, referenceElement) { + var mgr = new ContextManager(adData); + var curWin = exports.utils.elementWindow(referenceElement); + var highestContainer; + + while ( true ) { + highestContainer = mgr.highestContainer(curWin, referenceElement); + mgr.captureHTML(highestContainer); + if ( curWin === curWin.top ) { + break; + } else { + + curWin.mpAdFound = true; + + mgr.adData.serializedIframeContents = mgr.adData.context; + + if ( exports.utils.isFriendlyWindow(curWin.parent) ) { + referenceElement = curWin.frameElement; + referenceElement[mgr.adData.adId] = {needsWindow: true}; + curWin = curWin.parent; + } else { + break; + } + } + } + return { + referenceElement:referenceElement, + highestContainer: highestContainer + }; + } + }; + + exports.tagfinder = tagfinder; +})(exports); + +(function(exports) { + var _onAdFound; + var _logGen = new exports.utils.LogGenerator(); + var _pageTags; + var INIT_MS_BW_SEARCHES = 2000; + var PAGE_TAG_RE = new RegExp('gpt|oascentral'); + var POST_MSG_ID = '1553148212-11522-32076-13408-5488'; + var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)'); + + function getPageTags(doc) { + var scripts = doc.getElementsByTagName('script'); + var pageTags = []; + scripts = exports.utils.realArray(scripts); + scripts.forEach(function(script) { + if ( PAGE_TAG_RE.exec(script.src) ) { + pageTags.push({'tagName': 'SCRIPT', 'url': script.src}); + } + }); + return pageTags; + } + + function messageAllParentFrames(adData) { + + adData.postMessageId = POST_MSG_ID; + + adData = JSON.stringify(adData); + + var win = window; + while ( win !== win.top ) { + win = win.parent; + win.postMessage(adData, '*'); + } + } + + function appendTagsAndSendToParent(adData, referenceElement) { + var results = exports.tagfinder.appendTags(adData, referenceElement); + if ( exports.utils.SCRIPT_IN_HOSTILE_IFRAME ) { + messageAllParentFrames(adData); + + } else if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { + + exports.tagfinder.setPositions(adData); + + adData.matchedSize = exports.adfinder.getMatchedAdSize(adData.width, adData.height); + if ( !adData.matchedSize ) { + + if ( AD_SERVER_RE.exec(results.referenceElement.id) ) { + adData.matchedSize = [adData.width, adData.height]; + adData.oddSize = true; + } else { + + return; + } + } + delete adData.width; + delete adData.height; + adData.curPageUrl = exports.utils.getPageUrl(); + _pageTags = _pageTags || getPageTags(document); + var log = _logGen.log('ad', [adData], _pageTags); + + if ( _onAdFound ) { + + _onAdFound(log, results.referenceElement); + + } + } + } + + function extractAdsWrapper() { + if ( exports.utils.SCRIPT_IN_WINDOW_TOP || document.readyState === 'complete' ) { + extractAds(); + } + setTimeout( + function() { extractAdsWrapper(); }, INIT_MS_BW_SEARCHES + ); + } + + function extractAds() { + var ads = exports.adfinder.findAds(window); + ads.forEach(function(ad) { + + var startTime = new Date().getTime(); + var adId = startTime + '-' + Math.floor(Math.random() * 10e12); + + var adData = { + width: Math.round(ad.offsetWidth), + height: Math.round(ad.offsetHeight), + startTime: startTime, + adId: adId, + html5: ad.html5 || false + }; + + if ( ad.html5 ) { + adData.adSizeMeta = ad.adSizeMeta || null; + adData.winClickTag = ad.winClickTag || null; + } + + ad[adId] = { isAd: true }; + + appendTagsAndSendToParent(adData, ad); + }); + } + + function isChildWin(myWin, otherWin) { + var parentWin = otherWin.parent; + while ( parentWin !== otherWin ) { + if ( parentWin === myWin ) { + return true; + } + otherWin = parentWin; + parentWin = parentWin.parent; + } + return false; + } + + function iframeFromWindow(win, winToMatch) { + var i, ifr, ifrWin, + iframes = win.document.querySelectorAll('iframe'); + + for ( i = 0; i < iframes.length; i++ ) { + ifr = iframes[i]; + if ( ifr.contentWindow === winToMatch ) { + return ifr; + } + } + + for ( i = 0; i < iframes.length; i++ ) { + ifrWin = iframes[i].contentWindow; + if ( exports.utils.isFriendlyWindow(ifrWin) ) { + ifr = iframeFromWindow(ifrWin, winToMatch); + if ( ifr ) { + return ifr; + } + } + } + } + + function onPostMessage(event) { + var adData, + ifrWin = event.source, + + myWin = window.document.defaultView, + ifrTag; + + try { + + adData = JSON.parse(event.data); + } catch(e) { + + return; + } + + if ( adData.postMessageId === POST_MSG_ID ) { + + delete adData.postMessageId; + + event.stopImmediatePropagation(); + + if ( isChildWin(myWin, ifrWin) ) { + if ( exports.utils.isFriendlyWindow(ifrWin) ) { + ifrTag = ifrWin.frameElement; + } else { + ifrTag = iframeFromWindow(myWin, ifrWin); + } + + if ( ifrTag ) { + ifrTag[adData.adId] = {needsWindow: true}; + appendTagsAndSendToParent(adData, ifrTag); + } + } + } + } + + function onVideoMessage(msg, sender, callback) { + var log; + if ( msg.event === 'new-video-ad' ) { + msg.assets.forEach(function(asset) { + + }); + log = _logGen.log('video', msg.assets); + } else { + log = _logGen.log('invalid-video', msg.assets); + } + + msg.assets.forEach(function(a) {delete a.isVideo;}); + log.displayAdFound = msg.displayAdFound; + log.requests = msg.requests; + log.data = msg.event_data; + + log.doc.finalPageUrl = log.doc.url; + log.doc.url = exports.utils.normalizeUrl(msg.origUrl); + + _onAdFound(log); + } + + function addBackgroundListener(event, callback) { + if ( typeof browser !== 'undefined' || typeof chrome !== 'undefined' ) { + browser.runtime.onMessage.addListener(function(msg) { + if ( msg.event === event ) { + callback(msg); + } + }); + } + else if (window.self.port) { + window.self.port.on(event, callback); + } + } + + exports.coordinator = { + addPostMessageListener: function() { + if ( !exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { + window.addEventListener('message', onPostMessage, false); + } + }, + + blockedRobotsMsgGen: function(sendFcn, origUrl) { + + if ( origUrl.indexOf('google.com/_/chrome/newtab') === -1 ) { + var onBlockedRobotsMessage = function() { + var log; + log = _logGen.log('invalid-robotstxt', []); + log.doc.finalPageUrl = log.doc.url; + log.doc.url = exports.utils.normalizeUrl(origUrl); + + sendFcn(log); + }; + return onBlockedRobotsMessage; + } else { + return function() {}; + } + }, + + init: function(onAdFound) { + + if ( exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { + return false; + } + + _onAdFound = onAdFound; + if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { + var log = _logGen.log('page'); + onAdFound(log); + + window.addEventListener('beforeunload', function(event) { + var log = _logGen.log('unload'); + log.timing = window.performance.timing; + onAdFound(log); + }); + + addBackgroundListener('new-video-ad', onVideoMessage); + addBackgroundListener('new-invalid-video-ad', onVideoMessage); + + } + + exports.utils.onDocLoaded(document, extractAdsWrapper); + } + }; + +})(exports); + +if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { + window.adparser = { + init: exports.coordinator.init, + addPostMessageListener: exports.coordinator.addPostMessageListener, + askIfTrackingEnabled: exports.utils.askIfTrackingEnabled, + blockedRobotsMsgGen: exports.coordinator.blockedRobotsMsgGen, + inWindowTop: exports.utils.SCRIPT_IN_WINDOW_TOP, + sendToBackground: exports.utils.sendToBackground + }; +} else { + exports.coordinator.addPostMessageListener(); + exports.utils.askIfTrackingEnabled( + function() { + exports.coordinator.init(function() {}); + }, + function() {} + ); +} +})(window); +(function(adparser, pageUrl) { + function onAdFound(log) { + adparser.sendToBackground({ id: 'ad_log', subject: log }, 'ad_log', '', function(){}); + } + + if ( adparser && adparser.inWindowTop ) { + adparser.addPostMessageListener(); + adparser.askIfTrackingEnabled( + function() { + adparser.init(onAdFound); + }, + adparser.blockedRobotsMsgGen(onAdFound, pageUrl) + ) + } +})(window.adparser, window.location.href); diff --git a/src/drivers/webextension/js/lib/network.js b/src/drivers/webextension/js/lib/network.js index fc0a22d16..7c46fcf9f 100644 --- a/src/drivers/webextension/js/lib/network.js +++ b/src/drivers/webextension/js/lib/network.js @@ -1,794 +1,822 @@ -(function () { - function isChrome() { - return (typeof chrome !== 'undefined' - && window.navigator.userAgent.match(/Chrom(?:e|ium)\/([0-9\.]+)/)); - } - - let browserProxy; - if (isChrome()) { - browserProxy = chrome; - } else { - browserProxy = browser; - } - - const MIN_FF_MAJOR_VERSION = 51; - - const requiredBrowserApis = [ - browserProxy.webNavigation, - browserProxy.tabs, - browserProxy.webRequest, - browserProxy.runtime, - ]; - let areListenersRegistered = false; - const secBefore = 2000; - const secAfter = 5000; - const secBetweenDupAssets = 10e3; - const minVidSize = 500e3; - const maxVidSize = 25e6; - const maxContentRange = 25e6; - const videoExtensions = [ - 'af', '3gp', 'asf', 'avchd', 'avi', 'cam', 'dsh', 'flv', 'm1v', 'm2v', - 'fla', 'flr', 'sol', 'm4v', 'mkv', 'wrap', 'mng', 'mov', 'mpeg', 'mpg', - 'mpe', 'mp4', 'mxf', 'nsv', 'ogg', 'rm', 'svi', 'smi', 'wmv', 'webm', - ]; - const extensionsReg = new RegExp(`\\.${videoExtensions.join('$|\\.')}$`); - const videoContentTypesPrefixes = ['binary/octet-stream', 'video/', 'flv-application/', 'media']; - - const bannedContentTypes = ['video/mp2t', 'video/f4m', 'video/f4f']; - const bannedFiletypes = ['ts']; - const bannedFiletypesReg = new RegExp(`\\.${bannedFiletypes.join('$|\\.')}$`); - const whitelistReqTypes = ['object', 'xmlhttprequest', 'other']; - - const topVideoAssetDomains = [ - '2mdn.net', - 'adap.tv', - 'adnxs.com', - 'adsrvr.org', - 'btrll.com', - 'celtra.com', - 'flashtalking.com', - 'flite.com', - 'innovid.com', - 'jivox.com', - 'mixpo.com', - 'nytimes.com', - 'playwire.com', - 'selectmedia.asia', - 'serving-sys.com', - 'solvemedia.com', - 'spotible.com', - 'teads.tv', - 'tribalfusion.com', - 'tubemogul.com', - 'videologygroup.com', - 'washingtonpost.com', - ]; - - const robotsTxtAllows = wappalyzer.robotsTxtAllows.bind(wappalyzer); - if (!String.prototype.endsWith) { - String.prototype.endsWith = function (searchString, position) { - const subjectString = this.toString(); - if (typeof position !== 'number' || !isFinite(position) - || Math.floor(position) !== position || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - const lastIndex = subjectString.indexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; - }; - } - - function getFrame(getFrameDetails, callback) { - if (isChrome()) { - chrome.webNavigation.getFrame(getFrameDetails, callback); - } else if (typeof browser !== 'undefined') { - const gettingFrame = browser.webNavigation.getFrame(getFrameDetails); - gettingFrame.then(callback); - } - } - - function ifBrowserValid(callback, elseCallback) { - if (isChrome()) { - callback(); - } else if (typeof browser !== 'undefined') { - try { - const gettingInfo = browser.runtime.getBrowserInfo(); - gettingInfo.then((browserInfo) => { - const browserVersion = parseInt(browserInfo.version.split('.')[0]); - - if (browserInfo.name === 'Firefox' - && browserVersion >= MIN_FF_MAJOR_VERSION) { - callback(); - } else { - elseCallback(); - } - }); - } catch (err) { - elseCallback(); - } - } else { - elseCallback(); - } - } - - function ifTrackingEnabled(details, ifCallback, elseCallback) { - const fullIfCallback = function () { - allowedByRobotsTxt(details, ifCallback, elseCallback); - }; - - browser.storage.local.get('tracking').then((item) => { - if (item.hasOwnProperty('tracking')) { - if (item.tracking) { - fullIfCallback(); - } else { - elseCallback(); - } - } else { - fullIfCallback(); - } - }); - } - - function allowedByRobotsTxt(details, ifCallback, elseCallback) { - if (details.url && !details.url.startsWith('chrome://')) { - robotsTxtAllows(details.url).then(ifCallback, elseCallback); - } else { - elseCallback(); - } - } - - function isPixelRequest(request) { - return (request.type === 'image' || request.responseStatus === 204) - && request.size <= 1000; - } - - function isVpaidOrVastRequest(request) { - const lowerCaseUrl = request.url.toLowerCase(); - return lowerCaseUrl.indexOf('vpaid') !== -1 || lowerCaseUrl.indexOf('vast') !== -1; - } - - function hasValidRequestType(request) { - return whitelistReqTypes.indexOf(request.type) >= 0; - } - - function stripQueryParams(url) { - return url.split('?', 1)[0]; - } - - function parseHostnameFromUrl(url) { - const parser = document.createElement('a'); - parser.href = url; - return parser.hostname; - } - - function hasDomain(url, domain) { - return parseHostnameFromUrl(url).endsWith(domain); - } - - function findHeader(headers, key) { - let header; - for (let i = 0; i < headers.length; i += 1) { - header = headers[i]; - if (header.name.toLowerCase() === key) { - return header; - } - } - return null; - } - - function validVideoType(vtype) { - const goodType = videoContentTypesPrefixes.some(prefix => vtype.indexOf(prefix) === 0); - return goodType; - } - - function assetMsgKey(assetReq) { - const url = stripQueryParams(assetReq.url); - const key = `${assetReq.frameId}-${url}`; - return key; - } - - const PageNetworkTrafficCollector = function (tabId) { - this.tabId = tabId; - this.displayAdFound = false; - this.requests = {}; - this.msgsBeingSent = {}; - this.assetsSeen = {}; - this.allRedirects = {}; - }; - - var globalPageContainer = { - collectors: {}, - dyingCollectors: {}, - - cleanupCollector(tabId) { - if (tabId in this.collectors) { - delete globalPageContainer.collectors[tabId]; - } - }, - - onNewNavigation(details) { - const tabId = details.tabId; - this.cleanupCollector(tabId); - - ifTrackingEnabled( - details, - () => { - if (!areListenersRegistered) { - registerListeners(); - } - this.collectors[tabId] = new PageNetworkTrafficCollector(tabId); - }, - () => { - if (areListenersRegistered) { - unregisterListeners(); - } - }, - ); - }, - - onNavigationCommitted(details) { - - }, - - onNavigationCompleted(details) { - - }, - - onTabClose(tabId, closeInfo) { - this.cleanupCollector(tabId); - delete this.collectors[tabId]; - }, - - onDisplayAdFound(tabId) { - this.collectors[tabId].displayAdFound = true; - }, - - getRandId() { - return String(Math.floor(Math.random() * 1e9)); - }, - - getCollector(tabId) { - if (this.collectors.hasOwnProperty(tabId)) { - return this.collectors[tabId]; - } - return null; - }, - - forwardCall(details, collectorMemberFunction) { - const collector = this.getCollector(details.tabId); - if (collector !== null) { - collectorMemberFunction.apply(collector, [details]); - } - }, - }; - - PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function () { - const logMessage = Array.from(arguments).join(' '); - const message = { message: logMessage, event: 'console-log-message' }; - browserProxy.tabs.sendMessage(this.tabId, message); - }; - - PageNetworkTrafficCollector.prototype.sendToTab = function (assetReq, reqs, curPageUrl, adTrackingEvent) { - const msg = {}; - msg.assets = []; - msg.requests = []; - msg.event_data = {}; - msg.event = adTrackingEvent; - if (adTrackingEvent === 'new-video-ad') { - msg.requests = reqs; - msg.requests.sort((reqA, reqB) => reqA.requestTimestamp - reqB.requestTimestamp); - if (assetReq) { - msg.assets = [assetReq]; - } - } else if (adTrackingEvent === 'new-invalid-video-ad') { - msg.requests = reqs.map(request => parseHostnameFromUrl(request.url)); - msg.assets = [{ - - url: parseHostnameFromUrl(assetReq.url), - - contentType: assetReq.contentType, - size: assetReq.size, - }]; - } - msg.origUrl = curPageUrl; - msg.displayAdFound = this.displayAdFound; - - browserProxy.tabs.sendMessage(this.tabId, msg); - }; - - PageNetworkTrafficCollector.prototype.getRedirKey = function (url, frameId) { - return `${url}:${frameId}`; - }; - - PageNetworkTrafficCollector.prototype.seenBefore = function (request) { - const oldTime = this.assetsSeen[assetMsgKey(request)]; - if (oldTime && (request.requestTimestamp - oldTime < secBetweenDupAssets)) { - return true; - } - return false; - }; - - PageNetworkTrafficCollector.prototype.recordSeenAsset = function (request) { - this.assetsSeen[assetMsgKey(request)] = request.requestTimestamp; - }; - - PageNetworkTrafficCollector.prototype.onBeforeRequest = function (details) { - const req = { - url: details.url, - type: details.type, - httpMethod: details.method, - frameId: details.frameId, - parentFrameId: details.parentFrameId, - requestTimestamp: details.timeStamp, - }; - this.requests[details.requestId] = req; - }; - - PageNetworkTrafficCollector.prototype.onSendHeaders = function (details) { - let request, - header; - request = this.requests[details.requestId]; - header = request && findHeader(details.requestHeaders, 'x-requested-with'); - if (header && header.value.toLowerCase().indexOf('flash') > -1) { - request.from_flash = true; - } - }; - - PageNetworkTrafficCollector.prototype.onHeadersReceived = function (details) { - const getFrameDetails = { - tabId: details.tabId, - processId: null, - frameId: details.frameId, - }; - const pageNetworkTrafficController = this; - getFrame(getFrameDetails, (frameDetails) => { - if (frameDetails && frameDetails.url) { - pageNetworkTrafficController._onHeadersReceived(details, frameDetails); - } - }); - }; - - PageNetworkTrafficCollector.prototype._onHeadersReceived = function (details, frameDetails) { - let contentSize, - contentRange; - - const request = this.requests[details.requestId]; - if (request) { - const redirParent = this.allRedirects[this.getRedirKey(details.url, details.frameId)]; - let header = request && findHeader(details.responseHeaders, 'content-type'); - const contentType = header && header.value.toLowerCase(); - - if (contentType) { - request.contentType = contentType; - } - header = request && findHeader(details.responseHeaders, 'content-length'); - contentSize = header && header.value; - if (contentSize) { - request.size = request.size || 0; - request.size += parseInt(contentSize); - } - header = request && findHeader(details.responseHeaders, 'content-range'); - contentRange = header && header.value; - if (contentRange) { - request.contentRange = parseInt(contentRange.split('/')[1]); - } - - let frameUrl = null; - if (frameDetails && frameDetails.url) { - frameUrl = frameDetails.url; - } - if (!this.bannedRequest(request) - && (this.isVideoReq(frameUrl, request) || (redirParent && redirParent.isVideo))) { - request.isVideo = true; - } - } - }; - - PageNetworkTrafficCollector.prototype.onBeforeRedirect = function (details) { - const request = this.requests[details.requestId]; - if (request) { - if (request.redirects) { - request.redirects.push(details.redirectUrl); - } else { - request.redirects = [details.redirectUrl]; - } - this.allRedirects[this.getRedirKey(details.redirectUrl, details.frameId)] = request; - } - }; - - PageNetworkTrafficCollector.prototype.isYoutubeMastheadRequest = function (url) { - const re = /video_masthead/; - return this.hasYoutubeDomain(url) && re.test(url); - }; - PageNetworkTrafficCollector.prototype.isYoutubeVideoRequest = function (srcUrl, destUrl) { - if (!this.hasYoutubeDomain(srcUrl)) { - return false; - } - - const re = /https?:\/\/r.*?\.googlevideo\.com\/videoplayback\?/; - return re.test(destUrl); - }; - PageNetworkTrafficCollector.prototype.processResponse = function (requestDetails, frameDetails) { - let request; - if (requestDetails) { - request = this.requests[requestDetails.requestId]; - if (request) { - request.responseStatus = requestDetails.statusCode; - request.responseTimestamp = requestDetails.timeStamp; - - let frameUrl = null; - if (frameDetails && frameDetails.url) { - frameUrl = frameDetails.url; - } - - let requestUrl = null; - if (request.url) { - requestUrl = request.url; - } - - if (this.isYoutubeAdReq(frameUrl, requestUrl)) { - const destVideoId = this.parseYoutubeVideoIdFromUrl(requestUrl); - const srcVideoId = this.parseYoutubeVideoIdFromUrl(frameUrl); - if (srcVideoId && destVideoId) { - request.isYoutubeAd = true; - request.isVideo = true; - request.rawSrcUrl = frameUrl; - request.rawDestUrl = requestUrl; - request.url = `https://www.youtube.com/watch?v=${this.parseYoutubeVideoIdFromUrl(requestUrl)}`; - } - } else if (!this.bannedRequest(request) - && (this.isVideo || this.isVideoReq(frameUrl, request))) { - request.isVideo = true; - } - - if (request.isVideo) { - const msgKey = assetMsgKey(request); - this.msgsBeingSent[msgKey] = request; - if (!this.seenBefore(request)) { - this.sendMsgWhenQuiet(msgKey); - } - this.recordSeenAsset(request); - } - } - } - }; - - PageNetworkTrafficCollector.prototype.onResponseStarted = function (responseDetails) { - if (responseDetails.frameId < 0) { - responseDetails.frameId = 99999; - } - const getFrameDetails = { - tabId: responseDetails.tabId, - processId: null, - frameId: responseDetails.frameId, - }; - const pageNetworkTrafficController = this; - getFrame(getFrameDetails, (frameDetails) => { - if (frameDetails && frameDetails.url) { - pageNetworkTrafficController.processResponse(responseDetails, frameDetails); - } - }); - }; - - PageNetworkTrafficCollector.prototype.hasBannedFiletype = function (request) { - const url = stripQueryParams(request.url); - if (bannedFiletypesReg.exec(url)) { - return true; - } - return false; - }; - - PageNetworkTrafficCollector.prototype.checkContentHeaders = function (request) { - if (request.contentType && validVideoType(request.contentType)) { - return true; - } - return false; - }; - - PageNetworkTrafficCollector.prototype.checkUrlExtension = function (request) { - const url = stripQueryParams(request.url); - if (extensionsReg.exec(url)) { - return true; - } - return false; - }; - - PageNetworkTrafficCollector.prototype.isVideoReq = function (srcUrl, request) { - if (this.isYoutubeVideoRequest(srcUrl, request.url)) { - return false; - } - return this.checkUrlExtension(request) || this.checkContentHeaders(request); - }; - PageNetworkTrafficCollector.prototype.hasYoutubeDomain = function (url) { - const hostname = parseHostnameFromUrl(url); - if (hostname === 'www.youtube.com') { - return true; - } - return false; - }; - PageNetworkTrafficCollector.prototype.parseYoutubeVideoIdFromUrl = function (url) { - let re = /^https?:\/\/www\.youtube\.com\/get_video_info.*(?:\?|&)video_id=(.*?)(?:$|&)/; - let match = re.exec(url); - if (match && match.length > 1) { - return match[1]; - } - - re = /^https?:\/\/www\.youtube\.com\/embed\/(.*?)(?:$|\?)/; - match = re.exec(url); - if (match && match.length > 1) { - return match[1]; - } - - re = /^https?:\/\/www\.youtube\.com\/watch.*(\?|&)v=([^&]*)/; - match = re.exec(url); - if (match && match.length > 1) { - return match[1]; - } - return null; - }; - - PageNetworkTrafficCollector.prototype.isYoutubeGetVideoInfoReq = function (url) { - const re = /^https?:\/\/www\.youtube\.com\/get_video_info\?/; - return re.test(url); - }; - PageNetworkTrafficCollector.prototype.isYoutubeAdReq = function (srcUrl, destUrl) { - if (!this.hasYoutubeDomain(srcUrl) - || !this.isYoutubeGetVideoInfoReq(destUrl)) { - return false; - } - if (this.parseYoutubeVideoIdFromUrl(srcUrl) - === this.parseYoutubeVideoIdFromUrl(destUrl) - && !this.isYoutubeMastheadRequest(destUrl)) { - return false; - } - return true; - }; - - PageNetworkTrafficCollector.prototype.bannedRequest = function (request) { - return this.bannedVideoType(request) || this.hasBannedFiletype(request) || this.bannedVideoSize(request); - }; - - PageNetworkTrafficCollector.prototype.bannedVideoType = function (request) { - let badType = false; - if (request.contentType) { - badType = bannedContentTypes.some(prefix => request.contentType.indexOf(prefix) >= 0); - } - return badType; - }; - - PageNetworkTrafficCollector.prototype.bannedVideoSize = function (request) { - if (request.size !== null) { - if (request.size < minVidSize || request.size > maxVidSize || request.contentRange > maxContentRange) { - return true; - } - } - return false; - }; - - PageNetworkTrafficCollector.prototype.grabTagReqs = function (tabRequests, assetRequest) { - let minTimestamp, - maxTimestamp; - minTimestamp = assetRequest.requestTimestamp - secBefore; - maxTimestamp = assetRequest.requestTimestamp + secAfter; - - const filteredRequests = tabRequests.filter(request => (request.requestTimestamp > minTimestamp - && request.requestTimestamp < maxTimestamp - && request.frameId === assetRequest.frameId - && request.url !== assetRequest.url - && (hasValidRequestType(request) - || isPixelRequest(request)))); - - return filteredRequests; - }; - - PageNetworkTrafficCollector.prototype.isValidVideoAd = function (assetRequest, tagRequests) { - const hasVpaidOrVastRequest = tagRequests.some(tagRequest => isVpaidOrVastRequest(tagRequest)); - - if (assetRequest.isYoutubeAd) { - return true; - } - if (hasVpaidOrVastRequest) { - return true; - } - const hasTopVideoAssetDomain = topVideoAssetDomains.some(assetDomain => hasDomain(assetRequest.url, assetDomain)); - - return hasTopVideoAssetDomain; - }; - - PageNetworkTrafficCollector.prototype.sendMsgWhenQuiet = function (msgKey) { - let _this = this, - origPageUrl, - msgAssetReq; - msgAssetReq = this.msgsBeingSent[msgKey]; - browserProxy.tabs.get(this.tabId, (tab) => { origPageUrl = tab.url; }); - - setTimeout(() => { - const rawRequests = []; - if (globalPageContainer.collectors[_this.tabId] === _this) { - for (const reqId in _this.requests) { - rawRequests.push(_this.requests[reqId]); - } - const tagReqs = _this.grabTagReqs(rawRequests, msgAssetReq); - - if (_this.isValidVideoAd(msgAssetReq, tagReqs)) { - _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, 'new-video-ad'); - } else { - _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, 'new-invalid-video-ad'); - } - } else { - - } - delete _this.msgsBeingSent[msgKey]; - }, secAfter + secBefore); - }; - - PageNetworkTrafficCollector.prototype.existingMessage = function (candidateRequest) { - const frameMsg = this.msgsBeingSent[candidateRequest.frameId]; - if (frameMsg) { - return frameMsg; - } - return null; - }; - - function onBeforeRequestListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest); - } - - function onSendHeadersListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders); - } - - function onHeadersReceivedListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived); - } - - function onBeforeRedirectListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect); - } - - function onResponseStartedListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onResponseStarted); - } - - function onCommittedListener(details) { - if (details.frameId === 0) { - globalPageContainer.onNavigationCommitted(details); - } - } - - function onCompletedListener(details) { - if (details.frameId === 0) { - globalPageContainer.onNavigationCompleted(details); - } - } - - function onRemovedListener(tabId, closeInfo) { - globalPageContainer.onTabClose(tabId, closeInfo); - } - - function onMessageListener(message, sender, sendResponse) { - if (message.event === 'new-ad' && message.data.event === 'ad') { - const tabId = sender.tab.id; - if (tabId) { - globalPageContainer.onDisplayAdFound(tabId); - } - } - } - - function registerListeners() { - browserProxy.webRequest.onBeforeRequest.addListener( - onBeforeRequestListener, - { urls: ['http://*/*', 'https://*/*'] }, - [], - ); - - browserProxy.webRequest.onSendHeaders.addListener( - onSendHeadersListener, - { urls: ['http://*/*', 'https://*/*'] }, - ['requestHeaders'], - ); - - browserProxy.webRequest.onHeadersReceived.addListener( - onHeadersReceivedListener, - { urls: ['http://*/*', 'https://*/*'] }, - ['responseHeaders'], - ); - - browserProxy.webRequest.onBeforeRedirect.addListener( - onBeforeRedirectListener, - { urls: ['http://*/*', 'https://*/*'] }, - [], - ); - - browserProxy.webRequest.onResponseStarted.addListener( - onResponseStartedListener, - { urls: ['http://*/*', 'https://*/*'] }, - ['responseHeaders'], - ); - - browserProxy.webNavigation.onCommitted.addListener(onCommittedListener); - browserProxy.webNavigation.onCompleted.addListener(onCompletedListener); - browserProxy.tabs.onRemoved.addListener(onRemovedListener); - browserProxy.runtime.onMessage.addListener(onMessageListener); - - areListenersRegistered = true; - } - - function unregisterListeners() { - browserProxy.webRequest.onBeforeRequest.removeListener( - onBeforeRequestListener, - ); - - browserProxy.webRequest.onSendHeaders.removeListener( - onSendHeadersListener, - ); - - browserProxy.webRequest.onHeadersReceived.removeListener( - onHeadersReceivedListener, - ); - - browserProxy.webRequest.onBeforeRedirect.removeListener( - onBeforeRedirectListener, - ); - - browserProxy.webRequest.onResponseStarted.removeListener( - onResponseStartedListener, - ); - - browserProxy.webNavigation.onCommitted.removeListener(onCommittedListener); - browserProxy.webNavigation.onCompleted.removeListener(onCompletedListener); - browserProxy.tabs.onRemoved.removeListener(onRemovedListener); - browserProxy.runtime.onMessage.removeListener(onMessageListener); - - areListenersRegistered = false; - } - - function areRequiredBrowserApisAvailable() { - return requiredBrowserApis.every(api => typeof api !== 'undefined'); - } - - if (areRequiredBrowserApisAvailable()) { - ifBrowserValid( - () => { - browserProxy.webNavigation.onBeforeNavigate.addListener( - (details) => { - if (details.frameId === 0) { - globalPageContainer.onNewNavigation(details); - } - }, - { - url: [{ urlMatches: 'http://*/*' }, { urlMatches: 'https://*/*' }], - }, - ); - }, () => { - - }, - ); - } - - browserProxy.runtime.onMessage.addListener((request, sender, sendResponse) => { - if (request === 'is_browser_valid') { - ifBrowserValid( - sendResponse({ browser_valid: true }), - sendResponse({ browser_valid: false }), - ); - } - }); - - browserProxy.runtime.onMessage.addListener((request, sender, sendResponse) => { - if (request === 'is_tracking_enabled') { - ifTrackingEnabled( - sender.tab, - () => { - console.log('enabled'); - try { sendResponse({ tracking_enabled: true }); } catch (err) {} - }, - () => { - console.log('not enabled'); - try { sendResponse({ tracking_enabled: false }); } catch (err) {} - }, - ); - } - return true; - }); -}()); +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + var lastIndex = subjectString.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; + }; + } + + function getFrame(getFrameDetails, callback) { + var gettingFrame = browser.webNavigation.getFrame(getFrameDetails); + gettingFrame.then(callback); + } + + function ifBrowserValid(callback, elseCallback) { + if ( isChrome() ) { + + callback(); + } else if ( typeof browser !== 'undefined' ) { + try { + var gettingInfo = browser.runtime.getBrowserInfo(); + gettingInfo.then(function(browserInfo) { + var browserVersion = parseInt(browserInfo.version.split('.')[0]); + + if ( browserInfo.name === 'Firefox' && + browserVersion >= MIN_FF_MAJOR_VERSION) { + callback(); + } else { + elseCallback(); + } + }); + } catch (err) { + + elseCallback(); + } + } else { + elseCallback(); + } + } + + function ifTrackingEnabled(details, ifCallback, elseCallback) { + + var fullIfCallback = function() { + allowedByRobotsTxt(details, ifCallback, elseCallback); + }; + + browser.storage.local.get('tracking').then(function(item) { + + if ( item.hasOwnProperty('tracking') ) { + if ( item.tracking ) { + fullIfCallback(); + } else { + elseCallback(); + } + } else { + fullIfCallback(); + } + }); + + } + + function allowedByRobotsTxt(details, ifCallback, elseCallback) { + if ( details.url && !details.url.startsWith('chrome://') ) { + robotsTxtAllows(details.url).then(ifCallback, elseCallback); + } else { + elseCallback(); + } + } + + function isPixelRequest(request) { + return (request.type === 'image' || request.responseStatus === 204) && + request.size <= 1000; + } + + function isVpaidOrVastRequest(request) { + var lowerCaseUrl = request.url.toLowerCase(); + return lowerCaseUrl.indexOf('vpaid') !== -1 || lowerCaseUrl.indexOf('vast') !== -1; + } + + function hasValidRequestType(request) { + return whitelistReqTypes.indexOf(request.type) >= 0; + } + + function stripQueryParams(url) { + return url.split('?', 1)[0]; + } + + function parseHostnameFromUrl(url) { + var parser = document.createElement('a'); + parser.href = url; + return parser.hostname; + } + + function hasDomain(url, domain) { + return parseHostnameFromUrl(url).endsWith(domain); + } + + function findHeader(headers, key) { + var header; + for ( var i = 0; i < headers.length; i += 1 ) { + header = headers[i]; + if ( header.name.toLowerCase() === key ) { + return header; + } + } + return null; + } + + function validVideoType(vtype) { + var goodType = videoContentTypesPrefixes.some(function(prefix) { + return vtype.indexOf(prefix) === 0; + }); + return goodType; + } + + function assetMsgKey(assetReq) { + var url = stripQueryParams(assetReq.url); + var key = assetReq.frameId + '-' + url; + return key; + } + + var PageNetworkTrafficCollector = function(tabId) { + this.tabId = tabId; + this.displayAdFound = false; + this.requests = {}; + this.msgsBeingSent = {}; + this.assetsSeen = {}; + this.allRedirects = {}; + }; + + var globalPageContainer = { + collectors: {}, + dyingCollectors: {}, + + cleanupCollector: function(tabId) { + if ( tabId in this.collectors ) { + delete globalPageContainer.collectors[tabId]; + } + }, + + onNewNavigation: function(details) { + var tabId = details.tabId; + this.cleanupCollector(tabId); + + ifTrackingEnabled( + details, + function() { + if ( !areListenersRegistered ) { + + registerListeners(); + } + this.collectors[tabId] = new PageNetworkTrafficCollector(tabId); + }.bind(this), + function() { + if ( areListenersRegistered ) { + + unregisterListeners(); + } + } + ); + }, + + onNavigationCommitted: function(details) { + + }, + + onNavigationCompleted: function(details) { + + }, + + onTabClose: function(tabId, closeInfo) { + + this.cleanupCollector(tabId); + delete this.collectors[tabId]; + }, + + onDisplayAdFound: function(tabId) { + this.collectors[tabId].displayAdFound = true; + }, + + getRandId: function() { + return String(Math.floor(Math.random() * 1e9)); + }, + + getCollector: function(tabId) { + if ( this.collectors.hasOwnProperty(tabId) ) { + return this.collectors[tabId]; + } + return null; + }, + + forwardCall: function(details, collectorMemberFunction) { + var collector = this.getCollector(details.tabId); + if ( collector !== null ) { + collectorMemberFunction.apply(collector, [details]); + } + } + }; + + PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function() { + var logMessage = Array.from(arguments).join(' '); + var message = {message: logMessage, event: 'console-log-message'}; + browser.tabs.sendMessage(this.tabId, message); + }; + + PageNetworkTrafficCollector.prototype.sendToTab = function(assetReq, reqs, curPageUrl, adTrackingEvent) { + var msg = {}; + msg.assets = []; + msg.requests = []; + msg.event_data = {}; + msg.event = adTrackingEvent; + if ( adTrackingEvent === 'new-video-ad' ) { + msg.requests = reqs; + msg.requests.sort(function(reqA, reqB) {return reqA.requestTimestamp - reqB.requestTimestamp;}); + if ( assetReq ) { + msg.assets = [assetReq]; + } + } else if ( adTrackingEvent === 'new-invalid-video-ad' ) { + msg.requests = reqs.map(function(request) { + return parseHostnameFromUrl(request.url); + }); + msg.assets = [{ + + url: parseHostnameFromUrl(assetReq.url), + + contentType: assetReq.contentType, + size: assetReq.size + }]; + } + msg.origUrl = curPageUrl; + msg.displayAdFound = this.displayAdFound; + + browser.tabs.sendMessage(this.tabId, msg); + }; + + PageNetworkTrafficCollector.prototype.getRedirKey = function(url, frameId) { + return url + ':' + frameId; + }; + + PageNetworkTrafficCollector.prototype.seenBefore = function(request) { + var oldTime = this.assetsSeen[assetMsgKey(request)]; + if ( oldTime && (request.requestTimestamp-oldTime < secBetweenDupAssets)){ + + return true; + } + return false; + }; + + PageNetworkTrafficCollector.prototype.recordSeenAsset = function(request) { + this.assetsSeen[assetMsgKey(request)] = request.requestTimestamp; + }; + + PageNetworkTrafficCollector.prototype.onBeforeRequest = function(details) { + var req = { + url: details.url, + type: details.type, + httpMethod: details.method, + frameId: details.frameId, + parentFrameId: details.parentFrameId, + requestTimestamp: details.timeStamp, + }; + this.requests[details.requestId] = req; + }; + + PageNetworkTrafficCollector.prototype.onSendHeaders = function(details) { + var request, header; + request = this.requests[details.requestId]; + header = request && findHeader(details.requestHeaders, 'x-requested-with'); + if ( header && header.value.toLowerCase().indexOf('flash') > -1 ) { + request.from_flash = true; + } + }; + + PageNetworkTrafficCollector.prototype.onHeadersReceived = function(details) { + var getFrameDetails = { + tabId: details.tabId, + processId: null, + frameId: details.frameId + }; + var pageNetworkTrafficController = this; + getFrame(getFrameDetails, function(frameDetails) { + if ( frameDetails && frameDetails.url ) { + pageNetworkTrafficController._onHeadersReceived(details, frameDetails); + } + }); + }; + + PageNetworkTrafficCollector.prototype._onHeadersReceived = function(details, frameDetails) { + var contentSize, contentRange; + + var request = this.requests[details.requestId]; + if ( request ) { + var redirParent = this.allRedirects[this.getRedirKey(details.url, details.frameId)]; + var header = request && findHeader(details.responseHeaders, 'content-type'); + var contentType = header && header.value.toLowerCase(); + + if ( contentType){ + request.contentType = contentType; + } + header = request && findHeader(details.responseHeaders, 'content-length'); + contentSize = header && header.value; + if ( contentSize ) { + request.size = request.size || 0; + request.size += parseInt(contentSize); + } + header = request && findHeader(details.responseHeaders, 'content-range'); + contentRange = header && header.value; + if ( contentRange ) { + request.contentRange = parseInt(contentRange.split('/')[1]); + } + + var frameUrl = null; + if ( frameDetails && frameDetails.url ) { + frameUrl = frameDetails.url; + } + if ( !this.bannedRequest(request) && + (this.isVideoReq(frameUrl, request) || (redirParent && redirParent.isVideo))) { + request.isVideo = true; + } + } + }; + + PageNetworkTrafficCollector.prototype.onBeforeRedirect = function(details) { + var request = this.requests[details.requestId]; + if ( request ) { + if ( request.redirects ) { + request.redirects.push(details.redirectUrl); + } else { + request.redirects = [details.redirectUrl]; + } + this.allRedirects[this.getRedirKey(details.redirectUrl, details.frameId)] = request; + } + }; + + PageNetworkTrafficCollector.prototype.isYoutubeMastheadRequest = function(url) { + var re = /video_masthead/; + return this.hasYoutubeDomain(url) && re.test(url); + }; + PageNetworkTrafficCollector.prototype.isYoutubeVideoRequest = function(srcUrl, destUrl) { + if ( !this.hasYoutubeDomain(srcUrl) ) { + return false; + } + + var re = /https?:\/\/r.*?\.googlevideo\.com\/videoplayback\?/; + return re.test(destUrl); + }; + PageNetworkTrafficCollector.prototype.processResponse = function(requestDetails, frameDetails) { + var request; + if ( requestDetails ) { + request = this.requests[requestDetails.requestId]; + if ( request ) { + request.responseStatus = requestDetails.statusCode; + request.responseTimestamp = requestDetails.timeStamp; + + var frameUrl = null; + if ( frameDetails && frameDetails.url ) { + frameUrl = frameDetails.url; + } + + var requestUrl = null; + if ( request.url ) { + requestUrl = request.url; + } + + if ( this.isYoutubeAdReq(frameUrl, requestUrl) ) { + var destVideoId = this.parseYoutubeVideoIdFromUrl(requestUrl); + var srcVideoId = this.parseYoutubeVideoIdFromUrl(frameUrl); + if ( srcVideoId && destVideoId ) { + request.isYoutubeAd = true; + request.isVideo = true; + request.rawSrcUrl = frameUrl; + request.rawDestUrl = requestUrl; + request.url = 'https://www.youtube.com/watch?v=' + this.parseYoutubeVideoIdFromUrl(requestUrl); + } + } else if ( !this.bannedRequest(request) && + (this.isVideo || this.isVideoReq(frameUrl, request))) { + request.isVideo = true; + } + + if ( request.isVideo ) { + + var msgKey = assetMsgKey(request); + this.msgsBeingSent[msgKey] = request; + if ( !this.seenBefore(request) ) { + this.sendMsgWhenQuiet(msgKey); + } + this.recordSeenAsset(request); + } + } + } + }; + + PageNetworkTrafficCollector.prototype.onResponseStarted = function(responseDetails) { + if ( responseDetails.frameId < 0 ) { + responseDetails.frameId = 99999; + + } + var getFrameDetails = { + tabId: responseDetails.tabId, + processId: null, + frameId: responseDetails.frameId + }; + var pageNetworkTrafficController = this; + getFrame(getFrameDetails, function(frameDetails) { + if ( frameDetails && frameDetails.url ) { + pageNetworkTrafficController.processResponse(responseDetails, frameDetails); + } + }); + }; + + PageNetworkTrafficCollector.prototype.hasBannedFiletype = function(request) { + var url = stripQueryParams(request.url); + if ( bannedFiletypesReg.exec(url) ) { + return true; + } else { + return false; + } + }; + + PageNetworkTrafficCollector.prototype.checkContentHeaders = function(request) { + if ( request.contentType && validVideoType(request.contentType) ) { + return true; + } + return false; + }; + + PageNetworkTrafficCollector.prototype.checkUrlExtension = function(request) { + var url = stripQueryParams(request.url); + if ( extensionsReg.exec(url) ) { + return true; + } else { + return false; + } + }; + + PageNetworkTrafficCollector.prototype.isVideoReq = function(srcUrl, request) { + if ( this.isYoutubeVideoRequest(srcUrl, request.url) ) { + return false; + } + return this.checkUrlExtension(request) || this.checkContentHeaders(request); + }; + PageNetworkTrafficCollector.prototype.hasYoutubeDomain = function(url) { + var hostname = parseHostnameFromUrl(url) ; + if ( hostname === 'www.youtube.com' ) { + return true; + } + return false; + }; + PageNetworkTrafficCollector.prototype.parseYoutubeVideoIdFromUrl = function(url) { + var re = /^https?:\/\/www\.youtube\.com\/get_video_info.*(?:\?|&)video_id=(.*?)(?:$|&)/; + var match = re.exec(url); + if ( match && match.length > 1 ) { + return match[1]; + } + + re = /^https?:\/\/www\.youtube\.com\/embed\/(.*?)(?:$|\?)/; + match = re.exec(url); + if ( match && match.length > 1 ) { + return match[1]; + } + + re = /^https?:\/\/www\.youtube\.com\/watch.*(\?|&)v=([^&]*)/; + match = re.exec(url); + if ( match && match.length > 1 ) { + return match[1]; + } + return null; + }; + + PageNetworkTrafficCollector.prototype.isYoutubeGetVideoInfoReq = function(url) { + var re = /^https?:\/\/www\.youtube\.com\/get_video_info\?/; + return re.test(url); + }; + PageNetworkTrafficCollector.prototype.isYoutubeAdReq = function(srcUrl, destUrl) { + + if ( !this.hasYoutubeDomain(srcUrl) || + !this.isYoutubeGetVideoInfoReq(destUrl)) { + return false; + } + if ( this.parseYoutubeVideoIdFromUrl(srcUrl) === + this.parseYoutubeVideoIdFromUrl(destUrl) && + !this.isYoutubeMastheadRequest(destUrl)) { + return false; + } + return true; + }; + + PageNetworkTrafficCollector.prototype.bannedRequest = function(request) { + return this.bannedVideoType(request) || this.hasBannedFiletype(request) || this.bannedVideoSize(request); + }; + + PageNetworkTrafficCollector.prototype.bannedVideoType = function(request) { + var badType = false; + if ( request.contentType ) { + badType = bannedContentTypes.some(function(prefix) { + return request.contentType.indexOf(prefix) >= 0; + }); + } + return badType; + }; + + PageNetworkTrafficCollector.prototype.bannedVideoSize = function(request) { + if ( request.size !== null ) { + if ( request.size < minVidSize || request.size > maxVidSize || request.contentRange > maxContentRange ) { + return true; + } + } + return false; + }; + + PageNetworkTrafficCollector.prototype.grabTagReqs = function(tabRequests, assetRequest) { + var minTimestamp, maxTimestamp; + minTimestamp = assetRequest.requestTimestamp - secBefore; + maxTimestamp = assetRequest.requestTimestamp + secAfter; + + var filteredRequests = tabRequests.filter(function(request) { + return (request.requestTimestamp > minTimestamp && + request.requestTimestamp < maxTimestamp && + request.frameId === assetRequest.frameId && + request.url !== assetRequest.url && + (hasValidRequestType(request) || + isPixelRequest(request))); + }); + + return filteredRequests; + }; + + PageNetworkTrafficCollector.prototype.isValidVideoAd = function(assetRequest, tagRequests) { + var hasVpaidOrVastRequest = tagRequests.some(function(tagRequest) { + return isVpaidOrVastRequest(tagRequest); + }); + + if ( assetRequest.isYoutubeAd ) { + return true; + } + if ( hasVpaidOrVastRequest ) { + return true; + } + var hasTopVideoAssetDomain = topVideoAssetDomains.some(function(assetDomain) { + return hasDomain(assetRequest.url, assetDomain); + }); + + return hasTopVideoAssetDomain; + }; + + PageNetworkTrafficCollector.prototype.sendMsgWhenQuiet = function(msgKey) { + var _this = this, + origPageUrl, msgAssetReq; + msgAssetReq = this.msgsBeingSent[msgKey]; + browser.tabs.get(this.tabId).then(function(tab) { + origPageUrl = tab.url; + }); + + setTimeout(function() { + var rawRequests = []; + if ( globalPageContainer.collectors[_this.tabId] === _this ) { + for ( var reqId in _this.requests ) { + rawRequests.push(_this.requests[reqId]); + } + var tagReqs = _this.grabTagReqs(rawRequests, msgAssetReq); + + if ( _this.isValidVideoAd(msgAssetReq, tagReqs) ) { + _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, 'new-video-ad'); + } else { + + _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, 'new-invalid-video-ad'); + } + + } else { + + } + delete _this.msgsBeingSent[msgKey]; + }, secAfter+secBefore); + }; + + PageNetworkTrafficCollector.prototype.existingMessage = function(candidateRequest) { + var frameMsg = this.msgsBeingSent[candidateRequest.frameId]; + if ( frameMsg ) { + return frameMsg; + } else { + return null; + } + }; + + function onBeforeRequestListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest); + } + + function onSendHeadersListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders); + } + + function onHeadersReceivedListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived); + } + + function onBeforeRedirectListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect); + } + + function onResponseStartedListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onResponseStarted); + } + + function onCommittedListener(details) { + if ( details.frameId === 0 ) { + globalPageContainer.onNavigationCommitted(details); + } + } + + function onCompletedListener(details) { + if ( details.frameId === 0 ) { + globalPageContainer.onNavigationCompleted(details); + } + } + + function onRemovedListener(tabId, closeInfo) { + globalPageContainer.onTabClose(tabId, closeInfo); + } + + function onMessageListener(message, sender, sendResponse) { + if ( message.event === 'new-ad' && message.data.event === 'ad' ) { + var tabId = sender.tab.id; + if ( tabId ) { + globalPageContainer.onDisplayAdFound(tabId); + } + } + } + + function registerListeners() { + + browser.webRequest.onBeforeRequest.addListener( + onBeforeRequestListener, + {urls: ['http://*/*', 'https://*/*']}, + [] + ); + + browser.webRequest.onSendHeaders.addListener( + onSendHeadersListener, + {urls: ['http://*/*', 'https://*/*']}, + ['requestHeaders'] + ); + + browser.webRequest.onHeadersReceived.addListener( + onHeadersReceivedListener, + {urls: ['http://*/*', 'https://*/*']}, + ['responseHeaders'] + ); + + browser.webRequest.onBeforeRedirect.addListener( + onBeforeRedirectListener, + {urls: ['http://*/*', 'https://*/*']}, + [] + ); + + browser.webRequest.onResponseStarted.addListener( + onResponseStartedListener, + {urls: ['http://*/*', 'https://*/*']}, + ['responseHeaders'] + ); + + browser.webNavigation.onCommitted.addListener(onCommittedListener); + browser.webNavigation.onCompleted.addListener(onCompletedListener); + browser.tabs.onRemoved.addListener(onRemovedListener); + browser.runtime.onMessage.addListener(onMessageListener); + + areListenersRegistered = true; + } + + function unregisterListeners() { + + browser.webRequest.onBeforeRequest.removeListener( + onBeforeRequestListener + ); + + browser.webRequest.onSendHeaders.removeListener( + onSendHeadersListener + ); + + browser.webRequest.onHeadersReceived.removeListener( + onHeadersReceivedListener + ); + + browser.webRequest.onBeforeRedirect.removeListener( + onBeforeRedirectListener + ); + + browser.webRequest.onResponseStarted.removeListener( + onResponseStartedListener + ); + + browser.webNavigation.onCommitted.removeListener(onCommittedListener); + browser.webNavigation.onCompleted.removeListener(onCompletedListener); + browser.tabs.onRemoved.removeListener(onRemovedListener); + browser.runtime.onMessage.removeListener(onMessageListener); + areListenersRegistered = false; + } + + function areRequiredBrowserApisAvailable() { + return requiredBrowserApis.every(function(api) { + return typeof api !== 'undefined'; + }); + } + + if ( areRequiredBrowserApisAvailable() ) { + ifBrowserValid( + function() { + browser.webNavigation.onBeforeNavigate.addListener( + function(details) { + if ( details.frameId === 0 ) { + globalPageContainer.onNewNavigation(details); + } + }, + { + url: [{urlMatches: 'http://*/*'}, {urlMatches: 'https://*/*'}] + } + ); + }, function() { + + } + ); + } + + browser.runtime.onConnect.addListener((port) => { + port.onMessage.addListener((message) => { + if ( message === 'is_browser_valid' ) { + ifBrowserValid( + port.postMessage({'browser_valid': true}), + port.postMessage({'browser_valid': false}) + ); + } + }); + }); + + browser.runtime.onConnect.addListener((port) => { + port.onMessage.addListener((message) => { + if ( message === 'is_tracking_enabled' ) { + ifTrackingEnabled( + port.sender.tab, + function() { + try {port.postMessage({'tracking_enabled': true});} + catch(err) {} }, + function() { + try {port.postMessage({'tracking_enabled': false});} + catch(err) {} } + ); + } + return true; + }); + }); + +})(); + +},{}]},{},[1]); diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index c9ae4e1a0..1017f422e 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://www.wappalyzer.com", "description": "Identify web technologies", - "version": "5.7.3", + "version": "5.7.4", "default_locale": "en", "manifest_version": 2, "icons": { @@ -51,6 +51,7 @@ "https://www.alphaecommerce.gr/*" ], "js": [ + "node_modules/webextension-polyfill/dist/browser-polyfill.js", "js/lib/iframe.js" ], "run_at": "document_start", From 5286b9689ec2cb1b78816ec343d2b4117c59293f Mon Sep 17 00:00:00 2001 From: serderovsh Date: Sat, 23 Mar 2019 19:43:13 +0300 Subject: [PATCH 163/197] update iEXExchanger --- src/apps.json | 5 +++-- src/icons/iEXExchanger.png | Bin 0 -> 25503 bytes 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 src/icons/iEXExchanger.png diff --git a/src/apps.json b/src/apps.json index cf1c1022c..2f9f4604f 100644 --- a/src/apps.json +++ b/src/apps.json @@ -11704,7 +11704,8 @@ ], "implies": [ "PHP", - "Apache" + "Apache", + "Angular" ], "cookies": { "iexexchanger_session": "" @@ -11712,7 +11713,7 @@ "meta": { "generator": "iEXExchanger" }, - "script": "iexexchanger", + "icon": "iEXExchanger.png", "website": "https://exchanger.iexbase.com" }, "ZK": { diff --git a/src/icons/iEXExchanger.png b/src/icons/iEXExchanger.png new file mode 100644 index 0000000000000000000000000000000000000000..c237a251329117c757c5e88707ab33af59a20f77 GIT binary patch literal 25503 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 F{{ZW0+3x@V literal 0 HcmV?d00001 From a811824d8ee4b028a27f92aae307e3e273bd0582 Mon Sep 17 00:00:00 2001 From: Greg Lin Date: Sun, 24 Mar 2019 18:51:59 -0500 Subject: [PATCH 164/197] Add Shiny --- src/apps.json | 10 ++++++++++ src/icons/Shiny.png | Bin 0 -> 8097 bytes 2 files changed, 10 insertions(+) create mode 100644 src/icons/Shiny.png diff --git a/src/apps.json b/src/apps.json index cf1c1022c..99264083e 100644 --- a/src/apps.json +++ b/src/apps.json @@ -9009,6 +9009,16 @@ }, "website": "http://shellinabox.com" }, + "Shiny": { + "cats": [ + 18 + ], + "icon": "Shiny.png", + "js": { + "Shiny": "" + }, + "website": "https://shiny.rstudio.com" + }, "ShinyStat": { "cats": [ 10 diff --git a/src/icons/Shiny.png b/src/icons/Shiny.png new file mode 100644 index 0000000000000000000000000000000000000000..612d350d3bb102a97f5100f951d148bd4734571f GIT binary patch literal 8097 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 literal 0 HcmV?d00001 From ccfa16f2ba98077e9309dcb51a640dafe8d26fdf Mon Sep 17 00:00:00 2001 From: Greg Lin Date: Tue, 2 Apr 2019 20:20:44 -0500 Subject: [PATCH 165/197] More specific JS pattern for Shiny --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 99264083e..774ee280d 100644 --- a/src/apps.json +++ b/src/apps.json @@ -9015,7 +9015,7 @@ ], "icon": "Shiny.png", "js": { - "Shiny": "" + "Shiny.addCustomMessageHandler": "" }, "website": "https://shiny.rstudio.com" }, From 4a4bb0bc5b8c1e0e013f52934bc007d22083e220 Mon Sep 17 00:00:00 2001 From: Nicholas Stees Date: Mon, 8 Apr 2019 23:15:58 -0400 Subject: [PATCH 166/197] Adding Gridsome --- src/apps.json | 10 ++++++++++ src/icons/Gridsome.svg | 30 ++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/icons/Gridsome.svg diff --git a/src/apps.json b/src/apps.json index cf1c1022c..a96173051 100644 --- a/src/apps.json +++ b/src/apps.json @@ -4123,6 +4123,16 @@ }, "website": "http://www.greenvalley.nl/Public/Producten/Content_Management/CMS" }, + "Gridsome": { + "cats": [ + 57 + ], + "icon": "Gridsome.svg", + "meta": { + "generator": "Gridsome (v[\\d.]+)?\\;version:\\1" + }, + "website": "https://gridsome.org" + }, "HERE": { "cats": [ 35 diff --git a/src/icons/Gridsome.svg b/src/icons/Gridsome.svg new file mode 100644 index 000000000..8fa8b0d89 --- /dev/null +++ b/src/icons/Gridsome.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 32323532639783f9899ac62ab2bd7099db71dc25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaan=20K=C3=B6lk=C3=B6y?= Date: Tue, 9 Apr 2019 12:41:00 +0300 Subject: [PATCH 167/197] Add Countly to apps --- src/apps.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/apps.json b/src/apps.json index cf1c1022c..ab0969dfa 100644 --- a/src/apps.json +++ b/src/apps.json @@ -2188,6 +2188,16 @@ "icon": "CouchDB.png", "website": "http://couchdb.apache.org" }, + "Countly": { + "cats": [ + 10 + ], + "icon": "Countly.png", + "js": { + "Countly": "" + }, + "website": "https://count.ly" + }, "Cowboy": { "cats": [ 18, From cdd5c7d5e9f4696a451d027d02e6a4d1854f5579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaan=20K=C3=B6lk=C3=B6y?= Date: Tue, 9 Apr 2019 12:41:19 +0300 Subject: [PATCH 168/197] Add Countly logo --- src/icons/Countly.png | Bin 0 -> 4166 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/icons/Countly.png diff --git a/src/icons/Countly.png b/src/icons/Countly.png new file mode 100644 index 0000000000000000000000000000000000000000..ae9d8db9648cc1da2b24a4a9fb09e8d12e082f0d GIT binary patch literal 4166 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 Date: Tue, 9 Apr 2019 16:39:44 -0400 Subject: [PATCH 169/197] Adding implies vue and carrot to regex --- src/apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index a96173051..3734b94b3 100644 --- a/src/apps.json +++ b/src/apps.json @@ -4128,8 +4128,9 @@ 57 ], "icon": "Gridsome.svg", + "implies": "Vue.js", "meta": { - "generator": "Gridsome (v[\\d.]+)?\\;version:\\1" + "generator": "^Gridsome (v[\\d.]+)?\\;version:\\1" }, "website": "https://gridsome.org" }, From 563348b73c65f5aaa92c25b10e66942a7f9ad2d1 Mon Sep 17 00:00:00 2001 From: Nicholas Stees Date: Tue, 9 Apr 2019 21:10:46 -0400 Subject: [PATCH 170/197] Suggestions by jvoisin --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 3734b94b3..ea7748ec9 100644 --- a/src/apps.json +++ b/src/apps.json @@ -4130,7 +4130,7 @@ "icon": "Gridsome.svg", "implies": "Vue.js", "meta": { - "generator": "^Gridsome (v[\\d.]+)?\\;version:\\1" + "generator": "^Gridsome v([\\d.]+)$\\;version:\\1" }, "website": "https://gridsome.org" }, From 0c863a8561db0eb37b212dc8979138afa315213c Mon Sep 17 00:00:00 2001 From: Kyle Taylor Date: Wed, 10 Apr 2019 09:42:44 -0500 Subject: [PATCH 171/197] Update All-in-One SEO url fixes #2655 --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index cf1c1022c..a22f41e65 100644 --- a/src/apps.json +++ b/src/apps.json @@ -491,7 +491,7 @@ "html": "", - "icon": "Business Catalyst.png", - "script": "CatalystScripts", - "website": "http://businesscatalyst.com" - }, - "BuySellAds": { - "cats": [ - "36" - ], - "env": "^_bsa", - "html": "]*>[^<]+?bsa.src\\s*=\\s*['\"](?:https?:)?\\/{2}\\w\\d\\.buysellads\\.com\\/[\\w\\d\\/]+?bsa\\.js['\"]", - "icon": "BuySellAds.png", - "script": "^https?://s\\d\\.buysellads\\.com/", - "website": "http://buysellads.com" - }, - "C++": { - "cats": [ - "27" - ], - "icon": "C++.png", - "website": "http://isocpp.org" - }, - "CFML": { - "cats": [ - "27" - ], - "icon": "CFML.png", - "website": "http://adobe.com/products/coldfusion-family.html" - }, - "CKEditor": { - "cats": [ - "24" - ], - "env": "^CKEDITOR$", - "icon": "CKEditor.png", - "website": "http://ckeditor.com" - }, - "CMS Made Simple": { - "cats": [ - "1" - ], - "headers": { - "Set-Cookie": "^CMSSESSID" - }, - "icon": "CMS Made Simple.png", - "implies": "PHP", - "meta": { - "generator": "CMS Made Simple" - }, - "website": "http://cmsmadesimple.org" - }, - "CMSimple": { - "cats": [ - "1" - ], - "implies": "PHP", - "meta": { - "generator": "CMSimple( [\\d.]+)?\\;version:\\1" - }, - "website": "http://www.cmsimple.org/en" - }, - "CO2Stats": { - "cats": [ - "10" - ], - "html": "src=[^>]+co2stats\\.com/propres\\.php", - "icon": "CO2Stats.png", - "website": "http://co2stats.com" - }, - "CPG Dragonfly": { - "cats": [ - "1" - ], - "headers": { - "X-Powered-By": "Dragonfly CMS" - }, - "icon": "CPG Dragonfly.png", - "implies": "PHP", - "meta": { - "generator": "CPG Dragonfly" - }, - "website": "http://dragonflycms.org" - }, - "CS Cart": { - "cats": [ - "6" - ], - "env": "^fn_compare_strings$", - "html": [ - " Powered by (?:]+cs-cart\\.com|CS-Cart)", - ".cm-noscript[^>]+" - ], - "icon": "CS Cart.png", - "implies": "PHP", - "website": "http://www.cs-cart.com" - }, - "CacheFly": { - "cats": [ - "31" - ], - "headers": { - "Server": "^CFS ", - "X-CF1": "", - "X-CF2": "" - }, - "icon": "CacheFly.png", - "website": "http://www.cachefly.com" - }, - "Caddy": { - "cats": [ - "22" - ], - "headers": { - "Server": "^Caddy$" - }, - "icon": "caddy.svg", - "implies": "Go", - "website": "http://caddyserver.com" - }, - "CakePHP": { - "cats": [ - "18" - ], - "headers": { - "Set-Cookie": "cakephp=" - }, - "icon": "CakePHP.png", - "implies": "PHP", - "meta": { - "application-name": "CakePHP" - }, - "website": "http://cakephp.org" - }, - "Canon": { - "cats": [ - "40" - ], - "icon": "Canon.png", - "website": "http://www.canon.com" - }, - "Canon HTTP Server": { - "cats": [ - "22" - ], - "headers": { - "Server": "CANON HTTP Server(?:/([\\d.]+))?\\;version:\\1" - }, - "icon": "Canon.png", - "implies": "Canon", - "website": "http://www.canon.com" - }, - "Captch Me": { - "cats": [ - "16", - "36" - ], - "env": "^Captchme", - "icon": "Captch Me.svg", - "script": "^https?://api\\.captchme\\.net/", - "website": "http://captchme.com" - }, - "Carbon Ads": { - "cats": [ - "36" - ], - "env": "^_carbonads", - "html": "<[a-z]+ [^>]*id=\"carbonads-container\"", - "icon": "Carbon Ads.png", - "script": "[^\\/]*\\/\\/(?:engine|srv)\\.carbonads\\.com\\/", - "website": "http://carbonads.net" - }, - "Cargo": { - "cats": [ - "1" - ], - "html": "]+Cargo feed", - "icon": "Cargo.png", - "implies": "PHP", - "meta": { - "cargo_title": "" - }, - "script": "/cargo\\.", - "website": "http://cargocollective.com" - }, - "Catberry.js": { - "cats": [ - "12", - "18" - ], - "env": "^catberry$", - "headers": { - "X-Powered-By": "Catberry" - }, - "icon": "Catberry.js.png", - "implies": "Node.js", - "website": "http://catberry.org" - }, - "Catwalk": { - "cats": [ - "22" - ], - "headers": { - "Server": "Catwalk\\/?([\\d\\.]+)?\\;version:\\1" - }, - "icon": "Catwalk.png", - "implies": "Canon", - "website": "http://www.canon.com" - }, - "CentOS": { - "cats": [ - "28" - ], - "headers": { - "Server": "CentOS", - "X-Powered-By": "CentOS" - }, - "icon": "CentOS.png", - "website": "http://centos.org" - }, - "CenteHTTPd": { - "cats": [ - "22" - ], - "headers": { - "Server": "CenteHTTPd(?:/([\\d.]+))?\\;version:\\1" - }, - "icon": "CenteHTTPd.png", - "website": "http://cente.jp/cente/app/HTTPdc.html" - }, - "Chameleon": { - "cats": [ - "1" - ], - "icon": "Chameleon.png", - "implies": [ - "Apache", - "PHP" - ], - "meta": { - "generator": "chameleon-cms" - }, - "website": "http://chameleon-system.de" - }, - "Chamilo": { - "cats": [ - "21" - ], - "headers": { - "X-Powered-By": "Chamilo ([\\d.]+)\\;version:\\1" - }, - "html": "\">Chamilo ([\\d.]+)\\;version:\\1", - "icon": "Chamilo.png", - "implies": "PHP", - "meta": { - "generator": "Chamilo ([\\d.]+)\\;version:\\1" - }, - "website": "http://www.chamilo.org" - }, - "Chartbeat": { - "cats": [ - "10" - ], - "env": "^_sf_(?:endpt|async_config)$", - "icon": "Chartbeat.png", - "script": "chartbeat\\.js", - "website": "http://chartbeat.com" - }, - "Cherokee": { - "cats": [ - "22" - ], - "headers": { - "Server": "Cherokee/([\\d.]+)\\;version:\\1" - }, - "icon": "Cherokee.png", - "website": "http://www.cherokee-project.com" - }, - "CherryPy": { - "cats": [ - "18", - "22" - ], - "headers": { - "Server": "CherryPy\\/?([\\d\\.]+)?\\;version:\\1" - }, - "icon": "CherryPy.png", - "implies": "Python", - "website": "http://www.cherrypy.org" - }, - "Chitika": { - "cats": [ - "36" - ], - "env": "ch_c(?:lient|olor_site_link)", - "icon": "Chitika.png", - "script": "scripts\\.chitika\\.net/", - "website": "http://chitika.com" - }, - "Ckan": { - "cats": [ - "1" - ], - "headers": { - "Access-Control-Allow-Headers": "X-CKAN-API-KEY", - "Link": "; rel=shortlink" - }, - "icon": "Ckan.png", - "implies": [ - "Python", - "Solr", - "Java", - "PostgreSQL\\;confidence:80" - ], - "website": "http://ckan.org/" - }, - "ClickHeat": { - "cats": [ - "10" - ], - "env": "^clickHeat", - "icon": "ClickHeat.png", - "implies": "PHP", - "script": "clickheat.*\\.js", - "website": "http://www.labsmedia.com/clickheat/index.html" - }, - "ClickTale": { - "cats": [ - "10" - ], - "env": "^ClickTale", - "icon": "ClickTale.png", - "website": "http://www.clicktale.com" - }, - "Clicky": { - "cats": [ - "10" - ], - "env": "^clicky$", - "icon": "Clicky.png", - "script": "static\\.getclicky\\.com", - "website": "http://getclicky.com" - }, - "Clientexec": { - "cats": [ - "6" - ], - "html": "clientexec\\.[^>]*\\s?=\\s?[^>]*;", - "icon": "Clientexec.png", - "website": "http://www.clientexec.com" - }, - "Clipboard.js": { - "cats": [ - "19" - ], - "env": "^Clipboard$", - "icon": "Clipboard.js.svg", - "script": "clipboard(?:\\.min)?\\.js", - "website": "https://clipboardjs.com/" - }, - "CloudFlare": { - "cats": [ - "31" - ], - "env": "^CloudFlare$", - "headers": { - "Server": "cloudflare" - }, - "icon": "CloudFlare.svg", - "website": "http://www.cloudflare.com" - }, - "Cloudera": { - "cats": [ - "34" - ], - "headers": { - "Server": "cloudera" - }, - "icon": "Cloudera.png", - "website": "https://www.cloudera.com/" - }, - "CloudCart": { - "cats": [ - 6 - ], - "meta": { - "author": "^CloudCart$" - }, - "script": "^cdncloudcart$", - "website": "https://cloudcart.com", - "icon": "cloudcart.svg" - }, - "CodeIgniter": { - "cats": [ - "18" - ], - "headers": { - "Set-Cookie": "(?:exp_last_activity|exp_tracker|ci_(?:session|(csrf_token)))\\;version:\\1?2+:" - }, - "html": "]+name=\"ci_csrf_token\"\\;version:2+", - "icon": "CodeIgniter.png", - "implies": "PHP", - "website": "http://codeigniter.com" - }, - "CodeMirror": { - "cats": [ - "19" - ], - "env": "^CodeMirror$", - "icon": "CodeMirror.png", - "website": "http://codemirror.net" - }, - "Comandia": { - "cats": [ - "6" - ], - "env": "^Comandia$", - "html": "]+=['\"]//cdn\\.mycomandia\\.com", - "icon": "Comandia.svg", - "website": "http://comandia.com" - }, - "Commerce Server": { - "cats": [ - "6" - ], - "headers": { - "COMMERCE-SERVER-SOFTWARE": "" - }, - "icon": "Commerce Server.png", - "implies": "Microsoft ASP.NET", - "website": "http://commerceserver.net" - }, - "CompaqHTTPServer": { - "cats": [ - "22" - ], - "headers": { - "Server": "CompaqHTTPServer\\/?([\\d\\.]+)?\\;version:\\1" - }, - "icon": "HP.svg", - "website": "http://www.hp.com" - }, - "Concrete5": { - "cats": [ - "1" - ], - "env": "^CCM_IMAGE_PATH$", - "icon": "Concrete5.png", - "implies": "PHP", - "meta": { - "generator": "concrete5 - ([\\d.ab]+)\\;version:\\1" - }, - "script": "concrete/js/", - "website": "http://concrete5.org" - }, - "Connect": { - "cats": [ - "18" - ], - "headers": { - "X-Powered-By": "^Connect$" - }, - "icon": "Connect.png", - "implies": "Node.js", - "website": "http://www.senchalabs.org/connect" - }, - "Contao": { - "cats": [ - "1" - ], - "html": [ - "", - "]+(?:typolight|contao)\\.css" - ], - "icon": "Contao.png", - "implies": "PHP", - "meta": { - "generator": "^Contao Open Source CMS$" - }, - "website": "http://contao.org" - }, - "Contenido": { - "cats": [ - "1" - ], - "icon": "Contenido.png", - "implies": "PHP", - "meta": { - "generator": "Contenido ([\\d.]+)\\;version:\\1" - }, - "website": "http://contenido.org/en" - }, - "Contens": { - "cats": [ - "1" - ], - "icon": "Contens.png", - "implies": [ - "Java", - "CFML" - ], - "meta": { - "generator": "Contensis CMS Version ([\\d.]+)\\;version:\\1" - }, - "website": "http://www.contens.com/en/pub/index.cfm" - }, - "ContentBox": { - "cats": [ - "1", - "11" - ], - "icon": "ContentBox.png", - "implies": "Adobe ColdFusion", - "meta": { - "generator": "ContentBox powered by ColdBox" - }, - "website": "http://www.gocontentbox.org" - }, - "ConversionLab": { - "cats": [ - "10" - ], - "icon": "ConversionLab.png", - "script": "conversionlab\\.trackset\\.com/track/tsend\\.js", - "website": "http://www.trackset.it/conversionlab" - }, - "Coppermine": { - "cats": [ - "7" - ], - "html": "|", - "icon": "InProces.png", - "script": "brein/inproces/website/websitefuncties\\.js", - "website": "http://www.brein.nl/oplossing/product/website" - }, - "Incapsula": { - "cats": [ - "31" - ], - "headers": { - "X-CDN": "Incapsula" - }, - "icon": "Incapsula.png", - "website": "http://www.incapsula.com" - }, - "Indexhibit": { - "cats": [ - "1" - ], - "html": "<(?:link|a href) [^>]+ndxz-studio", - "implies": [ - "PHP", - "Apache", - "Exhibit" - ], - "meta": { - "generator": "Indexhibit" - }, - "website": "http://www.indexhibit.org" - }, - "Indico": { - "cats": [ - "1" - ], - "headers": { - "Set-cookie": "MAKACSESSION" - }, - "html": "Powered by\\s+(?:CERN )?(?:CDS )?Indico( [\\d\\.]+)?\\;version:\\1", - "icon": "Indico.png", - "website": "http://indico-software.org" - }, - "Indy": { - "cats": [ - "22" - ], - "headers": { - "Server": "Indy(?:/([\\d.]+))?\\;version:\\1" - }, - "website": "http://indyproject.org" - }, - "InfernoJS": { - "cats": [ - "12" - ], - "env": "^Inferno$", - "icon": "InfernoJS.png", - "website": "https://infernojs.org/" - }, - "Infusionsoft": { - "cats": [ - "32" - ], - "html": [ - "]*name=\"infusionsoft_version\" [^>]*value=\"([^>]*)\" [^>]*\\/>\\;version:\\1", - "]*value=\"([^>]*)\" [^>]*name=\"infusionsoft_version\" [^>]*\\/>\\;version:\\1" - ], - "icon": "infusionsoft.svg", - "website": "http://infusionsoft.com" - }, - "InstantCMS": { - "cats": [ - "1" - ], - "headers": { - "Set-Cookie": "InstantCMS\\[logdate\\]=" - }, - "icon": "InstantCMS.png", - "implies": "PHP", - "meta": { - "generator": "InstantCMS" - }, - "website": "http://www.instantcms.ru" - }, - "Intel Active Management Technology": { - "cats": [ - "22", - "46" - ], - "headers": { - "Server": "Intel\\(R\\) Active Management Technology(?: ([\\d.]+))?\\;version:\\1" - }, - "icon": "Intel Active Management Technology.png", - "website": "http://intel.com" - }, - "IntenseDebate": { - "cats": [ - "15" - ], - "icon": "IntenseDebate.png", - "script": "intensedebate\\.com", - "website": "http://intensedebate.com" - }, - "Intercom": { - "cats": [ - "10" - ], - "env": "^Intercom$", - "icon": "Intercom.png", - "script": "(?:api\\.intercom\\.io/api|static\\.intercomcdn\\.com/intercom\\.v1)", - "website": "http://intercom.io" - }, - "Intershop": { - "cats": [ - "6" - ], - "icon": "Intershop.png", - "script": "(?:is-bin|INTERSHOP)", - "website": "http://intershop.com" - }, - "Invenio": { - "cats": [ - "50" - ], - "headers": { - "Set-cookie": "INVENIOSESSION" - }, - "html": "(?:Powered by|System)\\s+(?:CERN )?(?:CDS )?Invenio\\s*v?([\\d\\.]+)?\\;version:\\1", - "icon": "Invenio.png", - "website": "http://invenio-software.org" - }, - "Ionicons": { - "cats": [ - "17" - ], - "html": "]* href=[^>]+ionicons(?:\\.min)?\\.css", - "icon": "Ionicons.png", - "website": "http://ionicons.com" - }, - "JAlbum": { - "cats": [ - "7" - ], - "icon": "JAlbum.png", - "implies": "Java", - "meta": { - "generator": "JAlbum( [\\d.]+)?\\;version:\\1" - }, - "website": "http://jalbum.net/en" - }, - "JBoss Application Server": { - "cats": [ - "22" - ], - "headers": { - "X-Powered-By": "JBoss(?:-([\\d.]+))?\\;version:\\1" - }, - "icon": "JBoss Application Server.png", - "website": "http://jboss.org/jbossas.html" - }, - "JBoss Web": { - "cats": [ - "22" - ], - "excludes": "Apache Tomcat", - "headers": { - "X-Powered-By": "JBossWeb(?:-([\\d.]+))?\\;version:\\1" - }, - "icon": "JBoss Web.png", - "implies": "JBoss Application Server", - "website": "http://jboss.org/jbossweb" - }, - "JC-HTTPD": { - "cats": [ - "22" - ], - "excludes": "Apache", - "headers": { - "Server": "JC-HTTPD(?:/([\\d.]+))?\\;version:\\1" - }, - "icon": "JC-HTTPD.png", - "implies": "Canon", - "website": "http://canon.com" - }, - "JS Charts": { - "cats": [ - "25" - ], - "env": "^JSChart$", - "icon": "JS Charts.png", - "script": "jscharts.*\\.js", - "website": "http://www.jscharts.com" - }, - "JTL Shop": { - "cats": [ - "6" - ], - "headers": { - "Set-Cookie": "JTLSHOP=" - }, - "html": "(?:]+name=\"JTLSHOP|]+id=\"wrapper_r\"|<[^>]+(?:feed|components)/com_|]+class=\"pill)\\;confidence:50", - "icon": "Joomla.png", - "implies": "PHP", - "meta": { - "generator": "Joomla!(?: ([\\d.]+))?\\;version:\\1" - }, - "url": "option=com_", - "website": "http://joomla.org" - }, - "K2": { - "cats": [ - "19" - ], - "env": "^K2RatingURL$", - "html": "", - "icon": "Lightspeed.svg", - "script": "http://assets.webshopapp.com", - "url": "seoshop.webshopapp.com", - "website": "http://www.lightspeedhq.com/products/ecommerce/" - }, - "Lighty": { - "cats": [ - "18" - ], - "headers": { - "Set-Cookie": "lighty_version" - }, - "icon": "Lighty.png", - "implies": "PHP", - "website": "http://gitlab.com/lighty/framework" - }, - "LimeSurvey": { - "cats": [ - "19" - ], - "headers": { - "generator": "LimeSurvey" - }, - "icon": "LimeSurvey.png", - "website": "http://limesurvey.org/" - }, - "LinkSmart": { - "cats": [ - "36" - ], - "env": "^(?:_mb_site_guid$|LS_JSON|LinkSmart(?:_|$))", - "icon": "LinkSmart.png", - "script": "^https?://cdn\\.linksmart\\.com/linksmart_([\\d.]+?)(?:\\.min)?\\.js\\;version:\\1", - "website": "http://linksmart.com" - }, - "Linkedin": { - "cats": [ - "5" - ], - "icon": "Linkedin.svg", - "script": "//platform\\.linkedin\\.com/in\\.js", - "website": "http://linkedin.com" - }, - "List.js": { - "cats": [ - "12" - ], - "env": "^List$", - "icon": "List.js.png", - "script": "^list\\.(?:min\\.)?js$", - "website": "http://www.listjs.com" - }, - "LiteSpeed": { - "cats": [ - "22" - ], - "headers": { - "Server": "^LiteSpeed$" - }, - "icon": "LiteSpeed.png", - "website": "http://litespeedtech.com" - }, - "Lithium": { - "cats": [ - "1" - ], - "env": [ - "^LITHIUM$" - ], - "headers": { - "Set-Cookie": "LithiumVisitor=" - }, - "html": " ]+Powered by Lithium", - "icon": "Lithium.png", - "implies": "PHP", - "website": "http://www.lithium.com" - }, - "LiveAgent": { - "cats": [ - "52" - ], - "env": "^LiveAgent$", - "icon": "LiveAgent.png", - "website": "http://www.ladesk.com" - }, - "LiveChat": { - "cats": [ - "52" - ], - "icon": "LiveChat.png", - "script": "cdn\\.livechatinc\\.com/.*tracking\\.js", - "website": "http://livechatinc.com" - }, - "LiveJournal": { - "cats": [ - "11" - ], - "icon": "LiveJournal.png", - "url": "\\.livejournal\\.com", - "website": "http://www.livejournal.com" - }, - "LivePerson": { - "cats": [ - "52" - ], - "icon": "LivePerson.png", - "script": "^https?://lptag\\.liveperson\\.net/tag/tag\\.js", - "website": "https://www.liveperson.com/" - }, - "LiveStreet CMS": { - "cats": [ - "1" - ], - "env": "^LIVESTREET", - "headers": { - "X-Powered-By": "LiveStreet CMS" - }, - "icon": "LiveStreet CMS.png", - "implies": "PHP", - "website": "http://livestreetcms.com" - }, - "Livefyre": { - "cats": [ - "15" - ], - "env": [ - "^fyre$", - "^FyreLoader$" - ], - "html": "<[^>]+(?:id|class)=\"livefyre", - "icon": "Livefyre.png", - "script": "livefyre_init\\.js", - "website": "http://livefyre.com" - }, - "Liveinternet": { - "cats": [ - "10" - ], - "html": [ - "]*>[^]{0,128}?src\\s*=\\s*['\"]//counter\\.yadro\\.ru/hit(?:;\\S+)?\\?(?:t\\d+\\.\\d+;)?r", - "", - "", - "]*/sites/[a-z\\d]{24}/theme/stylesheets", - "icon": "Locomotive.png", - "implies": [ - "Ruby on Rails", - "MongoDB" - ], - "website": "http://www.locomotivecms.com" - }, - "Logitech Media Server": { - "cats": [ - "22", - "38" - ], - "headers": { - "Server": "Logitech Media Server(?: \\(([\\d\\.]+))?\\;version:\\1" - }, - "icon": "Logitech Media Server.png", - "website": "http://www.mysqueezebox.com" - }, - "Lotus Domino": { - "cats": [ - "22" - ], - "headers": { - "Server": "Lotus-Domino" - }, - "icon": "Lotus Domino.png", - "implies": "Java", - "website": "http://www-01.ibm.com/software/lotus/products/domino" - }, - "Lua": { - "cats": [ - "27" - ], - "headers": { - "X-Powered-By": "\bLua(?: ([\\d.]+))?\\;version:\\1" - }, - "icon": "Lua.png", - "website": "http://www.lua.org" - }, - "Lucene": { - "cats": [ - "34" - ], - "icon": "Lucene.png", - "implies": "Java", - "website": "http://lucene.apache.org/core/" - }, - "M.R. Inc BoxyOS": { - "cats": [ - "28" - ], - "icon": "M.R. Inc.png", - "website": "http://mrincworld.com" - }, - "M.R. Inc SiteFrame": { - "cats": [ - "18" - ], - "headers": { - "Powered-By": "M\\.R\\. Inc SiteFrame" - }, - "icon": "M.R. Inc.png", - "website": "http://mrincworld.com" - }, - "M.R. Inc Webserver": { - "cats": [ - "22" - ], - "headers": { - "Server": "M\\.R\\. Inc Webserver" - }, - "icon": "M.R. Inc.png", - "implies": [ - "M.R. Inc BoxyOS" - ], - "website": "http://mrincworld.com" - }, - "MHonArc": { - "cats": [ - "50" - ], - "html": "\\;version:\\1", - "icon": "mhonarc.png", - "website": "http://www.mhonarc.at" - }, - "MOBOTIX": { - "cats": [ - "39" - ], - "icon": "MOBOTIX.png", - "meta": { - "author": "MOBOTIX AG\\;confidence:40", - "copyright": "MOBOTIX AG\\;confidence:40", - "publisher": "MOBOTIX AG\\;confidence:40" - }, - "url": "control/userimage\\.html\\;confidence:70", - "website": "http://mobotix.com" - }, - "MODX": { - "cats": [ - "1" - ], - "env": "^MODX_MEDIA_PATH$", - "headers": { - "Set-Cookie": "SN5[a-f\\d]{12}", - "X-Powered-By": "^MODX" - }, - "html": [ - "]+>Powered by MODX", - "<(?:link|script)[^>]+assets/snippets/\\;confidence:20", - "]+id=\"ajaxSearch_form\\;confidence:20", - "]+id=\"ajaxSearch_input\\;confidence:20" - ], - "icon": "MODX.png", - "implies": "PHP", - "meta": { - "generator": "MODX[^\\d.]*([\\d.]+)?\\;version:\\1" - }, - "website": "http://modx.com" - }, - "MadAdsMedia": { - "cats": [ - "36" - ], - "env": "^setM(?:Iframe|RefURL)$", - "icon": "MadAdsMedia.png", - "script": "^https?://(?:ads-by|pixel)\\.madadsmedia.com/", - "website": "http://madadsmedia.com" - }, - "Magento": { - "cats": [ - "6" - ], - "env": [ - "^(?:Mage|VarienForm)$" - ], - "headers": { - "Set-Cookie": "frontend=\\;confidence:50" - }, - "html": [ - "