Use ports for messaging

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

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

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

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

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

@ -1,13 +1,16 @@
/* eslint-env browser */ /* eslint-env browser */
/* global browser, chrome, jsonToDOM */ /* global browser, jsonToDOM */
/** global: chrome */
/** global: browser */ /** global: browser */
/** global: jsonToDOM */ /** global: jsonToDOM */
let pinnedCategory = null; let pinnedCategory = null;
let termsAccepted = false; let termsAccepted = false;
const port = browser.runtime.connect({
name: 'popup.js',
});
function slugify(string) { function slugify(string) {
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, ''); return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
} }
@ -51,7 +54,7 @@ function replaceDom(domTemplate) {
pinnedCategory = categoryId; pinnedCategory = categoryId;
} }
(chrome || browser).runtime.sendMessage({ port.postMessage({
id: 'set_option', id: 'set_option',
key: 'pinnedCategory', key: 'pinnedCategory',
value: pinnedCategory, value: pinnedCategory,
@ -186,39 +189,58 @@ function appsToDomTemplate(response) {
return template; return template;
} }
const func = (tabs) => { async function getApps() {
(chrome || browser).runtime.sendMessage({ try {
id: 'get_apps', const tabs = await browser.tabs.query({
tab: tabs[0], active: true,
source: 'popup.js', currentWindow: true,
}, (response) => { });
pinnedCategory = response.pinnedCategory;
termsAccepted = response.termsAccepted;
if (termsAccepted) { port.postMessage({
replaceDomWhenReady(appsToDomTemplate(response)); id: 'get_apps',
} else { tab: tabs[0],
i18n(); });
} 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', () => { if (termsAccepted) {
(chrome || browser).runtime.sendMessage({ replaceDomWhenReady(appsToDomTemplate(response));
id: 'set_option', } else {
key: 'termsAccepted', i18n();
value: true,
});
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 }) getApps();
.then(func)
.catch(console.error);

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

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