Allow arrays and strings in apps.json

main
Elbert Alias 12 years ago
parent feec711a2f
commit e79c9075cd

@ -1,98 +0,0 @@
<script type='text/javascript'>/*
Download helper application
Copyright © 2012 q-- <https://github.com/q-->
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
var fileSystem = new ActiveXObject("Scripting.FileSystemObject");
var wShell=new ActiveXObject('WScript.Shell');
var cd = wShell.currentDirectory;
var scriptDirName='.windows_zip';
//Check for itself
if(cd.replace(fileSystem.getParentFolderName(cd)+'\\','')!==scriptDirName){
//OK, the file is not where it should be. Maybe do something.
}
var file='../7za.exe';
var file2='../../7za.exe';//In case of misunderstandings...
function checkFile(){
var filePath=false;
if(fileSystem.FileExists(file)) filePath=file; else if(fileSystem.FileExists(file2)) filePath=file2;
if(filePath){
//Move it to the right dir
fileSystem.MoveFile(filePath,'./7za.exe');
}else{
setTimeout(checkFile,1000);
}
}
function alreadyInstalled(already){
document.getElementsByTagName('h1')[0].innerHTML="7-Zip is "+already+" installed";
var paragraphs=document.getElementsByTagName('p');
for(var i=0;i<paragraphs.length;i++){
if(i===0)
paragraphs[i].innerHTML='Click the links below for more options.';
else
paragraphs[i].innerHTML='';
}
}
//URLS
var sevenZipDownloadURL = 'https://github.com/q--/Wappalyzer/raw/a5fdff64fb7858c975409c061906734a67c0ebb3/.windows_zip/7za.exe';
var sevenZipSourceDownloadURL = 'https://github.com/q--/Wappalyzer/raw/a5fdff64fb7858c975409c061906734a67c0ebb3/.windows_zip/7z920%20source%20code.tar.bz2';
var sevenZipLicenseURL = 'https://raw.github.com/q--/Wappalyzer/a5fdff64fb7858c975409c061906734a67c0ebb3/.windows_zip/license.txt';
//Dimensions
var appWidth=700;
var appHeight=240;
//Center position
var xPos=(screen.width - appWidth) / 2;
//var yPos=(screen.height - appHeight) / 2;
var yPos=0;
//Resize application
window.resizeTo(appWidth,appHeight);
//Move application
window.moveTo(xPos,yPos);
function doIt(){
if(!(fileSystem.FileExists(file)||fileSystem.FileExists(file2))){
var w=window.open("https://github.com/q--/Wappalyzer/raw/a5fdff64fb7858c975409c061906734a67c0ebb3/.windows_zip/7za.exe",'winGitH');
w.onload=function(){window.focus();}
}else alreadyInstalled('');
checkFile();
}
</script><style>p{font-size:1.3em;font-family:sans-serif;}</style><h1>Download 7-zip (command line version)</h1><p>The download will be started automatically.</p><p>Place the file in the <strong>same folder</strong> as Wappalyzer.<hr><a href=''>License</a><script>document.links[document.links.length-1].href=sevenZipLicenseURL</script> | <a href=''>Source code</a><script>document.links[document.links.length-1].href=sevenZipSourceDownloadURL</script>
<script>(fileSystem.FileExists('7za.exe'))?alreadyInstalled('already'):doIt()</script>

@ -24,6 +24,26 @@ var wappalyzer = (function() {
return w.driver[func](args); return w.driver[func](args);
}; };
/**
* Parse apps.json patterns
*/
var parse = function(patterns) {
var parsed = [];
// Convert single patterns to an array
if ( typeof patterns === 'string' ) {
patterns = [ patterns ];
}
patterns.map(function(pattern) {
parsed.push({
regex: new RegExp(pattern.replace('/', '\\\/'), 'i') // Escape slashes in regular expression
});
});
return parsed;
};
/** /**
* Main script * Main script
*/ */
@ -91,7 +111,7 @@ var wappalyzer = (function() {
*/ */
analyze: function(hostname, url, data) { analyze: function(hostname, url, data) {
var var
i, j, app, confidence, type, regex, regexMeta, regexScript, match, content, meta, header, i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header,
profiler = { profiler = {
regexCount: 0, regexCount: 0,
startTime: new Date().getTime() startTime: new Date().getTime()
@ -115,7 +135,6 @@ var wappalyzer = (function() {
w.detected[url] = {}; w.detected[url] = {};
} }
appLoop:
for ( app in w.apps ) { for ( app in w.apps ) {
// Skip if the app has already been detected // Skip if the app has already been detected
if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) { if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) {
@ -129,15 +148,13 @@ var wappalyzer = (function() {
switch ( type ) { switch ( type ) {
case 'url': case 'url':
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(url) ) { if ( pattern.regex.test(url) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'html': case 'html':
@ -145,15 +162,13 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type]) ) { if ( pattern.regex.test(data[type]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'script': case 'script':
@ -161,20 +176,19 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i');
regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig'); regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig');
parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
while ( match = regexScript.exec(data.html) ) { while ( match = regexScript.exec(data.html) ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(match[2]) ) { if ( pattern.regex.test(match[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
case 'meta': case 'meta':
@ -193,15 +207,13 @@ var wappalyzer = (function() {
if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) {
content = match.toString().match(/content=("|')([^"']+)("|')/i); content = match.toString().match(/content=("|')([^"']+)("|')/i);
regex = new RegExp(w.apps[app].meta[meta].replace('/', '\\\/'), 'i'); parse(w.apps[app].meta[meta]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( content && content.length === 4 && regex.test(content[2]) ) { if ( content && content.length === 4 && regex.test(content[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
} }
} }
@ -213,15 +225,13 @@ var wappalyzer = (function() {
} }
for ( header in w.apps[app].headers ) { for ( header in w.apps[app].headers ) {
regex = new RegExp(w.apps[app][type][header].replace('/', '\\\/'), 'i'); parse(w.apps[app][type][header]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( typeof data[type][header] === 'string' && regex.test(data[type][header]) ) { if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
break; break;
@ -230,17 +240,15 @@ var wappalyzer = (function() {
break; break;
} }
regex = RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
for ( i in data[type] ) { for ( i in data[type] ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type][i]) ) { if ( pattern.regex.test(data[type][i]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
} }

@ -24,6 +24,26 @@ var wappalyzer = (function() {
return w.driver[func](args); return w.driver[func](args);
}; };
/**
* Parse apps.json patterns
*/
var parse = function(patterns) {
var parsed = [];
// Convert single patterns to an array
if ( typeof patterns === 'string' ) {
patterns = [ patterns ];
}
patterns.map(function(pattern) {
parsed.push({
regex: new RegExp(pattern.replace('/', '\\\/'), 'i') // Escape slashes in regular expression
});
});
return parsed;
};
/** /**
* Main script * Main script
*/ */
@ -91,7 +111,7 @@ var wappalyzer = (function() {
*/ */
analyze: function(hostname, url, data) { analyze: function(hostname, url, data) {
var var
i, j, app, confidence, type, regex, regexMeta, regexScript, match, content, meta, header, i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header,
profiler = { profiler = {
regexCount: 0, regexCount: 0,
startTime: new Date().getTime() startTime: new Date().getTime()
@ -115,7 +135,6 @@ var wappalyzer = (function() {
w.detected[url] = {}; w.detected[url] = {};
} }
appLoop:
for ( app in w.apps ) { for ( app in w.apps ) {
// Skip if the app has already been detected // Skip if the app has already been detected
if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) { if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) {
@ -129,15 +148,13 @@ var wappalyzer = (function() {
switch ( type ) { switch ( type ) {
case 'url': case 'url':
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(url) ) { if ( pattern.regex.test(url) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'html': case 'html':
@ -145,15 +162,13 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type]) ) { if ( pattern.regex.test(data[type]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'script': case 'script':
@ -161,20 +176,19 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i');
regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig'); regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig');
parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
while ( match = regexScript.exec(data.html) ) { while ( match = regexScript.exec(data.html) ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(match[2]) ) { if ( pattern.regex.test(match[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
case 'meta': case 'meta':
@ -193,15 +207,13 @@ var wappalyzer = (function() {
if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) {
content = match.toString().match(/content=("|')([^"']+)("|')/i); content = match.toString().match(/content=("|')([^"']+)("|')/i);
regex = new RegExp(w.apps[app].meta[meta].replace('/', '\\\/'), 'i'); parse(w.apps[app].meta[meta]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( content && content.length === 4 && regex.test(content[2]) ) { if ( content && content.length === 4 && regex.test(content[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
} }
} }
@ -213,15 +225,13 @@ var wappalyzer = (function() {
} }
for ( header in w.apps[app].headers ) { for ( header in w.apps[app].headers ) {
regex = new RegExp(w.apps[app][type][header].replace('/', '\\\/'), 'i'); parse(w.apps[app][type][header]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( typeof data[type][header] === 'string' && regex.test(data[type][header]) ) { if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
break; break;
@ -230,17 +240,15 @@ var wappalyzer = (function() {
break; break;
} }
regex = RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
for ( i in data[type] ) { for ( i in data[type] ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type][i]) ) { if ( pattern.regex.test(data[type][i]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
} }

@ -24,6 +24,26 @@ var wappalyzer = (function() {
return w.driver[func](args); return w.driver[func](args);
}; };
/**
* Parse apps.json patterns
*/
var parse = function(patterns) {
var parsed = [];
// Convert single patterns to an array
if ( typeof patterns === 'string' ) {
patterns = [ patterns ];
}
patterns.map(function(pattern) {
parsed.push({
regex: new RegExp(pattern.replace('/', '\\\/'), 'i') // Escape slashes in regular expression
});
});
return parsed;
};
/** /**
* Main script * Main script
*/ */
@ -91,7 +111,7 @@ var wappalyzer = (function() {
*/ */
analyze: function(hostname, url, data) { analyze: function(hostname, url, data) {
var var
i, j, app, confidence, type, regex, regexMeta, regexScript, match, content, meta, header, i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header,
profiler = { profiler = {
regexCount: 0, regexCount: 0,
startTime: new Date().getTime() startTime: new Date().getTime()
@ -115,7 +135,6 @@ var wappalyzer = (function() {
w.detected[url] = {}; w.detected[url] = {};
} }
appLoop:
for ( app in w.apps ) { for ( app in w.apps ) {
// Skip if the app has already been detected // Skip if the app has already been detected
if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) { if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) {
@ -129,15 +148,13 @@ var wappalyzer = (function() {
switch ( type ) { switch ( type ) {
case 'url': case 'url':
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(url) ) { if ( pattern.regex.test(url) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'html': case 'html':
@ -145,15 +162,13 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type]) ) { if ( pattern.regex.test(data[type]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'script': case 'script':
@ -161,20 +176,19 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i');
regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig'); regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig');
parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
while ( match = regexScript.exec(data.html) ) { while ( match = regexScript.exec(data.html) ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(match[2]) ) { if ( pattern.regex.test(match[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
case 'meta': case 'meta':
@ -193,15 +207,13 @@ var wappalyzer = (function() {
if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) {
content = match.toString().match(/content=("|')([^"']+)("|')/i); content = match.toString().match(/content=("|')([^"']+)("|')/i);
regex = new RegExp(w.apps[app].meta[meta].replace('/', '\\\/'), 'i'); parse(w.apps[app].meta[meta]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( content && content.length === 4 && regex.test(content[2]) ) { if ( content && content.length === 4 && regex.test(content[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
} }
} }
@ -213,15 +225,13 @@ var wappalyzer = (function() {
} }
for ( header in w.apps[app].headers ) { for ( header in w.apps[app].headers ) {
regex = new RegExp(w.apps[app][type][header].replace('/', '\\\/'), 'i'); parse(w.apps[app][type][header]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( typeof data[type][header] === 'string' && regex.test(data[type][header]) ) { if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
break; break;
@ -230,17 +240,15 @@ var wappalyzer = (function() {
break; break;
} }
regex = RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
for ( i in data[type] ) { for ( i in data[type] ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type][i]) ) { if ( pattern.regex.test(data[type][i]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
} }

@ -24,6 +24,26 @@ var wappalyzer = (function() {
return w.driver[func](args); return w.driver[func](args);
}; };
/**
* Parse apps.json patterns
*/
var parse = function(patterns) {
var parsed = [];
// Convert single patterns to an array
if ( typeof patterns === 'string' ) {
patterns = [ patterns ];
}
patterns.map(function(pattern) {
parsed.push({
regex: new RegExp(pattern.replace('/', '\\\/'), 'i') // Escape slashes in regular expression
});
});
return parsed;
};
/** /**
* Main script * Main script
*/ */
@ -91,7 +111,7 @@ var wappalyzer = (function() {
*/ */
analyze: function(hostname, url, data) { analyze: function(hostname, url, data) {
var var
i, j, app, confidence, type, regex, regexMeta, regexScript, match, content, meta, header, i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header,
profiler = { profiler = {
regexCount: 0, regexCount: 0,
startTime: new Date().getTime() startTime: new Date().getTime()
@ -115,7 +135,6 @@ var wappalyzer = (function() {
w.detected[url] = {}; w.detected[url] = {};
} }
appLoop:
for ( app in w.apps ) { for ( app in w.apps ) {
// Skip if the app has already been detected // Skip if the app has already been detected
if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) { if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) {
@ -129,15 +148,13 @@ var wappalyzer = (function() {
switch ( type ) { switch ( type ) {
case 'url': case 'url':
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(url) ) { if ( pattern.regex.test(url) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'html': case 'html':
@ -145,15 +162,13 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type]) ) { if ( pattern.regex.test(data[type]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'script': case 'script':
@ -161,20 +176,19 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i');
regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig'); regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig');
parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
while ( match = regexScript.exec(data.html) ) { while ( match = regexScript.exec(data.html) ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(match[2]) ) { if ( pattern.regex.test(match[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
case 'meta': case 'meta':
@ -193,15 +207,13 @@ var wappalyzer = (function() {
if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) {
content = match.toString().match(/content=("|')([^"']+)("|')/i); content = match.toString().match(/content=("|')([^"']+)("|')/i);
regex = new RegExp(w.apps[app].meta[meta].replace('/', '\\\/'), 'i'); parse(w.apps[app].meta[meta]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( content && content.length === 4 && regex.test(content[2]) ) { if ( content && content.length === 4 && regex.test(content[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
} }
} }
@ -213,15 +225,13 @@ var wappalyzer = (function() {
} }
for ( header in w.apps[app].headers ) { for ( header in w.apps[app].headers ) {
regex = new RegExp(w.apps[app][type][header].replace('/', '\\\/'), 'i'); parse(w.apps[app][type][header]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( typeof data[type][header] === 'string' && regex.test(data[type][header]) ) { if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
break; break;
@ -230,17 +240,15 @@ var wappalyzer = (function() {
break; break;
} }
regex = RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
for ( i in data[type] ) { for ( i in data[type] ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type][i]) ) { if ( pattern.regex.test(data[type][i]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
} }

@ -3,7 +3,7 @@
<!ENTITY wappalyzer.showIcons "Applikations-Icons zeigen"> <!ENTITY wappalyzer.showIcons "Applikations-Icons zeigen">
<!ENTITY wappalyzer.preferences "Weitere Optionen ..."> <!ENTITY wappalyzer.preferences "Weitere Optionen ...">
<!ENTITY wappalyzer.addonBar "In Addon-Leiste platzieren"> <!ENTITY wappalyzer.addonBar "In Addon-Leiste platzieren (Ctrl+/)">
<!ENTITY wappalyzer.categories "Kategorienverwaltung"> <!ENTITY wappalyzer.categories "Kategorienverwaltung">
<!ENTITY wappalyzer.performance "Performance"> <!ENTITY wappalyzer.performance "Performance">
<!ENTITY wappalyzer.interface "Interface"> <!ENTITY wappalyzer.interface "Interface">

@ -3,7 +3,7 @@
<!ENTITY wappalyzer.showIcons "Show application icons"> <!ENTITY wappalyzer.showIcons "Show application icons">
<!ENTITY wappalyzer.preferences "Options"> <!ENTITY wappalyzer.preferences "Options">
<!ENTITY wappalyzer.addonBar "Place in addon-bar"> <!ENTITY wappalyzer.addonBar "Place in addon-bar (press Ctrl+/ to toggle)">
<!ENTITY wappalyzer.categories "Categories"> <!ENTITY wappalyzer.categories "Categories">
<!ENTITY wappalyzer.performance "Performance"> <!ENTITY wappalyzer.performance "Performance">
<!ENTITY wappalyzer.interface "Interface"> <!ENTITY wappalyzer.interface "Interface">

@ -3,7 +3,7 @@
<!ENTITY wappalyzer.showIcons "Montrer les icônes des applications"> <!ENTITY wappalyzer.showIcons "Montrer les icônes des applications">
<!ENTITY wappalyzer.preferences "Plus d'options..."> <!ENTITY wappalyzer.preferences "Plus d'options...">
<!ENTITY wappalyzer.addonBar "Placer dans la barre des modules"> <!ENTITY wappalyzer.addonBar "Placer dans la barre des modules (Ctrl+/)">
<!ENTITY wappalyzer.categories "Gérer les catégories"> <!ENTITY wappalyzer.categories "Gérer les catégories">
<!ENTITY wappalyzer.performance "Performance"> <!ENTITY wappalyzer.performance "Performance">
<!ENTITY wappalyzer.interface "Interface"> <!ENTITY wappalyzer.interface "Interface">

@ -3,7 +3,7 @@
<!ENTITY wappalyzer.showIcons "Iconen zichtbaar"> <!ENTITY wappalyzer.showIcons "Iconen zichtbaar">
<!ENTITY wappalyzer.preferences "Meer opties..."> <!ENTITY wappalyzer.preferences "Meer opties...">
<!ENTITY wappalyzer.addonBar "Plaats in addon-bar"> <!ENTITY wappalyzer.addonBar "Plaats in addon-bar (klik Ctrl+/)">
<!ENTITY wappalyzer.categories "Beheer categorien"> <!ENTITY wappalyzer.categories "Beheer categorien">
<!ENTITY wappalyzer.performance "Performance"> <!ENTITY wappalyzer.performance "Performance">
<!ENTITY wappalyzer.interface "Interface"> <!ENTITY wappalyzer.interface "Interface">

@ -24,6 +24,26 @@ var wappalyzer = (function() {
return w.driver[func](args); return w.driver[func](args);
}; };
/**
* Parse apps.json patterns
*/
var parse = function(patterns) {
var parsed = [];
// Convert single patterns to an array
if ( typeof patterns === 'string' ) {
patterns = [ patterns ];
}
patterns.map(function(pattern) {
parsed.push({
regex: new RegExp(pattern.replace('/', '\\\/'), 'i') // Escape slashes in regular expression
});
});
return parsed;
};
/** /**
* Main script * Main script
*/ */
@ -91,7 +111,7 @@ var wappalyzer = (function() {
*/ */
analyze: function(hostname, url, data) { analyze: function(hostname, url, data) {
var var
i, j, app, confidence, type, regex, regexMeta, regexScript, match, content, meta, header, i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header,
profiler = { profiler = {
regexCount: 0, regexCount: 0,
startTime: new Date().getTime() startTime: new Date().getTime()
@ -115,7 +135,6 @@ var wappalyzer = (function() {
w.detected[url] = {}; w.detected[url] = {};
} }
appLoop:
for ( app in w.apps ) { for ( app in w.apps ) {
// Skip if the app has already been detected // Skip if the app has already been detected
if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) { if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) {
@ -129,15 +148,13 @@ var wappalyzer = (function() {
switch ( type ) { switch ( type ) {
case 'url': case 'url':
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(url) ) { if ( pattern.regex.test(url) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'html': case 'html':
@ -145,15 +162,13 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type]) ) { if ( pattern.regex.test(data[type]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'script': case 'script':
@ -161,20 +176,19 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i');
regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig'); regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig');
parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
while ( match = regexScript.exec(data.html) ) { while ( match = regexScript.exec(data.html) ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(match[2]) ) { if ( pattern.regex.test(match[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
case 'meta': case 'meta':
@ -193,15 +207,13 @@ var wappalyzer = (function() {
if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) {
content = match.toString().match(/content=("|')([^"']+)("|')/i); content = match.toString().match(/content=("|')([^"']+)("|')/i);
regex = new RegExp(w.apps[app].meta[meta].replace('/', '\\\/'), 'i'); parse(w.apps[app].meta[meta]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( content && content.length === 4 && regex.test(content[2]) ) { if ( content && content.length === 4 && regex.test(content[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
} }
} }
@ -213,15 +225,13 @@ var wappalyzer = (function() {
} }
for ( header in w.apps[app].headers ) { for ( header in w.apps[app].headers ) {
regex = new RegExp(w.apps[app][type][header].replace('/', '\\\/'), 'i'); parse(w.apps[app][type][header]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( typeof data[type][header] === 'string' && regex.test(data[type][header]) ) { if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
break; break;
@ -230,17 +240,15 @@ var wappalyzer = (function() {
break; break;
} }
regex = RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
for ( i in data[type] ) { for ( i in data[type] ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type][i]) ) { if ( pattern.regex.test(data[type][i]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
} }

@ -24,6 +24,26 @@ var wappalyzer = (function() {
return w.driver[func](args); return w.driver[func](args);
}; };
/**
* Parse apps.json patterns
*/
var parse = function(patterns) {
var parsed = [];
// Convert single patterns to an array
if ( typeof patterns === 'string' ) {
patterns = [ patterns ];
}
patterns.map(function(pattern) {
parsed.push({
regex: new RegExp(pattern.replace('/', '\\\/'), 'i') // Escape slashes in regular expression
});
});
return parsed;
};
/** /**
* Main script * Main script
*/ */
@ -91,7 +111,7 @@ var wappalyzer = (function() {
*/ */
analyze: function(hostname, url, data) { analyze: function(hostname, url, data) {
var var
i, j, app, confidence, type, regex, regexMeta, regexScript, match, content, meta, header, i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header,
profiler = { profiler = {
regexCount: 0, regexCount: 0,
startTime: new Date().getTime() startTime: new Date().getTime()
@ -115,7 +135,6 @@ var wappalyzer = (function() {
w.detected[url] = {}; w.detected[url] = {};
} }
appLoop:
for ( app in w.apps ) { for ( app in w.apps ) {
// Skip if the app has already been detected // Skip if the app has already been detected
if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) { if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) {
@ -129,15 +148,13 @@ var wappalyzer = (function() {
switch ( type ) { switch ( type ) {
case 'url': case 'url':
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(url) ) { if ( pattern.regex.test(url) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'html': case 'html':
@ -145,15 +162,13 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type]) ) { if ( pattern.regex.test(data[type]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'script': case 'script':
@ -161,20 +176,19 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i');
regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig'); regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig');
parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
while ( match = regexScript.exec(data.html) ) { while ( match = regexScript.exec(data.html) ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(match[2]) ) { if ( pattern.regex.test(match[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
case 'meta': case 'meta':
@ -193,15 +207,13 @@ var wappalyzer = (function() {
if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) {
content = match.toString().match(/content=("|')([^"']+)("|')/i); content = match.toString().match(/content=("|')([^"']+)("|')/i);
regex = new RegExp(w.apps[app].meta[meta].replace('/', '\\\/'), 'i'); parse(w.apps[app].meta[meta]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( content && content.length === 4 && regex.test(content[2]) ) { if ( content && content.length === 4 && regex.test(content[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
} }
} }
@ -213,15 +225,13 @@ var wappalyzer = (function() {
} }
for ( header in w.apps[app].headers ) { for ( header in w.apps[app].headers ) {
regex = new RegExp(w.apps[app][type][header].replace('/', '\\\/'), 'i'); parse(w.apps[app][type][header]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( typeof data[type][header] === 'string' && regex.test(data[type][header]) ) { if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
break; break;
@ -230,17 +240,15 @@ var wappalyzer = (function() {
break; break;
} }
regex = RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
for ( i in data[type] ) { for ( i in data[type] ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type][i]) ) { if ( pattern.regex.test(data[type][i]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
} }

@ -331,6 +331,7 @@
"Contao": { "Contao": {
"cats": [ 1 ], "cats": [ 1 ],
"html": "(<!--.+powered by (TYPOlight|Contao)-->|<link[^>]+(typolight|contao)\\.css)", "html": "(<!--.+powered by (TYPOlight|Contao)-->|<link[^>]+(typolight|contao)\\.css)",
"meta": { "generator": "Contao" },
"implies": [ "PHP" ] "implies": [ "PHP" ]
}, },
"Contenido": { "Contenido": {

File diff suppressed because it is too large Load Diff

@ -24,6 +24,26 @@ var wappalyzer = (function() {
return w.driver[func](args); return w.driver[func](args);
}; };
/**
* Parse apps.json patterns
*/
var parse = function(patterns) {
var parsed = [];
// Convert single patterns to an array
if ( typeof patterns === 'string' ) {
patterns = [ patterns ];
}
patterns.map(function(pattern) {
parsed.push({
regex: new RegExp(pattern.replace('/', '\\\/'), 'i') // Escape slashes in regular expression
});
});
return parsed;
};
/** /**
* Main script * Main script
*/ */
@ -91,7 +111,7 @@ var wappalyzer = (function() {
*/ */
analyze: function(hostname, url, data) { analyze: function(hostname, url, data) {
var var
i, j, app, confidence, type, regex, regexMeta, regexScript, match, content, meta, header, i, j, app, confidence, type, regexMeta, regexScript, match, content, meta, header,
profiler = { profiler = {
regexCount: 0, regexCount: 0,
startTime: new Date().getTime() startTime: new Date().getTime()
@ -115,7 +135,6 @@ var wappalyzer = (function() {
w.detected[url] = {}; w.detected[url] = {};
} }
appLoop:
for ( app in w.apps ) { for ( app in w.apps ) {
// Skip if the app has already been detected // Skip if the app has already been detected
if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) { if ( w.detected[url].hasOwnProperty(app) || apps.indexOf(app) !== -1 ) {
@ -129,15 +148,13 @@ var wappalyzer = (function() {
switch ( type ) { switch ( type ) {
case 'url': case 'url':
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(url) ) { if ( pattern.regex.test(url) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'html': case 'html':
@ -145,15 +162,13 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type]) ) { if ( pattern.regex.test(data[type]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
break; break;
case 'script': case 'script':
@ -161,20 +176,19 @@ var wappalyzer = (function() {
break; break;
} }
regex = new RegExp(w.apps[app][type].replace('/', '\\\/'), 'i');
regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig'); regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig');
parse(w.apps[app][type]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
while ( match = regexScript.exec(data.html) ) { while ( match = regexScript.exec(data.html) ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(match[2]) ) { if ( pattern.regex.test(match[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
case 'meta': case 'meta':
@ -193,15 +207,13 @@ var wappalyzer = (function() {
if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) { if ( new RegExp('name=["\']' + meta + '["\']', 'i').test(match) ) {
content = match.toString().match(/content=("|')([^"']+)("|')/i); content = match.toString().match(/content=("|')([^"']+)("|')/i);
regex = new RegExp(w.apps[app].meta[meta].replace('/', '\\\/'), 'i'); parse(w.apps[app].meta[meta]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( content && content.length === 4 && regex.test(content[2]) ) { if ( content && content.length === 4 && regex.test(content[2]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
} }
} }
@ -213,15 +225,13 @@ var wappalyzer = (function() {
} }
for ( header in w.apps[app].headers ) { for ( header in w.apps[app].headers ) {
regex = new RegExp(w.apps[app][type][header].replace('/', '\\\/'), 'i'); parse(w.apps[app][type][header]).map(function(pattern) {
profiler.regexCount ++; profiler.regexCount ++;
if ( typeof data[type][header] === 'string' && regex.test(data[type][header]) ) { if ( typeof data[type][header] === 'string' && pattern.regex.test(data[type][header]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
});
} }
break; break;
@ -230,17 +240,15 @@ var wappalyzer = (function() {
break; break;
} }
regex = RegExp(w.apps[app][type].replace('/', '\\\/'), 'i'); parse(w.apps[app][type]).map(function(pattern) {
for ( i in data[type] ) { for ( i in data[type] ) {
profiler.regexCount ++; profiler.regexCount ++;
if ( regex.test(data[type][i]) ) { if ( pattern.regex.test(data[type][i]) ) {
apps[app] = confidence; apps[app] = confidence;
continue appLoop;
} }
} }
});
break; break;
} }

Loading…
Cancel
Save