Merge pull request #4 from AliasIO/master

Update
main
DaAwesomeP 9 years ago
commit 21e0bca00d

1
.gitignore vendored

@ -6,6 +6,7 @@ drivers/npm/node_modules
drivers/npm/npm-debug.log drivers/npm/npm-debug.log
node_modules/ node_modules/
npm-debug.log
Thumbs.db Thumbs.db
ehthumbs.db ehthumbs.db

@ -1,12 +1,15 @@
language: node_js language: node_js
node_js: node_js:
- "0.12" - "4.1.0"
sudo: false sudo: required
before_install: before_install:
- export WAPPALYZER_ROOT=$TRAVIS_BUILD_DIR - export WAPPALYZER_ROOT=$TRAVIS_BUILD_DIR
- export WAPPALYZER_NODE_PATH=$TRAVIS_BUILD_DIR - export WAPPALYZER_NODE_PATH=$TRAVIS_BUILD_DIR
- export PATH=$PATH:$TRAVIS_BUILD_DIR/bin - export PATH=$PATH:$TRAVIS_BUILD_DIR/bin
install: install:
- sudo apt-get update -y
- sudo apt-get install -y curl zip sudo -y --force-yes
- sudo apt-get clean
- npm install jsonlint jpm imagemin-cli -g - npm install jsonlint jpm imagemin-cli -g
- ln -s docker/node/package.json package.json && npm install - ln -s docker/node/package.json package.json && npm install
- mkdir phantomjs && curl -L https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2 | tar xvjC phantomjs && ln -s $WAPPALYZER_ROOT/phantomjs/phantomjs-*-linux-x86_64/bin/phantomjs bin/phantomjs - mkdir phantomjs && curl -L https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2 | tar xvjC phantomjs && ln -s $WAPPALYZER_ROOT/phantomjs/phantomjs-*-linux-x86_64/bin/phantomjs bin/phantomjs

