|
|
|
#!/usr/bin/env node
|
|
|
|
|
|
|
|
var
|
|
|
|
app,
|
|
|
|
modulesPath = process.env.WAPPALYZER_NODE_PATH !== undefined ? process.env.WAPPALYZER_NODE_PATH + '/node_modules/' : '',
|
|
|
|
json = require(process.env.WAPPALYZER_ROOT + '/src/apps.json');
|
|
|
|
|
|
|
|
for ( app in json.apps ) {
|
|
|
|
['headers', 'html', 'env', 'meta', 'script'].forEach(function(type) {
|
|
|
|
var
|
|
|
|
key,
|
|
|
|
patterns = json.apps[app][type];
|
|
|
|
|
|
|
|
if ( patterns !== undefined ) {
|
|
|
|
patterns = typeof patterns === 'string' ? [patterns] : patterns;
|
|
|
|
|
|
|
|
if ( !( patterns instanceof Array ) ) {
|
|
|
|
patterns = [];
|
|
|
|
|
|
|
|
for ( key in json.apps[app][type] ) {
|
|
|
|
patterns.push(json.apps[app][type][key]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
patterns.forEach(function(pattern) {
|
|
|
|
var
|
|
|
|
attrs = pattern.split('\\;'),
|
|
|
|
regex = '/' + attrs.shift().replace('/', '\/') + '/';
|
|
|
|
|
|
|
|
//Check if the pattern is a valid RegExp
|
|
|
|
//Note: unlike when used in Wappalyzer, the modifier i isn't added here
|
|
|
|
new RegExp(regex);
|
|
|
|
|
|
|
|
|
|
|
|
if ( /^\/(?:\^\$|\.\+|\.\*)\/$/.test(regex) ) {
|
|
|
|
throw new Error('Pattern should be replaced with empty string.\n' + app + ': ' + type + ': ' + pattern);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( type === 'html' ) {
|
|
|
|
if ( /\.(?:\+|\*)/.test(regex) ) {
|
|
|
|
throw new Error('Avoid ".+" and ".*" in HTML patterns. Consider using "[^>]+" or "[^<]+" instead.\n' + app + ': ' + type + ': ' + pattern);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !/[<>]/.test(regex) ) {
|
|
|
|
throw new Error('HTML patterns must contain "<" or ">".\n' + app + ': ' + type + ': ' + pattern);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
if ( /[a-z]+:\/\//i.test(json.apps[app].website) ) {
|
|
|
|
throw new Error('Do not include the protocol in the website URL\n' + app + ': ' + json.apps[app].website);
|
|
|
|
}
|
|
|
|
}
|