From 4c1e80f0d27bafb37916eef6082a37b59b4c37e5 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 9 Aug 2017 22:51:37 +0300 Subject: [PATCH 01/19] Replace png > svg --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index ac052dc09..6084e07fd 100755 --- a/src/apps.json +++ b/src/apps.json @@ -5331,7 +5331,7 @@ "cats": [ "12" ], - "icon": "moon.png", + "icon": "moon.svg", "script": "/moon(?:\\.min)?\\.js$", "website": "http://moonjs.ga/" }, From d922aa269cfaa0db8e3bf482a50c8058f01d5e7b Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 9 Aug 2017 22:52:09 +0300 Subject: [PATCH 02/19] Delete moon.png --- src/icons/moon.png | Bin 1386 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/icons/moon.png diff --git a/src/icons/moon.png b/src/icons/moon.png deleted file mode 100644 index eb8ff3afd67ca0827c8ea96ad7cfa2c8c738edec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1386 zcmV-w1(o`VP)(_`g8%^e{{R4h=l}px2mk>USO5SzmjD14Z`WEM zkN^M#@JU2LR9M5sm`jKpRTPH5|J>@#OcI0mz(;%~5{wIjFN`iiHVP^TLKcD|f)EHO zYBqvF1vf4f2aOP2x^bfrL3ge+ZWLemAmS?^XcjsVlX-X5y~jmW^;A{&ydshdmznD7 z?(?5>{{O$HTJFxdTv_wtrnmlS-*q4eGXntv$B{#?FUIGw-lA?EThQ*Y1#KUj)6TJl z@U^V>tmEqku#PnjJSyoybKPo5V-|%ap(6E3i%9%005YVP3?0lOSRuk-Lze3l&ckkg zb}bmayxh{gG93lRLJnEMAaE!kD}+U!bYo`C>8}ZZgG?_XJ>!5JLOvpR&X+|>Z@c{m z5)Sjmu`IlS=|FwYVj0w`;32BMKAco?_3QzJW^BhocwQkKz#ZhsMV6NtH!ENTv*1T< zo!PsVYk@locDH)r1(H{_5FwT2w*o?}b_wK|(9F6V#Ub^)10dG_2pkI zl|R`rUq|^}kTTf%i?spR1}k}BI)v%!y6-NqRFki8T7Fn?QWtwRQ%`9Za})0Jt1U`-Y^L zR2fgr`Vz>J6v=!Y=3_PeyDE@tm(cE|7Z^y-YVyT)D=b3jhYN7l%)%64af6rKYC~fe zVq3E#N+Wt-t00Q35Lv;FVUCR67GZvqv-69LD}S~&07=`rme?hoMaY_Jh!Aq_utl-j zR$t7G!}XtK-1K#+fUXf;Sl7OmURIN@B3^aq3{1!h$Rc~yFA2Mn_UE=ZJHHC-`oWk5 zavKKFqOvu!&mrV$zgGRt3a$x-_PX@(a={liJ3GELuKUTD1Bw7PtOBM~OV6t#HbP<331hJi-r{|${{D@_&!S^IjbN4Y4Yk6O*pP?GiCLJK zgNb>_a%by_j4MuNEC`Z@k9_Me;JD+TT4Kp~YS+s(AYK;LJPAtxIRv@8fJ-69AicY~Im~ z;|s<9kSZS-44<7zsAEW0lt7hQeZNn}w8SKE(TV^zPaB)3jV&{Q@xS?m+4NNC9L388 zZ*oDS6Fn&Lm&7sPAaIXhYkMTi&ue`mCSJoAF3Ac#(=K(V_pwp_#A;84dw@L>B4xdy{|00S{M$G^_?TDPx9rvCzbo{A!n+z-e$=wi>^qz zhIP{6Mw}xWQo#x!TzuxyFSgvD4!O^DA5I44Uq1WO4o@U!tHU=MDZ^C?fgs^8EBPiX z{DDyT2cc{ap&0qGKY{mv``tMo=k=PQezw042;mZrzeD0EiQ5#pMa~s2&a1xrjKlB1 s=YlVwe7@4?3HjXqL}Q%eb Date: Wed, 9 Aug 2017 22:52:30 +0300 Subject: [PATCH 03/19] Add files via upload --- src/icons/moon.svg | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/icons/moon.svg diff --git a/src/icons/moon.svg b/src/icons/moon.svg new file mode 100644 index 000000000..e9f43de83 --- /dev/null +++ b/src/icons/moon.svg @@ -0,0 +1,2 @@ + +Moon Logo From 1dcb32e04cb762aab4649289b25b5c8f437df381 Mon Sep 17 00:00:00 2001 From: Robin Verton Date: Fri, 11 Aug 2017 10:33:42 +0200 Subject: [PATCH 04/19] Fix apps.json (wrong type of a category) --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index ac052dc09..9f070b34e 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8521,7 +8521,7 @@ }, "UMI.CMS": { "cats": [ - 1 + "1" ], "headers": { "X-Generated-By": "UMI.CMS" From aa6b86882e0459d886a469c3cba1821737cb7654 Mon Sep 17 00:00:00 2001 From: Fabian Schultz Date: Fri, 11 Aug 2017 12:15:13 +0200 Subject: [PATCH 05/19] Add now & next.js. --- src/apps.json | 28 ++++++++++++++++++++++++++++ src/icons/zeit.svg | 1 + 2 files changed, 29 insertions(+) create mode 100644 src/icons/zeit.svg diff --git a/src/apps.json b/src/apps.json index ac052dc09..347d21025 100755 --- a/src/apps.json +++ b/src/apps.json @@ -5585,6 +5585,24 @@ "icon": "New Relic.png", "website": "http://newrelic.com" }, + "Next.js": { + "cats": [ + "18", + "22" + ], + "headers": { + "x-powered-by": "^Next.js ?([0-9.]+)?\\;version:\\1" + }, + "html": "<[^>]+__next", + "env": "^__NEXT_DATA__$", + "icon": "zeit.svg", + "implies": [ + "React", + "webpack", + "Node.js" + ], + "website": "https://zeit.co/next" + }, "Nginx": { "cats": [ "22" @@ -5614,6 +5632,16 @@ "script": "^/nodebb\\.min\\.js\\?", "website": "https://nodebb.org" }, + "Now": { + "cats": [ + "22" + ], + "headers": { + "server": "now" + }, + "icon": "zeit.svg", + "website": "https://zeit.co/now" + }, "OWL Carousel": { "cats": [ "5" diff --git a/src/icons/zeit.svg b/src/icons/zeit.svg new file mode 100644 index 000000000..8ce0bfb63 --- /dev/null +++ b/src/icons/zeit.svg @@ -0,0 +1 @@ +ZeitCreated with Sketch. \ No newline at end of file From 6b936bf660ca300b47695177e3a07438f13877e1 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 11 Aug 2017 13:40:35 +0300 Subject: [PATCH 06/19] Update moon.svg --- src/icons/moon.svg | 1 - 1 file changed, 1 deletion(-) diff --git a/src/icons/moon.svg b/src/icons/moon.svg index e9f43de83..281a6660d 100644 --- a/src/icons/moon.svg +++ b/src/icons/moon.svg @@ -1,2 +1 @@ - Moon Logo From 83f4b7b2f1f13d1ad19ad16dd692ff6b82cb7258 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 11 Aug 2017 21:00:20 +0300 Subject: [PATCH 07/19] Delete Akamai.png --- src/icons/Akamai.png | Bin 845 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/icons/Akamai.png diff --git a/src/icons/Akamai.png b/src/icons/Akamai.png deleted file mode 100644 index fa2be98a260136f740bf10334df344097c7c504f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmV-T1G4;yP)080y2$g)VptZfpru#KKtM9L@;DpIDlWeJg%lu$(tktjh; zLZjBS3Oo!39==E4tJAN0_ny6X->pyY-E)4w-#PdE&hMOiE$ct7$#pHsU?f-xYQYuo z1hj)za2qs$B9H>&tY}!|>%ms@Oy0sTW6?+02q;XN3tbWIM%PJ&V}LB@i?AdSDn!8~vj1UcuiB(t0G1aN@^zkxi; zdxDFU{{YRPKshXiM}tXV6b+~9kmG-EPy;@I)3TD#70p5b~;3f4(q(*dMbOhKBE|WuGj)a^EED@ZoC!{mEYzKC; z*o@&|KR7^LZ5TCVAdjSM%Pl6P%smViGItvPodOE=KCPxakN17J$nkDg)La%IS*si@ zVD6;Z1L_P1iYYJSUdtK(DEk>fKauU+3p#l(+mc}`?-~x2P`(M&gQ?(r6q=eGy=Q!& zERbj`%%ifF@-1K=J6=VUI_oqk(WWqHIIxHEawd)>X^!R9CHrDHU?0PLaE@aJcU5f&>P@MKmkuQIHQH$_R#>sPu3 z2VI=_BA;WiibSQ06G6VwCda}Fc?rGd&@Jt613w#8yw{FQ=l8-1@Q`0ao$T$~BaOx% X;LaF69cdTc00000NkvXXu0mjfitK}- From 96dcd3a0779d442aec974c4a4eebd8d37023ac81 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 11 Aug 2017 21:00:48 +0300 Subject: [PATCH 08/19] Uploaded Akamai svg logo --- src/icons/akamai.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/icons/akamai.svg diff --git a/src/icons/akamai.svg b/src/icons/akamai.svg new file mode 100644 index 000000000..ab4168ba7 --- /dev/null +++ b/src/icons/akamai.svg @@ -0,0 +1 @@ + \ No newline at end of file From a12a8cc54ee457b5c6ecaa19e403e076482a9d0f Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 11 Aug 2017 21:01:46 +0300 Subject: [PATCH 09/19] svg > png --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index ac052dc09..7fcad753a 100755 --- a/src/apps.json +++ b/src/apps.json @@ -401,7 +401,7 @@ "headers": { "X-Akamai-Transformed": "" }, - "icon": "Akamai.png", + "icon": "akamai.svg", "website": "http://akamai.com" }, "Akka HTTP": { From fad1cfb0a1445e5fbc4c08f0e1bd751f8bc29107 Mon Sep 17 00:00:00 2001 From: AlexByte Date: Sun, 13 Aug 2017 03:06:25 +0300 Subject: [PATCH 10/19] Fix bookmarklet driver. --- src/drivers/bookmarklet/driver.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/drivers/bookmarklet/driver.js b/src/drivers/bookmarklet/driver.js index 230ff6aaf..28cfca9c1 100644 --- a/src/drivers/bookmarklet/driver.js +++ b/src/drivers/bookmarklet/driver.js @@ -105,9 +105,9 @@ '' + '
'; - if ( w.detected[url] != null && Object.keys(w.detected[url]).length ) { - for ( app in w.detected[url] ) { - if ( !hasOwn.call(w.detected[url], app) ) { + if ( detected[url] != null && Object.keys(detected[url]).length ) { + for ( app in detected[url] ) { + if ( !hasOwn.call(detected[url], app) ) { continue; } @@ -154,5 +154,5 @@ } }; - w.init(); + w.driver.init(); })(); From 40fc9af9b63eaabd02c3bd85be5d185977380a5f Mon Sep 17 00:00:00 2001 From: Gerard Nguyen Date: Tue, 15 Aug 2017 11:35:24 +0800 Subject: [PATCH 11/19] Add Bizweb --- src/apps.json | 8 ++++++++ src/icons/bizweb.png | Bin 0 -> 52418 bytes 2 files changed, 8 insertions(+) create mode 100644 src/icons/bizweb.png diff --git a/src/apps.json b/src/apps.json index ac052dc09..b722fd7ec 100755 --- a/src/apps.json +++ b/src/apps.json @@ -939,6 +939,14 @@ "script": "bittads\\.com/js/bitt\\.js$", "website": "http://bittads.com" }, + "Bizweb":{ + "cats": [ + "6" + ], + "env": "^Bizweb$", + "icon": "Bizweb.png", + "website": "https://www.bizweb.vn" + }, "Blesta": { "cats": [ "6" diff --git a/src/icons/bizweb.png b/src/icons/bizweb.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe062bb2e0e6a7d54227038f74e5aca5e70996f GIT binary patch literal 52418 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 literal 0 HcmV?d00001 From fbb20bd939307df30814b0d8169043ce749b0d20 Mon Sep 17 00:00:00 2001 From: Gerard Nguyen Date: Tue, 15 Aug 2017 11:35:24 +0800 Subject: [PATCH 12/19] Add Bizweb --- src/apps.json | 8 ++++++++ src/icons/bizweb.png | Bin 0 -> 52418 bytes 2 files changed, 8 insertions(+) create mode 100644 src/icons/bizweb.png diff --git a/src/apps.json b/src/apps.json index ac052dc09..fd211ccd2 100755 --- a/src/apps.json +++ b/src/apps.json @@ -939,6 +939,14 @@ "script": "bittads\\.com/js/bitt\\.js$", "website": "http://bittads.com" }, + "Bizweb":{ + "cats": [ + "6" + ], + "env": "^Bizweb$", + "icon": "bizweb.png", + "website": "https://www.bizweb.vn" + }, "Blesta": { "cats": [ "6" diff --git a/src/icons/bizweb.png b/src/icons/bizweb.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe062bb2e0e6a7d54227038f74e5aca5e70996f GIT binary patch literal 52418 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 literal 0 HcmV?d00001 From 20956433a989919c0332270888b0180d27e14eba Mon Sep 17 00:00:00 2001 From: Jon Edmiston Date: Thu, 17 Aug 2017 23:34:35 -0700 Subject: [PATCH 13/19] Update RockRMS.svg Updated the Rock RMS logo to be the latest official logo. --- src/icons/RockRMS.svg | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/icons/RockRMS.svg b/src/icons/RockRMS.svg index 6b352f6ca..b66f8e881 100644 --- a/src/icons/RockRMS.svg +++ b/src/icons/RockRMS.svg @@ -1 +1,4 @@ -rock-logo \ No newline at end of file + From e434d99a38799363718d2a1322247f6d4dcd2bef Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 22 Aug 2017 19:56:44 +0300 Subject: [PATCH 14/19] Update moon.svg --- src/icons/moon.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/icons/moon.svg b/src/icons/moon.svg index 281a6660d..1a7e75325 100644 --- a/src/icons/moon.svg +++ b/src/icons/moon.svg @@ -1 +1 @@ -Moon Logo +image/svg+xmlMoon LogoMoon Logo From 3057e396d9ddcddb80b23d57689cd706cfd90659 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 26 Aug 2017 17:29:57 +1000 Subject: [PATCH 15/19] Change wappalyzer object to Wappalyzer class to allow running of multiple instances --- src/drivers/npm/driver.js | 12 +- src/drivers/npm/package.json | 2 +- src/drivers/webextension/js/driver.js | 4 +- src/drivers/webextension/manifest.edge.json | 2 +- src/drivers/webextension/manifest.json | 2 +- src/wappalyzer.js | 804 ++++++++++---------- 6 files changed, 417 insertions(+), 409 deletions(-) diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js index b31c66205..cc55549dd 100644 --- a/src/drivers/npm/driver.js +++ b/src/drivers/npm/driver.js @@ -1,19 +1,21 @@ 'use strict'; -const wappalyzer = require('./wappalyzer'); +const Wappalyzer = require('./wappalyzer'); const request = require('request'); const fs = require('fs'); const Browser = require('zombie'); const json = JSON.parse(fs.readFileSync(__dirname + '/apps.json')); -wappalyzer.apps = json.apps; -wappalyzer.categories = json.categories; - const driver = { quiet: true, analyze: url => { + const wappalyzer = new Wappalyzer(); + + wappalyzer.apps = json.apps; + wappalyzer.categories = json.categories; + return new Promise((resolve, reject) => { wappalyzer.driver.log = (message, source, type) => { if ( type === 'error' ) { @@ -51,6 +53,8 @@ const driver = { }); }); + console.log('resolve ' + url); + resolve(apps); }; diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index 891db4dec..9f7982aea 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.0.5", + "version": "5.0.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 79b547100..ac26cb55c 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -3,7 +3,9 @@ */ /** global: browser */ -/** global: wappalyzer */ +/** global: Wappalyzer */ + +const wappalyzer = new Wappalyzer(); var tabCache = {}; var headersCache = {}; diff --git a/src/drivers/webextension/manifest.edge.json b/src/drivers/webextension/manifest.edge.json index cc27ef105..b2a544023 100644 --- a/src/drivers/webextension/manifest.edge.json +++ b/src/drivers/webextension/manifest.edge.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://wappalyzer.com/", "description": "Identify web technologies", - "version": "5.0.5", + "version": "5.0.7", "default_locale": "en", "manifest_version": 2, "icons": { diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 2c28dd9fe..8d821774b 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://wappalyzer.com/", "description": "Identify web technologies", - "version": "5.0.5", + "version": "5.0.7", "default_locale": "en", "manifest_version": 2, "icons": { diff --git a/src/wappalyzer.js b/src/wappalyzer.js index 94b950c28..dbc97610b 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -13,517 +13,519 @@ const validation = { hostnameBlacklist: /((local|dev(elopment)?|stag(e|ing)?|test(ing)?|demo(shop)?|admin|google|cache)\.|\/admin|\.local)/ }; -var wappalyzer = { - apps: {}, - categories: {}, - driver: {} -}; +class Wappalyzer { + constructor() { + this.apps = {}; + this.categories = {}; + this.driver = {}; + + this.detected = {}; + this.hostnameCache = {}; + this.adCache = []; + + this.config = { + websiteURL: 'https://wappalyzer.com/', + twitterURL: 'https://twitter.com/Wappalyzer', + githubURL: 'https://github.com/AliasIO/Wappalyzer', + }; + } -var detected = {}; -var hostnameCache = {}; -var adCache = []; + /** + * Log messages to console + */ + log(message, source, type) { + this.driver.log(message, source || '', type || 'debug'); + } -wappalyzer.config = { - websiteURL: 'https://wappalyzer.com/', - twitterURL: 'https://twitter.com/Wappalyzer', - githubURL: 'https://github.com/AliasIO/Wappalyzer', -}; + analyze(hostname, url, data, context) { + var apps = {}; -/** - * Log messages to console - */ -wappalyzer.log = (message, source, type) => { - wappalyzer.driver.log(message, source || '', type || 'debug'); -}; + // Remove hash from URL + data.url = url = url.split('#')[0]; -wappalyzer.analyze = (hostname, url, data, context) => { - var apps = {}; - - // Remove hash from URL - data.url = url = url.split('#')[0]; + if ( typeof data.html !== 'string' ) { + data.html = ''; + } - if ( typeof data.html !== 'string' ) { - data.html = ''; - } + if ( this.detected[url] === undefined ) { + this.detected[url] = {}; + } - if ( detected[url] === undefined ) { - detected[url] = {}; - } + Object.keys(this.apps).forEach(appName => { + apps[appName] = this.detected[url] && this.detected[url][appName] ? this.detected[url][appName] : new Application(appName, this.apps[appName]); - Object.keys(wappalyzer.apps).forEach(appName => { - apps[appName] = detected[url] && detected[url][appName] ? detected[url][appName] : new Application(appName, wappalyzer.apps[appName]); + var app = apps[appName]; - var app = apps[appName]; + if ( url ) { + this.analyzeUrl(app, url); + } - if ( url ) { - analyzeUrl(app, url); - } + if ( data.html ) { + this.analyzeHtml(app, data.html); + this.analyzeScript(app, data.html); + this.analyzeMeta(app, data.html); + } - if ( data.html ) { - analyzeHtml(app, data.html); - analyzeScript(app, data.html); - analyzeMeta(app, data.html); - } + if ( data.headers ) { + this.analyzeHeaders(app, data.headers); + } - if ( data.headers ) { - analyzeHeaders(app, data.headers); - } + if ( data.env ) { + this.analyzeEnv(app, data.env); + } - if ( data.env ) { - analyzeEnv(app, data.env); - } + if ( data.robotsTxt ) { + this.analyzeRobotsTxt(app, data.robotsTxt); + } + }) - if ( data.robotsTxt ) { - analyzeRobotsTxt(app, data.robotsTxt); - } - }) + Object.keys(apps).forEach(appName => { + var app = apps[appName]; - Object.keys(apps).forEach(appName => { - var app = apps[appName]; + if ( !app.detected || !app.getConfidence() ) { + delete apps[app.name]; + } + }); - if ( !app.detected || !app.getConfidence() ) { - delete apps[app.name]; - } - }); + this.resolveExcludes(apps); + this.resolveImplies(apps, url); - resolveExcludes(apps); - resolveImplies(apps, url); + this.cacheDetectedApps(apps, url); + this.trackDetectedApps(apps, url, hostname, data.html); - cacheDetectedApps(apps, url); - trackDetectedApps(apps, url, hostname, data.html); + if ( Object.keys(apps).length ) { + this.log(Object.keys(apps).length + ' apps detected: ' + Object.keys(apps).join(', ') + ' on ' + url, 'core'); + } - if ( Object.keys(apps).length ) { - wappalyzer.log(Object.keys(apps).length + ' apps detected: ' + Object.keys(apps).join(', ') + ' on ' + url, 'core'); + this.driver.displayApps(this.detected[url], context); } - wappalyzer.driver.displayApps(detected[url], context); -} + /** + * Cache detected ads + */ + cacheDetectedAds(ad) { + this.adCache.push(ad); + } -/** - * Cache detected ads - */ -wappalyzer.cacheDetectedAds = ad => { - adCache.push(ad); -} + /** + * + */ + robotsTxtAllows(url) { + return new Promise((resolve, reject) => { + var parsed = this.parseUrl(url); + + this.driver.getRobotsTxt(parsed.host, parsed.protocol === 'https:') + .then(robotsTxt => { + robotsTxt.forEach(disallow => { + if ( parsed.pathname.indexOf(disallow) === 0 ) { + reject(); + } + }); -/** - * - */ -wappalyzer.robotsTxtAllows = url => { - return new Promise((resolve, reject) => { - var parsed = wappalyzer.parseUrl(url); - - wappalyzer.driver.getRobotsTxt(parsed.host, parsed.protocol === 'https:') - .then(robotsTxt => { - robotsTxt.forEach(disallow => { - if ( parsed.pathname.indexOf(disallow) === 0 ) { - reject(); - } + resolve(); }); + }); + }; - resolve(); - }); - }); -}; - -/** - * Parse a URL - */ -wappalyzer.parseUrl = url => { - var a = wappalyzer.driver.document.createElement('a'); + /** + * Parse a URL + */ + parseUrl(url) { + var a = this.driver.document.createElement('a'); - a.href = url; + a.href = url; - a.canonical = a.protocol + '//' + a.host + a.pathname; + a.canonical = a.protocol + '//' + a.host + a.pathname; - return a; -} + return a; + } -/** - * - */ -wappalyzer.parseRobotsTxt = robotsTxt => { - var userAgent; - var disallow = []; + /** + * + */ + parseRobotsTxt(robotsTxt) { + var userAgent; + var disallow = []; - robotsTxt.split('\n').forEach(line => { - var matches = /^User-agent:\s*(.+)$/i.exec(line); + robotsTxt.split('\n').forEach(line => { + var matches = /^User-agent:\s*(.+)$/i.exec(line); - if ( matches ) { - userAgent = matches[1].toLowerCase(); - } else { - if ( userAgent === '*' || userAgent === 'wappalyzer' ) { - matches = /^Disallow:\s*(.+)$/i.exec(line); + if ( matches ) { + userAgent = matches[1].toLowerCase(); + } else { + if ( userAgent === '*' || userAgent === 'wappalyzer' ) { + matches = /^Disallow:\s*(.+)$/i.exec(line); - if ( matches ) { - disallow.push(matches[1]); + if ( matches ) { + disallow.push(matches[1]); + } } } - } - }); - - return disallow; -} - -/** - * - */ -wappalyzer.ping = () => { - if ( Object.keys(hostnameCache).length >= 50 || adCache.length >= 50 ) { - wappalyzer.driver.ping(hostnameCache, adCache); + }); - hostnameCache = {}; - adCache = []; + return disallow; } -} -/** - * Enclose string in array - */ -function asArray(value) { - return typeof value === 'string' ? [ value ] : value; -} - -/** - * Parse apps.json patterns - */ -function parsePatterns(patterns) { - var parsed = {}; + /** + * + */ + ping() { + if ( Object.keys(this.hostnameCache).length >= 50 || this.adCache.length >= 50 ) { + this.driver.ping(this.hostnameCache, this.adCache); - // Convert string to object containing array containing string - if ( typeof patterns === 'string' || patterns instanceof Array ) { - patterns = { - main: asArray(patterns) - }; + this.hostnameCache = {}; + this.adCache = []; + } } - for ( var key in patterns ) { - parsed[key] = []; - - asArray(patterns[key]).forEach(pattern => { - var attrs = {}; - - pattern.split('\\;').forEach((attr, i) => { - if ( i ) { - // Key value pairs - attr = attr.split(':'); - - if ( attr.length > 1 ) { - attrs[attr.shift()] = attr.join(':'); - } - } else { - attrs.string = attr; + /** + * Enclose string in array + */ + asArray(value) { + return typeof value === 'string' ? [ value ] : value; + } - try { - attrs.regex = new RegExp(attr.replace('/', '\/'), 'i'); // Escape slashes in regular expression - } catch (e) { - attrs.regex = new RegExp(); + /** + * Parse apps.json patterns + */ + parsePatterns(patterns) { + var parsed = {}; + + // Convert string to object containing array containing string + if ( typeof patterns === 'string' || patterns instanceof Array ) { + patterns = { + main: this.asArray(patterns) + }; + } - wappalyzer.log(e + ': ' + attr, 'error', 'core'); - } - } - }); + for ( var key in patterns ) { + parsed[key] = []; - parsed[key].push(attrs); - }); - } + this.asArray(patterns[key]).forEach(pattern => { + var attrs = {}; - // Convert back to array if the original pattern list was an array (or string) - if ( 'main' in parsed ) { - parsed = parsed.main; - } + pattern.split('\\;').forEach((attr, i) => { + if ( i ) { + // Key value pairs + attr = attr.split(':'); - return parsed; -} + if ( attr.length > 1 ) { + attrs[attr.shift()] = attr.join(':'); + } + } else { + attrs.string = attr; -function resolveExcludes(apps) { - var excludes = []; + try { + attrs.regex = new RegExp(attr.replace('/', '\/'), 'i'); // Escape slashes in regular expression + } catch (e) { + attrs.regex = new RegExp(); - // Exclude app in detected apps only - Object.keys(apps).forEach(appName => { - var app = apps[appName]; + this.log(e + ': ' + attr, 'error', 'core'); + } + } + }); - if ( app.props.excludes ) { - asArray(app.props.excludes).forEach(excluded => { - excludes.push(excluded); + parsed[key].push(attrs); }); } - }) - // Remove excluded applications - Object.keys(apps).forEach(appName => { - if ( excludes.indexOf(appName) !== -1 ) { - delete apps[appName]; + // Convert back to array if the original pattern list was an array (or string) + if ( 'main' in parsed ) { + parsed = parsed.main; } - }) -} -function resolveImplies(apps, url) { - var checkImplies = true; + return parsed; + } - // Implied applications - // Run several passes as implied apps may imply other apps - while ( checkImplies ) { - checkImplies = false; + resolveExcludes(apps) { + var excludes = []; + // Exclude app in detected apps only Object.keys(apps).forEach(appName => { var app = apps[appName]; - if ( app && app.implies ) { - asArray(app.props.implies).forEach(implied => { - implied = parsePatterns(implied)[0]; - - if ( !wappalyzer.apps[implied.string] ) { - wappalyzer.log('Implied application ' + implied.string + ' does not exist', 'core', 'warn'); - - return; - } - - if ( !( implied.string in apps ) ) { - apps[implied.string] = detected[url] && detected[url][implied.string] ? detected[url][implied.string] : new Application(implied.string, true); - - checkImplies = true; - } - - // Apply app confidence to implied app - Object.keys(app.confidence).forEach(id => { - apps[implied.string].confidence[id + ' implied by ' + appName] = app.confidence[id] * ( implied.confidence ? implied.confidence / 100 : 1 ); - }); + if ( app.props.excludes ) { + this.asArray(app.props.excludes).forEach(excluded => { + excludes.push(excluded); }); } - }); - } -} + }) -/** - * Cache detected applications - */ -function cacheDetectedApps(apps, url) { - if (!wappalyzer.driver.ping instanceof Function) return; + // Remove excluded applications + Object.keys(apps).forEach(appName => { + if ( excludes.indexOf(appName) !== -1 ) { + delete apps[appName]; + } + }) + } - Object.keys(apps).forEach(appName => { - var app = apps[appName]; + resolveImplies(apps, url) { + var checkImplies = true; - // Per URL - detected[url][appName] = app; + // Implied applications + // Run several passes as implied apps may imply other apps + while ( checkImplies ) { + checkImplies = false; - Object.keys(app.confidence).forEach(id => { - detected[url][appName].confidence[id] = app.confidence[id]; - }); - }) + Object.keys(apps).forEach(appName => { + var app = apps[appName]; - wappalyzer.ping(); -} + if ( app && app.implies ) { + this.asArray(app.props.implies).forEach(implied => { + implied = this.parsePatterns(implied)[0]; -/** - * Track detected applications - */ -function trackDetectedApps(apps, url, hostname, html) { - if (!wappalyzer.driver.ping instanceof Function) return; - - Object.keys(apps).forEach(appName => { - var app = apps[appName]; - - if ( detected[url][appName].getConfidence() >= 100 ) { - if ( validation.hostname.test(hostname) && !validation.hostnameBlacklist.test(url) ) { - wappalyzer.robotsTxtAllows(url) - .then(() => { - if ( !( hostname in hostnameCache ) ) { - hostnameCache[hostname] = { - applications: {}, - meta: {} - }; - } + if ( !this.apps[implied.string] ) { + this.log('Implied application ' + implied.string + ' does not exist', 'core', 'warn'); - if ( !( appName in hostnameCache[hostname].applications ) ) { - hostnameCache[hostname].applications[appName] = { - hits: 0 - }; + return; } - hostnameCache[hostname].applications[appName].hits ++; + if ( !( implied.string in apps ) ) { + apps[implied.string] = this.detected[url] && this.detected[url][implied.string] ? this.detected[url][implied.string] : new Application(implied.string, true); - if ( apps[appName].version ) { - hostnameCache[hostname].applications[appName].version = app.version; + checkImplies = true; } - }) - .catch(() => console.log('Disallowed in robots.txt: ' + url)) - } + + // Apply app confidence to implied app + Object.keys(app.confidence).forEach(id => { + apps[implied.string].confidence[id + ' implied by ' + appName] = app.confidence[id] * ( implied.confidence ? implied.confidence / 100 : 1 ); + }); + }); + } + }); } - }); + } - // Additional information - if ( hostname in hostnameCache ) { - var match = html.match(/]*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"/i); + /** + * Cache detected applications + */ + cacheDetectedApps(apps, url) { + if (!this.driver.ping instanceof Function) return; - if ( match && match.length ) { - hostnameCache[hostname].meta['language'] = match[1]; - } + Object.keys(apps).forEach(appName => { + var app = apps[appName]; + + // Per URL + this.detected[url][appName] = app; + + Object.keys(app.confidence).forEach(id => { + this.detected[url][appName].confidence[id] = app.confidence[id]; + }); + }) + + this.ping(); } - wappalyzer.ping(); -} + /** + * Track detected applications + */ + trackDetectedApps(apps, url, hostname, html) { + if (!this.driver.ping instanceof Function) return; -/** - * Analyze URL - */ -function analyzeUrl(app, url) { - var patterns = parsePatterns(app.props.url); + Object.keys(apps).forEach(appName => { + var app = apps[appName]; - if ( patterns.length ) { - patterns.forEach(pattern => { - if ( pattern.regex.test(url) ) { - addDetected(app, pattern, 'url', url); + if ( this.detected[url][appName].getConfidence() >= 100 ) { + if ( validation.hostname.test(hostname) && !validation.hostnameBlacklist.test(url) ) { + this.robotsTxtAllows(url) + .then(() => { + if ( !( hostname in this.hostnameCache ) ) { + this.hostnameCache[hostname] = { + applications: {}, + meta: {} + }; + } + + if ( !( appName in this.hostnameCache[hostname].applications ) ) { + this.hostnameCache[hostname].applications[appName] = { + hits: 0 + }; + } + + this.hostnameCache[hostname].applications[appName].hits ++; + + if ( apps[appName].version ) { + this.hostnameCache[hostname].applications[appName].version = app.version; + } + }) + .catch(() => console.log('Disallowed in robots.txt: ' + url)) + } } }); - } -} -/** - * Analyze HTML - */ -function analyzeHtml(app, html) { - var patterns = parsePatterns(app.props.html); + // Additional information + if ( hostname in this.hostnameCache ) { + var match = html.match(/]*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"/i); - if ( patterns.length ) { - patterns.forEach(pattern => { - if ( pattern.regex.test(html) ) { - addDetected(app, pattern, 'html', html); + if ( match && match.length ) { + this.hostnameCache[hostname].meta['language'] = match[1]; } - }); + } + + this.ping(); } -} -/** - * Analyze script tag - */ -function analyzeScript(app, html) { - var regex = new RegExp(']+src=("|\')([^"\']+)', 'ig'); - var patterns = parsePatterns(app.props.script); + /** + * Analyze URL + */ + analyzeUrl(app, url) { + var patterns = this.parsePatterns(app.props.url); - if ( patterns.length ) { - patterns.forEach(pattern => { - var match; + if ( patterns.length ) { + patterns.forEach(pattern => { + if ( pattern.regex.test(url) ) { + this.addDetected(app, pattern, 'url', url); + } + }); + } + } + + /** + * Analyze HTML + */ + analyzeHtml(app, html) { + var patterns = this.parsePatterns(app.props.html); - while ( ( match = regex.exec(html) ) ) { - if ( pattern.regex.test(match[2]) ) { - addDetected(app, pattern, 'script', match[2]); + if ( patterns.length ) { + patterns.forEach(pattern => { + if ( pattern.regex.test(html) ) { + this.addDetected(app, pattern, 'html', html); } - } - }); + }); + } } -} -/** - * Analyze meta tag - */ -function analyzeMeta(app, html) { - var regex = /]+>/ig; - var patterns = parsePatterns(app.props.meta); - var content; - var match; - - while ( patterns && ( match = regex.exec(html) ) ) { - for ( var meta in patterns ) { - if ( new RegExp('(name|property)=["\']' + meta + '["\']', 'i').test(match) ) { - content = match.toString().match(/content=("|')([^"']+)("|')/i); - - patterns[meta].forEach(pattern => { - if ( content && content.length === 4 && pattern.regex.test(content[2]) ) { - addDetected(app, pattern, 'meta', content[2], meta); + /** + * Analyze script tag + */ + analyzeScript(app, html) { + var regex = new RegExp(']+src=("|\')([^"\']+)', 'ig'); + var patterns = this.parsePatterns(app.props.script); + + if ( patterns.length ) { + patterns.forEach(pattern => { + var match; + + while ( ( match = regex.exec(html) ) ) { + if ( pattern.regex.test(match[2]) ) { + this.addDetected(app, pattern, 'script', match[2]); } - }); + } + }); + } + } + + /** + * Analyze meta tag + */ + analyzeMeta(app, html) { + var regex = /]+>/ig; + var patterns = this.parsePatterns(app.props.meta); + var content; + var match; + + while ( patterns && ( match = regex.exec(html) ) ) { + for ( var meta in patterns ) { + if ( new RegExp('(name|property)=["\']' + meta + '["\']', 'i').test(match) ) { + content = match.toString().match(/content=("|')([^"']+)("|')/i); + + patterns[meta].forEach(pattern => { + if ( content && content.length === 4 && pattern.regex.test(content[2]) ) { + this.addDetected(app, pattern, 'meta', content[2], meta); + } + }); + } } } } -} -/** - * analyze response headers - */ -function analyzeHeaders(app, headers) { - var patterns = parsePatterns(app.props.headers); + /** + * analyze response headers + */ + analyzeHeaders(app, headers) { + var patterns = this.parsePatterns(app.props.headers); - if ( headers ) { - Object.keys(patterns).forEach(header => { - patterns[header].forEach(pattern => { - header = header.toLowerCase(); + if ( headers ) { + Object.keys(patterns).forEach(header => { + patterns[header].forEach(pattern => { + header = header.toLowerCase(); - if ( header in headers && pattern.regex.test(headers[header]) ) { - addDetected(app, pattern, 'headers', headers[header], header); - } + if ( header in headers && pattern.regex.test(headers[header]) ) { + this.addDetected(app, pattern, 'headers', headers[header], header); + } + }); }); - }); + } } -} -/** - * Analyze environment variables - */ -function analyzeEnv(app, envs) { - var patterns = parsePatterns(app.props.env); - - if ( patterns.length ) { - patterns.forEach(pattern => { - Object.keys(envs).forEach(env => { - if ( pattern.regex.test(envs[env]) ) { - addDetected(app, pattern, 'env', envs[env]); - } - }) - }); + /** + * Analyze environment variables + */ + analyzeEnv(app, envs) { + var patterns = this.parsePatterns(app.props.env); + + if ( patterns.length ) { + patterns.forEach(pattern => { + Object.keys(envs).forEach(env => { + if ( pattern.regex.test(envs[env]) ) { + this.addDetected(app, pattern, 'env', envs[env]); + } + }) + }); + } } -} -/** - * Analyze robots.txt - */ -function analyzeRobotsTxt(app, robotsTxt) { - var patterns = parsePatterns(app.props.robotsTxt); + /** + * Analyze robots.txt + */ + analyzeRobotsTxt(app, robotsTxt) { + var patterns = this.parsePatterns(app.props.robotsTxt); - if ( patterns.length ) { - patterns.forEach(pattern => { - if ( pattern.regex.test(robotsTxt) ) { - addDetected(app, pattern, 'robotsTxt', robotsTxt); - } - }); + if ( patterns.length ) { + patterns.forEach(pattern => { + if ( pattern.regex.test(robotsTxt) ) { + this.addDetected(app, pattern, 'robotsTxt', robotsTxt); + } + }); + } } -} -/** - * Mark application as detected, set confidence and version - */ -function addDetected(app, pattern, type, value, key) { - app.detected = true; + /** + * Mark application as detected, set confidence and version + */ + addDetected(app, pattern, type, value, key) { + app.detected = true; - // Set confidence level - app.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence || 100; + // Set confidence level + app.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence || 100; - // Detect version number - if ( pattern.version ) { - var versions = []; - var version = pattern.version; - var matches = pattern.regex.exec(value); + // Detect version number + if ( pattern.version ) { + var versions = []; + var version = pattern.version; + var matches = pattern.regex.exec(value); - if ( matches ) { - matches.forEach((match, i) => { - // Parse ternary operator - var ternary = new RegExp('\\\\' + i + '\\?([^:]+):(.*)$').exec(version); + if ( matches ) { + matches.forEach((match, i) => { + // Parse ternary operator + var ternary = new RegExp('\\\\' + i + '\\?([^:]+):(.*)$').exec(version); - if ( ternary && ternary.length === 3 ) { - version = version.replace(ternary[0], match ? ternary[1] : ternary[2]); - } + if ( ternary && ternary.length === 3 ) { + version = version.replace(ternary[0], match ? ternary[1] : ternary[2]); + } - // Replace back references - version = version.replace(new RegExp('\\\\' + i, 'g'), match || ''); - }); + // Replace back references + version = version.replace(new RegExp('\\\\' + i, 'g'), match || ''); + }); - if ( version && versions.indexOf(version) === -1 ) { - versions.push(version); - } + if ( version && versions.indexOf(version) === -1 ) { + versions.push(version); + } - if ( versions.length ) { - // Use the longest detected version number - app.version = versions.reduce((a, b) => a.length > b.length ? a : b); + if ( versions.length ) { + // Use the longest detected version number + app.version = versions.reduce((a, b) => a.length > b.length ? a : b); + } } } } @@ -558,5 +560,5 @@ class Application { } if ( typeof module === 'object' ) { - module.exports = wappalyzer; + module.exports = Wappalyzer; } From 735e00383fe2ec1ae92a4aded1cafaf40455182a Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 26 Aug 2017 17:43:46 +1000 Subject: [PATCH 16/19] Fix yarn install in run script --- run | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/run b/run index a8ec820ef..102fc812d 100755 --- a/run +++ b/run @@ -10,13 +10,7 @@ fi cmd="docker run --rm -v "$(pwd):/opt/wappalyzer" -it wappalyzer/dev" -$cmd yarn install - -pushd src/drivers/webextension - -$cmd yarn install - -popd +$cmd sh -c "yarn install; cd src/drivers/webextension; yarn install" $cmd ./bin/run links $cmd ./bin/run $@ From d01bedbf8b9ad4252d192ff9752d17fbbfd0bf09 Mon Sep 17 00:00:00 2001 From: kokororin Date: Sun, 27 Aug 2017 09:03:51 +0800 Subject: [PATCH 17/19] Update Typecho Checking --- src/apps.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/apps.json b/src/apps.json index ac052dc09..9a526f1aa 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8430,6 +8430,10 @@ ], "icon": "typecho.svg", "implies": "PHP", + "env": "^TypechoComment$", + "meta": { + "generator": "Typecho( [\\d.]+)?\\;version:\\1" + }, "url": "/admin/login\\.php?referer=http%3A%2F%2F", "website": "http://typecho.org/" }, From 20b2f9df80a05e930dab98c32f019bf5b71f0c29 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 27 Aug 2017 12:01:50 +1000 Subject: [PATCH 18/19] Revamped WebExtension popup --- src/drivers/npm/package.json | 2 +- src/drivers/webextension/css/popup.css | 130 +++++++++++++------- src/drivers/webextension/html/popup.html | 7 ++ src/drivers/webextension/js/driver.js | 10 +- src/drivers/webextension/js/iframe.js | 31 ++++- src/drivers/webextension/js/network.js | 26 ++-- src/drivers/webextension/js/popup.js | 102 ++++++++------- src/drivers/webextension/manifest.edge.json | 2 +- src/drivers/webextension/manifest.json | 2 +- 9 files changed, 195 insertions(+), 117 deletions(-) diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index 9f7982aea..9f9e36f00 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.0.7", + "version": "5.1.0", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { diff --git a/src/drivers/webextension/css/popup.css b/src/drivers/webextension/css/popup.css index 015a333bd..98c56c2de 100644 --- a/src/drivers/webextension/css/popup.css +++ b/src/drivers/webextension/css/popup.css @@ -1,31 +1,95 @@ body { background: #fff; - color: #4a4a4a; font-family: Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 16px; + font-size: .8rem; + height: 20.8rem; margin: 0; - min-width: 200px; - overflow-x: hidden; - padding: 15px; + overflow: hidden; + width: 30rem; } -a { - color: #4a4a4a; +.header { + align-items: center; + background: linear-gradient(160deg, #32067c, #150233); + height: 4rem; + display: flex; } -a:focus { - outline: 0; +.header__link:focus { + outline: none; } -img { +.header__logo { + display: inline-block; + margin: .2rem 0 0 1.5rem; + -webkit-backface-visibility: hidden; + -webkit-transform: translateZ(0) scale(1.0, 1.0); + transform: translateZ(0); + height: 2rem; +} + +.container { + height: 15.8rem; + overflow: scroll; + padding: 1rem 1.5rem 0rem 1.5rem; +} + +.detected { + columns: 2; + column-gap: 1.5rem; + line-height: 1.4rem; +} + +.detected__category { + break-inside: avoid-column; + padding-bottom: 1rem; +} + +.detected__category-link { + border-bottom: 1px solid #dbdbdb; + display: block; + margin-bottom: .5rem; + text-decoration: none; +} + +.detected__category-name { + color: #4608ad; + display: block; + font-weight: bold; + line-height: 2rem; +} + +.detected__category-link:hover .detected__category-name { + color: #4a4a4a; +} + +.detected__app { + display: block; + line-height: 1.7rem; + text-decoration: none; +} + +.detected__app:focus { + display: block; + outline: 0; +} + +.detected__app-icon { display: inline-block; height: 16px; - margin-right: 8px; - vertical-align: top; + margin-right: .5rem; + vertical-align: -.2rem; width: 16px; } +.detected__app-name { + color: #4a4a4a; +} + +.detected__app:hover .detected__app-name { + border-bottom: 1px solid #4a4a4a; +} + .detected-app { padding: 7px 0; } @@ -39,40 +103,12 @@ img { padding-bottom: 0; } - .detected-app a { - color: #4608ad; - display: block; - text-decoration: none; - } - - .detected-app a .label .name { - border-bottom: 1px solid transparent; - } - - .detected-app a:hover .label .name { - border-bottom: 1px solid #4608ad; - } - - .detected-app a .category .name { - color: #4a4a4a; - border-bottom: 1px solid transparent; - } - - .detected-app a:hover .category .name { - border-bottom: 1px solid #4a4a4a; - } - -.label { - font-weight: bold; -} - -.category { - display: block; - margin: 5px 0 0 24px; +.empty { + display: flex; + height: 16rem; + align-items: center; + justify-content: center; } -.empty { - color: #999; - font-style: italic; - text-align: center; +.empty__text { } diff --git a/src/drivers/webextension/html/popup.html b/src/drivers/webextension/html/popup.html index 2f4e90ad2..1f17595cf 100644 --- a/src/drivers/webextension/html/popup.html +++ b/src/drivers/webextension/html/popup.html @@ -11,5 +11,12 @@ +
+ + + +
+ +
diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index ac26cb55c..e9c6c97a6 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -28,7 +28,7 @@ function getOption(name, defaultValue) { // Chrome, Firefox browser.storage.local.get(name) .then(callback) - .catch(console.error); + .catch(error => wappalyzer.log(error, 'driver', 'error')); } catch ( e ) { // Edge browser.storage.local.get(name, callback); @@ -125,7 +125,7 @@ var callback = tabs => { try { browser.tabs.query({}) .then(callback) - .catch(console.error); + .catch(error => wappalyzer.log(error, 'driver', 'error')); } catch ( e ) { browser.tabs.query({}, callback); } @@ -281,10 +281,10 @@ wappalyzer.driver.getRobotsTxt = (host, secure = false) => { fetch('http' + ( secure ? 's' : '' ) + '://' + host + '/robots.txt') .then(response => { if ( !response.ok ) { - if (response.status === 404) { - return ''; + if ( response.status === 404 ) { + return ''; } else { - throw 'GET ' + response.url + ' was not ok'; + throw 'GET ' + response.url + ' was not ok'; } } diff --git a/src/drivers/webextension/js/iframe.js b/src/drivers/webextension/js/iframe.js index ea3e2a990..0dd339d58 100644 --- a/src/drivers/webextension/js/iframe.js +++ b/src/drivers/webextension/js/iframe.js @@ -181,7 +181,7 @@ var exports = {}; video_assets: opt_video_assets, assets: opt_assets, version: '3', - mrev: '082d7cb-d', + mrev: '4d79384-d', msgNum: this.msgNum, timestamp: new Date().getTime(), pageVis: document.visibilityState, @@ -890,7 +890,7 @@ var exports = {}; var _pageTags; var INIT_MS_BW_SEARCHES = 2000; var PAGE_TAG_RE = new RegExp('gpt|oascentral'); - var POST_MSG_ID = '1501281986-4236-27733-5465-12184'; + var POST_MSG_ID = '1503096304-372-12333-31563-11152'; var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)'); function getPageTags(doc) { @@ -1104,6 +1104,23 @@ var exports = {}; } }, + 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 ) { @@ -1137,6 +1154,8 @@ if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { 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 { @@ -1149,18 +1168,18 @@ if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { ); } })(window); -(function(adparser) { +(function(adparser, pageUrl) { function onAdFound(log) { adparser.sendToBackground({ id: 'ad_log', subject: log }, 'ad_log', '', function(){}); } - if ( window === window.top ) { + if ( adparser && adparser.inWindowTop ) { adparser.addPostMessageListener(); adparser.askIfTrackingEnabled( function() { adparser.init(onAdFound); }, - function() {} + adparser.blockedRobotsMsgGen(onAdFound, pageUrl) ) } -})(window.adparser); +})(window.adparser, window.location.href); diff --git a/src/drivers/webextension/js/network.js b/src/drivers/webextension/js/network.js index 8a0421b88..d5bc4458c 100644 --- a/src/drivers/webextension/js/network.js +++ b/src/drivers/webextension/js/network.js @@ -66,6 +66,7 @@ 'washingtonpost.com' ]; + var robotsTxtAllows = wappalyzer.robotsTxtAllows; if ( !String.prototype.endsWith ) { String.prototype.endsWith = function(searchString, position) { var subjectString = this.toString(); @@ -114,10 +115,10 @@ } } - function ifTrackingEnabled(url, ifCallback, elseCallback) { + function ifTrackingEnabled(details, ifCallback, elseCallback) { var fullIfCallback = function() { - allowedByRobotsTxt(url, ifCallback, elseCallback); + allowedByRobotsTxt(details, ifCallback, elseCallback); }; browser.storage.local.get('tracking').then(function(item) { @@ -135,9 +136,9 @@ } - function allowedByRobotsTxt(url, ifCallback, elseCallback) { - if ( ! url.startsWith('chrome://') ) { - wappalyzer.robotsTxtAllows(url).then(ifCallback, elseCallback); + function allowedByRobotsTxt(details, ifCallback, elseCallback) { + if ( details.url && !details.url.startsWith('chrome://') ) { + robotsTxtAllows(details.url).then(ifCallback, elseCallback); } else { elseCallback(); } @@ -219,7 +220,7 @@ this.cleanupCollector(tabId); ifTrackingEnabled( - details.url, + details, function() { if ( !areListenersRegistered ) { @@ -279,18 +280,20 @@ browserProxy.tabs.sendMessage(this.tabId, message); }; - PageNetworkTrafficCollector.prototype.sendToTab = function(assetReq, reqs, curPageUrl, isValidAd) { + PageNetworkTrafficCollector.prototype.sendToTab = function(assetReq, reqs, curPageUrl, nonAdTrackingEvent) { var msg = {}; msg.assets = []; + msg.requests = []; msg.event_data = {}; - if ( isValidAd ) { + if ( !nonAdTrackingEvent ) { msg.event = 'new-video-ad'; msg.requests = reqs; msg.requests.sort(function(reqA, reqB) {return reqA.requestTimestamp - reqB.requestTimestamp;}); if ( assetReq ) { msg.assets = [assetReq]; } - } else { + } else if ( nonAdTrackingEvent === 'new-invalid-video-ad' ) { + msg.event = nonAdTrackingEvent; msg.requests = reqs.map(function(request) { return parseHostnameFromUrl(request.url); }); @@ -301,7 +304,8 @@ contentType: assetReq.contentType, size: assetReq.size }]; - msg.event = 'new-invalid-video-ad'; + } else if ( nonAdTrackingEvent === 'robots-txt-no-scraping' ) { + msg.event = nonAdTrackingEvent; } msg.origUrl = curPageUrl; msg.displayAdFound = this.displayAdFound; @@ -805,7 +809,7 @@ browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) { if ( request === 'is_tracking_enabled' ) { ifTrackingEnabled( - sender.tab.url, + sender.tab, function() { try {sendResponse({'tracking_enabled': true});} catch(err) {} }, diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js index 94be5f258..95184f8ea 100644 --- a/src/drivers/webextension/js/popup.js +++ b/src/drivers/webextension/js/popup.js @@ -32,26 +32,16 @@ function replaceDomWhenReady(dom) { } function replaceDom(domTemplate) { - var body = document.body; + var container = document.getElementsByClassName('container')[0]; - while ( body.firstChild ) { - body.removeChild(body.firstChild); + while ( container.firstChild ) { + container.removeChild(container.firstChild); } - body.appendChild(jsonToDOM(domTemplate, document, {})); + container.appendChild(jsonToDOM(domTemplate, document, {})); var nodes = document.querySelectorAll('[data-i18n]'); - for ( let ms = 200; ms < 500; ms += 50 ) { - setTimeout(() => { - let div = document.createElement('div'); - - div.style.display = 'none'; - - body.appendChild(div); - }, ms); - }; - Array.prototype.forEach.call(nodes, node => { node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n); }); @@ -63,65 +53,87 @@ function appsToDomTemplate(response) { template = []; if ( response.tabCache && Object.keys(response.tabCache.detected).length > 0 ) { - for ( appName in response.tabCache.detected ) { - confidence = response.tabCache.detected[appName].confidenceTotal; - version = response.tabCache.detected[appName].version; - categories = []; + const categories = {}; + // Group apps by category + for ( appName in response.tabCache.detected ) { response.apps[appName].cats.forEach(cat => { - categories.push( + categories[cat] = categories[cat] || { apps: [] }; + + categories[cat].apps[appName] = appName; + }); + } + + for ( cat in categories ) { + const apps = []; + + for ( appName in categories[cat].apps ) { + confidence = response.tabCache.detected[appName].confidenceTotal; + version = response.tabCache.detected[appName].version; + + apps.push( [ 'a', { + class: 'detected__app', target: '_blank', - href: 'https://wappalyzer.com/categories/' + slugify(response.categories[cat].name) + href: 'https://wappalyzer.com/applications/' + slugify(appName) }, [ + 'img', { + class: 'detected__app-icon', + src: '../images/icons/' + ( response.apps[appName].icon || 'default.svg' ) + }, + ], [ 'span', { - class: 'category' - }, [ - 'span', { - class: 'name' - }, - browser.i18n.getMessage('categoryName' + cat) - ] + class: 'detected__app-name' + }, + appName + ( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' ) ] ] ); - }); + } template.push( [ 'div', { - class: 'detected-app' + class: 'detected__category' }, [ 'a', { + class: 'detected__category-link', target: '_blank', - href: 'https://wappalyzer.com/applications/' + slugify(appName) + href: 'https://wappalyzer.com/categories/' + slugify(response.categories[cat].name) }, [ - 'img', { - src: '../images/icons/' + ( response.apps[appName].icon || 'default.svg' ) - } - ], [ 'span', { - class: 'label' - }, [ - 'span', { - class: 'name' - }, - appName - ], - ( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' ) + class: 'detected__category-name' + }, + browser.i18n.getMessage('categoryName' + cat) ] - ], - categories + ], [ + 'div', { + class: 'detected__apps' + }, + apps + ] ] ); } + + template = [ + 'div', { + class: 'detected' + }, + template + ]; } else { template = [ 'div', { class: 'empty' }, - browser.i18n.getMessage('noAppsDetected') + [ + 'span', { + class: 'empty__text' + }, + browser.i18n.getMessage('noAppsDetected') + ], ]; } diff --git a/src/drivers/webextension/manifest.edge.json b/src/drivers/webextension/manifest.edge.json index b2a544023..f00a16d05 100644 --- a/src/drivers/webextension/manifest.edge.json +++ b/src/drivers/webextension/manifest.edge.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://wappalyzer.com/", "description": "Identify web technologies", - "version": "5.0.7", + "version": "5.1.0", "default_locale": "en", "manifest_version": 2, "icons": { diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 8d821774b..0d0c48123 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://wappalyzer.com/", "description": "Identify web technologies", - "version": "5.0.7", + "version": "5.1.0", "default_locale": "en", "manifest_version": 2, "icons": { From 5febcb537eca86826ae572a96a9d4be5975599d5 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 27 Aug 2017 12:13:58 +1000 Subject: [PATCH 19/19] Minor fixes --- src/drivers/npm/driver.js | 2 -- src/wappalyzer.js | 8 ++++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js index cc55549dd..ef7569b17 100644 --- a/src/drivers/npm/driver.js +++ b/src/drivers/npm/driver.js @@ -53,8 +53,6 @@ const driver = { }); }); - console.log('resolve ' + url); - resolve(apps); }; diff --git a/src/wappalyzer.js b/src/wappalyzer.js index dbc97610b..093f1b0bb 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -300,7 +300,9 @@ class Wappalyzer { * Cache detected applications */ cacheDetectedApps(apps, url) { - if (!this.driver.ping instanceof Function) return; + if ( !( this.driver.ping instanceof Function ) ) { + return; + } Object.keys(apps).forEach(appName => { var app = apps[appName]; @@ -320,7 +322,9 @@ class Wappalyzer { * Track detected applications */ trackDetectedApps(apps, url, hostname, html) { - if (!this.driver.ping instanceof Function) return; + if ( !( this.driver.ping instanceof Function ) ) { + return; + } Object.keys(apps).forEach(appName => { var app = apps[appName];