Merge branch 'master' into master

main
Elbert Alias 6 years ago committed by GitHub
commit 8d309983d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

1
.gitignore vendored

@ -16,3 +16,4 @@ Desktop.ini
tags tags
tags.* tags.*
.idea .idea
/nbproject/private/

@ -4785,7 +4785,7 @@
"js": { "js": {
"jseMine": "" "jseMine": ""
}, },
"script": "^(?:https):?//load\\.jsecoin\\.com/server/load/", "script": "^(?:https):?//load\\.jsecoin\\.com/load/",
"website": "https://jsecoin.com/" "website": "https://jsecoin.com/"
}, },
"JTL Shop": { "JTL Shop": {
@ -5775,6 +5775,9 @@
"cookies": { "cookies": {
"botble_session": "" "botble_session": ""
}, },
"headers": {
"CMS-Version": "^(.+)$\\;version:\\1;confidence:0"
},
"icon": "mypage-platform.png", "icon": "mypage-platform.png",
"implies": "Laravel", "implies": "Laravel",
"website": "https://www.mypage.vn" "website": "https://www.mypage.vn"
@ -6304,6 +6307,17 @@
"script": "mint/\\?js", "script": "mint/\\?js",
"website": "https://haveamint.com" "website": "https://haveamint.com"
}, },
"Mithril": {
"cats": [
12
],
"icon": "Mithril.svg",
"js": {
"m": ""
},
"script": "mithril/\\?js",
"website": "https://mithril.js.org"
},
"Mixpanel": { "Mixpanel": {
"cats": [ "cats": [
10 10
@ -10679,7 +10693,7 @@
"<div [^>]*id=\"__nuxt\"", "<div [^>]*id=\"__nuxt\"",
"<script [^>]*>window\\.__NUXT__" "<script [^>]*>window\\.__NUXT__"
], ],
"icon": "Nuxt.js.png", "icon": "Nuxt.js.svg",
"js": { "js": {
"$nuxt": "" "$nuxt": ""
}, },
@ -12793,7 +12807,7 @@
"js": { "js": {
"webpackJsonp": "" "webpackJsonp": ""
}, },
"website": "https://webpack.github.io" "website": "https://webpack.js.org/"
}, },
"parcel": { "parcel": {
"cats": [ "cats": [

@ -27,9 +27,9 @@ node index.js [url] [options]
### Options ### Options
``` ```
--password Password to be used for basic HTTP authentication --password Password to be used for basic HTTP authentication
--proxy Proxy URL, e.g. 'http://user:pass@proxy:8080' --proxy Proxy URL, e.g. 'http://user:pass@proxy:8080'
--username Username to be used for basic HTTP authentication --username Username to be used for basic HTTP authentication
--chunk-size=num Process links in chunks. --chunk-size=num Process links in chunks.
--debug=0|1 Output debug messages. --debug=0|1 Output debug messages.
--delay=ms Wait for ms milliseconds between requests. --delay=ms Wait for ms milliseconds between requests.
@ -46,6 +46,11 @@ node index.js [url] [options]
## Run from a script ## Run from a script
```javascript ```javascript
const Wappalyzer = require('./driver');
const Browser = require('./browsers/zombie');
const url = 'https://www.wappalyzer.com;
const options = { const options = {
debug: false, debug: false,
delay: 500, delay: 500,
@ -58,16 +63,26 @@ const options = {
htmlMaxRows: 2000, htmlMaxRows: 2000,
}; };
const wappalyzer = new Wappalyzer('https://www.wappalyzer.com', options); const wappalyzer = new Wappalyzer(Browser, url, options);
// Optional: capture log output
// wappalyzer.on('log', params => {
// const { message, source, type } = params;
// });
// Optional: do something on page visit
// wappalyzer.on('visit', params => {
// const { browser, pageUrl } = params;
// });
wappalyzer.analyze() wappalyzer.analyze()
.then(json => { .then(json => {
process.stdout.write(JSON.stringify(json, null, 2) + '\n') process.stdout.write(`${JSON.stringify(json, null, 2)}\n`);
process.exit(0); process.exit(0);
}) })
.catch(error => { .catch(error => {
process.stderr.write(error + '\n') process.stderr.write(`${error}\n`);
process.exit(1); process.exit(1);
}); });

@ -25,6 +25,8 @@ class ZombieBrowser extends Browser {
const resource = this.browser.resources.length const resource = this.browser.resources.length
? this.browser.resources.filter(_resource => _resource.response).shift() : null; ? this.browser.resources.filter(_resource => _resource.response).shift() : null;
this.window = this.browser.window;
this.document = this.browser.document;
this.headers = this.getHeaders(); this.headers = this.getHeaders();
this.statusCode = resource ? resource.response.status : 0; this.statusCode = resource ? resource.response.status : 0;
this.contentType = this.headers['content-type'] ? this.headers['content-type'].shift() : null; this.contentType = this.headers['content-type'] ? this.headers['content-type'].shift() : null;

@ -48,6 +48,7 @@ class Driver {
this.analyzedPageUrls = {}; this.analyzedPageUrls = {};
this.apps = []; this.apps = [];
this.meta = {}; this.meta = {};
this.listeners = {};
this.Browser = Browser; this.Browser = Browser;
@ -65,6 +66,20 @@ class Driver {
process.on('uncaughtException', e => this.wappalyzer.log(`Uncaught exception: ${e.message}`, 'driver', 'error')); process.on('uncaughtException', e => this.wappalyzer.log(`Uncaught exception: ${e.message}`, 'driver', 'error'));
} }
on(event, callback) {
if (!this.listeners[event]) {
this.listeners[event] = [];
}
this.listeners[event].push(callback);
}
emit(event, params) {
if (this.listeners[event]) {
this.listeners[event].forEach(listener => listener(params));
}
}
analyze() { analyze() {
this.time = { this.time = {
start: new Date().getTime(), start: new Date().getTime(),
@ -78,6 +93,8 @@ class Driver {
if (this.options.debug) { if (this.options.debug) {
console.log(`[wappalyzer ${type}]`, `[${source}]`, message); console.log(`[wappalyzer ${type}]`, `[${source}]`, message);
} }
this.emit('log', { message, source, type });
} }
displayApps(detected, meta) { displayApps(detected, meta) {
@ -150,11 +167,11 @@ class Driver {
// Validate response // Validate response
if (!browser.statusCode) { if (!browser.statusCode) {
reject(new Error('NO_RESPONSE')); return reject(new Error('NO_RESPONSE'));
} }
if (browser.statusCode !== 200) { if (browser.statusCode !== 200) {
reject(new Error('RESPONSE_NOT_OK')); return reject(new Error('RESPONSE_NOT_OK'));
} }
if (!browser.contentType || !/\btext\/html\b/.test(browser.contentType)) { if (!browser.contentType || !/\btext\/html\b/.test(browser.contentType)) {
@ -188,6 +205,8 @@ class Driver {
}, [], }, [],
); );
this.emit('visit', { browser, pageUrl });
return resolve(reducedLinks); return resolve(reducedLinks);
} }

@ -1,7 +1,7 @@
#!/usr/bin/env node #!/usr/bin/env node
const Browser = require('./browsers/zombie');
const Wappalyzer = require('./driver'); const Wappalyzer = require('./driver');
const Browser = require('./browsers/zombie');
const args = process.argv.slice(2); const args = process.argv.slice(2);
@ -32,9 +32,6 @@ do {
const wappalyzer = new Wappalyzer(Browser, url, options); const wappalyzer = new Wappalyzer(Browser, url, options);
// Optionally define a custom log function
// wappalyzer.log = (message, source, type) => console.log(message);
wappalyzer.analyze() wappalyzer.analyze()
.then((json) => { .then((json) => {
process.stdout.write(`${JSON.stringify(json)}\n`); process.stdout.write(`${JSON.stringify(json)}\n`);

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

@ -2,7 +2,7 @@
"name": "wappalyzer", "name": "wappalyzer",
"description": "Uncovers the technologies used on websites", "description": "Uncovers the technologies used on websites",
"homepage": "https://github.com/AliasIO/Wappalyzer", "homepage": "https://github.com/AliasIO/Wappalyzer",
"version": "5.6.0", "version": "5.6.3",
"author": "Elbert Alias", "author": "Elbert Alias",
"license": "GPL-3.0", "license": "GPL-3.0",
"repository": { "repository": {
@ -12,8 +12,10 @@
"main": "driver.js", "main": "driver.js",
"files": [ "files": [
"apps.json", "apps.json",
"index.js", "browser.js",
"browsers/zombie.js",
"driver.js", "driver.js",
"index.js",
"wappalyzer.js" "wappalyzer.js"
], ],
"bin": { "bin": {

@ -24,20 +24,22 @@ browser.tabs.onRemoved.addListener((tabId) => {
* Get a value from localStorage * Get a value from localStorage
*/ */
function getOption(name, defaultValue = null) { function getOption(name, defaultValue = null) {
return new Promise(async (resolve) => { return new Promise(async (resolve, reject) => {
let value = defaultValue; let value = defaultValue;
try { try {
const option = await browser.storage.local.get(name); const option = await browser.storage.local.get(name);
if (option[name]) { if (option[name] !== undefined) {
value = option[name]; value = option[name];
} }
} catch (error) { } catch (error) {
wappalyzer.log(error, 'driver', 'error'); wappalyzer.log(error.message, 'driver', 'error');
return reject(error.message);
} }
resolve(value); return resolve(value);
}); });
} }
@ -45,14 +47,16 @@ function getOption(name, defaultValue = null) {
* Set a value in localStorage * Set a value in localStorage
*/ */
function setOption(name, value) { function setOption(name, value) {
return new Promise(async (resolve) => { return new Promise(async (resolve, reject) => {
try { try {
await browser.storage.local.set({ [name]: value }); await browser.storage.local.set({ [name]: value });
} catch (error) { } catch (error) {
wappalyzer.log(error, 'driver', 'error'); wappalyzer.log(error.message, 'driver', 'error');
return reject(error.message);
} }
resolve(); return resolve();
}); });
} }
@ -334,10 +338,10 @@ wappalyzer.driver.ping = async (hostnameCache = {}, adCache = []) => {
url: `${wappalyzer.config.websiteURL}installed`, url: `${wappalyzer.config.websiteURL}installed`,
}); });
} else if (version !== previousVersion && upgradeMessage) { } else if (version !== previousVersion && upgradeMessage) {
//openTab({ openTab({
// url: `${wappalyzer.config.websiteURL}upgraded?v${version}`, url: `${wappalyzer.config.websiteURL}upgraded?v${version}`,
// background: true, background: true,
//}); });
} }
await setOption('version', version); await setOption('version', version);

@ -1,26 +1,51 @@
/** global: browser */ /** global: browser */
/** global: Wappalyzer */ /** global: Wappalyzer */
/* globals browser chrome Wappalyzer */ /* globals browser Wappalyzer */
/* eslint-env browser */ /* eslint-env browser */
const wappalyzer = new Wappalyzer(); const wappalyzer = new Wappalyzer();
function getOption(name, defaultValue, callback) { /**
browser.storage.local.get(name) * Get a value from localStorage
.then((item) => { */
callback(item.hasOwnProperty(name) ? item[name] : defaultValue); function getOption(name, defaultValue = null) {
}); return new Promise(async (resolve, reject) => {
let value = defaultValue;
try {
const option = await browser.storage.local.get(name);
if (option[name] !== undefined) {
value = option[name];
}
} catch (error) {
wappalyzer.log(error.message, 'driver', 'error');
return reject(error.message);
}
return resolve(value);
});
} }
/**
* Set a value in localStorage
*/
function setOption(name, value) { function setOption(name, value) {
(chrome || browser).runtime.sendMessage({ return new Promise(async (resolve, reject) => {
id: 'set_option', try {
key: name, await browser.storage.local.set({ [name]: value });
value, } catch (error) {
wappalyzer.log(error.message, 'driver', 'error');
return reject(error.message);
}
return resolve();
}); });
} }
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', async () => {
const nodes = document.querySelectorAll('[data-i18n]'); const nodes = document.querySelectorAll('[data-i18n]');
Array.prototype.forEach.call(nodes, (node) => { Array.prototype.forEach.call(nodes, (node) => {
@ -39,33 +64,33 @@ document.addEventListener('DOMContentLoaded', () => {
window.open(wappalyzer.config.websiteURL); window.open(wappalyzer.config.websiteURL);
}); });
getOption('upgradeMessage', true, (value) => { let el;
const el = document.querySelector('#option-upgrade-message'); let value;
el.checked = value; // Upgrade message
value = await getOption('upgradeMessage', true);
el.addEventListener('change', () => { el = document.querySelector('#option-upgrade-message');
setOption('upgradeMessage', el.checked);
});
});
getOption('dynamicIcon', true, (value) => { el.checked = value;
const el = document.querySelector('#option-dynamic-icon');
el.checked = value; el.addEventListener('change', e => setOption('upgradeMessage', e.target.checked));
el.addEventListener('change', () => { // Dynamic icon
setOption('dynamicIcon', el.checked); value = await getOption('dynamicIcon', true);
});
});
getOption('tracking', true, (value) => { el = document.querySelector('#option-dynamic-icon');
const el = document.querySelector('#option-tracking');
el.checked = value; el.checked = value;
el.addEventListener('change', () => { el.addEventListener('change', e => setOption('dynamicIcon', e.target.checked));
setOption('tracking', el.checked);
}); // Tracking
}); value = await getOption('tracking', true);
el = document.querySelector('#option-tracking');
el.checked = value;
el.addEventListener('change', e => setOption('tracking', e.target.checked));
}); });

@ -4,7 +4,7 @@
"author": "Elbert Alias", "author": "Elbert Alias",
"homepage_url": "https://www.wappalyzer.com", "homepage_url": "https://www.wappalyzer.com",
"description": "Identify web technologies", "description": "Identify web technologies",
"version": "5.6.0", "version": "5.6.3",
"default_locale": "en", "default_locale": "en",
"manifest_version": 2, "manifest_version": 2,
"icons": { "icons": {

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="windows-1252"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 38.044 38.044" style="enable-background:new 0 0 38.044 38.044;" xml:space="preserve">
<g>
<g>
<path style="fill:#010002;" d="M31.716,13.5C31.699,6.47,25.974,0.755,18.94,0.755c-7.045,0-12.777,5.732-12.777,12.777 c0,0.022,0.004,0.043,0.004,0.065C2.477,15.84,0,19.887,0,24.511c0,7.046,5.731,12.777,12.777,12.777 c2.268,0,4.395-0.601,6.244-1.642c1.849,1.041,3.977,1.642,6.245,1.642c7.046,0,12.777-5.732,12.777-12.777 C38.043,19.82,35.495,15.722,31.716,13.5z M19.021,32.961c-2.312-1.713-3.906-4.341-4.22-7.352c1.3,0.448,2.689,0.702,4.139,0.702 c1.514,0,2.96-0.278,4.307-0.764C22.949,28.584,21.349,31.236,19.021,32.961z M8.517,14.898c1.303-0.579,2.743-0.909,4.26-0.909 c1.475,0,2.879,0.307,4.154,0.858c-2.114,1.826-3.629,4.325-4.195,7.167C10.473,20.352,8.898,17.814,8.517,14.898z M18.94,24.055 c-1.457,0-2.846-0.298-4.109-0.837c0.361-2.928,1.929-5.482,4.19-7.157c2.243,1.662,3.802,4.187,4.18,7.085 C21.897,23.727,20.457,24.055,18.94,24.055z M21.111,14.846c1.275-0.55,2.679-0.858,4.154-0.858c1.457,0,2.846,0.298,4.11,0.837 c-0.356,2.885-1.883,5.404-4.089,7.082C24.704,19.108,23.199,16.65,21.111,14.846z M18.94,3.01c5.432,0,9.915,4.137,10.466,9.425 c-1.3-0.447-2.689-0.702-4.14-0.702c-2.268,0-4.396,0.601-6.245,1.642c-1.848-1.041-3.975-1.642-6.244-1.642 c-1.514,0-2.96,0.278-4.307,0.763C8.993,7.179,13.488,3.01,18.94,3.01z M12.777,35.034c-5.803,0-10.523-4.72-10.523-10.523 c0-3.418,1.645-6.451,4.177-8.375c0.744,3.581,2.999,6.607,6.059,8.408c0.011,3.847,1.735,7.293,4.442,9.631 C15.656,34.727,14.253,35.034,12.777,35.034z M25.266,35.034c-1.475,0-2.879-0.307-4.154-0.858 c2.715-2.345,4.444-5.804,4.444-9.664c0-0.022-0.004-0.044-0.004-0.065c3.007-1.829,5.209-4.852,5.918-8.416 c2.613,1.917,4.319,4.999,4.319,8.48C35.788,30.313,31.068,35.034,25.266,35.034z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

@ -0,0 +1,10 @@
<svg width="486px" height="346px" viewBox="0 0 486 346" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Nuxt Logo</title>
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g fill-rule="nonzero">
<polygon id="Shape" fill="#42B883" points="200 0 400 346 0 346"></polygon>
<polygon id="Shape" fill="#3C8171" points="311 43 486 346 136 346"></polygon>
<polygon id="Shape" fill="#35495E" points="267.945522 117 400 345.454247 136 345.454247"></polygon>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 599 B