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

3
.gitignore vendored

@ -15,4 +15,5 @@ Desktop.ini
._*
tags
tags.*
.idea
.idea
/nbproject/private/

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

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

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

@ -48,6 +48,7 @@ class Driver {
this.analyzedPageUrls = {};
this.apps = [];
this.meta = {};
this.listeners = {};
this.Browser = Browser;
@ -65,6 +66,20 @@ class Driver {
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() {
this.time = {
start: new Date().getTime(),
@ -78,6 +93,8 @@ class Driver {
if (this.options.debug) {
console.log(`[wappalyzer ${type}]`, `[${source}]`, message);
}
this.emit('log', { message, source, type });
}
displayApps(detected, meta) {
@ -150,11 +167,11 @@ class Driver {
// Validate response
if (!browser.statusCode) {
reject(new Error('NO_RESPONSE'));
return reject(new Error('NO_RESPONSE'));
}
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)) {
@ -188,6 +205,8 @@ class Driver {
}, [],
);
this.emit('visit', { browser, pageUrl });
return resolve(reducedLinks);
}

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

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

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

@ -24,20 +24,22 @@ browser.tabs.onRemoved.addListener((tabId) => {
* Get a value from localStorage
*/
function getOption(name, defaultValue = null) {
return new Promise(async (resolve) => {
return new Promise(async (resolve, reject) => {
let value = defaultValue;
try {
const option = await browser.storage.local.get(name);
if (option[name]) {
if (option[name] !== undefined) {
value = option[name];
}
} 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
*/
function setOption(name, value) {
return new Promise(async (resolve) => {
return new Promise(async (resolve, reject) => {
try {
await browser.storage.local.set({ [name]: value });
} 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`,
});
} else if (version !== previousVersion && upgradeMessage) {
//openTab({
// url: `${wappalyzer.config.websiteURL}upgraded?v${version}`,
// background: true,
//});
openTab({
url: `${wappalyzer.config.websiteURL}upgraded?v${version}`,
background: true,
});
}
await setOption('version', version);

@ -1,26 +1,51 @@
/** global: browser */
/** global: Wappalyzer */
/* globals browser chrome Wappalyzer */
/* globals browser Wappalyzer */
/* eslint-env browser */
const wappalyzer = new Wappalyzer();
function getOption(name, defaultValue, callback) {
browser.storage.local.get(name)
.then((item) => {
callback(item.hasOwnProperty(name) ? item[name] : defaultValue);
});
/**
* Get a value from localStorage
*/
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) {
(chrome || browser).runtime.sendMessage({
id: 'set_option',
key: name,
value,
return new Promise(async (resolve, reject) => {
try {
await browser.storage.local.set({ [name]: 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]');
Array.prototype.forEach.call(nodes, (node) => {
@ -39,33 +64,33 @@ document.addEventListener('DOMContentLoaded', () => {
window.open(wappalyzer.config.websiteURL);
});
getOption('upgradeMessage', true, (value) => {
const el = document.querySelector('#option-upgrade-message');
let el;
let value;
el.checked = value;
// Upgrade message
value = await getOption('upgradeMessage', true);
el.addEventListener('change', () => {
setOption('upgradeMessage', el.checked);
});
});
el = document.querySelector('#option-upgrade-message');
getOption('dynamicIcon', true, (value) => {
const el = document.querySelector('#option-dynamic-icon');
el.checked = value;
el.checked = value;
el.addEventListener('change', e => setOption('upgradeMessage', e.target.checked));
el.addEventListener('change', () => {
setOption('dynamicIcon', el.checked);
});
});
// Dynamic icon
value = await getOption('dynamicIcon', true);
getOption('tracking', true, (value) => {
const el = document.querySelector('#option-tracking');
el = document.querySelector('#option-dynamic-icon');
el.checked = value;
el.checked = value;
el.addEventListener('change', () => {
setOption('tracking', el.checked);
});
});
el.addEventListener('change', e => setOption('dynamicIcon', e.target.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",
"homepage_url": "https://www.wappalyzer.com",
"description": "Identify web technologies",
"version": "5.6.0",
"version": "5.6.3",
"default_locale": "en",
"manifest_version": 2,
"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

Loading…
Cancel
Save