Use ports for messaging

main
Elbert Alias 6 years ago
parent 9cc9e89cba
commit 93ddace370

@ -1,6 +1,6 @@
{
"name": "wappalyzer",
"version": "5.7.2",
"version": "5.7.3",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

@ -1,20 +1,16 @@
/** global: browser */
/** global: XMLSerializer */
/* global browser, chrome */
/* global browser */
/* eslint-env browser */
function sendMessage(id, subject, callback) {
(chrome || browser).runtime.sendMessage({
id,
subject,
source: 'content.js',
}, callback || (() => {}));
}
const port = browser.runtime.connect({
name: 'content.js',
});
if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') {
try {
sendMessage('init', {});
port.postMessage({ id: 'init' });
// HTML
let html = new XMLSerializer().serializeToString(document);
@ -41,7 +37,7 @@ if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') {
.map(script => script.src)
.filter(script => script.indexOf('data:text/javascript;') !== 0);
sendMessage('analyze', { html, scripts });
port.postMessage({ id: 'analyze', subject: { html, scripts } });
// JavaScript variables
const script = document.createElement('script');
@ -54,31 +50,38 @@ if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') {
window.removeEventListener('message', onMessage);
sendMessage('analyze', { js: event.data.js });
port.postMessage({ id: 'analyze', subject: { js: event.data.js } });
script.remove();
};
window.addEventListener('message', onMessage);
sendMessage('get_js_patterns', {}, (response) => {
if (response) {
postMessage({
id: 'patterns',
patterns: response.patterns,
}, window.location.href);
}
});
port.postMessage({ id: 'get_js_patterns' });
};
script.setAttribute('src', browser.extension.getURL('js/inject.js'));
document.body.appendChild(script);
} catch (e) {
sendMessage('log', e);
} catch (error) {
port.postMessage({ id: 'log', subject: error });
}
}
port.onMessage.addListener((message) => {
switch (message.id) {
case 'get_js_patterns':
postMessage({
id: 'patterns',
patterns: message.response.patterns,
}, window.location.href);
break;
default:
// Do nothing
}
});
// https://stackoverflow.com/a/44774834
// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value
undefined; // eslint-disable-line no-unused-expressions

