diff --git a/README.md b/README.md index 1b1356a4c..644cd52d3 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ If you don't have time to configure, host, debug and maintain your own infrastru ## Prerequisites - [Git](https://git-scm.com) -- [Node.js](https://nodejs.org) version 12 or higher +- [Node.js](https://nodejs.org) version 14 or higher - [Yarn](https://yarnpkg.com) ## Quick start diff --git a/src/categories.json b/src/categories.json index 389623e20..9aba087a7 100644 --- a/src/categories.json +++ b/src/categories.json @@ -64,7 +64,7 @@ 7 ], "name": "Hosting panels", - "priority": 1 + "priority": 2 }, "10": { "groups": [ @@ -136,7 +136,7 @@ 6 ], "name": "Miscellaneous", - "priority": 9 + "priority": 10 }, "20": { "groups": [ diff --git a/src/drivers/npm/README.md b/src/drivers/npm/README.md index 0e2e5e022..986e7c784 100644 --- a/src/drivers/npm/README.md +++ b/src/drivers/npm/README.md @@ -35,6 +35,7 @@ wappalyzer [options] -r, --recursive Follow links on pages (crawler) -a, --user-agent=... Set the user agent string -n, --no-scripts Disabled JavaScript on web pages +-N, --no-redirect Disable cross-domain redirects ``` @@ -66,6 +67,7 @@ const options = { htmlMaxCols: 2000, htmlMaxRows: 2000, noScripts: false, + noRedirect: false, }; const wappalyzer = new Wappalyzer(options) diff --git a/src/drivers/npm/cli.js b/src/drivers/npm/cli.js index d6e53d5a2..423ab999a 100755 --- a/src/drivers/npm/cli.js +++ b/src/drivers/npm/cli.js @@ -22,6 +22,7 @@ const aliases = { r: 'recursive', w: 'maxWait', n: 'noScripts', + N: 'noRedirect', } while (true) { @@ -75,6 +76,7 @@ Options: -r, --recursive Follow links on pages (crawler) -a, --user-agent=... Set the user agent string -n, --no-scripts Disabled JavaScript on web pages + -N, --no-redirect Disable cross-domain redirects `) process.exit(1) diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js index 11ef71d52..254dd65e7 100644 --- a/src/drivers/npm/driver.js +++ b/src/drivers/npm/driver.js @@ -1,4 +1,3 @@ -const { URL } = require('url') const os = require('os') const fs = require('fs') const dns = require('dns').promises @@ -11,10 +10,6 @@ const Wappalyzer = require('./wappalyzer') const { setTechnologies, setCategories, analyze, analyzeManyToMany, resolve } = Wappalyzer -function next() { - return new Promise((resolve) => setImmediate(resolve)) -} - const { CHROMIUM_BIN, CHROMIUM_DATA_DIR, CHROMIUM_WEBSOCKET } = process.env const chromiumArgs = [ @@ -99,21 +94,16 @@ function getJs(page, technologies = Wappalyzer.technologies) { }, technologies) } -async function analyzeJs(js, technologies = Wappalyzer.technologies) { - return Array.prototype.concat.apply( - [], - await Promise.all( - js.map(async ({ name, chain, value }) => { - await next() - - return analyzeManyToMany( - technologies.find(({ name: _name }) => name === _name), - 'js', - { [chain]: [value] } - ) - }) - ) - ) +function analyzeJs(js, technologies = Wappalyzer.technologies) { + return js + .map(({ name, chain, value }) => { + return analyzeManyToMany( + technologies.find(({ name: _name }) => name === _name), + 'js', + { [chain]: [value] } + ) + }) + .flat() } function getDom(page, technologies = Wappalyzer.technologies) { @@ -201,59 +191,36 @@ function getDom(page, technologies = Wappalyzer.technologies) { }, technologies) } -async function analyzeDom(dom, technologies = Wappalyzer.technologies) { - return Array.prototype.concat.apply( - [], - await Promise.all( - dom.map( - async ({ - name, - selector, - exists, - text, - property, - attribute, - value, - }) => { - await next() - - const technology = technologies.find( - ({ name: _name }) => name === _name - ) - - if (typeof exists !== 'undefined') { - return analyzeManyToMany(technology, 'dom.exists', { - [selector]: [''], - }) - } +function analyzeDom(dom, technologies = Wappalyzer.technologies) { + return dom + .map(({ name, selector, exists, text, property, attribute, value }) => { + const technology = technologies.find(({ name: _name }) => name === _name) - if (typeof text !== 'undefined') { - return analyzeManyToMany(technology, 'dom.text', { - [selector]: [text], - }) - } + if (typeof exists !== 'undefined') { + return analyzeManyToMany(technology, 'dom.exists', { + [selector]: [''], + }) + } - if (typeof property !== 'undefined') { - return analyzeManyToMany(technology, `dom.properties.${property}`, { - [selector]: [value], - }) - } + if (typeof text !== 'undefined') { + return analyzeManyToMany(technology, 'dom.text', { + [selector]: [text], + }) + } - if (typeof attribute !== 'undefined') { - return analyzeManyToMany( - technology, - `dom.attributes.${attribute}`, - { - [selector]: [value], - } - ) - } + if (typeof property !== 'undefined') { + return analyzeManyToMany(technology, `dom.properties.${property}`, { + [selector]: [value], + }) + } - return [] - } - ) - ) - ) + if (typeof attribute !== 'undefined') { + return analyzeManyToMany(technology, `dom.attributes.${attribute}`, { + [selector]: [value], + }) + } + }) + .flat() } function get(url, options = {}) { @@ -497,11 +464,8 @@ class Site { async goto(url) { // Return when the URL is a duplicate or maxUrls has been reached - if ( - this.analyzedUrls[url.href] || - Object.keys(this.analyzedUrls).length >= this.options.maxUrls - ) { - return + if (this.analyzedUrls[url.href]) { + return [] } this.log(`Navigate to ${url}`, 'page') @@ -556,7 +520,7 @@ class Site { if (!this.analyzedXhr[url.hostname].includes(hostname)) { this.analyzedXhr[url.hostname].push(hostname) - await this.onDetect(url, await analyze({ xhr: hostname })) + await this.onDetect(url, analyze({ xhr: hostname })) } }, 1000) } @@ -588,12 +552,13 @@ class Site { page.on('response', async (response) => { try { if ( + response.status < 300 && response.frame().url() === url.href && response.request().resourceType() === 'script' ) { const scripts = await response.text() - await this.onDetect(response.url(), await analyze({ scripts })) + await this.onDetect(response.url(), analyze({ scripts })) } if (response.url() === url.href) { @@ -613,21 +578,33 @@ class Site { ] }) + // Prevent cross-domain redirects if (response.status() >= 300 && response.status() < 400) { if (headers.location) { - url = new URL(headers.location.slice(-1), url) + const _url = new URL(headers.location.slice(-1), url) + + if ( + _url.hostname.replace(/^www\./, '') === + this.originalUrl.hostname.replace(/^www\./, '') || + (Object.keys(this.analyzedUrls).length === 1 && + !this.options.noRedirect) + ) { + url = _url + + return + } } - } else { - responseReceived = true + } - const certIssuer = response.securityDetails() - ? response.securityDetails().issuer() - : '' + responseReceived = true - await this.onDetect(url, await analyze({ headers, certIssuer })) + const certIssuer = response.securityDetails() + ? response.securityDetails().issuer() + : '' - await this.emit('response', { page, response, headers, certIssuer }) - } + await this.onDetect(url, analyze({ headers, certIssuer })) + + await this.emit('response', { page, response, headers, certIssuer }) } } catch (error) { this.error(error) @@ -727,9 +704,10 @@ class Site { text = await this.promiseTimeout( ( await this.promiseTimeout( - page.evaluateHandle(() => - // eslint-disable-next-line unicorn/prefer-text-content - document.body.innerText.replace(/\s+/g, ' ').slice(0, 25000) + page.evaluateHandle( + () => + // eslint-disable-next-line unicorn/prefer-text-content + document.body.innerText // .replace(/\s+/g, ' ').slice(0, 25000) ), { jsonValue: () => '' }, 'Timeout (text)' @@ -814,7 +792,11 @@ class Site { meta.getAttribute('name') || meta.getAttribute('property') if (key) { - metas[key.toLowerCase()] = [meta.getAttribute('content')] + metas[key.toLowerCase()] = metas[key.toLowerCase()] || [] + + metas[key.toLowerCase()].push( + meta.getAttribute('content') + ) } return metas @@ -851,22 +833,20 @@ class Site { await this.onDetect( url, - ( - await Promise.all([ - analyzeDom(dom), - analyzeJs(js), - analyze({ - url, - cookies, - html, - text, - css, - scripts, - scriptSrc, - meta, - }), - ]) - ).flat() + [ + analyzeDom(dom), + analyzeJs(js), + analyze({ + url, + cookies, + html, + text, + css, + scripts, + scriptSrc, + meta, + }), + ].flat() ) const reducedLinks = Array.prototype.reduce.call( @@ -957,14 +937,23 @@ class Site { await Promise.all([ (async () => { - const links = await this.goto(url) + const links = ((await this.goto(url)) || []).filter( + ({ href }) => !this.analyzedUrls[href] + ) if ( - links && + links.length && this.options.recursive && + Object.keys(this.analyzedUrls).length < this.options.maxUrls && depth < this.options.maxDepth ) { - await this.batch(links.slice(0, this.options.maxUrls), depth + 1) + await this.batch( + links.slice( + 0, + this.options.maxUrls - Object.keys(this.analyzedUrls).length + ), + depth + 1 + ) } })(), (async () => { @@ -977,7 +966,7 @@ class Site { ]) } catch (error) { this.analyzedUrls[url.href] = { - status: 0, + status: this.analyzedUrls[url.href]?.status || 0, error: error.message || error.toString(), } @@ -1058,10 +1047,7 @@ class Site { this.log(`Probe ok (${path})`) - await this.onDetect( - url, - await analyze({ [file]: body.slice(0, 100000) }) - ) + await this.onDetect(url, analyze({ [file]: body.slice(0, 100000) })) } catch (error) { this.error(`Probe failed (${path}): ${error.message || error}`) } @@ -1099,7 +1085,7 @@ class Site { `Probe DNS ok: (${Object.values(dnsRecords).flat().length} records)` ) - await this.onDetect(url, await analyze({ dns: dnsRecords })) + await this.onDetect(url, analyze({ dns: dnsRecords })) resolve() }), @@ -1174,25 +1160,23 @@ class Site { await this.onDetect( url, - ( - await Promise.all([ - analyzeDom(dom, technologies), - analyzeJs(js, technologies), - analyze( - { - url, - cookies, - html, - text, - css, - scripts, - scriptSrc, - meta, - }, - technologies - ), - ]) - ).flat() + [ + analyzeDom(dom, technologies), + analyzeJs(js, technologies), + await analyze( + { + url, + cookies, + html, + text, + css, + scripts, + scriptSrc, + meta, + }, + technologies + ), + ].flat() ) } }) diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index ccdb25e92..ff912fb08 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.9.2", + "version": "6.9.11", "author": "Wappalyzer", "license": "MIT", "repository": { @@ -42,5 +42,8 @@ }, "dependencies": { "puppeteer": "^10.4.0" + }, + "engines": { + "node": ">=14" } } \ No newline at end of file diff --git a/src/drivers/webextension/_locales/ca/messages.json b/src/drivers/webextension/_locales/ca/messages.json index c541a783c..5a0a550fb 100644 --- a/src/drivers/webextension/_locales/ca/messages.json +++ b/src/drivers/webextension/_locales/ca/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/de/messages.json b/src/drivers/webextension/_locales/de/messages.json index 5f2cb397f..4c034a066 100644 --- a/src/drivers/webextension/_locales/de/messages.json +++ b/src/drivers/webextension/_locales/de/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/el/messages.json b/src/drivers/webextension/_locales/el/messages.json index 1018ef77a..549bfd0cc 100644 --- a/src/drivers/webextension/_locales/el/messages.json +++ b/src/drivers/webextension/_locales/el/messages.json @@ -91,6 +91,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/en/messages.json b/src/drivers/webextension/_locales/en/messages.json index 13435c873..eb97996b8 100644 --- a/src/drivers/webextension/_locales/en/messages.json +++ b/src/drivers/webextension/_locales/en/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/es/messages.json b/src/drivers/webextension/_locales/es/messages.json index a080da570..c7ce8604e 100644 --- a/src/drivers/webextension/_locales/es/messages.json +++ b/src/drivers/webextension/_locales/es/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/fa/messages.json b/src/drivers/webextension/_locales/fa/messages.json index 47fb224e1..948b71a38 100644 --- a/src/drivers/webextension/_locales/fa/messages.json +++ b/src/drivers/webextension/_locales/fa/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/fr/messages.json b/src/drivers/webextension/_locales/fr/messages.json index 59e91a111..843e8886f 100644 --- a/src/drivers/webextension/_locales/fr/messages.json +++ b/src/drivers/webextension/_locales/fr/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Traceurs" }, "setSecurity": { "message": "Sécurité" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "Pays de l'IP" }, "attributeIpRegion": { "message": "Région de l'IP" }, "attributeLanguage": { "message": "Langue" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Type de société" }, "attributeCompanyFounded": { "message": "Création de l'entreprise" }, "attributeKeywords": { "message": "Mots clés" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "Enregistrement SPF" }, "attributeDns_dmarc": { "message": "Enregistrement DMARC" }, "attributeSchemaOrgTypes": { "message": "types schema.org" }, diff --git a/src/drivers/webextension/_locales/gl_ES/messages.json b/src/drivers/webextension/_locales/gl_ES/messages.json index 8c561e4db..22a3b68b9 100644 --- a/src/drivers/webextension/_locales/gl_ES/messages.json +++ b/src/drivers/webextension/_locales/gl_ES/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/gr/messages.json b/src/drivers/webextension/_locales/gr/messages.json index dcbf12f89..f047ec055 100644 --- a/src/drivers/webextension/_locales/gr/messages.json +++ b/src/drivers/webextension/_locales/gr/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/id/messages.json b/src/drivers/webextension/_locales/id/messages.json index 1b5074750..852e66e0a 100644 --- a/src/drivers/webextension/_locales/id/messages.json +++ b/src/drivers/webextension/_locales/id/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/it/messages.json b/src/drivers/webextension/_locales/it/messages.json index 46e7d32c9..122897fa7 100644 --- a/src/drivers/webextension/_locales/it/messages.json +++ b/src/drivers/webextension/_locales/it/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/ja/messages.json b/src/drivers/webextension/_locales/ja/messages.json index 3f2c9b2bc..123633e41 100644 --- a/src/drivers/webextension/_locales/ja/messages.json +++ b/src/drivers/webextension/_locales/ja/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "位置" }, "setTrackers": { "message": "トラッカー" }, "setSecurity": { "message": "セキュリティ" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "言語" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "会社種別" }, "attributeCompanyFounded": { "message": "会社創立日" }, "attributeKeywords": { "message": "キーワード" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPFレコード" }, "attributeDns_dmarc": { "message": "DMARCレコード" }, "attributeSchemaOrgTypes": { "message": "schema.orgタイプ" }, diff --git a/src/drivers/webextension/_locales/ko/messages.json b/src/drivers/webextension/_locales/ko/messages.json index bbacf366d..7ebd6686b 100644 --- a/src/drivers/webextension/_locales/ko/messages.json +++ b/src/drivers/webextension/_locales/ko/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "언어(지역)" }, "setTrackers": { "message": "추적기" }, "setSecurity": { "message": "보안" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP 나라" }, "attributeIpRegion": { "message": "IP 지역" }, "attributeLanguage": { "message": "언어" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "회사 종류" }, "attributeCompanyFounded": { "message": "회사 상장" }, "attributeKeywords": { "message": "키워드" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF 레코드" }, "attributeDns_dmarc": { "message": "DMARC 레코드" }, "attributeSchemaOrgTypes": { "message": "schema.org 타입" }, diff --git a/src/drivers/webextension/_locales/nl/messages.json b/src/drivers/webextension/_locales/nl/messages.json index 4b451d9a2..47f799acf 100644 --- a/src/drivers/webextension/_locales/nl/messages.json +++ b/src/drivers/webextension/_locales/nl/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Beveiliging" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "Land van het IP" }, "attributeIpRegion": { "message": "Regio van het IP" }, "attributeLanguage": { "message": "Taal" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Bedrijfstype" }, "attributeCompanyFounded": { "message": "Oprichting van het bedrijf" }, "attributeKeywords": { "message": "Trefwoorden" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF-registratie" }, "attributeDns_dmarc": { "message": "DMARC-registratie" }, "attributeSchemaOrgTypes": { "message": "Typen schema.org" }, diff --git a/src/drivers/webextension/_locales/pl/messages.json b/src/drivers/webextension/_locales/pl/messages.json index 663be5092..38cf0116c 100644 --- a/src/drivers/webextension/_locales/pl/messages.json +++ b/src/drivers/webextension/_locales/pl/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/pt/messages.json b/src/drivers/webextension/_locales/pt/messages.json index 2a2620ab3..b21d0afc1 100644 --- a/src/drivers/webextension/_locales/pt/messages.json +++ b/src/drivers/webextension/_locales/pt/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/pt_BR/messages.json b/src/drivers/webextension/_locales/pt_BR/messages.json index ad36017e7..3db7910b4 100644 --- a/src/drivers/webextension/_locales/pt_BR/messages.json +++ b/src/drivers/webextension/_locales/pt_BR/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/ro/messages.json b/src/drivers/webextension/_locales/ro/messages.json index d61f2d843..c0174593d 100644 --- a/src/drivers/webextension/_locales/ro/messages.json +++ b/src/drivers/webextension/_locales/ro/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/ru/messages.json b/src/drivers/webextension/_locales/ru/messages.json index 253661c8d..ff30dab0d 100644 --- a/src/drivers/webextension/_locales/ru/messages.json +++ b/src/drivers/webextension/_locales/ru/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/sk/messages.json b/src/drivers/webextension/_locales/sk/messages.json index e83b5f9f8..7747809ae 100644 --- a/src/drivers/webextension/_locales/sk/messages.json +++ b/src/drivers/webextension/_locales/sk/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/tr/messages.json b/src/drivers/webextension/_locales/tr/messages.json index 389e20683..f53239f72 100644 --- a/src/drivers/webextension/_locales/tr/messages.json +++ b/src/drivers/webextension/_locales/tr/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/uk/messages.json b/src/drivers/webextension/_locales/uk/messages.json index 7c91cfe5c..4e84f21f4 100644 --- a/src/drivers/webextension/_locales/uk/messages.json +++ b/src/drivers/webextension/_locales/uk/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/uz/messages.json b/src/drivers/webextension/_locales/uz/messages.json index 67bb87640..4db8be9db 100644 --- a/src/drivers/webextension/_locales/uz/messages.json +++ b/src/drivers/webextension/_locales/uz/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/zh_CN/messages.json b/src/drivers/webextension/_locales/zh_CN/messages.json index 2ec846c36..38f96bbf2 100644 --- a/src/drivers/webextension/_locales/zh_CN/messages.json +++ b/src/drivers/webextension/_locales/zh_CN/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/_locales/zh_TW/messages.json b/src/drivers/webextension/_locales/zh_TW/messages.json index 5d007922e..9e82cebc6 100644 --- a/src/drivers/webextension/_locales/zh_TW/messages.json +++ b/src/drivers/webextension/_locales/zh_TW/messages.json @@ -45,7 +45,9 @@ "setLocale": { "message": "Locale" }, "setTrackers": { "message": "Trackers" }, "setSecurity": { "message": "Security" }, + "setSignals": { "message": "Signals" }, + "attributeTechnologySpend": { "message": "Technology spend" }, "attributeIpCountry": { "message": "IP country" }, "attributeIpRegion": { "message": "IP region" }, "attributeLanguage": { "message": "Language" }, @@ -91,6 +93,7 @@ "attributeCompanyType": { "message": "Company type" }, "attributeCompanyFounded": { "message": "Company founded" }, "attributeKeywords": { "message": "Keywords" }, + "attributeEmployees": { "message": "People" }, "attributeDns_spf": { "message": "SPF record" }, "attributeDns_dmarc": { "message": "DMARC record" }, "attributeSchemaOrgTypes": { "message": "schema.org types" }, diff --git a/src/drivers/webextension/css/styles.css b/src/drivers/webextension/css/styles.css index 9e59a6628..90b711aee 100644 --- a/src/drivers/webextension/css/styles.css +++ b/src/drivers/webextension/css/styles.css @@ -42,6 +42,10 @@ p { margin: 0 0 .5rem 0; } +.light-text { + color: var(--color-text-lighten); +} + .popup { background: white; max-height: 34rem; @@ -72,7 +76,7 @@ p { text-align: right; } -.button__link:hover:before { +.button__link:before { background: var(--color-primary); border-radius: 4px; content: ''; @@ -81,6 +85,10 @@ p { left: 0; right: 0; bottom: 0; + opacity: 0; +} + +.button__link:hover:before { opacity: .1; } @@ -223,16 +231,22 @@ small { overflow: hidden; } +.tab-item:nth-child(2) { + width: 31rem; +} + .tab-item--hidden { display: none; } .credits { + background: var(--color-secondary); color: var(--color-text-lighten); display: block; + font-size: .8rem; text-align: right; flex: 1; - padding: 0 1.5rem; + padding: 1rem 1.5rem 0 1.5rem; margin-bottom: -3px; line-height: 1rem; } @@ -286,6 +300,7 @@ small { .panel__content th { font-weight: normal; text-align: left; + min-width: 200px; width: 33%; } @@ -320,19 +335,6 @@ small { padding-bottom: 0; } -.chip, .chip:focus, .chip:hover { - border: 1px solid var(--color-secondary-darken); - border-radius: 4px; - margin: 0 .5rem .5rem 0; - display: inline-block; - padding: .2rem .5rem; - text-decoration: none; -} - -.chip:focus, .chip:hover { - background: var(--color-primary-lighten) -} - .plus-configure { margin: 1.5rem; } @@ -391,6 +393,25 @@ small { display: none; } +.plus-download { + flex: 1 0; + text-align: right; + padding: 0 1.5rem; + white-space: nowrap; +} + +.plus-download .button__link:before { + opacity: .1; +} + +.plus-download .button__link:hover:before { + opacity: .2; +} + +.plus-download--hidden { + visibility: hidden; +} + .plus-error { margin: 1.5rem; } @@ -812,12 +833,12 @@ body.dynamic-icon .category__heading:hover .category__pin { color: var(--color-primary-text); } -.input[type="text"], .input[type="password"] { - border-color: var(--color-primary-darken); +.dark .light-text { + color: var(--color-primary-text); } -.dark .chip:focus, .dark .chip:hover { - background: var(--color-primary); +.input[type="text"], .input[type="password"] { + border-color: var(--color-primary-darken); } .dark .message { @@ -838,7 +859,7 @@ body.dynamic-icon .category__heading:hover .category__pin { color: var(--color-text-dark); } -.dark .button__link:hover:before { +.dark .button__link:before { background: white; } @@ -942,6 +963,11 @@ body.dynamic-icon .category__heading:hover .category__pin { border-color: var(--color-primary); } +.dark .credits { + background: var(--color-primary-darken); +} + + .dark .footer { background: var(--color-primary-darken); border-top: 1px solid var(--color-primary); diff --git a/src/drivers/webextension/html/popup.html b/src/drivers/webextension/html/popup.html index 7a9848d91..de4297e88 100644 --- a/src/drivers/webextension/html/popup.html +++ b/src/drivers/webextension/html/popup.html @@ -49,173 +49,189 @@
 
 
-
-   +
+
+ + + + -   + + Export + + +
-
-
-
 
- -
-
- - - +
+
+
+
 
- - - +
+
+ + + -
0
-
+ + + -
-
-
+
0
-
-
+ +
+
+
+
+
+
+
+
+
+
-
-
+ +
+ + + + +
0
-
-
- - + + -
0
+ + +
- - - - - - - -
-
-
+
-
-
+
+
-
- - +
+ + +
+ +
- -
+
+
+ -
-
- + + + + - - - - + + + + +
- - - - +
-
-
+ -
-
-
+
+
+   + +  
-
-
- - - -
+
+
+
+
-
-
+
+ + + +
-
-
-
-   -
+
+
+ +
+
+
+   +
-

-   -

+

+   +

- -
-
-
- -   + +
+ +   - - () - - + + () + + - -
+ +
-
- - - - +
+ + + + -   - -
- -
+   + +
+ +
-
-
+
+
+