Smadav
Smadav
Smadav
(function() {
//'use strict';
const
d = document,
Cc = Components.classes,
Ci = Components.interfaces
;
w.driver = {
lastDisplayed: null,
/**
* Log messages to console
*/
log: function(args) {
if ( prefs != null && prefs.getBoolPref('debug') ) {
Cc['@mozilla.org/consoleservice;1'].getService(Ci.nsIConsoleService).logStringMessa
ge(args.message);
}
},
/**
* Initialize
*/
init: function(callback) {
var handler = function() {
window.removeEventListener('load', handler, false);
strings = d.getElementById('wappalyzer-strings');
// Read apps.json
var xhr =
Cc['@mozilla.org/xmlextras/xmlhttprequest;1'].createInstance(Ci.nsIXMLHttpRequest);
xhr.overrideMimeType('application/json');
xhr.open('GET', 'chrome://wappalyzer/content/apps.json',
true);
xhr.onload = function() {
var json = JSON.parse(xhr.responseText);
w.categories = json.categories;
w.apps = json.apps;
};
xhr.send(null);
AddonManager.getAddonByID('wappalyzer@crunchlabz.com',
function(addon) {
// Preferences
prefs = Cc['@mozilla.org/preferences-
service;1'].getService(Ci.nsIPrefService).getBranch('extensions.wappalyzer.');
container();
bindings();
// Version check
addon.version = addon.version;
if ( !prefs.getCharPref('version') ) {
w.config.firstRun = true;
} else if ( prefs.getCharPref('version') !=
addon.version ) {
w.config.upgraded = true;
}
prefs.setCharPref('version', addon.version);
messageManager.loadFrameScript('chrome://wappalyzer/content/js/content.js',
true);
gBrowser.addProgressListener({
// Listen for location changes
onLocationChange: function(progress, request,
location, flags) {
w.driver.displayApps();
},
request.nsIHttpChannel.visitResponseHeaders(function(header, value) {
headers[header] =
value;
});
gBrowser.tabContainer.addEventListener('TabSelect',
w.driver.displayApps, false);
callback();
});
};
switch(data) {
case 'addonBar':
container();
break;
}
w.driver.displayApps();
},
/**
* Display apps
*/
displayApps: function() {
var
i, j, elements, menuItem, menuSeparator, image,
remove = [],
container = d.getElementById('wappalyzer-container'),
menu = d.getElementById('wappalyzer-applications'),
url = gBrowser.currentURI.spec.split('#')[0]
;
if ( !container ) { return; }
elements = {
images: container.getElementsByTagName('image'),
menuItems: menu .getElementsByTagName('menuitem'),
menuSeparators: menu
.getElementsByTagName('menuseparator')
};
for ( i in elements ) {
for ( j = elements[i].length - 1; j >= 0; j -- ) {
remove.push(elements[i][j]);
}
}
image.setAttribute('src',
'chrome://wappalyzer/skin/images/icon_hot.png');
container.appendChild(image);
}
w.detected[url].map(function(app, i) {
var j, cat, showCat, categories = [];
for ( i in w.apps[app].cats ) {
showCat = false;
try {
showCat = prefs.getBoolPref('cat' +
w.apps[app].cats[i]);
} catch(e) { }
if ( showCat ) {
menuSeparator =
d.createElement('menuseparator');
menuItem =
d.createElement('menuitem');
menuItem.setAttribute('class',
'wappalyzer-application menuitem-iconic');
menuItem.setAttribute('image',
'chrome://wappalyzer/skin/images/icons/' + app + '.png');
menuItem.setAttribute('label', app);
menuItem.setAttribute('name', app);
menuItem.addEventListener('command',
function() {
w.driver.goToURL({ url:
w.config.websiteURL + 'applications/' + app.toLowerCase().replace(/ /g,
'-').replace(/[^\w-]/g, '') });
});
menu.appendChild(menuSeparator);
menu.appendChild(menuItem);
for ( j in w.apps[app].cats ) {
cat = w.apps[app].cats[j];
categories.push(strings.getString('wappalyzer.cat' + cat));
menuItem =
d.createElement('menuitem');
menuItem.setAttribute('class',
'wappalyzer-category');
menuItem.setAttribute('label',
strings.getString('wappalyzer.cat' + cat));
menuItem.addEventListener('command', function() {
w.driver.goToURL({ url:
w.config.websiteURL + 'categories/' + w.categories[cat] });
});
menu.appendChild(menuItem);
}
if ( prefs.getBoolPref('showIcons') ) {
image = d.createElement('image');
image.setAttribute('src',
'chrome://wappalyzer/skin/images/icons/' + app + '.png');
image.setAttribute('tooltiptext',
app + ' - ' + categories.join(', '));
container.appendChild(image);
}
break;
}
}
});
w.driver.lastDisplayed = JSON.stringify(w.detected[url]);
} else {
image = d.createElement('image');
menuSeparator = d.createElement('menuseparator');
menuItem = d.createElement('menuitem');
image.setAttribute('src',
'chrome://wappalyzer/skin/images/icon.png');
menuItem.setAttribute('disabled', 'true');
menuItem.setAttribute('label',
strings.getString('wappalyzer.noAppsDetected'));
container.appendChild(image);
menu .appendChild(menuSeparator);
menu .appendChild(menuItem);
w.driver.lastDisplayed = 'empty';
}
for ( i in remove ) {
remove[i].parentNode.removeChild(remove[i]);
}
},
/**
* Go to URL
*/
goToURL: function(args) {
gBrowser.selectedTab = gBrowser.addTab(args.url + '?
utm_source=firefox&utm_medium=extension&utm_campaign=extensions');
},
/**
* Anonymously track detected applications for research purposes
*/
ping: function() {
if ( Object.keys(w.ping.hostnames).length &&
prefs.getBoolPref('tracking') ) {
// Make POST request
var request = new XMLHttpRequest();
request.setRequestHeader('Content-type', 'application/x-
www-form-urlencoded');
request.onreadystatechange = function(e) {
if ( request.readyState == 4 )
{ w.log('w.driver.ping: status ' + request.status); }
};
request.send('json=' +
encodeURIComponent(JSON.stringify(w.ping)));
w.ping = {};
}
}
};
/**
* Content message listener
*/
function content(msg) {
w.log('content.js');
switch ( msg.json.action ) {
case 'analyze':
w.analyze(msg.json.hostname, msg.json.url,
msg.json.analyze);
break;
case 'get prefs':
return {
analyzeJavaScript:
prefs.getBoolPref('analyzeJavaScript'),
analyzeOnLoad: prefs.getBoolPref('analyzeOnLoad')
};
break;
}
msg = null;
}
/**
* Move container to address or addon bar
*/
function container() {
if ( prefs.getBoolPref('addonBar') ) {
d.getElementById('wappalyzer-
addonbar').appendChild(d.getElementById('wappalyzer-container'));
} else {
d.getElementById('urlbar-
icons').insertBefore(d.getElementById('wappalyzer-container'),
d.getElementById('urlbar-icons').childNodes[0]);
}
d.getElementById('wappalyzer-addonbar').setAttribute('collapsed',
prefs.getBoolPref('addonBar') ? 'false' : 'true');
}
/**
* Bindings
*/
function bindings() {
// Menu items
var prefix = 'wappalyzer-menu-';
/**
* Call driver functions
*/
var driver = function(func, args) {
if ( typeof w.driver[func] !== 'function' ) {
w.log('not implemented: w.driver.' + func, 'warn');
return;
}
return w.driver[func](args);
};
/**
* Main script
*/
var w = {
apps: null,
cats: null,
ping: {},
detected: [],
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
},
/**
* Log messages to console
*/
log: function(message, type) {
if ( w.config.environment === 'dev' ) {
if ( type == null ) { type = 'debug'; }
/**
* Initialize
*/
init: function() {
w.log('w.init');
// Checks
if ( w.driver == null ) {
w.log('no driver, exiting');
G
return;
}
// Initialize driver
driver('init', function() {
if ( w.config.firstRun ) {
driver('goToURL', { url: w.config.websiteURL +
'installed' });
w.config.firstRun = false;
}
if ( w.config.upgraded ) {
driver('goToURL', { url: w.config.websiteURL +
'upgraded' });
w.config.upgraded = false;
}
});
},
/**
* Analyze the request
*/
analyze: function(hostname, url, data) {
w.log('w.analyze');
url = url.split('#')[0];
data.url = url;
return;
}
if ( w.detected[url] == null ) {
w.detected[url] = [];
}
var
i, app, type, regex, regexMeta, regexScript, match,
content, meta, header,
profiler = {
regexCount: 0,
startTime: ( new Date ).getTime()
},
apps = []
;
appLoop:
for ( app in w.apps ) {
// Skip if the app has already been detected
if ( w.detected[url].indexOf(app) !== -1 ||
apps.indexOf(app) !== -1 ) {
continue;
}
profiler.regexCount ++;
if ( regex.test(url) ) {
apps.push(app);
continue appLoop;
}
break;
case 'html':
if ( data[type] == null ) {
break;
}
profiler.regexCount ++;
if ( regex.test(data[type]) ) {
apps.push(app);
continue appLoop;
}
break;
case 'script':
if ( data.html == null ) {
break;
}
profiler.regexCount ++;
while ( match =
regexScript.exec(data.html) ) {
profiler.regexCount ++;
if ( regex.test(match[2]) ) {
apps.push(app);
continue appLoop;
}
}
break;
case 'meta':
if ( data.html == null ) {
break;
}
profiler.regexCount ++;
regexMeta = /<meta[^>]+>/ig;
if ( new RegExp('name=["\']'
+ meta + '["\']', 'i').test(match) ) {
content =
match.toString().match(/content=("|')([^"']+)("|')/i);
regex = new
RegExp(w.apps[app].meta[meta].replace('/', '\\\/'), 'i');
profiler.regexCount ++;
if ( content &&
content.length === 4 && regex.test(content[2]) ) {
apps.push(app);
continue appLoop;
}
}
}
}
break;
case 'headers':
if ( data[type] == null ) {
break;
}
profiler.regexCount ++;
continue appLoop;
}
}
break;
case 'env':
if ( data[type] == null ) {
break;
}
regex = RegExp(w.apps[app]
[type].replace('/', '\\\/'), 'i');
for ( i in data[type] ) {
profiler.regexCount ++;
if ( regex.test(data[type][i]) ) {
apps.push(app);
continue appLoop;
}
}
break;
}
}
}
// Implied applications
var i, j, k, implied;
for ( i = 0; i < 3; i ++ ) {
for ( j in apps ) {
if ( w.apps[apps[j]] && w.apps[apps[j]].implies ) {
for ( k in w.apps[apps[j]].implies ) {
implied = w.apps[apps[j]].implies[k];
if ( !w.apps[implied] ) {
w.log('Implied application ' +
implied + ' does not exist');
continue;
}
if ( w.detected[url].indexOf(implied) ===
-1 && apps.indexOf(implied) === -1 ) {
apps.push(implied);
}
}
}
}
}
for ( i in apps ) {
app = apps[i];
// Per hostname
if ( /^[a-z0-9._\-]+\.[a-z]+/.test(hostname) && !/((local|
dev|development|stage|staging|test|testing|demo|
admin)\.|\/admin|\.local)/.test(url) ) {
if ( typeof w.ping.hostnames === 'undefined' ) {
w.ping.hostnames = {};
}
if ( typeof
w.ping.hostnames[hostname].applications[app] === 'undefined' ) {
w.ping.hostnames[hostname].applications[app] =
1;
}
w.ping.hostnames[hostname].applications[app] ++;
}
// Per URL
if ( w.detected[url].indexOf(app) === -1 )
{ w.detected[url].push(app); }
}
// Additional information
if ( typeof w.ping.hostnames !== 'undefined' && typeof
w.ping.hostnames[hostname] !== 'undefined' ) {
if ( data.html != null ) {
match = data.html.match(/<html[^>]*[: ]lang="([a-z]
{2}((-|_)[A-Z]{2})?)"/i);
regexMeta = /<meta[^>]+>/ig;
match = match[0].match(/name="(author|
copyright|country|description|keywords)"[^>]*content="([^"]+)"/i);
apps = null;
data = null;
driver('displayApps');
}
};
return w;
})();
// CommonJS package
// See http://wiki.commonjs.org/wiki/CommonJS
if ( typeof exports === 'object' ) {
exports.wappalyzer = wappalyzer;
}
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
############wappalyzer.name = Wappalyzer
wappalyzer.noAppsDetected = No applications detected
wappalyzer.addonBar = Wappalyzer has been placed in the add-on bar.\n\nTo
show the add-on bar, close this window and press Ctrl+/.
wappalyzer.cat1 = CMS
wappalyzer.cat2 = Message Board
wappalyzer.cat3 = Database Manager
wappalyzer.cat4 = Documentation Tool
wappalyzer.cat5 = Widget
wappalyzer.cat6 = Web Shop
wappalyzer.cat7 = Photo Gallery
wappalyzer.cat8 = Wiki
wappalyzer.cat9 = Hosting Panel
wappalyzer.cat10 = Analytics
wappalyzer.cat11 = Blog
wappalyzer.cat12 = JavaScript Framework
wappalyzer.cat13 = Issue Tracker
wappalyzer.cat14 = Video Player
wappalyzer.cat15 = Comment System
wappalyzer.cat16 = CAPTCHA
wappalyzer.cat17 = Font Script
wappalyzer.cat18 = Web Framework
wappalyzer.cat19 = Miscellaneous
wappalyzer.cat20 = Editor
wappalyzer.cat21 = LMS
wappalyzer.cat22 = Web Server
wappalyzer.cat23 = Cache Tool
wappalyzer.cat24 = Rich Text Editor
wappalyzer.cat25 = Javascript Graphics
wappalyzer.cat26 = Mobile Framework
wappalyzer.cat27 = Programming Language
wappalyzer.cat28 = Operating System
wappalyzer.cat29 = Search Engine
wappalyzer.cat30 = Web Mail
wappalyzer.cat31 = CDN
wappalyzer.cat32 = Marketing Automation
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
###################################################################################
#########################################<!ENTITY wappalyzer.name
"Wappalyzer">
<!ENTITY wappalyzer.help "Wappalyzer - Cliquer pour plus de détails et
options">