diff --git a/package.json b/package.json index 71e17705d..5fb9e5542 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ }, "scripts": { "link": "node ./bin/link.js", - "lint": "eslint src/**/*.js", + "lint": "eslint --fix src/**/*.js", "validate": "yarn run lint && jsonlint -qV ./schema.json ./src/apps.json && node ./bin/validate.js", "convert": "cd ./src/drivers/webextension/images/icons ; cp *.svg converted ; cd converted ; convert-svg-to-png *.svg --width 32 --height 32 ; rm *.svg", "prettify": "jsonlint -si --trim-trailing-commas --enforce-double-quotes ./src/apps.json", diff --git a/src/apps.json b/src/apps.json index c63a7d70e..f47d12422 100644 --- a/src/apps.json +++ b/src/apps.json @@ -322,21 +322,21 @@ 10, 61 ], + "icon": "Adobe Analytics.svg", "js": { "s_c_il.0._c": "s_c", - "s_c_il.1._c": "s_c", - "s_c_il.2._c": "s_c", - "s_c_il.3._c": "s_c", - "s_c_il.4._c": "s_c", - "s_c_il.5._c": "s_c", "s_c_il.0.constructor.name": "AppMeasurement", + "s_c_il.1._c": "s_c", "s_c_il.1.constructor.name": "AppMeasurement", + "s_c_il.2._c": "s_c", "s_c_il.2.constructor.name": "AppMeasurement", + "s_c_il.3._c": "s_c", "s_c_il.3.constructor.name": "AppMeasurement", + "s_c_il.4._c": "s_c", "s_c_il.4.constructor.name": "AppMeasurement", + "s_c_il.5._c": "s_c", "s_c_il.5.constructor.name": "AppMeasurement" }, - "icon": "Adobe Analytics.svg", "website": "https://www.adobe.com/analytics/adobe-analytics.html" }, "Adobe ColdFusion": { @@ -377,20 +377,20 @@ "]+data-component-path=\"[^\"+]jcr:", "
", + "icon": "Smartstore.png", + "implies": "Microsoft ASP.NET", + "meta": { + "generator": "^Smartstore (.+)$\\;version:\\1" + }, + "website": "https://www.smartstore.com" + }, "Smartstore biz": { "cats": [ 6 @@ -11064,40 +11079,23 @@ "icon": "Smartstore.biz.png", "script": "smjslib\\.js", "website": "http://smartstore.com" - } - , - "Smartstore.NET": { - "cats": [ - 1, - 6 - ], - "cookies": { - "SMARTSTORE.VISITOR": "" - }, - "html": "", - "icon": "smartstore.png", - "implies": "Microsoft ASP.NET", - "meta": { - "generator": "^SmartStore.NET (.+)$\\;version:\\1" - }, - "website": "https://www.smartstore.com" - }, - "Smartstore": { - "cats": [ - 1, - 6 - ], - "cookies": { + }, + "Smartstore.NET": { + "cats": [ + 1, + 6 + ], + "cookies": { "SMARTSTORE.VISITOR": "" - }, - "html": "", - "icon": "Smartstore.png", - "implies": "Microsoft ASP.NET", - "meta": { - "generator": "^Smartstore (.+)$\\;version:\\1" - }, - "website": "https://www.smartstore.com" - }, + }, + "html": "", + "icon": "smartstore.png", + "implies": "Microsoft ASP.NET", + "meta": { + "generator": "^SmartStore.NET (.+)$\\;version:\\1" + }, + "website": "https://www.smartstore.com" + }, "Snap": { "cats": [ 18, @@ -11122,9 +11120,9 @@ "website": "http://snapsvg.io" }, "Snipcart": { - "cats": [6], - "website": "https://snipcart.com/", - "icon": "Snipcart.png", + "cats": [ + 6 + ], "cookies": { "snipcart-cart": "" }, @@ -11132,7 +11130,9 @@ "]*href=\".*snipcart\\.css\"", "
]*id=\".*snipcart.*\"" ], - "script": "https://cdn\\.snipcart\\.com/themes/v([\\w.]+)/default/snipcart\\.js\\;version:\\1" + "icon": "Snipcart.png", + "script": "https://cdn\\.snipcart\\.com/themes/v([\\w.]+)/default/snipcart\\.js\\;version:\\1", + "website": "https://snipcart.com/" }, "Snoobi": { "cats": [ @@ -14336,6 +14336,17 @@ "script": "https://hcaptcha.com/([\\d]+?)/api.js\\;version:\\1", "website": "https://www.hcaptcha.com/" }, + "hantana": { + "cats": [ + 10 + ], + "icon": "hantana.png", + "js": { + "Hantana": "" + }, + "script": "//hantana\\.org/widget", + "website": "https://hantana.org/" + }, "iEXExchanger": { "cats": [ 1 @@ -15337,17 +15348,6 @@ "generator": "xt:Commerce" }, "website": "https://www.xt-commerce.com" - }, - "hantana": { - "cats": [ - 10 - ], - "icon": "hantana.png", - "js": { - "Hantana": "" - }, - "script": "//hantana\\.org/widget", - "website": "https://hantana.org/" } }, "categories": { @@ -15620,4 +15620,4 @@ "priority": 6 } } -} +} \ No newline at end of file diff --git a/src/drivers/npm/cli.js b/src/drivers/npm/cli.js index 2e737ca7e..1cab50af9 100755 --- a/src/drivers/npm/cli.js +++ b/src/drivers/npm/cli.js @@ -19,7 +19,7 @@ const aliases = { m: 'maxUrls', P: 'pretty', r: 'recursive', - w: 'maxWait' + w: 'maxWait', } while (true) { @@ -76,7 +76,7 @@ Options: process.exit(1) } -;(async function() { +;(async function () { const wappalyzer = await new Wappalyzer(options) try { diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index b97ad04fb..3053927c5 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -13,7 +13,7 @@ "software" ], "homepage": "https://www.wappalyzer.com", - "version": "6.2.6", + "version": "6.3.0", "author": "Wappalyzer", "license": "MIT", "repository": { @@ -37,4 +37,4 @@ "dependencies": { "puppeteer": "^5.2.1" } -} +} \ No newline at end of file diff --git a/src/drivers/webextension/js/content.js b/src/drivers/webextension/js/content.js index 853ae36ae..2606e15c9 100644 --- a/src/drivers/webextension/js/content.js +++ b/src/drivers/webextension/js/content.js @@ -70,7 +70,7 @@ const Content = { Content.driver('onContentLoad', [ location.href, { html, scripts, meta }, - language + language, ]) Content.onGetTechnologies(await Content.driver('getTechnologies')) @@ -85,7 +85,7 @@ const Content = { { source: 'content.js', func, - args: args ? (Array.isArray(args) ? args : [args]) : [] + args: args ? (Array.isArray(args) ? args : [args]) : [], }, (response) => { chrome.runtime.lastError @@ -115,7 +115,7 @@ const Content = { chrome.runtime.sendMessage({ source: 'content.js', func: 'analyzeJs', - args: [location.href.split('#')[0], data.wappalyzer.js] + args: [location.href.split('#')[0], data.wappalyzer.js], }) script.remove() @@ -127,15 +127,15 @@ const Content = { wappalyzer: { technologies: technologies .filter(({ js }) => Object.keys(js).length) - .map(({ name, js }) => ({ name, chains: Object.keys(js) })) - } + .map(({ name, js }) => ({ name, chains: Object.keys(js) })), + }, }) } script.setAttribute('src', chrome.extension.getURL('js/inject.js')) document.body.appendChild(script) - } + }, } if (/complete|interactive|loaded/.test(document.readyState)) { diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index 7a338358b..2fd1f4435 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -7,7 +7,7 @@ const { setCategories, analyze, analyzeManyToMany, - resolve + resolve, } = Wappalyzer const { agent, promisify, getOption, setOption, open } = Utils @@ -34,25 +34,25 @@ const Driver = { ({ technology: name, pattern: { regex, confidence }, - version + version, }) => ({ technology: Wappalyzer.technologies.find( ({ name: _name }) => name === _name ), pattern: { regex: new RegExp(regex, 'i'), - confidence + confidence, }, - version + version, }) - ) - } + ), + }, }), {} ), tabs: {}, robots: await getOption('robots', {}), - ads: await getOption('ads', []) + ads: await getOption('ads', []), } chrome.browserAction.setBadgeBackgroundColor({ color: '#6B39BD' }, () => {}) @@ -126,7 +126,7 @@ const Driver = { try { return fetch(url, { method: 'POST', - body: JSON.stringify(body) + body: JSON.stringify(body), }) } catch (error) { throw new Error(error.message || error.toString()) @@ -194,7 +194,7 @@ const Driver = { try { const [tab] = await promisify(chrome.tabs, 'query', { - url: [request.url] + url: [request.url], }) if (tab) { @@ -233,12 +233,12 @@ const Driver = { items.cookies = ( await promisify(chrome.cookies, 'getAll', { - domain: `.${hostname}` + domain: `.${hostname}`, }) ).reduce( (cookies, { name, value }) => ({ ...cookies, - [name]: [value] + [name]: [value], }), {} ) @@ -288,9 +288,9 @@ const Driver = { ...(Driver.cache.hostnames[hostname] || { url: `${protocol}//${hostname}`, detections: [], - hits: incrementHits ? 0 : 1 + hits: incrementHits ? 0 : 1, }), - dateTime: Date.now() + dateTime: Date.now(), }) // Remove duplicates @@ -336,17 +336,17 @@ const Driver = { ({ technology: { name: technology }, pattern: { regex, confidence }, - version + version, }) => ({ technology, pattern: { regex: regex.source, - confidence + confidence, }, - version + version, }) - ) - } + ), + }, }), {} ) @@ -402,7 +402,9 @@ const Driver = { { tabId, text: - badge && technologies.length ? technologies.length.toString() : '' + badge && technologies.length + ? technologies.length.toString() + : '', }, () => {} ) @@ -416,7 +418,7 @@ const Driver = { ? `converted/${icon.replace(/\.svg$/, '.png')}` : icon }` - ) + ), }, () => {} ) @@ -430,7 +432,7 @@ const Driver = { async getDetections() { const [{ id, url }] = await promisify(chrome.tabs, 'query', { active: true, - currentWindow: true + currentWindow: true, }) if (await Driver.isDisabledDomain(url)) { @@ -462,12 +464,13 @@ const Driver = { try { Driver.cache.robots[hostname] = await Promise.race([ + // eslint-disable-next-line no-async-promise-executor new Promise(async (resolve) => { const response = await fetch( `http${secure ? 's' : ''}://${hostname}/robots.txt`, { redirect: 'follow', - mode: 'no-cors' + mode: 'no-cors', } ) @@ -497,7 +500,7 @@ const Driver = { }, []) ) }), - new Promise((resolve) => setTimeout(() => resolve(''), 5000)) + new Promise((resolve) => setTimeout(() => resolve(''), 5000)), ]) Driver.cache.robots = Object.keys(Driver.cache.robots) @@ -505,7 +508,7 @@ const Driver = { .reduce( (cache, hostname) => ({ ...cache, - [hostname]: Driver.cache.robots[hostname] + [hostname]: Driver.cache.robots[hostname], }), {} ) @@ -578,7 +581,7 @@ const Driver = { if (confidence === 100) { technologies[name] = { version, - hits + hits, } } @@ -587,8 +590,8 @@ const Driver = { {} ), meta: { - language - } + language, + }, } } @@ -613,7 +616,7 @@ const Driver = { await setOption('ads', (Driver.cache.ads = [])) } } - } + }, } Driver.init() diff --git a/src/drivers/webextension/js/inject.js b/src/drivers/webextension/js/inject.js index f658f7eb5..f47088d7e 100644 --- a/src/drivers/webextension/js/inject.js +++ b/src/drivers/webextension/js/inject.js @@ -1,6 +1,6 @@ /* eslint-env browser */ -;(function() { +;(function () { try { const onMessage = ({ data }) => { if (!data.wappalyzer) { @@ -21,7 +21,7 @@ (value, method) => value && value instanceof Object && - value.hasOwnProperty(method) + Object.prototype.hasOwnProperty.call(value, method) ? value[method] : undefined, window @@ -34,14 +34,14 @@ value: typeof value === 'string' || typeof value === 'number' ? value - : !!value + : !!value, }) } }) return technologies - }, []) - } + }, []), + }, }) } diff --git a/src/drivers/webextension/js/options.js b/src/drivers/webextension/js/options.js index dc2db78b2..dd3aefe49 100644 --- a/src/drivers/webextension/js/options.js +++ b/src/drivers/webextension/js/options.js @@ -21,12 +21,13 @@ const Options = { ['dynamicIcon', false], ['badge', true], ['tracking', true], - ['themeMode', false] + ['themeMode', false], ].map(async ([option, defaultValue]) => { const el = document .querySelector( - `[data-i18n="option${option.charAt(0).toUpperCase() + - option.slice(1)}"]` + `[data-i18n="option${ + option.charAt(0).toUpperCase() + option.slice(1) + }"]` ) .parentNode.querySelector('input') @@ -50,7 +51,7 @@ const Options = { { source: 'content.js', func, - args: args ? (Array.isArray(args) ? args : [args]) : [] + args: args ? (Array.isArray(args) ? args : [args]) : [], }, (response) => { chrome.runtime.lastError @@ -59,7 +60,7 @@ const Options = { } ) }) - } + }, } if (/complete|interactive|loaded/.test(document.readyState)) { diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js index 4eac92913..39b8704ae 100644 --- a/src/drivers/webextension/js/popup.js +++ b/src/drivers/webextension/js/popup.js @@ -9,7 +9,7 @@ const { getOption, setOption, promisify, - sendMessage + sendMessage, } = Utils function setDisabledDomain(enabled) { @@ -83,7 +83,7 @@ const Popup = { // Alert const tabs = await promisify(chrome.tabs, 'query', { active: true, - currentWindow: true + currentWindow: true, }) if (tabs && tabs.length) { @@ -168,7 +168,7 @@ const Popup = { technology.categories.forEach((category) => { categories[category.id] = categories[category.id] || { ...category, - technologies: [] + technologies: [], } categories[category.id].technologies.push(technology) @@ -296,7 +296,7 @@ const Popup = { ) i18n() - } + }, } if (/complete|interactive|loaded/.test(document.readyState)) { diff --git a/src/drivers/webextension/js/utils.js b/src/drivers/webextension/js/utils.js index f48e74403..bdc935326 100644 --- a/src/drivers/webextension/js/utils.js +++ b/src/drivers/webextension/js/utils.js @@ -60,7 +60,7 @@ const Utils = { async setOption(name, value) { try { await Utils.promisify(chrome.storage.local, 'set', { - [name]: value + [name]: value, }) } catch (error) { // eslint-disable-next-line no-console @@ -83,7 +83,7 @@ const Utils = { { source, func, - args: args ? (Array.isArray(args) ? args : [args]) : [] + args: args ? (Array.isArray(args) ? args : [args]) : [], }, (response) => { chrome.runtime.lastError @@ -92,5 +92,5 @@ const Utils = { } ) }) - } + }, } diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index b0f17eea3..39a334829 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Wappalyzer", "homepage_url": "https://www.wappalyzer.com", "description": "Identify web technologies", - "version": "6.2.4", + "version": "6.3.0", "default_locale": "en", "manifest_version": 2, "icons": { diff --git a/src/package.json b/src/package.json index e9aba8300..e143929b7 100644 --- a/src/package.json +++ b/src/package.json @@ -13,7 +13,7 @@ "software" ], "homepage": "https://www.wappalyzer.com", - "version": "6.2.6", + "version": "6.3.0", "author": "Wappalyzer", "license": "MIT", "repository": { @@ -27,4 +27,4 @@ "files": [ "wappalyzer.js" ] -} +} \ No newline at end of file diff --git a/src/wappalyzer.js b/src/wappalyzer.js index 07f87ee9e..35a4f5aea 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -69,7 +69,7 @@ const Wappalyzer = { ({ technology: { name, slug, categories, icon, website, cpe }, confidence, - version + version, }) => ({ name, slug, @@ -78,7 +78,7 @@ const Wappalyzer = { version, icon, website, - cpe + cpe, }) ) }, @@ -166,7 +166,7 @@ const Wappalyzer = { resolved.push({ technology: implied, confidence: Math.min(confidence, _confidence), - version: '' + version: '', }) done = false @@ -197,7 +197,7 @@ const Wappalyzer = { om(technology, 'scripts', scripts), mm(technology, 'cookies', cookies), mm(technology, 'meta', meta), - mm(technology, 'headers', headers) + mm(technology, 'headers', headers), ]) ) ).filter((technology) => technology) @@ -230,7 +230,7 @@ const Wappalyzer = { excludes, icon, website, - cpe + cpe, } = data[name] technologies.push({ @@ -247,14 +247,14 @@ const Wappalyzer = { js: transform(js, true), implies: transform(implies).map(({ value, confidence }) => ({ name: value, - confidence + confidence, })), excludes: transform(excludes).map(({ value }) => ({ - name: value + name: value, })), icon: icon || 'default.svg', website: website || null, - cpe: cpe || null + cpe: cpe || null, }) return technologies @@ -273,7 +273,7 @@ const Wappalyzer = { categories.push({ id: parseInt(id, 10), slug: Wappalyzer.slugify(category.name), - ...category + ...category, }) return categories @@ -324,7 +324,7 @@ const Wappalyzer = { value, regex, confidence: parseInt(confidence || 100, 10), - version: version || '' + version: version || '', } }) @@ -346,7 +346,7 @@ const Wappalyzer = { technologies.push({ technology, pattern, - version: Wappalyzer.resolveVersion(pattern, value) + version: Wappalyzer.resolveVersion(pattern, value), }) } @@ -369,7 +369,7 @@ const Wappalyzer = { technologies.push({ technology, pattern, - version: Wappalyzer.resolveVersion(pattern, value) + version: Wappalyzer.resolveVersion(pattern, value), }) } }) @@ -395,7 +395,7 @@ const Wappalyzer = { technologies.push({ technology, pattern, - version: Wappalyzer.resolveVersion(pattern, value) + version: Wappalyzer.resolveVersion(pattern, value), }) } }) @@ -403,7 +403,7 @@ const Wappalyzer = { return technologies }, []) - } + }, } if (typeof module !== 'undefined') {