diff --git a/drivers/bookmarklet/images/icons/3DM.png b/drivers/bookmarklet/images/icons/3DM.png new file mode 100755 index 000000000..69e17bcb4 Binary files /dev/null and b/drivers/bookmarklet/images/icons/3DM.png differ diff --git a/drivers/bookmarklet/images/icons/3ware.png b/drivers/bookmarklet/images/icons/3ware.png new file mode 100755 index 000000000..69e17bcb4 Binary files /dev/null and b/drivers/bookmarklet/images/icons/3ware.png differ diff --git a/drivers/bookmarklet/images/icons/ATEN.png b/drivers/bookmarklet/images/icons/ATEN.png new file mode 100755 index 000000000..f15a46b5f Binary files /dev/null and b/drivers/bookmarklet/images/icons/ATEN.png differ diff --git a/drivers/bookmarklet/images/icons/Apache HBase.png b/drivers/bookmarklet/images/icons/Apache HBase.png new file mode 100644 index 000000000..113d901a6 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Apache HBase.png differ diff --git a/drivers/bookmarklet/images/icons/Apache Hadoop.png b/drivers/bookmarklet/images/icons/Apache Hadoop.png new file mode 100755 index 000000000..39075d893 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Apache Hadoop.png differ diff --git a/drivers/bookmarklet/images/icons/Backbone.js.png b/drivers/bookmarklet/images/icons/Backbone.js.png index 7d774c810..d45b1b17b 100644 Binary files a/drivers/bookmarklet/images/icons/Backbone.js.png and b/drivers/bookmarklet/images/icons/Backbone.js.png differ diff --git a/drivers/bookmarklet/images/icons/BaseHTTP.png b/drivers/bookmarklet/images/icons/BaseHTTP.png new file mode 100755 index 000000000..68b9f6bfc Binary files /dev/null and b/drivers/bookmarklet/images/icons/BaseHTTP.png differ diff --git a/drivers/bookmarklet/images/icons/Boa.png b/drivers/bookmarklet/images/icons/Boa.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Boa.png differ diff --git a/drivers/bookmarklet/images/icons/Brother.png b/drivers/bookmarklet/images/icons/Brother.png new file mode 100755 index 000000000..fbc41595e Binary files /dev/null and b/drivers/bookmarklet/images/icons/Brother.png differ diff --git a/drivers/bookmarklet/images/icons/Canon.png b/drivers/bookmarklet/images/icons/Canon.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/bookmarklet/images/icons/Canon.png differ diff --git a/drivers/bookmarklet/images/icons/Catwalk.png b/drivers/bookmarklet/images/icons/Catwalk.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/bookmarklet/images/icons/Catwalk.png differ diff --git a/drivers/bookmarklet/images/icons/Chartbeat.png b/drivers/bookmarklet/images/icons/Chartbeat.png new file mode 100644 index 000000000..2cb597cc7 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Chartbeat.png differ diff --git a/drivers/bookmarklet/images/icons/CherryPy.png b/drivers/bookmarklet/images/icons/CherryPy.png new file mode 100755 index 000000000..badc40ac2 Binary files /dev/null and b/drivers/bookmarklet/images/icons/CherryPy.png differ diff --git a/drivers/bookmarklet/images/icons/Cloudera.png b/drivers/bookmarklet/images/icons/Cloudera.png new file mode 100755 index 000000000..4d3a6a1d4 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Cloudera.png differ diff --git a/drivers/bookmarklet/images/icons/CodeMirror.png b/drivers/bookmarklet/images/icons/CodeMirror.png new file mode 100644 index 000000000..ef34d402c Binary files /dev/null and b/drivers/bookmarklet/images/icons/CodeMirror.png differ diff --git a/drivers/bookmarklet/images/icons/CompaqHTTPServer.png b/drivers/bookmarklet/images/icons/CompaqHTTPServer.png new file mode 100755 index 000000000..2b0bc39df Binary files /dev/null and b/drivers/bookmarklet/images/icons/CompaqHTTPServer.png differ diff --git a/drivers/bookmarklet/images/icons/Cufon.png b/drivers/bookmarklet/images/icons/Cufon.png new file mode 100644 index 000000000..cd2e3f029 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Cufon.png differ diff --git a/drivers/bookmarklet/images/icons/Darwin.png b/drivers/bookmarklet/images/icons/Darwin.png new file mode 100755 index 000000000..41b6c8b00 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Darwin.png differ diff --git a/drivers/bookmarklet/images/icons/Dell.png b/drivers/bookmarklet/images/icons/Dell.png new file mode 100755 index 000000000..76a80b4fa Binary files /dev/null and b/drivers/bookmarklet/images/icons/Dell.png differ diff --git a/drivers/bookmarklet/images/icons/ELOG HTTP.png b/drivers/bookmarklet/images/icons/ELOG HTTP.png new file mode 100644 index 000000000..7af2b77e9 Binary files /dev/null and b/drivers/bookmarklet/images/icons/ELOG HTTP.png differ diff --git a/drivers/bookmarklet/images/icons/ELOG.png b/drivers/bookmarklet/images/icons/ELOG.png new file mode 100644 index 000000000..7af2b77e9 Binary files /dev/null and b/drivers/bookmarklet/images/icons/ELOG.png differ diff --git a/drivers/bookmarklet/images/icons/EWS-NIC4.png b/drivers/bookmarklet/images/icons/EWS-NIC4.png new file mode 100755 index 000000000..76a80b4fa Binary files /dev/null and b/drivers/bookmarklet/images/icons/EWS-NIC4.png differ diff --git a/drivers/bookmarklet/images/icons/Erlang.png b/drivers/bookmarklet/images/icons/Erlang.png new file mode 100755 index 000000000..235338617 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Erlang.png differ diff --git a/drivers/bookmarklet/images/icons/FlashCom.png b/drivers/bookmarklet/images/icons/FlashCom.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/bookmarklet/images/icons/FlashCom.png differ diff --git a/drivers/bookmarklet/images/icons/Grandstream.png b/drivers/bookmarklet/images/icons/Grandstream.png new file mode 100755 index 000000000..b4b1eb66b Binary files /dev/null and b/drivers/bookmarklet/images/icons/Grandstream.png differ diff --git a/drivers/bookmarklet/images/icons/HP ProCurve.png b/drivers/bookmarklet/images/icons/HP ProCurve.png new file mode 100755 index 000000000..2b0bc39df Binary files /dev/null and b/drivers/bookmarklet/images/icons/HP ProCurve.png differ diff --git a/drivers/bookmarklet/images/icons/Highstock.png b/drivers/bookmarklet/images/icons/Highstock.png new file mode 100755 index 000000000..6e8391d36 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Highstock.png differ diff --git a/drivers/bookmarklet/images/icons/Indico.png b/drivers/bookmarklet/images/icons/Indico.png new file mode 100755 index 000000000..02636b6cc Binary files /dev/null and b/drivers/bookmarklet/images/icons/Indico.png differ diff --git a/drivers/bookmarklet/images/icons/Intercom.png b/drivers/bookmarklet/images/icons/Intercom.png new file mode 100644 index 000000000..40d2321a0 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Intercom.png differ diff --git a/drivers/bookmarklet/images/icons/Jetty.png b/drivers/bookmarklet/images/icons/Jetty.png new file mode 100755 index 000000000..807b88634 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Jetty.png differ diff --git a/drivers/bookmarklet/images/icons/KS_HTTP.png b/drivers/bookmarklet/images/icons/KS_HTTP.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/bookmarklet/images/icons/KS_HTTP.png differ diff --git a/drivers/bookmarklet/images/icons/LabVIEW.png b/drivers/bookmarklet/images/icons/LabVIEW.png new file mode 100755 index 000000000..c832bdc54 Binary files /dev/null and b/drivers/bookmarklet/images/icons/LabVIEW.png differ diff --git a/drivers/bookmarklet/images/icons/Less.png b/drivers/bookmarklet/images/icons/Less.png new file mode 100644 index 000000000..9e1de2359 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Less.png differ diff --git a/drivers/bookmarklet/images/icons/LiveStreet CMS.png b/drivers/bookmarklet/images/icons/LiveStreet CMS.png new file mode 100644 index 000000000..75a0029aa Binary files /dev/null and b/drivers/bookmarklet/images/icons/LiveStreet CMS.png differ diff --git a/drivers/bookmarklet/images/icons/Logitech Media Server.png b/drivers/bookmarklet/images/icons/Logitech Media Server.png new file mode 100755 index 000000000..b2e6cb1f2 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Logitech Media Server.png differ diff --git a/drivers/bookmarklet/images/icons/MOBOTIX.png b/drivers/bookmarklet/images/icons/MOBOTIX.png new file mode 100755 index 000000000..321f9a8b1 Binary files /dev/null and b/drivers/bookmarklet/images/icons/MOBOTIX.png differ diff --git a/drivers/bookmarklet/images/icons/MiniServ.png b/drivers/bookmarklet/images/icons/MiniServ.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/bookmarklet/images/icons/MiniServ.png differ diff --git a/drivers/bookmarklet/images/icons/Mono.png b/drivers/bookmarklet/images/icons/Mono.png new file mode 100644 index 000000000..912809eb2 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Mono.png differ diff --git a/drivers/bookmarklet/images/icons/PerfSONAR-PS.png b/drivers/bookmarklet/images/icons/PerfSONAR-PS.png new file mode 100755 index 000000000..13be42d00 Binary files /dev/null and b/drivers/bookmarklet/images/icons/PerfSONAR-PS.png differ diff --git a/drivers/bookmarklet/images/icons/Posterous.png b/drivers/bookmarklet/images/icons/Posterous.png new file mode 100644 index 000000000..3150f4f93 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Posterous.png differ diff --git a/drivers/bookmarklet/images/icons/Prefix-Free.png b/drivers/bookmarklet/images/icons/Prefix-Free.png new file mode 100644 index 000000000..87a646815 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Prefix-Free.png differ diff --git a/drivers/bookmarklet/images/icons/SAP.png b/drivers/bookmarklet/images/icons/SAP.png new file mode 100644 index 000000000..9217c8f87 Binary files /dev/null and b/drivers/bookmarklet/images/icons/SAP.png differ diff --git a/drivers/bookmarklet/images/icons/Sentinel Keys Server.png b/drivers/bookmarklet/images/icons/Sentinel Keys Server.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/bookmarklet/images/icons/Sentinel Keys Server.png differ diff --git a/drivers/bookmarklet/images/icons/Sentinel License Monitor.png b/drivers/bookmarklet/images/icons/Sentinel License Monitor.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/bookmarklet/images/icons/Sentinel License Monitor.png differ diff --git a/drivers/bookmarklet/images/icons/Sentinel Protection Server.png b/drivers/bookmarklet/images/icons/Sentinel Protection Server.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/bookmarklet/images/icons/Sentinel Protection Server.png differ diff --git a/drivers/bookmarklet/images/icons/Splunk.png b/drivers/bookmarklet/images/icons/Splunk.png new file mode 100755 index 000000000..bd2a1a514 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Splunk.png differ diff --git a/drivers/bookmarklet/images/icons/Splunkd.png b/drivers/bookmarklet/images/icons/Splunkd.png new file mode 100755 index 000000000..bd2a1a514 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Splunkd.png differ diff --git a/drivers/bookmarklet/images/icons/SunOS.png b/drivers/bookmarklet/images/icons/SunOS.png new file mode 100755 index 000000000..725070080 Binary files /dev/null and b/drivers/bookmarklet/images/icons/SunOS.png differ diff --git a/drivers/bookmarklet/images/icons/TWiki.png b/drivers/bookmarklet/images/icons/TWiki.png new file mode 100644 index 000000000..f6573b7fa Binary files /dev/null and b/drivers/bookmarklet/images/icons/TWiki.png differ diff --git a/drivers/bookmarklet/images/icons/Underscore.js.png b/drivers/bookmarklet/images/icons/Underscore.js.png index 10262b99d..030496838 100644 Binary files a/drivers/bookmarklet/images/icons/Underscore.js.png and b/drivers/bookmarklet/images/icons/Underscore.js.png differ diff --git a/drivers/bookmarklet/images/icons/Wink.png b/drivers/bookmarklet/images/icons/Wink.png new file mode 100644 index 000000000..3e7204032 Binary files /dev/null and b/drivers/bookmarklet/images/icons/Wink.png differ diff --git a/drivers/bookmarklet/images/icons/Wowza Media Server.png b/drivers/bookmarklet/images/icons/Wowza Media Server.png new file mode 100755 index 000000000..2e7c25e2b Binary files /dev/null and b/drivers/bookmarklet/images/icons/Wowza Media Server.png differ diff --git a/drivers/bookmarklet/images/icons/XAMPP.png b/drivers/bookmarklet/images/icons/XAMPP.png new file mode 100755 index 000000000..7104b0e4d Binary files /dev/null and b/drivers/bookmarklet/images/icons/XAMPP.png differ diff --git a/drivers/bookmarklet/images/icons/Xajax.png b/drivers/bookmarklet/images/icons/Xajax.png new file mode 100644 index 000000000..bba0d40ab Binary files /dev/null and b/drivers/bookmarklet/images/icons/Xajax.png differ diff --git a/drivers/bookmarklet/images/icons/Zabbix.png b/drivers/bookmarklet/images/icons/Zabbix.png new file mode 100755 index 000000000..c7384dc3e Binary files /dev/null and b/drivers/bookmarklet/images/icons/Zabbix.png differ diff --git a/drivers/bookmarklet/images/icons/debut.png b/drivers/bookmarklet/images/icons/debut.png new file mode 100755 index 000000000..fbc41595e Binary files /dev/null and b/drivers/bookmarklet/images/icons/debut.png differ diff --git a/drivers/bookmarklet/images/icons/default.png b/drivers/bookmarklet/images/icons/default.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/bookmarklet/images/icons/default.png differ diff --git a/drivers/bookmarklet/images/icons/dwhttpd.png b/drivers/bookmarklet/images/icons/dwhttpd.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/bookmarklet/images/icons/dwhttpd.png differ diff --git a/drivers/bookmarklet/images/icons/eHTTP.png b/drivers/bookmarklet/images/icons/eHTTP.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/bookmarklet/images/icons/eHTTP.png differ diff --git a/drivers/bookmarklet/images/icons/libwww-perl-daemon.png b/drivers/bookmarklet/images/icons/libwww-perl-daemon.png new file mode 100755 index 000000000..2110788f2 Binary files /dev/null and b/drivers/bookmarklet/images/icons/libwww-perl-daemon.png differ diff --git a/drivers/bookmarklet/images/icons/mod_auth_pam.png b/drivers/bookmarklet/images/icons/mod_auth_pam.png new file mode 100755 index 000000000..d268dcca8 Binary files /dev/null and b/drivers/bookmarklet/images/icons/mod_auth_pam.png differ diff --git a/drivers/bookmarklet/images/icons/mod_jk.png b/drivers/bookmarklet/images/icons/mod_jk.png new file mode 100755 index 000000000..d268dcca8 Binary files /dev/null and b/drivers/bookmarklet/images/icons/mod_jk.png differ diff --git a/drivers/bookmarklet/images/icons/mod_perl.png b/drivers/bookmarklet/images/icons/mod_perl.png new file mode 100755 index 000000000..3f0559995 Binary files /dev/null and b/drivers/bookmarklet/images/icons/mod_perl.png differ diff --git a/drivers/bookmarklet/images/icons/posterous.png b/drivers/bookmarklet/images/icons/posterous.png index 3730d31aa..3150f4f93 100644 Binary files a/drivers/bookmarklet/images/icons/posterous.png and b/drivers/bookmarklet/images/icons/posterous.png differ diff --git a/drivers/bookmarklet/js/wappalyzer.js b/drivers/bookmarklet/js/wappalyzer.js index 6257ac81e..3bb3d9ad2 100644 --- a/drivers/bookmarklet/js/wappalyzer.js +++ b/drivers/bookmarklet/js/wappalyzer.js @@ -13,64 +13,64 @@ var wappalyzer = (function() { * Application class */ var Application = function(app, detected) { - var self = this; - - self.app = app; - self.confidence = {}; - self.confidenceTotal = 0; - self.detected = Boolean(detected); - self.version = ''; - self.versions = []; + this.app = app; + this.confidence = {}; + this.confidenceTotal = 0; + this.detected = Boolean(detected); + this.version = ''; + this.versions = []; + }; + Application.prototype = { /** * Calculate confidence total */ - self.getConfidence = function() { + getConfidence: function() { var total = 0; - for ( id in self.confidence ) { - total += self.confidence[id]; + for ( id in this.confidence ) { + total += this.confidence[id]; } - return self.confidenceTotal = Math.min(total, 100); - } + return this.confidenceTotal = Math.min(total, 100); + }, /** * Resolve version number (find the longest version number that contains all shorter detected version numbers) */ - self.getVersion = function() { - var next, resolved; + getVersion: function() { + var i, next, resolved; - if ( !self.versions.length ) { + if ( !this.versions.length ) { return; } - self.versions.sort(function(a, b) { + this.versions.sort(function(a, b) { return a.length > b.length ? 1 : ( a.length < b.length ? -1 : 0 ); }); - resolved = self.versions[0]; + resolved = this.versions[0]; - for ( i in self.versions ) { + for ( i in this.versions ) { next = parseInt(i) + 1; - if ( next < self.versions.length ) { - if ( self.versions[next].indexOf(self.versions[i]) !== -1 ) { - resolved = self.versions[next]; + if ( next < this.versions.length ) { + if ( this.versions[next].indexOf(this.versions[i]) !== -1 ) { + resolved = this.versions[next]; } else { break; } } } - return self.version = resolved; - } + return this.version = resolved; + }, - self.setDetected = function(pattern, type, value, key) { - self.detected = true; + setDetected: function(pattern, type, value, key) { + this.detected = true; // Set confidence level - self.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; + this.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; // Detect version number if ( pattern.version ) { @@ -79,13 +79,20 @@ var wappalyzer = (function() { matches = pattern.regex.exec(value) ; + w.log({ matches: matches, version: version }); + if ( matches ) { matches.map(function(match, i) { // Parse ternary operator var ternary = new RegExp('\\\\' + i + '\\?([^:]+):(.+)$').exec(version); if ( ternary && ternary.length === 3 ) { + + w.log({ match: match, i: i, ternary: ternary }); + version = version.replace(ternary[0], match ? ternary[1] : ternary[2]); + + w.log({ version: version }); } // Replace back references @@ -93,14 +100,43 @@ var wappalyzer = (function() { }); if ( version ) { - self.versions.push(version); + this.versions.push(version); } - self.getVersion(); + this.getVersion(); } } } - } + }; + + var Profiler = function() { + this.regexCount = 0; + this.startTime = new Date().getTime(); + this.lastTime = new Date().getTime(); + this.slowest = { duration: null, app: '', type: '', pattern: '' }; + this.timedOut = false; + }; + + Profiler.prototype = { + checkPoint: function(app, type, regex) { + var duration = new Date().getTime() - this.lastTime; + + if ( !this.slowest.duration || duration > this.slowest.duration ) { + this.slowest.duration = duration; + this.slowest.app = app; + this.slowest.type = type; + this.slowest.regex = regex; + } + + this.lastTime = new Date().getTime(); + + this.timedOut = this.getDuration() > 1000; + }, + + getDuration: function() { + return new Date().getTime() - this.startTime; + } + }; /** * Call driver functions @@ -172,15 +208,9 @@ var wappalyzer = (function() { config: { environment: 'dev', // dev | live - - version: false, - websiteURL: 'http://wappalyzer.com/', twitterURL: 'https://twitter.com/Wappalyzer', githubURL: 'https://github.com/ElbertF/Wappalyzer', - - firstRun: false, - upgraded: false }, /** @@ -214,19 +244,7 @@ var wappalyzer = (function() { } // Initialize driver - driver('init', function() { - if ( w.config.firstRun ) { - driver('goToURL', { url: w.config.websiteURL + 'installed', medium: 'install' }); - - w.config.firstRun = false; - } - - if ( w.config.upgraded ) { - driver('goToURL', { url: w.config.websiteURL + 'upgraded', medium: 'upgrade' }); - - w.config.upgraded = false; - } - }); + driver('init'); }, /** @@ -235,10 +253,7 @@ var wappalyzer = (function() { analyze: function(hostname, url, data) { var i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header, version, - profiler = { - regexCount: 0, - startTime: new Date().getTime() - }, + profiler = new Profiler(), apps = {} ; @@ -257,13 +272,21 @@ var wappalyzer = (function() { } for ( app in w.apps ) { + // Exit loop after one second to prevent CPU hogging + // Remaining patterns will not be evaluated + if ( profiler.timedOut ) { + w.log('Timeout, exiting loop'); + + break; + } + apps[app] = w.detected[url] && w.detected[url][app] ? w.detected[url][app] : new Application(app); for ( type in w.apps[app] ) { switch ( type ) { case 'url': parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(url) ) { apps[app].setDetected(pattern, type, url); @@ -277,7 +300,7 @@ var wappalyzer = (function() { } parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(data[type]) ) { apps[app].setDetected(pattern, type, data[type]); @@ -293,10 +316,10 @@ var wappalyzer = (function() { regexScript = new RegExp(']+src=("|\')([^"\']+)', 'ig'); parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); while ( match = regexScript.exec(data.html) ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(match[2]) ) { apps[app].setDetected(pattern, type, match[2]); @@ -310,19 +333,17 @@ var wappalyzer = (function() { break; } - profiler.regexCount ++; - regexMeta = /]+>/ig; while ( match = regexMeta.exec(data.html) ) { for ( meta in w.apps[app][type] ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, regexMeta); if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { content = match.toString().match(/content=("|')([^"']+)("|')/i); parse(w.apps[app].meta[meta]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( content && content.length === 4 && pattern.regex.test(content[2]) ) { apps[app].setDetected(pattern, type, content[2], meta); @@ -340,7 +361,7 @@ var wappalyzer = (function() { for ( header in w.apps[app].headers ) { parse(w.apps[app][type][header]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) { apps[app].setDetected(pattern, type, data[type][header], header); @@ -356,7 +377,7 @@ var wappalyzer = (function() { parse(w.apps[app][type]).map(function(pattern) { for ( i in data[type] ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(data[type][i]) ) { apps[app].setDetected(pattern, type, data[type][i]); @@ -369,7 +390,8 @@ var wappalyzer = (function() { } } - w.log('Tested ' + profiler.regexCount + ' regular expressions in ' + ( ( ( new Date ).getTime() - profiler.startTime ) / 1000 ) + 's'); + w.log('[ PROFILER ] Tested ' + profiler.regexCount + ' regular expressions in ' + ( profiler.getDuration() / 1000 ) + 's'); + w.log('[ PROFILER ] Slowest pattern took ' + ( profiler.slowest.duration / 1000 ) + 's: ' + profiler.slowest.app + ' | ' + profiler.slowest.type + ' | ' + profiler.slowest.regex); for ( app in apps ) { if ( !apps[app].detected ) { diff --git a/drivers/bookmarklet/json b/drivers/bookmarklet/json index 468e8d4e9..3002cb2b1 100644 --- a/drivers/bookmarklet/json +++ b/drivers/bookmarklet/json @@ -35,21 +35,25 @@ "33": "web-server-extensions", "34": "databases", "35": "maps", - "36": "advertising-networks" + "36": "advertising-networks", + "37": "network-devices", + "38": "media-servers", + "39": "webcams", + "40": "printers" }, "apps": { "1C-Bitrix": { "website": "www.1c-bitrix.ru", "cats": [ 1 ], "headers": { "X-Powered-CMS": "Bitrix Site Manager", "Set-Cookie": "BITRIX_" }, - "html": "]+components\/bitrix|(src|href)=\"\/bitrix\/(js|templates)", + "html": "(?:]+components/bitrix|(?:src|href)=\"/bitrix/(?:js|templates))", "script": "1c-bitrix", "implies": "PHP" }, "1und1": { "website": "1und1.de", "cats": [ 6 ], - "url": "\/shop\/catalog\/browse\\?sessid=", + "url": "/shop/catalog/browse\\?sessid=", "implies": "PHP" }, "2z Project": { @@ -61,7 +65,18 @@ "website": "www.3dcart.com", "cats": [ 1, 6 ], "headers": { "X-Powered-By": "3DCART" }, - "script": "(twlh(track)?\\.asp|3d_upsell\\.js)" + "script": "(?:twlh(?:track)?\\.asp|3d_upsell\\.js)" + }, + "3DM": { + "website": "www.3ware.com", + "cats": [ 19 ], + "html": "3ware 3DM([\\d\\.]+)?\\;version:\\1", + "implies": "3ware" + }, + "3ware": { + "website": "www.3ware.com", + "cats": [ 22 ], + "headers": { "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1" } }, "Accessible Portal": { "website": "www.accessibleportal.com", @@ -72,20 +87,29 @@ "AddThis": { "website": "www.addthis.com", "cats": [ 5 ], - "script": "addthis\\.com\/js\/(\\d+)?\\;version:\\1", + "script": "addthis\\.com/js/(\\d+)?\\;version:\\1", "env": "^addthis" }, + "Adobe ColdFusion": { + "website": "adobe.com/products/coldfusion-family.html", + "cats": [ 18 ], + "url": "\\.cfm$", + "html": "<!-- START headerTags\\.cfm", + "script": "/cfajax/", + "env": "^_cfEmails$", + "implies": "CFML" + }, "Adobe CQ5": { - "website": "adobe.com\/products\/cq.html", + "website": "adobe.com/products/cq.html", "cats": [ 1 ], - "url": "\/etc\/designs\/", + "url": "/etc/designs/", "html": "<div class=\"[^\"]*parbase", "implies": "Java" }, "Adobe GoLive": { - "website": "www.adobe.com\/products\/golive", + "website": "www.adobe.com/products/golive", "cats": [ 20 ], - "meta": { "generator": "Adobe GoLive(\\s([\\d.]+))?\\;version:\\2" } + "meta": { "generator": "Adobe GoLive(?:\\s([\\d.]+))?\\;version:\\1" } }, "Advanced Web Stats": { "website": "www.advancedwebstats.com", @@ -99,9 +123,9 @@ "env": "^AUI$" }, "Amaya": { - "website": "www.w3.org\/Amaya", + "website": "www.w3.org/Amaya", "cats": [ 20 ], - "meta": { "generator": "Amaya( V?([\\d.]+[a-z]))?\\;version:\\2" } + "meta": { "generator": "Amaya(?: V?([\\d.]+[a-z]))?\\;version:\\1" } }, "amCharts": { "website": "amcharts.com", @@ -112,7 +136,7 @@ "Ametys": { "website": "ametys.org", "cats": [ 1 ], - "meta": { "generator": "(Ametys|Anyware Technologies)" }, + "meta": { "generator": "(?:Ametys|Anyware Technologies)" }, "script": "STools\\.js", "implies": "Java" }, @@ -120,7 +144,7 @@ "website": "amirocms.com", "cats": [ 1 ], "meta": { "generator": "Amiro" }, - "html": "system_(js\\.php\\?script=|css\\.php\\?styles)[^\"]+cv=([\\d.]+)\\;version:\\2", + "html": "system_(?:js\\.php\\?script=|css\\.php\\?styles)[^\"]+cv=([\\d.]+)\\;version:\\1", "implies": "PHP" }, "AMPcms": { @@ -138,12 +162,22 @@ "AOLserver": { "website": "aolserver.com", "cats": [ 22 ], - "headers": { "Server": "AOLserver\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "AOLserver/?([\\d.]+)?\\;version:\\1" } }, "Apache": { "website": "apache.org", "cats": [ 22 ], - "headers": { "Server": "(Apache($|\/([\\d.]+)|[^\/-])|(^|\\b)HTTPD)\\;version:\\3" } + "headers": { "Server": "(?:Apache(?:$|/([\\d.]+)|[^/-])|(?:^|\\b)HTTPD)\\;version:\\1" } + }, + "Apache Hadoop": { + "website": "hadoop.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hadoop.css\"" + }, + "Apache HBase": { + "website": "hbase.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hbase.css\"" }, "Apache JSPWiki": { "website": "jspwiki.org", @@ -155,12 +189,12 @@ "Apache Tomcat": { "website": "tomcat.apache.org", "cats": [ 22 ], - "headers": { "Server": "Apache-Coyote\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "Apache-Coyote/?([\\d.]+)?\\;version:\\1" } }, "Apache Traffic Server": { - "website": "trafficserver.apache.org\/", + "website": "trafficserver.apache.org/", "cats": [ 22 ], - "headers": { "Server": "ATS\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "ATS/?([\\d.]+)?\\;version:\\1" } }, "Arc Forum": { "website": "arclanguage.org", @@ -168,42 +202,47 @@ "html": "ping\\.src = node\\.href;" }, "AsciiDoc": { - "website": "www.methods.co.nz\/asciidoc", + "website": "www.methods.co.nz/asciidoc", "cats": [ 1, 20, 27 ], "meta": { "generator": "^AsciiDoc ([\\d.]+)\\;version:\\1" }, "env": "^asciidoc$" }, + "ATEN": { + "website": "www.aten.com", + "cats": [ 22 ], + "headers": { "Server": "ATEN HTTP Server(\\(V?([\\d\\.]+)\\))?\\;version:\\2" } + }, "ATG Web Commerce": { - "website": "oracle.com\/us\/products\/applications\/web-commerce\/atg", + "website": "oracle.com/us/products/applications/web-commerce/atg", "cats": [ 6 ], - "headers": { "X-ATG-Version": "(ATGPlatform\/([\\d.]+))?\\;version:\\2" }, + "headers": { "X-ATG-Version": "(?:ATGPlatform/([\\d.]+))?\\;version:\\1" }, "html": "<[^>]+_DARGS" }, "Atlassian Confluence": { - "website": "www.atlassian.com\/software\/confluence\/overview\/team-collaboration-software", + "website": "www.atlassian.com/software/confluence/overview/team-collaboration-software", "cats": [ 8 ], - "html": "Powered by <a href=[^>]+atlassian\\.com\/software\/confluence([^>]+>Atlassian Confluence<\/a> ([\\d.]+))?\\;version:\\2", + "html": "Powered by <a href=[^>]+atlassian\\.com/software/confluence(?:[^>]+>Atlassian Confluence</a> ([\\d.]+))?\\;version:\\1", "headers": { "X-Confluence-Request-Time": ".*" }, "meta": { "confluence-request-time": ".*" }, "implies": "Java" }, "Atlassian Jira": { - "website": "www.atlassian.com\/software\/jira\/overview\/", + "website": "www.atlassian.com/software/jira/overview/", "cats": [ 13 ], "env": "^jira$", - "script": "\/jira\/s\/", - "url": "\/secure\/Dashboard.jspa", - "html": "Powered by\\s+<a href=[^>]+atlassian\\.com\/(software\/jira|jira-bug-tracking\/)[^>]+>Atlassian\\s+JIRA([^v]*v(ersion: )?(\\d+\\.\\d+(\\.\\d+)?))?\\;version:\\4", + "script": "/jira/s/", + "url": "/secure/Dashboard\\.jspa", + "html": "Powered by\\s+<a href=[^>]+atlassian\\.com/(?:software/jira|jira-bug-tracking/)[^>]+>Atlassian\\s+JIRA(?:[^v]*v(?:ersion: )?(\\d+\\.\\d+(\\.\\d+)?))?\\;version:\\1", "implies": "Java" }, "AWStats": { "website": "awstats.sourceforge.net", "cats": [ 10 ], - "meta": { "generator": "AWStats ([\\d.]+( \\(build [\\d.]+\\))?)\\;version:\\1" }, + "meta": { "generator": "AWStats ([\\d.]+(?: \\(?:build [\\d.]+\\))?)\\;version:\\1" }, "implies": "Perl" }, "Backbone.js": { - "website": "documentcloud.github.com\/backbone", + "website": "documentcloud.github.com/backbone", "cats": [ 12 ], "script": "backbone.*\\.js", "env": "^Backbone$", @@ -212,26 +251,32 @@ "Banshee": { "website": "www.banshee-php.org", "cats": [ 1, 18 ], - "html": "Built upon the <a href=\"[^>]+banshee-php\\.org\/\">[a-z]+<\/a>(v([\\d.]+))?\\;version:\\2", + "html": "Built upon the <a href=\"[^>]+banshee-php\\.org/\">[a-z]+</a>(?:v([\\d.]+))?\\;version:\\1", "implies": "PHP" }, + "BaseHTTP": { + "website": "docs.python.org/2/library/basehttpserver.html", + "cats": [ 22 ], + "headers": { "Server": "BaseHTTP\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" + }, "BIGACE": { "website": "bigace.de", "cats": [ 1 ], "meta": { "generator": "BIGACE ([\\d.]+)\\;version:\\1" }, - "html": "Powered by <a href=\"[^>]+BIGACE|<!--\\s+Site is running BIGACE", + "html": "(?:Powered by <a href=\"[^>]+BIGACE|<!--\\s+Site is running BIGACE)", "implies": "PHP" }, "Bigcommerce": { "website": "www.bigcommerce.com", "cats": [ 6 ], - "url": ".+\\.mybigcommerce\\.com", - "html": "<link href=[^>]+cdn\\d+\\.bigcommerce\\.com\/v", - "script": "cdn\\d+\\.bigcommerce\\.com\/v", + "url": "mybigcommerce\\.com", + "html": "<link href=[^>]+cdn\\d+\\.bigcommerce\\.com/v", + "script": "cdn\\d+\\.bigcommerce\\.com/v", "env": "^compareProducts$" }, "BigDump": { - "website": "www.ozerov.de\/bigdump.php", + "website": "www.ozerov.de/bigdump.php", "cats": [ 3 ], "html": "<!-- <h1>BigDump: Staggered MySQL Dump Importer ver\\. ([\\d.b]+)\\;version:\\1", "implies": "PHP" @@ -239,27 +284,36 @@ "Bigware": { "website": "bigware.de", "cats": [ 6 ], - "html": "Diese <a href=.+bigware\\.de|<a href=[^>]+\/main_bigware_\\d+\\.php", - "url": "(\\?|&)bigWAdminID=[a-z\\d]+(&|$)", - "headers": { "Set-Cookie": "bigwareCsid|bigWAdminID" }, + "html": "(?:Diese <a href=[^>]+bigware\\.de|<a href=[^>]+/main_bigware_\\d+\\.php)", + "url": "(?:\\?|&)bigWAdminID=", + "headers": { "Set-Cookie": "(?:bigwareCsid|bigWAdminID)" }, "implies": "PHP" }, "BittAds": { "website": "bittads.com", "cats": [ 36 ], - "script": "bittads\\.com\/js\/bitt\\.js$", + "script": "bittads\\.com/js/bitt\\.js$", "env": "^bitt$" }, "Blip.tv": { "website": "blip.tv", "cats": [ 14 ], - "html": "<(param|embed|iframe)[^>]+blip\\.tv\/play" + "html": "<(?:param|embed|iframe)[^>]+blip\\.tv/play" }, "Blogger": { "website": "www.blogger.com", "cats": [ 11 ], "meta": { "generator": "blogger" }, - "url": "^(www.)?.+\\.blogspot\\.com" + "url": "\\.blogspot\\.com" + }, + "Boa": { + "website": "www.boa.org", + "cats": [ 22 ], + "headers": { "Server": "Boa\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, + "Brother": { + "website": "www.brother.com", + "cats": [ 40 ] }, "BrowserCMS": { "website": "browsercms.org", @@ -285,6 +339,10 @@ "script": "CatalystScripts", "html": "<!-- BC_OBNW -->" }, + "Canon": { + "website": "www.canon.com", + "cats": [ 40 ] + }, "CakePHP": { "website": "cakephp.org", "cats": [ 18 ], @@ -296,17 +354,23 @@ "website": "cargocollective.com", "cats": [ 1 ], "meta": { "cargo_title": ".*" }, - "script": "\/cargo\\.", + "script": "/cargo\\.", "html": "<link [^>]+Cargo feed", "implies": "PHP" }, + "Catwalk": { + "website": "www.canon.com", + "cats": [ 22 ], + "headers": { "Server": "Catwalk\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Canon" + }, "CentOS": { "website": "centos.org", "cats": [ 28 ], "headers": { "Server": "CentOS", "X-Powered-By": "CentOS" } }, "CFML": { - "website": "adobe.com\/products\/coldfusion-family.html", + "website": "adobe.com/products/coldfusion-family.html", "cats": [ 27 ] }, "CacheFly": { @@ -323,7 +387,7 @@ "Chamilo": { "website": "www.chamilo.org", "cats": [ 21 ], - "html": "\">Chamilo ([\\d.]+)<\/a>\\;version:\\1", + "html": "\">Chamilo ([\\d.]+)</a>\\;version:\\1", "meta": { "generator": "Chamilo ([\\d.]+)\\;version:\\1" }, "headers": { "X-Powered-By": "Chamilo ([\\d.]+)\\;version:\\1" }, "implies": "PHP" @@ -332,12 +396,18 @@ "website": "chartbeat.com", "cats": [ 10 ], "html": "function loadChartbeat\\(\\) {", - "script": "chartbeat.js" + "script": "chartbeat\\.js" }, "Cherokee": { "website": "www.cherokee-project.com", "cats": [ 22 ], - "headers": { "Server": "Cherokee\/([\\d.]+)\\;version:\\1" } + "headers": { "Server": "Cherokee/([\\d.]+)\\;version:\\1" } + }, + "CherryPy": { + "website": "www.cherrypy.org", + "cats": [ 18, 22 ], + "headers": { "Server": "CherryPy\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" }, "CKEditor": { "website": "ckeditor.com", @@ -345,8 +415,13 @@ "env": "^CKEDITOR$", "implies": "PHP" }, + "Cloudera": { + "website": "www.cloudera.com", + "cats": [ 34 ], + "headers": { "Server": "cloudera" } + }, "ClickHeat": { - "website": "www.labsmedia.com\/clickheat\/index.html", + "website": "www.labsmedia.com/clickheat/index.html", "cats": [ 10 ], "script": "clickheat.*\\.js", "env": "^clickHeat", @@ -355,7 +430,7 @@ "ClickTale": { "website": "www.clicktale.com", "cats": [ 10 ], - "html": "if\\(typeof ClickTale(Tag)*==\"function\"\\)", + "html": "if\\(typeof ClickTale(Tag)*==\\\"function\\\"\\)", "env": "^ClickTale" }, "Clicky": { @@ -377,7 +452,7 @@ "implies": "PHP" }, "CMSimple": { - "website": "www.cmsimple.org\/en", + "website": "www.cmsimple.org/en", "cats": [ 1 ], "meta": { "generator": "CMSimple( [\\d.]+)?\\;version:\\1" }, "implies": "PHP" @@ -385,36 +460,46 @@ "CO2Stats": { "website": "co2stats.com", "cats": [ 10 ], - "html": "src=[^>]+co2stats\\.com\/propres\\.php" + "html": "src=[^>]+co2stats\\.com/propres\\.php" }, "CodeIgniter": { "website": "codeigniter.com", "cats": [ 18 ], - "headers": { "Set-Cookie": "(exp_last_activity|exp_tracker|ci_session)" }, + "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker|ci_session)" }, "implies": "PHP" }, + "CodeMirror": { + "website": "codemirror.net", + "cats": [ 19 ], + "env": "^CodeMirror$" + }, "Commerce Server": { "website": "commerceserver.net", "cats": [ 6 ], "headers": { "COMMERCE-SERVER-SOFTWARE": ".+" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "implies": "Microsoft ASP.NET" + }, + "CompaqHTTPServer": { + "website": "www.hp.com", + "cats": [ 22 ], + "headers": { "Server": "CompaqHTTPServer\\/?([\\d\\.]+)?\\;version:\\1" } }, "comScore": { "website": "comscore.com", "cats": [ 10 ], - "html": "<i{1}frame[^>]* (id=\"comscore\"|scr=[^>]+comscore)", + "html": "<iframe[^>]* (?:id=\"comscore\"|scr=[^>]+comscore)", "env": "^_?COMSCORE$" }, "Concrete5": { "website": "concrete5.org", "cats": [ 1 ], - "script": "concrete\/js\/", + "script": "concrete/js/", "meta": { "generator": "concrete5 - ([\\d.ab]+)\\;version:\\1" }, "env": "^CCM_IMAGE_PATH$", "implies": "PHP" }, "Connect": { - "website": "www.senchalabs.org\/connect", + "website": "www.senchalabs.org/connect", "cats": [ 18 ], "headers": { "X-Powered-By": "^Connect$" }, "implies": "node.js" @@ -422,25 +507,31 @@ "Contao": { "website": "contao.org", "cats": [ 1 ], - "html": "(<!--.+powered by (TYPOlight|Contao)-->|<link[^>]+(typolight|contao)\\.css)", + "html": "(?:<!--[^>]+powered by (?:TYPOlight|Contao)-->|<link[^>]+(?:typolight|contao)\\.css)", "implies": "PHP" }, "Contenido": { - "website": "contenido.org\/en", + "website": "contenido.org/en", "cats": [ 1 ], "meta": { "generator": "Contenido ([\\d.]+)\\;version:\\1" }, "implies": "PHP" }, "Contens": { - "website": "www.contens.com\/en\/pub\/index.cfm", + "website": "www.contens.com/en/pub/index.cfm", "cats": [ 1 ], "meta": { "generator": "Contensis CMS Version ([\\d.]+)\\;version:\\1" }, "implies": [ "Java", "CFML" ] }, + "ContentBox": { + "website": "www.gocontentbox.org", + "cats": [ 1, 11 ], + "meta": { "generator": "ContentBox powered by ColdBox" }, + "implies": "Adobe ColdFusion" + }, "ConversionLab": { - "website": "www.trackset.it\/conversionlab", + "website": "www.trackset.it/conversionlab", "cats": [ 10 ], - "script": "conversionlab\\.trackset\\.com\/track\/tsend\\.js" + "script": "conversionlab\\.trackset\\.com/track/tsend\\.js" }, "Coppermine": { "website": "coppermine-gallery.net", @@ -462,12 +553,12 @@ "CouchDB": { "website": "couchdb.apache.org", "cats": [ 22 ], - "headers": { "Server": "CouchDB\/([\\d.]+)\\;version:\\1" } + "headers": { "Server": "CouchDB/([\\d.]+)\\;version:\\1" } }, "cPanel": { "website": "www.cpanel.net", "cats": [ 9 ], - "headers": { "Server": "cpsrvd\/([\\d.]+)\\;version:\\1" }, + "headers": { "Server": "cpsrvd/([\\d.]+)\\;version:\\1" }, "html": "<!-- cPanel" }, "CPG Dragonfly": { @@ -481,40 +572,25 @@ "website": "crazyegg.com", "cats": [ 10 ], "env": "^CE2$", - "script": "cetrk\\.com\/pages\/scripts\/\\d+\/\\d+\\.js" + "script": "cetrk\\.com/pages/scripts/\\d+/\\d+\\.js" }, "Cross Pixel": { "website": "datadesk.crsspxl.com", "cats": [ 10 ], "env": "^crsspxl$", - "script": "tag\\.crsspxl\\.com\/s1\\.js" + "script": "tag\\.crsspxl\\.com/s1\\.js" }, "CS Cart": { "website": "www.cs-cart.com", "cats": [ 6 ], "env": "^fn_compare_strings$", - "html": " Powered by (<a href=[^>]+cs-cart\\.com|CS-Cart)", + "html": " Powered by (?:<a href=[^>]+cs-cart\\.com|CS-Cart)", "implies": "PHP" }, - "Adobe ColdFusion": { - "website": "adobe.com\/products\/coldfusion-family.html", - "cats": [ 18 ], - "url": "\\.cfm$", - "html": "<!-- START headerTags\\.cfm", - "script": "\/cfajax\/", - "env": "^_cfEmails$", - "implies": "CFML" - }, - "ContentBox": { - "website": "www.gocontentbox.org", - "cats": [ 1, 11 ], - "meta": { "generator": "ContentBox powered by ColdBox" }, - "implies": "Adobe ColdFusion" - }, "CubeCart": { "website": "www.cubecart.com", "cats": [ 6 ], - "html": "(Powered by <a href=[^>]+cubecart\\.com|<p[^>]+>Powered by CubeCart)", + "html": "(?:Powered by <a href=[^>]+cubecart\\.com|<p[^>]+>Powered by CubeCart)", "meta": { "generator": "cubecart" }, "implies": "PHP" }, @@ -525,9 +601,9 @@ "env": "^Cufon$" }, "d3": { - "website": "mbostock.github.com\/d3", + "website": "mbostock.github.com/d3", "cats": [ 25 ], - "script": "d3(\\.v2)(\\.min)?\\.js" + "script": "d3(?:\\.v2)?(?:\\.min)?\\.js" }, "Dancer": { "website": "perldancer.org", @@ -542,10 +618,10 @@ "meta": { "generator": "Danneo CMS ([\\d.]+)\\;version:\\1" }, "implies": [ "Apache", "PHP" ] }, - "dashCommerce": { - "website": "dashcommerce.org", - "cats": [ 6 ], - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "Darwin": { + "website": "opensource.apple.com", + "cats": [ 28 ], + "headers": { "Server": "Darwin", "X-Powered-By": "Darwin" } }, "DataLife Engine": { "website": "dle-news.ru", @@ -557,13 +633,18 @@ "David Webbox": { "website": "www.tobit.com", "cats": [ 22 ], - "headers": { "Server": "David-WebBox\/([\\d.a]+ \\(\\d+\\))\\;version:\\1" } + "headers": { "Server": "David-WebBox/([\\d.a]+ \\(\\d+\\))\\;version:\\1" } }, "Debian": { "website": "debian.org", "cats": [ 28 ], - "headers": { "Server": "Debian", "X-Powered-By": "(Debian|dotdeb|(sarge|etch|lenny|queeze|wheezy|jessie))\\;version:\\2" - } + "headers": { "Server": "Debian", "X-Powered-By": "(?:Debian|dotdeb|(sarge|etch|lenny|squeeze|wheezy|jessie))\\;version:\\1" } + }, + "debut": { + "website": "www.brother.com", + "cats": [ 22 ], + "headers": { "Server": "debut\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Brother" }, "DedeCMS": { "website": "dedecms.com", @@ -572,11 +653,15 @@ "script": "dedeajax", "implies": "PHP" }, + "Dell": { + "website": "dell.com", + "cats": [ 40 ] + }, "Demandware": { "website": "demandware.com", "cats": [ 6 ], "headers": { "Server": "Demandware eCommerce Server" }, - "html": "<[^>]+demandware.edgesuite", + "html": "<[^>]+demandware\\.edgesuite", "env": "^dwAnalytics$" }, "DHTMLX": { @@ -587,7 +672,7 @@ "DirectAdmin": { "website": "www.directadmin.com", "cats": [ 9 ], - "html": "<a[^>]+>DirectAdmin<\/a> Web Control Panel", + "html": "<a[^>]+>DirectAdmin</a> Web Control Panel", "headers": { "Server": "DirectAdmin Daemon v([\\d.]+)\\;version:\\1" }, "implies": [ "PHP", "Apache" ] }, @@ -601,28 +686,28 @@ "Django": { "website": "djangoproject.com", "cats": [ 18 ], - "html": "(powered by <a[^>]+>Django ?([\\d.]+)?|<div style=\"display:none\"><input name=\"csrfmiddlewaretoken\" value=\"[a-z0-9]{32}\" type=\"hidden\"><\/div>)\\;version:\\2", + "html": "(?:powered by <a[^>]+>Django ?([\\d.]+)?|<div style=\"display:none\"><input name=\"csrfmiddlewaretoken\" value=\"[a-z0-9]{32}\" type=\"hidden\"></div>)\\;version:\\1", "env": "^__admin_media_prefix__", "implies": "Python" }, "Django CMS": { "website": "django-cms.org", "cats": [ 1 ], - "script": "media\/cms\/js\/csrf\\.js", + "script": "media/cms/js/csrf\\.js", "headers": { "Set-Cookie": "django[^;]=" }, "implies": "Django" }, "Dojo": { "website": "dojotoolkit.org", "cats": [ 12 ], - "script": "([\\d.]+)\/dojo\/dojo(\\.xd)?\\.js\\;version:\\1", + "script": "([\\d.]+)/dojo/dojo(?:\\.xd)?\\.js\\;version:\\1", "env": "^dojo$" }, "Dokeos": { "website": "dokeos.com", "cats": [ 21 ], "meta": { "generator": "Dokeos" }, - "html": "Portal <a[^>]+>Dokeos|@import \"[^\"]+dokeos_blue", + "html": "(?:Portal <a[^>]+>Dokeos|@import \"[^\"]+dokeos_blue)", "headers": { "X-Powered-By": "Dokeos" }, "implies": [ "PHP", "Xajax", "jQuery", "CKEditor" ] }, @@ -637,37 +722,41 @@ "website": "dotnetnuke.com", "cats": [ 1 ], "meta": { "generator": "DotNetNuke" }, - "headers": { "X-Compressed-By": "DotNetNuke", "Set-Cookie": "DotNetNukeAnonymous=.+" - }, + "headers": { "X-Compressed-By": "DotNetNuke", "Set-Cookie": "DotNetNukeAnonymous=" }, "html": "<!-- by DotNetNuke Corporation", "env": "^DotNetNuke$", "implies": "Microsoft ASP.NET" }, "Doxygen": { - "website": "stack.nl\/~dimitri\/doxygen", + "website": "stack.nl/~dimitri/doxygen", "cats": [ 4 ], - "html": "(<!-- Generated by Doxygen ([\\d.]+)|<link[^>]+doxygen.css)\\;version:\\1" + "html": "(?:<!-- Generated by Doxygen ([\\d.]+)|<link[^>]+doxygen.css)\\;version:\\1" }, "DreamWeaver": { - "website": "www.adobe.com\/products\/dreamweaver", + "website": "www.adobe.com/products/dreamweaver", "cats": [ 20 ], - "html": "(<!--[^>]*(InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) {)\\;version:\\3" + "html": "(?:<!--[^>]*(?:InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) {)\\;version:\\1" }, "Drupal": { "website": "drupal.org", "cats": [ 1 ], "script": "drupal\\.js", - "html": "<(link|style)[^>]+sites\/(default|all)\/(themes|modules)\/", - "headers": { "X-Drupal-Cache": ".*", "X-Generator": "Drupal(\\s([\\d.]+))?\\;version:\\2", "Expires": "19 Nov 1978" }, + "html": "<(?:link|style)[^>]+sites/(?:default|all)/(?:themes|modules)/", + "headers": { "X-Drupal-Cache": ".*", "X-Generator": "Drupal(?:\\s([\\d.]+))?\\;version:\\1", "Expires": "19 Nov 1978" }, "env": "^Drupal$", "implies": "PHP" }, "Drupal Commerce": { "website": "drupalcommerce.org", "cats": [ 6 ], - "html": "id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field", + "html": "(?:id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field)", "implies": "Drupal" }, + "dwhttpd": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "dwhttpd\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, "Dynamicweb": { "website": "www.dynamicweb.dk", "cats": [ 1, 6, 10 ], @@ -679,29 +768,47 @@ "website": "e107.org", "cats": [ 1 ], "script": "e107\\.js", - "headers": { "Set-Cookie": "e107_td[^;]+=" }, + "headers": { "Set-Cookie": "e107_tz[^;]+=", "X-Powered-By": "e107" }, "implies": "PHP" }, "EdgeCast": { "website": "www.edgecast.com", "cats": [ 31 ], - "headers": { "Server": "^ECS" } + "headers": { "Server": "^EC(?:S|Acc)" }, + "url": "https?://(?:[^/]+\\.)?edgecastcdn\\.net/" + }, + "eHTTP": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "\\beHTTP( v?([\\d\\.]+))?\\;version:\\2" }, + "implies": [ "HP ProCurve"] + }, + "ELOG": { + "website": "midas.psi.ch/elog", + "cats": [ 19 ], + "html": "<title>ELOG Logbook Selection" + }, + "ELOG HTTP": { + "website": "midas.psi.ch/elog", + "cats": [ 22 ], + "headers": { "Server": "ELOG HTTP( \\d[\\-\\d\\.]+)?\\;version:\\1" }, + "implies": "ELOG" }, "Eloqua": { "website": "eloqua.com", "cats": [ 32 ], "script": "elqCfg\\.js", - "env": "^elq(SiteID|Load|CurESite)$" + "env": "^elq(?:SiteID|Load|CurESite)$" }, "Embedthis-http": { - "website": "github.com\/embedthis\/http", + "website": "github.com/embedthis/http", "cats": [ 22 ], - "headers": { "Server": "Embedthis-http(\/([\\d.]+))?\\;version:\\2" } + "headers": { "Server": "Embedthis-http(?:/([\\d.]+))?\\;version:\\1" } }, "E-Merchant": { "website": "e-merchant.com", "cats": [ 6 ], - "script": "cdn.e-merchant.com" + "script": "cdn\\.e-merchant\\.com" }, "Enyo": { "website": "enyojs.com", @@ -713,8 +820,8 @@ "website": "episerver.com", "cats": [ 1 ], "meta": { "generator": "EPiServer" }, - "headers": { "Set-Cookie": "EPi(Trace|Server)[^;]*=" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "headers": { "Set-Cookie": "EPi(?:Trace|Server)[^;]*=" }, + "implies": "Microsoft ASP.NET" }, "EPrints": { "website": "www.eprints.org", @@ -723,6 +830,11 @@ "env": "^EPJS_menu_template$", "implies": "Perl" }, + "Erlang": { + "website": "www.erlang.org", + "cats": [ 27 ], + "headers": { "Server": "Erlang( OTP/([\\-\\d\\.ABR]+))?\\;version:\\1" } + }, "eSyndiCat": { "website": "esyndicat.com", "cats": [ 1 ], @@ -731,8 +843,14 @@ "env": "^esyndicat$", "implies": [ "PHP" ] }, + "EWS-NIC4": { + "website": "dell.com", + "cats": [ 22 ], + "headers": { "Server": "EWS-NIC4(\\/([\\d\\.a-z]+))?\\;version:\\2" }, + "implies": "Dell" + }, "Exhibit": { - "website": "simile-widgets.org\/exhibit\/", + "website": "simile-widgets.org/exhibit/", "cats": [ 25 ], "script": "exhibit.*\\.js", "env": "^Exhibit$" @@ -746,7 +864,7 @@ "ExpressionEngine": { "website": "expressionengine.com", "cats": [ 1 ], - "headers": { "Set-Cookie": "(exp_last_activity|exp_tracker)" }, + "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker)" }, "implies": "PHP" }, "ExtJS": { @@ -767,17 +885,17 @@ "cats": [ 29 ], "html": "", + "html": "(?:]* href=\"templates/gambio/|]content\\.php\\?coID=\\d|)", "implies": "PHP" }, "Gauges": { "website": "get.gaug.es", "cats": [ 10 ], "headers": { "Set-Cookie": "_gauges_[^;]+=" }, - "html": "t\\.src = '\/\/secure\\.gaug\\.es\/track\\.js", "env": "^_gauges$" }, "Gentoo": { "website": "www.gentoo.org", "cats": [ 28 ], - "headers": { "X-Powered-By": "-?gentoo" } + "headers": { "X-Powered-By": "gentoo" } }, "Get Satisfaction": { "website": "getsatisfaction.com", @@ -858,57 +979,57 @@ "implies": "PHP" }, "GoAhead": { - "website": "embedthis.com\/products\/goahead\/index.html", + "website": "embedthis.com/products/goahead/index.html", "cats": [ 22 ], "headers": { "Server": "GoAhead" } }, "Google Analytics": { - "website": "google.com\/analytics", + "website": "google.com/analytics", "cats": [ 10 ], "html": "_gaq\\.push\\(\\['_setAccount", - "script": "(\\.google-analytics\\.com\/ga\\.js|google-analytics\\.com\/urchin\\.js)", + "script": "(?:\\.google-analytics\\.com/ga\\.js|google-analytics\\.com/urchin\\.js)", "headers": { "Set-Cookie": "__utma" }, "env": "^gaGlobal$" }, "Google App Engine": { - "website": "code.google.com\/appengine", + "website": "code.google.com/appengine", "cats": [ 22 ], "headers": { "Server": "Google Frontend" } }, "Google Code Prettify": { - "website": "code.google.com\/p\/google-code-prettify", + "website": "code.google.com/p/google-code-prettify", "cats": [ 19 ], "env": "^prettyPrint$" }, "Google Font API": { - "website": "code.google.com\/apis\/webfonts", + "website": "code.google.com/apis/webfonts", "cats": [ 17 ], - "script": "googleapis.com\/.+webfont", + "script": "googleapis\\.com/.+webfont", "html": "]* href=[^>]+fonts\\.googleapis\\.com", "env": "^WebFonts$" }, "Google Maps": { "website": "maps.google.com", "cats": [ 35 ], - "script": "(maps\\.google\\.com\/maps\\?file=api(&v=([\\d.]+))?|maps\\.google\\.com\/maps\/api\/staticmap)\\;version:API v\\3" + "script": "(?:maps\\.google\\.com/maps\\?file=api(?:&v=([\\d.]+))?|maps\\.google\\.com/maps/api/staticmap)\\;version:API v\\1" }, "Google PageSpeed": { - "website": "developers.google.com\/speed\/pagespeed\/mod", + "website": "developers.google.com/speed/pagespeed/mod", "cats": [ 23, 33 ], "headers": { "X-Mod-Pagespeed": "([\\d.]+)\\;version:\\1" } }, "Google Sites": { "website": "sites.google.com", "cats": [ 1 ], - "url": "sites.google.com" + "url": "sites\\.google\\.com" }, "Google Tag Manager": { - "website": "www.google.com\/tagmanager", + "website": "www.google.com/tagmanager", "cats": [ 19 ], - "html": "googletagmanager\\.com\/ns\\.html[^>]+><\/iframe>" + "html": "googletagmanager\\.com/ns\\.html[^>]+>" }, "Google Web Toolkit": { - "website": "developers.google.com\/web-toolkit", + "website": "developers.google.com/web-toolkit", "cats": [ 18 ], "env": "^__gwt_", "implies": "Java" @@ -916,15 +1037,20 @@ "GoStats": { "website": "gostats.com", "cats": [ 10 ], - "env": "^_go(stats|_track)" + "env": "^_go(?:stats|_track)" }, "Graffiti CMS": { "website": "graffiticms.codeplex.com", "cats": [ 1 ], "meta": { "generator": "Graffiti CMS ([^\"]+)\\;version:\\1" }, - "script": "\/graffiti.js", + "script": "/graffiti\\.js", "headers": { "Set-Cookie": "graffitibot[^;]=" } }, + "Grandstream": { + "website": "www.grandstream.com", + "cats": [ 22, 39 ], + "headers": { "Server": "Grandstream\\/?([\\d\\.]+)?\\;version:\\1" } + }, "Gravatar": { "website": "gravatar.com", "cats": [ 19 ], @@ -933,7 +1059,6 @@ "Gravity Insights": { "website": "insights.gravity.com", "cats": [ 10 ], - "html": "gravityInsightsParams\\.site_guid = '", "env": "^GravityInsights$" }, "G-WAN": { @@ -942,9 +1067,9 @@ "headers": { "Server": "G-WAN" } }, "GX WebManager": { - "website": "www.gxsoftware.com\/en\/products\/web-content-management.htm", + "website": "www.gxsoftware.com/en/products/web-content-management.htm", "cats": [ 1 ], - "meta": { "generator": "GX WebManager( ([\\d.]+))?\\;version:\\2" }, + "meta": { "generator": "GX WebManager(?: ([\\d.]+))?\\;version:\\1" }, "html": "", + "meta": { "eomportal-instanceid": "[0-9]+", "eomportal-id": "[0-9]+", "eomportal-loid": "[0-9.]+", "eomportal-uuid": "[a-f0-9]+", "eomportal-lastUpdate": ".*" } }, "Microsoft ASP.NET": { "website": "www.asp.net", "cats": [ 18 ], "url": "\\.aspx$", "html": "]+name=\"__VIEWSTATE", - "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" - }, - "implies": [ "IIS", "Windows Server" ] + "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" }, + "implies": "IIS\\;confidence:50" }, "Microsoft SharePoint": { "website": "sharepoint.microsoft.com", @@ -1383,18 +1566,29 @@ "cats": [ 2 ], "html": "]+minibb.+\\s+", + "html": "", "env": "^_?owa_" }, "OneStat": { "website": "www.onestat.com", "cats": [ 10 ], - "html": "var p==.+stat\\.onestat\\.com\/stat\\.aspx\\?tagver" + "html": "var p==.+stat\\.onestat\\.com/stat\\.aspx\\?tagver" }, "OpenCart": { "website": "www.opencart.com", "cats": [ 6 ], - "html": "index\\.php\\?route=[a-z]+\/|Powered By ]+OpenCart", + "html": "(?:index\\.php\\?route=[a-z]+/|Powered By ]+OpenCart)", "implies": "PHP" }, "openEngine": { - "website": "openengine.de\/html\/pages\/de\/", + "website": "openengine.de/html/pages/de/", "cats": [ 1 ], - "html": "]+openEngine" }, "OpenGrok": { - "website": "hub.opensolaris.org\/bin\/view\/Project+opengrok\/WebHome", + "meta": "openEngine" + }, + "OpenGrok": { + "website": "hub.opensolaris.org/bin/view/Project+opengrok/WebHome", "cats": [ 19 ], "headers": { "Set-Cookie": "OpenGrok" }, - "meta": { "generator": "OpenGrok( v?([\\d.]+))?\\;version:\\2" }, + "meta": { "generator": "OpenGrok(?: v?([\\d.]+))?\\;version:\\1" }, "implies": "Java" }, "OpenGSE": { - "website": "code.google.com\/p\/opengse", + "website": "code.google.com/p/opengse", "cats": [ 22 ], "headers": { "Server": "GSE" }, "implies": "Java" @@ -1624,14 +1838,14 @@ "env": "^OpenLayers$" }, "OpenNemas": { - "website": "openhost.es\/en\/opennemas", + "website": "openhost.es/en/opennemas", "cats": [ 1 ], "headers": { "X-Powered-By": "OpenNemas" } }, "OpenSSL": { "website": "openssl.org", "cats": [ 33 ], - "headers": { "Server": "OpenSSL(\/([\\d.]+[a-z]?))?\\;version:\\2" } + "headers": { "Server": "OpenSSL(?:/([\\d.]+[a-z]?))?\\;version:\\1" } }, "OpenText Web Solutions": { "website": "websolutions.opentext.com", @@ -1645,19 +1859,19 @@ "env": "^optimizely$" }, "Oracle Application Server": { - "website": "www.oracle.com\/technetwork\/middleware\/ias\/overview\/index.html", + "website": "www.oracle.com/technetwork/middleware/ias/overview/index.html", "cats": [ 22 ], - "headers": { "Server": "Oracle(-| )Application(-| )Server((-| )(\\d+[a-z]?))?\\;version:\\5" } + "headers": { "Server": "Oracle\\bApplication\\bServer(?:\\b(\\d+[a-z]?))?\\;version:\\1" } }, "Oracle Recommendations On Demand": { - "website": "www.oracle.com\/us\/products\/applications\/commerce\/recommendations-on-demand\/index.html?", + "website": "www.oracle.com/us/products/applications/commerce/recommendations-on-demand/index.html", "cats": [ 10 ], "script": "atgsvcs.+atgsvcs\\.js" }, "osCommerce": { "website": "www.oscommerce.com", "cats": [ 6 ], - "html": "(]*(\\?|&)osCsid|Powered by (<[^]+>)?osCommerce<\/a>|<[^]+class=\"[^>]*infoBoxHeading)", + "html": "(?:]*(?:\\?|&)osCsid|Powered by (?:<[^]+>)?osCommerce|<[^]+class=\"[^>]*infoBoxHeading)", "headers": { "Set-Cookie": "osCsid=" } }, "osCSS": { @@ -1668,31 +1882,30 @@ "Outbrain": { "website": "outbrain.com", "cats": [ 5 ], - "html": "var OB_langJS = '.+widgets\\.outbrain\\.com\/lang_", - "script": "widgets\\.outbrain\\.com\/outbrain\\.js", - "env": "^OutbrainPermaLink$" + "script": "widgets\\.outbrain\\.com/outbrain\\.js", + "env": "^(?:OutbrainPermaLink|OB_releaseVer)$" }, "OXID eShop": { "website": "oxid-esales.com", "cats": [ 6 ], - "html": "", "implies": "Java" }, @@ -2649,6 +2924,11 @@ "website": "foundation.zurb.com", "cats": [ 18 ], "html": "]+foundation[^>\"]+css" + }, + "LiveStreet CMS": { + "website": "livestreetcms.com", + "cats": [ 1 ], + "headers": { "X-Powered-By": "LiveStreet CMS" } } } } diff --git a/drivers/chrome/apps.json b/drivers/chrome/apps.json index 468e8d4e9..3002cb2b1 100644 --- a/drivers/chrome/apps.json +++ b/drivers/chrome/apps.json @@ -35,21 +35,25 @@ "33": "web-server-extensions", "34": "databases", "35": "maps", - "36": "advertising-networks" + "36": "advertising-networks", + "37": "network-devices", + "38": "media-servers", + "39": "webcams", + "40": "printers" }, "apps": { "1C-Bitrix": { "website": "www.1c-bitrix.ru", "cats": [ 1 ], "headers": { "X-Powered-CMS": "Bitrix Site Manager", "Set-Cookie": "BITRIX_" }, - "html": "]+components\/bitrix|(src|href)=\"\/bitrix\/(js|templates)", + "html": "(?:]+components/bitrix|(?:src|href)=\"/bitrix/(?:js|templates))", "script": "1c-bitrix", "implies": "PHP" }, "1und1": { "website": "1und1.de", "cats": [ 6 ], - "url": "\/shop\/catalog\/browse\\?sessid=", + "url": "/shop/catalog/browse\\?sessid=", "implies": "PHP" }, "2z Project": { @@ -61,7 +65,18 @@ "website": "www.3dcart.com", "cats": [ 1, 6 ], "headers": { "X-Powered-By": "3DCART" }, - "script": "(twlh(track)?\\.asp|3d_upsell\\.js)" + "script": "(?:twlh(?:track)?\\.asp|3d_upsell\\.js)" + }, + "3DM": { + "website": "www.3ware.com", + "cats": [ 19 ], + "html": "3ware 3DM([\\d\\.]+)?\\;version:\\1", + "implies": "3ware" + }, + "3ware": { + "website": "www.3ware.com", + "cats": [ 22 ], + "headers": { "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1" } }, "Accessible Portal": { "website": "www.accessibleportal.com", @@ -72,20 +87,29 @@ "AddThis": { "website": "www.addthis.com", "cats": [ 5 ], - "script": "addthis\\.com\/js\/(\\d+)?\\;version:\\1", + "script": "addthis\\.com/js/(\\d+)?\\;version:\\1", "env": "^addthis" }, + "Adobe ColdFusion": { + "website": "adobe.com/products/coldfusion-family.html", + "cats": [ 18 ], + "url": "\\.cfm$", + "html": "<!-- START headerTags\\.cfm", + "script": "/cfajax/", + "env": "^_cfEmails$", + "implies": "CFML" + }, "Adobe CQ5": { - "website": "adobe.com\/products\/cq.html", + "website": "adobe.com/products/cq.html", "cats": [ 1 ], - "url": "\/etc\/designs\/", + "url": "/etc/designs/", "html": "<div class=\"[^\"]*parbase", "implies": "Java" }, "Adobe GoLive": { - "website": "www.adobe.com\/products\/golive", + "website": "www.adobe.com/products/golive", "cats": [ 20 ], - "meta": { "generator": "Adobe GoLive(\\s([\\d.]+))?\\;version:\\2" } + "meta": { "generator": "Adobe GoLive(?:\\s([\\d.]+))?\\;version:\\1" } }, "Advanced Web Stats": { "website": "www.advancedwebstats.com", @@ -99,9 +123,9 @@ "env": "^AUI$" }, "Amaya": { - "website": "www.w3.org\/Amaya", + "website": "www.w3.org/Amaya", "cats": [ 20 ], - "meta": { "generator": "Amaya( V?([\\d.]+[a-z]))?\\;version:\\2" } + "meta": { "generator": "Amaya(?: V?([\\d.]+[a-z]))?\\;version:\\1" } }, "amCharts": { "website": "amcharts.com", @@ -112,7 +136,7 @@ "Ametys": { "website": "ametys.org", "cats": [ 1 ], - "meta": { "generator": "(Ametys|Anyware Technologies)" }, + "meta": { "generator": "(?:Ametys|Anyware Technologies)" }, "script": "STools\\.js", "implies": "Java" }, @@ -120,7 +144,7 @@ "website": "amirocms.com", "cats": [ 1 ], "meta": { "generator": "Amiro" }, - "html": "system_(js\\.php\\?script=|css\\.php\\?styles)[^\"]+cv=([\\d.]+)\\;version:\\2", + "html": "system_(?:js\\.php\\?script=|css\\.php\\?styles)[^\"]+cv=([\\d.]+)\\;version:\\1", "implies": "PHP" }, "AMPcms": { @@ -138,12 +162,22 @@ "AOLserver": { "website": "aolserver.com", "cats": [ 22 ], - "headers": { "Server": "AOLserver\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "AOLserver/?([\\d.]+)?\\;version:\\1" } }, "Apache": { "website": "apache.org", "cats": [ 22 ], - "headers": { "Server": "(Apache($|\/([\\d.]+)|[^\/-])|(^|\\b)HTTPD)\\;version:\\3" } + "headers": { "Server": "(?:Apache(?:$|/([\\d.]+)|[^/-])|(?:^|\\b)HTTPD)\\;version:\\1" } + }, + "Apache Hadoop": { + "website": "hadoop.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hadoop.css\"" + }, + "Apache HBase": { + "website": "hbase.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hbase.css\"" }, "Apache JSPWiki": { "website": "jspwiki.org", @@ -155,12 +189,12 @@ "Apache Tomcat": { "website": "tomcat.apache.org", "cats": [ 22 ], - "headers": { "Server": "Apache-Coyote\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "Apache-Coyote/?([\\d.]+)?\\;version:\\1" } }, "Apache Traffic Server": { - "website": "trafficserver.apache.org\/", + "website": "trafficserver.apache.org/", "cats": [ 22 ], - "headers": { "Server": "ATS\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "ATS/?([\\d.]+)?\\;version:\\1" } }, "Arc Forum": { "website": "arclanguage.org", @@ -168,42 +202,47 @@ "html": "ping\\.src = node\\.href;" }, "AsciiDoc": { - "website": "www.methods.co.nz\/asciidoc", + "website": "www.methods.co.nz/asciidoc", "cats": [ 1, 20, 27 ], "meta": { "generator": "^AsciiDoc ([\\d.]+)\\;version:\\1" }, "env": "^asciidoc$" }, + "ATEN": { + "website": "www.aten.com", + "cats": [ 22 ], + "headers": { "Server": "ATEN HTTP Server(\\(V?([\\d\\.]+)\\))?\\;version:\\2" } + }, "ATG Web Commerce": { - "website": "oracle.com\/us\/products\/applications\/web-commerce\/atg", + "website": "oracle.com/us/products/applications/web-commerce/atg", "cats": [ 6 ], - "headers": { "X-ATG-Version": "(ATGPlatform\/([\\d.]+))?\\;version:\\2" }, + "headers": { "X-ATG-Version": "(?:ATGPlatform/([\\d.]+))?\\;version:\\1" }, "html": "<[^>]+_DARGS" }, "Atlassian Confluence": { - "website": "www.atlassian.com\/software\/confluence\/overview\/team-collaboration-software", + "website": "www.atlassian.com/software/confluence/overview/team-collaboration-software", "cats": [ 8 ], - "html": "Powered by <a href=[^>]+atlassian\\.com\/software\/confluence([^>]+>Atlassian Confluence<\/a> ([\\d.]+))?\\;version:\\2", + "html": "Powered by <a href=[^>]+atlassian\\.com/software/confluence(?:[^>]+>Atlassian Confluence</a> ([\\d.]+))?\\;version:\\1", "headers": { "X-Confluence-Request-Time": ".*" }, "meta": { "confluence-request-time": ".*" }, "implies": "Java" }, "Atlassian Jira": { - "website": "www.atlassian.com\/software\/jira\/overview\/", + "website": "www.atlassian.com/software/jira/overview/", "cats": [ 13 ], "env": "^jira$", - "script": "\/jira\/s\/", - "url": "\/secure\/Dashboard.jspa", - "html": "Powered by\\s+<a href=[^>]+atlassian\\.com\/(software\/jira|jira-bug-tracking\/)[^>]+>Atlassian\\s+JIRA([^v]*v(ersion: )?(\\d+\\.\\d+(\\.\\d+)?))?\\;version:\\4", + "script": "/jira/s/", + "url": "/secure/Dashboard\\.jspa", + "html": "Powered by\\s+<a href=[^>]+atlassian\\.com/(?:software/jira|jira-bug-tracking/)[^>]+>Atlassian\\s+JIRA(?:[^v]*v(?:ersion: )?(\\d+\\.\\d+(\\.\\d+)?))?\\;version:\\1", "implies": "Java" }, "AWStats": { "website": "awstats.sourceforge.net", "cats": [ 10 ], - "meta": { "generator": "AWStats ([\\d.]+( \\(build [\\d.]+\\))?)\\;version:\\1" }, + "meta": { "generator": "AWStats ([\\d.]+(?: \\(?:build [\\d.]+\\))?)\\;version:\\1" }, "implies": "Perl" }, "Backbone.js": { - "website": "documentcloud.github.com\/backbone", + "website": "documentcloud.github.com/backbone", "cats": [ 12 ], "script": "backbone.*\\.js", "env": "^Backbone$", @@ -212,26 +251,32 @@ "Banshee": { "website": "www.banshee-php.org", "cats": [ 1, 18 ], - "html": "Built upon the <a href=\"[^>]+banshee-php\\.org\/\">[a-z]+<\/a>(v([\\d.]+))?\\;version:\\2", + "html": "Built upon the <a href=\"[^>]+banshee-php\\.org/\">[a-z]+</a>(?:v([\\d.]+))?\\;version:\\1", "implies": "PHP" }, + "BaseHTTP": { + "website": "docs.python.org/2/library/basehttpserver.html", + "cats": [ 22 ], + "headers": { "Server": "BaseHTTP\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" + }, "BIGACE": { "website": "bigace.de", "cats": [ 1 ], "meta": { "generator": "BIGACE ([\\d.]+)\\;version:\\1" }, - "html": "Powered by <a href=\"[^>]+BIGACE|<!--\\s+Site is running BIGACE", + "html": "(?:Powered by <a href=\"[^>]+BIGACE|<!--\\s+Site is running BIGACE)", "implies": "PHP" }, "Bigcommerce": { "website": "www.bigcommerce.com", "cats": [ 6 ], - "url": ".+\\.mybigcommerce\\.com", - "html": "<link href=[^>]+cdn\\d+\\.bigcommerce\\.com\/v", - "script": "cdn\\d+\\.bigcommerce\\.com\/v", + "url": "mybigcommerce\\.com", + "html": "<link href=[^>]+cdn\\d+\\.bigcommerce\\.com/v", + "script": "cdn\\d+\\.bigcommerce\\.com/v", "env": "^compareProducts$" }, "BigDump": { - "website": "www.ozerov.de\/bigdump.php", + "website": "www.ozerov.de/bigdump.php", "cats": [ 3 ], "html": "<!-- <h1>BigDump: Staggered MySQL Dump Importer ver\\. ([\\d.b]+)\\;version:\\1", "implies": "PHP" @@ -239,27 +284,36 @@ "Bigware": { "website": "bigware.de", "cats": [ 6 ], - "html": "Diese <a href=.+bigware\\.de|<a href=[^>]+\/main_bigware_\\d+\\.php", - "url": "(\\?|&)bigWAdminID=[a-z\\d]+(&|$)", - "headers": { "Set-Cookie": "bigwareCsid|bigWAdminID" }, + "html": "(?:Diese <a href=[^>]+bigware\\.de|<a href=[^>]+/main_bigware_\\d+\\.php)", + "url": "(?:\\?|&)bigWAdminID=", + "headers": { "Set-Cookie": "(?:bigwareCsid|bigWAdminID)" }, "implies": "PHP" }, "BittAds": { "website": "bittads.com", "cats": [ 36 ], - "script": "bittads\\.com\/js\/bitt\\.js$", + "script": "bittads\\.com/js/bitt\\.js$", "env": "^bitt$" }, "Blip.tv": { "website": "blip.tv", "cats": [ 14 ], - "html": "<(param|embed|iframe)[^>]+blip\\.tv\/play" + "html": "<(?:param|embed|iframe)[^>]+blip\\.tv/play" }, "Blogger": { "website": "www.blogger.com", "cats": [ 11 ], "meta": { "generator": "blogger" }, - "url": "^(www.)?.+\\.blogspot\\.com" + "url": "\\.blogspot\\.com" + }, + "Boa": { + "website": "www.boa.org", + "cats": [ 22 ], + "headers": { "Server": "Boa\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, + "Brother": { + "website": "www.brother.com", + "cats": [ 40 ] }, "BrowserCMS": { "website": "browsercms.org", @@ -285,6 +339,10 @@ "script": "CatalystScripts", "html": "<!-- BC_OBNW -->" }, + "Canon": { + "website": "www.canon.com", + "cats": [ 40 ] + }, "CakePHP": { "website": "cakephp.org", "cats": [ 18 ], @@ -296,17 +354,23 @@ "website": "cargocollective.com", "cats": [ 1 ], "meta": { "cargo_title": ".*" }, - "script": "\/cargo\\.", + "script": "/cargo\\.", "html": "<link [^>]+Cargo feed", "implies": "PHP" }, + "Catwalk": { + "website": "www.canon.com", + "cats": [ 22 ], + "headers": { "Server": "Catwalk\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Canon" + }, "CentOS": { "website": "centos.org", "cats": [ 28 ], "headers": { "Server": "CentOS", "X-Powered-By": "CentOS" } }, "CFML": { - "website": "adobe.com\/products\/coldfusion-family.html", + "website": "adobe.com/products/coldfusion-family.html", "cats": [ 27 ] }, "CacheFly": { @@ -323,7 +387,7 @@ "Chamilo": { "website": "www.chamilo.org", "cats": [ 21 ], - "html": "\">Chamilo ([\\d.]+)<\/a>\\;version:\\1", + "html": "\">Chamilo ([\\d.]+)</a>\\;version:\\1", "meta": { "generator": "Chamilo ([\\d.]+)\\;version:\\1" }, "headers": { "X-Powered-By": "Chamilo ([\\d.]+)\\;version:\\1" }, "implies": "PHP" @@ -332,12 +396,18 @@ "website": "chartbeat.com", "cats": [ 10 ], "html": "function loadChartbeat\\(\\) {", - "script": "chartbeat.js" + "script": "chartbeat\\.js" }, "Cherokee": { "website": "www.cherokee-project.com", "cats": [ 22 ], - "headers": { "Server": "Cherokee\/([\\d.]+)\\;version:\\1" } + "headers": { "Server": "Cherokee/([\\d.]+)\\;version:\\1" } + }, + "CherryPy": { + "website": "www.cherrypy.org", + "cats": [ 18, 22 ], + "headers": { "Server": "CherryPy\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" }, "CKEditor": { "website": "ckeditor.com", @@ -345,8 +415,13 @@ "env": "^CKEDITOR$", "implies": "PHP" }, + "Cloudera": { + "website": "www.cloudera.com", + "cats": [ 34 ], + "headers": { "Server": "cloudera" } + }, "ClickHeat": { - "website": "www.labsmedia.com\/clickheat\/index.html", + "website": "www.labsmedia.com/clickheat/index.html", "cats": [ 10 ], "script": "clickheat.*\\.js", "env": "^clickHeat", @@ -355,7 +430,7 @@ "ClickTale": { "website": "www.clicktale.com", "cats": [ 10 ], - "html": "if\\(typeof ClickTale(Tag)*==\"function\"\\)", + "html": "if\\(typeof ClickTale(Tag)*==\\\"function\\\"\\)", "env": "^ClickTale" }, "Clicky": { @@ -377,7 +452,7 @@ "implies": "PHP" }, "CMSimple": { - "website": "www.cmsimple.org\/en", + "website": "www.cmsimple.org/en", "cats": [ 1 ], "meta": { "generator": "CMSimple( [\\d.]+)?\\;version:\\1" }, "implies": "PHP" @@ -385,36 +460,46 @@ "CO2Stats": { "website": "co2stats.com", "cats": [ 10 ], - "html": "src=[^>]+co2stats\\.com\/propres\\.php" + "html": "src=[^>]+co2stats\\.com/propres\\.php" }, "CodeIgniter": { "website": "codeigniter.com", "cats": [ 18 ], - "headers": { "Set-Cookie": "(exp_last_activity|exp_tracker|ci_session)" }, + "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker|ci_session)" }, "implies": "PHP" }, + "CodeMirror": { + "website": "codemirror.net", + "cats": [ 19 ], + "env": "^CodeMirror$" + }, "Commerce Server": { "website": "commerceserver.net", "cats": [ 6 ], "headers": { "COMMERCE-SERVER-SOFTWARE": ".+" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "implies": "Microsoft ASP.NET" + }, + "CompaqHTTPServer": { + "website": "www.hp.com", + "cats": [ 22 ], + "headers": { "Server": "CompaqHTTPServer\\/?([\\d\\.]+)?\\;version:\\1" } }, "comScore": { "website": "comscore.com", "cats": [ 10 ], - "html": "<i{1}frame[^>]* (id=\"comscore\"|scr=[^>]+comscore)", + "html": "<iframe[^>]* (?:id=\"comscore\"|scr=[^>]+comscore)", "env": "^_?COMSCORE$" }, "Concrete5": { "website": "concrete5.org", "cats": [ 1 ], - "script": "concrete\/js\/", + "script": "concrete/js/", "meta": { "generator": "concrete5 - ([\\d.ab]+)\\;version:\\1" }, "env": "^CCM_IMAGE_PATH$", "implies": "PHP" }, "Connect": { - "website": "www.senchalabs.org\/connect", + "website": "www.senchalabs.org/connect", "cats": [ 18 ], "headers": { "X-Powered-By": "^Connect$" }, "implies": "node.js" @@ -422,25 +507,31 @@ "Contao": { "website": "contao.org", "cats": [ 1 ], - "html": "(<!--.+powered by (TYPOlight|Contao)-->|<link[^>]+(typolight|contao)\\.css)", + "html": "(?:<!--[^>]+powered by (?:TYPOlight|Contao)-->|<link[^>]+(?:typolight|contao)\\.css)", "implies": "PHP" }, "Contenido": { - "website": "contenido.org\/en", + "website": "contenido.org/en", "cats": [ 1 ], "meta": { "generator": "Contenido ([\\d.]+)\\;version:\\1" }, "implies": "PHP" }, "Contens": { - "website": "www.contens.com\/en\/pub\/index.cfm", + "website": "www.contens.com/en/pub/index.cfm", "cats": [ 1 ], "meta": { "generator": "Contensis CMS Version ([\\d.]+)\\;version:\\1" }, "implies": [ "Java", "CFML" ] }, + "ContentBox": { + "website": "www.gocontentbox.org", + "cats": [ 1, 11 ], + "meta": { "generator": "ContentBox powered by ColdBox" }, + "implies": "Adobe ColdFusion" + }, "ConversionLab": { - "website": "www.trackset.it\/conversionlab", + "website": "www.trackset.it/conversionlab", "cats": [ 10 ], - "script": "conversionlab\\.trackset\\.com\/track\/tsend\\.js" + "script": "conversionlab\\.trackset\\.com/track/tsend\\.js" }, "Coppermine": { "website": "coppermine-gallery.net", @@ -462,12 +553,12 @@ "CouchDB": { "website": "couchdb.apache.org", "cats": [ 22 ], - "headers": { "Server": "CouchDB\/([\\d.]+)\\;version:\\1" } + "headers": { "Server": "CouchDB/([\\d.]+)\\;version:\\1" } }, "cPanel": { "website": "www.cpanel.net", "cats": [ 9 ], - "headers": { "Server": "cpsrvd\/([\\d.]+)\\;version:\\1" }, + "headers": { "Server": "cpsrvd/([\\d.]+)\\;version:\\1" }, "html": "<!-- cPanel" }, "CPG Dragonfly": { @@ -481,40 +572,25 @@ "website": "crazyegg.com", "cats": [ 10 ], "env": "^CE2$", - "script": "cetrk\\.com\/pages\/scripts\/\\d+\/\\d+\\.js" + "script": "cetrk\\.com/pages/scripts/\\d+/\\d+\\.js" }, "Cross Pixel": { "website": "datadesk.crsspxl.com", "cats": [ 10 ], "env": "^crsspxl$", - "script": "tag\\.crsspxl\\.com\/s1\\.js" + "script": "tag\\.crsspxl\\.com/s1\\.js" }, "CS Cart": { "website": "www.cs-cart.com", "cats": [ 6 ], "env": "^fn_compare_strings$", - "html": " Powered by (<a href=[^>]+cs-cart\\.com|CS-Cart)", + "html": " Powered by (?:<a href=[^>]+cs-cart\\.com|CS-Cart)", "implies": "PHP" }, - "Adobe ColdFusion": { - "website": "adobe.com\/products\/coldfusion-family.html", - "cats": [ 18 ], - "url": "\\.cfm$", - "html": "<!-- START headerTags\\.cfm", - "script": "\/cfajax\/", - "env": "^_cfEmails$", - "implies": "CFML" - }, - "ContentBox": { - "website": "www.gocontentbox.org", - "cats": [ 1, 11 ], - "meta": { "generator": "ContentBox powered by ColdBox" }, - "implies": "Adobe ColdFusion" - }, "CubeCart": { "website": "www.cubecart.com", "cats": [ 6 ], - "html": "(Powered by <a href=[^>]+cubecart\\.com|<p[^>]+>Powered by CubeCart)", + "html": "(?:Powered by <a href=[^>]+cubecart\\.com|<p[^>]+>Powered by CubeCart)", "meta": { "generator": "cubecart" }, "implies": "PHP" }, @@ -525,9 +601,9 @@ "env": "^Cufon$" }, "d3": { - "website": "mbostock.github.com\/d3", + "website": "mbostock.github.com/d3", "cats": [ 25 ], - "script": "d3(\\.v2)(\\.min)?\\.js" + "script": "d3(?:\\.v2)?(?:\\.min)?\\.js" }, "Dancer": { "website": "perldancer.org", @@ -542,10 +618,10 @@ "meta": { "generator": "Danneo CMS ([\\d.]+)\\;version:\\1" }, "implies": [ "Apache", "PHP" ] }, - "dashCommerce": { - "website": "dashcommerce.org", - "cats": [ 6 ], - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "Darwin": { + "website": "opensource.apple.com", + "cats": [ 28 ], + "headers": { "Server": "Darwin", "X-Powered-By": "Darwin" } }, "DataLife Engine": { "website": "dle-news.ru", @@ -557,13 +633,18 @@ "David Webbox": { "website": "www.tobit.com", "cats": [ 22 ], - "headers": { "Server": "David-WebBox\/([\\d.a]+ \\(\\d+\\))\\;version:\\1" } + "headers": { "Server": "David-WebBox/([\\d.a]+ \\(\\d+\\))\\;version:\\1" } }, "Debian": { "website": "debian.org", "cats": [ 28 ], - "headers": { "Server": "Debian", "X-Powered-By": "(Debian|dotdeb|(sarge|etch|lenny|queeze|wheezy|jessie))\\;version:\\2" - } + "headers": { "Server": "Debian", "X-Powered-By": "(?:Debian|dotdeb|(sarge|etch|lenny|squeeze|wheezy|jessie))\\;version:\\1" } + }, + "debut": { + "website": "www.brother.com", + "cats": [ 22 ], + "headers": { "Server": "debut\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Brother" }, "DedeCMS": { "website": "dedecms.com", @@ -572,11 +653,15 @@ "script": "dedeajax", "implies": "PHP" }, + "Dell": { + "website": "dell.com", + "cats": [ 40 ] + }, "Demandware": { "website": "demandware.com", "cats": [ 6 ], "headers": { "Server": "Demandware eCommerce Server" }, - "html": "<[^>]+demandware.edgesuite", + "html": "<[^>]+demandware\\.edgesuite", "env": "^dwAnalytics$" }, "DHTMLX": { @@ -587,7 +672,7 @@ "DirectAdmin": { "website": "www.directadmin.com", "cats": [ 9 ], - "html": "<a[^>]+>DirectAdmin<\/a> Web Control Panel", + "html": "<a[^>]+>DirectAdmin</a> Web Control Panel", "headers": { "Server": "DirectAdmin Daemon v([\\d.]+)\\;version:\\1" }, "implies": [ "PHP", "Apache" ] }, @@ -601,28 +686,28 @@ "Django": { "website": "djangoproject.com", "cats": [ 18 ], - "html": "(powered by <a[^>]+>Django ?([\\d.]+)?|<div style=\"display:none\"><input name=\"csrfmiddlewaretoken\" value=\"[a-z0-9]{32}\" type=\"hidden\"><\/div>)\\;version:\\2", + "html": "(?:powered by <a[^>]+>Django ?([\\d.]+)?|<div style=\"display:none\"><input name=\"csrfmiddlewaretoken\" value=\"[a-z0-9]{32}\" type=\"hidden\"></div>)\\;version:\\1", "env": "^__admin_media_prefix__", "implies": "Python" }, "Django CMS": { "website": "django-cms.org", "cats": [ 1 ], - "script": "media\/cms\/js\/csrf\\.js", + "script": "media/cms/js/csrf\\.js", "headers": { "Set-Cookie": "django[^;]=" }, "implies": "Django" }, "Dojo": { "website": "dojotoolkit.org", "cats": [ 12 ], - "script": "([\\d.]+)\/dojo\/dojo(\\.xd)?\\.js\\;version:\\1", + "script": "([\\d.]+)/dojo/dojo(?:\\.xd)?\\.js\\;version:\\1", "env": "^dojo$" }, "Dokeos": { "website": "dokeos.com", "cats": [ 21 ], "meta": { "generator": "Dokeos" }, - "html": "Portal <a[^>]+>Dokeos|@import \"[^\"]+dokeos_blue", + "html": "(?:Portal <a[^>]+>Dokeos|@import \"[^\"]+dokeos_blue)", "headers": { "X-Powered-By": "Dokeos" }, "implies": [ "PHP", "Xajax", "jQuery", "CKEditor" ] }, @@ -637,37 +722,41 @@ "website": "dotnetnuke.com", "cats": [ 1 ], "meta": { "generator": "DotNetNuke" }, - "headers": { "X-Compressed-By": "DotNetNuke", "Set-Cookie": "DotNetNukeAnonymous=.+" - }, + "headers": { "X-Compressed-By": "DotNetNuke", "Set-Cookie": "DotNetNukeAnonymous=" }, "html": "<!-- by DotNetNuke Corporation", "env": "^DotNetNuke$", "implies": "Microsoft ASP.NET" }, "Doxygen": { - "website": "stack.nl\/~dimitri\/doxygen", + "website": "stack.nl/~dimitri/doxygen", "cats": [ 4 ], - "html": "(<!-- Generated by Doxygen ([\\d.]+)|<link[^>]+doxygen.css)\\;version:\\1" + "html": "(?:<!-- Generated by Doxygen ([\\d.]+)|<link[^>]+doxygen.css)\\;version:\\1" }, "DreamWeaver": { - "website": "www.adobe.com\/products\/dreamweaver", + "website": "www.adobe.com/products/dreamweaver", "cats": [ 20 ], - "html": "(<!--[^>]*(InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) {)\\;version:\\3" + "html": "(?:<!--[^>]*(?:InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) {)\\;version:\\1" }, "Drupal": { "website": "drupal.org", "cats": [ 1 ], "script": "drupal\\.js", - "html": "<(link|style)[^>]+sites\/(default|all)\/(themes|modules)\/", - "headers": { "X-Drupal-Cache": ".*", "X-Generator": "Drupal(\\s([\\d.]+))?\\;version:\\2", "Expires": "19 Nov 1978" }, + "html": "<(?:link|style)[^>]+sites/(?:default|all)/(?:themes|modules)/", + "headers": { "X-Drupal-Cache": ".*", "X-Generator": "Drupal(?:\\s([\\d.]+))?\\;version:\\1", "Expires": "19 Nov 1978" }, "env": "^Drupal$", "implies": "PHP" }, "Drupal Commerce": { "website": "drupalcommerce.org", "cats": [ 6 ], - "html": "id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field", + "html": "(?:id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field)", "implies": "Drupal" }, + "dwhttpd": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "dwhttpd\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, "Dynamicweb": { "website": "www.dynamicweb.dk", "cats": [ 1, 6, 10 ], @@ -679,29 +768,47 @@ "website": "e107.org", "cats": [ 1 ], "script": "e107\\.js", - "headers": { "Set-Cookie": "e107_td[^;]+=" }, + "headers": { "Set-Cookie": "e107_tz[^;]+=", "X-Powered-By": "e107" }, "implies": "PHP" }, "EdgeCast": { "website": "www.edgecast.com", "cats": [ 31 ], - "headers": { "Server": "^ECS" } + "headers": { "Server": "^EC(?:S|Acc)" }, + "url": "https?://(?:[^/]+\\.)?edgecastcdn\\.net/" + }, + "eHTTP": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "\\beHTTP( v?([\\d\\.]+))?\\;version:\\2" }, + "implies": [ "HP ProCurve"] + }, + "ELOG": { + "website": "midas.psi.ch/elog", + "cats": [ 19 ], + "html": "<title>ELOG Logbook Selection" + }, + "ELOG HTTP": { + "website": "midas.psi.ch/elog", + "cats": [ 22 ], + "headers": { "Server": "ELOG HTTP( \\d[\\-\\d\\.]+)?\\;version:\\1" }, + "implies": "ELOG" }, "Eloqua": { "website": "eloqua.com", "cats": [ 32 ], "script": "elqCfg\\.js", - "env": "^elq(SiteID|Load|CurESite)$" + "env": "^elq(?:SiteID|Load|CurESite)$" }, "Embedthis-http": { - "website": "github.com\/embedthis\/http", + "website": "github.com/embedthis/http", "cats": [ 22 ], - "headers": { "Server": "Embedthis-http(\/([\\d.]+))?\\;version:\\2" } + "headers": { "Server": "Embedthis-http(?:/([\\d.]+))?\\;version:\\1" } }, "E-Merchant": { "website": "e-merchant.com", "cats": [ 6 ], - "script": "cdn.e-merchant.com" + "script": "cdn\\.e-merchant\\.com" }, "Enyo": { "website": "enyojs.com", @@ -713,8 +820,8 @@ "website": "episerver.com", "cats": [ 1 ], "meta": { "generator": "EPiServer" }, - "headers": { "Set-Cookie": "EPi(Trace|Server)[^;]*=" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "headers": { "Set-Cookie": "EPi(?:Trace|Server)[^;]*=" }, + "implies": "Microsoft ASP.NET" }, "EPrints": { "website": "www.eprints.org", @@ -723,6 +830,11 @@ "env": "^EPJS_menu_template$", "implies": "Perl" }, + "Erlang": { + "website": "www.erlang.org", + "cats": [ 27 ], + "headers": { "Server": "Erlang( OTP/([\\-\\d\\.ABR]+))?\\;version:\\1" } + }, "eSyndiCat": { "website": "esyndicat.com", "cats": [ 1 ], @@ -731,8 +843,14 @@ "env": "^esyndicat$", "implies": [ "PHP" ] }, + "EWS-NIC4": { + "website": "dell.com", + "cats": [ 22 ], + "headers": { "Server": "EWS-NIC4(\\/([\\d\\.a-z]+))?\\;version:\\2" }, + "implies": "Dell" + }, "Exhibit": { - "website": "simile-widgets.org\/exhibit\/", + "website": "simile-widgets.org/exhibit/", "cats": [ 25 ], "script": "exhibit.*\\.js", "env": "^Exhibit$" @@ -746,7 +864,7 @@ "ExpressionEngine": { "website": "expressionengine.com", "cats": [ 1 ], - "headers": { "Set-Cookie": "(exp_last_activity|exp_tracker)" }, + "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker)" }, "implies": "PHP" }, "ExtJS": { @@ -767,17 +885,17 @@ "cats": [ 29 ], "html": "", + "html": "(?:]* href=\"templates/gambio/|]content\\.php\\?coID=\\d|)", "implies": "PHP" }, "Gauges": { "website": "get.gaug.es", "cats": [ 10 ], "headers": { "Set-Cookie": "_gauges_[^;]+=" }, - "html": "t\\.src = '\/\/secure\\.gaug\\.es\/track\\.js", "env": "^_gauges$" }, "Gentoo": { "website": "www.gentoo.org", "cats": [ 28 ], - "headers": { "X-Powered-By": "-?gentoo" } + "headers": { "X-Powered-By": "gentoo" } }, "Get Satisfaction": { "website": "getsatisfaction.com", @@ -858,57 +979,57 @@ "implies": "PHP" }, "GoAhead": { - "website": "embedthis.com\/products\/goahead\/index.html", + "website": "embedthis.com/products/goahead/index.html", "cats": [ 22 ], "headers": { "Server": "GoAhead" } }, "Google Analytics": { - "website": "google.com\/analytics", + "website": "google.com/analytics", "cats": [ 10 ], "html": "_gaq\\.push\\(\\['_setAccount", - "script": "(\\.google-analytics\\.com\/ga\\.js|google-analytics\\.com\/urchin\\.js)", + "script": "(?:\\.google-analytics\\.com/ga\\.js|google-analytics\\.com/urchin\\.js)", "headers": { "Set-Cookie": "__utma" }, "env": "^gaGlobal$" }, "Google App Engine": { - "website": "code.google.com\/appengine", + "website": "code.google.com/appengine", "cats": [ 22 ], "headers": { "Server": "Google Frontend" } }, "Google Code Prettify": { - "website": "code.google.com\/p\/google-code-prettify", + "website": "code.google.com/p/google-code-prettify", "cats": [ 19 ], "env": "^prettyPrint$" }, "Google Font API": { - "website": "code.google.com\/apis\/webfonts", + "website": "code.google.com/apis/webfonts", "cats": [ 17 ], - "script": "googleapis.com\/.+webfont", + "script": "googleapis\\.com/.+webfont", "html": "]* href=[^>]+fonts\\.googleapis\\.com", "env": "^WebFonts$" }, "Google Maps": { "website": "maps.google.com", "cats": [ 35 ], - "script": "(maps\\.google\\.com\/maps\\?file=api(&v=([\\d.]+))?|maps\\.google\\.com\/maps\/api\/staticmap)\\;version:API v\\3" + "script": "(?:maps\\.google\\.com/maps\\?file=api(?:&v=([\\d.]+))?|maps\\.google\\.com/maps/api/staticmap)\\;version:API v\\1" }, "Google PageSpeed": { - "website": "developers.google.com\/speed\/pagespeed\/mod", + "website": "developers.google.com/speed/pagespeed/mod", "cats": [ 23, 33 ], "headers": { "X-Mod-Pagespeed": "([\\d.]+)\\;version:\\1" } }, "Google Sites": { "website": "sites.google.com", "cats": [ 1 ], - "url": "sites.google.com" + "url": "sites\\.google\\.com" }, "Google Tag Manager": { - "website": "www.google.com\/tagmanager", + "website": "www.google.com/tagmanager", "cats": [ 19 ], - "html": "googletagmanager\\.com\/ns\\.html[^>]+><\/iframe>" + "html": "googletagmanager\\.com/ns\\.html[^>]+>" }, "Google Web Toolkit": { - "website": "developers.google.com\/web-toolkit", + "website": "developers.google.com/web-toolkit", "cats": [ 18 ], "env": "^__gwt_", "implies": "Java" @@ -916,15 +1037,20 @@ "GoStats": { "website": "gostats.com", "cats": [ 10 ], - "env": "^_go(stats|_track)" + "env": "^_go(?:stats|_track)" }, "Graffiti CMS": { "website": "graffiticms.codeplex.com", "cats": [ 1 ], "meta": { "generator": "Graffiti CMS ([^\"]+)\\;version:\\1" }, - "script": "\/graffiti.js", + "script": "/graffiti\\.js", "headers": { "Set-Cookie": "graffitibot[^;]=" } }, + "Grandstream": { + "website": "www.grandstream.com", + "cats": [ 22, 39 ], + "headers": { "Server": "Grandstream\\/?([\\d\\.]+)?\\;version:\\1" } + }, "Gravatar": { "website": "gravatar.com", "cats": [ 19 ], @@ -933,7 +1059,6 @@ "Gravity Insights": { "website": "insights.gravity.com", "cats": [ 10 ], - "html": "gravityInsightsParams\\.site_guid = '", "env": "^GravityInsights$" }, "G-WAN": { @@ -942,9 +1067,9 @@ "headers": { "Server": "G-WAN" } }, "GX WebManager": { - "website": "www.gxsoftware.com\/en\/products\/web-content-management.htm", + "website": "www.gxsoftware.com/en/products/web-content-management.htm", "cats": [ 1 ], - "meta": { "generator": "GX WebManager( ([\\d.]+))?\\;version:\\2" }, + "meta": { "generator": "GX WebManager(?: ([\\d.]+))?\\;version:\\1" }, "html": "", + "meta": { "eomportal-instanceid": "[0-9]+", "eomportal-id": "[0-9]+", "eomportal-loid": "[0-9.]+", "eomportal-uuid": "[a-f0-9]+", "eomportal-lastUpdate": ".*" } }, "Microsoft ASP.NET": { "website": "www.asp.net", "cats": [ 18 ], "url": "\\.aspx$", "html": "]+name=\"__VIEWSTATE", - "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" - }, - "implies": [ "IIS", "Windows Server" ] + "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" }, + "implies": "IIS\\;confidence:50" }, "Microsoft SharePoint": { "website": "sharepoint.microsoft.com", @@ -1383,18 +1566,29 @@ "cats": [ 2 ], "html": "]+minibb.+\\s+", + "html": "", "env": "^_?owa_" }, "OneStat": { "website": "www.onestat.com", "cats": [ 10 ], - "html": "var p==.+stat\\.onestat\\.com\/stat\\.aspx\\?tagver" + "html": "var p==.+stat\\.onestat\\.com/stat\\.aspx\\?tagver" }, "OpenCart": { "website": "www.opencart.com", "cats": [ 6 ], - "html": "index\\.php\\?route=[a-z]+\/|Powered By ]+OpenCart", + "html": "(?:index\\.php\\?route=[a-z]+/|Powered By ]+OpenCart)", "implies": "PHP" }, "openEngine": { - "website": "openengine.de\/html\/pages\/de\/", + "website": "openengine.de/html/pages/de/", "cats": [ 1 ], - "html": "]+openEngine" }, "OpenGrok": { - "website": "hub.opensolaris.org\/bin\/view\/Project+opengrok\/WebHome", + "meta": "openEngine" + }, + "OpenGrok": { + "website": "hub.opensolaris.org/bin/view/Project+opengrok/WebHome", "cats": [ 19 ], "headers": { "Set-Cookie": "OpenGrok" }, - "meta": { "generator": "OpenGrok( v?([\\d.]+))?\\;version:\\2" }, + "meta": { "generator": "OpenGrok(?: v?([\\d.]+))?\\;version:\\1" }, "implies": "Java" }, "OpenGSE": { - "website": "code.google.com\/p\/opengse", + "website": "code.google.com/p/opengse", "cats": [ 22 ], "headers": { "Server": "GSE" }, "implies": "Java" @@ -1624,14 +1838,14 @@ "env": "^OpenLayers$" }, "OpenNemas": { - "website": "openhost.es\/en\/opennemas", + "website": "openhost.es/en/opennemas", "cats": [ 1 ], "headers": { "X-Powered-By": "OpenNemas" } }, "OpenSSL": { "website": "openssl.org", "cats": [ 33 ], - "headers": { "Server": "OpenSSL(\/([\\d.]+[a-z]?))?\\;version:\\2" } + "headers": { "Server": "OpenSSL(?:/([\\d.]+[a-z]?))?\\;version:\\1" } }, "OpenText Web Solutions": { "website": "websolutions.opentext.com", @@ -1645,19 +1859,19 @@ "env": "^optimizely$" }, "Oracle Application Server": { - "website": "www.oracle.com\/technetwork\/middleware\/ias\/overview\/index.html", + "website": "www.oracle.com/technetwork/middleware/ias/overview/index.html", "cats": [ 22 ], - "headers": { "Server": "Oracle(-| )Application(-| )Server((-| )(\\d+[a-z]?))?\\;version:\\5" } + "headers": { "Server": "Oracle\\bApplication\\bServer(?:\\b(\\d+[a-z]?))?\\;version:\\1" } }, "Oracle Recommendations On Demand": { - "website": "www.oracle.com\/us\/products\/applications\/commerce\/recommendations-on-demand\/index.html?", + "website": "www.oracle.com/us/products/applications/commerce/recommendations-on-demand/index.html", "cats": [ 10 ], "script": "atgsvcs.+atgsvcs\\.js" }, "osCommerce": { "website": "www.oscommerce.com", "cats": [ 6 ], - "html": "(]*(\\?|&)osCsid|Powered by (<[^]+>)?osCommerce<\/a>|<[^]+class=\"[^>]*infoBoxHeading)", + "html": "(?:]*(?:\\?|&)osCsid|Powered by (?:<[^]+>)?osCommerce|<[^]+class=\"[^>]*infoBoxHeading)", "headers": { "Set-Cookie": "osCsid=" } }, "osCSS": { @@ -1668,31 +1882,30 @@ "Outbrain": { "website": "outbrain.com", "cats": [ 5 ], - "html": "var OB_langJS = '.+widgets\\.outbrain\\.com\/lang_", - "script": "widgets\\.outbrain\\.com\/outbrain\\.js", - "env": "^OutbrainPermaLink$" + "script": "widgets\\.outbrain\\.com/outbrain\\.js", + "env": "^(?:OutbrainPermaLink|OB_releaseVer)$" }, "OXID eShop": { "website": "oxid-esales.com", "cats": [ 6 ], - "html": "", "implies": "Java" }, @@ -2649,6 +2924,11 @@ "website": "foundation.zurb.com", "cats": [ 18 ], "html": "]+foundation[^>\"]+css" + }, + "LiveStreet CMS": { + "website": "livestreetcms.com", + "cats": [ 1 ], + "headers": { "X-Powered-By": "LiveStreet CMS" } } } } diff --git a/drivers/chrome/background.html b/drivers/chrome/background.html index b273a4360..3abbe7968 100644 --- a/drivers/chrome/background.html +++ b/drivers/chrome/background.html @@ -8,7 +8,6 @@ - diff --git a/drivers/chrome/images/icons/3DM.png b/drivers/chrome/images/icons/3DM.png new file mode 100755 index 000000000..69e17bcb4 Binary files /dev/null and b/drivers/chrome/images/icons/3DM.png differ diff --git a/drivers/chrome/images/icons/3ware.png b/drivers/chrome/images/icons/3ware.png new file mode 100755 index 000000000..69e17bcb4 Binary files /dev/null and b/drivers/chrome/images/icons/3ware.png differ diff --git a/drivers/chrome/images/icons/ATEN.png b/drivers/chrome/images/icons/ATEN.png new file mode 100755 index 000000000..f15a46b5f Binary files /dev/null and b/drivers/chrome/images/icons/ATEN.png differ diff --git a/drivers/chrome/images/icons/Apache HBase.png b/drivers/chrome/images/icons/Apache HBase.png new file mode 100644 index 000000000..113d901a6 Binary files /dev/null and b/drivers/chrome/images/icons/Apache HBase.png differ diff --git a/drivers/chrome/images/icons/Apache Hadoop.png b/drivers/chrome/images/icons/Apache Hadoop.png new file mode 100755 index 000000000..39075d893 Binary files /dev/null and b/drivers/chrome/images/icons/Apache Hadoop.png differ diff --git a/drivers/chrome/images/icons/Backbone.js.png b/drivers/chrome/images/icons/Backbone.js.png index 7d774c810..d45b1b17b 100644 Binary files a/drivers/chrome/images/icons/Backbone.js.png and b/drivers/chrome/images/icons/Backbone.js.png differ diff --git a/drivers/chrome/images/icons/BaseHTTP.png b/drivers/chrome/images/icons/BaseHTTP.png new file mode 100755 index 000000000..68b9f6bfc Binary files /dev/null and b/drivers/chrome/images/icons/BaseHTTP.png differ diff --git a/drivers/chrome/images/icons/Boa.png b/drivers/chrome/images/icons/Boa.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/chrome/images/icons/Boa.png differ diff --git a/drivers/chrome/images/icons/Brother.png b/drivers/chrome/images/icons/Brother.png new file mode 100755 index 000000000..fbc41595e Binary files /dev/null and b/drivers/chrome/images/icons/Brother.png differ diff --git a/drivers/chrome/images/icons/Canon.png b/drivers/chrome/images/icons/Canon.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/chrome/images/icons/Canon.png differ diff --git a/drivers/chrome/images/icons/Catwalk.png b/drivers/chrome/images/icons/Catwalk.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/chrome/images/icons/Catwalk.png differ diff --git a/drivers/chrome/images/icons/Chartbeat.png b/drivers/chrome/images/icons/Chartbeat.png new file mode 100644 index 000000000..2cb597cc7 Binary files /dev/null and b/drivers/chrome/images/icons/Chartbeat.png differ diff --git a/drivers/chrome/images/icons/CherryPy.png b/drivers/chrome/images/icons/CherryPy.png new file mode 100755 index 000000000..badc40ac2 Binary files /dev/null and b/drivers/chrome/images/icons/CherryPy.png differ diff --git a/drivers/chrome/images/icons/Cloudera.png b/drivers/chrome/images/icons/Cloudera.png new file mode 100755 index 000000000..4d3a6a1d4 Binary files /dev/null and b/drivers/chrome/images/icons/Cloudera.png differ diff --git a/drivers/chrome/images/icons/CodeMirror.png b/drivers/chrome/images/icons/CodeMirror.png new file mode 100644 index 000000000..ef34d402c Binary files /dev/null and b/drivers/chrome/images/icons/CodeMirror.png differ diff --git a/drivers/chrome/images/icons/CompaqHTTPServer.png b/drivers/chrome/images/icons/CompaqHTTPServer.png new file mode 100755 index 000000000..2b0bc39df Binary files /dev/null and b/drivers/chrome/images/icons/CompaqHTTPServer.png differ diff --git a/drivers/chrome/images/icons/Cufon.png b/drivers/chrome/images/icons/Cufon.png new file mode 100644 index 000000000..cd2e3f029 Binary files /dev/null and b/drivers/chrome/images/icons/Cufon.png differ diff --git a/drivers/chrome/images/icons/Darwin.png b/drivers/chrome/images/icons/Darwin.png new file mode 100755 index 000000000..41b6c8b00 Binary files /dev/null and b/drivers/chrome/images/icons/Darwin.png differ diff --git a/drivers/chrome/images/icons/Dell.png b/drivers/chrome/images/icons/Dell.png new file mode 100755 index 000000000..76a80b4fa Binary files /dev/null and b/drivers/chrome/images/icons/Dell.png differ diff --git a/drivers/chrome/images/icons/ELOG HTTP.png b/drivers/chrome/images/icons/ELOG HTTP.png new file mode 100644 index 000000000..7af2b77e9 Binary files /dev/null and b/drivers/chrome/images/icons/ELOG HTTP.png differ diff --git a/drivers/chrome/images/icons/ELOG.png b/drivers/chrome/images/icons/ELOG.png new file mode 100644 index 000000000..7af2b77e9 Binary files /dev/null and b/drivers/chrome/images/icons/ELOG.png differ diff --git a/drivers/chrome/images/icons/EWS-NIC4.png b/drivers/chrome/images/icons/EWS-NIC4.png new file mode 100755 index 000000000..76a80b4fa Binary files /dev/null and b/drivers/chrome/images/icons/EWS-NIC4.png differ diff --git a/drivers/chrome/images/icons/Erlang.png b/drivers/chrome/images/icons/Erlang.png new file mode 100755 index 000000000..235338617 Binary files /dev/null and b/drivers/chrome/images/icons/Erlang.png differ diff --git a/drivers/chrome/images/icons/FlashCom.png b/drivers/chrome/images/icons/FlashCom.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/chrome/images/icons/FlashCom.png differ diff --git a/drivers/chrome/images/icons/Grandstream.png b/drivers/chrome/images/icons/Grandstream.png new file mode 100755 index 000000000..b4b1eb66b Binary files /dev/null and b/drivers/chrome/images/icons/Grandstream.png differ diff --git a/drivers/chrome/images/icons/HP ProCurve.png b/drivers/chrome/images/icons/HP ProCurve.png new file mode 100755 index 000000000..2b0bc39df Binary files /dev/null and b/drivers/chrome/images/icons/HP ProCurve.png differ diff --git a/drivers/chrome/images/icons/Highstock.png b/drivers/chrome/images/icons/Highstock.png new file mode 100755 index 000000000..6e8391d36 Binary files /dev/null and b/drivers/chrome/images/icons/Highstock.png differ diff --git a/drivers/chrome/images/icons/Indico.png b/drivers/chrome/images/icons/Indico.png new file mode 100755 index 000000000..02636b6cc Binary files /dev/null and b/drivers/chrome/images/icons/Indico.png differ diff --git a/drivers/chrome/images/icons/Intercom.png b/drivers/chrome/images/icons/Intercom.png new file mode 100644 index 000000000..40d2321a0 Binary files /dev/null and b/drivers/chrome/images/icons/Intercom.png differ diff --git a/drivers/chrome/images/icons/Jetty.png b/drivers/chrome/images/icons/Jetty.png new file mode 100755 index 000000000..807b88634 Binary files /dev/null and b/drivers/chrome/images/icons/Jetty.png differ diff --git a/drivers/chrome/images/icons/KS_HTTP.png b/drivers/chrome/images/icons/KS_HTTP.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/chrome/images/icons/KS_HTTP.png differ diff --git a/drivers/chrome/images/icons/LabVIEW.png b/drivers/chrome/images/icons/LabVIEW.png new file mode 100755 index 000000000..c832bdc54 Binary files /dev/null and b/drivers/chrome/images/icons/LabVIEW.png differ diff --git a/drivers/chrome/images/icons/Less.png b/drivers/chrome/images/icons/Less.png new file mode 100644 index 000000000..9e1de2359 Binary files /dev/null and b/drivers/chrome/images/icons/Less.png differ diff --git a/drivers/chrome/images/icons/LiveStreet CMS.png b/drivers/chrome/images/icons/LiveStreet CMS.png new file mode 100644 index 000000000..75a0029aa Binary files /dev/null and b/drivers/chrome/images/icons/LiveStreet CMS.png differ diff --git a/drivers/chrome/images/icons/Logitech Media Server.png b/drivers/chrome/images/icons/Logitech Media Server.png new file mode 100755 index 000000000..b2e6cb1f2 Binary files /dev/null and b/drivers/chrome/images/icons/Logitech Media Server.png differ diff --git a/drivers/chrome/images/icons/MOBOTIX.png b/drivers/chrome/images/icons/MOBOTIX.png new file mode 100755 index 000000000..321f9a8b1 Binary files /dev/null and b/drivers/chrome/images/icons/MOBOTIX.png differ diff --git a/drivers/chrome/images/icons/MiniServ.png b/drivers/chrome/images/icons/MiniServ.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/chrome/images/icons/MiniServ.png differ diff --git a/drivers/chrome/images/icons/Mono.png b/drivers/chrome/images/icons/Mono.png new file mode 100644 index 000000000..912809eb2 Binary files /dev/null and b/drivers/chrome/images/icons/Mono.png differ diff --git a/drivers/chrome/images/icons/PerfSONAR-PS.png b/drivers/chrome/images/icons/PerfSONAR-PS.png new file mode 100755 index 000000000..13be42d00 Binary files /dev/null and b/drivers/chrome/images/icons/PerfSONAR-PS.png differ diff --git a/drivers/chrome/images/icons/Posterous.png b/drivers/chrome/images/icons/Posterous.png new file mode 100644 index 000000000..3150f4f93 Binary files /dev/null and b/drivers/chrome/images/icons/Posterous.png differ diff --git a/drivers/chrome/images/icons/Prefix-Free.png b/drivers/chrome/images/icons/Prefix-Free.png new file mode 100644 index 000000000..87a646815 Binary files /dev/null and b/drivers/chrome/images/icons/Prefix-Free.png differ diff --git a/drivers/chrome/images/icons/SAP.png b/drivers/chrome/images/icons/SAP.png new file mode 100644 index 000000000..9217c8f87 Binary files /dev/null and b/drivers/chrome/images/icons/SAP.png differ diff --git a/drivers/chrome/images/icons/Sentinel Keys Server.png b/drivers/chrome/images/icons/Sentinel Keys Server.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/chrome/images/icons/Sentinel Keys Server.png differ diff --git a/drivers/chrome/images/icons/Sentinel License Monitor.png b/drivers/chrome/images/icons/Sentinel License Monitor.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/chrome/images/icons/Sentinel License Monitor.png differ diff --git a/drivers/chrome/images/icons/Sentinel Protection Server.png b/drivers/chrome/images/icons/Sentinel Protection Server.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/chrome/images/icons/Sentinel Protection Server.png differ diff --git a/drivers/chrome/images/icons/Splunk.png b/drivers/chrome/images/icons/Splunk.png new file mode 100755 index 000000000..bd2a1a514 Binary files /dev/null and b/drivers/chrome/images/icons/Splunk.png differ diff --git a/drivers/chrome/images/icons/Splunkd.png b/drivers/chrome/images/icons/Splunkd.png new file mode 100755 index 000000000..bd2a1a514 Binary files /dev/null and b/drivers/chrome/images/icons/Splunkd.png differ diff --git a/drivers/chrome/images/icons/SunOS.png b/drivers/chrome/images/icons/SunOS.png new file mode 100755 index 000000000..725070080 Binary files /dev/null and b/drivers/chrome/images/icons/SunOS.png differ diff --git a/drivers/chrome/images/icons/TWiki.png b/drivers/chrome/images/icons/TWiki.png new file mode 100644 index 000000000..f6573b7fa Binary files /dev/null and b/drivers/chrome/images/icons/TWiki.png differ diff --git a/drivers/chrome/images/icons/Underscore.js.png b/drivers/chrome/images/icons/Underscore.js.png index 10262b99d..030496838 100644 Binary files a/drivers/chrome/images/icons/Underscore.js.png and b/drivers/chrome/images/icons/Underscore.js.png differ diff --git a/drivers/chrome/images/icons/Wink.png b/drivers/chrome/images/icons/Wink.png new file mode 100644 index 000000000..3e7204032 Binary files /dev/null and b/drivers/chrome/images/icons/Wink.png differ diff --git a/drivers/chrome/images/icons/Wowza Media Server.png b/drivers/chrome/images/icons/Wowza Media Server.png new file mode 100755 index 000000000..2e7c25e2b Binary files /dev/null and b/drivers/chrome/images/icons/Wowza Media Server.png differ diff --git a/drivers/chrome/images/icons/XAMPP.png b/drivers/chrome/images/icons/XAMPP.png new file mode 100755 index 000000000..7104b0e4d Binary files /dev/null and b/drivers/chrome/images/icons/XAMPP.png differ diff --git a/drivers/chrome/images/icons/Xajax.png b/drivers/chrome/images/icons/Xajax.png new file mode 100644 index 000000000..bba0d40ab Binary files /dev/null and b/drivers/chrome/images/icons/Xajax.png differ diff --git a/drivers/chrome/images/icons/Zabbix.png b/drivers/chrome/images/icons/Zabbix.png new file mode 100755 index 000000000..c7384dc3e Binary files /dev/null and b/drivers/chrome/images/icons/Zabbix.png differ diff --git a/drivers/chrome/images/icons/debut.png b/drivers/chrome/images/icons/debut.png new file mode 100755 index 000000000..fbc41595e Binary files /dev/null and b/drivers/chrome/images/icons/debut.png differ diff --git a/drivers/chrome/images/icons/default.png b/drivers/chrome/images/icons/default.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/chrome/images/icons/default.png differ diff --git a/drivers/chrome/images/icons/dwhttpd.png b/drivers/chrome/images/icons/dwhttpd.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/chrome/images/icons/dwhttpd.png differ diff --git a/drivers/chrome/images/icons/eHTTP.png b/drivers/chrome/images/icons/eHTTP.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/chrome/images/icons/eHTTP.png differ diff --git a/drivers/chrome/images/icons/libwww-perl-daemon.png b/drivers/chrome/images/icons/libwww-perl-daemon.png new file mode 100755 index 000000000..2110788f2 Binary files /dev/null and b/drivers/chrome/images/icons/libwww-perl-daemon.png differ diff --git a/drivers/chrome/images/icons/mod_auth_pam.png b/drivers/chrome/images/icons/mod_auth_pam.png new file mode 100755 index 000000000..d268dcca8 Binary files /dev/null and b/drivers/chrome/images/icons/mod_auth_pam.png differ diff --git a/drivers/chrome/images/icons/mod_jk.png b/drivers/chrome/images/icons/mod_jk.png new file mode 100755 index 000000000..d268dcca8 Binary files /dev/null and b/drivers/chrome/images/icons/mod_jk.png differ diff --git a/drivers/chrome/images/icons/mod_perl.png b/drivers/chrome/images/icons/mod_perl.png new file mode 100755 index 000000000..3f0559995 Binary files /dev/null and b/drivers/chrome/images/icons/mod_perl.png differ diff --git a/drivers/chrome/images/icons/posterous.png b/drivers/chrome/images/icons/posterous.png index 3730d31aa..3150f4f93 100644 Binary files a/drivers/chrome/images/icons/posterous.png and b/drivers/chrome/images/icons/posterous.png differ diff --git a/drivers/chrome/js/background.js b/drivers/chrome/js/background.js deleted file mode 100644 index e354989a4..000000000 --- a/drivers/chrome/js/background.js +++ /dev/null @@ -1,3 +0,0 @@ -wappalyzer.log('bg.html'); - -wappalyzer.init(); diff --git a/drivers/chrome/js/content.js b/drivers/chrome/js/content.js index 1d9d3fb0e..e160070dd 100644 --- a/drivers/chrome/js/content.js +++ b/drivers/chrome/js/content.js @@ -1,9 +1,15 @@ (function() { var c = { init: function() { + var html = document.documentElement.outerHTML; + c.log('init'); - chrome.extension.sendRequest({ id: 'analyze', subject: { html: document.documentElement.outerHTML } }); + if ( html.length > 50000 ) { + html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length); + } + + chrome.extension.sendRequest({ id: 'analyze', subject: { html: html } }); c.getEnvironmentVars(); }, @@ -13,6 +19,8 @@ }, getEnvironmentVars: function() { + var container, script; + c.log('getEnvironmentVars'); if ( typeof document.documentElement.innerHTML === 'undefined' ) { @@ -20,26 +28,15 @@ } try { - var container = document.createElement('wappalyzerData'); + container = document.createElement('wappalyzerData'); container.setAttribute('id', 'wappalyzerData'); container.setAttribute('style', 'display: none'); - var script = document.createElement('script'); + script = document.createElement('script'); script.setAttribute('id', 'wappalyzerEnvDetection'); - - script.innerHTML = - '(function() {' + - 'try {' + - 'var i, environmentVars, event = document.createEvent("Events");' + - 'event.initEvent("wappalyzerEvent", true, false);' + - 'for ( i in window ) { environmentVars += i + " "; }' + - 'document.getElementById("wappalyzerData").appendChild(document.createComment(environmentVars));' + - 'document.getElementById("wappalyzerData").dispatchEvent(event);' + - '}' + - 'catch(e) { }' + - '})();'; + script.setAttribute('src', chrome.extension.getURL('js/inject.js')); container.addEventListener('wappalyzerEvent', (function(event) { var environmentVars = event.target.childNodes[0].nodeValue; diff --git a/drivers/chrome/js/driver.js b/drivers/chrome/js/driver.js index ff6135a2a..514daf50e 100644 --- a/drivers/chrome/js/driver.js +++ b/drivers/chrome/js/driver.js @@ -101,7 +101,7 @@ } }); - chrome.tabs.getAllInWindow(null, function(tabs) { + chrome.tabs.query({}, function(tabs) { tabs.map(function(tab) { if ( tab.url.match(/^https?:\/\//) ) { chrome.tabs.executeScript(tab.id, { file: 'js/content.js' }); @@ -233,4 +233,4 @@ }; w.init(); -})(); +}()); diff --git a/drivers/chrome/js/inject.js b/drivers/chrome/js/inject.js new file mode 100644 index 000000000..fd734182e --- /dev/null +++ b/drivers/chrome/js/inject.js @@ -0,0 +1,14 @@ +(function() { + try { + var i, environmentVars, e = document.createEvent('Events'); + + e.initEvent('wappalyzerEvent', true, false); + + for ( i in window ) { + environmentVars += i + ' '; + } + + document.getElementById('wappalyzerData').appendChild(document.createComment(environmentVars)); + document.getElementById('wappalyzerData').dispatchEvent(e); + } catch(e) { } +}()); diff --git a/drivers/chrome/js/wappalyzer.js b/drivers/chrome/js/wappalyzer.js index 6257ac81e..3bb3d9ad2 100644 --- a/drivers/chrome/js/wappalyzer.js +++ b/drivers/chrome/js/wappalyzer.js @@ -13,64 +13,64 @@ var wappalyzer = (function() { * Application class */ var Application = function(app, detected) { - var self = this; - - self.app = app; - self.confidence = {}; - self.confidenceTotal = 0; - self.detected = Boolean(detected); - self.version = ''; - self.versions = []; + this.app = app; + this.confidence = {}; + this.confidenceTotal = 0; + this.detected = Boolean(detected); + this.version = ''; + this.versions = []; + }; + Application.prototype = { /** * Calculate confidence total */ - self.getConfidence = function() { + getConfidence: function() { var total = 0; - for ( id in self.confidence ) { - total += self.confidence[id]; + for ( id in this.confidence ) { + total += this.confidence[id]; } - return self.confidenceTotal = Math.min(total, 100); - } + return this.confidenceTotal = Math.min(total, 100); + }, /** * Resolve version number (find the longest version number that contains all shorter detected version numbers) */ - self.getVersion = function() { - var next, resolved; + getVersion: function() { + var i, next, resolved; - if ( !self.versions.length ) { + if ( !this.versions.length ) { return; } - self.versions.sort(function(a, b) { + this.versions.sort(function(a, b) { return a.length > b.length ? 1 : ( a.length < b.length ? -1 : 0 ); }); - resolved = self.versions[0]; + resolved = this.versions[0]; - for ( i in self.versions ) { + for ( i in this.versions ) { next = parseInt(i) + 1; - if ( next < self.versions.length ) { - if ( self.versions[next].indexOf(self.versions[i]) !== -1 ) { - resolved = self.versions[next]; + if ( next < this.versions.length ) { + if ( this.versions[next].indexOf(this.versions[i]) !== -1 ) { + resolved = this.versions[next]; } else { break; } } } - return self.version = resolved; - } + return this.version = resolved; + }, - self.setDetected = function(pattern, type, value, key) { - self.detected = true; + setDetected: function(pattern, type, value, key) { + this.detected = true; // Set confidence level - self.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; + this.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; // Detect version number if ( pattern.version ) { @@ -79,13 +79,20 @@ var wappalyzer = (function() { matches = pattern.regex.exec(value) ; + w.log({ matches: matches, version: version }); + if ( matches ) { matches.map(function(match, i) { // Parse ternary operator var ternary = new RegExp('\\\\' + i + '\\?([^:]+):(.+)$').exec(version); if ( ternary && ternary.length === 3 ) { + + w.log({ match: match, i: i, ternary: ternary }); + version = version.replace(ternary[0], match ? ternary[1] : ternary[2]); + + w.log({ version: version }); } // Replace back references @@ -93,14 +100,43 @@ var wappalyzer = (function() { }); if ( version ) { - self.versions.push(version); + this.versions.push(version); } - self.getVersion(); + this.getVersion(); } } } - } + }; + + var Profiler = function() { + this.regexCount = 0; + this.startTime = new Date().getTime(); + this.lastTime = new Date().getTime(); + this.slowest = { duration: null, app: '', type: '', pattern: '' }; + this.timedOut = false; + }; + + Profiler.prototype = { + checkPoint: function(app, type, regex) { + var duration = new Date().getTime() - this.lastTime; + + if ( !this.slowest.duration || duration > this.slowest.duration ) { + this.slowest.duration = duration; + this.slowest.app = app; + this.slowest.type = type; + this.slowest.regex = regex; + } + + this.lastTime = new Date().getTime(); + + this.timedOut = this.getDuration() > 1000; + }, + + getDuration: function() { + return new Date().getTime() - this.startTime; + } + }; /** * Call driver functions @@ -172,15 +208,9 @@ var wappalyzer = (function() { config: { environment: 'dev', // dev | live - - version: false, - websiteURL: 'http://wappalyzer.com/', twitterURL: 'https://twitter.com/Wappalyzer', githubURL: 'https://github.com/ElbertF/Wappalyzer', - - firstRun: false, - upgraded: false }, /** @@ -214,19 +244,7 @@ var wappalyzer = (function() { } // Initialize driver - driver('init', function() { - if ( w.config.firstRun ) { - driver('goToURL', { url: w.config.websiteURL + 'installed', medium: 'install' }); - - w.config.firstRun = false; - } - - if ( w.config.upgraded ) { - driver('goToURL', { url: w.config.websiteURL + 'upgraded', medium: 'upgrade' }); - - w.config.upgraded = false; - } - }); + driver('init'); }, /** @@ -235,10 +253,7 @@ var wappalyzer = (function() { analyze: function(hostname, url, data) { var i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header, version, - profiler = { - regexCount: 0, - startTime: new Date().getTime() - }, + profiler = new Profiler(), apps = {} ; @@ -257,13 +272,21 @@ var wappalyzer = (function() { } for ( app in w.apps ) { + // Exit loop after one second to prevent CPU hogging + // Remaining patterns will not be evaluated + if ( profiler.timedOut ) { + w.log('Timeout, exiting loop'); + + break; + } + apps[app] = w.detected[url] && w.detected[url][app] ? w.detected[url][app] : new Application(app); for ( type in w.apps[app] ) { switch ( type ) { case 'url': parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(url) ) { apps[app].setDetected(pattern, type, url); @@ -277,7 +300,7 @@ var wappalyzer = (function() { } parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(data[type]) ) { apps[app].setDetected(pattern, type, data[type]); @@ -293,10 +316,10 @@ var wappalyzer = (function() { regexScript = new RegExp(']+src=("|\')([^"\']+)', 'ig'); parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); while ( match = regexScript.exec(data.html) ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(match[2]) ) { apps[app].setDetected(pattern, type, match[2]); @@ -310,19 +333,17 @@ var wappalyzer = (function() { break; } - profiler.regexCount ++; - regexMeta = /]+>/ig; while ( match = regexMeta.exec(data.html) ) { for ( meta in w.apps[app][type] ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, regexMeta); if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { content = match.toString().match(/content=("|')([^"']+)("|')/i); parse(w.apps[app].meta[meta]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( content && content.length === 4 && pattern.regex.test(content[2]) ) { apps[app].setDetected(pattern, type, content[2], meta); @@ -340,7 +361,7 @@ var wappalyzer = (function() { for ( header in w.apps[app].headers ) { parse(w.apps[app][type][header]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) { apps[app].setDetected(pattern, type, data[type][header], header); @@ -356,7 +377,7 @@ var wappalyzer = (function() { parse(w.apps[app][type]).map(function(pattern) { for ( i in data[type] ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(data[type][i]) ) { apps[app].setDetected(pattern, type, data[type][i]); @@ -369,7 +390,8 @@ var wappalyzer = (function() { } } - w.log('Tested ' + profiler.regexCount + ' regular expressions in ' + ( ( ( new Date ).getTime() - profiler.startTime ) / 1000 ) + 's'); + w.log('[ PROFILER ] Tested ' + profiler.regexCount + ' regular expressions in ' + ( profiler.getDuration() / 1000 ) + 's'); + w.log('[ PROFILER ] Slowest pattern took ' + ( profiler.slowest.duration / 1000 ) + 's: ' + profiler.slowest.app + ' | ' + profiler.slowest.type + ' | ' + profiler.slowest.regex); for ( app in apps ) { if ( !apps[app].detected ) { diff --git a/drivers/chrome/manifest.json b/drivers/chrome/manifest.json index 4d9f5caa1..25db90245 100644 --- a/drivers/chrome/manifest.json +++ b/drivers/chrome/manifest.json @@ -1,7 +1,7 @@ { "name": "Wappalyzer", "homepage_url": "http://wappalyzer.com?utm_source=chrome&utm_medium=context&utm_campaign=extensions", "description": "Identifies software on the web", - "version": "2.20", + "version": "2.24", "default_locale": "en", "manifest_version": 2, "icons": { @@ -19,6 +19,9 @@ "js": [ "js/content.js" ], "run_at": "document_idle" }], + "web_accessible_resources": [ + "js/inject.js" + ], "options_page": "options.html", "permissions": [ "tabs", "http://*/*", "https://*/*" ], "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'" diff --git a/drivers/firefox-jetpack/data/apps.json b/drivers/firefox-jetpack/data/apps.json index 468e8d4e9..3002cb2b1 100644 --- a/drivers/firefox-jetpack/data/apps.json +++ b/drivers/firefox-jetpack/data/apps.json @@ -35,21 +35,25 @@ "33": "web-server-extensions", "34": "databases", "35": "maps", - "36": "advertising-networks" + "36": "advertising-networks", + "37": "network-devices", + "38": "media-servers", + "39": "webcams", + "40": "printers" }, "apps": { "1C-Bitrix": { "website": "www.1c-bitrix.ru", "cats": [ 1 ], "headers": { "X-Powered-CMS": "Bitrix Site Manager", "Set-Cookie": "BITRIX_" }, - "html": "]+components\/bitrix|(src|href)=\"\/bitrix\/(js|templates)", + "html": "(?:]+components/bitrix|(?:src|href)=\"/bitrix/(?:js|templates))", "script": "1c-bitrix", "implies": "PHP" }, "1und1": { "website": "1und1.de", "cats": [ 6 ], - "url": "\/shop\/catalog\/browse\\?sessid=", + "url": "/shop/catalog/browse\\?sessid=", "implies": "PHP" }, "2z Project": { @@ -61,7 +65,18 @@ "website": "www.3dcart.com", "cats": [ 1, 6 ], "headers": { "X-Powered-By": "3DCART" }, - "script": "(twlh(track)?\\.asp|3d_upsell\\.js)" + "script": "(?:twlh(?:track)?\\.asp|3d_upsell\\.js)" + }, + "3DM": { + "website": "www.3ware.com", + "cats": [ 19 ], + "html": "3ware 3DM([\\d\\.]+)?\\;version:\\1", + "implies": "3ware" + }, + "3ware": { + "website": "www.3ware.com", + "cats": [ 22 ], + "headers": { "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1" } }, "Accessible Portal": { "website": "www.accessibleportal.com", @@ -72,20 +87,29 @@ "AddThis": { "website": "www.addthis.com", "cats": [ 5 ], - "script": "addthis\\.com\/js\/(\\d+)?\\;version:\\1", + "script": "addthis\\.com/js/(\\d+)?\\;version:\\1", "env": "^addthis" }, + "Adobe ColdFusion": { + "website": "adobe.com/products/coldfusion-family.html", + "cats": [ 18 ], + "url": "\\.cfm$", + "html": "<!-- START headerTags\\.cfm", + "script": "/cfajax/", + "env": "^_cfEmails$", + "implies": "CFML" + }, "Adobe CQ5": { - "website": "adobe.com\/products\/cq.html", + "website": "adobe.com/products/cq.html", "cats": [ 1 ], - "url": "\/etc\/designs\/", + "url": "/etc/designs/", "html": "<div class=\"[^\"]*parbase", "implies": "Java" }, "Adobe GoLive": { - "website": "www.adobe.com\/products\/golive", + "website": "www.adobe.com/products/golive", "cats": [ 20 ], - "meta": { "generator": "Adobe GoLive(\\s([\\d.]+))?\\;version:\\2" } + "meta": { "generator": "Adobe GoLive(?:\\s([\\d.]+))?\\;version:\\1" } }, "Advanced Web Stats": { "website": "www.advancedwebstats.com", @@ -99,9 +123,9 @@ "env": "^AUI$" }, "Amaya": { - "website": "www.w3.org\/Amaya", + "website": "www.w3.org/Amaya", "cats": [ 20 ], - "meta": { "generator": "Amaya( V?([\\d.]+[a-z]))?\\;version:\\2" } + "meta": { "generator": "Amaya(?: V?([\\d.]+[a-z]))?\\;version:\\1" } }, "amCharts": { "website": "amcharts.com", @@ -112,7 +136,7 @@ "Ametys": { "website": "ametys.org", "cats": [ 1 ], - "meta": { "generator": "(Ametys|Anyware Technologies)" }, + "meta": { "generator": "(?:Ametys|Anyware Technologies)" }, "script": "STools\\.js", "implies": "Java" }, @@ -120,7 +144,7 @@ "website": "amirocms.com", "cats": [ 1 ], "meta": { "generator": "Amiro" }, - "html": "system_(js\\.php\\?script=|css\\.php\\?styles)[^\"]+cv=([\\d.]+)\\;version:\\2", + "html": "system_(?:js\\.php\\?script=|css\\.php\\?styles)[^\"]+cv=([\\d.]+)\\;version:\\1", "implies": "PHP" }, "AMPcms": { @@ -138,12 +162,22 @@ "AOLserver": { "website": "aolserver.com", "cats": [ 22 ], - "headers": { "Server": "AOLserver\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "AOLserver/?([\\d.]+)?\\;version:\\1" } }, "Apache": { "website": "apache.org", "cats": [ 22 ], - "headers": { "Server": "(Apache($|\/([\\d.]+)|[^\/-])|(^|\\b)HTTPD)\\;version:\\3" } + "headers": { "Server": "(?:Apache(?:$|/([\\d.]+)|[^/-])|(?:^|\\b)HTTPD)\\;version:\\1" } + }, + "Apache Hadoop": { + "website": "hadoop.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hadoop.css\"" + }, + "Apache HBase": { + "website": "hbase.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hbase.css\"" }, "Apache JSPWiki": { "website": "jspwiki.org", @@ -155,12 +189,12 @@ "Apache Tomcat": { "website": "tomcat.apache.org", "cats": [ 22 ], - "headers": { "Server": "Apache-Coyote\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "Apache-Coyote/?([\\d.]+)?\\;version:\\1" } }, "Apache Traffic Server": { - "website": "trafficserver.apache.org\/", + "website": "trafficserver.apache.org/", "cats": [ 22 ], - "headers": { "Server": "ATS\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "ATS/?([\\d.]+)?\\;version:\\1" } }, "Arc Forum": { "website": "arclanguage.org", @@ -168,42 +202,47 @@ "html": "ping\\.src = node\\.href;" }, "AsciiDoc": { - "website": "www.methods.co.nz\/asciidoc", + "website": "www.methods.co.nz/asciidoc", "cats": [ 1, 20, 27 ], "meta": { "generator": "^AsciiDoc ([\\d.]+)\\;version:\\1" }, "env": "^asciidoc$" }, + "ATEN": { + "website": "www.aten.com", + "cats": [ 22 ], + "headers": { "Server": "ATEN HTTP Server(\\(V?([\\d\\.]+)\\))?\\;version:\\2" } + }, "ATG Web Commerce": { - "website": "oracle.com\/us\/products\/applications\/web-commerce\/atg", + "website": "oracle.com/us/products/applications/web-commerce/atg", "cats": [ 6 ], - "headers": { "X-ATG-Version": "(ATGPlatform\/([\\d.]+))?\\;version:\\2" }, + "headers": { "X-ATG-Version": "(?:ATGPlatform/([\\d.]+))?\\;version:\\1" }, "html": "<[^>]+_DARGS" }, "Atlassian Confluence": { - "website": "www.atlassian.com\/software\/confluence\/overview\/team-collaboration-software", + "website": "www.atlassian.com/software/confluence/overview/team-collaboration-software", "cats": [ 8 ], - "html": "Powered by <a href=[^>]+atlassian\\.com\/software\/confluence([^>]+>Atlassian Confluence<\/a> ([\\d.]+))?\\;version:\\2", + "html": "Powered by <a href=[^>]+atlassian\\.com/software/confluence(?:[^>]+>Atlassian Confluence</a> ([\\d.]+))?\\;version:\\1", "headers": { "X-Confluence-Request-Time": ".*" }, "meta": { "confluence-request-time": ".*" }, "implies": "Java" }, "Atlassian Jira": { - "website": "www.atlassian.com\/software\/jira\/overview\/", + "website": "www.atlassian.com/software/jira/overview/", "cats": [ 13 ], "env": "^jira$", - "script": "\/jira\/s\/", - "url": "\/secure\/Dashboard.jspa", - "html": "Powered by\\s+<a href=[^>]+atlassian\\.com\/(software\/jira|jira-bug-tracking\/)[^>]+>Atlassian\\s+JIRA([^v]*v(ersion: )?(\\d+\\.\\d+(\\.\\d+)?))?\\;version:\\4", + "script": "/jira/s/", + "url": "/secure/Dashboard\\.jspa", + "html": "Powered by\\s+<a href=[^>]+atlassian\\.com/(?:software/jira|jira-bug-tracking/)[^>]+>Atlassian\\s+JIRA(?:[^v]*v(?:ersion: )?(\\d+\\.\\d+(\\.\\d+)?))?\\;version:\\1", "implies": "Java" }, "AWStats": { "website": "awstats.sourceforge.net", "cats": [ 10 ], - "meta": { "generator": "AWStats ([\\d.]+( \\(build [\\d.]+\\))?)\\;version:\\1" }, + "meta": { "generator": "AWStats ([\\d.]+(?: \\(?:build [\\d.]+\\))?)\\;version:\\1" }, "implies": "Perl" }, "Backbone.js": { - "website": "documentcloud.github.com\/backbone", + "website": "documentcloud.github.com/backbone", "cats": [ 12 ], "script": "backbone.*\\.js", "env": "^Backbone$", @@ -212,26 +251,32 @@ "Banshee": { "website": "www.banshee-php.org", "cats": [ 1, 18 ], - "html": "Built upon the <a href=\"[^>]+banshee-php\\.org\/\">[a-z]+<\/a>(v([\\d.]+))?\\;version:\\2", + "html": "Built upon the <a href=\"[^>]+banshee-php\\.org/\">[a-z]+</a>(?:v([\\d.]+))?\\;version:\\1", "implies": "PHP" }, + "BaseHTTP": { + "website": "docs.python.org/2/library/basehttpserver.html", + "cats": [ 22 ], + "headers": { "Server": "BaseHTTP\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" + }, "BIGACE": { "website": "bigace.de", "cats": [ 1 ], "meta": { "generator": "BIGACE ([\\d.]+)\\;version:\\1" }, - "html": "Powered by <a href=\"[^>]+BIGACE|<!--\\s+Site is running BIGACE", + "html": "(?:Powered by <a href=\"[^>]+BIGACE|<!--\\s+Site is running BIGACE)", "implies": "PHP" }, "Bigcommerce": { "website": "www.bigcommerce.com", "cats": [ 6 ], - "url": ".+\\.mybigcommerce\\.com", - "html": "<link href=[^>]+cdn\\d+\\.bigcommerce\\.com\/v", - "script": "cdn\\d+\\.bigcommerce\\.com\/v", + "url": "mybigcommerce\\.com", + "html": "<link href=[^>]+cdn\\d+\\.bigcommerce\\.com/v", + "script": "cdn\\d+\\.bigcommerce\\.com/v", "env": "^compareProducts$" }, "BigDump": { - "website": "www.ozerov.de\/bigdump.php", + "website": "www.ozerov.de/bigdump.php", "cats": [ 3 ], "html": "<!-- <h1>BigDump: Staggered MySQL Dump Importer ver\\. ([\\d.b]+)\\;version:\\1", "implies": "PHP" @@ -239,27 +284,36 @@ "Bigware": { "website": "bigware.de", "cats": [ 6 ], - "html": "Diese <a href=.+bigware\\.de|<a href=[^>]+\/main_bigware_\\d+\\.php", - "url": "(\\?|&)bigWAdminID=[a-z\\d]+(&|$)", - "headers": { "Set-Cookie": "bigwareCsid|bigWAdminID" }, + "html": "(?:Diese <a href=[^>]+bigware\\.de|<a href=[^>]+/main_bigware_\\d+\\.php)", + "url": "(?:\\?|&)bigWAdminID=", + "headers": { "Set-Cookie": "(?:bigwareCsid|bigWAdminID)" }, "implies": "PHP" }, "BittAds": { "website": "bittads.com", "cats": [ 36 ], - "script": "bittads\\.com\/js\/bitt\\.js$", + "script": "bittads\\.com/js/bitt\\.js$", "env": "^bitt$" }, "Blip.tv": { "website": "blip.tv", "cats": [ 14 ], - "html": "<(param|embed|iframe)[^>]+blip\\.tv\/play" + "html": "<(?:param|embed|iframe)[^>]+blip\\.tv/play" }, "Blogger": { "website": "www.blogger.com", "cats": [ 11 ], "meta": { "generator": "blogger" }, - "url": "^(www.)?.+\\.blogspot\\.com" + "url": "\\.blogspot\\.com" + }, + "Boa": { + "website": "www.boa.org", + "cats": [ 22 ], + "headers": { "Server": "Boa\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, + "Brother": { + "website": "www.brother.com", + "cats": [ 40 ] }, "BrowserCMS": { "website": "browsercms.org", @@ -285,6 +339,10 @@ "script": "CatalystScripts", "html": "<!-- BC_OBNW -->" }, + "Canon": { + "website": "www.canon.com", + "cats": [ 40 ] + }, "CakePHP": { "website": "cakephp.org", "cats": [ 18 ], @@ -296,17 +354,23 @@ "website": "cargocollective.com", "cats": [ 1 ], "meta": { "cargo_title": ".*" }, - "script": "\/cargo\\.", + "script": "/cargo\\.", "html": "<link [^>]+Cargo feed", "implies": "PHP" }, + "Catwalk": { + "website": "www.canon.com", + "cats": [ 22 ], + "headers": { "Server": "Catwalk\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Canon" + }, "CentOS": { "website": "centos.org", "cats": [ 28 ], "headers": { "Server": "CentOS", "X-Powered-By": "CentOS" } }, "CFML": { - "website": "adobe.com\/products\/coldfusion-family.html", + "website": "adobe.com/products/coldfusion-family.html", "cats": [ 27 ] }, "CacheFly": { @@ -323,7 +387,7 @@ "Chamilo": { "website": "www.chamilo.org", "cats": [ 21 ], - "html": "\">Chamilo ([\\d.]+)<\/a>\\;version:\\1", + "html": "\">Chamilo ([\\d.]+)</a>\\;version:\\1", "meta": { "generator": "Chamilo ([\\d.]+)\\;version:\\1" }, "headers": { "X-Powered-By": "Chamilo ([\\d.]+)\\;version:\\1" }, "implies": "PHP" @@ -332,12 +396,18 @@ "website": "chartbeat.com", "cats": [ 10 ], "html": "function loadChartbeat\\(\\) {", - "script": "chartbeat.js" + "script": "chartbeat\\.js" }, "Cherokee": { "website": "www.cherokee-project.com", "cats": [ 22 ], - "headers": { "Server": "Cherokee\/([\\d.]+)\\;version:\\1" } + "headers": { "Server": "Cherokee/([\\d.]+)\\;version:\\1" } + }, + "CherryPy": { + "website": "www.cherrypy.org", + "cats": [ 18, 22 ], + "headers": { "Server": "CherryPy\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" }, "CKEditor": { "website": "ckeditor.com", @@ -345,8 +415,13 @@ "env": "^CKEDITOR$", "implies": "PHP" }, + "Cloudera": { + "website": "www.cloudera.com", + "cats": [ 34 ], + "headers": { "Server": "cloudera" } + }, "ClickHeat": { - "website": "www.labsmedia.com\/clickheat\/index.html", + "website": "www.labsmedia.com/clickheat/index.html", "cats": [ 10 ], "script": "clickheat.*\\.js", "env": "^clickHeat", @@ -355,7 +430,7 @@ "ClickTale": { "website": "www.clicktale.com", "cats": [ 10 ], - "html": "if\\(typeof ClickTale(Tag)*==\"function\"\\)", + "html": "if\\(typeof ClickTale(Tag)*==\\\"function\\\"\\)", "env": "^ClickTale" }, "Clicky": { @@ -377,7 +452,7 @@ "implies": "PHP" }, "CMSimple": { - "website": "www.cmsimple.org\/en", + "website": "www.cmsimple.org/en", "cats": [ 1 ], "meta": { "generator": "CMSimple( [\\d.]+)?\\;version:\\1" }, "implies": "PHP" @@ -385,36 +460,46 @@ "CO2Stats": { "website": "co2stats.com", "cats": [ 10 ], - "html": "src=[^>]+co2stats\\.com\/propres\\.php" + "html": "src=[^>]+co2stats\\.com/propres\\.php" }, "CodeIgniter": { "website": "codeigniter.com", "cats": [ 18 ], - "headers": { "Set-Cookie": "(exp_last_activity|exp_tracker|ci_session)" }, + "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker|ci_session)" }, "implies": "PHP" }, + "CodeMirror": { + "website": "codemirror.net", + "cats": [ 19 ], + "env": "^CodeMirror$" + }, "Commerce Server": { "website": "commerceserver.net", "cats": [ 6 ], "headers": { "COMMERCE-SERVER-SOFTWARE": ".+" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "implies": "Microsoft ASP.NET" + }, + "CompaqHTTPServer": { + "website": "www.hp.com", + "cats": [ 22 ], + "headers": { "Server": "CompaqHTTPServer\\/?([\\d\\.]+)?\\;version:\\1" } }, "comScore": { "website": "comscore.com", "cats": [ 10 ], - "html": "<i{1}frame[^>]* (id=\"comscore\"|scr=[^>]+comscore)", + "html": "<iframe[^>]* (?:id=\"comscore\"|scr=[^>]+comscore)", "env": "^_?COMSCORE$" }, "Concrete5": { "website": "concrete5.org", "cats": [ 1 ], - "script": "concrete\/js\/", + "script": "concrete/js/", "meta": { "generator": "concrete5 - ([\\d.ab]+)\\;version:\\1" }, "env": "^CCM_IMAGE_PATH$", "implies": "PHP" }, "Connect": { - "website": "www.senchalabs.org\/connect", + "website": "www.senchalabs.org/connect", "cats": [ 18 ], "headers": { "X-Powered-By": "^Connect$" }, "implies": "node.js" @@ -422,25 +507,31 @@ "Contao": { "website": "contao.org", "cats": [ 1 ], - "html": "(<!--.+powered by (TYPOlight|Contao)-->|<link[^>]+(typolight|contao)\\.css)", + "html": "(?:<!--[^>]+powered by (?:TYPOlight|Contao)-->|<link[^>]+(?:typolight|contao)\\.css)", "implies": "PHP" }, "Contenido": { - "website": "contenido.org\/en", + "website": "contenido.org/en", "cats": [ 1 ], "meta": { "generator": "Contenido ([\\d.]+)\\;version:\\1" }, "implies": "PHP" }, "Contens": { - "website": "www.contens.com\/en\/pub\/index.cfm", + "website": "www.contens.com/en/pub/index.cfm", "cats": [ 1 ], "meta": { "generator": "Contensis CMS Version ([\\d.]+)\\;version:\\1" }, "implies": [ "Java", "CFML" ] }, + "ContentBox": { + "website": "www.gocontentbox.org", + "cats": [ 1, 11 ], + "meta": { "generator": "ContentBox powered by ColdBox" }, + "implies": "Adobe ColdFusion" + }, "ConversionLab": { - "website": "www.trackset.it\/conversionlab", + "website": "www.trackset.it/conversionlab", "cats": [ 10 ], - "script": "conversionlab\\.trackset\\.com\/track\/tsend\\.js" + "script": "conversionlab\\.trackset\\.com/track/tsend\\.js" }, "Coppermine": { "website": "coppermine-gallery.net", @@ -462,12 +553,12 @@ "CouchDB": { "website": "couchdb.apache.org", "cats": [ 22 ], - "headers": { "Server": "CouchDB\/([\\d.]+)\\;version:\\1" } + "headers": { "Server": "CouchDB/([\\d.]+)\\;version:\\1" } }, "cPanel": { "website": "www.cpanel.net", "cats": [ 9 ], - "headers": { "Server": "cpsrvd\/([\\d.]+)\\;version:\\1" }, + "headers": { "Server": "cpsrvd/([\\d.]+)\\;version:\\1" }, "html": "<!-- cPanel" }, "CPG Dragonfly": { @@ -481,40 +572,25 @@ "website": "crazyegg.com", "cats": [ 10 ], "env": "^CE2$", - "script": "cetrk\\.com\/pages\/scripts\/\\d+\/\\d+\\.js" + "script": "cetrk\\.com/pages/scripts/\\d+/\\d+\\.js" }, "Cross Pixel": { "website": "datadesk.crsspxl.com", "cats": [ 10 ], "env": "^crsspxl$", - "script": "tag\\.crsspxl\\.com\/s1\\.js" + "script": "tag\\.crsspxl\\.com/s1\\.js" }, "CS Cart": { "website": "www.cs-cart.com", "cats": [ 6 ], "env": "^fn_compare_strings$", - "html": " Powered by (<a href=[^>]+cs-cart\\.com|CS-Cart)", + "html": " Powered by (?:<a href=[^>]+cs-cart\\.com|CS-Cart)", "implies": "PHP" }, - "Adobe ColdFusion": { - "website": "adobe.com\/products\/coldfusion-family.html", - "cats": [ 18 ], - "url": "\\.cfm$", - "html": "<!-- START headerTags\\.cfm", - "script": "\/cfajax\/", - "env": "^_cfEmails$", - "implies": "CFML" - }, - "ContentBox": { - "website": "www.gocontentbox.org", - "cats": [ 1, 11 ], - "meta": { "generator": "ContentBox powered by ColdBox" }, - "implies": "Adobe ColdFusion" - }, "CubeCart": { "website": "www.cubecart.com", "cats": [ 6 ], - "html": "(Powered by <a href=[^>]+cubecart\\.com|<p[^>]+>Powered by CubeCart)", + "html": "(?:Powered by <a href=[^>]+cubecart\\.com|<p[^>]+>Powered by CubeCart)", "meta": { "generator": "cubecart" }, "implies": "PHP" }, @@ -525,9 +601,9 @@ "env": "^Cufon$" }, "d3": { - "website": "mbostock.github.com\/d3", + "website": "mbostock.github.com/d3", "cats": [ 25 ], - "script": "d3(\\.v2)(\\.min)?\\.js" + "script": "d3(?:\\.v2)?(?:\\.min)?\\.js" }, "Dancer": { "website": "perldancer.org", @@ -542,10 +618,10 @@ "meta": { "generator": "Danneo CMS ([\\d.]+)\\;version:\\1" }, "implies": [ "Apache", "PHP" ] }, - "dashCommerce": { - "website": "dashcommerce.org", - "cats": [ 6 ], - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "Darwin": { + "website": "opensource.apple.com", + "cats": [ 28 ], + "headers": { "Server": "Darwin", "X-Powered-By": "Darwin" } }, "DataLife Engine": { "website": "dle-news.ru", @@ -557,13 +633,18 @@ "David Webbox": { "website": "www.tobit.com", "cats": [ 22 ], - "headers": { "Server": "David-WebBox\/([\\d.a]+ \\(\\d+\\))\\;version:\\1" } + "headers": { "Server": "David-WebBox/([\\d.a]+ \\(\\d+\\))\\;version:\\1" } }, "Debian": { "website": "debian.org", "cats": [ 28 ], - "headers": { "Server": "Debian", "X-Powered-By": "(Debian|dotdeb|(sarge|etch|lenny|queeze|wheezy|jessie))\\;version:\\2" - } + "headers": { "Server": "Debian", "X-Powered-By": "(?:Debian|dotdeb|(sarge|etch|lenny|squeeze|wheezy|jessie))\\;version:\\1" } + }, + "debut": { + "website": "www.brother.com", + "cats": [ 22 ], + "headers": { "Server": "debut\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Brother" }, "DedeCMS": { "website": "dedecms.com", @@ -572,11 +653,15 @@ "script": "dedeajax", "implies": "PHP" }, + "Dell": { + "website": "dell.com", + "cats": [ 40 ] + }, "Demandware": { "website": "demandware.com", "cats": [ 6 ], "headers": { "Server": "Demandware eCommerce Server" }, - "html": "<[^>]+demandware.edgesuite", + "html": "<[^>]+demandware\\.edgesuite", "env": "^dwAnalytics$" }, "DHTMLX": { @@ -587,7 +672,7 @@ "DirectAdmin": { "website": "www.directadmin.com", "cats": [ 9 ], - "html": "<a[^>]+>DirectAdmin<\/a> Web Control Panel", + "html": "<a[^>]+>DirectAdmin</a> Web Control Panel", "headers": { "Server": "DirectAdmin Daemon v([\\d.]+)\\;version:\\1" }, "implies": [ "PHP", "Apache" ] }, @@ -601,28 +686,28 @@ "Django": { "website": "djangoproject.com", "cats": [ 18 ], - "html": "(powered by <a[^>]+>Django ?([\\d.]+)?|<div style=\"display:none\"><input name=\"csrfmiddlewaretoken\" value=\"[a-z0-9]{32}\" type=\"hidden\"><\/div>)\\;version:\\2", + "html": "(?:powered by <a[^>]+>Django ?([\\d.]+)?|<div style=\"display:none\"><input name=\"csrfmiddlewaretoken\" value=\"[a-z0-9]{32}\" type=\"hidden\"></div>)\\;version:\\1", "env": "^__admin_media_prefix__", "implies": "Python" }, "Django CMS": { "website": "django-cms.org", "cats": [ 1 ], - "script": "media\/cms\/js\/csrf\\.js", + "script": "media/cms/js/csrf\\.js", "headers": { "Set-Cookie": "django[^;]=" }, "implies": "Django" }, "Dojo": { "website": "dojotoolkit.org", "cats": [ 12 ], - "script": "([\\d.]+)\/dojo\/dojo(\\.xd)?\\.js\\;version:\\1", + "script": "([\\d.]+)/dojo/dojo(?:\\.xd)?\\.js\\;version:\\1", "env": "^dojo$" }, "Dokeos": { "website": "dokeos.com", "cats": [ 21 ], "meta": { "generator": "Dokeos" }, - "html": "Portal <a[^>]+>Dokeos|@import \"[^\"]+dokeos_blue", + "html": "(?:Portal <a[^>]+>Dokeos|@import \"[^\"]+dokeos_blue)", "headers": { "X-Powered-By": "Dokeos" }, "implies": [ "PHP", "Xajax", "jQuery", "CKEditor" ] }, @@ -637,37 +722,41 @@ "website": "dotnetnuke.com", "cats": [ 1 ], "meta": { "generator": "DotNetNuke" }, - "headers": { "X-Compressed-By": "DotNetNuke", "Set-Cookie": "DotNetNukeAnonymous=.+" - }, + "headers": { "X-Compressed-By": "DotNetNuke", "Set-Cookie": "DotNetNukeAnonymous=" }, "html": "<!-- by DotNetNuke Corporation", "env": "^DotNetNuke$", "implies": "Microsoft ASP.NET" }, "Doxygen": { - "website": "stack.nl\/~dimitri\/doxygen", + "website": "stack.nl/~dimitri/doxygen", "cats": [ 4 ], - "html": "(<!-- Generated by Doxygen ([\\d.]+)|<link[^>]+doxygen.css)\\;version:\\1" + "html": "(?:<!-- Generated by Doxygen ([\\d.]+)|<link[^>]+doxygen.css)\\;version:\\1" }, "DreamWeaver": { - "website": "www.adobe.com\/products\/dreamweaver", + "website": "www.adobe.com/products/dreamweaver", "cats": [ 20 ], - "html": "(<!--[^>]*(InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) {)\\;version:\\3" + "html": "(?:<!--[^>]*(?:InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) {)\\;version:\\1" }, "Drupal": { "website": "drupal.org", "cats": [ 1 ], "script": "drupal\\.js", - "html": "<(link|style)[^>]+sites\/(default|all)\/(themes|modules)\/", - "headers": { "X-Drupal-Cache": ".*", "X-Generator": "Drupal(\\s([\\d.]+))?\\;version:\\2", "Expires": "19 Nov 1978" }, + "html": "<(?:link|style)[^>]+sites/(?:default|all)/(?:themes|modules)/", + "headers": { "X-Drupal-Cache": ".*", "X-Generator": "Drupal(?:\\s([\\d.]+))?\\;version:\\1", "Expires": "19 Nov 1978" }, "env": "^Drupal$", "implies": "PHP" }, "Drupal Commerce": { "website": "drupalcommerce.org", "cats": [ 6 ], - "html": "id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field", + "html": "(?:id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field)", "implies": "Drupal" }, + "dwhttpd": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "dwhttpd\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, "Dynamicweb": { "website": "www.dynamicweb.dk", "cats": [ 1, 6, 10 ], @@ -679,29 +768,47 @@ "website": "e107.org", "cats": [ 1 ], "script": "e107\\.js", - "headers": { "Set-Cookie": "e107_td[^;]+=" }, + "headers": { "Set-Cookie": "e107_tz[^;]+=", "X-Powered-By": "e107" }, "implies": "PHP" }, "EdgeCast": { "website": "www.edgecast.com", "cats": [ 31 ], - "headers": { "Server": "^ECS" } + "headers": { "Server": "^EC(?:S|Acc)" }, + "url": "https?://(?:[^/]+\\.)?edgecastcdn\\.net/" + }, + "eHTTP": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "\\beHTTP( v?([\\d\\.]+))?\\;version:\\2" }, + "implies": [ "HP ProCurve"] + }, + "ELOG": { + "website": "midas.psi.ch/elog", + "cats": [ 19 ], + "html": "<title>ELOG Logbook Selection" + }, + "ELOG HTTP": { + "website": "midas.psi.ch/elog", + "cats": [ 22 ], + "headers": { "Server": "ELOG HTTP( \\d[\\-\\d\\.]+)?\\;version:\\1" }, + "implies": "ELOG" }, "Eloqua": { "website": "eloqua.com", "cats": [ 32 ], "script": "elqCfg\\.js", - "env": "^elq(SiteID|Load|CurESite)$" + "env": "^elq(?:SiteID|Load|CurESite)$" }, "Embedthis-http": { - "website": "github.com\/embedthis\/http", + "website": "github.com/embedthis/http", "cats": [ 22 ], - "headers": { "Server": "Embedthis-http(\/([\\d.]+))?\\;version:\\2" } + "headers": { "Server": "Embedthis-http(?:/([\\d.]+))?\\;version:\\1" } }, "E-Merchant": { "website": "e-merchant.com", "cats": [ 6 ], - "script": "cdn.e-merchant.com" + "script": "cdn\\.e-merchant\\.com" }, "Enyo": { "website": "enyojs.com", @@ -713,8 +820,8 @@ "website": "episerver.com", "cats": [ 1 ], "meta": { "generator": "EPiServer" }, - "headers": { "Set-Cookie": "EPi(Trace|Server)[^;]*=" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "headers": { "Set-Cookie": "EPi(?:Trace|Server)[^;]*=" }, + "implies": "Microsoft ASP.NET" }, "EPrints": { "website": "www.eprints.org", @@ -723,6 +830,11 @@ "env": "^EPJS_menu_template$", "implies": "Perl" }, + "Erlang": { + "website": "www.erlang.org", + "cats": [ 27 ], + "headers": { "Server": "Erlang( OTP/([\\-\\d\\.ABR]+))?\\;version:\\1" } + }, "eSyndiCat": { "website": "esyndicat.com", "cats": [ 1 ], @@ -731,8 +843,14 @@ "env": "^esyndicat$", "implies": [ "PHP" ] }, + "EWS-NIC4": { + "website": "dell.com", + "cats": [ 22 ], + "headers": { "Server": "EWS-NIC4(\\/([\\d\\.a-z]+))?\\;version:\\2" }, + "implies": "Dell" + }, "Exhibit": { - "website": "simile-widgets.org\/exhibit\/", + "website": "simile-widgets.org/exhibit/", "cats": [ 25 ], "script": "exhibit.*\\.js", "env": "^Exhibit$" @@ -746,7 +864,7 @@ "ExpressionEngine": { "website": "expressionengine.com", "cats": [ 1 ], - "headers": { "Set-Cookie": "(exp_last_activity|exp_tracker)" }, + "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker)" }, "implies": "PHP" }, "ExtJS": { @@ -767,17 +885,17 @@ "cats": [ 29 ], "html": "", + "html": "(?:]* href=\"templates/gambio/|]content\\.php\\?coID=\\d|)", "implies": "PHP" }, "Gauges": { "website": "get.gaug.es", "cats": [ 10 ], "headers": { "Set-Cookie": "_gauges_[^;]+=" }, - "html": "t\\.src = '\/\/secure\\.gaug\\.es\/track\\.js", "env": "^_gauges$" }, "Gentoo": { "website": "www.gentoo.org", "cats": [ 28 ], - "headers": { "X-Powered-By": "-?gentoo" } + "headers": { "X-Powered-By": "gentoo" } }, "Get Satisfaction": { "website": "getsatisfaction.com", @@ -858,57 +979,57 @@ "implies": "PHP" }, "GoAhead": { - "website": "embedthis.com\/products\/goahead\/index.html", + "website": "embedthis.com/products/goahead/index.html", "cats": [ 22 ], "headers": { "Server": "GoAhead" } }, "Google Analytics": { - "website": "google.com\/analytics", + "website": "google.com/analytics", "cats": [ 10 ], "html": "_gaq\\.push\\(\\['_setAccount", - "script": "(\\.google-analytics\\.com\/ga\\.js|google-analytics\\.com\/urchin\\.js)", + "script": "(?:\\.google-analytics\\.com/ga\\.js|google-analytics\\.com/urchin\\.js)", "headers": { "Set-Cookie": "__utma" }, "env": "^gaGlobal$" }, "Google App Engine": { - "website": "code.google.com\/appengine", + "website": "code.google.com/appengine", "cats": [ 22 ], "headers": { "Server": "Google Frontend" } }, "Google Code Prettify": { - "website": "code.google.com\/p\/google-code-prettify", + "website": "code.google.com/p/google-code-prettify", "cats": [ 19 ], "env": "^prettyPrint$" }, "Google Font API": { - "website": "code.google.com\/apis\/webfonts", + "website": "code.google.com/apis/webfonts", "cats": [ 17 ], - "script": "googleapis.com\/.+webfont", + "script": "googleapis\\.com/.+webfont", "html": "]* href=[^>]+fonts\\.googleapis\\.com", "env": "^WebFonts$" }, "Google Maps": { "website": "maps.google.com", "cats": [ 35 ], - "script": "(maps\\.google\\.com\/maps\\?file=api(&v=([\\d.]+))?|maps\\.google\\.com\/maps\/api\/staticmap)\\;version:API v\\3" + "script": "(?:maps\\.google\\.com/maps\\?file=api(?:&v=([\\d.]+))?|maps\\.google\\.com/maps/api/staticmap)\\;version:API v\\1" }, "Google PageSpeed": { - "website": "developers.google.com\/speed\/pagespeed\/mod", + "website": "developers.google.com/speed/pagespeed/mod", "cats": [ 23, 33 ], "headers": { "X-Mod-Pagespeed": "([\\d.]+)\\;version:\\1" } }, "Google Sites": { "website": "sites.google.com", "cats": [ 1 ], - "url": "sites.google.com" + "url": "sites\\.google\\.com" }, "Google Tag Manager": { - "website": "www.google.com\/tagmanager", + "website": "www.google.com/tagmanager", "cats": [ 19 ], - "html": "googletagmanager\\.com\/ns\\.html[^>]+><\/iframe>" + "html": "googletagmanager\\.com/ns\\.html[^>]+>" }, "Google Web Toolkit": { - "website": "developers.google.com\/web-toolkit", + "website": "developers.google.com/web-toolkit", "cats": [ 18 ], "env": "^__gwt_", "implies": "Java" @@ -916,15 +1037,20 @@ "GoStats": { "website": "gostats.com", "cats": [ 10 ], - "env": "^_go(stats|_track)" + "env": "^_go(?:stats|_track)" }, "Graffiti CMS": { "website": "graffiticms.codeplex.com", "cats": [ 1 ], "meta": { "generator": "Graffiti CMS ([^\"]+)\\;version:\\1" }, - "script": "\/graffiti.js", + "script": "/graffiti\\.js", "headers": { "Set-Cookie": "graffitibot[^;]=" } }, + "Grandstream": { + "website": "www.grandstream.com", + "cats": [ 22, 39 ], + "headers": { "Server": "Grandstream\\/?([\\d\\.]+)?\\;version:\\1" } + }, "Gravatar": { "website": "gravatar.com", "cats": [ 19 ], @@ -933,7 +1059,6 @@ "Gravity Insights": { "website": "insights.gravity.com", "cats": [ 10 ], - "html": "gravityInsightsParams\\.site_guid = '", "env": "^GravityInsights$" }, "G-WAN": { @@ -942,9 +1067,9 @@ "headers": { "Server": "G-WAN" } }, "GX WebManager": { - "website": "www.gxsoftware.com\/en\/products\/web-content-management.htm", + "website": "www.gxsoftware.com/en/products/web-content-management.htm", "cats": [ 1 ], - "meta": { "generator": "GX WebManager( ([\\d.]+))?\\;version:\\2" }, + "meta": { "generator": "GX WebManager(?: ([\\d.]+))?\\;version:\\1" }, "html": "", + "meta": { "eomportal-instanceid": "[0-9]+", "eomportal-id": "[0-9]+", "eomportal-loid": "[0-9.]+", "eomportal-uuid": "[a-f0-9]+", "eomportal-lastUpdate": ".*" } }, "Microsoft ASP.NET": { "website": "www.asp.net", "cats": [ 18 ], "url": "\\.aspx$", "html": "]+name=\"__VIEWSTATE", - "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" - }, - "implies": [ "IIS", "Windows Server" ] + "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" }, + "implies": "IIS\\;confidence:50" }, "Microsoft SharePoint": { "website": "sharepoint.microsoft.com", @@ -1383,18 +1566,29 @@ "cats": [ 2 ], "html": "]+minibb.+\\s+", + "html": "", "env": "^_?owa_" }, "OneStat": { "website": "www.onestat.com", "cats": [ 10 ], - "html": "var p==.+stat\\.onestat\\.com\/stat\\.aspx\\?tagver" + "html": "var p==.+stat\\.onestat\\.com/stat\\.aspx\\?tagver" }, "OpenCart": { "website": "www.opencart.com", "cats": [ 6 ], - "html": "index\\.php\\?route=[a-z]+\/|Powered By ]+OpenCart", + "html": "(?:index\\.php\\?route=[a-z]+/|Powered By ]+OpenCart)", "implies": "PHP" }, "openEngine": { - "website": "openengine.de\/html\/pages\/de\/", + "website": "openengine.de/html/pages/de/", "cats": [ 1 ], - "html": "]+openEngine" }, "OpenGrok": { - "website": "hub.opensolaris.org\/bin\/view\/Project+opengrok\/WebHome", + "meta": "openEngine" + }, + "OpenGrok": { + "website": "hub.opensolaris.org/bin/view/Project+opengrok/WebHome", "cats": [ 19 ], "headers": { "Set-Cookie": "OpenGrok" }, - "meta": { "generator": "OpenGrok( v?([\\d.]+))?\\;version:\\2" }, + "meta": { "generator": "OpenGrok(?: v?([\\d.]+))?\\;version:\\1" }, "implies": "Java" }, "OpenGSE": { - "website": "code.google.com\/p\/opengse", + "website": "code.google.com/p/opengse", "cats": [ 22 ], "headers": { "Server": "GSE" }, "implies": "Java" @@ -1624,14 +1838,14 @@ "env": "^OpenLayers$" }, "OpenNemas": { - "website": "openhost.es\/en\/opennemas", + "website": "openhost.es/en/opennemas", "cats": [ 1 ], "headers": { "X-Powered-By": "OpenNemas" } }, "OpenSSL": { "website": "openssl.org", "cats": [ 33 ], - "headers": { "Server": "OpenSSL(\/([\\d.]+[a-z]?))?\\;version:\\2" } + "headers": { "Server": "OpenSSL(?:/([\\d.]+[a-z]?))?\\;version:\\1" } }, "OpenText Web Solutions": { "website": "websolutions.opentext.com", @@ -1645,19 +1859,19 @@ "env": "^optimizely$" }, "Oracle Application Server": { - "website": "www.oracle.com\/technetwork\/middleware\/ias\/overview\/index.html", + "website": "www.oracle.com/technetwork/middleware/ias/overview/index.html", "cats": [ 22 ], - "headers": { "Server": "Oracle(-| )Application(-| )Server((-| )(\\d+[a-z]?))?\\;version:\\5" } + "headers": { "Server": "Oracle\\bApplication\\bServer(?:\\b(\\d+[a-z]?))?\\;version:\\1" } }, "Oracle Recommendations On Demand": { - "website": "www.oracle.com\/us\/products\/applications\/commerce\/recommendations-on-demand\/index.html?", + "website": "www.oracle.com/us/products/applications/commerce/recommendations-on-demand/index.html", "cats": [ 10 ], "script": "atgsvcs.+atgsvcs\\.js" }, "osCommerce": { "website": "www.oscommerce.com", "cats": [ 6 ], - "html": "(]*(\\?|&)osCsid|Powered by (<[^]+>)?osCommerce<\/a>|<[^]+class=\"[^>]*infoBoxHeading)", + "html": "(?:]*(?:\\?|&)osCsid|Powered by (?:<[^]+>)?osCommerce|<[^]+class=\"[^>]*infoBoxHeading)", "headers": { "Set-Cookie": "osCsid=" } }, "osCSS": { @@ -1668,31 +1882,30 @@ "Outbrain": { "website": "outbrain.com", "cats": [ 5 ], - "html": "var OB_langJS = '.+widgets\\.outbrain\\.com\/lang_", - "script": "widgets\\.outbrain\\.com\/outbrain\\.js", - "env": "^OutbrainPermaLink$" + "script": "widgets\\.outbrain\\.com/outbrain\\.js", + "env": "^(?:OutbrainPermaLink|OB_releaseVer)$" }, "OXID eShop": { "website": "oxid-esales.com", "cats": [ 6 ], - "html": "", "implies": "Java" }, @@ -2649,6 +2924,11 @@ "website": "foundation.zurb.com", "cats": [ 18 ], "html": "]+foundation[^>\"]+css" + }, + "LiveStreet CMS": { + "website": "livestreetcms.com", + "cats": [ 1 ], + "headers": { "X-Powered-By": "LiveStreet CMS" } } } } diff --git a/drivers/firefox-jetpack/images/icons/3DM.png b/drivers/firefox-jetpack/images/icons/3DM.png new file mode 100755 index 000000000..69e17bcb4 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/3DM.png differ diff --git a/drivers/firefox-jetpack/images/icons/3ware.png b/drivers/firefox-jetpack/images/icons/3ware.png new file mode 100755 index 000000000..69e17bcb4 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/3ware.png differ diff --git a/drivers/firefox-jetpack/images/icons/ATEN.png b/drivers/firefox-jetpack/images/icons/ATEN.png new file mode 100755 index 000000000..f15a46b5f Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/ATEN.png differ diff --git a/drivers/firefox-jetpack/images/icons/Apache HBase.png b/drivers/firefox-jetpack/images/icons/Apache HBase.png new file mode 100644 index 000000000..113d901a6 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Apache HBase.png differ diff --git a/drivers/firefox-jetpack/images/icons/Apache Hadoop.png b/drivers/firefox-jetpack/images/icons/Apache Hadoop.png new file mode 100755 index 000000000..39075d893 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Apache Hadoop.png differ diff --git a/drivers/firefox-jetpack/images/icons/Backbone.js.png b/drivers/firefox-jetpack/images/icons/Backbone.js.png index 7d774c810..d45b1b17b 100644 Binary files a/drivers/firefox-jetpack/images/icons/Backbone.js.png and b/drivers/firefox-jetpack/images/icons/Backbone.js.png differ diff --git a/drivers/firefox-jetpack/images/icons/BaseHTTP.png b/drivers/firefox-jetpack/images/icons/BaseHTTP.png new file mode 100755 index 000000000..68b9f6bfc Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/BaseHTTP.png differ diff --git a/drivers/firefox-jetpack/images/icons/Boa.png b/drivers/firefox-jetpack/images/icons/Boa.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Boa.png differ diff --git a/drivers/firefox-jetpack/images/icons/Brother.png b/drivers/firefox-jetpack/images/icons/Brother.png new file mode 100755 index 000000000..fbc41595e Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Brother.png differ diff --git a/drivers/firefox-jetpack/images/icons/Canon.png b/drivers/firefox-jetpack/images/icons/Canon.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Canon.png differ diff --git a/drivers/firefox-jetpack/images/icons/Catwalk.png b/drivers/firefox-jetpack/images/icons/Catwalk.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Catwalk.png differ diff --git a/drivers/firefox-jetpack/images/icons/Chartbeat.png b/drivers/firefox-jetpack/images/icons/Chartbeat.png new file mode 100644 index 000000000..2cb597cc7 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Chartbeat.png differ diff --git a/drivers/firefox-jetpack/images/icons/CherryPy.png b/drivers/firefox-jetpack/images/icons/CherryPy.png new file mode 100755 index 000000000..badc40ac2 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/CherryPy.png differ diff --git a/drivers/firefox-jetpack/images/icons/Cloudera.png b/drivers/firefox-jetpack/images/icons/Cloudera.png new file mode 100755 index 000000000..4d3a6a1d4 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Cloudera.png differ diff --git a/drivers/firefox-jetpack/images/icons/CodeMirror.png b/drivers/firefox-jetpack/images/icons/CodeMirror.png new file mode 100644 index 000000000..ef34d402c Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/CodeMirror.png differ diff --git a/drivers/firefox-jetpack/images/icons/CompaqHTTPServer.png b/drivers/firefox-jetpack/images/icons/CompaqHTTPServer.png new file mode 100755 index 000000000..2b0bc39df Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/CompaqHTTPServer.png differ diff --git a/drivers/firefox-jetpack/images/icons/Cufon.png b/drivers/firefox-jetpack/images/icons/Cufon.png new file mode 100644 index 000000000..cd2e3f029 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Cufon.png differ diff --git a/drivers/firefox-jetpack/images/icons/Darwin.png b/drivers/firefox-jetpack/images/icons/Darwin.png new file mode 100755 index 000000000..41b6c8b00 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Darwin.png differ diff --git a/drivers/firefox-jetpack/images/icons/Dell.png b/drivers/firefox-jetpack/images/icons/Dell.png new file mode 100755 index 000000000..76a80b4fa Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Dell.png differ diff --git a/drivers/firefox-jetpack/images/icons/ELOG HTTP.png b/drivers/firefox-jetpack/images/icons/ELOG HTTP.png new file mode 100644 index 000000000..7af2b77e9 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/ELOG HTTP.png differ diff --git a/drivers/firefox-jetpack/images/icons/ELOG.png b/drivers/firefox-jetpack/images/icons/ELOG.png new file mode 100644 index 000000000..7af2b77e9 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/ELOG.png differ diff --git a/drivers/firefox-jetpack/images/icons/EWS-NIC4.png b/drivers/firefox-jetpack/images/icons/EWS-NIC4.png new file mode 100755 index 000000000..76a80b4fa Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/EWS-NIC4.png differ diff --git a/drivers/firefox-jetpack/images/icons/Erlang.png b/drivers/firefox-jetpack/images/icons/Erlang.png new file mode 100755 index 000000000..235338617 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Erlang.png differ diff --git a/drivers/firefox-jetpack/images/icons/FlashCom.png b/drivers/firefox-jetpack/images/icons/FlashCom.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/FlashCom.png differ diff --git a/drivers/firefox-jetpack/images/icons/Grandstream.png b/drivers/firefox-jetpack/images/icons/Grandstream.png new file mode 100755 index 000000000..b4b1eb66b Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Grandstream.png differ diff --git a/drivers/firefox-jetpack/images/icons/HP ProCurve.png b/drivers/firefox-jetpack/images/icons/HP ProCurve.png new file mode 100755 index 000000000..2b0bc39df Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/HP ProCurve.png differ diff --git a/drivers/firefox-jetpack/images/icons/Highstock.png b/drivers/firefox-jetpack/images/icons/Highstock.png new file mode 100755 index 000000000..6e8391d36 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Highstock.png differ diff --git a/drivers/firefox-jetpack/images/icons/Indico.png b/drivers/firefox-jetpack/images/icons/Indico.png new file mode 100755 index 000000000..02636b6cc Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Indico.png differ diff --git a/drivers/firefox-jetpack/images/icons/Intercom.png b/drivers/firefox-jetpack/images/icons/Intercom.png new file mode 100644 index 000000000..40d2321a0 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Intercom.png differ diff --git a/drivers/firefox-jetpack/images/icons/Jetty.png b/drivers/firefox-jetpack/images/icons/Jetty.png new file mode 100755 index 000000000..807b88634 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Jetty.png differ diff --git a/drivers/firefox-jetpack/images/icons/KS_HTTP.png b/drivers/firefox-jetpack/images/icons/KS_HTTP.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/KS_HTTP.png differ diff --git a/drivers/firefox-jetpack/images/icons/LabVIEW.png b/drivers/firefox-jetpack/images/icons/LabVIEW.png new file mode 100755 index 000000000..c832bdc54 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/LabVIEW.png differ diff --git a/drivers/firefox-jetpack/images/icons/Less.png b/drivers/firefox-jetpack/images/icons/Less.png new file mode 100644 index 000000000..9e1de2359 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Less.png differ diff --git a/drivers/firefox-jetpack/images/icons/LiveStreet CMS.png b/drivers/firefox-jetpack/images/icons/LiveStreet CMS.png new file mode 100644 index 000000000..75a0029aa Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/LiveStreet CMS.png differ diff --git a/drivers/firefox-jetpack/images/icons/Logitech Media Server.png b/drivers/firefox-jetpack/images/icons/Logitech Media Server.png new file mode 100755 index 000000000..b2e6cb1f2 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Logitech Media Server.png differ diff --git a/drivers/firefox-jetpack/images/icons/MOBOTIX.png b/drivers/firefox-jetpack/images/icons/MOBOTIX.png new file mode 100755 index 000000000..321f9a8b1 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/MOBOTIX.png differ diff --git a/drivers/firefox-jetpack/images/icons/MiniServ.png b/drivers/firefox-jetpack/images/icons/MiniServ.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/MiniServ.png differ diff --git a/drivers/firefox-jetpack/images/icons/Mono.png b/drivers/firefox-jetpack/images/icons/Mono.png new file mode 100644 index 000000000..912809eb2 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Mono.png differ diff --git a/drivers/firefox-jetpack/images/icons/PerfSONAR-PS.png b/drivers/firefox-jetpack/images/icons/PerfSONAR-PS.png new file mode 100755 index 000000000..13be42d00 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/PerfSONAR-PS.png differ diff --git a/drivers/firefox-jetpack/images/icons/Posterous.png b/drivers/firefox-jetpack/images/icons/Posterous.png new file mode 100644 index 000000000..3150f4f93 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Posterous.png differ diff --git a/drivers/firefox-jetpack/images/icons/Prefix-Free.png b/drivers/firefox-jetpack/images/icons/Prefix-Free.png new file mode 100644 index 000000000..87a646815 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Prefix-Free.png differ diff --git a/drivers/firefox-jetpack/images/icons/SAP.png b/drivers/firefox-jetpack/images/icons/SAP.png new file mode 100644 index 000000000..9217c8f87 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/SAP.png differ diff --git a/drivers/firefox-jetpack/images/icons/Sentinel Keys Server.png b/drivers/firefox-jetpack/images/icons/Sentinel Keys Server.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Sentinel Keys Server.png differ diff --git a/drivers/firefox-jetpack/images/icons/Sentinel License Monitor.png b/drivers/firefox-jetpack/images/icons/Sentinel License Monitor.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Sentinel License Monitor.png differ diff --git a/drivers/firefox-jetpack/images/icons/Sentinel Protection Server.png b/drivers/firefox-jetpack/images/icons/Sentinel Protection Server.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Sentinel Protection Server.png differ diff --git a/drivers/firefox-jetpack/images/icons/Splunk.png b/drivers/firefox-jetpack/images/icons/Splunk.png new file mode 100755 index 000000000..bd2a1a514 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Splunk.png differ diff --git a/drivers/firefox-jetpack/images/icons/Splunkd.png b/drivers/firefox-jetpack/images/icons/Splunkd.png new file mode 100755 index 000000000..bd2a1a514 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Splunkd.png differ diff --git a/drivers/firefox-jetpack/images/icons/SunOS.png b/drivers/firefox-jetpack/images/icons/SunOS.png new file mode 100755 index 000000000..725070080 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/SunOS.png differ diff --git a/drivers/firefox-jetpack/images/icons/TWiki.png b/drivers/firefox-jetpack/images/icons/TWiki.png new file mode 100644 index 000000000..f6573b7fa Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/TWiki.png differ diff --git a/drivers/firefox-jetpack/images/icons/Underscore.js.png b/drivers/firefox-jetpack/images/icons/Underscore.js.png index 10262b99d..030496838 100644 Binary files a/drivers/firefox-jetpack/images/icons/Underscore.js.png and b/drivers/firefox-jetpack/images/icons/Underscore.js.png differ diff --git a/drivers/firefox-jetpack/images/icons/Wink.png b/drivers/firefox-jetpack/images/icons/Wink.png new file mode 100644 index 000000000..3e7204032 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Wink.png differ diff --git a/drivers/firefox-jetpack/images/icons/Wowza Media Server.png b/drivers/firefox-jetpack/images/icons/Wowza Media Server.png new file mode 100755 index 000000000..2e7c25e2b Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Wowza Media Server.png differ diff --git a/drivers/firefox-jetpack/images/icons/XAMPP.png b/drivers/firefox-jetpack/images/icons/XAMPP.png new file mode 100755 index 000000000..7104b0e4d Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/XAMPP.png differ diff --git a/drivers/firefox-jetpack/images/icons/Xajax.png b/drivers/firefox-jetpack/images/icons/Xajax.png new file mode 100644 index 000000000..bba0d40ab Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Xajax.png differ diff --git a/drivers/firefox-jetpack/images/icons/Zabbix.png b/drivers/firefox-jetpack/images/icons/Zabbix.png new file mode 100755 index 000000000..c7384dc3e Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/Zabbix.png differ diff --git a/drivers/firefox-jetpack/images/icons/debut.png b/drivers/firefox-jetpack/images/icons/debut.png new file mode 100755 index 000000000..fbc41595e Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/debut.png differ diff --git a/drivers/firefox-jetpack/images/icons/default.png b/drivers/firefox-jetpack/images/icons/default.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/default.png differ diff --git a/drivers/firefox-jetpack/images/icons/dwhttpd.png b/drivers/firefox-jetpack/images/icons/dwhttpd.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/dwhttpd.png differ diff --git a/drivers/firefox-jetpack/images/icons/eHTTP.png b/drivers/firefox-jetpack/images/icons/eHTTP.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/eHTTP.png differ diff --git a/drivers/firefox-jetpack/images/icons/libwww-perl-daemon.png b/drivers/firefox-jetpack/images/icons/libwww-perl-daemon.png new file mode 100755 index 000000000..2110788f2 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/libwww-perl-daemon.png differ diff --git a/drivers/firefox-jetpack/images/icons/mod_auth_pam.png b/drivers/firefox-jetpack/images/icons/mod_auth_pam.png new file mode 100755 index 000000000..d268dcca8 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/mod_auth_pam.png differ diff --git a/drivers/firefox-jetpack/images/icons/mod_jk.png b/drivers/firefox-jetpack/images/icons/mod_jk.png new file mode 100755 index 000000000..d268dcca8 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/mod_jk.png differ diff --git a/drivers/firefox-jetpack/images/icons/mod_perl.png b/drivers/firefox-jetpack/images/icons/mod_perl.png new file mode 100755 index 000000000..3f0559995 Binary files /dev/null and b/drivers/firefox-jetpack/images/icons/mod_perl.png differ diff --git a/drivers/firefox-jetpack/images/icons/posterous.png b/drivers/firefox-jetpack/images/icons/posterous.png index 3730d31aa..3150f4f93 100644 Binary files a/drivers/firefox-jetpack/images/icons/posterous.png and b/drivers/firefox-jetpack/images/icons/posterous.png differ diff --git a/drivers/firefox-jetpack/lib/wappalyzer.js b/drivers/firefox-jetpack/lib/wappalyzer.js index 6257ac81e..3bb3d9ad2 100644 --- a/drivers/firefox-jetpack/lib/wappalyzer.js +++ b/drivers/firefox-jetpack/lib/wappalyzer.js @@ -13,64 +13,64 @@ var wappalyzer = (function() { * Application class */ var Application = function(app, detected) { - var self = this; - - self.app = app; - self.confidence = {}; - self.confidenceTotal = 0; - self.detected = Boolean(detected); - self.version = ''; - self.versions = []; + this.app = app; + this.confidence = {}; + this.confidenceTotal = 0; + this.detected = Boolean(detected); + this.version = ''; + this.versions = []; + }; + Application.prototype = { /** * Calculate confidence total */ - self.getConfidence = function() { + getConfidence: function() { var total = 0; - for ( id in self.confidence ) { - total += self.confidence[id]; + for ( id in this.confidence ) { + total += this.confidence[id]; } - return self.confidenceTotal = Math.min(total, 100); - } + return this.confidenceTotal = Math.min(total, 100); + }, /** * Resolve version number (find the longest version number that contains all shorter detected version numbers) */ - self.getVersion = function() { - var next, resolved; + getVersion: function() { + var i, next, resolved; - if ( !self.versions.length ) { + if ( !this.versions.length ) { return; } - self.versions.sort(function(a, b) { + this.versions.sort(function(a, b) { return a.length > b.length ? 1 : ( a.length < b.length ? -1 : 0 ); }); - resolved = self.versions[0]; + resolved = this.versions[0]; - for ( i in self.versions ) { + for ( i in this.versions ) { next = parseInt(i) + 1; - if ( next < self.versions.length ) { - if ( self.versions[next].indexOf(self.versions[i]) !== -1 ) { - resolved = self.versions[next]; + if ( next < this.versions.length ) { + if ( this.versions[next].indexOf(this.versions[i]) !== -1 ) { + resolved = this.versions[next]; } else { break; } } } - return self.version = resolved; - } + return this.version = resolved; + }, - self.setDetected = function(pattern, type, value, key) { - self.detected = true; + setDetected: function(pattern, type, value, key) { + this.detected = true; // Set confidence level - self.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; + this.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; // Detect version number if ( pattern.version ) { @@ -79,13 +79,20 @@ var wappalyzer = (function() { matches = pattern.regex.exec(value) ; + w.log({ matches: matches, version: version }); + if ( matches ) { matches.map(function(match, i) { // Parse ternary operator var ternary = new RegExp('\\\\' + i + '\\?([^:]+):(.+)$').exec(version); if ( ternary && ternary.length === 3 ) { + + w.log({ match: match, i: i, ternary: ternary }); + version = version.replace(ternary[0], match ? ternary[1] : ternary[2]); + + w.log({ version: version }); } // Replace back references @@ -93,14 +100,43 @@ var wappalyzer = (function() { }); if ( version ) { - self.versions.push(version); + this.versions.push(version); } - self.getVersion(); + this.getVersion(); } } } - } + }; + + var Profiler = function() { + this.regexCount = 0; + this.startTime = new Date().getTime(); + this.lastTime = new Date().getTime(); + this.slowest = { duration: null, app: '', type: '', pattern: '' }; + this.timedOut = false; + }; + + Profiler.prototype = { + checkPoint: function(app, type, regex) { + var duration = new Date().getTime() - this.lastTime; + + if ( !this.slowest.duration || duration > this.slowest.duration ) { + this.slowest.duration = duration; + this.slowest.app = app; + this.slowest.type = type; + this.slowest.regex = regex; + } + + this.lastTime = new Date().getTime(); + + this.timedOut = this.getDuration() > 1000; + }, + + getDuration: function() { + return new Date().getTime() - this.startTime; + } + }; /** * Call driver functions @@ -172,15 +208,9 @@ var wappalyzer = (function() { config: { environment: 'dev', // dev | live - - version: false, - websiteURL: 'http://wappalyzer.com/', twitterURL: 'https://twitter.com/Wappalyzer', githubURL: 'https://github.com/ElbertF/Wappalyzer', - - firstRun: false, - upgraded: false }, /** @@ -214,19 +244,7 @@ var wappalyzer = (function() { } // Initialize driver - driver('init', function() { - if ( w.config.firstRun ) { - driver('goToURL', { url: w.config.websiteURL + 'installed', medium: 'install' }); - - w.config.firstRun = false; - } - - if ( w.config.upgraded ) { - driver('goToURL', { url: w.config.websiteURL + 'upgraded', medium: 'upgrade' }); - - w.config.upgraded = false; - } - }); + driver('init'); }, /** @@ -235,10 +253,7 @@ var wappalyzer = (function() { analyze: function(hostname, url, data) { var i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header, version, - profiler = { - regexCount: 0, - startTime: new Date().getTime() - }, + profiler = new Profiler(), apps = {} ; @@ -257,13 +272,21 @@ var wappalyzer = (function() { } for ( app in w.apps ) { + // Exit loop after one second to prevent CPU hogging + // Remaining patterns will not be evaluated + if ( profiler.timedOut ) { + w.log('Timeout, exiting loop'); + + break; + } + apps[app] = w.detected[url] && w.detected[url][app] ? w.detected[url][app] : new Application(app); for ( type in w.apps[app] ) { switch ( type ) { case 'url': parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(url) ) { apps[app].setDetected(pattern, type, url); @@ -277,7 +300,7 @@ var wappalyzer = (function() { } parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(data[type]) ) { apps[app].setDetected(pattern, type, data[type]); @@ -293,10 +316,10 @@ var wappalyzer = (function() { regexScript = new RegExp(']+src=("|\')([^"\']+)', 'ig'); parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); while ( match = regexScript.exec(data.html) ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(match[2]) ) { apps[app].setDetected(pattern, type, match[2]); @@ -310,19 +333,17 @@ var wappalyzer = (function() { break; } - profiler.regexCount ++; - regexMeta = /]+>/ig; while ( match = regexMeta.exec(data.html) ) { for ( meta in w.apps[app][type] ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, regexMeta); if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { content = match.toString().match(/content=("|')([^"']+)("|')/i); parse(w.apps[app].meta[meta]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( content && content.length === 4 && pattern.regex.test(content[2]) ) { apps[app].setDetected(pattern, type, content[2], meta); @@ -340,7 +361,7 @@ var wappalyzer = (function() { for ( header in w.apps[app].headers ) { parse(w.apps[app][type][header]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) { apps[app].setDetected(pattern, type, data[type][header], header); @@ -356,7 +377,7 @@ var wappalyzer = (function() { parse(w.apps[app][type]).map(function(pattern) { for ( i in data[type] ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(data[type][i]) ) { apps[app].setDetected(pattern, type, data[type][i]); @@ -369,7 +390,8 @@ var wappalyzer = (function() { } } - w.log('Tested ' + profiler.regexCount + ' regular expressions in ' + ( ( ( new Date ).getTime() - profiler.startTime ) / 1000 ) + 's'); + w.log('[ PROFILER ] Tested ' + profiler.regexCount + ' regular expressions in ' + ( profiler.getDuration() / 1000 ) + 's'); + w.log('[ PROFILER ] Slowest pattern took ' + ( profiler.slowest.duration / 1000 ) + 's: ' + profiler.slowest.app + ' | ' + profiler.slowest.type + ' | ' + profiler.slowest.regex); for ( app in apps ) { if ( !apps[app].detected ) { diff --git a/drivers/firefox/content/apps.json b/drivers/firefox/content/apps.json index 468e8d4e9..3002cb2b1 100644 --- a/drivers/firefox/content/apps.json +++ b/drivers/firefox/content/apps.json @@ -35,21 +35,25 @@ "33": "web-server-extensions", "34": "databases", "35": "maps", - "36": "advertising-networks" + "36": "advertising-networks", + "37": "network-devices", + "38": "media-servers", + "39": "webcams", + "40": "printers" }, "apps": { "1C-Bitrix": { "website": "www.1c-bitrix.ru", "cats": [ 1 ], "headers": { "X-Powered-CMS": "Bitrix Site Manager", "Set-Cookie": "BITRIX_" }, - "html": "]+components\/bitrix|(src|href)=\"\/bitrix\/(js|templates)", + "html": "(?:]+components/bitrix|(?:src|href)=\"/bitrix/(?:js|templates))", "script": "1c-bitrix", "implies": "PHP" }, "1und1": { "website": "1und1.de", "cats": [ 6 ], - "url": "\/shop\/catalog\/browse\\?sessid=", + "url": "/shop/catalog/browse\\?sessid=", "implies": "PHP" }, "2z Project": { @@ -61,7 +65,18 @@ "website": "www.3dcart.com", "cats": [ 1, 6 ], "headers": { "X-Powered-By": "3DCART" }, - "script": "(twlh(track)?\\.asp|3d_upsell\\.js)" + "script": "(?:twlh(?:track)?\\.asp|3d_upsell\\.js)" + }, + "3DM": { + "website": "www.3ware.com", + "cats": [ 19 ], + "html": "3ware 3DM([\\d\\.]+)?\\;version:\\1", + "implies": "3ware" + }, + "3ware": { + "website": "www.3ware.com", + "cats": [ 22 ], + "headers": { "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1" } }, "Accessible Portal": { "website": "www.accessibleportal.com", @@ -72,20 +87,29 @@ "AddThis": { "website": "www.addthis.com", "cats": [ 5 ], - "script": "addthis\\.com\/js\/(\\d+)?\\;version:\\1", + "script": "addthis\\.com/js/(\\d+)?\\;version:\\1", "env": "^addthis" }, + "Adobe ColdFusion": { + "website": "adobe.com/products/coldfusion-family.html", + "cats": [ 18 ], + "url": "\\.cfm$", + "html": "<!-- START headerTags\\.cfm", + "script": "/cfajax/", + "env": "^_cfEmails$", + "implies": "CFML" + }, "Adobe CQ5": { - "website": "adobe.com\/products\/cq.html", + "website": "adobe.com/products/cq.html", "cats": [ 1 ], - "url": "\/etc\/designs\/", + "url": "/etc/designs/", "html": "<div class=\"[^\"]*parbase", "implies": "Java" }, "Adobe GoLive": { - "website": "www.adobe.com\/products\/golive", + "website": "www.adobe.com/products/golive", "cats": [ 20 ], - "meta": { "generator": "Adobe GoLive(\\s([\\d.]+))?\\;version:\\2" } + "meta": { "generator": "Adobe GoLive(?:\\s([\\d.]+))?\\;version:\\1" } }, "Advanced Web Stats": { "website": "www.advancedwebstats.com", @@ -99,9 +123,9 @@ "env": "^AUI$" }, "Amaya": { - "website": "www.w3.org\/Amaya", + "website": "www.w3.org/Amaya", "cats": [ 20 ], - "meta": { "generator": "Amaya( V?([\\d.]+[a-z]))?\\;version:\\2" } + "meta": { "generator": "Amaya(?: V?([\\d.]+[a-z]))?\\;version:\\1" } }, "amCharts": { "website": "amcharts.com", @@ -112,7 +136,7 @@ "Ametys": { "website": "ametys.org", "cats": [ 1 ], - "meta": { "generator": "(Ametys|Anyware Technologies)" }, + "meta": { "generator": "(?:Ametys|Anyware Technologies)" }, "script": "STools\\.js", "implies": "Java" }, @@ -120,7 +144,7 @@ "website": "amirocms.com", "cats": [ 1 ], "meta": { "generator": "Amiro" }, - "html": "system_(js\\.php\\?script=|css\\.php\\?styles)[^\"]+cv=([\\d.]+)\\;version:\\2", + "html": "system_(?:js\\.php\\?script=|css\\.php\\?styles)[^\"]+cv=([\\d.]+)\\;version:\\1", "implies": "PHP" }, "AMPcms": { @@ -138,12 +162,22 @@ "AOLserver": { "website": "aolserver.com", "cats": [ 22 ], - "headers": { "Server": "AOLserver\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "AOLserver/?([\\d.]+)?\\;version:\\1" } }, "Apache": { "website": "apache.org", "cats": [ 22 ], - "headers": { "Server": "(Apache($|\/([\\d.]+)|[^\/-])|(^|\\b)HTTPD)\\;version:\\3" } + "headers": { "Server": "(?:Apache(?:$|/([\\d.]+)|[^/-])|(?:^|\\b)HTTPD)\\;version:\\1" } + }, + "Apache Hadoop": { + "website": "hadoop.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hadoop.css\"" + }, + "Apache HBase": { + "website": "hbase.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hbase.css\"" }, "Apache JSPWiki": { "website": "jspwiki.org", @@ -155,12 +189,12 @@ "Apache Tomcat": { "website": "tomcat.apache.org", "cats": [ 22 ], - "headers": { "Server": "Apache-Coyote\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "Apache-Coyote/?([\\d.]+)?\\;version:\\1" } }, "Apache Traffic Server": { - "website": "trafficserver.apache.org\/", + "website": "trafficserver.apache.org/", "cats": [ 22 ], - "headers": { "Server": "ATS\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "ATS/?([\\d.]+)?\\;version:\\1" } }, "Arc Forum": { "website": "arclanguage.org", @@ -168,42 +202,47 @@ "html": "ping\\.src = node\\.href;" }, "AsciiDoc": { - "website": "www.methods.co.nz\/asciidoc", + "website": "www.methods.co.nz/asciidoc", "cats": [ 1, 20, 27 ], "meta": { "generator": "^AsciiDoc ([\\d.]+)\\;version:\\1" }, "env": "^asciidoc$" }, + "ATEN": { + "website": "www.aten.com", + "cats": [ 22 ], + "headers": { "Server": "ATEN HTTP Server(\\(V?([\\d\\.]+)\\))?\\;version:\\2" } + }, "ATG Web Commerce": { - "website": "oracle.com\/us\/products\/applications\/web-commerce\/atg", + "website": "oracle.com/us/products/applications/web-commerce/atg", "cats": [ 6 ], - "headers": { "X-ATG-Version": "(ATGPlatform\/([\\d.]+))?\\;version:\\2" }, + "headers": { "X-ATG-Version": "(?:ATGPlatform/([\\d.]+))?\\;version:\\1" }, "html": "<[^>]+_DARGS" }, "Atlassian Confluence": { - "website": "www.atlassian.com\/software\/confluence\/overview\/team-collaboration-software", + "website": "www.atlassian.com/software/confluence/overview/team-collaboration-software", "cats": [ 8 ], - "html": "Powered by <a href=[^>]+atlassian\\.com\/software\/confluence([^>]+>Atlassian Confluence<\/a> ([\\d.]+))?\\;version:\\2", + "html": "Powered by <a href=[^>]+atlassian\\.com/software/confluence(?:[^>]+>Atlassian Confluence</a> ([\\d.]+))?\\;version:\\1", "headers": { "X-Confluence-Request-Time": ".*" }, "meta": { "confluence-request-time": ".*" }, "implies": "Java" }, "Atlassian Jira": { - "website": "www.atlassian.com\/software\/jira\/overview\/", + "website": "www.atlassian.com/software/jira/overview/", "cats": [ 13 ], "env": "^jira$", - "script": "\/jira\/s\/", - "url": "\/secure\/Dashboard.jspa", - "html": "Powered by\\s+<a href=[^>]+atlassian\\.com\/(software\/jira|jira-bug-tracking\/)[^>]+>Atlassian\\s+JIRA([^v]*v(ersion: )?(\\d+\\.\\d+(\\.\\d+)?))?\\;version:\\4", + "script": "/jira/s/", + "url": "/secure/Dashboard\\.jspa", + "html": "Powered by\\s+<a href=[^>]+atlassian\\.com/(?:software/jira|jira-bug-tracking/)[^>]+>Atlassian\\s+JIRA(?:[^v]*v(?:ersion: )?(\\d+\\.\\d+(\\.\\d+)?))?\\;version:\\1", "implies": "Java" }, "AWStats": { "website": "awstats.sourceforge.net", "cats": [ 10 ], - "meta": { "generator": "AWStats ([\\d.]+( \\(build [\\d.]+\\))?)\\;version:\\1" }, + "meta": { "generator": "AWStats ([\\d.]+(?: \\(?:build [\\d.]+\\))?)\\;version:\\1" }, "implies": "Perl" }, "Backbone.js": { - "website": "documentcloud.github.com\/backbone", + "website": "documentcloud.github.com/backbone", "cats": [ 12 ], "script": "backbone.*\\.js", "env": "^Backbone$", @@ -212,26 +251,32 @@ "Banshee": { "website": "www.banshee-php.org", "cats": [ 1, 18 ], - "html": "Built upon the <a href=\"[^>]+banshee-php\\.org\/\">[a-z]+<\/a>(v([\\d.]+))?\\;version:\\2", + "html": "Built upon the <a href=\"[^>]+banshee-php\\.org/\">[a-z]+</a>(?:v([\\d.]+))?\\;version:\\1", "implies": "PHP" }, + "BaseHTTP": { + "website": "docs.python.org/2/library/basehttpserver.html", + "cats": [ 22 ], + "headers": { "Server": "BaseHTTP\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" + }, "BIGACE": { "website": "bigace.de", "cats": [ 1 ], "meta": { "generator": "BIGACE ([\\d.]+)\\;version:\\1" }, - "html": "Powered by <a href=\"[^>]+BIGACE|<!--\\s+Site is running BIGACE", + "html": "(?:Powered by <a href=\"[^>]+BIGACE|<!--\\s+Site is running BIGACE)", "implies": "PHP" }, "Bigcommerce": { "website": "www.bigcommerce.com", "cats": [ 6 ], - "url": ".+\\.mybigcommerce\\.com", - "html": "<link href=[^>]+cdn\\d+\\.bigcommerce\\.com\/v", - "script": "cdn\\d+\\.bigcommerce\\.com\/v", + "url": "mybigcommerce\\.com", + "html": "<link href=[^>]+cdn\\d+\\.bigcommerce\\.com/v", + "script": "cdn\\d+\\.bigcommerce\\.com/v", "env": "^compareProducts$" }, "BigDump": { - "website": "www.ozerov.de\/bigdump.php", + "website": "www.ozerov.de/bigdump.php", "cats": [ 3 ], "html": "<!-- <h1>BigDump: Staggered MySQL Dump Importer ver\\. ([\\d.b]+)\\;version:\\1", "implies": "PHP" @@ -239,27 +284,36 @@ "Bigware": { "website": "bigware.de", "cats": [ 6 ], - "html": "Diese <a href=.+bigware\\.de|<a href=[^>]+\/main_bigware_\\d+\\.php", - "url": "(\\?|&)bigWAdminID=[a-z\\d]+(&|$)", - "headers": { "Set-Cookie": "bigwareCsid|bigWAdminID" }, + "html": "(?:Diese <a href=[^>]+bigware\\.de|<a href=[^>]+/main_bigware_\\d+\\.php)", + "url": "(?:\\?|&)bigWAdminID=", + "headers": { "Set-Cookie": "(?:bigwareCsid|bigWAdminID)" }, "implies": "PHP" }, "BittAds": { "website": "bittads.com", "cats": [ 36 ], - "script": "bittads\\.com\/js\/bitt\\.js$", + "script": "bittads\\.com/js/bitt\\.js$", "env": "^bitt$" }, "Blip.tv": { "website": "blip.tv", "cats": [ 14 ], - "html": "<(param|embed|iframe)[^>]+blip\\.tv\/play" + "html": "<(?:param|embed|iframe)[^>]+blip\\.tv/play" }, "Blogger": { "website": "www.blogger.com", "cats": [ 11 ], "meta": { "generator": "blogger" }, - "url": "^(www.)?.+\\.blogspot\\.com" + "url": "\\.blogspot\\.com" + }, + "Boa": { + "website": "www.boa.org", + "cats": [ 22 ], + "headers": { "Server": "Boa\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, + "Brother": { + "website": "www.brother.com", + "cats": [ 40 ] }, "BrowserCMS": { "website": "browsercms.org", @@ -285,6 +339,10 @@ "script": "CatalystScripts", "html": "<!-- BC_OBNW -->" }, + "Canon": { + "website": "www.canon.com", + "cats": [ 40 ] + }, "CakePHP": { "website": "cakephp.org", "cats": [ 18 ], @@ -296,17 +354,23 @@ "website": "cargocollective.com", "cats": [ 1 ], "meta": { "cargo_title": ".*" }, - "script": "\/cargo\\.", + "script": "/cargo\\.", "html": "<link [^>]+Cargo feed", "implies": "PHP" }, + "Catwalk": { + "website": "www.canon.com", + "cats": [ 22 ], + "headers": { "Server": "Catwalk\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Canon" + }, "CentOS": { "website": "centos.org", "cats": [ 28 ], "headers": { "Server": "CentOS", "X-Powered-By": "CentOS" } }, "CFML": { - "website": "adobe.com\/products\/coldfusion-family.html", + "website": "adobe.com/products/coldfusion-family.html", "cats": [ 27 ] }, "CacheFly": { @@ -323,7 +387,7 @@ "Chamilo": { "website": "www.chamilo.org", "cats": [ 21 ], - "html": "\">Chamilo ([\\d.]+)<\/a>\\;version:\\1", + "html": "\">Chamilo ([\\d.]+)</a>\\;version:\\1", "meta": { "generator": "Chamilo ([\\d.]+)\\;version:\\1" }, "headers": { "X-Powered-By": "Chamilo ([\\d.]+)\\;version:\\1" }, "implies": "PHP" @@ -332,12 +396,18 @@ "website": "chartbeat.com", "cats": [ 10 ], "html": "function loadChartbeat\\(\\) {", - "script": "chartbeat.js" + "script": "chartbeat\\.js" }, "Cherokee": { "website": "www.cherokee-project.com", "cats": [ 22 ], - "headers": { "Server": "Cherokee\/([\\d.]+)\\;version:\\1" } + "headers": { "Server": "Cherokee/([\\d.]+)\\;version:\\1" } + }, + "CherryPy": { + "website": "www.cherrypy.org", + "cats": [ 18, 22 ], + "headers": { "Server": "CherryPy\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" }, "CKEditor": { "website": "ckeditor.com", @@ -345,8 +415,13 @@ "env": "^CKEDITOR$", "implies": "PHP" }, + "Cloudera": { + "website": "www.cloudera.com", + "cats": [ 34 ], + "headers": { "Server": "cloudera" } + }, "ClickHeat": { - "website": "www.labsmedia.com\/clickheat\/index.html", + "website": "www.labsmedia.com/clickheat/index.html", "cats": [ 10 ], "script": "clickheat.*\\.js", "env": "^clickHeat", @@ -355,7 +430,7 @@ "ClickTale": { "website": "www.clicktale.com", "cats": [ 10 ], - "html": "if\\(typeof ClickTale(Tag)*==\"function\"\\)", + "html": "if\\(typeof ClickTale(Tag)*==\\\"function\\\"\\)", "env": "^ClickTale" }, "Clicky": { @@ -377,7 +452,7 @@ "implies": "PHP" }, "CMSimple": { - "website": "www.cmsimple.org\/en", + "website": "www.cmsimple.org/en", "cats": [ 1 ], "meta": { "generator": "CMSimple( [\\d.]+)?\\;version:\\1" }, "implies": "PHP" @@ -385,36 +460,46 @@ "CO2Stats": { "website": "co2stats.com", "cats": [ 10 ], - "html": "src=[^>]+co2stats\\.com\/propres\\.php" + "html": "src=[^>]+co2stats\\.com/propres\\.php" }, "CodeIgniter": { "website": "codeigniter.com", "cats": [ 18 ], - "headers": { "Set-Cookie": "(exp_last_activity|exp_tracker|ci_session)" }, + "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker|ci_session)" }, "implies": "PHP" }, + "CodeMirror": { + "website": "codemirror.net", + "cats": [ 19 ], + "env": "^CodeMirror$" + }, "Commerce Server": { "website": "commerceserver.net", "cats": [ 6 ], "headers": { "COMMERCE-SERVER-SOFTWARE": ".+" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "implies": "Microsoft ASP.NET" + }, + "CompaqHTTPServer": { + "website": "www.hp.com", + "cats": [ 22 ], + "headers": { "Server": "CompaqHTTPServer\\/?([\\d\\.]+)?\\;version:\\1" } }, "comScore": { "website": "comscore.com", "cats": [ 10 ], - "html": "<i{1}frame[^>]* (id=\"comscore\"|scr=[^>]+comscore)", + "html": "<iframe[^>]* (?:id=\"comscore\"|scr=[^>]+comscore)", "env": "^_?COMSCORE$" }, "Concrete5": { "website": "concrete5.org", "cats": [ 1 ], - "script": "concrete\/js\/", + "script": "concrete/js/", "meta": { "generator": "concrete5 - ([\\d.ab]+)\\;version:\\1" }, "env": "^CCM_IMAGE_PATH$", "implies": "PHP" }, "Connect": { - "website": "www.senchalabs.org\/connect", + "website": "www.senchalabs.org/connect", "cats": [ 18 ], "headers": { "X-Powered-By": "^Connect$" }, "implies": "node.js" @@ -422,25 +507,31 @@ "Contao": { "website": "contao.org", "cats": [ 1 ], - "html": "(<!--.+powered by (TYPOlight|Contao)-->|<link[^>]+(typolight|contao)\\.css)", + "html": "(?:<!--[^>]+powered by (?:TYPOlight|Contao)-->|<link[^>]+(?:typolight|contao)\\.css)", "implies": "PHP" }, "Contenido": { - "website": "contenido.org\/en", + "website": "contenido.org/en", "cats": [ 1 ], "meta": { "generator": "Contenido ([\\d.]+)\\;version:\\1" }, "implies": "PHP" }, "Contens": { - "website": "www.contens.com\/en\/pub\/index.cfm", + "website": "www.contens.com/en/pub/index.cfm", "cats": [ 1 ], "meta": { "generator": "Contensis CMS Version ([\\d.]+)\\;version:\\1" }, "implies": [ "Java", "CFML" ] }, + "ContentBox": { + "website": "www.gocontentbox.org", + "cats": [ 1, 11 ], + "meta": { "generator": "ContentBox powered by ColdBox" }, + "implies": "Adobe ColdFusion" + }, "ConversionLab": { - "website": "www.trackset.it\/conversionlab", + "website": "www.trackset.it/conversionlab", "cats": [ 10 ], - "script": "conversionlab\\.trackset\\.com\/track\/tsend\\.js" + "script": "conversionlab\\.trackset\\.com/track/tsend\\.js" }, "Coppermine": { "website": "coppermine-gallery.net", @@ -462,12 +553,12 @@ "CouchDB": { "website": "couchdb.apache.org", "cats": [ 22 ], - "headers": { "Server": "CouchDB\/([\\d.]+)\\;version:\\1" } + "headers": { "Server": "CouchDB/([\\d.]+)\\;version:\\1" } }, "cPanel": { "website": "www.cpanel.net", "cats": [ 9 ], - "headers": { "Server": "cpsrvd\/([\\d.]+)\\;version:\\1" }, + "headers": { "Server": "cpsrvd/([\\d.]+)\\;version:\\1" }, "html": "<!-- cPanel" }, "CPG Dragonfly": { @@ -481,40 +572,25 @@ "website": "crazyegg.com", "cats": [ 10 ], "env": "^CE2$", - "script": "cetrk\\.com\/pages\/scripts\/\\d+\/\\d+\\.js" + "script": "cetrk\\.com/pages/scripts/\\d+/\\d+\\.js" }, "Cross Pixel": { "website": "datadesk.crsspxl.com", "cats": [ 10 ], "env": "^crsspxl$", - "script": "tag\\.crsspxl\\.com\/s1\\.js" + "script": "tag\\.crsspxl\\.com/s1\\.js" }, "CS Cart": { "website": "www.cs-cart.com", "cats": [ 6 ], "env": "^fn_compare_strings$", - "html": " Powered by (<a href=[^>]+cs-cart\\.com|CS-Cart)", + "html": " Powered by (?:<a href=[^>]+cs-cart\\.com|CS-Cart)", "implies": "PHP" }, - "Adobe ColdFusion": { - "website": "adobe.com\/products\/coldfusion-family.html", - "cats": [ 18 ], - "url": "\\.cfm$", - "html": "<!-- START headerTags\\.cfm", - "script": "\/cfajax\/", - "env": "^_cfEmails$", - "implies": "CFML" - }, - "ContentBox": { - "website": "www.gocontentbox.org", - "cats": [ 1, 11 ], - "meta": { "generator": "ContentBox powered by ColdBox" }, - "implies": "Adobe ColdFusion" - }, "CubeCart": { "website": "www.cubecart.com", "cats": [ 6 ], - "html": "(Powered by <a href=[^>]+cubecart\\.com|<p[^>]+>Powered by CubeCart)", + "html": "(?:Powered by <a href=[^>]+cubecart\\.com|<p[^>]+>Powered by CubeCart)", "meta": { "generator": "cubecart" }, "implies": "PHP" }, @@ -525,9 +601,9 @@ "env": "^Cufon$" }, "d3": { - "website": "mbostock.github.com\/d3", + "website": "mbostock.github.com/d3", "cats": [ 25 ], - "script": "d3(\\.v2)(\\.min)?\\.js" + "script": "d3(?:\\.v2)?(?:\\.min)?\\.js" }, "Dancer": { "website": "perldancer.org", @@ -542,10 +618,10 @@ "meta": { "generator": "Danneo CMS ([\\d.]+)\\;version:\\1" }, "implies": [ "Apache", "PHP" ] }, - "dashCommerce": { - "website": "dashcommerce.org", - "cats": [ 6 ], - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "Darwin": { + "website": "opensource.apple.com", + "cats": [ 28 ], + "headers": { "Server": "Darwin", "X-Powered-By": "Darwin" } }, "DataLife Engine": { "website": "dle-news.ru", @@ -557,13 +633,18 @@ "David Webbox": { "website": "www.tobit.com", "cats": [ 22 ], - "headers": { "Server": "David-WebBox\/([\\d.a]+ \\(\\d+\\))\\;version:\\1" } + "headers": { "Server": "David-WebBox/([\\d.a]+ \\(\\d+\\))\\;version:\\1" } }, "Debian": { "website": "debian.org", "cats": [ 28 ], - "headers": { "Server": "Debian", "X-Powered-By": "(Debian|dotdeb|(sarge|etch|lenny|queeze|wheezy|jessie))\\;version:\\2" - } + "headers": { "Server": "Debian", "X-Powered-By": "(?:Debian|dotdeb|(sarge|etch|lenny|squeeze|wheezy|jessie))\\;version:\\1" } + }, + "debut": { + "website": "www.brother.com", + "cats": [ 22 ], + "headers": { "Server": "debut\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Brother" }, "DedeCMS": { "website": "dedecms.com", @@ -572,11 +653,15 @@ "script": "dedeajax", "implies": "PHP" }, + "Dell": { + "website": "dell.com", + "cats": [ 40 ] + }, "Demandware": { "website": "demandware.com", "cats": [ 6 ], "headers": { "Server": "Demandware eCommerce Server" }, - "html": "<[^>]+demandware.edgesuite", + "html": "<[^>]+demandware\\.edgesuite", "env": "^dwAnalytics$" }, "DHTMLX": { @@ -587,7 +672,7 @@ "DirectAdmin": { "website": "www.directadmin.com", "cats": [ 9 ], - "html": "<a[^>]+>DirectAdmin<\/a> Web Control Panel", + "html": "<a[^>]+>DirectAdmin</a> Web Control Panel", "headers": { "Server": "DirectAdmin Daemon v([\\d.]+)\\;version:\\1" }, "implies": [ "PHP", "Apache" ] }, @@ -601,28 +686,28 @@ "Django": { "website": "djangoproject.com", "cats": [ 18 ], - "html": "(powered by <a[^>]+>Django ?([\\d.]+)?|<div style=\"display:none\"><input name=\"csrfmiddlewaretoken\" value=\"[a-z0-9]{32}\" type=\"hidden\"><\/div>)\\;version:\\2", + "html": "(?:powered by <a[^>]+>Django ?([\\d.]+)?|<div style=\"display:none\"><input name=\"csrfmiddlewaretoken\" value=\"[a-z0-9]{32}\" type=\"hidden\"></div>)\\;version:\\1", "env": "^__admin_media_prefix__", "implies": "Python" }, "Django CMS": { "website": "django-cms.org", "cats": [ 1 ], - "script": "media\/cms\/js\/csrf\\.js", + "script": "media/cms/js/csrf\\.js", "headers": { "Set-Cookie": "django[^;]=" }, "implies": "Django" }, "Dojo": { "website": "dojotoolkit.org", "cats": [ 12 ], - "script": "([\\d.]+)\/dojo\/dojo(\\.xd)?\\.js\\;version:\\1", + "script": "([\\d.]+)/dojo/dojo(?:\\.xd)?\\.js\\;version:\\1", "env": "^dojo$" }, "Dokeos": { "website": "dokeos.com", "cats": [ 21 ], "meta": { "generator": "Dokeos" }, - "html": "Portal <a[^>]+>Dokeos|@import \"[^\"]+dokeos_blue", + "html": "(?:Portal <a[^>]+>Dokeos|@import \"[^\"]+dokeos_blue)", "headers": { "X-Powered-By": "Dokeos" }, "implies": [ "PHP", "Xajax", "jQuery", "CKEditor" ] }, @@ -637,37 +722,41 @@ "website": "dotnetnuke.com", "cats": [ 1 ], "meta": { "generator": "DotNetNuke" }, - "headers": { "X-Compressed-By": "DotNetNuke", "Set-Cookie": "DotNetNukeAnonymous=.+" - }, + "headers": { "X-Compressed-By": "DotNetNuke", "Set-Cookie": "DotNetNukeAnonymous=" }, "html": "<!-- by DotNetNuke Corporation", "env": "^DotNetNuke$", "implies": "Microsoft ASP.NET" }, "Doxygen": { - "website": "stack.nl\/~dimitri\/doxygen", + "website": "stack.nl/~dimitri/doxygen", "cats": [ 4 ], - "html": "(<!-- Generated by Doxygen ([\\d.]+)|<link[^>]+doxygen.css)\\;version:\\1" + "html": "(?:<!-- Generated by Doxygen ([\\d.]+)|<link[^>]+doxygen.css)\\;version:\\1" }, "DreamWeaver": { - "website": "www.adobe.com\/products\/dreamweaver", + "website": "www.adobe.com/products/dreamweaver", "cats": [ 20 ], - "html": "(<!--[^>]*(InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) {)\\;version:\\3" + "html": "(?:<!--[^>]*(?:InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) {)\\;version:\\1" }, "Drupal": { "website": "drupal.org", "cats": [ 1 ], "script": "drupal\\.js", - "html": "<(link|style)[^>]+sites\/(default|all)\/(themes|modules)\/", - "headers": { "X-Drupal-Cache": ".*", "X-Generator": "Drupal(\\s([\\d.]+))?\\;version:\\2", "Expires": "19 Nov 1978" }, + "html": "<(?:link|style)[^>]+sites/(?:default|all)/(?:themes|modules)/", + "headers": { "X-Drupal-Cache": ".*", "X-Generator": "Drupal(?:\\s([\\d.]+))?\\;version:\\1", "Expires": "19 Nov 1978" }, "env": "^Drupal$", "implies": "PHP" }, "Drupal Commerce": { "website": "drupalcommerce.org", "cats": [ 6 ], - "html": "id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field", + "html": "(?:id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field)", "implies": "Drupal" }, + "dwhttpd": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "dwhttpd\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, "Dynamicweb": { "website": "www.dynamicweb.dk", "cats": [ 1, 6, 10 ], @@ -679,29 +768,47 @@ "website": "e107.org", "cats": [ 1 ], "script": "e107\\.js", - "headers": { "Set-Cookie": "e107_td[^;]+=" }, + "headers": { "Set-Cookie": "e107_tz[^;]+=", "X-Powered-By": "e107" }, "implies": "PHP" }, "EdgeCast": { "website": "www.edgecast.com", "cats": [ 31 ], - "headers": { "Server": "^ECS" } + "headers": { "Server": "^EC(?:S|Acc)" }, + "url": "https?://(?:[^/]+\\.)?edgecastcdn\\.net/" + }, + "eHTTP": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "\\beHTTP( v?([\\d\\.]+))?\\;version:\\2" }, + "implies": [ "HP ProCurve"] + }, + "ELOG": { + "website": "midas.psi.ch/elog", + "cats": [ 19 ], + "html": "<title>ELOG Logbook Selection" + }, + "ELOG HTTP": { + "website": "midas.psi.ch/elog", + "cats": [ 22 ], + "headers": { "Server": "ELOG HTTP( \\d[\\-\\d\\.]+)?\\;version:\\1" }, + "implies": "ELOG" }, "Eloqua": { "website": "eloqua.com", "cats": [ 32 ], "script": "elqCfg\\.js", - "env": "^elq(SiteID|Load|CurESite)$" + "env": "^elq(?:SiteID|Load|CurESite)$" }, "Embedthis-http": { - "website": "github.com\/embedthis\/http", + "website": "github.com/embedthis/http", "cats": [ 22 ], - "headers": { "Server": "Embedthis-http(\/([\\d.]+))?\\;version:\\2" } + "headers": { "Server": "Embedthis-http(?:/([\\d.]+))?\\;version:\\1" } }, "E-Merchant": { "website": "e-merchant.com", "cats": [ 6 ], - "script": "cdn.e-merchant.com" + "script": "cdn\\.e-merchant\\.com" }, "Enyo": { "website": "enyojs.com", @@ -713,8 +820,8 @@ "website": "episerver.com", "cats": [ 1 ], "meta": { "generator": "EPiServer" }, - "headers": { "Set-Cookie": "EPi(Trace|Server)[^;]*=" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "headers": { "Set-Cookie": "EPi(?:Trace|Server)[^;]*=" }, + "implies": "Microsoft ASP.NET" }, "EPrints": { "website": "www.eprints.org", @@ -723,6 +830,11 @@ "env": "^EPJS_menu_template$", "implies": "Perl" }, + "Erlang": { + "website": "www.erlang.org", + "cats": [ 27 ], + "headers": { "Server": "Erlang( OTP/([\\-\\d\\.ABR]+))?\\;version:\\1" } + }, "eSyndiCat": { "website": "esyndicat.com", "cats": [ 1 ], @@ -731,8 +843,14 @@ "env": "^esyndicat$", "implies": [ "PHP" ] }, + "EWS-NIC4": { + "website": "dell.com", + "cats": [ 22 ], + "headers": { "Server": "EWS-NIC4(\\/([\\d\\.a-z]+))?\\;version:\\2" }, + "implies": "Dell" + }, "Exhibit": { - "website": "simile-widgets.org\/exhibit\/", + "website": "simile-widgets.org/exhibit/", "cats": [ 25 ], "script": "exhibit.*\\.js", "env": "^Exhibit$" @@ -746,7 +864,7 @@ "ExpressionEngine": { "website": "expressionengine.com", "cats": [ 1 ], - "headers": { "Set-Cookie": "(exp_last_activity|exp_tracker)" }, + "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker)" }, "implies": "PHP" }, "ExtJS": { @@ -767,17 +885,17 @@ "cats": [ 29 ], "html": "", + "html": "(?:]* href=\"templates/gambio/|]content\\.php\\?coID=\\d|)", "implies": "PHP" }, "Gauges": { "website": "get.gaug.es", "cats": [ 10 ], "headers": { "Set-Cookie": "_gauges_[^;]+=" }, - "html": "t\\.src = '\/\/secure\\.gaug\\.es\/track\\.js", "env": "^_gauges$" }, "Gentoo": { "website": "www.gentoo.org", "cats": [ 28 ], - "headers": { "X-Powered-By": "-?gentoo" } + "headers": { "X-Powered-By": "gentoo" } }, "Get Satisfaction": { "website": "getsatisfaction.com", @@ -858,57 +979,57 @@ "implies": "PHP" }, "GoAhead": { - "website": "embedthis.com\/products\/goahead\/index.html", + "website": "embedthis.com/products/goahead/index.html", "cats": [ 22 ], "headers": { "Server": "GoAhead" } }, "Google Analytics": { - "website": "google.com\/analytics", + "website": "google.com/analytics", "cats": [ 10 ], "html": "_gaq\\.push\\(\\['_setAccount", - "script": "(\\.google-analytics\\.com\/ga\\.js|google-analytics\\.com\/urchin\\.js)", + "script": "(?:\\.google-analytics\\.com/ga\\.js|google-analytics\\.com/urchin\\.js)", "headers": { "Set-Cookie": "__utma" }, "env": "^gaGlobal$" }, "Google App Engine": { - "website": "code.google.com\/appengine", + "website": "code.google.com/appengine", "cats": [ 22 ], "headers": { "Server": "Google Frontend" } }, "Google Code Prettify": { - "website": "code.google.com\/p\/google-code-prettify", + "website": "code.google.com/p/google-code-prettify", "cats": [ 19 ], "env": "^prettyPrint$" }, "Google Font API": { - "website": "code.google.com\/apis\/webfonts", + "website": "code.google.com/apis/webfonts", "cats": [ 17 ], - "script": "googleapis.com\/.+webfont", + "script": "googleapis\\.com/.+webfont", "html": "]* href=[^>]+fonts\\.googleapis\\.com", "env": "^WebFonts$" }, "Google Maps": { "website": "maps.google.com", "cats": [ 35 ], - "script": "(maps\\.google\\.com\/maps\\?file=api(&v=([\\d.]+))?|maps\\.google\\.com\/maps\/api\/staticmap)\\;version:API v\\3" + "script": "(?:maps\\.google\\.com/maps\\?file=api(?:&v=([\\d.]+))?|maps\\.google\\.com/maps/api/staticmap)\\;version:API v\\1" }, "Google PageSpeed": { - "website": "developers.google.com\/speed\/pagespeed\/mod", + "website": "developers.google.com/speed/pagespeed/mod", "cats": [ 23, 33 ], "headers": { "X-Mod-Pagespeed": "([\\d.]+)\\;version:\\1" } }, "Google Sites": { "website": "sites.google.com", "cats": [ 1 ], - "url": "sites.google.com" + "url": "sites\\.google\\.com" }, "Google Tag Manager": { - "website": "www.google.com\/tagmanager", + "website": "www.google.com/tagmanager", "cats": [ 19 ], - "html": "googletagmanager\\.com\/ns\\.html[^>]+><\/iframe>" + "html": "googletagmanager\\.com/ns\\.html[^>]+>" }, "Google Web Toolkit": { - "website": "developers.google.com\/web-toolkit", + "website": "developers.google.com/web-toolkit", "cats": [ 18 ], "env": "^__gwt_", "implies": "Java" @@ -916,15 +1037,20 @@ "GoStats": { "website": "gostats.com", "cats": [ 10 ], - "env": "^_go(stats|_track)" + "env": "^_go(?:stats|_track)" }, "Graffiti CMS": { "website": "graffiticms.codeplex.com", "cats": [ 1 ], "meta": { "generator": "Graffiti CMS ([^\"]+)\\;version:\\1" }, - "script": "\/graffiti.js", + "script": "/graffiti\\.js", "headers": { "Set-Cookie": "graffitibot[^;]=" } }, + "Grandstream": { + "website": "www.grandstream.com", + "cats": [ 22, 39 ], + "headers": { "Server": "Grandstream\\/?([\\d\\.]+)?\\;version:\\1" } + }, "Gravatar": { "website": "gravatar.com", "cats": [ 19 ], @@ -933,7 +1059,6 @@ "Gravity Insights": { "website": "insights.gravity.com", "cats": [ 10 ], - "html": "gravityInsightsParams\\.site_guid = '", "env": "^GravityInsights$" }, "G-WAN": { @@ -942,9 +1067,9 @@ "headers": { "Server": "G-WAN" } }, "GX WebManager": { - "website": "www.gxsoftware.com\/en\/products\/web-content-management.htm", + "website": "www.gxsoftware.com/en/products/web-content-management.htm", "cats": [ 1 ], - "meta": { "generator": "GX WebManager( ([\\d.]+))?\\;version:\\2" }, + "meta": { "generator": "GX WebManager(?: ([\\d.]+))?\\;version:\\1" }, "html": "", + "meta": { "eomportal-instanceid": "[0-9]+", "eomportal-id": "[0-9]+", "eomportal-loid": "[0-9.]+", "eomportal-uuid": "[a-f0-9]+", "eomportal-lastUpdate": ".*" } }, "Microsoft ASP.NET": { "website": "www.asp.net", "cats": [ 18 ], "url": "\\.aspx$", "html": "]+name=\"__VIEWSTATE", - "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" - }, - "implies": [ "IIS", "Windows Server" ] + "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" }, + "implies": "IIS\\;confidence:50" }, "Microsoft SharePoint": { "website": "sharepoint.microsoft.com", @@ -1383,18 +1566,29 @@ "cats": [ 2 ], "html": "]+minibb.+\\s+", + "html": "", "env": "^_?owa_" }, "OneStat": { "website": "www.onestat.com", "cats": [ 10 ], - "html": "var p==.+stat\\.onestat\\.com\/stat\\.aspx\\?tagver" + "html": "var p==.+stat\\.onestat\\.com/stat\\.aspx\\?tagver" }, "OpenCart": { "website": "www.opencart.com", "cats": [ 6 ], - "html": "index\\.php\\?route=[a-z]+\/|Powered By ]+OpenCart", + "html": "(?:index\\.php\\?route=[a-z]+/|Powered By ]+OpenCart)", "implies": "PHP" }, "openEngine": { - "website": "openengine.de\/html\/pages\/de\/", + "website": "openengine.de/html/pages/de/", "cats": [ 1 ], - "html": "]+openEngine" }, "OpenGrok": { - "website": "hub.opensolaris.org\/bin\/view\/Project+opengrok\/WebHome", + "meta": "openEngine" + }, + "OpenGrok": { + "website": "hub.opensolaris.org/bin/view/Project+opengrok/WebHome", "cats": [ 19 ], "headers": { "Set-Cookie": "OpenGrok" }, - "meta": { "generator": "OpenGrok( v?([\\d.]+))?\\;version:\\2" }, + "meta": { "generator": "OpenGrok(?: v?([\\d.]+))?\\;version:\\1" }, "implies": "Java" }, "OpenGSE": { - "website": "code.google.com\/p\/opengse", + "website": "code.google.com/p/opengse", "cats": [ 22 ], "headers": { "Server": "GSE" }, "implies": "Java" @@ -1624,14 +1838,14 @@ "env": "^OpenLayers$" }, "OpenNemas": { - "website": "openhost.es\/en\/opennemas", + "website": "openhost.es/en/opennemas", "cats": [ 1 ], "headers": { "X-Powered-By": "OpenNemas" } }, "OpenSSL": { "website": "openssl.org", "cats": [ 33 ], - "headers": { "Server": "OpenSSL(\/([\\d.]+[a-z]?))?\\;version:\\2" } + "headers": { "Server": "OpenSSL(?:/([\\d.]+[a-z]?))?\\;version:\\1" } }, "OpenText Web Solutions": { "website": "websolutions.opentext.com", @@ -1645,19 +1859,19 @@ "env": "^optimizely$" }, "Oracle Application Server": { - "website": "www.oracle.com\/technetwork\/middleware\/ias\/overview\/index.html", + "website": "www.oracle.com/technetwork/middleware/ias/overview/index.html", "cats": [ 22 ], - "headers": { "Server": "Oracle(-| )Application(-| )Server((-| )(\\d+[a-z]?))?\\;version:\\5" } + "headers": { "Server": "Oracle\\bApplication\\bServer(?:\\b(\\d+[a-z]?))?\\;version:\\1" } }, "Oracle Recommendations On Demand": { - "website": "www.oracle.com\/us\/products\/applications\/commerce\/recommendations-on-demand\/index.html?", + "website": "www.oracle.com/us/products/applications/commerce/recommendations-on-demand/index.html", "cats": [ 10 ], "script": "atgsvcs.+atgsvcs\\.js" }, "osCommerce": { "website": "www.oscommerce.com", "cats": [ 6 ], - "html": "(]*(\\?|&)osCsid|Powered by (<[^]+>)?osCommerce<\/a>|<[^]+class=\"[^>]*infoBoxHeading)", + "html": "(?:]*(?:\\?|&)osCsid|Powered by (?:<[^]+>)?osCommerce|<[^]+class=\"[^>]*infoBoxHeading)", "headers": { "Set-Cookie": "osCsid=" } }, "osCSS": { @@ -1668,31 +1882,30 @@ "Outbrain": { "website": "outbrain.com", "cats": [ 5 ], - "html": "var OB_langJS = '.+widgets\\.outbrain\\.com\/lang_", - "script": "widgets\\.outbrain\\.com\/outbrain\\.js", - "env": "^OutbrainPermaLink$" + "script": "widgets\\.outbrain\\.com/outbrain\\.js", + "env": "^(?:OutbrainPermaLink|OB_releaseVer)$" }, "OXID eShop": { "website": "oxid-esales.com", "cats": [ 6 ], - "html": "", "implies": "Java" }, @@ -2649,6 +2924,11 @@ "website": "foundation.zurb.com", "cats": [ 18 ], "html": "]+foundation[^>\"]+css" + }, + "LiveStreet CMS": { + "website": "livestreetcms.com", + "cats": [ 1 ], + "headers": { "X-Powered-By": "LiveStreet CMS" } } } } diff --git a/drivers/firefox/content/js/content.js b/drivers/firefox/content/js/content.js index 82bf29fce..876d35f43 100644 --- a/drivers/firefox/content/js/content.js +++ b/drivers/firefox/content/js/content.js @@ -1,72 +1,72 @@ -"use strict"; - -(function() { - var - data = {}, - lastEnv = [], - prefs = sendSyncMessage('wappalyzer', { action: 'get prefs' })[0] - ; - - addEventListener('DOMContentLoaded', function() { - removeEventListener('DOMContentLoaded', onLoad, false); - - onLoad(); - }, false); - - function onLoad() { - if ( content.document.contentType != 'text/html' ) { - return; - } - - if ( prefs.analyzeJavaScript && prefs.analyzeOnLoad ) { - content.document.documentElement.addEventListener('load', function() { - var env = Object.keys(content.wrappedJSObject).slice(0, 500); - - lastEnv = env; - - // Only analyze new variables - env = { env: env.filter(function(i) { return lastEnv.indexOf(i) === -1; }) }; - - if ( env.length ) { - sendAsyncMessage('wappalyzer', { - action: 'analyze', - analyze: { env: env } - }); - } - - env = null; - - removeEventListener('load', onLoad, true); - }, true); - } - - // HTML - var html = content.document.documentElement.outerHTML; - - // Comments outside HTML - //if ( content.document.lastChild.nodeType === 8 ) { - //content.alert(content.document.lastChild.nodeValue); - //} - - if ( html.length > 50000 ) { - html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length); - } - - data = { html: html }; - - if ( prefs.analyzeJavaScript ) { - data.env = Object.keys(content.wrappedJSObject).slice(0, 500); - - lastEnv = data.env; - } - - sendAsyncMessage('wappalyzer', { - action: 'analyze', - hostname: content.location.hostname, - url: content.location.href, - analyze: data - }); - - data = null; - } -})(); +"use strict"; + +(function() { + var + data = {}, + lastEnv = [], + prefs = sendSyncMessage('wappalyzer', { action: 'get prefs' })[0] + ; + + addEventListener('DOMContentLoaded', function() { + removeEventListener('DOMContentLoaded', onLoad, false); + + onLoad(); + }, false); + + function onLoad() { + if ( content.document.contentType != 'text/html' ) { + return; + } + + if ( prefs.analyzeJavaScript && prefs.analyzeOnLoad ) { + content.document.documentElement.addEventListener('load', function() { + var env = Object.keys(content.wrappedJSObject).slice(0, 500); + + lastEnv = env; + + // Only analyze new variables + env = { env: env.filter(function(i) { return lastEnv.indexOf(i) === -1; }) }; + + if ( env.length ) { + sendAsyncMessage('wappalyzer', { + action: 'analyze', + analyze: { env: env } + }); + } + + env = null; + + removeEventListener('load', onLoad, true); + }, true); + } + + // HTML + var html = content.document.documentElement.outerHTML; + + // Comments outside HTML + //if ( content.document.lastChild.nodeType === 8 ) { + //content.alert(content.document.lastChild.nodeValue); + //} + + if ( html.length > 50000 ) { + html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length); + } + + data = { html: html }; + + if ( prefs.analyzeJavaScript ) { + data.env = Object.keys(content.wrappedJSObject).slice(0, 500); + + lastEnv = data.env; + } + + sendAsyncMessage('wappalyzer', { + action: 'analyze', + hostname: content.location.hostname, + url: content.location.href, + analyze: data + }); + + data = null; + } +})(); diff --git a/drivers/firefox/content/js/wappalyzer.js b/drivers/firefox/content/js/wappalyzer.js index 6257ac81e..3bb3d9ad2 100644 --- a/drivers/firefox/content/js/wappalyzer.js +++ b/drivers/firefox/content/js/wappalyzer.js @@ -13,64 +13,64 @@ var wappalyzer = (function() { * Application class */ var Application = function(app, detected) { - var self = this; - - self.app = app; - self.confidence = {}; - self.confidenceTotal = 0; - self.detected = Boolean(detected); - self.version = ''; - self.versions = []; + this.app = app; + this.confidence = {}; + this.confidenceTotal = 0; + this.detected = Boolean(detected); + this.version = ''; + this.versions = []; + }; + Application.prototype = { /** * Calculate confidence total */ - self.getConfidence = function() { + getConfidence: function() { var total = 0; - for ( id in self.confidence ) { - total += self.confidence[id]; + for ( id in this.confidence ) { + total += this.confidence[id]; } - return self.confidenceTotal = Math.min(total, 100); - } + return this.confidenceTotal = Math.min(total, 100); + }, /** * Resolve version number (find the longest version number that contains all shorter detected version numbers) */ - self.getVersion = function() { - var next, resolved; + getVersion: function() { + var i, next, resolved; - if ( !self.versions.length ) { + if ( !this.versions.length ) { return; } - self.versions.sort(function(a, b) { + this.versions.sort(function(a, b) { return a.length > b.length ? 1 : ( a.length < b.length ? -1 : 0 ); }); - resolved = self.versions[0]; + resolved = this.versions[0]; - for ( i in self.versions ) { + for ( i in this.versions ) { next = parseInt(i) + 1; - if ( next < self.versions.length ) { - if ( self.versions[next].indexOf(self.versions[i]) !== -1 ) { - resolved = self.versions[next]; + if ( next < this.versions.length ) { + if ( this.versions[next].indexOf(this.versions[i]) !== -1 ) { + resolved = this.versions[next]; } else { break; } } } - return self.version = resolved; - } + return this.version = resolved; + }, - self.setDetected = function(pattern, type, value, key) { - self.detected = true; + setDetected: function(pattern, type, value, key) { + this.detected = true; // Set confidence level - self.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; + this.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; // Detect version number if ( pattern.version ) { @@ -79,13 +79,20 @@ var wappalyzer = (function() { matches = pattern.regex.exec(value) ; + w.log({ matches: matches, version: version }); + if ( matches ) { matches.map(function(match, i) { // Parse ternary operator var ternary = new RegExp('\\\\' + i + '\\?([^:]+):(.+)$').exec(version); if ( ternary && ternary.length === 3 ) { + + w.log({ match: match, i: i, ternary: ternary }); + version = version.replace(ternary[0], match ? ternary[1] : ternary[2]); + + w.log({ version: version }); } // Replace back references @@ -93,14 +100,43 @@ var wappalyzer = (function() { }); if ( version ) { - self.versions.push(version); + this.versions.push(version); } - self.getVersion(); + this.getVersion(); } } } - } + }; + + var Profiler = function() { + this.regexCount = 0; + this.startTime = new Date().getTime(); + this.lastTime = new Date().getTime(); + this.slowest = { duration: null, app: '', type: '', pattern: '' }; + this.timedOut = false; + }; + + Profiler.prototype = { + checkPoint: function(app, type, regex) { + var duration = new Date().getTime() - this.lastTime; + + if ( !this.slowest.duration || duration > this.slowest.duration ) { + this.slowest.duration = duration; + this.slowest.app = app; + this.slowest.type = type; + this.slowest.regex = regex; + } + + this.lastTime = new Date().getTime(); + + this.timedOut = this.getDuration() > 1000; + }, + + getDuration: function() { + return new Date().getTime() - this.startTime; + } + }; /** * Call driver functions @@ -172,15 +208,9 @@ var wappalyzer = (function() { config: { environment: 'dev', // dev | live - - version: false, - websiteURL: 'http://wappalyzer.com/', twitterURL: 'https://twitter.com/Wappalyzer', githubURL: 'https://github.com/ElbertF/Wappalyzer', - - firstRun: false, - upgraded: false }, /** @@ -214,19 +244,7 @@ var wappalyzer = (function() { } // Initialize driver - driver('init', function() { - if ( w.config.firstRun ) { - driver('goToURL', { url: w.config.websiteURL + 'installed', medium: 'install' }); - - w.config.firstRun = false; - } - - if ( w.config.upgraded ) { - driver('goToURL', { url: w.config.websiteURL + 'upgraded', medium: 'upgrade' }); - - w.config.upgraded = false; - } - }); + driver('init'); }, /** @@ -235,10 +253,7 @@ var wappalyzer = (function() { analyze: function(hostname, url, data) { var i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header, version, - profiler = { - regexCount: 0, - startTime: new Date().getTime() - }, + profiler = new Profiler(), apps = {} ; @@ -257,13 +272,21 @@ var wappalyzer = (function() { } for ( app in w.apps ) { + // Exit loop after one second to prevent CPU hogging + // Remaining patterns will not be evaluated + if ( profiler.timedOut ) { + w.log('Timeout, exiting loop'); + + break; + } + apps[app] = w.detected[url] && w.detected[url][app] ? w.detected[url][app] : new Application(app); for ( type in w.apps[app] ) { switch ( type ) { case 'url': parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(url) ) { apps[app].setDetected(pattern, type, url); @@ -277,7 +300,7 @@ var wappalyzer = (function() { } parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(data[type]) ) { apps[app].setDetected(pattern, type, data[type]); @@ -293,10 +316,10 @@ var wappalyzer = (function() { regexScript = new RegExp(']+src=("|\')([^"\']+)', 'ig'); parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); while ( match = regexScript.exec(data.html) ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(match[2]) ) { apps[app].setDetected(pattern, type, match[2]); @@ -310,19 +333,17 @@ var wappalyzer = (function() { break; } - profiler.regexCount ++; - regexMeta = /]+>/ig; while ( match = regexMeta.exec(data.html) ) { for ( meta in w.apps[app][type] ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, regexMeta); if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { content = match.toString().match(/content=("|')([^"']+)("|')/i); parse(w.apps[app].meta[meta]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( content && content.length === 4 && pattern.regex.test(content[2]) ) { apps[app].setDetected(pattern, type, content[2], meta); @@ -340,7 +361,7 @@ var wappalyzer = (function() { for ( header in w.apps[app].headers ) { parse(w.apps[app][type][header]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) { apps[app].setDetected(pattern, type, data[type][header], header); @@ -356,7 +377,7 @@ var wappalyzer = (function() { parse(w.apps[app][type]).map(function(pattern) { for ( i in data[type] ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(data[type][i]) ) { apps[app].setDetected(pattern, type, data[type][i]); @@ -369,7 +390,8 @@ var wappalyzer = (function() { } } - w.log('Tested ' + profiler.regexCount + ' regular expressions in ' + ( ( ( new Date ).getTime() - profiler.startTime ) / 1000 ) + 's'); + w.log('[ PROFILER ] Tested ' + profiler.regexCount + ' regular expressions in ' + ( profiler.getDuration() / 1000 ) + 's'); + w.log('[ PROFILER ] Slowest pattern took ' + ( profiler.slowest.duration / 1000 ) + 's: ' + profiler.slowest.app + ' | ' + profiler.slowest.type + ' | ' + profiler.slowest.regex); for ( app in apps ) { if ( !apps[app].detected ) { diff --git a/drivers/firefox/install.rdf b/drivers/firefox/install.rdf index 88cbcdea1..64f705e29 100644 --- a/drivers/firefox/install.rdf +++ b/drivers/firefox/install.rdf @@ -3,7 +3,7 @@ wappalyzer@crunchlabz.com - 2.7.0 + 2.7.1 2 true @@ -12,7 +12,16 @@ {ec8030f7-c20a-464f-9b0e-13a3a9e97384} 4.0 - 20.* + 22.* + + + + + + + {92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} + 2.0 + 3.* diff --git a/drivers/firefox/skin/images/icons/3DM.png b/drivers/firefox/skin/images/icons/3DM.png new file mode 100755 index 000000000..69e17bcb4 Binary files /dev/null and b/drivers/firefox/skin/images/icons/3DM.png differ diff --git a/drivers/firefox/skin/images/icons/3ware.png b/drivers/firefox/skin/images/icons/3ware.png new file mode 100755 index 000000000..69e17bcb4 Binary files /dev/null and b/drivers/firefox/skin/images/icons/3ware.png differ diff --git a/drivers/firefox/skin/images/icons/ATEN.png b/drivers/firefox/skin/images/icons/ATEN.png new file mode 100755 index 000000000..f15a46b5f Binary files /dev/null and b/drivers/firefox/skin/images/icons/ATEN.png differ diff --git a/drivers/firefox/skin/images/icons/Apache HBase.png b/drivers/firefox/skin/images/icons/Apache HBase.png new file mode 100644 index 000000000..113d901a6 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Apache HBase.png differ diff --git a/drivers/firefox/skin/images/icons/Apache Hadoop.png b/drivers/firefox/skin/images/icons/Apache Hadoop.png new file mode 100755 index 000000000..39075d893 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Apache Hadoop.png differ diff --git a/drivers/firefox/skin/images/icons/Backbone.js.png b/drivers/firefox/skin/images/icons/Backbone.js.png index 7d774c810..d45b1b17b 100644 Binary files a/drivers/firefox/skin/images/icons/Backbone.js.png and b/drivers/firefox/skin/images/icons/Backbone.js.png differ diff --git a/drivers/firefox/skin/images/icons/BaseHTTP.png b/drivers/firefox/skin/images/icons/BaseHTTP.png new file mode 100755 index 000000000..68b9f6bfc Binary files /dev/null and b/drivers/firefox/skin/images/icons/BaseHTTP.png differ diff --git a/drivers/firefox/skin/images/icons/Boa.png b/drivers/firefox/skin/images/icons/Boa.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Boa.png differ diff --git a/drivers/firefox/skin/images/icons/Brother.png b/drivers/firefox/skin/images/icons/Brother.png new file mode 100755 index 000000000..fbc41595e Binary files /dev/null and b/drivers/firefox/skin/images/icons/Brother.png differ diff --git a/drivers/firefox/skin/images/icons/Canon.png b/drivers/firefox/skin/images/icons/Canon.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/firefox/skin/images/icons/Canon.png differ diff --git a/drivers/firefox/skin/images/icons/Catwalk.png b/drivers/firefox/skin/images/icons/Catwalk.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/firefox/skin/images/icons/Catwalk.png differ diff --git a/drivers/firefox/skin/images/icons/CherryPy.png b/drivers/firefox/skin/images/icons/CherryPy.png new file mode 100755 index 000000000..badc40ac2 Binary files /dev/null and b/drivers/firefox/skin/images/icons/CherryPy.png differ diff --git a/drivers/firefox/skin/images/icons/Cloudera.png b/drivers/firefox/skin/images/icons/Cloudera.png new file mode 100755 index 000000000..4d3a6a1d4 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Cloudera.png differ diff --git a/drivers/firefox/skin/images/icons/CodeMirror.png b/drivers/firefox/skin/images/icons/CodeMirror.png new file mode 100644 index 000000000..ef34d402c Binary files /dev/null and b/drivers/firefox/skin/images/icons/CodeMirror.png differ diff --git a/drivers/firefox/skin/images/icons/CompaqHTTPServer.png b/drivers/firefox/skin/images/icons/CompaqHTTPServer.png new file mode 100755 index 000000000..2b0bc39df Binary files /dev/null and b/drivers/firefox/skin/images/icons/CompaqHTTPServer.png differ diff --git a/drivers/firefox/skin/images/icons/Cufon.png b/drivers/firefox/skin/images/icons/Cufon.png new file mode 100644 index 000000000..cd2e3f029 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Cufon.png differ diff --git a/drivers/firefox/skin/images/icons/Darwin.png b/drivers/firefox/skin/images/icons/Darwin.png new file mode 100755 index 000000000..41b6c8b00 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Darwin.png differ diff --git a/drivers/firefox/skin/images/icons/Dell.png b/drivers/firefox/skin/images/icons/Dell.png new file mode 100755 index 000000000..76a80b4fa Binary files /dev/null and b/drivers/firefox/skin/images/icons/Dell.png differ diff --git a/drivers/firefox/skin/images/icons/ELOG HTTP.png b/drivers/firefox/skin/images/icons/ELOG HTTP.png new file mode 100644 index 000000000..7af2b77e9 Binary files /dev/null and b/drivers/firefox/skin/images/icons/ELOG HTTP.png differ diff --git a/drivers/firefox/skin/images/icons/ELOG.png b/drivers/firefox/skin/images/icons/ELOG.png new file mode 100644 index 000000000..7af2b77e9 Binary files /dev/null and b/drivers/firefox/skin/images/icons/ELOG.png differ diff --git a/drivers/firefox/skin/images/icons/EWS-NIC4.png b/drivers/firefox/skin/images/icons/EWS-NIC4.png new file mode 100755 index 000000000..76a80b4fa Binary files /dev/null and b/drivers/firefox/skin/images/icons/EWS-NIC4.png differ diff --git a/drivers/firefox/skin/images/icons/Erlang.png b/drivers/firefox/skin/images/icons/Erlang.png new file mode 100755 index 000000000..235338617 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Erlang.png differ diff --git a/drivers/firefox/skin/images/icons/FlashCom.png b/drivers/firefox/skin/images/icons/FlashCom.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/firefox/skin/images/icons/FlashCom.png differ diff --git a/drivers/firefox/skin/images/icons/Grandstream.png b/drivers/firefox/skin/images/icons/Grandstream.png new file mode 100755 index 000000000..b4b1eb66b Binary files /dev/null and b/drivers/firefox/skin/images/icons/Grandstream.png differ diff --git a/drivers/firefox/skin/images/icons/HP ProCurve.png b/drivers/firefox/skin/images/icons/HP ProCurve.png new file mode 100755 index 000000000..2b0bc39df Binary files /dev/null and b/drivers/firefox/skin/images/icons/HP ProCurve.png differ diff --git a/drivers/firefox/skin/images/icons/Highstock.png b/drivers/firefox/skin/images/icons/Highstock.png new file mode 100755 index 000000000..6e8391d36 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Highstock.png differ diff --git a/drivers/firefox/skin/images/icons/Indico.png b/drivers/firefox/skin/images/icons/Indico.png new file mode 100755 index 000000000..02636b6cc Binary files /dev/null and b/drivers/firefox/skin/images/icons/Indico.png differ diff --git a/drivers/firefox/skin/images/icons/Intercom.png b/drivers/firefox/skin/images/icons/Intercom.png new file mode 100644 index 000000000..40d2321a0 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Intercom.png differ diff --git a/drivers/firefox/skin/images/icons/Jetty.png b/drivers/firefox/skin/images/icons/Jetty.png new file mode 100755 index 000000000..807b88634 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Jetty.png differ diff --git a/drivers/firefox/skin/images/icons/KS_HTTP.png b/drivers/firefox/skin/images/icons/KS_HTTP.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/firefox/skin/images/icons/KS_HTTP.png differ diff --git a/drivers/firefox/skin/images/icons/LabVIEW.png b/drivers/firefox/skin/images/icons/LabVIEW.png new file mode 100755 index 000000000..c832bdc54 Binary files /dev/null and b/drivers/firefox/skin/images/icons/LabVIEW.png differ diff --git a/drivers/firefox/skin/images/icons/Less.png b/drivers/firefox/skin/images/icons/Less.png new file mode 100644 index 000000000..9e1de2359 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Less.png differ diff --git a/drivers/firefox/skin/images/icons/LiveStreet CMS.png b/drivers/firefox/skin/images/icons/LiveStreet CMS.png new file mode 100644 index 000000000..75a0029aa Binary files /dev/null and b/drivers/firefox/skin/images/icons/LiveStreet CMS.png differ diff --git a/drivers/firefox/skin/images/icons/Logitech Media Server.png b/drivers/firefox/skin/images/icons/Logitech Media Server.png new file mode 100755 index 000000000..b2e6cb1f2 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Logitech Media Server.png differ diff --git a/drivers/firefox/skin/images/icons/MOBOTIX.png b/drivers/firefox/skin/images/icons/MOBOTIX.png new file mode 100755 index 000000000..321f9a8b1 Binary files /dev/null and b/drivers/firefox/skin/images/icons/MOBOTIX.png differ diff --git a/drivers/firefox/skin/images/icons/MiniServ.png b/drivers/firefox/skin/images/icons/MiniServ.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/firefox/skin/images/icons/MiniServ.png differ diff --git a/drivers/firefox/skin/images/icons/Mono.png b/drivers/firefox/skin/images/icons/Mono.png new file mode 100644 index 000000000..912809eb2 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Mono.png differ diff --git a/drivers/firefox/skin/images/icons/PerfSONAR-PS.png b/drivers/firefox/skin/images/icons/PerfSONAR-PS.png new file mode 100755 index 000000000..13be42d00 Binary files /dev/null and b/drivers/firefox/skin/images/icons/PerfSONAR-PS.png differ diff --git a/drivers/firefox/skin/images/icons/Posterous.png b/drivers/firefox/skin/images/icons/Posterous.png new file mode 100644 index 000000000..3150f4f93 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Posterous.png differ diff --git a/drivers/firefox/skin/images/icons/Prefix-Free.png b/drivers/firefox/skin/images/icons/Prefix-Free.png new file mode 100644 index 000000000..87a646815 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Prefix-Free.png differ diff --git a/drivers/firefox/skin/images/icons/SAP.png b/drivers/firefox/skin/images/icons/SAP.png new file mode 100644 index 000000000..9217c8f87 Binary files /dev/null and b/drivers/firefox/skin/images/icons/SAP.png differ diff --git a/drivers/firefox/skin/images/icons/Sentinel Keys Server.png b/drivers/firefox/skin/images/icons/Sentinel Keys Server.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/firefox/skin/images/icons/Sentinel Keys Server.png differ diff --git a/drivers/firefox/skin/images/icons/Sentinel License Monitor.png b/drivers/firefox/skin/images/icons/Sentinel License Monitor.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/firefox/skin/images/icons/Sentinel License Monitor.png differ diff --git a/drivers/firefox/skin/images/icons/Sentinel Protection Server.png b/drivers/firefox/skin/images/icons/Sentinel Protection Server.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/firefox/skin/images/icons/Sentinel Protection Server.png differ diff --git a/drivers/firefox/skin/images/icons/Splunk.png b/drivers/firefox/skin/images/icons/Splunk.png new file mode 100755 index 000000000..bd2a1a514 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Splunk.png differ diff --git a/drivers/firefox/skin/images/icons/Splunkd.png b/drivers/firefox/skin/images/icons/Splunkd.png new file mode 100755 index 000000000..bd2a1a514 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Splunkd.png differ diff --git a/drivers/firefox/skin/images/icons/SunOS.png b/drivers/firefox/skin/images/icons/SunOS.png new file mode 100755 index 000000000..725070080 Binary files /dev/null and b/drivers/firefox/skin/images/icons/SunOS.png differ diff --git a/drivers/firefox/skin/images/icons/TWiki.png b/drivers/firefox/skin/images/icons/TWiki.png new file mode 100644 index 000000000..f6573b7fa Binary files /dev/null and b/drivers/firefox/skin/images/icons/TWiki.png differ diff --git a/drivers/firefox/skin/images/icons/Underscore.js.png b/drivers/firefox/skin/images/icons/Underscore.js.png index 10262b99d..030496838 100644 Binary files a/drivers/firefox/skin/images/icons/Underscore.js.png and b/drivers/firefox/skin/images/icons/Underscore.js.png differ diff --git a/drivers/firefox/skin/images/icons/Wink.png b/drivers/firefox/skin/images/icons/Wink.png new file mode 100644 index 000000000..3e7204032 Binary files /dev/null and b/drivers/firefox/skin/images/icons/Wink.png differ diff --git a/drivers/firefox/skin/images/icons/Wowza Media Server.png b/drivers/firefox/skin/images/icons/Wowza Media Server.png new file mode 100755 index 000000000..2e7c25e2b Binary files /dev/null and b/drivers/firefox/skin/images/icons/Wowza Media Server.png differ diff --git a/drivers/firefox/skin/images/icons/XAMPP.png b/drivers/firefox/skin/images/icons/XAMPP.png new file mode 100755 index 000000000..7104b0e4d Binary files /dev/null and b/drivers/firefox/skin/images/icons/XAMPP.png differ diff --git a/drivers/firefox/skin/images/icons/Xajax.png b/drivers/firefox/skin/images/icons/Xajax.png new file mode 100644 index 000000000..bba0d40ab Binary files /dev/null and b/drivers/firefox/skin/images/icons/Xajax.png differ diff --git a/drivers/firefox/skin/images/icons/Zabbix.png b/drivers/firefox/skin/images/icons/Zabbix.png new file mode 100755 index 000000000..c7384dc3e Binary files /dev/null and b/drivers/firefox/skin/images/icons/Zabbix.png differ diff --git a/drivers/firefox/skin/images/icons/debut.png b/drivers/firefox/skin/images/icons/debut.png new file mode 100755 index 000000000..fbc41595e Binary files /dev/null and b/drivers/firefox/skin/images/icons/debut.png differ diff --git a/drivers/firefox/skin/images/icons/default.png b/drivers/firefox/skin/images/icons/default.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/firefox/skin/images/icons/default.png differ diff --git a/drivers/firefox/skin/images/icons/dwhttpd.png b/drivers/firefox/skin/images/icons/dwhttpd.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/firefox/skin/images/icons/dwhttpd.png differ diff --git a/drivers/firefox/skin/images/icons/eHTTP.png b/drivers/firefox/skin/images/icons/eHTTP.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/firefox/skin/images/icons/eHTTP.png differ diff --git a/drivers/firefox/skin/images/icons/libwww-perl-daemon.png b/drivers/firefox/skin/images/icons/libwww-perl-daemon.png new file mode 100755 index 000000000..2110788f2 Binary files /dev/null and b/drivers/firefox/skin/images/icons/libwww-perl-daemon.png differ diff --git a/drivers/firefox/skin/images/icons/mod_auth_pam.png b/drivers/firefox/skin/images/icons/mod_auth_pam.png new file mode 100755 index 000000000..d268dcca8 Binary files /dev/null and b/drivers/firefox/skin/images/icons/mod_auth_pam.png differ diff --git a/drivers/firefox/skin/images/icons/mod_jk.png b/drivers/firefox/skin/images/icons/mod_jk.png new file mode 100755 index 000000000..d268dcca8 Binary files /dev/null and b/drivers/firefox/skin/images/icons/mod_jk.png differ diff --git a/drivers/firefox/skin/images/icons/mod_perl.png b/drivers/firefox/skin/images/icons/mod_perl.png new file mode 100755 index 000000000..3f0559995 Binary files /dev/null and b/drivers/firefox/skin/images/icons/mod_perl.png differ diff --git a/drivers/firefox/skin/images/icons/posterous.png b/drivers/firefox/skin/images/icons/posterous.png index 3730d31aa..3150f4f93 100644 Binary files a/drivers/firefox/skin/images/icons/posterous.png and b/drivers/firefox/skin/images/icons/posterous.png differ diff --git a/drivers/html/apps.json b/drivers/html/apps.json index 468e8d4e9..3002cb2b1 100644 --- a/drivers/html/apps.json +++ b/drivers/html/apps.json @@ -35,21 +35,25 @@ "33": "web-server-extensions", "34": "databases", "35": "maps", - "36": "advertising-networks" + "36": "advertising-networks", + "37": "network-devices", + "38": "media-servers", + "39": "webcams", + "40": "printers" }, "apps": { "1C-Bitrix": { "website": "www.1c-bitrix.ru", "cats": [ 1 ], "headers": { "X-Powered-CMS": "Bitrix Site Manager", "Set-Cookie": "BITRIX_" }, - "html": "]+components\/bitrix|(src|href)=\"\/bitrix\/(js|templates)", + "html": "(?:]+components/bitrix|(?:src|href)=\"/bitrix/(?:js|templates))", "script": "1c-bitrix", "implies": "PHP" }, "1und1": { "website": "1und1.de", "cats": [ 6 ], - "url": "\/shop\/catalog\/browse\\?sessid=", + "url": "/shop/catalog/browse\\?sessid=", "implies": "PHP" }, "2z Project": { @@ -61,7 +65,18 @@ "website": "www.3dcart.com", "cats": [ 1, 6 ], "headers": { "X-Powered-By": "3DCART" }, - "script": "(twlh(track)?\\.asp|3d_upsell\\.js)" + "script": "(?:twlh(?:track)?\\.asp|3d_upsell\\.js)" + }, + "3DM": { + "website": "www.3ware.com", + "cats": [ 19 ], + "html": "3ware 3DM([\\d\\.]+)?\\;version:\\1", + "implies": "3ware" + }, + "3ware": { + "website": "www.3ware.com", + "cats": [ 22 ], + "headers": { "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1" } }, "Accessible Portal": { "website": "www.accessibleportal.com", @@ -72,20 +87,29 @@ "AddThis": { "website": "www.addthis.com", "cats": [ 5 ], - "script": "addthis\\.com\/js\/(\\d+)?\\;version:\\1", + "script": "addthis\\.com/js/(\\d+)?\\;version:\\1", "env": "^addthis" }, + "Adobe ColdFusion": { + "website": "adobe.com/products/coldfusion-family.html", + "cats": [ 18 ], + "url": "\\.cfm$", + "html": "<!-- START headerTags\\.cfm", + "script": "/cfajax/", + "env": "^_cfEmails$", + "implies": "CFML" + }, "Adobe CQ5": { - "website": "adobe.com\/products\/cq.html", + "website": "adobe.com/products/cq.html", "cats": [ 1 ], - "url": "\/etc\/designs\/", + "url": "/etc/designs/", "html": "<div class=\"[^\"]*parbase", "implies": "Java" }, "Adobe GoLive": { - "website": "www.adobe.com\/products\/golive", + "website": "www.adobe.com/products/golive", "cats": [ 20 ], - "meta": { "generator": "Adobe GoLive(\\s([\\d.]+))?\\;version:\\2" } + "meta": { "generator": "Adobe GoLive(?:\\s([\\d.]+))?\\;version:\\1" } }, "Advanced Web Stats": { "website": "www.advancedwebstats.com", @@ -99,9 +123,9 @@ "env": "^AUI$" }, "Amaya": { - "website": "www.w3.org\/Amaya", + "website": "www.w3.org/Amaya", "cats": [ 20 ], - "meta": { "generator": "Amaya( V?([\\d.]+[a-z]))?\\;version:\\2" } + "meta": { "generator": "Amaya(?: V?([\\d.]+[a-z]))?\\;version:\\1" } }, "amCharts": { "website": "amcharts.com", @@ -112,7 +136,7 @@ "Ametys": { "website": "ametys.org", "cats": [ 1 ], - "meta": { "generator": "(Ametys|Anyware Technologies)" }, + "meta": { "generator": "(?:Ametys|Anyware Technologies)" }, "script": "STools\\.js", "implies": "Java" }, @@ -120,7 +144,7 @@ "website": "amirocms.com", "cats": [ 1 ], "meta": { "generator": "Amiro" }, - "html": "system_(js\\.php\\?script=|css\\.php\\?styles)[^\"]+cv=([\\d.]+)\\;version:\\2", + "html": "system_(?:js\\.php\\?script=|css\\.php\\?styles)[^\"]+cv=([\\d.]+)\\;version:\\1", "implies": "PHP" }, "AMPcms": { @@ -138,12 +162,22 @@ "AOLserver": { "website": "aolserver.com", "cats": [ 22 ], - "headers": { "Server": "AOLserver\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "AOLserver/?([\\d.]+)?\\;version:\\1" } }, "Apache": { "website": "apache.org", "cats": [ 22 ], - "headers": { "Server": "(Apache($|\/([\\d.]+)|[^\/-])|(^|\\b)HTTPD)\\;version:\\3" } + "headers": { "Server": "(?:Apache(?:$|/([\\d.]+)|[^/-])|(?:^|\\b)HTTPD)\\;version:\\1" } + }, + "Apache Hadoop": { + "website": "hadoop.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hadoop.css\"" + }, + "Apache HBase": { + "website": "hbase.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hbase.css\"" }, "Apache JSPWiki": { "website": "jspwiki.org", @@ -155,12 +189,12 @@ "Apache Tomcat": { "website": "tomcat.apache.org", "cats": [ 22 ], - "headers": { "Server": "Apache-Coyote\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "Apache-Coyote/?([\\d.]+)?\\;version:\\1" } }, "Apache Traffic Server": { - "website": "trafficserver.apache.org\/", + "website": "trafficserver.apache.org/", "cats": [ 22 ], - "headers": { "Server": "ATS\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "ATS/?([\\d.]+)?\\;version:\\1" } }, "Arc Forum": { "website": "arclanguage.org", @@ -168,42 +202,47 @@ "html": "ping\\.src = node\\.href;" }, "AsciiDoc": { - "website": "www.methods.co.nz\/asciidoc", + "website": "www.methods.co.nz/asciidoc", "cats": [ 1, 20, 27 ], "meta": { "generator": "^AsciiDoc ([\\d.]+)\\;version:\\1" }, "env": "^asciidoc$" }, + "ATEN": { + "website": "www.aten.com", + "cats": [ 22 ], + "headers": { "Server": "ATEN HTTP Server(\\(V?([\\d\\.]+)\\))?\\;version:\\2" } + }, "ATG Web Commerce": { - "website": "oracle.com\/us\/products\/applications\/web-commerce\/atg", + "website": "oracle.com/us/products/applications/web-commerce/atg", "cats": [ 6 ], - "headers": { "X-ATG-Version": "(ATGPlatform\/([\\d.]+))?\\;version:\\2" }, + "headers": { "X-ATG-Version": "(?:ATGPlatform/([\\d.]+))?\\;version:\\1" }, "html": "<[^>]+_DARGS" }, "Atlassian Confluence": { - "website": "www.atlassian.com\/software\/confluence\/overview\/team-collaboration-software", + "website": "www.atlassian.com/software/confluence/overview/team-collaboration-software", "cats": [ 8 ], - "html": "Powered by <a href=[^>]+atlassian\\.com\/software\/confluence([^>]+>Atlassian Confluence<\/a> ([\\d.]+))?\\;version:\\2", + "html": "Powered by <a href=[^>]+atlassian\\.com/software/confluence(?:[^>]+>Atlassian Confluence</a> ([\\d.]+))?\\;version:\\1", "headers": { "X-Confluence-Request-Time": ".*" }, "meta": { "confluence-request-time": ".*" }, "implies": "Java" }, "Atlassian Jira": { - "website": "www.atlassian.com\/software\/jira\/overview\/", + "website": "www.atlassian.com/software/jira/overview/", "cats": [ 13 ], "env": "^jira$", - "script": "\/jira\/s\/", - "url": "\/secure\/Dashboard.jspa", - "html": "Powered by\\s+<a href=[^>]+atlassian\\.com\/(software\/jira|jira-bug-tracking\/)[^>]+>Atlassian\\s+JIRA([^v]*v(ersion: )?(\\d+\\.\\d+(\\.\\d+)?))?\\;version:\\4", + "script": "/jira/s/", + "url": "/secure/Dashboard\\.jspa", + "html": "Powered by\\s+<a href=[^>]+atlassian\\.com/(?:software/jira|jira-bug-tracking/)[^>]+>Atlassian\\s+JIRA(?:[^v]*v(?:ersion: )?(\\d+\\.\\d+(\\.\\d+)?))?\\;version:\\1", "implies": "Java" }, "AWStats": { "website": "awstats.sourceforge.net", "cats": [ 10 ], - "meta": { "generator": "AWStats ([\\d.]+( \\(build [\\d.]+\\))?)\\;version:\\1" }, + "meta": { "generator": "AWStats ([\\d.]+(?: \\(?:build [\\d.]+\\))?)\\;version:\\1" }, "implies": "Perl" }, "Backbone.js": { - "website": "documentcloud.github.com\/backbone", + "website": "documentcloud.github.com/backbone", "cats": [ 12 ], "script": "backbone.*\\.js", "env": "^Backbone$", @@ -212,26 +251,32 @@ "Banshee": { "website": "www.banshee-php.org", "cats": [ 1, 18 ], - "html": "Built upon the <a href=\"[^>]+banshee-php\\.org\/\">[a-z]+<\/a>(v([\\d.]+))?\\;version:\\2", + "html": "Built upon the <a href=\"[^>]+banshee-php\\.org/\">[a-z]+</a>(?:v([\\d.]+))?\\;version:\\1", "implies": "PHP" }, + "BaseHTTP": { + "website": "docs.python.org/2/library/basehttpserver.html", + "cats": [ 22 ], + "headers": { "Server": "BaseHTTP\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" + }, "BIGACE": { "website": "bigace.de", "cats": [ 1 ], "meta": { "generator": "BIGACE ([\\d.]+)\\;version:\\1" }, - "html": "Powered by <a href=\"[^>]+BIGACE|<!--\\s+Site is running BIGACE", + "html": "(?:Powered by <a href=\"[^>]+BIGACE|<!--\\s+Site is running BIGACE)", "implies": "PHP" }, "Bigcommerce": { "website": "www.bigcommerce.com", "cats": [ 6 ], - "url": ".+\\.mybigcommerce\\.com", - "html": "<link href=[^>]+cdn\\d+\\.bigcommerce\\.com\/v", - "script": "cdn\\d+\\.bigcommerce\\.com\/v", + "url": "mybigcommerce\\.com", + "html": "<link href=[^>]+cdn\\d+\\.bigcommerce\\.com/v", + "script": "cdn\\d+\\.bigcommerce\\.com/v", "env": "^compareProducts$" }, "BigDump": { - "website": "www.ozerov.de\/bigdump.php", + "website": "www.ozerov.de/bigdump.php", "cats": [ 3 ], "html": "<!-- <h1>BigDump: Staggered MySQL Dump Importer ver\\. ([\\d.b]+)\\;version:\\1", "implies": "PHP" @@ -239,27 +284,36 @@ "Bigware": { "website": "bigware.de", "cats": [ 6 ], - "html": "Diese <a href=.+bigware\\.de|<a href=[^>]+\/main_bigware_\\d+\\.php", - "url": "(\\?|&)bigWAdminID=[a-z\\d]+(&|$)", - "headers": { "Set-Cookie": "bigwareCsid|bigWAdminID" }, + "html": "(?:Diese <a href=[^>]+bigware\\.de|<a href=[^>]+/main_bigware_\\d+\\.php)", + "url": "(?:\\?|&)bigWAdminID=", + "headers": { "Set-Cookie": "(?:bigwareCsid|bigWAdminID)" }, "implies": "PHP" }, "BittAds": { "website": "bittads.com", "cats": [ 36 ], - "script": "bittads\\.com\/js\/bitt\\.js$", + "script": "bittads\\.com/js/bitt\\.js$", "env": "^bitt$" }, "Blip.tv": { "website": "blip.tv", "cats": [ 14 ], - "html": "<(param|embed|iframe)[^>]+blip\\.tv\/play" + "html": "<(?:param|embed|iframe)[^>]+blip\\.tv/play" }, "Blogger": { "website": "www.blogger.com", "cats": [ 11 ], "meta": { "generator": "blogger" }, - "url": "^(www.)?.+\\.blogspot\\.com" + "url": "\\.blogspot\\.com" + }, + "Boa": { + "website": "www.boa.org", + "cats": [ 22 ], + "headers": { "Server": "Boa\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, + "Brother": { + "website": "www.brother.com", + "cats": [ 40 ] }, "BrowserCMS": { "website": "browsercms.org", @@ -285,6 +339,10 @@ "script": "CatalystScripts", "html": "<!-- BC_OBNW -->" }, + "Canon": { + "website": "www.canon.com", + "cats": [ 40 ] + }, "CakePHP": { "website": "cakephp.org", "cats": [ 18 ], @@ -296,17 +354,23 @@ "website": "cargocollective.com", "cats": [ 1 ], "meta": { "cargo_title": ".*" }, - "script": "\/cargo\\.", + "script": "/cargo\\.", "html": "<link [^>]+Cargo feed", "implies": "PHP" }, + "Catwalk": { + "website": "www.canon.com", + "cats": [ 22 ], + "headers": { "Server": "Catwalk\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Canon" + }, "CentOS": { "website": "centos.org", "cats": [ 28 ], "headers": { "Server": "CentOS", "X-Powered-By": "CentOS" } }, "CFML": { - "website": "adobe.com\/products\/coldfusion-family.html", + "website": "adobe.com/products/coldfusion-family.html", "cats": [ 27 ] }, "CacheFly": { @@ -323,7 +387,7 @@ "Chamilo": { "website": "www.chamilo.org", "cats": [ 21 ], - "html": "\">Chamilo ([\\d.]+)<\/a>\\;version:\\1", + "html": "\">Chamilo ([\\d.]+)</a>\\;version:\\1", "meta": { "generator": "Chamilo ([\\d.]+)\\;version:\\1" }, "headers": { "X-Powered-By": "Chamilo ([\\d.]+)\\;version:\\1" }, "implies": "PHP" @@ -332,12 +396,18 @@ "website": "chartbeat.com", "cats": [ 10 ], "html": "function loadChartbeat\\(\\) {", - "script": "chartbeat.js" + "script": "chartbeat\\.js" }, "Cherokee": { "website": "www.cherokee-project.com", "cats": [ 22 ], - "headers": { "Server": "Cherokee\/([\\d.]+)\\;version:\\1" } + "headers": { "Server": "Cherokee/([\\d.]+)\\;version:\\1" } + }, + "CherryPy": { + "website": "www.cherrypy.org", + "cats": [ 18, 22 ], + "headers": { "Server": "CherryPy\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" }, "CKEditor": { "website": "ckeditor.com", @@ -345,8 +415,13 @@ "env": "^CKEDITOR$", "implies": "PHP" }, + "Cloudera": { + "website": "www.cloudera.com", + "cats": [ 34 ], + "headers": { "Server": "cloudera" } + }, "ClickHeat": { - "website": "www.labsmedia.com\/clickheat\/index.html", + "website": "www.labsmedia.com/clickheat/index.html", "cats": [ 10 ], "script": "clickheat.*\\.js", "env": "^clickHeat", @@ -355,7 +430,7 @@ "ClickTale": { "website": "www.clicktale.com", "cats": [ 10 ], - "html": "if\\(typeof ClickTale(Tag)*==\"function\"\\)", + "html": "if\\(typeof ClickTale(Tag)*==\\\"function\\\"\\)", "env": "^ClickTale" }, "Clicky": { @@ -377,7 +452,7 @@ "implies": "PHP" }, "CMSimple": { - "website": "www.cmsimple.org\/en", + "website": "www.cmsimple.org/en", "cats": [ 1 ], "meta": { "generator": "CMSimple( [\\d.]+)?\\;version:\\1" }, "implies": "PHP" @@ -385,36 +460,46 @@ "CO2Stats": { "website": "co2stats.com", "cats": [ 10 ], - "html": "src=[^>]+co2stats\\.com\/propres\\.php" + "html": "src=[^>]+co2stats\\.com/propres\\.php" }, "CodeIgniter": { "website": "codeigniter.com", "cats": [ 18 ], - "headers": { "Set-Cookie": "(exp_last_activity|exp_tracker|ci_session)" }, + "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker|ci_session)" }, "implies": "PHP" }, + "CodeMirror": { + "website": "codemirror.net", + "cats": [ 19 ], + "env": "^CodeMirror$" + }, "Commerce Server": { "website": "commerceserver.net", "cats": [ 6 ], "headers": { "COMMERCE-SERVER-SOFTWARE": ".+" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "implies": "Microsoft ASP.NET" + }, + "CompaqHTTPServer": { + "website": "www.hp.com", + "cats": [ 22 ], + "headers": { "Server": "CompaqHTTPServer\\/?([\\d\\.]+)?\\;version:\\1" } }, "comScore": { "website": "comscore.com", "cats": [ 10 ], - "html": "<i{1}frame[^>]* (id=\"comscore\"|scr=[^>]+comscore)", + "html": "<iframe[^>]* (?:id=\"comscore\"|scr=[^>]+comscore)", "env": "^_?COMSCORE$" }, "Concrete5": { "website": "concrete5.org", "cats": [ 1 ], - "script": "concrete\/js\/", + "script": "concrete/js/", "meta": { "generator": "concrete5 - ([\\d.ab]+)\\;version:\\1" }, "env": "^CCM_IMAGE_PATH$", "implies": "PHP" }, "Connect": { - "website": "www.senchalabs.org\/connect", + "website": "www.senchalabs.org/connect", "cats": [ 18 ], "headers": { "X-Powered-By": "^Connect$" }, "implies": "node.js" @@ -422,25 +507,31 @@ "Contao": { "website": "contao.org", "cats": [ 1 ], - "html": "(<!--.+powered by (TYPOlight|Contao)-->|<link[^>]+(typolight|contao)\\.css)", + "html": "(?:<!--[^>]+powered by (?:TYPOlight|Contao)-->|<link[^>]+(?:typolight|contao)\\.css)", "implies": "PHP" }, "Contenido": { - "website": "contenido.org\/en", + "website": "contenido.org/en", "cats": [ 1 ], "meta": { "generator": "Contenido ([\\d.]+)\\;version:\\1" }, "implies": "PHP" }, "Contens": { - "website": "www.contens.com\/en\/pub\/index.cfm", + "website": "www.contens.com/en/pub/index.cfm", "cats": [ 1 ], "meta": { "generator": "Contensis CMS Version ([\\d.]+)\\;version:\\1" }, "implies": [ "Java", "CFML" ] }, + "ContentBox": { + "website": "www.gocontentbox.org", + "cats": [ 1, 11 ], + "meta": { "generator": "ContentBox powered by ColdBox" }, + "implies": "Adobe ColdFusion" + }, "ConversionLab": { - "website": "www.trackset.it\/conversionlab", + "website": "www.trackset.it/conversionlab", "cats": [ 10 ], - "script": "conversionlab\\.trackset\\.com\/track\/tsend\\.js" + "script": "conversionlab\\.trackset\\.com/track/tsend\\.js" }, "Coppermine": { "website": "coppermine-gallery.net", @@ -462,12 +553,12 @@ "CouchDB": { "website": "couchdb.apache.org", "cats": [ 22 ], - "headers": { "Server": "CouchDB\/([\\d.]+)\\;version:\\1" } + "headers": { "Server": "CouchDB/([\\d.]+)\\;version:\\1" } }, "cPanel": { "website": "www.cpanel.net", "cats": [ 9 ], - "headers": { "Server": "cpsrvd\/([\\d.]+)\\;version:\\1" }, + "headers": { "Server": "cpsrvd/([\\d.]+)\\;version:\\1" }, "html": "<!-- cPanel" }, "CPG Dragonfly": { @@ -481,40 +572,25 @@ "website": "crazyegg.com", "cats": [ 10 ], "env": "^CE2$", - "script": "cetrk\\.com\/pages\/scripts\/\\d+\/\\d+\\.js" + "script": "cetrk\\.com/pages/scripts/\\d+/\\d+\\.js" }, "Cross Pixel": { "website": "datadesk.crsspxl.com", "cats": [ 10 ], "env": "^crsspxl$", - "script": "tag\\.crsspxl\\.com\/s1\\.js" + "script": "tag\\.crsspxl\\.com/s1\\.js" }, "CS Cart": { "website": "www.cs-cart.com", "cats": [ 6 ], "env": "^fn_compare_strings$", - "html": " Powered by (<a href=[^>]+cs-cart\\.com|CS-Cart)", + "html": " Powered by (?:<a href=[^>]+cs-cart\\.com|CS-Cart)", "implies": "PHP" }, - "Adobe ColdFusion": { - "website": "adobe.com\/products\/coldfusion-family.html", - "cats": [ 18 ], - "url": "\\.cfm$", - "html": "<!-- START headerTags\\.cfm", - "script": "\/cfajax\/", - "env": "^_cfEmails$", - "implies": "CFML" - }, - "ContentBox": { - "website": "www.gocontentbox.org", - "cats": [ 1, 11 ], - "meta": { "generator": "ContentBox powered by ColdBox" }, - "implies": "Adobe ColdFusion" - }, "CubeCart": { "website": "www.cubecart.com", "cats": [ 6 ], - "html": "(Powered by <a href=[^>]+cubecart\\.com|<p[^>]+>Powered by CubeCart)", + "html": "(?:Powered by <a href=[^>]+cubecart\\.com|<p[^>]+>Powered by CubeCart)", "meta": { "generator": "cubecart" }, "implies": "PHP" }, @@ -525,9 +601,9 @@ "env": "^Cufon$" }, "d3": { - "website": "mbostock.github.com\/d3", + "website": "mbostock.github.com/d3", "cats": [ 25 ], - "script": "d3(\\.v2)(\\.min)?\\.js" + "script": "d3(?:\\.v2)?(?:\\.min)?\\.js" }, "Dancer": { "website": "perldancer.org", @@ -542,10 +618,10 @@ "meta": { "generator": "Danneo CMS ([\\d.]+)\\;version:\\1" }, "implies": [ "Apache", "PHP" ] }, - "dashCommerce": { - "website": "dashcommerce.org", - "cats": [ 6 ], - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "Darwin": { + "website": "opensource.apple.com", + "cats": [ 28 ], + "headers": { "Server": "Darwin", "X-Powered-By": "Darwin" } }, "DataLife Engine": { "website": "dle-news.ru", @@ -557,13 +633,18 @@ "David Webbox": { "website": "www.tobit.com", "cats": [ 22 ], - "headers": { "Server": "David-WebBox\/([\\d.a]+ \\(\\d+\\))\\;version:\\1" } + "headers": { "Server": "David-WebBox/([\\d.a]+ \\(\\d+\\))\\;version:\\1" } }, "Debian": { "website": "debian.org", "cats": [ 28 ], - "headers": { "Server": "Debian", "X-Powered-By": "(Debian|dotdeb|(sarge|etch|lenny|queeze|wheezy|jessie))\\;version:\\2" - } + "headers": { "Server": "Debian", "X-Powered-By": "(?:Debian|dotdeb|(sarge|etch|lenny|squeeze|wheezy|jessie))\\;version:\\1" } + }, + "debut": { + "website": "www.brother.com", + "cats": [ 22 ], + "headers": { "Server": "debut\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Brother" }, "DedeCMS": { "website": "dedecms.com", @@ -572,11 +653,15 @@ "script": "dedeajax", "implies": "PHP" }, + "Dell": { + "website": "dell.com", + "cats": [ 40 ] + }, "Demandware": { "website": "demandware.com", "cats": [ 6 ], "headers": { "Server": "Demandware eCommerce Server" }, - "html": "<[^>]+demandware.edgesuite", + "html": "<[^>]+demandware\\.edgesuite", "env": "^dwAnalytics$" }, "DHTMLX": { @@ -587,7 +672,7 @@ "DirectAdmin": { "website": "www.directadmin.com", "cats": [ 9 ], - "html": "<a[^>]+>DirectAdmin<\/a> Web Control Panel", + "html": "<a[^>]+>DirectAdmin</a> Web Control Panel", "headers": { "Server": "DirectAdmin Daemon v([\\d.]+)\\;version:\\1" }, "implies": [ "PHP", "Apache" ] }, @@ -601,28 +686,28 @@ "Django": { "website": "djangoproject.com", "cats": [ 18 ], - "html": "(powered by <a[^>]+>Django ?([\\d.]+)?|<div style=\"display:none\"><input name=\"csrfmiddlewaretoken\" value=\"[a-z0-9]{32}\" type=\"hidden\"><\/div>)\\;version:\\2", + "html": "(?:powered by <a[^>]+>Django ?([\\d.]+)?|<div style=\"display:none\"><input name=\"csrfmiddlewaretoken\" value=\"[a-z0-9]{32}\" type=\"hidden\"></div>)\\;version:\\1", "env": "^__admin_media_prefix__", "implies": "Python" }, "Django CMS": { "website": "django-cms.org", "cats": [ 1 ], - "script": "media\/cms\/js\/csrf\\.js", + "script": "media/cms/js/csrf\\.js", "headers": { "Set-Cookie": "django[^;]=" }, "implies": "Django" }, "Dojo": { "website": "dojotoolkit.org", "cats": [ 12 ], - "script": "([\\d.]+)\/dojo\/dojo(\\.xd)?\\.js\\;version:\\1", + "script": "([\\d.]+)/dojo/dojo(?:\\.xd)?\\.js\\;version:\\1", "env": "^dojo$" }, "Dokeos": { "website": "dokeos.com", "cats": [ 21 ], "meta": { "generator": "Dokeos" }, - "html": "Portal <a[^>]+>Dokeos|@import \"[^\"]+dokeos_blue", + "html": "(?:Portal <a[^>]+>Dokeos|@import \"[^\"]+dokeos_blue)", "headers": { "X-Powered-By": "Dokeos" }, "implies": [ "PHP", "Xajax", "jQuery", "CKEditor" ] }, @@ -637,37 +722,41 @@ "website": "dotnetnuke.com", "cats": [ 1 ], "meta": { "generator": "DotNetNuke" }, - "headers": { "X-Compressed-By": "DotNetNuke", "Set-Cookie": "DotNetNukeAnonymous=.+" - }, + "headers": { "X-Compressed-By": "DotNetNuke", "Set-Cookie": "DotNetNukeAnonymous=" }, "html": "<!-- by DotNetNuke Corporation", "env": "^DotNetNuke$", "implies": "Microsoft ASP.NET" }, "Doxygen": { - "website": "stack.nl\/~dimitri\/doxygen", + "website": "stack.nl/~dimitri/doxygen", "cats": [ 4 ], - "html": "(<!-- Generated by Doxygen ([\\d.]+)|<link[^>]+doxygen.css)\\;version:\\1" + "html": "(?:<!-- Generated by Doxygen ([\\d.]+)|<link[^>]+doxygen.css)\\;version:\\1" }, "DreamWeaver": { - "website": "www.adobe.com\/products\/dreamweaver", + "website": "www.adobe.com/products/dreamweaver", "cats": [ 20 ], - "html": "(<!--[^>]*(InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) {)\\;version:\\3" + "html": "(?:<!--[^>]*(?:InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) {)\\;version:\\1" }, "Drupal": { "website": "drupal.org", "cats": [ 1 ], "script": "drupal\\.js", - "html": "<(link|style)[^>]+sites\/(default|all)\/(themes|modules)\/", - "headers": { "X-Drupal-Cache": ".*", "X-Generator": "Drupal(\\s([\\d.]+))?\\;version:\\2", "Expires": "19 Nov 1978" }, + "html": "<(?:link|style)[^>]+sites/(?:default|all)/(?:themes|modules)/", + "headers": { "X-Drupal-Cache": ".*", "X-Generator": "Drupal(?:\\s([\\d.]+))?\\;version:\\1", "Expires": "19 Nov 1978" }, "env": "^Drupal$", "implies": "PHP" }, "Drupal Commerce": { "website": "drupalcommerce.org", "cats": [ 6 ], - "html": "id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field", + "html": "(?:id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field)", "implies": "Drupal" }, + "dwhttpd": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "dwhttpd\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, "Dynamicweb": { "website": "www.dynamicweb.dk", "cats": [ 1, 6, 10 ], @@ -679,29 +768,47 @@ "website": "e107.org", "cats": [ 1 ], "script": "e107\\.js", - "headers": { "Set-Cookie": "e107_td[^;]+=" }, + "headers": { "Set-Cookie": "e107_tz[^;]+=", "X-Powered-By": "e107" }, "implies": "PHP" }, "EdgeCast": { "website": "www.edgecast.com", "cats": [ 31 ], - "headers": { "Server": "^ECS" } + "headers": { "Server": "^EC(?:S|Acc)" }, + "url": "https?://(?:[^/]+\\.)?edgecastcdn\\.net/" + }, + "eHTTP": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "\\beHTTP( v?([\\d\\.]+))?\\;version:\\2" }, + "implies": [ "HP ProCurve"] + }, + "ELOG": { + "website": "midas.psi.ch/elog", + "cats": [ 19 ], + "html": "<title>ELOG Logbook Selection" + }, + "ELOG HTTP": { + "website": "midas.psi.ch/elog", + "cats": [ 22 ], + "headers": { "Server": "ELOG HTTP( \\d[\\-\\d\\.]+)?\\;version:\\1" }, + "implies": "ELOG" }, "Eloqua": { "website": "eloqua.com", "cats": [ 32 ], "script": "elqCfg\\.js", - "env": "^elq(SiteID|Load|CurESite)$" + "env": "^elq(?:SiteID|Load|CurESite)$" }, "Embedthis-http": { - "website": "github.com\/embedthis\/http", + "website": "github.com/embedthis/http", "cats": [ 22 ], - "headers": { "Server": "Embedthis-http(\/([\\d.]+))?\\;version:\\2" } + "headers": { "Server": "Embedthis-http(?:/([\\d.]+))?\\;version:\\1" } }, "E-Merchant": { "website": "e-merchant.com", "cats": [ 6 ], - "script": "cdn.e-merchant.com" + "script": "cdn\\.e-merchant\\.com" }, "Enyo": { "website": "enyojs.com", @@ -713,8 +820,8 @@ "website": "episerver.com", "cats": [ 1 ], "meta": { "generator": "EPiServer" }, - "headers": { "Set-Cookie": "EPi(Trace|Server)[^;]*=" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "headers": { "Set-Cookie": "EPi(?:Trace|Server)[^;]*=" }, + "implies": "Microsoft ASP.NET" }, "EPrints": { "website": "www.eprints.org", @@ -723,6 +830,11 @@ "env": "^EPJS_menu_template$", "implies": "Perl" }, + "Erlang": { + "website": "www.erlang.org", + "cats": [ 27 ], + "headers": { "Server": "Erlang( OTP/([\\-\\d\\.ABR]+))?\\;version:\\1" } + }, "eSyndiCat": { "website": "esyndicat.com", "cats": [ 1 ], @@ -731,8 +843,14 @@ "env": "^esyndicat$", "implies": [ "PHP" ] }, + "EWS-NIC4": { + "website": "dell.com", + "cats": [ 22 ], + "headers": { "Server": "EWS-NIC4(\\/([\\d\\.a-z]+))?\\;version:\\2" }, + "implies": "Dell" + }, "Exhibit": { - "website": "simile-widgets.org\/exhibit\/", + "website": "simile-widgets.org/exhibit/", "cats": [ 25 ], "script": "exhibit.*\\.js", "env": "^Exhibit$" @@ -746,7 +864,7 @@ "ExpressionEngine": { "website": "expressionengine.com", "cats": [ 1 ], - "headers": { "Set-Cookie": "(exp_last_activity|exp_tracker)" }, + "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker)" }, "implies": "PHP" }, "ExtJS": { @@ -767,17 +885,17 @@ "cats": [ 29 ], "html": "", + "html": "(?:]* href=\"templates/gambio/|]content\\.php\\?coID=\\d|)", "implies": "PHP" }, "Gauges": { "website": "get.gaug.es", "cats": [ 10 ], "headers": { "Set-Cookie": "_gauges_[^;]+=" }, - "html": "t\\.src = '\/\/secure\\.gaug\\.es\/track\\.js", "env": "^_gauges$" }, "Gentoo": { "website": "www.gentoo.org", "cats": [ 28 ], - "headers": { "X-Powered-By": "-?gentoo" } + "headers": { "X-Powered-By": "gentoo" } }, "Get Satisfaction": { "website": "getsatisfaction.com", @@ -858,57 +979,57 @@ "implies": "PHP" }, "GoAhead": { - "website": "embedthis.com\/products\/goahead\/index.html", + "website": "embedthis.com/products/goahead/index.html", "cats": [ 22 ], "headers": { "Server": "GoAhead" } }, "Google Analytics": { - "website": "google.com\/analytics", + "website": "google.com/analytics", "cats": [ 10 ], "html": "_gaq\\.push\\(\\['_setAccount", - "script": "(\\.google-analytics\\.com\/ga\\.js|google-analytics\\.com\/urchin\\.js)", + "script": "(?:\\.google-analytics\\.com/ga\\.js|google-analytics\\.com/urchin\\.js)", "headers": { "Set-Cookie": "__utma" }, "env": "^gaGlobal$" }, "Google App Engine": { - "website": "code.google.com\/appengine", + "website": "code.google.com/appengine", "cats": [ 22 ], "headers": { "Server": "Google Frontend" } }, "Google Code Prettify": { - "website": "code.google.com\/p\/google-code-prettify", + "website": "code.google.com/p/google-code-prettify", "cats": [ 19 ], "env": "^prettyPrint$" }, "Google Font API": { - "website": "code.google.com\/apis\/webfonts", + "website": "code.google.com/apis/webfonts", "cats": [ 17 ], - "script": "googleapis.com\/.+webfont", + "script": "googleapis\\.com/.+webfont", "html": "]* href=[^>]+fonts\\.googleapis\\.com", "env": "^WebFonts$" }, "Google Maps": { "website": "maps.google.com", "cats": [ 35 ], - "script": "(maps\\.google\\.com\/maps\\?file=api(&v=([\\d.]+))?|maps\\.google\\.com\/maps\/api\/staticmap)\\;version:API v\\3" + "script": "(?:maps\\.google\\.com/maps\\?file=api(?:&v=([\\d.]+))?|maps\\.google\\.com/maps/api/staticmap)\\;version:API v\\1" }, "Google PageSpeed": { - "website": "developers.google.com\/speed\/pagespeed\/mod", + "website": "developers.google.com/speed/pagespeed/mod", "cats": [ 23, 33 ], "headers": { "X-Mod-Pagespeed": "([\\d.]+)\\;version:\\1" } }, "Google Sites": { "website": "sites.google.com", "cats": [ 1 ], - "url": "sites.google.com" + "url": "sites\\.google\\.com" }, "Google Tag Manager": { - "website": "www.google.com\/tagmanager", + "website": "www.google.com/tagmanager", "cats": [ 19 ], - "html": "googletagmanager\\.com\/ns\\.html[^>]+><\/iframe>" + "html": "googletagmanager\\.com/ns\\.html[^>]+>" }, "Google Web Toolkit": { - "website": "developers.google.com\/web-toolkit", + "website": "developers.google.com/web-toolkit", "cats": [ 18 ], "env": "^__gwt_", "implies": "Java" @@ -916,15 +1037,20 @@ "GoStats": { "website": "gostats.com", "cats": [ 10 ], - "env": "^_go(stats|_track)" + "env": "^_go(?:stats|_track)" }, "Graffiti CMS": { "website": "graffiticms.codeplex.com", "cats": [ 1 ], "meta": { "generator": "Graffiti CMS ([^\"]+)\\;version:\\1" }, - "script": "\/graffiti.js", + "script": "/graffiti\\.js", "headers": { "Set-Cookie": "graffitibot[^;]=" } }, + "Grandstream": { + "website": "www.grandstream.com", + "cats": [ 22, 39 ], + "headers": { "Server": "Grandstream\\/?([\\d\\.]+)?\\;version:\\1" } + }, "Gravatar": { "website": "gravatar.com", "cats": [ 19 ], @@ -933,7 +1059,6 @@ "Gravity Insights": { "website": "insights.gravity.com", "cats": [ 10 ], - "html": "gravityInsightsParams\\.site_guid = '", "env": "^GravityInsights$" }, "G-WAN": { @@ -942,9 +1067,9 @@ "headers": { "Server": "G-WAN" } }, "GX WebManager": { - "website": "www.gxsoftware.com\/en\/products\/web-content-management.htm", + "website": "www.gxsoftware.com/en/products/web-content-management.htm", "cats": [ 1 ], - "meta": { "generator": "GX WebManager( ([\\d.]+))?\\;version:\\2" }, + "meta": { "generator": "GX WebManager(?: ([\\d.]+))?\\;version:\\1" }, "html": "", + "meta": { "eomportal-instanceid": "[0-9]+", "eomportal-id": "[0-9]+", "eomportal-loid": "[0-9.]+", "eomportal-uuid": "[a-f0-9]+", "eomportal-lastUpdate": ".*" } }, "Microsoft ASP.NET": { "website": "www.asp.net", "cats": [ 18 ], "url": "\\.aspx$", "html": "]+name=\"__VIEWSTATE", - "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" - }, - "implies": [ "IIS", "Windows Server" ] + "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" }, + "implies": "IIS\\;confidence:50" }, "Microsoft SharePoint": { "website": "sharepoint.microsoft.com", @@ -1383,18 +1566,29 @@ "cats": [ 2 ], "html": "]+minibb.+\\s+", + "html": "", "env": "^_?owa_" }, "OneStat": { "website": "www.onestat.com", "cats": [ 10 ], - "html": "var p==.+stat\\.onestat\\.com\/stat\\.aspx\\?tagver" + "html": "var p==.+stat\\.onestat\\.com/stat\\.aspx\\?tagver" }, "OpenCart": { "website": "www.opencart.com", "cats": [ 6 ], - "html": "index\\.php\\?route=[a-z]+\/|Powered By ]+OpenCart", + "html": "(?:index\\.php\\?route=[a-z]+/|Powered By ]+OpenCart)", "implies": "PHP" }, "openEngine": { - "website": "openengine.de\/html\/pages\/de\/", + "website": "openengine.de/html/pages/de/", "cats": [ 1 ], - "html": "]+openEngine" }, "OpenGrok": { - "website": "hub.opensolaris.org\/bin\/view\/Project+opengrok\/WebHome", + "meta": "openEngine" + }, + "OpenGrok": { + "website": "hub.opensolaris.org/bin/view/Project+opengrok/WebHome", "cats": [ 19 ], "headers": { "Set-Cookie": "OpenGrok" }, - "meta": { "generator": "OpenGrok( v?([\\d.]+))?\\;version:\\2" }, + "meta": { "generator": "OpenGrok(?: v?([\\d.]+))?\\;version:\\1" }, "implies": "Java" }, "OpenGSE": { - "website": "code.google.com\/p\/opengse", + "website": "code.google.com/p/opengse", "cats": [ 22 ], "headers": { "Server": "GSE" }, "implies": "Java" @@ -1624,14 +1838,14 @@ "env": "^OpenLayers$" }, "OpenNemas": { - "website": "openhost.es\/en\/opennemas", + "website": "openhost.es/en/opennemas", "cats": [ 1 ], "headers": { "X-Powered-By": "OpenNemas" } }, "OpenSSL": { "website": "openssl.org", "cats": [ 33 ], - "headers": { "Server": "OpenSSL(\/([\\d.]+[a-z]?))?\\;version:\\2" } + "headers": { "Server": "OpenSSL(?:/([\\d.]+[a-z]?))?\\;version:\\1" } }, "OpenText Web Solutions": { "website": "websolutions.opentext.com", @@ -1645,19 +1859,19 @@ "env": "^optimizely$" }, "Oracle Application Server": { - "website": "www.oracle.com\/technetwork\/middleware\/ias\/overview\/index.html", + "website": "www.oracle.com/technetwork/middleware/ias/overview/index.html", "cats": [ 22 ], - "headers": { "Server": "Oracle(-| )Application(-| )Server((-| )(\\d+[a-z]?))?\\;version:\\5" } + "headers": { "Server": "Oracle\\bApplication\\bServer(?:\\b(\\d+[a-z]?))?\\;version:\\1" } }, "Oracle Recommendations On Demand": { - "website": "www.oracle.com\/us\/products\/applications\/commerce\/recommendations-on-demand\/index.html?", + "website": "www.oracle.com/us/products/applications/commerce/recommendations-on-demand/index.html", "cats": [ 10 ], "script": "atgsvcs.+atgsvcs\\.js" }, "osCommerce": { "website": "www.oscommerce.com", "cats": [ 6 ], - "html": "(]*(\\?|&)osCsid|Powered by (<[^]+>)?osCommerce<\/a>|<[^]+class=\"[^>]*infoBoxHeading)", + "html": "(?:]*(?:\\?|&)osCsid|Powered by (?:<[^]+>)?osCommerce|<[^]+class=\"[^>]*infoBoxHeading)", "headers": { "Set-Cookie": "osCsid=" } }, "osCSS": { @@ -1668,31 +1882,30 @@ "Outbrain": { "website": "outbrain.com", "cats": [ 5 ], - "html": "var OB_langJS = '.+widgets\\.outbrain\\.com\/lang_", - "script": "widgets\\.outbrain\\.com\/outbrain\\.js", - "env": "^OutbrainPermaLink$" + "script": "widgets\\.outbrain\\.com/outbrain\\.js", + "env": "^(?:OutbrainPermaLink|OB_releaseVer)$" }, "OXID eShop": { "website": "oxid-esales.com", "cats": [ 6 ], - "html": "", "implies": "Java" }, @@ -2649,6 +2924,11 @@ "website": "foundation.zurb.com", "cats": [ 18 ], "html": "]+foundation[^>\"]+css" + }, + "LiveStreet CMS": { + "website": "livestreetcms.com", + "cats": [ 1 ], + "headers": { "X-Powered-By": "LiveStreet CMS" } } } } diff --git a/drivers/html/images/icons/3DM.png b/drivers/html/images/icons/3DM.png new file mode 100755 index 000000000..69e17bcb4 Binary files /dev/null and b/drivers/html/images/icons/3DM.png differ diff --git a/drivers/html/images/icons/3ware.png b/drivers/html/images/icons/3ware.png new file mode 100755 index 000000000..69e17bcb4 Binary files /dev/null and b/drivers/html/images/icons/3ware.png differ diff --git a/drivers/html/images/icons/ATEN.png b/drivers/html/images/icons/ATEN.png new file mode 100755 index 000000000..f15a46b5f Binary files /dev/null and b/drivers/html/images/icons/ATEN.png differ diff --git a/drivers/html/images/icons/Apache HBase.png b/drivers/html/images/icons/Apache HBase.png new file mode 100644 index 000000000..113d901a6 Binary files /dev/null and b/drivers/html/images/icons/Apache HBase.png differ diff --git a/drivers/html/images/icons/Apache Hadoop.png b/drivers/html/images/icons/Apache Hadoop.png new file mode 100755 index 000000000..39075d893 Binary files /dev/null and b/drivers/html/images/icons/Apache Hadoop.png differ diff --git a/drivers/html/images/icons/Backbone.js.png b/drivers/html/images/icons/Backbone.js.png index 7d774c810..d45b1b17b 100644 Binary files a/drivers/html/images/icons/Backbone.js.png and b/drivers/html/images/icons/Backbone.js.png differ diff --git a/drivers/html/images/icons/BaseHTTP.png b/drivers/html/images/icons/BaseHTTP.png new file mode 100755 index 000000000..68b9f6bfc Binary files /dev/null and b/drivers/html/images/icons/BaseHTTP.png differ diff --git a/drivers/html/images/icons/Boa.png b/drivers/html/images/icons/Boa.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/html/images/icons/Boa.png differ diff --git a/drivers/html/images/icons/Brother.png b/drivers/html/images/icons/Brother.png new file mode 100755 index 000000000..fbc41595e Binary files /dev/null and b/drivers/html/images/icons/Brother.png differ diff --git a/drivers/html/images/icons/Canon.png b/drivers/html/images/icons/Canon.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/html/images/icons/Canon.png differ diff --git a/drivers/html/images/icons/Catwalk.png b/drivers/html/images/icons/Catwalk.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/html/images/icons/Catwalk.png differ diff --git a/drivers/html/images/icons/Chartbeat.png b/drivers/html/images/icons/Chartbeat.png new file mode 100644 index 000000000..2cb597cc7 Binary files /dev/null and b/drivers/html/images/icons/Chartbeat.png differ diff --git a/drivers/html/images/icons/CherryPy.png b/drivers/html/images/icons/CherryPy.png new file mode 100755 index 000000000..badc40ac2 Binary files /dev/null and b/drivers/html/images/icons/CherryPy.png differ diff --git a/drivers/html/images/icons/Cloudera.png b/drivers/html/images/icons/Cloudera.png new file mode 100755 index 000000000..4d3a6a1d4 Binary files /dev/null and b/drivers/html/images/icons/Cloudera.png differ diff --git a/drivers/html/images/icons/CodeMirror.png b/drivers/html/images/icons/CodeMirror.png new file mode 100644 index 000000000..ef34d402c Binary files /dev/null and b/drivers/html/images/icons/CodeMirror.png differ diff --git a/drivers/html/images/icons/CompaqHTTPServer.png b/drivers/html/images/icons/CompaqHTTPServer.png new file mode 100755 index 000000000..2b0bc39df Binary files /dev/null and b/drivers/html/images/icons/CompaqHTTPServer.png differ diff --git a/drivers/html/images/icons/Cufon.png b/drivers/html/images/icons/Cufon.png new file mode 100644 index 000000000..cd2e3f029 Binary files /dev/null and b/drivers/html/images/icons/Cufon.png differ diff --git a/drivers/html/images/icons/Darwin.png b/drivers/html/images/icons/Darwin.png new file mode 100755 index 000000000..41b6c8b00 Binary files /dev/null and b/drivers/html/images/icons/Darwin.png differ diff --git a/drivers/html/images/icons/Dell.png b/drivers/html/images/icons/Dell.png new file mode 100755 index 000000000..76a80b4fa Binary files /dev/null and b/drivers/html/images/icons/Dell.png differ diff --git a/drivers/html/images/icons/ELOG HTTP.png b/drivers/html/images/icons/ELOG HTTP.png new file mode 100644 index 000000000..7af2b77e9 Binary files /dev/null and b/drivers/html/images/icons/ELOG HTTP.png differ diff --git a/drivers/html/images/icons/ELOG.png b/drivers/html/images/icons/ELOG.png new file mode 100644 index 000000000..7af2b77e9 Binary files /dev/null and b/drivers/html/images/icons/ELOG.png differ diff --git a/drivers/html/images/icons/EWS-NIC4.png b/drivers/html/images/icons/EWS-NIC4.png new file mode 100755 index 000000000..76a80b4fa Binary files /dev/null and b/drivers/html/images/icons/EWS-NIC4.png differ diff --git a/drivers/html/images/icons/Erlang.png b/drivers/html/images/icons/Erlang.png new file mode 100755 index 000000000..235338617 Binary files /dev/null and b/drivers/html/images/icons/Erlang.png differ diff --git a/drivers/html/images/icons/FlashCom.png b/drivers/html/images/icons/FlashCom.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/html/images/icons/FlashCom.png differ diff --git a/drivers/html/images/icons/Grandstream.png b/drivers/html/images/icons/Grandstream.png new file mode 100755 index 000000000..b4b1eb66b Binary files /dev/null and b/drivers/html/images/icons/Grandstream.png differ diff --git a/drivers/html/images/icons/HP ProCurve.png b/drivers/html/images/icons/HP ProCurve.png new file mode 100755 index 000000000..2b0bc39df Binary files /dev/null and b/drivers/html/images/icons/HP ProCurve.png differ diff --git a/drivers/html/images/icons/Highstock.png b/drivers/html/images/icons/Highstock.png new file mode 100755 index 000000000..6e8391d36 Binary files /dev/null and b/drivers/html/images/icons/Highstock.png differ diff --git a/drivers/html/images/icons/Indico.png b/drivers/html/images/icons/Indico.png new file mode 100755 index 000000000..02636b6cc Binary files /dev/null and b/drivers/html/images/icons/Indico.png differ diff --git a/drivers/html/images/icons/Intercom.png b/drivers/html/images/icons/Intercom.png new file mode 100644 index 000000000..40d2321a0 Binary files /dev/null and b/drivers/html/images/icons/Intercom.png differ diff --git a/drivers/html/images/icons/Jetty.png b/drivers/html/images/icons/Jetty.png new file mode 100755 index 000000000..807b88634 Binary files /dev/null and b/drivers/html/images/icons/Jetty.png differ diff --git a/drivers/html/images/icons/KS_HTTP.png b/drivers/html/images/icons/KS_HTTP.png new file mode 100755 index 000000000..40ed3b98d Binary files /dev/null and b/drivers/html/images/icons/KS_HTTP.png differ diff --git a/drivers/html/images/icons/LabVIEW.png b/drivers/html/images/icons/LabVIEW.png new file mode 100755 index 000000000..c832bdc54 Binary files /dev/null and b/drivers/html/images/icons/LabVIEW.png differ diff --git a/drivers/html/images/icons/Less.png b/drivers/html/images/icons/Less.png new file mode 100644 index 000000000..9e1de2359 Binary files /dev/null and b/drivers/html/images/icons/Less.png differ diff --git a/drivers/html/images/icons/LiveStreet CMS.png b/drivers/html/images/icons/LiveStreet CMS.png new file mode 100644 index 000000000..75a0029aa Binary files /dev/null and b/drivers/html/images/icons/LiveStreet CMS.png differ diff --git a/drivers/html/images/icons/Logitech Media Server.png b/drivers/html/images/icons/Logitech Media Server.png new file mode 100755 index 000000000..b2e6cb1f2 Binary files /dev/null and b/drivers/html/images/icons/Logitech Media Server.png differ diff --git a/drivers/html/images/icons/MOBOTIX.png b/drivers/html/images/icons/MOBOTIX.png new file mode 100755 index 000000000..321f9a8b1 Binary files /dev/null and b/drivers/html/images/icons/MOBOTIX.png differ diff --git a/drivers/html/images/icons/MiniServ.png b/drivers/html/images/icons/MiniServ.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/html/images/icons/MiniServ.png differ diff --git a/drivers/html/images/icons/Mono.png b/drivers/html/images/icons/Mono.png new file mode 100644 index 000000000..912809eb2 Binary files /dev/null and b/drivers/html/images/icons/Mono.png differ diff --git a/drivers/html/images/icons/PerfSONAR-PS.png b/drivers/html/images/icons/PerfSONAR-PS.png new file mode 100755 index 000000000..13be42d00 Binary files /dev/null and b/drivers/html/images/icons/PerfSONAR-PS.png differ diff --git a/drivers/html/images/icons/Posterous.png b/drivers/html/images/icons/Posterous.png new file mode 100644 index 000000000..3150f4f93 Binary files /dev/null and b/drivers/html/images/icons/Posterous.png differ diff --git a/drivers/html/images/icons/Prefix-Free.png b/drivers/html/images/icons/Prefix-Free.png new file mode 100644 index 000000000..87a646815 Binary files /dev/null and b/drivers/html/images/icons/Prefix-Free.png differ diff --git a/drivers/html/images/icons/SAP.png b/drivers/html/images/icons/SAP.png new file mode 100644 index 000000000..9217c8f87 Binary files /dev/null and b/drivers/html/images/icons/SAP.png differ diff --git a/drivers/html/images/icons/Sentinel Keys Server.png b/drivers/html/images/icons/Sentinel Keys Server.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/html/images/icons/Sentinel Keys Server.png differ diff --git a/drivers/html/images/icons/Sentinel License Monitor.png b/drivers/html/images/icons/Sentinel License Monitor.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/html/images/icons/Sentinel License Monitor.png differ diff --git a/drivers/html/images/icons/Sentinel Protection Server.png b/drivers/html/images/icons/Sentinel Protection Server.png new file mode 100755 index 000000000..50e127fbf Binary files /dev/null and b/drivers/html/images/icons/Sentinel Protection Server.png differ diff --git a/drivers/html/images/icons/Splunk.png b/drivers/html/images/icons/Splunk.png new file mode 100755 index 000000000..bd2a1a514 Binary files /dev/null and b/drivers/html/images/icons/Splunk.png differ diff --git a/drivers/html/images/icons/Splunkd.png b/drivers/html/images/icons/Splunkd.png new file mode 100755 index 000000000..bd2a1a514 Binary files /dev/null and b/drivers/html/images/icons/Splunkd.png differ diff --git a/drivers/html/images/icons/SunOS.png b/drivers/html/images/icons/SunOS.png new file mode 100755 index 000000000..725070080 Binary files /dev/null and b/drivers/html/images/icons/SunOS.png differ diff --git a/drivers/html/images/icons/TWiki.png b/drivers/html/images/icons/TWiki.png new file mode 100644 index 000000000..f6573b7fa Binary files /dev/null and b/drivers/html/images/icons/TWiki.png differ diff --git a/drivers/html/images/icons/Underscore.js.png b/drivers/html/images/icons/Underscore.js.png index 10262b99d..030496838 100644 Binary files a/drivers/html/images/icons/Underscore.js.png and b/drivers/html/images/icons/Underscore.js.png differ diff --git a/drivers/html/images/icons/Wink.png b/drivers/html/images/icons/Wink.png new file mode 100644 index 000000000..3e7204032 Binary files /dev/null and b/drivers/html/images/icons/Wink.png differ diff --git a/drivers/html/images/icons/Wowza Media Server.png b/drivers/html/images/icons/Wowza Media Server.png new file mode 100755 index 000000000..2e7c25e2b Binary files /dev/null and b/drivers/html/images/icons/Wowza Media Server.png differ diff --git a/drivers/html/images/icons/XAMPP.png b/drivers/html/images/icons/XAMPP.png new file mode 100755 index 000000000..7104b0e4d Binary files /dev/null and b/drivers/html/images/icons/XAMPP.png differ diff --git a/drivers/html/images/icons/Xajax.png b/drivers/html/images/icons/Xajax.png new file mode 100644 index 000000000..bba0d40ab Binary files /dev/null and b/drivers/html/images/icons/Xajax.png differ diff --git a/drivers/html/images/icons/Zabbix.png b/drivers/html/images/icons/Zabbix.png new file mode 100755 index 000000000..c7384dc3e Binary files /dev/null and b/drivers/html/images/icons/Zabbix.png differ diff --git a/drivers/html/images/icons/debut.png b/drivers/html/images/icons/debut.png new file mode 100755 index 000000000..fbc41595e Binary files /dev/null and b/drivers/html/images/icons/debut.png differ diff --git a/drivers/html/images/icons/default.png b/drivers/html/images/icons/default.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/html/images/icons/default.png differ diff --git a/drivers/html/images/icons/dwhttpd.png b/drivers/html/images/icons/dwhttpd.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/html/images/icons/dwhttpd.png differ diff --git a/drivers/html/images/icons/eHTTP.png b/drivers/html/images/icons/eHTTP.png new file mode 100644 index 000000000..7f74461f2 Binary files /dev/null and b/drivers/html/images/icons/eHTTP.png differ diff --git a/drivers/html/images/icons/libwww-perl-daemon.png b/drivers/html/images/icons/libwww-perl-daemon.png new file mode 100755 index 000000000..2110788f2 Binary files /dev/null and b/drivers/html/images/icons/libwww-perl-daemon.png differ diff --git a/drivers/html/images/icons/mod_auth_pam.png b/drivers/html/images/icons/mod_auth_pam.png new file mode 100755 index 000000000..d268dcca8 Binary files /dev/null and b/drivers/html/images/icons/mod_auth_pam.png differ diff --git a/drivers/html/images/icons/mod_jk.png b/drivers/html/images/icons/mod_jk.png new file mode 100755 index 000000000..d268dcca8 Binary files /dev/null and b/drivers/html/images/icons/mod_jk.png differ diff --git a/drivers/html/images/icons/mod_perl.png b/drivers/html/images/icons/mod_perl.png new file mode 100755 index 000000000..3f0559995 Binary files /dev/null and b/drivers/html/images/icons/mod_perl.png differ diff --git a/drivers/html/images/icons/posterous.png b/drivers/html/images/icons/posterous.png index 3730d31aa..3150f4f93 100644 Binary files a/drivers/html/images/icons/posterous.png and b/drivers/html/images/icons/posterous.png differ diff --git a/drivers/html/js/wappalyzer.js b/drivers/html/js/wappalyzer.js index 6257ac81e..3bb3d9ad2 100644 --- a/drivers/html/js/wappalyzer.js +++ b/drivers/html/js/wappalyzer.js @@ -13,64 +13,64 @@ var wappalyzer = (function() { * Application class */ var Application = function(app, detected) { - var self = this; - - self.app = app; - self.confidence = {}; - self.confidenceTotal = 0; - self.detected = Boolean(detected); - self.version = ''; - self.versions = []; + this.app = app; + this.confidence = {}; + this.confidenceTotal = 0; + this.detected = Boolean(detected); + this.version = ''; + this.versions = []; + }; + Application.prototype = { /** * Calculate confidence total */ - self.getConfidence = function() { + getConfidence: function() { var total = 0; - for ( id in self.confidence ) { - total += self.confidence[id]; + for ( id in this.confidence ) { + total += this.confidence[id]; } - return self.confidenceTotal = Math.min(total, 100); - } + return this.confidenceTotal = Math.min(total, 100); + }, /** * Resolve version number (find the longest version number that contains all shorter detected version numbers) */ - self.getVersion = function() { - var next, resolved; + getVersion: function() { + var i, next, resolved; - if ( !self.versions.length ) { + if ( !this.versions.length ) { return; } - self.versions.sort(function(a, b) { + this.versions.sort(function(a, b) { return a.length > b.length ? 1 : ( a.length < b.length ? -1 : 0 ); }); - resolved = self.versions[0]; + resolved = this.versions[0]; - for ( i in self.versions ) { + for ( i in this.versions ) { next = parseInt(i) + 1; - if ( next < self.versions.length ) { - if ( self.versions[next].indexOf(self.versions[i]) !== -1 ) { - resolved = self.versions[next]; + if ( next < this.versions.length ) { + if ( this.versions[next].indexOf(this.versions[i]) !== -1 ) { + resolved = this.versions[next]; } else { break; } } } - return self.version = resolved; - } + return this.version = resolved; + }, - self.setDetected = function(pattern, type, value, key) { - self.detected = true; + setDetected: function(pattern, type, value, key) { + this.detected = true; // Set confidence level - self.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; + this.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; // Detect version number if ( pattern.version ) { @@ -79,13 +79,20 @@ var wappalyzer = (function() { matches = pattern.regex.exec(value) ; + w.log({ matches: matches, version: version }); + if ( matches ) { matches.map(function(match, i) { // Parse ternary operator var ternary = new RegExp('\\\\' + i + '\\?([^:]+):(.+)$').exec(version); if ( ternary && ternary.length === 3 ) { + + w.log({ match: match, i: i, ternary: ternary }); + version = version.replace(ternary[0], match ? ternary[1] : ternary[2]); + + w.log({ version: version }); } // Replace back references @@ -93,14 +100,43 @@ var wappalyzer = (function() { }); if ( version ) { - self.versions.push(version); + this.versions.push(version); } - self.getVersion(); + this.getVersion(); } } } - } + }; + + var Profiler = function() { + this.regexCount = 0; + this.startTime = new Date().getTime(); + this.lastTime = new Date().getTime(); + this.slowest = { duration: null, app: '', type: '', pattern: '' }; + this.timedOut = false; + }; + + Profiler.prototype = { + checkPoint: function(app, type, regex) { + var duration = new Date().getTime() - this.lastTime; + + if ( !this.slowest.duration || duration > this.slowest.duration ) { + this.slowest.duration = duration; + this.slowest.app = app; + this.slowest.type = type; + this.slowest.regex = regex; + } + + this.lastTime = new Date().getTime(); + + this.timedOut = this.getDuration() > 1000; + }, + + getDuration: function() { + return new Date().getTime() - this.startTime; + } + }; /** * Call driver functions @@ -172,15 +208,9 @@ var wappalyzer = (function() { config: { environment: 'dev', // dev | live - - version: false, - websiteURL: 'http://wappalyzer.com/', twitterURL: 'https://twitter.com/Wappalyzer', githubURL: 'https://github.com/ElbertF/Wappalyzer', - - firstRun: false, - upgraded: false }, /** @@ -214,19 +244,7 @@ var wappalyzer = (function() { } // Initialize driver - driver('init', function() { - if ( w.config.firstRun ) { - driver('goToURL', { url: w.config.websiteURL + 'installed', medium: 'install' }); - - w.config.firstRun = false; - } - - if ( w.config.upgraded ) { - driver('goToURL', { url: w.config.websiteURL + 'upgraded', medium: 'upgrade' }); - - w.config.upgraded = false; - } - }); + driver('init'); }, /** @@ -235,10 +253,7 @@ var wappalyzer = (function() { analyze: function(hostname, url, data) { var i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header, version, - profiler = { - regexCount: 0, - startTime: new Date().getTime() - }, + profiler = new Profiler(), apps = {} ; @@ -257,13 +272,21 @@ var wappalyzer = (function() { } for ( app in w.apps ) { + // Exit loop after one second to prevent CPU hogging + // Remaining patterns will not be evaluated + if ( profiler.timedOut ) { + w.log('Timeout, exiting loop'); + + break; + } + apps[app] = w.detected[url] && w.detected[url][app] ? w.detected[url][app] : new Application(app); for ( type in w.apps[app] ) { switch ( type ) { case 'url': parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(url) ) { apps[app].setDetected(pattern, type, url); @@ -277,7 +300,7 @@ var wappalyzer = (function() { } parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(data[type]) ) { apps[app].setDetected(pattern, type, data[type]); @@ -293,10 +316,10 @@ var wappalyzer = (function() { regexScript = new RegExp(']+src=("|\')([^"\']+)', 'ig'); parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); while ( match = regexScript.exec(data.html) ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(match[2]) ) { apps[app].setDetected(pattern, type, match[2]); @@ -310,19 +333,17 @@ var wappalyzer = (function() { break; } - profiler.regexCount ++; - regexMeta = /]+>/ig; while ( match = regexMeta.exec(data.html) ) { for ( meta in w.apps[app][type] ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, regexMeta); if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { content = match.toString().match(/content=("|')([^"']+)("|')/i); parse(w.apps[app].meta[meta]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( content && content.length === 4 && pattern.regex.test(content[2]) ) { apps[app].setDetected(pattern, type, content[2], meta); @@ -340,7 +361,7 @@ var wappalyzer = (function() { for ( header in w.apps[app].headers ) { parse(w.apps[app][type][header]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) { apps[app].setDetected(pattern, type, data[type][header], header); @@ -356,7 +377,7 @@ var wappalyzer = (function() { parse(w.apps[app][type]).map(function(pattern) { for ( i in data[type] ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(data[type][i]) ) { apps[app].setDetected(pattern, type, data[type][i]); @@ -369,7 +390,8 @@ var wappalyzer = (function() { } } - w.log('Tested ' + profiler.regexCount + ' regular expressions in ' + ( ( ( new Date ).getTime() - profiler.startTime ) / 1000 ) + 's'); + w.log('[ PROFILER ] Tested ' + profiler.regexCount + ' regular expressions in ' + ( profiler.getDuration() / 1000 ) + 's'); + w.log('[ PROFILER ] Slowest pattern took ' + ( profiler.slowest.duration / 1000 ) + 's: ' + profiler.slowest.app + ' | ' + profiler.slowest.type + ' | ' + profiler.slowest.regex); for ( app in apps ) { if ( !apps[app].detected ) { diff --git a/drivers/php/Wappalyzer.php b/drivers/php/Wappalyzer.php index 7f35fa23f..7c40fa764 100644 --- a/drivers/php/Wappalyzer.php +++ b/drivers/php/Wappalyzer.php @@ -128,6 +128,8 @@ class Wappalyzer $result->html = substr($response, $headerSize); + $result->html = mb_check_encoding($result->html, 'UTF-8') ? $result->html : utf8_encode($result->html); + $lines = array_slice(explode("\r\n", trim(substr($response, 0, $headerSize))), 1); foreach ( $lines as $line ) { diff --git a/drivers/php/apps.json b/drivers/php/apps.json index 468e8d4e9..3002cb2b1 100644 --- a/drivers/php/apps.json +++ b/drivers/php/apps.json @@ -35,21 +35,25 @@ "33": "web-server-extensions", "34": "databases", "35": "maps", - "36": "advertising-networks" + "36": "advertising-networks", + "37": "network-devices", + "38": "media-servers", + "39": "webcams", + "40": "printers" }, "apps": { "1C-Bitrix": { "website": "www.1c-bitrix.ru", "cats": [ 1 ], "headers": { "X-Powered-CMS": "Bitrix Site Manager", "Set-Cookie": "BITRIX_" }, - "html": "]+components\/bitrix|(src|href)=\"\/bitrix\/(js|templates)", + "html": "(?:]+components/bitrix|(?:src|href)=\"/bitrix/(?:js|templates))", "script": "1c-bitrix", "implies": "PHP" }, "1und1": { "website": "1und1.de", "cats": [ 6 ], - "url": "\/shop\/catalog\/browse\\?sessid=", + "url": "/shop/catalog/browse\\?sessid=", "implies": "PHP" }, "2z Project": { @@ -61,7 +65,18 @@ "website": "www.3dcart.com", "cats": [ 1, 6 ], "headers": { "X-Powered-By": "3DCART" }, - "script": "(twlh(track)?\\.asp|3d_upsell\\.js)" + "script": "(?:twlh(?:track)?\\.asp|3d_upsell\\.js)" + }, + "3DM": { + "website": "www.3ware.com", + "cats": [ 19 ], + "html": "3ware 3DM([\\d\\.]+)?\\;version:\\1", + "implies": "3ware" + }, + "3ware": { + "website": "www.3ware.com", + "cats": [ 22 ], + "headers": { "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1" } }, "Accessible Portal": { "website": "www.accessibleportal.com", @@ -72,20 +87,29 @@ "AddThis": { "website": "www.addthis.com", "cats": [ 5 ], - "script": "addthis\\.com\/js\/(\\d+)?\\;version:\\1", + "script": "addthis\\.com/js/(\\d+)?\\;version:\\1", "env": "^addthis" }, + "Adobe ColdFusion": { + "website": "adobe.com/products/coldfusion-family.html", + "cats": [ 18 ], + "url": "\\.cfm$", + "html": "<!-- START headerTags\\.cfm", + "script": "/cfajax/", + "env": "^_cfEmails$", + "implies": "CFML" + }, "Adobe CQ5": { - "website": "adobe.com\/products\/cq.html", + "website": "adobe.com/products/cq.html", "cats": [ 1 ], - "url": "\/etc\/designs\/", + "url": "/etc/designs/", "html": "<div class=\"[^\"]*parbase", "implies": "Java" }, "Adobe GoLive": { - "website": "www.adobe.com\/products\/golive", + "website": "www.adobe.com/products/golive", "cats": [ 20 ], - "meta": { "generator": "Adobe GoLive(\\s([\\d.]+))?\\;version:\\2" } + "meta": { "generator": "Adobe GoLive(?:\\s([\\d.]+))?\\;version:\\1" } }, "Advanced Web Stats": { "website": "www.advancedwebstats.com", @@ -99,9 +123,9 @@ "env": "^AUI$" }, "Amaya": { - "website": "www.w3.org\/Amaya", + "website": "www.w3.org/Amaya", "cats": [ 20 ], - "meta": { "generator": "Amaya( V?([\\d.]+[a-z]))?\\;version:\\2" } + "meta": { "generator": "Amaya(?: V?([\\d.]+[a-z]))?\\;version:\\1" } }, "amCharts": { "website": "amcharts.com", @@ -112,7 +136,7 @@ "Ametys": { "website": "ametys.org", "cats": [ 1 ], - "meta": { "generator": "(Ametys|Anyware Technologies)" }, + "meta": { "generator": "(?:Ametys|Anyware Technologies)" }, "script": "STools\\.js", "implies": "Java" }, @@ -120,7 +144,7 @@ "website": "amirocms.com", "cats": [ 1 ], "meta": { "generator": "Amiro" }, - "html": "system_(js\\.php\\?script=|css\\.php\\?styles)[^\"]+cv=([\\d.]+)\\;version:\\2", + "html": "system_(?:js\\.php\\?script=|css\\.php\\?styles)[^\"]+cv=([\\d.]+)\\;version:\\1", "implies": "PHP" }, "AMPcms": { @@ -138,12 +162,22 @@ "AOLserver": { "website": "aolserver.com", "cats": [ 22 ], - "headers": { "Server": "AOLserver\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "AOLserver/?([\\d.]+)?\\;version:\\1" } }, "Apache": { "website": "apache.org", "cats": [ 22 ], - "headers": { "Server": "(Apache($|\/([\\d.]+)|[^\/-])|(^|\\b)HTTPD)\\;version:\\3" } + "headers": { "Server": "(?:Apache(?:$|/([\\d.]+)|[^/-])|(?:^|\\b)HTTPD)\\;version:\\1" } + }, + "Apache Hadoop": { + "website": "hadoop.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hadoop.css\"" + }, + "Apache HBase": { + "website": "hbase.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hbase.css\"" }, "Apache JSPWiki": { "website": "jspwiki.org", @@ -155,12 +189,12 @@ "Apache Tomcat": { "website": "tomcat.apache.org", "cats": [ 22 ], - "headers": { "Server": "Apache-Coyote\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "Apache-Coyote/?([\\d.]+)?\\;version:\\1" } }, "Apache Traffic Server": { - "website": "trafficserver.apache.org\/", + "website": "trafficserver.apache.org/", "cats": [ 22 ], - "headers": { "Server": "ATS\/?([\\d.]+)?\\;version:\\1" } + "headers": { "Server": "ATS/?([\\d.]+)?\\;version:\\1" } }, "Arc Forum": { "website": "arclanguage.org", @@ -168,42 +202,47 @@ "html": "ping\\.src = node\\.href;" }, "AsciiDoc": { - "website": "www.methods.co.nz\/asciidoc", + "website": "www.methods.co.nz/asciidoc", "cats": [ 1, 20, 27 ], "meta": { "generator": "^AsciiDoc ([\\d.]+)\\;version:\\1" }, "env": "^asciidoc$" }, + "ATEN": { + "website": "www.aten.com", + "cats": [ 22 ], + "headers": { "Server": "ATEN HTTP Server(\\(V?([\\d\\.]+)\\))?\\;version:\\2" } + }, "ATG Web Commerce": { - "website": "oracle.com\/us\/products\/applications\/web-commerce\/atg", + "website": "oracle.com/us/products/applications/web-commerce/atg", "cats": [ 6 ], - "headers": { "X-ATG-Version": "(ATGPlatform\/([\\d.]+))?\\;version:\\2" }, + "headers": { "X-ATG-Version": "(?:ATGPlatform/([\\d.]+))?\\;version:\\1" }, "html": "<[^>]+_DARGS" }, "Atlassian Confluence": { - "website": "www.atlassian.com\/software\/confluence\/overview\/team-collaboration-software", + "website": "www.atlassian.com/software/confluence/overview/team-collaboration-software", "cats": [ 8 ], - "html": "Powered by <a href=[^>]+atlassian\\.com\/software\/confluence([^>]+>Atlassian Confluence<\/a> ([\\d.]+))?\\;version:\\2", + "html": "Powered by <a href=[^>]+atlassian\\.com/software/confluence(?:[^>]+>Atlassian Confluence</a> ([\\d.]+))?\\;version:\\1", "headers": { "X-Confluence-Request-Time": ".*" }, "meta": { "confluence-request-time": ".*" }, "implies": "Java" }, "Atlassian Jira": { - "website": "www.atlassian.com\/software\/jira\/overview\/", + "website": "www.atlassian.com/software/jira/overview/", "cats": [ 13 ], "env": "^jira$", - "script": "\/jira\/s\/", - "url": "\/secure\/Dashboard.jspa", - "html": "Powered by\\s+<a href=[^>]+atlassian\\.com\/(software\/jira|jira-bug-tracking\/)[^>]+>Atlassian\\s+JIRA([^v]*v(ersion: )?(\\d+\\.\\d+(\\.\\d+)?))?\\;version:\\4", + "script": "/jira/s/", + "url": "/secure/Dashboard\\.jspa", + "html": "Powered by\\s+<a href=[^>]+atlassian\\.com/(?:software/jira|jira-bug-tracking/)[^>]+>Atlassian\\s+JIRA(?:[^v]*v(?:ersion: )?(\\d+\\.\\d+(\\.\\d+)?))?\\;version:\\1", "implies": "Java" }, "AWStats": { "website": "awstats.sourceforge.net", "cats": [ 10 ], - "meta": { "generator": "AWStats ([\\d.]+( \\(build [\\d.]+\\))?)\\;version:\\1" }, + "meta": { "generator": "AWStats ([\\d.]+(?: \\(?:build [\\d.]+\\))?)\\;version:\\1" }, "implies": "Perl" }, "Backbone.js": { - "website": "documentcloud.github.com\/backbone", + "website": "documentcloud.github.com/backbone", "cats": [ 12 ], "script": "backbone.*\\.js", "env": "^Backbone$", @@ -212,26 +251,32 @@ "Banshee": { "website": "www.banshee-php.org", "cats": [ 1, 18 ], - "html": "Built upon the <a href=\"[^>]+banshee-php\\.org\/\">[a-z]+<\/a>(v([\\d.]+))?\\;version:\\2", + "html": "Built upon the <a href=\"[^>]+banshee-php\\.org/\">[a-z]+</a>(?:v([\\d.]+))?\\;version:\\1", "implies": "PHP" }, + "BaseHTTP": { + "website": "docs.python.org/2/library/basehttpserver.html", + "cats": [ 22 ], + "headers": { "Server": "BaseHTTP\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" + }, "BIGACE": { "website": "bigace.de", "cats": [ 1 ], "meta": { "generator": "BIGACE ([\\d.]+)\\;version:\\1" }, - "html": "Powered by <a href=\"[^>]+BIGACE|<!--\\s+Site is running BIGACE", + "html": "(?:Powered by <a href=\"[^>]+BIGACE|<!--\\s+Site is running BIGACE)", "implies": "PHP" }, "Bigcommerce": { "website": "www.bigcommerce.com", "cats": [ 6 ], - "url": ".+\\.mybigcommerce\\.com", - "html": "<link href=[^>]+cdn\\d+\\.bigcommerce\\.com\/v", - "script": "cdn\\d+\\.bigcommerce\\.com\/v", + "url": "mybigcommerce\\.com", + "html": "<link href=[^>]+cdn\\d+\\.bigcommerce\\.com/v", + "script": "cdn\\d+\\.bigcommerce\\.com/v", "env": "^compareProducts$" }, "BigDump": { - "website": "www.ozerov.de\/bigdump.php", + "website": "www.ozerov.de/bigdump.php", "cats": [ 3 ], "html": "<!-- <h1>BigDump: Staggered MySQL Dump Importer ver\\. ([\\d.b]+)\\;version:\\1", "implies": "PHP" @@ -239,27 +284,36 @@ "Bigware": { "website": "bigware.de", "cats": [ 6 ], - "html": "Diese <a href=.+bigware\\.de|<a href=[^>]+\/main_bigware_\\d+\\.php", - "url": "(\\?|&)bigWAdminID=[a-z\\d]+(&|$)", - "headers": { "Set-Cookie": "bigwareCsid|bigWAdminID" }, + "html": "(?:Diese <a href=[^>]+bigware\\.de|<a href=[^>]+/main_bigware_\\d+\\.php)", + "url": "(?:\\?|&)bigWAdminID=", + "headers": { "Set-Cookie": "(?:bigwareCsid|bigWAdminID)" }, "implies": "PHP" }, "BittAds": { "website": "bittads.com", "cats": [ 36 ], - "script": "bittads\\.com\/js\/bitt\\.js$", + "script": "bittads\\.com/js/bitt\\.js$", "env": "^bitt$" }, "Blip.tv": { "website": "blip.tv", "cats": [ 14 ], - "html": "<(param|embed|iframe)[^>]+blip\\.tv\/play" + "html": "<(?:param|embed|iframe)[^>]+blip\\.tv/play" }, "Blogger": { "website": "www.blogger.com", "cats": [ 11 ], "meta": { "generator": "blogger" }, - "url": "^(www.)?.+\\.blogspot\\.com" + "url": "\\.blogspot\\.com" + }, + "Boa": { + "website": "www.boa.org", + "cats": [ 22 ], + "headers": { "Server": "Boa\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, + "Brother": { + "website": "www.brother.com", + "cats": [ 40 ] }, "BrowserCMS": { "website": "browsercms.org", @@ -285,6 +339,10 @@ "script": "CatalystScripts", "html": "<!-- BC_OBNW -->" }, + "Canon": { + "website": "www.canon.com", + "cats": [ 40 ] + }, "CakePHP": { "website": "cakephp.org", "cats": [ 18 ], @@ -296,17 +354,23 @@ "website": "cargocollective.com", "cats": [ 1 ], "meta": { "cargo_title": ".*" }, - "script": "\/cargo\\.", + "script": "/cargo\\.", "html": "<link [^>]+Cargo feed", "implies": "PHP" }, + "Catwalk": { + "website": "www.canon.com", + "cats": [ 22 ], + "headers": { "Server": "Catwalk\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Canon" + }, "CentOS": { "website": "centos.org", "cats": [ 28 ], "headers": { "Server": "CentOS", "X-Powered-By": "CentOS" } }, "CFML": { - "website": "adobe.com\/products\/coldfusion-family.html", + "website": "adobe.com/products/coldfusion-family.html", "cats": [ 27 ] }, "CacheFly": { @@ -323,7 +387,7 @@ "Chamilo": { "website": "www.chamilo.org", "cats": [ 21 ], - "html": "\">Chamilo ([\\d.]+)<\/a>\\;version:\\1", + "html": "\">Chamilo ([\\d.]+)</a>\\;version:\\1", "meta": { "generator": "Chamilo ([\\d.]+)\\;version:\\1" }, "headers": { "X-Powered-By": "Chamilo ([\\d.]+)\\;version:\\1" }, "implies": "PHP" @@ -332,12 +396,18 @@ "website": "chartbeat.com", "cats": [ 10 ], "html": "function loadChartbeat\\(\\) {", - "script": "chartbeat.js" + "script": "chartbeat\\.js" }, "Cherokee": { "website": "www.cherokee-project.com", "cats": [ 22 ], - "headers": { "Server": "Cherokee\/([\\d.]+)\\;version:\\1" } + "headers": { "Server": "Cherokee/([\\d.]+)\\;version:\\1" } + }, + "CherryPy": { + "website": "www.cherrypy.org", + "cats": [ 18, 22 ], + "headers": { "Server": "CherryPy\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" }, "CKEditor": { "website": "ckeditor.com", @@ -345,8 +415,13 @@ "env": "^CKEDITOR$", "implies": "PHP" }, + "Cloudera": { + "website": "www.cloudera.com", + "cats": [ 34 ], + "headers": { "Server": "cloudera" } + }, "ClickHeat": { - "website": "www.labsmedia.com\/clickheat\/index.html", + "website": "www.labsmedia.com/clickheat/index.html", "cats": [ 10 ], "script": "clickheat.*\\.js", "env": "^clickHeat", @@ -355,7 +430,7 @@ "ClickTale": { "website": "www.clicktale.com", "cats": [ 10 ], - "html": "if\\(typeof ClickTale(Tag)*==\"function\"\\)", + "html": "if\\(typeof ClickTale(Tag)*==\\\"function\\\"\\)", "env": "^ClickTale" }, "Clicky": { @@ -377,7 +452,7 @@ "implies": "PHP" }, "CMSimple": { - "website": "www.cmsimple.org\/en", + "website": "www.cmsimple.org/en", "cats": [ 1 ], "meta": { "generator": "CMSimple( [\\d.]+)?\\;version:\\1" }, "implies": "PHP" @@ -385,36 +460,46 @@ "CO2Stats": { "website": "co2stats.com", "cats": [ 10 ], - "html": "src=[^>]+co2stats\\.com\/propres\\.php" + "html": "src=[^>]+co2stats\\.com/propres\\.php" }, "CodeIgniter": { "website": "codeigniter.com", "cats": [ 18 ], - "headers": { "Set-Cookie": "(exp_last_activity|exp_tracker|ci_session)" }, + "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker|ci_session)" }, "implies": "PHP" }, + "CodeMirror": { + "website": "codemirror.net", + "cats": [ 19 ], + "env": "^CodeMirror$" + }, "Commerce Server": { "website": "commerceserver.net", "cats": [ 6 ], "headers": { "COMMERCE-SERVER-SOFTWARE": ".+" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "implies": "Microsoft ASP.NET" + }, + "CompaqHTTPServer": { + "website": "www.hp.com", + "cats": [ 22 ], + "headers": { "Server": "CompaqHTTPServer\\/?([\\d\\.]+)?\\;version:\\1" } }, "comScore": { "website": "comscore.com", "cats": [ 10 ], - "html": "<i{1}frame[^>]* (id=\"comscore\"|scr=[^>]+comscore)", + "html": "<iframe[^>]* (?:id=\"comscore\"|scr=[^>]+comscore)", "env": "^_?COMSCORE$" }, "Concrete5": { "website": "concrete5.org", "cats": [ 1 ], - "script": "concrete\/js\/", + "script": "concrete/js/", "meta": { "generator": "concrete5 - ([\\d.ab]+)\\;version:\\1" }, "env": "^CCM_IMAGE_PATH$", "implies": "PHP" }, "Connect": { - "website": "www.senchalabs.org\/connect", + "website": "www.senchalabs.org/connect", "cats": [ 18 ], "headers": { "X-Powered-By": "^Connect$" }, "implies": "node.js" @@ -422,25 +507,31 @@ "Contao": { "website": "contao.org", "cats": [ 1 ], - "html": "(<!--.+powered by (TYPOlight|Contao)-->|<link[^>]+(typolight|contao)\\.css)", + "html": "(?:<!--[^>]+powered by (?:TYPOlight|Contao)-->|<link[^>]+(?:typolight|contao)\\.css)", "implies": "PHP" }, "Contenido": { - "website": "contenido.org\/en", + "website": "contenido.org/en", "cats": [ 1 ], "meta": { "generator": "Contenido ([\\d.]+)\\;version:\\1" }, "implies": "PHP" }, "Contens": { - "website": "www.contens.com\/en\/pub\/index.cfm", + "website": "www.contens.com/en/pub/index.cfm", "cats": [ 1 ], "meta": { "generator": "Contensis CMS Version ([\\d.]+)\\;version:\\1" }, "implies": [ "Java", "CFML" ] }, + "ContentBox": { + "website": "www.gocontentbox.org", + "cats": [ 1, 11 ], + "meta": { "generator": "ContentBox powered by ColdBox" }, + "implies": "Adobe ColdFusion" + }, "ConversionLab": { - "website": "www.trackset.it\/conversionlab", + "website": "www.trackset.it/conversionlab", "cats": [ 10 ], - "script": "conversionlab\\.trackset\\.com\/track\/tsend\\.js" + "script": "conversionlab\\.trackset\\.com/track/tsend\\.js" }, "Coppermine": { "website": "coppermine-gallery.net", @@ -462,12 +553,12 @@ "CouchDB": { "website": "couchdb.apache.org", "cats": [ 22 ], - "headers": { "Server": "CouchDB\/([\\d.]+)\\;version:\\1" } + "headers": { "Server": "CouchDB/([\\d.]+)\\;version:\\1" } }, "cPanel": { "website": "www.cpanel.net", "cats": [ 9 ], - "headers": { "Server": "cpsrvd\/([\\d.]+)\\;version:\\1" }, + "headers": { "Server": "cpsrvd/([\\d.]+)\\;version:\\1" }, "html": "<!-- cPanel" }, "CPG Dragonfly": { @@ -481,40 +572,25 @@ "website": "crazyegg.com", "cats": [ 10 ], "env": "^CE2$", - "script": "cetrk\\.com\/pages\/scripts\/\\d+\/\\d+\\.js" + "script": "cetrk\\.com/pages/scripts/\\d+/\\d+\\.js" }, "Cross Pixel": { "website": "datadesk.crsspxl.com", "cats": [ 10 ], "env": "^crsspxl$", - "script": "tag\\.crsspxl\\.com\/s1\\.js" + "script": "tag\\.crsspxl\\.com/s1\\.js" }, "CS Cart": { "website": "www.cs-cart.com", "cats": [ 6 ], "env": "^fn_compare_strings$", - "html": " Powered by (<a href=[^>]+cs-cart\\.com|CS-Cart)", + "html": " Powered by (?:<a href=[^>]+cs-cart\\.com|CS-Cart)", "implies": "PHP" }, - "Adobe ColdFusion": { - "website": "adobe.com\/products\/coldfusion-family.html", - "cats": [ 18 ], - "url": "\\.cfm$", - "html": "<!-- START headerTags\\.cfm", - "script": "\/cfajax\/", - "env": "^_cfEmails$", - "implies": "CFML" - }, - "ContentBox": { - "website": "www.gocontentbox.org", - "cats": [ 1, 11 ], - "meta": { "generator": "ContentBox powered by ColdBox" }, - "implies": "Adobe ColdFusion" - }, "CubeCart": { "website": "www.cubecart.com", "cats": [ 6 ], - "html": "(Powered by <a href=[^>]+cubecart\\.com|<p[^>]+>Powered by CubeCart)", + "html": "(?:Powered by <a href=[^>]+cubecart\\.com|<p[^>]+>Powered by CubeCart)", "meta": { "generator": "cubecart" }, "implies": "PHP" }, @@ -525,9 +601,9 @@ "env": "^Cufon$" }, "d3": { - "website": "mbostock.github.com\/d3", + "website": "mbostock.github.com/d3", "cats": [ 25 ], - "script": "d3(\\.v2)(\\.min)?\\.js" + "script": "d3(?:\\.v2)?(?:\\.min)?\\.js" }, "Dancer": { "website": "perldancer.org", @@ -542,10 +618,10 @@ "meta": { "generator": "Danneo CMS ([\\d.]+)\\;version:\\1" }, "implies": [ "Apache", "PHP" ] }, - "dashCommerce": { - "website": "dashcommerce.org", - "cats": [ 6 ], - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "Darwin": { + "website": "opensource.apple.com", + "cats": [ 28 ], + "headers": { "Server": "Darwin", "X-Powered-By": "Darwin" } }, "DataLife Engine": { "website": "dle-news.ru", @@ -557,13 +633,18 @@ "David Webbox": { "website": "www.tobit.com", "cats": [ 22 ], - "headers": { "Server": "David-WebBox\/([\\d.a]+ \\(\\d+\\))\\;version:\\1" } + "headers": { "Server": "David-WebBox/([\\d.a]+ \\(\\d+\\))\\;version:\\1" } }, "Debian": { "website": "debian.org", "cats": [ 28 ], - "headers": { "Server": "Debian", "X-Powered-By": "(Debian|dotdeb|(sarge|etch|lenny|queeze|wheezy|jessie))\\;version:\\2" - } + "headers": { "Server": "Debian", "X-Powered-By": "(?:Debian|dotdeb|(sarge|etch|lenny|squeeze|wheezy|jessie))\\;version:\\1" } + }, + "debut": { + "website": "www.brother.com", + "cats": [ 22 ], + "headers": { "Server": "debut\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Brother" }, "DedeCMS": { "website": "dedecms.com", @@ -572,11 +653,15 @@ "script": "dedeajax", "implies": "PHP" }, + "Dell": { + "website": "dell.com", + "cats": [ 40 ] + }, "Demandware": { "website": "demandware.com", "cats": [ 6 ], "headers": { "Server": "Demandware eCommerce Server" }, - "html": "<[^>]+demandware.edgesuite", + "html": "<[^>]+demandware\\.edgesuite", "env": "^dwAnalytics$" }, "DHTMLX": { @@ -587,7 +672,7 @@ "DirectAdmin": { "website": "www.directadmin.com", "cats": [ 9 ], - "html": "<a[^>]+>DirectAdmin<\/a> Web Control Panel", + "html": "<a[^>]+>DirectAdmin</a> Web Control Panel", "headers": { "Server": "DirectAdmin Daemon v([\\d.]+)\\;version:\\1" }, "implies": [ "PHP", "Apache" ] }, @@ -601,28 +686,28 @@ "Django": { "website": "djangoproject.com", "cats": [ 18 ], - "html": "(powered by <a[^>]+>Django ?([\\d.]+)?|<div style=\"display:none\"><input name=\"csrfmiddlewaretoken\" value=\"[a-z0-9]{32}\" type=\"hidden\"><\/div>)\\;version:\\2", + "html": "(?:powered by <a[^>]+>Django ?([\\d.]+)?|<div style=\"display:none\"><input name=\"csrfmiddlewaretoken\" value=\"[a-z0-9]{32}\" type=\"hidden\"></div>)\\;version:\\1", "env": "^__admin_media_prefix__", "implies": "Python" }, "Django CMS": { "website": "django-cms.org", "cats": [ 1 ], - "script": "media\/cms\/js\/csrf\\.js", + "script": "media/cms/js/csrf\\.js", "headers": { "Set-Cookie": "django[^;]=" }, "implies": "Django" }, "Dojo": { "website": "dojotoolkit.org", "cats": [ 12 ], - "script": "([\\d.]+)\/dojo\/dojo(\\.xd)?\\.js\\;version:\\1", + "script": "([\\d.]+)/dojo/dojo(?:\\.xd)?\\.js\\;version:\\1", "env": "^dojo$" }, "Dokeos": { "website": "dokeos.com", "cats": [ 21 ], "meta": { "generator": "Dokeos" }, - "html": "Portal <a[^>]+>Dokeos|@import \"[^\"]+dokeos_blue", + "html": "(?:Portal <a[^>]+>Dokeos|@import \"[^\"]+dokeos_blue)", "headers": { "X-Powered-By": "Dokeos" }, "implies": [ "PHP", "Xajax", "jQuery", "CKEditor" ] }, @@ -637,37 +722,41 @@ "website": "dotnetnuke.com", "cats": [ 1 ], "meta": { "generator": "DotNetNuke" }, - "headers": { "X-Compressed-By": "DotNetNuke", "Set-Cookie": "DotNetNukeAnonymous=.+" - }, + "headers": { "X-Compressed-By": "DotNetNuke", "Set-Cookie": "DotNetNukeAnonymous=" }, "html": "<!-- by DotNetNuke Corporation", "env": "^DotNetNuke$", "implies": "Microsoft ASP.NET" }, "Doxygen": { - "website": "stack.nl\/~dimitri\/doxygen", + "website": "stack.nl/~dimitri/doxygen", "cats": [ 4 ], - "html": "(<!-- Generated by Doxygen ([\\d.]+)|<link[^>]+doxygen.css)\\;version:\\1" + "html": "(?:<!-- Generated by Doxygen ([\\d.]+)|<link[^>]+doxygen.css)\\;version:\\1" }, "DreamWeaver": { - "website": "www.adobe.com\/products\/dreamweaver", + "website": "www.adobe.com/products/dreamweaver", "cats": [ 20 ], - "html": "(<!--[^>]*(InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) {)\\;version:\\3" + "html": "(?:<!--[^>]*(?:InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) {)\\;version:\\1" }, "Drupal": { "website": "drupal.org", "cats": [ 1 ], "script": "drupal\\.js", - "html": "<(link|style)[^>]+sites\/(default|all)\/(themes|modules)\/", - "headers": { "X-Drupal-Cache": ".*", "X-Generator": "Drupal(\\s([\\d.]+))?\\;version:\\2", "Expires": "19 Nov 1978" }, + "html": "<(?:link|style)[^>]+sites/(?:default|all)/(?:themes|modules)/", + "headers": { "X-Drupal-Cache": ".*", "X-Generator": "Drupal(?:\\s([\\d.]+))?\\;version:\\1", "Expires": "19 Nov 1978" }, "env": "^Drupal$", "implies": "PHP" }, "Drupal Commerce": { "website": "drupalcommerce.org", "cats": [ 6 ], - "html": "id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field", + "html": "(?:id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field)", "implies": "Drupal" }, + "dwhttpd": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "dwhttpd\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, "Dynamicweb": { "website": "www.dynamicweb.dk", "cats": [ 1, 6, 10 ], @@ -679,29 +768,47 @@ "website": "e107.org", "cats": [ 1 ], "script": "e107\\.js", - "headers": { "Set-Cookie": "e107_td[^;]+=" }, + "headers": { "Set-Cookie": "e107_tz[^;]+=", "X-Powered-By": "e107" }, "implies": "PHP" }, "EdgeCast": { "website": "www.edgecast.com", "cats": [ 31 ], - "headers": { "Server": "^ECS" } + "headers": { "Server": "^EC(?:S|Acc)" }, + "url": "https?://(?:[^/]+\\.)?edgecastcdn\\.net/" + }, + "eHTTP": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "\\beHTTP( v?([\\d\\.]+))?\\;version:\\2" }, + "implies": [ "HP ProCurve"] + }, + "ELOG": { + "website": "midas.psi.ch/elog", + "cats": [ 19 ], + "html": "<title>ELOG Logbook Selection" + }, + "ELOG HTTP": { + "website": "midas.psi.ch/elog", + "cats": [ 22 ], + "headers": { "Server": "ELOG HTTP( \\d[\\-\\d\\.]+)?\\;version:\\1" }, + "implies": "ELOG" }, "Eloqua": { "website": "eloqua.com", "cats": [ 32 ], "script": "elqCfg\\.js", - "env": "^elq(SiteID|Load|CurESite)$" + "env": "^elq(?:SiteID|Load|CurESite)$" }, "Embedthis-http": { - "website": "github.com\/embedthis\/http", + "website": "github.com/embedthis/http", "cats": [ 22 ], - "headers": { "Server": "Embedthis-http(\/([\\d.]+))?\\;version:\\2" } + "headers": { "Server": "Embedthis-http(?:/([\\d.]+))?\\;version:\\1" } }, "E-Merchant": { "website": "e-merchant.com", "cats": [ 6 ], - "script": "cdn.e-merchant.com" + "script": "cdn\\.e-merchant\\.com" }, "Enyo": { "website": "enyojs.com", @@ -713,8 +820,8 @@ "website": "episerver.com", "cats": [ 1 ], "meta": { "generator": "EPiServer" }, - "headers": { "Set-Cookie": "EPi(Trace|Server)[^;]*=" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "headers": { "Set-Cookie": "EPi(?:Trace|Server)[^;]*=" }, + "implies": "Microsoft ASP.NET" }, "EPrints": { "website": "www.eprints.org", @@ -723,6 +830,11 @@ "env": "^EPJS_menu_template$", "implies": "Perl" }, + "Erlang": { + "website": "www.erlang.org", + "cats": [ 27 ], + "headers": { "Server": "Erlang( OTP/([\\-\\d\\.ABR]+))?\\;version:\\1" } + }, "eSyndiCat": { "website": "esyndicat.com", "cats": [ 1 ], @@ -731,8 +843,14 @@ "env": "^esyndicat$", "implies": [ "PHP" ] }, + "EWS-NIC4": { + "website": "dell.com", + "cats": [ 22 ], + "headers": { "Server": "EWS-NIC4(\\/([\\d\\.a-z]+))?\\;version:\\2" }, + "implies": "Dell" + }, "Exhibit": { - "website": "simile-widgets.org\/exhibit\/", + "website": "simile-widgets.org/exhibit/", "cats": [ 25 ], "script": "exhibit.*\\.js", "env": "^Exhibit$" @@ -746,7 +864,7 @@ "ExpressionEngine": { "website": "expressionengine.com", "cats": [ 1 ], - "headers": { "Set-Cookie": "(exp_last_activity|exp_tracker)" }, + "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker)" }, "implies": "PHP" }, "ExtJS": { @@ -767,17 +885,17 @@ "cats": [ 29 ], "html": "", + "html": "(?:]* href=\"templates/gambio/|]content\\.php\\?coID=\\d|)", "implies": "PHP" }, "Gauges": { "website": "get.gaug.es", "cats": [ 10 ], "headers": { "Set-Cookie": "_gauges_[^;]+=" }, - "html": "t\\.src = '\/\/secure\\.gaug\\.es\/track\\.js", "env": "^_gauges$" }, "Gentoo": { "website": "www.gentoo.org", "cats": [ 28 ], - "headers": { "X-Powered-By": "-?gentoo" } + "headers": { "X-Powered-By": "gentoo" } }, "Get Satisfaction": { "website": "getsatisfaction.com", @@ -858,57 +979,57 @@ "implies": "PHP" }, "GoAhead": { - "website": "embedthis.com\/products\/goahead\/index.html", + "website": "embedthis.com/products/goahead/index.html", "cats": [ 22 ], "headers": { "Server": "GoAhead" } }, "Google Analytics": { - "website": "google.com\/analytics", + "website": "google.com/analytics", "cats": [ 10 ], "html": "_gaq\\.push\\(\\['_setAccount", - "script": "(\\.google-analytics\\.com\/ga\\.js|google-analytics\\.com\/urchin\\.js)", + "script": "(?:\\.google-analytics\\.com/ga\\.js|google-analytics\\.com/urchin\\.js)", "headers": { "Set-Cookie": "__utma" }, "env": "^gaGlobal$" }, "Google App Engine": { - "website": "code.google.com\/appengine", + "website": "code.google.com/appengine", "cats": [ 22 ], "headers": { "Server": "Google Frontend" } }, "Google Code Prettify": { - "website": "code.google.com\/p\/google-code-prettify", + "website": "code.google.com/p/google-code-prettify", "cats": [ 19 ], "env": "^prettyPrint$" }, "Google Font API": { - "website": "code.google.com\/apis\/webfonts", + "website": "code.google.com/apis/webfonts", "cats": [ 17 ], - "script": "googleapis.com\/.+webfont", + "script": "googleapis\\.com/.+webfont", "html": "]* href=[^>]+fonts\\.googleapis\\.com", "env": "^WebFonts$" }, "Google Maps": { "website": "maps.google.com", "cats": [ 35 ], - "script": "(maps\\.google\\.com\/maps\\?file=api(&v=([\\d.]+))?|maps\\.google\\.com\/maps\/api\/staticmap)\\;version:API v\\3" + "script": "(?:maps\\.google\\.com/maps\\?file=api(?:&v=([\\d.]+))?|maps\\.google\\.com/maps/api/staticmap)\\;version:API v\\1" }, "Google PageSpeed": { - "website": "developers.google.com\/speed\/pagespeed\/mod", + "website": "developers.google.com/speed/pagespeed/mod", "cats": [ 23, 33 ], "headers": { "X-Mod-Pagespeed": "([\\d.]+)\\;version:\\1" } }, "Google Sites": { "website": "sites.google.com", "cats": [ 1 ], - "url": "sites.google.com" + "url": "sites\\.google\\.com" }, "Google Tag Manager": { - "website": "www.google.com\/tagmanager", + "website": "www.google.com/tagmanager", "cats": [ 19 ], - "html": "googletagmanager\\.com\/ns\\.html[^>]+><\/iframe>" + "html": "googletagmanager\\.com/ns\\.html[^>]+>" }, "Google Web Toolkit": { - "website": "developers.google.com\/web-toolkit", + "website": "developers.google.com/web-toolkit", "cats": [ 18 ], "env": "^__gwt_", "implies": "Java" @@ -916,15 +1037,20 @@ "GoStats": { "website": "gostats.com", "cats": [ 10 ], - "env": "^_go(stats|_track)" + "env": "^_go(?:stats|_track)" }, "Graffiti CMS": { "website": "graffiticms.codeplex.com", "cats": [ 1 ], "meta": { "generator": "Graffiti CMS ([^\"]+)\\;version:\\1" }, - "script": "\/graffiti.js", + "script": "/graffiti\\.js", "headers": { "Set-Cookie": "graffitibot[^;]=" } }, + "Grandstream": { + "website": "www.grandstream.com", + "cats": [ 22, 39 ], + "headers": { "Server": "Grandstream\\/?([\\d\\.]+)?\\;version:\\1" } + }, "Gravatar": { "website": "gravatar.com", "cats": [ 19 ], @@ -933,7 +1059,6 @@ "Gravity Insights": { "website": "insights.gravity.com", "cats": [ 10 ], - "html": "gravityInsightsParams\\.site_guid = '", "env": "^GravityInsights$" }, "G-WAN": { @@ -942,9 +1067,9 @@ "headers": { "Server": "G-WAN" } }, "GX WebManager": { - "website": "www.gxsoftware.com\/en\/products\/web-content-management.htm", + "website": "www.gxsoftware.com/en/products/web-content-management.htm", "cats": [ 1 ], - "meta": { "generator": "GX WebManager( ([\\d.]+))?\\;version:\\2" }, + "meta": { "generator": "GX WebManager(?: ([\\d.]+))?\\;version:\\1" }, "html": "", + "meta": { "eomportal-instanceid": "[0-9]+", "eomportal-id": "[0-9]+", "eomportal-loid": "[0-9.]+", "eomportal-uuid": "[a-f0-9]+", "eomportal-lastUpdate": ".*" } }, "Microsoft ASP.NET": { "website": "www.asp.net", "cats": [ 18 ], "url": "\\.aspx$", "html": "]+name=\"__VIEWSTATE", - "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" - }, - "implies": [ "IIS", "Windows Server" ] + "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" }, + "implies": "IIS\\;confidence:50" }, "Microsoft SharePoint": { "website": "sharepoint.microsoft.com", @@ -1383,18 +1566,29 @@ "cats": [ 2 ], "html": "]+minibb.+\\s+", + "html": "", "env": "^_?owa_" }, "OneStat": { "website": "www.onestat.com", "cats": [ 10 ], - "html": "var p==.+stat\\.onestat\\.com\/stat\\.aspx\\?tagver" + "html": "var p==.+stat\\.onestat\\.com/stat\\.aspx\\?tagver" }, "OpenCart": { "website": "www.opencart.com", "cats": [ 6 ], - "html": "index\\.php\\?route=[a-z]+\/|Powered By ]+OpenCart", + "html": "(?:index\\.php\\?route=[a-z]+/|Powered By ]+OpenCart)", "implies": "PHP" }, "openEngine": { - "website": "openengine.de\/html\/pages\/de\/", + "website": "openengine.de/html/pages/de/", "cats": [ 1 ], - "html": "]+openEngine" }, "OpenGrok": { - "website": "hub.opensolaris.org\/bin\/view\/Project+opengrok\/WebHome", + "meta": "openEngine" + }, + "OpenGrok": { + "website": "hub.opensolaris.org/bin/view/Project+opengrok/WebHome", "cats": [ 19 ], "headers": { "Set-Cookie": "OpenGrok" }, - "meta": { "generator": "OpenGrok( v?([\\d.]+))?\\;version:\\2" }, + "meta": { "generator": "OpenGrok(?: v?([\\d.]+))?\\;version:\\1" }, "implies": "Java" }, "OpenGSE": { - "website": "code.google.com\/p\/opengse", + "website": "code.google.com/p/opengse", "cats": [ 22 ], "headers": { "Server": "GSE" }, "implies": "Java" @@ -1624,14 +1838,14 @@ "env": "^OpenLayers$" }, "OpenNemas": { - "website": "openhost.es\/en\/opennemas", + "website": "openhost.es/en/opennemas", "cats": [ 1 ], "headers": { "X-Powered-By": "OpenNemas" } }, "OpenSSL": { "website": "openssl.org", "cats": [ 33 ], - "headers": { "Server": "OpenSSL(\/([\\d.]+[a-z]?))?\\;version:\\2" } + "headers": { "Server": "OpenSSL(?:/([\\d.]+[a-z]?))?\\;version:\\1" } }, "OpenText Web Solutions": { "website": "websolutions.opentext.com", @@ -1645,19 +1859,19 @@ "env": "^optimizely$" }, "Oracle Application Server": { - "website": "www.oracle.com\/technetwork\/middleware\/ias\/overview\/index.html", + "website": "www.oracle.com/technetwork/middleware/ias/overview/index.html", "cats": [ 22 ], - "headers": { "Server": "Oracle(-| )Application(-| )Server((-| )(\\d+[a-z]?))?\\;version:\\5" } + "headers": { "Server": "Oracle\\bApplication\\bServer(?:\\b(\\d+[a-z]?))?\\;version:\\1" } }, "Oracle Recommendations On Demand": { - "website": "www.oracle.com\/us\/products\/applications\/commerce\/recommendations-on-demand\/index.html?", + "website": "www.oracle.com/us/products/applications/commerce/recommendations-on-demand/index.html", "cats": [ 10 ], "script": "atgsvcs.+atgsvcs\\.js" }, "osCommerce": { "website": "www.oscommerce.com", "cats": [ 6 ], - "html": "(]*(\\?|&)osCsid|Powered by (<[^]+>)?osCommerce<\/a>|<[^]+class=\"[^>]*infoBoxHeading)", + "html": "(?:]*(?:\\?|&)osCsid|Powered by (?:<[^]+>)?osCommerce|<[^]+class=\"[^>]*infoBoxHeading)", "headers": { "Set-Cookie": "osCsid=" } }, "osCSS": { @@ -1668,31 +1882,30 @@ "Outbrain": { "website": "outbrain.com", "cats": [ 5 ], - "html": "var OB_langJS = '.+widgets\\.outbrain\\.com\/lang_", - "script": "widgets\\.outbrain\\.com\/outbrain\\.js", - "env": "^OutbrainPermaLink$" + "script": "widgets\\.outbrain\\.com/outbrain\\.js", + "env": "^(?:OutbrainPermaLink|OB_releaseVer)$" }, "OXID eShop": { "website": "oxid-esales.com", "cats": [ 6 ], - "html": "", "implies": "Java" }, @@ -2649,6 +2924,11 @@ "website": "foundation.zurb.com", "cats": [ 18 ], "html": "]+foundation[^>\"]+css" + }, + "LiveStreet CMS": { + "website": "livestreetcms.com", + "cats": [ 1 ], + "headers": { "X-Powered-By": "LiveStreet CMS" } } } } diff --git a/drivers/php/js/wappalyzer.js b/drivers/php/js/wappalyzer.js index 6257ac81e..3bb3d9ad2 100644 --- a/drivers/php/js/wappalyzer.js +++ b/drivers/php/js/wappalyzer.js @@ -13,64 +13,64 @@ var wappalyzer = (function() { * Application class */ var Application = function(app, detected) { - var self = this; - - self.app = app; - self.confidence = {}; - self.confidenceTotal = 0; - self.detected = Boolean(detected); - self.version = ''; - self.versions = []; + this.app = app; + this.confidence = {}; + this.confidenceTotal = 0; + this.detected = Boolean(detected); + this.version = ''; + this.versions = []; + }; + Application.prototype = { /** * Calculate confidence total */ - self.getConfidence = function() { + getConfidence: function() { var total = 0; - for ( id in self.confidence ) { - total += self.confidence[id]; + for ( id in this.confidence ) { + total += this.confidence[id]; } - return self.confidenceTotal = Math.min(total, 100); - } + return this.confidenceTotal = Math.min(total, 100); + }, /** * Resolve version number (find the longest version number that contains all shorter detected version numbers) */ - self.getVersion = function() { - var next, resolved; + getVersion: function() { + var i, next, resolved; - if ( !self.versions.length ) { + if ( !this.versions.length ) { return; } - self.versions.sort(function(a, b) { + this.versions.sort(function(a, b) { return a.length > b.length ? 1 : ( a.length < b.length ? -1 : 0 ); }); - resolved = self.versions[0]; + resolved = this.versions[0]; - for ( i in self.versions ) { + for ( i in this.versions ) { next = parseInt(i) + 1; - if ( next < self.versions.length ) { - if ( self.versions[next].indexOf(self.versions[i]) !== -1 ) { - resolved = self.versions[next]; + if ( next < this.versions.length ) { + if ( this.versions[next].indexOf(this.versions[i]) !== -1 ) { + resolved = this.versions[next]; } else { break; } } } - return self.version = resolved; - } + return this.version = resolved; + }, - self.setDetected = function(pattern, type, value, key) { - self.detected = true; + setDetected: function(pattern, type, value, key) { + this.detected = true; // Set confidence level - self.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; + this.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; // Detect version number if ( pattern.version ) { @@ -79,13 +79,20 @@ var wappalyzer = (function() { matches = pattern.regex.exec(value) ; + w.log({ matches: matches, version: version }); + if ( matches ) { matches.map(function(match, i) { // Parse ternary operator var ternary = new RegExp('\\\\' + i + '\\?([^:]+):(.+)$').exec(version); if ( ternary && ternary.length === 3 ) { + + w.log({ match: match, i: i, ternary: ternary }); + version = version.replace(ternary[0], match ? ternary[1] : ternary[2]); + + w.log({ version: version }); } // Replace back references @@ -93,14 +100,43 @@ var wappalyzer = (function() { }); if ( version ) { - self.versions.push(version); + this.versions.push(version); } - self.getVersion(); + this.getVersion(); } } } - } + }; + + var Profiler = function() { + this.regexCount = 0; + this.startTime = new Date().getTime(); + this.lastTime = new Date().getTime(); + this.slowest = { duration: null, app: '', type: '', pattern: '' }; + this.timedOut = false; + }; + + Profiler.prototype = { + checkPoint: function(app, type, regex) { + var duration = new Date().getTime() - this.lastTime; + + if ( !this.slowest.duration || duration > this.slowest.duration ) { + this.slowest.duration = duration; + this.slowest.app = app; + this.slowest.type = type; + this.slowest.regex = regex; + } + + this.lastTime = new Date().getTime(); + + this.timedOut = this.getDuration() > 1000; + }, + + getDuration: function() { + return new Date().getTime() - this.startTime; + } + }; /** * Call driver functions @@ -172,15 +208,9 @@ var wappalyzer = (function() { config: { environment: 'dev', // dev | live - - version: false, - websiteURL: 'http://wappalyzer.com/', twitterURL: 'https://twitter.com/Wappalyzer', githubURL: 'https://github.com/ElbertF/Wappalyzer', - - firstRun: false, - upgraded: false }, /** @@ -214,19 +244,7 @@ var wappalyzer = (function() { } // Initialize driver - driver('init', function() { - if ( w.config.firstRun ) { - driver('goToURL', { url: w.config.websiteURL + 'installed', medium: 'install' }); - - w.config.firstRun = false; - } - - if ( w.config.upgraded ) { - driver('goToURL', { url: w.config.websiteURL + 'upgraded', medium: 'upgrade' }); - - w.config.upgraded = false; - } - }); + driver('init'); }, /** @@ -235,10 +253,7 @@ var wappalyzer = (function() { analyze: function(hostname, url, data) { var i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header, version, - profiler = { - regexCount: 0, - startTime: new Date().getTime() - }, + profiler = new Profiler(), apps = {} ; @@ -257,13 +272,21 @@ var wappalyzer = (function() { } for ( app in w.apps ) { + // Exit loop after one second to prevent CPU hogging + // Remaining patterns will not be evaluated + if ( profiler.timedOut ) { + w.log('Timeout, exiting loop'); + + break; + } + apps[app] = w.detected[url] && w.detected[url][app] ? w.detected[url][app] : new Application(app); for ( type in w.apps[app] ) { switch ( type ) { case 'url': parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(url) ) { apps[app].setDetected(pattern, type, url); @@ -277,7 +300,7 @@ var wappalyzer = (function() { } parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(data[type]) ) { apps[app].setDetected(pattern, type, data[type]); @@ -293,10 +316,10 @@ var wappalyzer = (function() { regexScript = new RegExp(']+src=("|\')([^"\']+)', 'ig'); parse(w.apps[app][type]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); while ( match = regexScript.exec(data.html) ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(match[2]) ) { apps[app].setDetected(pattern, type, match[2]); @@ -310,19 +333,17 @@ var wappalyzer = (function() { break; } - profiler.regexCount ++; - regexMeta = /]+>/ig; while ( match = regexMeta.exec(data.html) ) { for ( meta in w.apps[app][type] ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, regexMeta); if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { content = match.toString().match(/content=("|')([^"']+)("|')/i); parse(w.apps[app].meta[meta]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( content && content.length === 4 && pattern.regex.test(content[2]) ) { apps[app].setDetected(pattern, type, content[2], meta); @@ -340,7 +361,7 @@ var wappalyzer = (function() { for ( header in w.apps[app].headers ) { parse(w.apps[app][type][header]).map(function(pattern) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) { apps[app].setDetected(pattern, type, data[type][header], header); @@ -356,7 +377,7 @@ var wappalyzer = (function() { parse(w.apps[app][type]).map(function(pattern) { for ( i in data[type] ) { - profiler.regexCount ++; + profiler.checkPoint(app, type, pattern.regex); if ( pattern.regex.test(data[type][i]) ) { apps[app].setDetected(pattern, type, data[type][i]); @@ -369,7 +390,8 @@ var wappalyzer = (function() { } } - w.log('Tested ' + profiler.regexCount + ' regular expressions in ' + ( ( ( new Date ).getTime() - profiler.startTime ) / 1000 ) + 's'); + w.log('[ PROFILER ] Tested ' + profiler.regexCount + ' regular expressions in ' + ( profiler.getDuration() / 1000 ) + 's'); + w.log('[ PROFILER ] Slowest pattern took ' + ( profiler.slowest.duration / 1000 ) + 's: ' + profiler.slowest.app + ' | ' + profiler.slowest.type + ' | ' + profiler.slowest.regex); for ( app in apps ) { if ( !apps[app].detected ) { diff --git a/drivers/python/wappalyzer.py b/drivers/python/wappalyzer.py new file mode 100755 index 000000000..15d048be8 --- /dev/null +++ b/drivers/python/wappalyzer.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import sys +import PyV8 +import urllib +from urlparse import urlparse + +try: + import json +except ImportError: + import simplejson as json + + +class Wappalyzer(object): + + def __init__(self, url): + self.file_dir = os.path.dirname(__file__) + + f = open(os.path.join(self.file_dir, '../../share/apps.json')) + data = json.loads(f.read()) + f.close() + + self.categories = data['categories'] + self.apps = data['apps'] + self.url = url + + def analyze(self): + ctxt = PyV8.JSContext() + ctxt.enter() + + f1 = open(os.path.join(self.file_dir, '../php/js/wappalyzer.js')) + f2 = open(os.path.join(self.file_dir, '../php/js/driver.js')) + ctxt.eval(f1.read()) + ctxt.eval(f2.read()) + f1.close() + f2.close() + + host = urlparse(self.url).hostname + html = urllib.urlopen(self.url).read() + + data = {'host': host, 'url': self.url, 'html': html, 'headers': {}} + apps = json.dumps(self.apps) + categories = json.dumps(self.categories) + return ctxt.eval("w.apps = %s; w.categories = %s; w.driver.data = %s; w.driver.init();" % (apps, categories, json.dumps(data))) + +if __name__ == '__main__': + try: + w = Wappalyzer(sys.argv[1]) + print w.analyze() + except IndexError: + print ('Usage: python %s ' % sys.argv[0]) diff --git a/drivers/ruby/wappalyzer.rb b/drivers/ruby/wappalyzer.rb index a09d216da..d66b9a01e 100755 --- a/drivers/ruby/wappalyzer.rb +++ b/drivers/ruby/wappalyzer.rb @@ -4,6 +4,8 @@ require 'net/http' require 'v8' require 'json' +Encoding.default_external = Encoding::UTF_8 + class Wappalyzer def initialize @realdir = File.dirname(File.realpath(__FILE__)) @@ -14,7 +16,7 @@ class Wappalyzer def analyze(url) uri, body, headers = URI(url), nil, {} - Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http| + Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https', :open_timeout => 5) do |http| resp = http.get(uri.request_uri) resp.canonical_each{|k,v| headers[k] = v} body = resp.body.encode('UTF-8', :invalid => :replace, :undef => :replace) diff --git a/share/apps.json b/share/apps.json index 326e85240..012b21851 100644 --- a/share/apps.json +++ b/share/apps.json @@ -35,7 +35,11 @@ "33": "web-server-extensions", "34": "databases", "35": "maps", - "36": "advertising-networks" + "36": "advertising-networks", + "37": "network-devices", + "38": "media-servers", + "39": "webcams", + "40": "printers" }, "apps": { "1C-Bitrix": { @@ -63,6 +67,17 @@ "headers": { "X-Powered-By": "3DCART" }, "script": "(?:twlh(?:track)?\\.asp|3d_upsell\\.js)" }, + "3DM": { + "website": "www.3ware.com", + "cats": [ 19 ], + "html": "3ware 3DM([\\d\\.]+)?\\;version:\\1", + "implies": "3ware" + }, + "3ware": { + "website": "www.3ware.com", + "cats": [ 22 ], + "headers": { "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1" } + }, "Accessible Portal": { "website": "www.accessibleportal.com", "cats": [ 1 ], @@ -154,6 +169,16 @@ "cats": [ 22 ], "headers": { "Server": "(?:Apache(?:$|/([\\d.]+)|[^/-])|(?:^|\\b)HTTPD)\\;version:\\1" } }, + "Apache Hadoop": { + "website": "hadoop.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hadoop.css\"" + }, + "Apache HBase": { + "website": "hbase.apache.org", + "cats": [ 34 ], + "html": "type=\"text/css\" href=\"/static/hbase.css\"" + }, "Apache JSPWiki": { "website": "jspwiki.org", "cats": [ 8 ], @@ -182,6 +207,11 @@ "meta": { "generator": "^AsciiDoc ([\\d.]+)\\;version:\\1" }, "env": "^asciidoc$" }, + "ATEN": { + "website": "www.aten.com", + "cats": [ 22 ], + "headers": { "Server": "ATEN HTTP Server(\\(V?([\\d\\.]+)\\))?\\;version:\\2" } + }, "ATG Web Commerce": { "website": "oracle.com/us/products/applications/web-commerce/atg", "cats": [ 6 ], @@ -224,6 +254,12 @@ "html": "Built upon the <a href=\"[^>]+banshee-php\\.org/\">[a-z]+</a>(?:v([\\d.]+))?\\;version:\\1", "implies": "PHP" }, + "BaseHTTP": { + "website": "docs.python.org/2/library/basehttpserver.html", + "cats": [ 22 ], + "headers": { "Server": "BaseHTTP\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" + }, "BIGACE": { "website": "bigace.de", "cats": [ 1 ], @@ -270,6 +306,15 @@ "meta": { "generator": "blogger" }, "url": "\\.blogspot\\.com" }, + "Boa": { + "website": "www.boa.org", + "cats": [ 22 ], + "headers": { "Server": "Boa\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, + "Brother": { + "website": "www.brother.com", + "cats": [ 40 ] + }, "BrowserCMS": { "website": "browsercms.org", "cats": [ 1 ], @@ -294,6 +339,10 @@ "script": "CatalystScripts", "html": "<!-- BC_OBNW -->" }, + "Canon": { + "website": "www.canon.com", + "cats": [ 40 ] + }, "CakePHP": { "website": "cakephp.org", "cats": [ 18 ], @@ -309,6 +358,12 @@ "html": "<link [^>]+Cargo feed", "implies": "PHP" }, + "Catwalk": { + "website": "www.canon.com", + "cats": [ 22 ], + "headers": { "Server": "Catwalk\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Canon" + }, "CentOS": { "website": "centos.org", "cats": [ 28 ], @@ -348,12 +403,23 @@ "cats": [ 22 ], "headers": { "Server": "Cherokee/([\\d.]+)\\;version:\\1" } }, + "CherryPy": { + "website": "www.cherrypy.org", + "cats": [ 18, 22 ], + "headers": { "Server": "CherryPy\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Python" + }, "CKEditor": { "website": "ckeditor.com", "cats": [ 24 ], "env": "^CKEDITOR$", "implies": "PHP" }, + "Cloudera": { + "website": "www.cloudera.com", + "cats": [ 34 ], + "headers": { "Server": "cloudera" } + }, "ClickHeat": { "website": "www.labsmedia.com/clickheat/index.html", "cats": [ 10 ], @@ -364,6 +430,7 @@ "ClickTale": { "website": "www.clicktale.com", "cats": [ 10 ], + "html": "if\\(typeof ClickTale(Tag)*==\\\"function\\\"\\)", "env": "^ClickTale" }, "Clicky": { @@ -401,11 +468,21 @@ "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker|ci_session)" }, "implies": "PHP" }, + "CodeMirror": { + "website": "codemirror.net", + "cats": [ 19 ], + "env": "^CodeMirror$" + }, "Commerce Server": { "website": "commerceserver.net", "cats": [ 6 ], "headers": { "COMMERCE-SERVER-SOFTWARE": ".+" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "implies": "Microsoft ASP.NET" + }, + "CompaqHTTPServer": { + "website": "www.hp.com", + "cats": [ 22 ], + "headers": { "Server": "CompaqHTTPServer\\/?([\\d\\.]+)?\\;version:\\1" } }, "comScore": { "website": "comscore.com", @@ -541,6 +618,11 @@ "meta": { "generator": "Danneo CMS ([\\d.]+)\\;version:\\1" }, "implies": [ "Apache", "PHP" ] }, + "Darwin": { + "website": "opensource.apple.com", + "cats": [ 28 ], + "headers": { "Server": "Darwin", "X-Powered-By": "Darwin" } + }, "DataLife Engine": { "website": "dle-news.ru", "cats": [ 1 ], @@ -558,6 +640,12 @@ "cats": [ 28 ], "headers": { "Server": "Debian", "X-Powered-By": "(?:Debian|dotdeb|(sarge|etch|lenny|squeeze|wheezy|jessie))\\;version:\\1" } }, + "debut": { + "website": "www.brother.com", + "cats": [ 22 ], + "headers": { "Server": "debut\\/?([\\d\\.]+)?\\;version:\\1" }, + "implies": "Brother" + }, "DedeCMS": { "website": "dedecms.com", "cats": [ 1 ], @@ -565,6 +653,10 @@ "script": "dedeajax", "implies": "PHP" }, + "Dell": { + "website": "dell.com", + "cats": [ 40 ] + }, "Demandware": { "website": "demandware.com", "cats": [ 6 ], @@ -660,6 +752,11 @@ "html": "(?:id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field)", "implies": "Drupal" }, + "dwhttpd": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "dwhttpd\\/?([\\d\\.a-z]+)?\\;version:\\1" } + }, "Dynamicweb": { "website": "www.dynamicweb.dk", "cats": [ 1, 6, 10 ], @@ -671,13 +768,31 @@ "website": "e107.org", "cats": [ 1 ], "script": "e107\\.js", - "headers": { "Set-Cookie": "e107_td[^;]+=" }, + "headers": { "Set-Cookie": "e107_tz[^;]+=", "X-Powered-By": "e107" }, "implies": "PHP" }, "EdgeCast": { "website": "www.edgecast.com", "cats": [ 31 ], - "headers": { "Server": "^ECS" } + "headers": { "Server": "^EC(?:S|Acc)" }, + "url": "https?://(?:[^/]+\\.)?edgecastcdn\\.net/" + }, + "eHTTP": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "\\beHTTP( v?([\\d\\.]+))?\\;version:\\2" }, + "implies": [ "HP ProCurve"] + }, + "ELOG": { + "website": "midas.psi.ch/elog", + "cats": [ 19 ], + "html": "<title>ELOG Logbook Selection" + }, + "ELOG HTTP": { + "website": "midas.psi.ch/elog", + "cats": [ 22 ], + "headers": { "Server": "ELOG HTTP( \\d[\\-\\d\\.]+)?\\;version:\\1" }, + "implies": "ELOG" }, "Eloqua": { "website": "eloqua.com", @@ -706,7 +821,7 @@ "cats": [ 1 ], "meta": { "generator": "EPiServer" }, "headers": { "Set-Cookie": "EPi(?:Trace|Server)[^;]*=" }, - "implies": [ "Microsoft ASP.NET", "IIS", "Windows Server" ] + "implies": "Microsoft ASP.NET" }, "EPrints": { "website": "www.eprints.org", @@ -715,6 +830,11 @@ "env": "^EPJS_menu_template$", "implies": "Perl" }, + "Erlang": { + "website": "www.erlang.org", + "cats": [ 27 ], + "headers": { "Server": "Erlang( OTP/([\\-\\d\\.ABR]+))?\\;version:\\1" } + }, "eSyndiCat": { "website": "esyndicat.com", "cats": [ 1 ], @@ -723,6 +843,12 @@ "env": "^esyndicat$", "implies": [ "PHP" ] }, + "EWS-NIC4": { + "website": "dell.com", + "cats": [ 22 ], + "headers": { "Server": "EWS-NIC4(\\/([\\d\\.a-z]+))?\\;version:\\2" }, + "implies": "Dell" + }, "Exhibit": { "website": "simile-widgets.org/exhibit/", "cats": [ 25 ], @@ -778,6 +904,11 @@ "cats": [ 28 ], "headers": { "Server": "Fedora" } }, + "FlashCom": { + "website": "???", + "cats": [ 22 ], + "headers": { "Server": "FlashCom\\/?([\\d\\.]+)?\\;version:\\1" } + }, "FlexCMP": { "website": "http://www.flexcmp.com/cms/home", "cats": [ 1 ], @@ -915,6 +1046,11 @@ "script": "/graffiti\\.js", "headers": { "Set-Cookie": "graffitibot[^;]=" } }, + "Grandstream": { + "website": "www.grandstream.com", + "cats": [ 22, 39 ], + "headers": { "Server": "Grandstream\\/?([\\d\\.]+)?\\;version:\\1" } + }, "Gravatar": { "website": "gravatar.com", "cats": [ 19 ], @@ -952,6 +1088,11 @@ "script": "highcharts.*\\.js", "env": "^Highcharts$" }, + "Highstock": { + "website": "highcharts.com/products/highstock", + "cats": [ 25 ], + "script": "highstock(\\-|\\.)?([\\d\\.]*\\d).*\\.js\\;version:\\2" + }, "Hogan.js": { "website": "twitter.github.com/hogan.js", "cats": [ 12 ], @@ -963,6 +1104,10 @@ "meta": { "generator": "Hotaru CMS" }, "headers": { "Set-Cookie": "hotaru_mobile=" } }, + "HP ProCurve": { + "website": "hp.com/networking", + "cats": [ 37 ] + }, "HubSpot": { "website": "hubspot.com", "cats": [ 32 ], @@ -997,7 +1142,7 @@ "iCongo": { "website": "hybris.com/icongo", "cats": [ 6 ], - "meta": "iCongo", + "meta": { "iCongo": ".*" }, "implies": "Adobe ColdFusion" }, "IIS": { @@ -1027,6 +1172,12 @@ "html": "<(?:link|a href) [^>]+ndxz-studio", "implies": [ "PHP", "Apache", "Exhibit" ] }, + "Indico": { + "website": "indico-software.org", + "cats": [ 1 ], + "headers": { "Set-cookie": "MAKACSESSION" }, + "html": "Powered by\\s+(CERN )?(CDS )?Indico( [\\d\\.]+)?\\;version:\\4" + }, "InstantCMS": { "website": "www.instantcms.ru", "cats": [ 1 ], @@ -1100,6 +1251,12 @@ "headers": { "X-Powered-By": "Servlet(?:/([\\d.]+))?\\;version:\\1" }, "implies": "Java" }, + "Jetty": { + "website": "www.eclipse.org/jetty", + "cats": [ 22 ], + "headers": { "Server": "Jetty(\\(([\\d\\.]+\\d+))?\\;version:\\2" }, + "implies": "Java" + }, "Jirafe": { "website": "jirafe.com", "cats": [ 10, 32 ], @@ -1124,7 +1281,7 @@ "meta": { "generator": "Joomla!(?: ([\\d.]+))?\\;version:\\1" }, "html": "(?:]+id=\"wrapper_r\"|<[^>]+(?:feed|components)/com_|]+class=\"pill)\\;confidence:50", "headers": { "X-Content-Encoded-By": "Joomla! ([\\d.]+)\\;version:\\1" }, - "env": "^jcomments$", + "env": "^(jcomments|Joomla)$", "implies": "PHP" }, "jqPlot": { @@ -1159,7 +1316,7 @@ "jQuery UI": { "website": "jqueryui.com", "cats": [ 12 ], - "script": "jqueryui/([\\d.]+)\\.js\\;version:\\1", + "script": [ "jquery-ui(?:-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "([\\d.]+)/jquery-ui(\\.min)?\\.js\\;version:\\1", "jquery-ui.*\\.js" ], "implies": "jQuery" }, "JS Charts": { @@ -1242,6 +1399,17 @@ "meta": { "generator": "Koobi" }, "html": "", + "meta": { "eomportal-instanceid": "[0-9]+", "eomportal-id": "[0-9]+", "eomportal-loid": "[0-9.]+", "eomportal-uuid": "[a-f0-9]+", "eomportal-lastUpdate": ".*" } + }, "Microsoft ASP.NET": { "website": "www.asp.net", "cats": [ 18 ], "url": "\\.aspx$", "html": "]+name=\"__VIEWSTATE", "headers": { "X-Powered-By": "ASP\\.NET;\\confidence:50", "X-AspNet-Version": "(.+)\\;version:\\1" }, - "implies": [ "IIS", "Windows Server" ] + "implies": "IIS\\;confidence:50" }, "Microsoft SharePoint": { "website": "sharepoint.microsoft.com", @@ -1380,6 +1566,11 @@ "cats": [ 2 ], "html": "]+minibb.+\\s+