@ -0,0 +1,3 @@
# Contributing
You can find our contribution guide [in our wiki](https://github.com/AliasIO/Wappalyzer/wiki/Contributing).

@ -29,9 +29,9 @@ echo "Validating apps.json..."
jsonlint --quiet -V $WAPPALYZER_ROOT/schema.json $path/apps.json jsonlint --quiet -V $WAPPALYZER_ROOT/schema.json $path/apps.json
echo "Validating regular expressions..." # echo "Validating regular expressions..."
#
wappalyzer validate-regex # wappalyzer validate-regex
echo "Validating icons..." echo "Validating icons..."

@ -25,12 +25,43 @@ for ( app in json.apps ) {
patterns.forEach(function(pattern) { patterns.forEach(function(pattern) {
var var
attrs = pattern.split('\\;'), attrs = pattern.split('\\;'),
regex = '/' + attrs.shift().replace('/', '\/') + '/'; regex = '/' + attrs.shift().replace('/', '\/') + '/',
version = attrs.find( function (attr){
return attr.indexOf('version:')===0;
} ),
amountOfCaptureGroups,
captureGroupsNeeded,
amountOfCaptureGroupsNeeded,
highestBackReference;
//Check if the pattern is a valid RegExp //Check if the pattern is a valid RegExp
//Note: unlike when used in Wappalyzer, the modifier i isn't added here //Note: unlike when used in Wappalyzer, the modifier i isn't added here
new RegExp(regex); new RegExp(regex);
//Actual amount of capture groups
amountOfCaptureGroups = ''.match(new RegExp('(?:'+pattern+')?')).length - 1;
//Capture groups of which the result is used
captureGroupsNeeded = version ? (version.match(/\\\d/g) || []).filter( function(value, index, self){
return self.indexOf(value) === index;
}).map( function(value){//Because Math.max needs the integers only
return parseInt(value.charAt(1), 10);//Will only work if backreferences cannot be any longer than a single digit
}) : [];
//Amount of capture groups needed
amountOfCaptureGroupsNeeded = captureGroupsNeeded.length;
//Highest back reference number used
highestBackReference = Math.max.apply(null, captureGroupsNeeded);
//Report error
if(amountOfCaptureGroups > amountOfCaptureGroupsNeeded) {
throw new Error('The pattern uses more capture groups than needed. Use non-capturing roups where appropriate.\n' + app + ': ' + type + ': ' + pattern);
}else if(amountOfCaptureGroups < amountOfCaptureGroupsNeeded){
throw new Error('The version string references more capture groups than there are in the pattern! Remove any incorrect back references from the version string and/or add the missing capture groups to the pattern.\n' + app + ': ' + type + ': ' + pattern);
} else if(highestBackReference > amountOfCaptureGroups){
throw new Error('The version string references one or more capture groups whose index is higher than the amount of capture groups in the pattern. Please use the correct index instead of \\\\'+highestBackReference+'.\n' + app + ': ' + type + ': ' + pattern);
}
if ( /^\/(?:\^\$|\.\+|\.\*)\/$/.test(regex) ) { if ( /^\/(?:\^\$|\.\+|\.\*)\/$/.test(regex) ) {
throw new Error('Pattern should be replaced with empty string.\n' + app + ': ' + type + ': ' + pattern); throw new Error('Pattern should be replaced with empty string.\n' + app + ': ' + type + ': ' + pattern);

@ -9,7 +9,7 @@ ENV WAPPALYZER_NODE_PATH /home/wappalyzer/node
# Install packages # Install packages
RUN apt-get update && apt-get install -y curl zip libfreetype6 libfontconfig RUN apt-get update && apt-get install -y curl zip libfreetype6 libfontconfig
RUN curl -sL https://deb.nodesource.com/setup_0.12 | bash - RUN curl -sL https://deb.nodesource.com/setup_4.x | bash -
RUN apt-get install -y nodejs RUN apt-get install -y nodejs
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

@ -182,18 +182,6 @@
"script": "addthis\\.com/js/", "script": "addthis\\.com/js/",
"website": "www.addthis.com" "website": "www.addthis.com"
}, },
"Adobe CQ5": {
"cats": [
1
],
"html": [
"<div class=\"[^\"]*parbase",
"<div[^>]+data-component-path=\"[^\"+]jcr:"
],
"implies": "Java",
"script": "/etc/designs/",
"website": "adobe.com/products/cq.html"
},
"Adobe ColdFusion": { "Adobe ColdFusion": {
"cats": [ "cats": [
18 18
@ -208,6 +196,18 @@
"url": "\\.cfm(?:$|\\?)", "url": "\\.cfm(?:$|\\?)",
"website": "adobe.com/products/coldfusion-family.html" "website": "adobe.com/products/coldfusion-family.html"
}, },
"Adobe Experience Manager": {
"cats": [
1
],
"html": [
"<div class=\"[^\"]*parbase",
"<div[^>]+data-component-path=\"[^\"+]jcr:"
],
"implies": "Java",
"script": "/etc/designs/",
"website": "www.adobe.com/au/marketing-cloud/enterprise-content-management.html"
},
"Adobe GoLive": { "Adobe GoLive": {
"cats": [ "cats": [
20 20
@ -663,6 +663,15 @@
"script": "bittads\\.com/js/bitt\\.js$", "script": "bittads\\.com/js/bitt\\.js$",
"website": "bittads.com" "website": "bittads.com"
}, },
"Blesta": {
"cats": [
6
],
"headers": {
"Set-Cookie": "blesta_sid"
},
"website": "www.blesta.com"
},
"Blip.tv": { "Blip.tv": {
"cats": [ "cats": [
14 14
@ -1073,6 +1082,13 @@
"script": "static\\.getclicky\\.com", "script": "static\\.getclicky\\.com",
"website": "getclicky.com" "website": "getclicky.com"
}, },
"Clientexec": {
"cats": [
6
],
"html": "clientexec\\.[^>]*\\s?=\\s?[^>]*;",
"website": "www.clientexec.com"
},
"CloudFlare": { "CloudFlare": {
"cats": [ "cats": [
31 31
@ -1697,6 +1713,13 @@
}, },
"website": "www.dynamicweb.dk" "website": "www.dynamicweb.dk"
}, },
"Dynatrace": {
"cats": [
10
],
"script": "dtagent.*\\.js",
"website": "dynatrace.com"
},
"E-Merchant": { "E-Merchant": {
"cats": [ "cats": [
6 6
@ -2724,6 +2747,14 @@
"script": "jscripts/ips_", "script": "jscripts/ips_",
"website": "www.invisionpower.com" "website": "www.invisionpower.com"
}, },
"Immutable.js": {
"cats": [
12
],
"env": "^Immutable$",
"script": "^immutable\\.(?:min\\.)?js$",
"website": "facebook.github.io/immutable-js/"
},
"ImpressCMS": { "ImpressCMS": {
"cats": [ "cats": [
1 1
@ -3397,8 +3428,7 @@
], ],
"env": [ "env": [
"^fyre$", "^fyre$",
"^FyreLoader$", "^FyreLoader$"
"^LF$"
], ],
"html": "<[^>]+(?:id|class)=\"livefyre", "html": "<[^>]+(?:id|class)=\"livefyre",
"script": "livefyre_init\\.js", "script": "livefyre_init\\.js",
@ -3483,25 +3513,25 @@
], ],
"website": "mrincworld.com" "website": "mrincworld.com"
}, },
"M.R. Inc Webserver": { "M.R. Inc SiteFrame": {
"cats": [ "cats": [
22 18
], ],
"headers": { "headers": {
"Server": "M\\.R\\. Inc Webserver" "Powered-By": "M\\.R\\. Inc SiteFrame"
}, },
"implies": [
"M.R. Inc BoxyOS"
],
"website": "mrincworld.com" "website": "mrincworld.com"
}, },
"M.R. Inc SiteFrame": { "M.R. Inc Webserver": {
"cats": [ "cats": [
18 22
], ],
"headers": { "headers": {
"Powered-By": "M\\.R\\. Inc SiteFrame" "Server": "M\\.R\\. Inc Webserver"
}, },
"implies": [
"M.R. Inc BoxyOS"
],
"website": "mrincworld.com" "website": "mrincworld.com"
}, },
"MOBOTIX": { "MOBOTIX": {
@ -3979,7 +4009,7 @@
"PHP", "PHP",
"MySQL" "MySQL"
], ],
"website": "www.mybboard.net" "website": "www.mybb.com"
}, },
"MyBlogLog": { "MyBlogLog": {
"cats": [ "cats": [
@ -4381,19 +4411,6 @@
}, },
"website": "orchardproject.net" "website": "orchardproject.net"
}, },
"osTicket": {
"cats": [
13
],
"implies": [
"PHP",
"MySQL"
],
"headers": {
"Set-Cookie": "OSTSESSID"
},
"website": "osticket.com"
},
"Outbrain": { "Outbrain": {
"cats": [ "cats": [
5 5
@ -4813,22 +4830,6 @@
}, },
"website": "???" "website": "???"
}, },
"RainLoop": {
"cats": [
30
],
"env": "^rainloop",
"headers": {
"Server": "RainLoop"
},
"html": [
"<meta [^>]*(?:content=\"([^\"]+)[^>]+ id=\"rlAppVersion\"|id=\"rlAppVersion\"[^>]+ content=\"([^\"]+))\\;version:\\1?\\1:\\2",
"<link[^>]* href=\"[^\"]*rainloop/v/([^/]+)\\;version:\\1"
],
"implies": "PHP",
"script": "rainloop/v/([^/]+)\\;version:\\1",
"website": "rainloop.net"
},
"RBS Change": { "RBS Change": {
"cats": [ "cats": [
1, 1,
@ -4871,6 +4872,22 @@
"implies": "Ruby", "implies": "Ruby",
"website": "github.com/rtomayko/rack-cache" "website": "github.com/rtomayko/rack-cache"
}, },
"RainLoop": {
"cats": [
30
],
"env": "^rainloop",
"headers": {
"Server": "RainLoop"
},
"html": [
"<meta [^>]*(?:content=\"([^\"]+)[^>]+ id=\"rlAppVersion\"|id=\"rlAppVersion\"[^>]+ content=\"([^\"]+))\\;version:\\1?\\1:\\2",
"<link[^>]* href=\"[^\"]*rainloop/v/([^/]+)\\;version:\\1"
],
"implies": "PHP",
"script": "rainloop/v/([^/]+)\\;version:\\1",
"website": "rainloop.net"
},
"Ramda": { "Ramda": {
"cats": [ "cats": [
12 12
@ -4900,6 +4917,7 @@
12 12
], ],
"env": "^React$", "env": "^React$",
"html": "<[^>]+data-react",
"script": [ "script": [
"react(?:\\-with\\-addons)?(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "react(?:\\-with\\-addons)?(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1",
"/([\\d.]+)/react(\\.min)?\\.js\\;version:\\1", "/([\\d.]+)/react(\\.min)?\\.js\\;version:\\1",
@ -5060,6 +5078,13 @@
"script": "/assets/application-[a-z\\d]{32}/\\.js\\;confidence:50", "script": "/assets/application-[a-z\\d]{32}/\\.js\\;confidence:50",
"website": "rubyonrails.org" "website": "rubyonrails.org"
}, },
"Ruxit": {
"cats": [
10
],
"script": "ruxitagentjs",
"website": "ruxit.com"
},
"RxJS": { "RxJS": {
"cats": [ "cats": [
12 12
@ -6213,6 +6238,24 @@
"script": "vs350\\.js", "script": "vs350\\.js",
"website": "www.vpasp.com" "website": "www.vpasp.com"
}, },
"VTEX Enterprise": {
"cats": [
6
],
"headers": {
"powered": "vtex"
},
"website": "vtex.com"
},
"VTEX Integrated Store": {
"cats": [
6
],
"headers": {
"X-Powered-By": "vtex-integrated-store"
},
"website": "lojaintegrada.com.br"
},
"Vanilla": { "Vanilla": {
"cats": [ "cats": [
2 2
@ -6373,6 +6416,15 @@
"script": "w3counter\\.com/tracker\\.js", "script": "w3counter\\.com/tracker\\.js",
"website": "www.w3counter.com" "website": "www.w3counter.com"
}, },
"WHMCS": {
"cats": [
6
],
"headers": {
"Set-Cookie": "^WHMCS.*"
},
"website": "www.whmcs.com"
},
"WP Rocket": { "WP Rocket": {
"cats": [ "cats": [
23 23
@ -6630,7 +6682,7 @@
], ],
"html": "<!--[^>]+WP-Super-Cache", "html": "<!--[^>]+WP-Super-Cache",
"implies": "WordPress", "implies": "WordPress",
"website": "ocaoimh.ie/wp-super-cache/" "website": "z9.io/wp-super-cache/"
}, },
"Wowza Media Server": { "Wowza Media Server": {
"cats": [ "cats": [
@ -6736,6 +6788,15 @@
}, },
"website": "xitami.com" "website": "xitami.com"
}, },
"XpressEngine": {
"cats": [
1
],
"meta": {
"generator": "XpressEngine"
},
"website": "www.xpressengine.com/"
},
"YUI": { "YUI": {
"cats": [ "cats": [
12 12
@ -7413,6 +7474,19 @@
"html": "(?:<a[^>]*(?:\\?|&)osCsid|Powered by (?:<[^>]+>)?osCommerce</a>|<[^>]+class=\"[^>]*infoBoxHeading)", "html": "(?:<a[^>]*(?:\\?|&)osCsid|Powered by (?:<[^>]+>)?osCommerce</a>|<[^>]+class=\"[^>]*infoBoxHeading)",
"website": "www.oscommerce.com" "website": "www.oscommerce.com"
}, },
"osTicket": {
"cats": [
13
],
"headers": {
"Set-Cookie": "OSTSESSID"
},
"implies": [
"PHP",
"MySQL"
],
"website": "osticket.com"
},
"ownCloud": { "ownCloud": {
"cats": [ "cats": [
19 19
@ -7633,6 +7707,24 @@
}, },
"website": "ucore.io" "website": "ucore.io"
}, },
"uKnowva": {
"cats": [
1,
2,
18,
50
],
"headers": {
"X-Content-Encoded-By": "uKnowva ([\\d.]+)\\;version:\\1"
},
"html": "<a[^>]+>Powered by uKnowva</a>",
"implies": "PHP",
"meta": {
"generator": "uKnowva (?: ([\\d.]+))?\\;version:\\1"
},
"script": "/media/conv/js/jquery.js",
"website": "uknowva.com"
},
"vBulletin": { "vBulletin": {
"cats": [ "cats": [
2 2

@ -3,30 +3,87 @@
var exports = {}; var exports = {};
(function(exports) { (function(exports) {
var utils = { var utils = {
pageMeta: { getReferrer: function() {
url: window.location.hostname,
isHP: window.location.pathname === '/', return this.hashUrl(document.referrer) || null;
referrer: window.document.referrer,
rand: Math.floor(Math.random() * 10e12), },
startTime: new Date().getTime()
getPageUrl: function() {
return this.hashUrl(window.location.href) || null;
},
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 !== '/' ) {
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) { realArray: function(a) {
return Array.prototype.slice.apply(a); return Array.prototype.slice.apply(a);
}, },
SCRIPT_IN_WINDOW_TOP: window === window.top, onDocLoaded: function(doc, callback) {
if ( doc.readyState === 'loading' ) {
doc.addEventListener('DOMContentLoaded', callback);
} else {
callback();
}
},
SCRIPT_IN_WINDOW_TOP: window === window.top,
isFriendlyWindow: function(win) { isFriendlyWindow: function(win) {
var href;
var href;
try { try {
href = win.location.href; href = win.location.href;
} catch(e) { } catch(e) {
return false; return false;
} }
return true; return true;
}, },
@ -39,68 +96,65 @@ var exports = {};
}, },
parseQS: function(qs) { parseQS: function(qs) {
if (qs.indexOf('http') === 0) { if ( qs.indexOf('http') === 0 ) {
qs = qs.split('?')[1]; qs = qs.split('?')[1];
} }
var i, kvs, key, val; var i, kvs, key, val;
var dict = {}; var dict = {};
qs = qs.split('&'); qs = qs.split('&');
for ( i = 0; i < qs.length; i++ ) { for ( i = 0; i < qs.length; i++ ) {
kvs = qs[i].split('='); kvs = qs[i].split('=');
key = kvs[0]; key = kvs[0];
val = kvs.slice(1).join('='); val = kvs.slice(1).join('=');
try { try {
dict[key] = window.decodeURIComponent(val); dict[key] = window.decodeURIComponent(val);
} catch (e) { } catch (e) {
this.log('URI decode error', kvs);
continue; continue;
} }
} }
return dict; return dict;
}, },
};
makeLog: function(opt_adData, opt_msgNum, opt_pageTags) { utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent);
var assets = [opt_adData] || []; 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()
};
}
return { LogGenerator.prototype = {
log: function(event, opt_assets, opt_pageTags) {
var result = {
doc: this.pageMeta, doc: this.pageMeta,
assets: assets, event: event,
assets: opt_assets || [],
version: '3', version: '3',
msgNum: opt_msgNum || 0, msgNum: this.msgNum,
timestamp: new Date().getTime(),
pageVis: document.visibilityState,
pageFoc: document.hasFocus(),
pageTags: opt_pageTags || [] pageTags: opt_pageTags || []
}; };
}, this.msgNum++;
return result;
expBackoff: function(callback, initTimeoutMS, opt_maxTimeoutMS) { }
var curTimeout = initTimeoutMS;
var wrapped = function() {
callback();
var nextTimeout = 2 * curTimeout;
curTimeout = opt_maxTimeoutMS ? Math.min(nextTimeout, opt_maxTimeoutMS) : nextTimeout;
setTimeout(wrapped, curTimeout);
}; };
setTimeout(wrapped, curTimeout); utils.LogGenerator = LogGenerator;
},
};
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;
exports.utils = utils; exports.utils = utils;
})(exports); })(exports);
(function(exports) { (function(exports) {
var VALID_AD_SIZES = [ var VALID_AD_SIZES = [
[160, 600], [160, 600],
[300, 250], [300, 250],
@ -115,39 +169,38 @@ var exports = {};
[970, 90], [970, 90],
[970, 250], [970, 250],
[970, 400], [970, 400],
[970, 415] [970, 415],
[1280, 100]
]; ];
var var PX_SIZE_TOL = 10;
PX_SIZE_TOL = 10, var MIN_WINDOW_PX = 10;
MIN_WINDOW_PX = 10, var MAX_SEARCHES_PER_WINDOW = 10;
MAX_SEARCHES_PER_WINDOW = 10, var MAX_SEARCHES_PER_ELEMENT = 2;
MAX_SEARCHES_PER_ELEMENT = 2;
function makeSizeSet(validAdSizes, sizeTol) {
var SIZE_SET = (function makeSizeSet() { var set = {};
var var i;
set = {}, var xfuz;
i, var yfuz;
xfuz, var size;
yfuz, var width;
size, var height;
width,
height; for ( i = 0; i < validAdSizes.length; i++ ) {
for ( xfuz = -sizeTol; xfuz <= sizeTol; xfuz++ ) {
for ( i = 0; i < VALID_AD_SIZES.length; i++ ) { for ( yfuz = -sizeTol; yfuz <= sizeTol; yfuz++ ) {
for (xfuz = -PX_SIZE_TOL; xfuz <= PX_SIZE_TOL; xfuz++ ) { size = validAdSizes[i];
for ( yfuz = -PX_SIZE_TOL; yfuz <= PX_SIZE_TOL; yfuz++ ) {
size = VALID_AD_SIZES[i];
width = size[0] + xfuz; width = size[0] + xfuz;
height = size[1] + yfuz; height = size[1] + yfuz;
set[width] = set[width] || {}; set[width + 'x' + height] = size;
set[width][height] = true;
} }
} }
} }
return set; return set;
})(); }
var SIZE_SET = makeSizeSet(VALID_AD_SIZES, PX_SIZE_TOL);
function elementIsAd(el) { function elementIsAd(el) {
if ( typeof el.searches !== 'number' ) { if ( typeof el.searches !== 'number' ) {
@ -158,33 +211,119 @@ var exports = {};
return false; return false;
} }
el.searches ++; el.searches += 1;
var w = el.offsetWidth; var isImgWithoutSrc = el.tagName === 'IMG' && !el.src;
var isImgWithoutAnchor = el.tagName === 'IMG' && !(el.parentNode.tagName === 'A' || el.getAttribute('onclick'));
return SIZE_SET[w] && SIZE_SET[w][el.offsetHeight]; return isAdShaped(el) && !isImgWithoutSrc && !isImgWithoutAnchor;
} }
function windowMightContainAds(win) { function windowMightContainAds(win) {
return win.innerWidth >= MIN_WINDOW_PX && win.innerHeight >= MIN_WINDOW_PX; return (win.innerWidth >= MIN_WINDOW_PX &&
win.innerHeight >= MIN_WINDOW_PX);
} }
function isNewAd(el) { function isNewAd(el, win) {
return el.mp_adFound !== true; return !el.mp_adFound && (win === win.top || !win.mp_adFound);
} }
function getFriendlyIframes(win) { function getFriendlyIframes(win) {
var iframes = win.document.querySelectorAll('iframe'); var iframes = win.document.querySelectorAll('iframe');
iframes = exports.utils.realArray(iframes); iframes = exports.utils.realArray(iframes);
var friendlyIframes = iframes.filter(function(ifr) { var friendlyIframes = iframes.filter(function(ifr) {
return exports.utils.isFriendlyWindow(ifr.contentWindow); return exports.utils.isFriendlyWindow(ifr.contentWindow);
}); });
return friendlyIframes; return friendlyIframes;
} }
function isAdShaped(el, opt_win, opt_retMatched) {
var rect, width, height, result;
if ( opt_win ) {
width = opt_win.innerWidth;
height = opt_win.innerHeight;
} else {
rect = el.getBoundingClientRect();
width = rect.width;
height = rect.height;
}
result = SIZE_SET[width + 'x' + height];
if ( opt_retMatched ) {
return result;
} else {
return !!result;
}
}
function containsLargeIframes(win) {
var iframes = win.document.querySelectorAll('iframe');
var rect;
var i;
for ( i = 0; i < iframes.length; i++ ) {
rect = iframes[i].getBoundingClientRect();
if ( rect.width > 10 || rect.height > 10 ) {
return true;
}
}
return false;
}
var HTML5_SIGNAL_ELEMENTS = 'canvas, button, video, svg, img';
function iframeGetHTMLAd(win) {
var body = win.document.body,
elements, i, el, divs, div, numElements,
winSize, elSize;
if ( !body ) {
return null;
}
winSize = isAdShaped(null, win, true);
if ( !winSize ) {
return null;
}
elements = body.querySelectorAll(HTML5_SIGNAL_ELEMENTS);
for ( i = 0; i < elements.length; i++ ) {
el = elements[i];
elSize = isAdShaped(el, null, true);
if ( elSize && elSize[0] === winSize[0] && elSize[1] === winSize[1] ) {
return el;
}
}
numElements = body.querySelectorAll('*').length;
if ( numElements < 5 ) {
return null;
}
divs = body.querySelectorAll('div');
for ( i = 0; i < divs.length; i++ ) {
div = divs[i];
elSize = isAdShaped(div, null, true);
if ( elSize && elSize[0] === winSize[0] && elSize[1] === winSize[1] ) {
return div;
}
}
return null;
}
function mainGetHTMLAd(win) {
var styles = win.document.querySelectorAll('div > style, div > link[rel="stylesheet"]'),
i, div;
for ( i = 0; i < styles.length; i++ ) {
div = styles[i].parentNode;
if ( isAdShaped(div) ) {
return div;
}
}
}
function findAds(win, opt_ads) { function findAds(win, opt_ads) {
if ( !windowMightContainAds(win) ) { if ( !windowMightContainAds(win) ) {
return; return;
@ -195,25 +334,52 @@ var exports = {};
} }
var ads = opt_ads || []; var ads = opt_ads || [];
var adsFound = 0;
if ( exports.utils.SCRIPT_IN_WINDOW_TOP || win.searches < MAX_SEARCHES_PER_WINDOW ) { if ( exports.utils.SCRIPT_IN_WINDOW_TOP || win.searches < MAX_SEARCHES_PER_WINDOW ) {
var adCandidates = win.document.querySelectorAll('img, object, embed'); var adCandidates = win.document.querySelectorAll('img, object, embed');
adCandidates = exports.utils.realArray(adCandidates); adCandidates = exports.utils.realArray(adCandidates);
adCandidates.forEach(function(el) { adCandidates.forEach(function(el) {
if (elementIsAd(el) && isNewAd(el)) { if ( elementIsAd(el) && isNewAd(el, win) ) {
el.mp_adFound = true; el.mp_adFound = true;
el.inIframe = win !== win.top;
win.mp_adFound = true;
ads.push(el); ads.push(el);
adsFound += 1;
} }
}); });
win.searches ++; var htmlAd, adSizeMeta;
if ( win === win.top ) {
htmlAd = mainGetHTMLAd(win);
} else {
if ( adsFound === 0 && !containsLargeIframes(win) ) {
htmlAd = iframeGetHTMLAd(win);
}
} }
var iframes = getFriendlyIframes(win); if ( htmlAd && isNewAd(htmlAd, win) ) {
htmlAd.html5 = true;
htmlAd.inIframe = win !== win.top;
if ( htmlAd.inIframe ) {
adSizeMeta = win.document.querySelectorAll('meta[name="ad.size"]');
if ( adSizeMeta.length > 0 ) {
htmlAd.adSizeMeta = adSizeMeta[0].content;
}
if ( win.clickTag ) {
htmlAd.winClickTag = win.clickTag;
}
}
htmlAd.mp_adFound = true;
win.mp_adFound = true;
ads.push(htmlAd);
}
win.searches += 1;
}
var iframes = getFriendlyIframes(win);
iframes.forEach(function(ifr) { iframes.forEach(function(ifr) {
findAds(ifr.contentWindow, ads); findAds(ifr.contentWindow, ads);
}); });
@ -222,11 +388,13 @@ var exports = {};
} }
exports.adfinder = { exports.adfinder = {
SIZE_SET: SIZE_SET,
findAds: findAds findAds: findAds
}; };
})(exports); })(exports);
(function(exports) { (function(exports) {
var parser = { var parser = {
TAGS_WITH_SRC_ATTR: { TAGS_WITH_SRC_ATTR: {
'IMG': true, 'IMG': true,
@ -242,8 +410,10 @@ var exports = {};
if ( this.TAGS_WITH_SRC_ATTR.hasOwnProperty(el.tagName) ) { if ( this.TAGS_WITH_SRC_ATTR.hasOwnProperty(el.tagName) ) {
url = el.src; url = el.src;
} else if ( el.tagName === 'OBJECT' ) { } else if ( el.tagName === 'OBJECT' ) {
url = el.data || (params && params.movie) || null; url = el.data || (params && params.movie) || null;
} else if ( el.tagName === 'A' ) { } else if ( el.tagName === 'A' ) {
url = el.href; url = el.href;
} }
@ -263,22 +433,19 @@ var exports = {};
var i, child; var i, child;
var params = {}; var params = {};
var children = el.children; var children = el.children;
for ( i = 0; i < children.length; i++ ) { for ( i = 0; i < children.length; i++ ) {
child = children[i]; child = children[i];
if ( child.tagName === 'PARAM' && child.name ) { if ( child.tagName === 'PARAM' && child.name ) {
params[child.name.toLowerCase()] = child.value; params[child.name.toLowerCase()] = child.value;
} }
} }
return params; return params;
}, },
getPosition: function(el) { getPosition: function(el) {
var rect = el.getBoundingClientRect(); var rect = el.getBoundingClientRect();
var win = exports.utils.elementWindow(el); var win = exports.utils.elementWindow(el);
return { return {
width: rect.width, width: rect.width,
height: rect.height, height: rect.height,
@ -293,7 +460,8 @@ var exports = {};
if ( el.tagName === 'EMBED' ) { if ( el.tagName === 'EMBED' ) {
flashvars = el.getAttribute('flashvars') || urlQS; flashvars = el.getAttribute('flashvars') || urlQS;
} else if (el.tagName === 'OBJECT') {
} else if ( el.tagName === 'OBJECT' ) {
flashvars = params.flashvars || el.getAttribute('flashvars') || urlQS; flashvars = params.flashvars || el.getAttribute('flashvars') || urlQS;
} }
@ -302,19 +470,18 @@ var exports = {};
findClickThru: function(el, flashvars) { findClickThru: function(el, flashvars) {
var key; var key;
if ( el.tagName === 'IMG' && el.parentElement.tagName === 'A' ) { if ( el.tagName === 'IMG' && el.parentElement.tagName === 'A' ) {
return el.parentElement.href; return el.parentElement.href;
} else if ( flashvars ) { } else if ( flashvars ) {
for ( key in flashvars ) { for ( key in flashvars ) {
if ( flashvars.hasOwnProperty(key) ) { if ( flashvars.hasOwnProperty(key) ) {
if (key.toLowerCase().indexOf('clicktag') === 0) {
if ( key.toLowerCase().indexOf('clicktag') === 0 ) {
return flashvars[key]; return flashvars[key];
} }
} }
} }
} }
return null; return null;
}, },
@ -322,6 +489,7 @@ var exports = {};
var val = el.getAttribute(name); var val = el.getAttribute(name);
if ( val && val.slice && val.toString ) { if ( val && val.slice && val.toString ) {
return val.slice(0, this.MAX_ATTR_LEN).toString(); return val.slice(0, this.MAX_ATTR_LEN).toString();
} else { } else {
return null; return null;
@ -329,14 +497,13 @@ var exports = {};
}, },
putPropIfExists: function(obj, name, val) { putPropIfExists: function(obj, name, val) {
if (val) { if ( val ) {
obj[name] = val; obj[name] = val;
} }
}, },
putAttrIfExists: function(obj, el, name) { putAttrIfExists: function(obj, el, name) {
var val = this.getAttr(el, name); var val = this.getAttr(el, name);
this.putPropIfExists(obj, name, val); this.putPropIfExists(obj, name, val);
}, },
@ -355,7 +522,8 @@ var exports = {};
children: [] children: []
}; };
if (params) { if ( params ) {
delete params.flashvars; delete params.flashvars;
} }
@ -376,6 +544,7 @@ var exports = {};
})(exports); })(exports);
(function(exports) { (function(exports) {
var ContextManager = function(adData) { var ContextManager = function(adData) {
this.adData = adData; this.adData = adData;
}; };
@ -385,6 +554,7 @@ var exports = {};
ASPECT_RATIO_FOR_LEADERBOARDS: 2, ASPECT_RATIO_FOR_LEADERBOARDS: 2,
isValidContainer: function(el, opt_curWin) { isValidContainer: function(el, opt_curWin) {
var cWidth = el.clientWidth; var cWidth = el.clientWidth;
var cHeight = el.clientHeight; var cHeight = el.clientHeight;
@ -399,7 +569,7 @@ var exports = {};
var similarSizeY = this.withinTol(adHeight, cHeight); var similarSizeY = this.withinTol(adHeight, cHeight);
var adAspect = adWidth / adHeight; var adAspect = adWidth / adHeight;
return similarWin || el.tagName === 'A' || ( adAspect >= this.ASPECT_RATIO_FOR_LEADERBOARDS && similarSizeY ) || (similarSizeX && similarSizeY); return similarWin || el.tagName === 'A' || (adAspect >= this.ASPECT_RATIO_FOR_LEADERBOARDS && similarSizeY) || (similarSizeX && similarSizeY);
}, },
withinTol: function(adlen, conlen) { withinTol: function(adlen, conlen) {
@ -412,7 +582,6 @@ var exports = {};
if ( !el ) { if ( !el ) {
return; return;
} }
var i; var i;
var ifrWin; var ifrWin;
var adId = this.adData.adId; var adId = this.adData.adId;
@ -426,14 +595,21 @@ var exports = {};
if ( elIsAd ) { if ( elIsAd ) {
json.adId = adId; json.adId = adId;
this.adData.element = json; 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 children = exports.utils.realArray(el.children).filter(function(el) {
var param = el.tagName === 'PARAM'; var param = el.tagName === 'PARAM';
var inlineScript = el.tagName === 'SCRIPT' && !(el.src && el.src.indexOf('http') >= 0); var inlineScript = el.tagName === 'SCRIPT' && !(el.src && el.src.indexOf('http') >= 0);
var noScript = el.tagName === 'NOSCRIPT'; var noScript = el.tagName === 'NOSCRIPT';
return !(param || inlineScript || noScript); return !(param || inlineScript || noScript);
}); });
@ -445,12 +621,13 @@ var exports = {};
ifrWin = el.contentWindow; ifrWin = el.contentWindow;
if ( adId && el[adId] && el[adId].needsWindow ) { if ( adId && el[adId] && el[adId].needsWindow ) {
json.contents = this.adData.serializedIframeContents;
json.contents = this.adData.serializedIframeContents;
el[adId].needsWindow = false; el[adId].needsWindow = false;
delete this.adData.serializedIframeContents; delete this.adData.serializedIframeContents;
} else if ( exports.utils.isFriendlyWindow(ifrWin) ) { } else if ( exports.utils.isFriendlyWindow(ifrWin) ) {
json.contents = this.serializeElements(ifrWin.document.documentElement); json.contents = this.serializeElements(ifrWin.document.documentElement);
} }
} }
@ -460,10 +637,6 @@ var exports = {};
captureHTML: function(containerEl) { captureHTML: function(containerEl) {
this.adData.context = this.serializeElements(containerEl); this.adData.context = this.serializeElements(containerEl);
if ( this.adData.html ) {
this.adData.html.push(containerEl.outerHTML);
}
}, },
nodeCount: function(el) { nodeCount: function(el) {
@ -481,8 +654,7 @@ var exports = {};
while ( true ) { while ( true ) {
parentContainer = curContainer.parentElement; parentContainer = curContainer.parentElement;
if ( this.isValidContainer(parentContainer) ) {
if (this.isValidContainer(parentContainer)) {
curContainer = parentContainer; curContainer = parentContainer;
} else { } else {
return curContainer; return curContainer;
@ -492,7 +664,9 @@ var exports = {};
}; };
var tagfinder = { var tagfinder = {
prepToSend: function(adData) { prepToSend: function(adData) {
adData.matchedSize = exports.adfinder.SIZE_SET[adData.width + 'x' + adData.height];
delete adData.width; delete adData.width;
delete adData.height; delete adData.height;
}, },
@ -525,25 +699,24 @@ var exports = {};
var curWin = exports.utils.elementWindow(referenceElement); var curWin = exports.utils.elementWindow(referenceElement);
var highestContainer; var highestContainer;
while (true) { while ( true ) {
highestContainer = mgr.highestContainer(curWin, referenceElement); highestContainer = mgr.highestContainer(curWin, referenceElement);
mgr.captureHTML(highestContainer); mgr.captureHTML(highestContainer);
if (curWin === window.top) { if ( curWin === window.top ) {
break; break;
} else { } else {
mgr.adData.serializedIframeContents = mgr.adData.context; mgr.adData.serializedIframeContents = mgr.adData.context;
if (exports.utils.isFriendlyWindow(curWin.parent)) { if ( exports.utils.isFriendlyWindow(curWin.parent) ) {
referenceElement = curWin.frameElement; referenceElement = curWin.frameElement;
referenceElement[mgr.adData.adId] = { needsWindow: true }; referenceElement[mgr.adData.adId] = {needsWindow: true};
curWin = curWin.parent; curWin = curWin.parent;
} else { } else {
break; break;
} }
} }
} }
return { return {
referenceElement:referenceElement, referenceElement:referenceElement,
highestContainer: highestContainer highestContainer: highestContainer
@ -556,8 +729,7 @@ var exports = {};
(function(exports) { (function(exports) {
var _onAdFound; var _onAdFound;
var _getFullHTML; var _logGen = new exports.utils.LogGenerator();
var _logsSent = 0;
var _pageTags; var _pageTags;
var INIT_MS_BW_SEARCHES = 2000; var INIT_MS_BW_SEARCHES = 2000;
var PAGE_TAG_RE = new RegExp('gpt|oascentral'); var PAGE_TAG_RE = new RegExp('gpt|oascentral');
@ -565,23 +737,19 @@ var exports = {};
function getPageTags(doc) { function getPageTags(doc) {
var scripts = doc.getElementsByTagName('script'); var scripts = doc.getElementsByTagName('script');
var pageTags = []; var pageTags = [];
scripts = exports.utils.realArray(scripts); scripts = exports.utils.realArray(scripts);
scripts.forEach(function(script) { scripts.forEach(function(script) {
if (PAGE_TAG_RE.exec(script.src)) { if ( PAGE_TAG_RE.exec(script.src) ) {
pageTags.push({'tagName': 'SCRIPT', 'url': script.src}); pageTags.push({'tagName': 'SCRIPT', 'url': script.src});
} }
}); });
return pageTags; return pageTags;
} }
function messageAllParentFrames(adData) { function messageAllParentFrames(adData) {
adData.dummyId = true;
adData.dummyId = true;
var win = window; var win = window;
while ( win !== win.top ) { while ( win !== win.top ) {
win = win.parent; win = win.parent;
win.postMessage(adData, '*'); win.postMessage(adData, '*');
@ -590,26 +758,20 @@ var exports = {};
function appendTagsAndSendToParent(adData, referenceElement) { function appendTagsAndSendToParent(adData, referenceElement) {
var results = exports.tagfinder.appendTags(adData, referenceElement); var results = exports.tagfinder.appendTags(adData, referenceElement);
if ( exports.utils.SCRIPT_IN_HOSTILE_IFRAME ) { if ( exports.utils.SCRIPT_IN_HOSTILE_IFRAME ) {
messageAllParentFrames(adData); messageAllParentFrames(adData);
} else if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { } else if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) {
exports.tagfinder.setPositions(adData); exports.tagfinder.setPositions(adData);
exports.tagfinder.prepToSend(adData); exports.tagfinder.prepToSend(adData);
var html = adData.html; adData.curPageUrl = exports.utils.getPageUrl();
delete adData.html;
adData.curPageUrl = window.location.href;
_pageTags = _pageTags || getPageTags(document); _pageTags = _pageTags || getPageTags(document);
var log = _logGen.log('ad', [adData], _pageTags);
var log = exports.utils.makeLog(adData, _logsSent, _pageTags);
if ( _onAdFound ) { if ( _onAdFound ) {
_onAdFound(log, html, results.referenceElement); _onAdFound(log, results.referenceElement);
_logsSent++;
} }
} }
} }
@ -619,6 +781,7 @@ var exports = {};
} }
function extractAds() { function extractAds() {
var ads = exports.adfinder.findAds(window); var ads = exports.adfinder.findAds(window);
if ( !ads ) { if ( !ads ) {
@ -626,6 +789,7 @@ var exports = {};
} }
ads.forEach(function(ad) { ads.forEach(function(ad) {
var startTime = new Date().getTime(); var startTime = new Date().getTime();
var adId = startTime + '-' + Math.floor(Math.random() * 10e12); var adId = startTime + '-' + Math.floor(Math.random() * 10e12);
@ -633,59 +797,110 @@ var exports = {};
width: ad.offsetWidth, width: ad.offsetWidth,
height: ad.offsetHeight, height: ad.offsetHeight,
startTime: startTime, startTime: startTime,
html: ( _getFullHTML && [] ) || null, adId: adId,
adId: adId
html5: ad.html5 || false,
inIframe: ad.inIframe
}; };
if ( ad.html5 && ad.inIframe ) {
adData.adSizeMeta = ad.adSizeMeta || null;
adData.winClickTag = ad.winClickTag || null;
}
ad[adId] = { isAd: true }; ad[adId] = { isAd: true };
appendTagsAndSendToParent(adData, ad); appendTagsAndSendToParent(adData, ad);
}); });
} }
function onPostMessage(event) { function isChildWin(myWin, otherWin) {
var adData = event.data; var parentWin = otherWin.parent;
var ifrTag; while ( parentWin !== otherWin ) {
if ( parentWin === myWin ) {
return true;
}
otherWin = parentWin;
parentWin = parentWin.parent;
}
return false;
}
if ( !adData.dummyId ) { function iframeFromWindow(win, winToMatch) {
return; 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 = event.data,
ifrWin = event.source,
ifrTag;
if ( adData.dummyId ) {
delete adData.dummyId; delete adData.dummyId;
try { if ( isChildWin(window, ifrWin) ) {
ifrTag = event.source.frameElement; if ( exports.utils.isFriendlyWindow(ifrWin) ) {
} catch(e) { ifrTag = ifrWin.frameElement;
return false; } else {
ifrTag = iframeFromWindow(window, ifrWin);
} }
ifrTag[adData.adId] = {needsWindow: true}; if ( ifrTag ) {
ifrTag[adData.adId] = {needsWindow: true};
appendTagsAndSendToParent(adData, ifrTag); appendTagsAndSendToParent(adData, ifrTag);
} }
}
}
}
exports.coordinator = { exports.coordinator = {
init: function(onAdFound, opt_getFullHTML) { init: function(onAdFound, onPage) {
if (exports.utils.SCRIPT_IN_FRIENDLY_IFRAME) {
if ( exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) {
return false; return false;
} }
_onAdFound = onAdFound; _onAdFound = onAdFound;
_getFullHTML = opt_getFullHTML;
if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) {
chrome.runtime.sendMessage({ event: 'new-page', url: window.location.href }); var log = _logGen.log('page');
onPage(log);
} }
window.addEventListener('message', onPostMessage, false); window.addEventListener('message', onPostMessage, false);
if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) {
if ( document.readyState !== 'loading' ) { window.addEventListener('beforeunload', function(event) {
extractAdsWrapper(); var log = _logGen.log('unload');
} else { log.timing = window.performance.timing;
document.addEventListener('DOMContentLoaded', extractAdsWrapper); onPage(log);
});
} }
exports.utils.onDocLoaded(document, extractAdsWrapper);
} }
}; };
})(exports); })(exports);
(function(exports) { (function(exports) {
@ -693,7 +908,5 @@ var exports = {};
chrome.extension.sendRequest({ id: 'ad_log', subject: log }); chrome.extension.sendRequest({ id: 'ad_log', subject: log });
}; };
var getFullHTML = false; exports.coordinator.init(onAdFound, onAdFound);
exports.coordinator.init(onAdFound, getFullHTML);
})(exports); })(exports);

@ -12,8 +12,7 @@
upgraded = false, upgraded = false,
tab, tab,
tabCache = {}, tabCache = {},
headersCache = {}, headersCache = {};
adCache = [];
w.driver = { w.driver = {
/** /**
@ -91,7 +90,7 @@
break; break;
case 'ad_log': case 'ad_log':
adCache.push(request.subject); w.adCache.push(request.subject);
break; break;
case 'get_apps': case 'get_apps':
@ -217,11 +216,9 @@
w.ping = { hostnames: {} }; w.ping = { hostnames: {} };
w.driver.post('https://ad.wappalyzer.com/log/wp/', adCache); w.driver.post('https://ad.wappalyzer.com/log/wp/', w.adCache);
w.log('adCache: ' + JSON.stringify(adCache)); //
adCache = []; w.adCache = [];
} }
}, },

@ -1,19 +0,0 @@
/**
* Google Analytics
*/
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-216336-23']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script');
ga.src = 'https://ssl.google-analytics.com/ga.js';
ga.async = true;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
})();

@ -1,7 +1,7 @@
{ "name": "Wappalyzer", { "name": "Wappalyzer",
"homepage_url": "https://wappalyzer.com?pk_campaign=chrome&pk_kwd=context", "homepage_url": "https://wappalyzer.com?pk_campaign=chrome&pk_kwd=context",
"description": "Identifies software on the web", "description": "Identifies software on the web",
"version": "2.38", "version": "2.41",
"default_locale": "en", "default_locale": "en",
"manifest_version": 2, "manifest_version": 2,
"icons": { "icons": {

@ -196,6 +196,7 @@ var wappalyzer = (function() {
apps: {}, apps: {},
cats: null, cats: null,
ping: { hostnames: {} }, ping: { hostnames: {} },
adCache: [],
detected: {}, detected: {},
config: { config: {
@ -508,7 +509,7 @@ var wappalyzer = (function() {
} }
} }
if ( Object.keys(w.ping.hostnames).length >= 20 ) { if ( Object.keys(w.ping.hostnames).length >= 20 || w.adCache.length >= 40 ) {
driver('ping'); driver('ping');
} }

@ -16,11 +16,11 @@ website = Zu wappalyzer.com browsen
cat1 = CMS cat1 = CMS
cat2 = Message Board cat2 = Message Board
cat3 = Database Manager cat3 = Datenbank-Manager
cat4 = Documentation Tool cat4 = Dokumentationstool
cat5 = Widget cat5 = Widget
cat6 = eCommerce cat6 = eCommerce
cat7 = Photo Gallery cat7 = Fotogallery
cat8 = Wiki cat8 = Wiki
cat9 = Hosting Panel cat9 = Hosting Panel
cat10 = Analytics cat10 = Analytics
@ -28,40 +28,40 @@ cat11 = Blog
cat12 = JavaScript Framework cat12 = JavaScript Framework
cat13 = Issue Tracker cat13 = Issue Tracker
cat14 = Video Player cat14 = Video Player
cat15 = Comment System cat15 = Kommentarsystem
cat16 = CAPTCHA cat16 = CAPTCHA
cat17 = Font Script cat17 = Font Script
cat18 = Web Framework cat18 = Web Framework
cat19 = Miscellaneous cat19 = Diverses
cat20 = Editor cat20 = Editor
cat21 = LMS cat21 = LMS
cat22 = Web Server cat22 = Web-Server
cat23 = Cache Tool cat23 = Cache Tool
cat24 = Rich Text Editor cat24 = Rich Text Editor
cat25 = Javascript Graphics cat25 = Javascript Graphics
cat26 = Mobile Framework cat26 = Mobile Framework
cat27 = Programming Language cat27 = Programmiersprache
cat28 = Operating System cat28 = Betriebssystem
cat29 = Search Engine cat29 = Such-Engine
cat30 = Web mail cat30 = Web mail
cat31 = CDN cat31 = CDN
cat32 = Marketing Automation cat32 = Marketing Automation
cat33 = Web Server Extension cat33 = Web-Server-Erweiterung
cat34 = Database cat34 = Datenbank
cat35 = Map cat35 = Karte
cat36 = Advertizing Network cat36 = Werbenetzwerk
cat37 = Network Device cat37 = Netzwerkgerät
cat38 = Media Server cat38 = Medienserver
cat39 = Webcam cat39 = Webcam
cat40 = Printer cat40 = Drucker
cat41 = Payment Processor cat41 = Payment Processor
cat42 = Tag Manager cat42 = Tag Manager
cat43 = Paywall cat43 = Paywall
cat44 = Build/CI System cat44 = Build/CI System
cat45 = SCADA System cat45 = SCADA System
cat46 = Remote Access cat46 = Fernzugriff
cat47 = Development Tool cat47 = Development Tool
cat48 = Network Storage cat48 = Netzwerkspeicher
cat49 = Feed Readers cat49 = Feed-Leser
cat50 = Document Management Systems cat50 = Document Management Systems
cat51 = Landing Page Builder cat51 = Landing Page Builder

@ -133,11 +133,11 @@ class Wappalyzer
$headers = trim(substr($response, 0, $headerSize)); $headers = trim(substr($response, 0, $headerSize));
$headers = preg_split('/^\s*$/m', $headers); $headers = preg_split('/^\s*$/m', $headers);
$headers = end($headers); $headers = end($headers);
$lines = array_slice(explode("\r\n", $headers), 1); $lines = array_slice(explode("\n", $headers), 1);
foreach ( $lines as $line ) { foreach ( $lines as $line ) {
if ( strpos(trim($line), ': ') !== false ) { if ( strpos(trim($line), ': ') !== false ) {
list($key, $value) = explode(': ', $line); list($key, $value) = explode(': ', trim($line, "\r"));
$result->headers[strtolower($key)] = $value; $result->headers[strtolower($key)] = $value;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 735 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 720 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 469 B

After

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 B

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 B

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 B

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 B

After

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 765 B

After

Width:  |  Height:  |  Size: 728 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 422 B

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 422 B

After

Width:  |  Height:  |  Size: 418 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 837 B

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 B

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 391 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 524 B

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 524 B

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 418 B

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 B

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 661 B

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

After

Width:  |  Height:  |  Size: 772 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 936 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 757 B

After

Width:  |  Height:  |  Size: 744 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 408 B

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 718 B

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 718 B

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 934 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 754 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 325 B

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 602 B

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 602 B

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 432 B

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@ -196,6 +196,7 @@ var wappalyzer = (function() {
apps: {}, apps: {},
cats: null, cats: null,
ping: { hostnames: {} }, ping: { hostnames: {} },
adCache: [],
detected: {}, detected: {},
config: { config: {
@ -508,7 +509,7 @@ var wappalyzer = (function() {
} }
} }
if ( Object.keys(w.ping.hostnames).length >= 20 ) { if ( Object.keys(w.ping.hostnames).length >= 20 || w.adCache.length >= 40 ) {
driver('ping'); driver('ping');
} }

Loading…
Cancel
Save