@ -134,67 +134,74 @@ browser.webRequest.onCompleted.addListener(async (request) => {
}
}, { urls: ['http://*/*', 'https://*/*'], types: ['main_frame'] }, ['responseHeaders']);
// Listen for messages
browser.runtime.onMessage.addListener(async (message, sender) => {
if (message.id === undefined) {
return Promise.resolve();
}
if (message.id !== 'log') {
wappalyzer.log(`Message${message.source ? ` from ${message.source}` : ''}: ${message.id}`, 'driver');
}
const pinnedCategory = await getOption('pinnedCategory');
const url = wappalyzer.parseUrl(sender.tab ? sender.tab.url : '');
const cookies = await browser.cookies.getAll({ domain: `.${url.hostname}` });
let response;
switch (message.id) {
case 'log':
wappalyzer.log(message.subject, message.source);
break;
case 'init':
wappalyzer.analyze(url, { cookies }, { tab: sender.tab });
break;
case 'analyze':
wappalyzer.analyze(url, message.subject, { tab: sender.tab });
browser.runtime.onConnect.addListener((port) => {
port.onMessage.addListener(async (message) => {
if (message.id === undefined) {
return;
}
await setOption('hostnameCache', wappalyzer.hostnameCache);
if (message.id !== 'log') {
wappalyzer.log(`Message from ${port.name}: ${message.id}`, 'driver');
}
break;
case 'ad_log':
wappalyzer.cacheDetectedAds(message.subject);
const pinnedCategory = await getOption('pinnedCategory');
break;
case 'get_apps':
response = {
tabCache: tabCache[message.tab.id],
apps: wappalyzer.apps,
categories: wappalyzer.categories,
pinnedCategory,
termsAccepted: userAgent() === 'chrome' || await getOption('termsAccepted', false),
};
const url = wappalyzer.parseUrl(port.sender.tab ? port.sender.tab.url : '');
break;
case 'set_option':
await setOption(message.key, message.value);
const cookies = await browser.cookies.getAll({ domain: `.${url.hostname}` });
break;
case 'get_js_patterns':
response = {
patterns: wappalyzer.jsPatterns,
};
let response;
break;
default:
}
switch (message.id) {
case 'log':
wappalyzer.log(message.subject, message.source);
break;
case 'init':
wappalyzer.analyze(url, { cookies }, { tab: port.sender.tab });
break;
case 'analyze':
wappalyzer.analyze(url, message.subject, { tab: port.sender.tab });
await setOption('hostnameCache', wappalyzer.hostnameCache);
break;
case 'ad_log':
wappalyzer.cacheDetectedAds(message.subject);
break;
case 'get_apps':
response = {
tabCache: tabCache[message.tab.id],
apps: wappalyzer.apps,
categories: wappalyzer.categories,
pinnedCategory,
termsAccepted: userAgent() === 'chrome' || await getOption('termsAccepted', false),
};
break;
case 'set_option':
await setOption(message.key, message.value);
break;
case 'get_js_patterns':
response = {
patterns: wappalyzer.jsPatterns,
};
break;
default:
// Do nothing
}
return Promise.resolve(response);
if (response) {
port.postMessage({
id: message.id,
response,
});
}
});
});
wappalyzer.driver.document = document;
@ -205,7 +212,7 @@ wappalyzer.driver.document = document;
wappalyzer.driver.log = (message, source, type) => {
const log = ['warn', 'error'].indexOf(type) !== -1 ? type : 'log';
console[log](`[wappalyzer ${type}]`, `[${source}]`, message);
console[log](`[wappalyzer ${type}]`, `[${source}]`, message); // eslint-disable-line no-console
};
/**
@ -372,10 +379,14 @@ wappalyzer.driver.ping = async (hostnameCache = {}, adCache = []) => {
try {
const tabs = await browser.tabs.query({ url: ['http://*/*', 'https://*/*'] });
tabs.forEach((tab) => {
browser.tabs.executeScript(tab.id, {
file: '../js/content.js',
});
tabs.forEach(async (tab) => {
try {
await browser.tabs.executeScript(tab.id, {
file: '../js/content.js',
});
} catch (error) {
//
}
});
} catch (error) {
wappalyzer.log(error, 'driver', 'error');

@ -780,9 +780,11 @@
ifTrackingEnabled(
sender.tab,
() => {
console.log('enabled');
try { sendResponse({ tracking_enabled: true }); } catch (err) {}
},
() => {
console.log('not enabled');
try { sendResponse({ tracking_enabled: false }); } catch (err) {}
},
);

@ -1,13 +1,16 @@
/* eslint-env browser */
/* global browser, chrome, jsonToDOM */
/* global browser, jsonToDOM */
/** global: chrome */
/** global: browser */
/** global: jsonToDOM */
let pinnedCategory = null;
let termsAccepted = false;
const port = browser.runtime.connect({
name: 'popup.js',
});
function slugify(string) {
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
}
@ -51,7 +54,7 @@ function replaceDom(domTemplate) {
pinnedCategory = categoryId;
}
(chrome || browser).runtime.sendMessage({
port.postMessage({
id: 'set_option',
key: 'pinnedCategory',
value: pinnedCategory,
@ -186,39 +189,58 @@ function appsToDomTemplate(response) {
return template;
}
const func = (tabs) => {
(chrome || browser).runtime.sendMessage({
id: 'get_apps',
tab: tabs[0],
source: 'popup.js',
}, (response) => {
pinnedCategory = response.pinnedCategory;
termsAccepted = response.termsAccepted;
async function getApps() {
try {
const tabs = await browser.tabs.query({
active: true,
currentWindow: true,
});
if (termsAccepted) {
replaceDomWhenReady(appsToDomTemplate(response));
} else {
i18n();
port.postMessage({
id: 'get_apps',
tab: tabs[0],
});
} catch (error) {
console.error(error); // eslint-disable-line no-console
}
}
const wrapper = document.querySelector('.terms__wrapper');
function displayApps(response) {
pinnedCategory = response.pinnedCategory; // eslint-disable-line prefer-destructuring
termsAccepted = response.termsAccepted; // eslint-disable-line prefer-destructuring
document.querySelector('.terms__accept').addEventListener('click', () => {
(chrome || browser).runtime.sendMessage({
id: 'set_option',
key: 'termsAccepted',
value: true,
});
if (termsAccepted) {
replaceDomWhenReady(appsToDomTemplate(response));
} else {
i18n();
wrapper.classList.remove('terms__wrapper--active');
const wrapper = document.querySelector('.terms__wrapper');
func(tabs);
document.querySelector('.terms__accept').addEventListener('click', () => {
port.postMessage({
id: 'set_option',
key: 'termsAccepted',
value: true,
});
wrapper.classList.add('terms__wrapper--active');
}
});
};
wrapper.classList.remove('terms__wrapper--active');
getApps();
});
wrapper.classList.add('terms__wrapper--active');
}
}
port.onMessage.addListener((message) => {
switch (message.id) {
case 'get_apps':
displayApps(message.response);
break;
default:
// Do nothing
}
});
browser.tabs.query({ active: true, currentWindow: true })
.then(func)
.catch(console.error);
getApps();

@ -3,9 +3,9 @@
"lockfileVersion": 1,
"dependencies": {
"webextension-polyfill": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.3.1.tgz",
"integrity": "sha512-ISB42vlgMyM7xE1u6pREeCqmmXjLsYu/nqAR8Dl/gIAnylb+KpRpvKbVkUYNFePhhXn0Obkkc3jasOII9ztUtg=="
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.4.0.tgz",
"integrity": "sha512-oreMp+EoAo1pzRMigx4jB5jInIpx6NTCySPSjGyLLee/dCIPiRqowCEfbFP8o20wz9SOtNwSsfkaJ9D/tRgpag=="
}
}
}

@ -1,5 +1,5 @@
{
"dependencies": {
"webextension-polyfill": "^0.3.1"
"webextension-polyfill": "^0.4.0"
}
}