From c6554f89e7e803716fdb6a5e6b6195fc66d68b8e Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Tue, 28 Feb 2017 12:25:02 +0100 Subject: [PATCH 01/63] updated the CKAN record updated the CKAN record, adding metadata part --- src/apps.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps.json b/src/apps.json index a3c134b39..2b8dc58de 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1366,6 +1366,9 @@ "Java", "PostgreSQL\\;confidence:80" ], + "meta": { + "generator": "ckan [\\d]\\.[\\d]\\.[\\d]" + }, "website": "ckan.org/" }, "ClickHeat": { From 4b480c655649d4d173c1590ed7260a0579c9a78c Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Mon, 6 Mar 2017 15:34:15 +0100 Subject: [PATCH 02/63] updated record CKAN updating record CKAN, as suggested in #1398 --- src/apps.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/apps.json b/src/apps.json index ca821064b..5e67d8d7a 100755 --- a/src/apps.json +++ b/src/apps.json @@ -6,7 +6,7 @@ ], "icon": "1and1.svg", "implies": "PHP", - "url": "/shop/catalog/browse\\?sessid=" + "url": "/shop/catalog/browse\\?sessid=", "website": "http://1and1.com" }, "1C-Bitrix": { @@ -1356,8 +1356,8 @@ 1 ], "headers": { - "Access-Control-Allow-Headers": "X-CKAN-API-KEY", - "Link": "; rel=shortlink" + "Access-Control-Allow-Headers": "X-CKAN-API-KEY\\;confidence:90", + "Link": "; rel=shortlink\\;confidence:90 }, "icon": "Ckan.png", "implies": [ @@ -1367,9 +1367,9 @@ "PostgreSQL\\;confidence:80" ], "meta": { - "generator": "ckan [\\d]\\.[\\d]\\.[\\d]" + "generator": "ckan.*?(\\d\\.\\d\\.\\d)?\\;version:\\1" }, - "website": "ckan.org/" + "website": "http://ckan.org/" }, "ClickHeat": { "cats": [ From 61518892adeca59d71bc65748d38fa072da487d1 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Mon, 6 Mar 2017 16:37:20 +0100 Subject: [PATCH 03/63] updated / fixed CKAN definition fixed missing double quote in CKAN definition --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 5e67d8d7a..a4c0461f5 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1357,7 +1357,7 @@ ], "headers": { "Access-Control-Allow-Headers": "X-CKAN-API-KEY\\;confidence:90", - "Link": "; rel=shortlink\\;confidence:90 + "Link": "; rel=shortlink\\;confidence:90" }, "icon": "Ckan.png", "implies": [ From 51695f6f32e1df6f30254c4f539b2c002e10bba3 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Mon, 17 Apr 2017 17:03:36 +0200 Subject: [PATCH 04/63] updated CKAN record updated CKAN record --- src/apps.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps.json b/src/apps.json index a4c0461f5..c0224dd1c 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1356,8 +1356,8 @@ 1 ], "headers": { - "Access-Control-Allow-Headers": "X-CKAN-API-KEY\\;confidence:90", - "Link": "; rel=shortlink\\;confidence:90" + "Access-Control-Allow-Headers": "X-CKAN-API-KEY", + "Link": "; rel=shortlink" }, "icon": "Ckan.png", "implies": [ @@ -1367,7 +1367,7 @@ "PostgreSQL\\;confidence:80" ], "meta": { - "generator": "ckan.*?(\\d\\.\\d\\.\\d)?\\;version:\\1" + "generator": "^ckan\\s+(\\d{1,}\\.\\d{1,}\\.\\d{1,})$" }, "website": "http://ckan.org/" }, From 349b33644938a56f8a74e733dd469aedb2233e46 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 21 Apr 2017 16:17:49 +0200 Subject: [PATCH 05/63] added Virtuoso detection added Virtuoso detection, as requested in #1516 --- src/apps.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/apps.json b/src/apps.json index dffea9b8f..a636fb346 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8433,6 +8433,17 @@ "implies": "Joomla", "website": "http://virtuemart.net" }, + "Virtuoso": { + "cats": [ + "34" + ], + "meta": { + "Keywords": "^OpenLink Virtuoso Sparql", + "Copyright": "^Copyright © \\d{4} OpenLink Software" + }, + "url": "^https?://(?:[^\\/]+\\.)?.*?/sparql\\;confidence:20" + "Server": "Virtuoso:*?\\;version:\\1" + }, "Visual WebGUI": { "cats": [ "18" From f9919596833d67fb6afdfe3a7f192d8c51125aa1 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 21 Apr 2017 16:22:51 +0200 Subject: [PATCH 06/63] updated virtuoso detection updated virtuoso detection --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index a636fb346..9d2f99f3e 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8441,7 +8441,7 @@ "Keywords": "^OpenLink Virtuoso Sparql", "Copyright": "^Copyright © \\d{4} OpenLink Software" }, - "url": "^https?://(?:[^\\/]+\\.)?.*?/sparql\\;confidence:20" + "url": "^https?://(?:[^\\/]+\\.)?.*?/sparql\\;confidence:20", "Server": "Virtuoso:*?\\;version:\\1" }, "Visual WebGUI": { From 6644f04effeda20449febd035296d2f7711e930a Mon Sep 17 00:00:00 2001 From: Elbert Filius Date: Sat, 13 May 2017 16:32:00 +1000 Subject: [PATCH 07/63] Fix merge conflict --- src/apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 428cbbef7..e98f2f4a0 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8111,7 +8111,8 @@ "PHP", "jQuery" ], - "script": "lucide\\.init\\.js", + "icon": "translucide.svg", + "script": "lucide\\.init(?:\\.min)?\\.js", "website": "http://www.translucide.net" }, "Tumblr": { From 8a6f9bad3028c7e653de63a806e60aa7c1bb5fb0 Mon Sep 17 00:00:00 2001 From: Elbert Filius Date: Sat, 13 May 2017 17:38:04 +1000 Subject: [PATCH 08/63] Update to v4.1.0 --- src/apps.json | 135 ++++++++++++------------- src/drivers/phantomjs/package.json | 2 +- src/drivers/webextension/manifest.json | 2 +- 3 files changed, 69 insertions(+), 70 deletions(-) diff --git a/src/apps.json b/src/apps.json index e98f2f4a0..40cb8cd92 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1910,18 +1910,6 @@ "icon": "Dell.png", "website": "http://dell.com" }, - "Salesforce Commerce Cloud": { - "cats": [ - "6" - ], - "env": "^dwAnalytics$", - "headers": { - "Server": "Demandware eCommerce Server" - }, - "html": "<[^>]+demandware\\.edgesuite", - "icon": "Salesforce.svg", - "website": "http://demandware.com" - }, "Deployd": { "cats": [ "12" @@ -3142,19 +3130,6 @@ }, "website": "http://developers.google.com/web-toolkit" }, - "govCMS": { - "cats": [ - "1" - ], - "meta": { - "generator": "Drupal ([\\d]+) \\(http:\\/\\/drupal\\.org\\) \\+ govCMS\\;version:\\1" - }, - "icon": "govCMS.svg", - "implies": [ - "Drupal" - ], - "website": "https://www.govcms.gov.au" - }, "Graffiti CMS": { "cats": [ "1" @@ -4322,16 +4297,6 @@ "icon": "LabVIEW.png", "website": "http://ni.com/labview" }, - "Shapecss": { - "cats":[ - "18" - ], - "env": "^Shapecss$", - "html":"]* href=\"[^\"]*shapecss(?:\\.min)?\\.css", - "script":"shapecss(?:\\.min)?\\.js", - "icon":"Shapecss.svg", - "website":"https://shapecss.com" - }, "Laravel": { "cats": [ "18" @@ -4388,17 +4353,6 @@ "implies": "Scala", "website": "http://liftweb.net" }, - "Play": { - "cats": [ - "18" - ], - "headers": { - "Set-Cookie": "PLAY_SESSION" - }, - "icon": "Play.svg", - "implies": "Scala", - "website": "https://www.playframework.com" - }, "LightMon Engine": { "cats": [ "1" @@ -5261,6 +5215,14 @@ }, "website": "http://moodle.org" }, + "Moon": { + "cats": [ + "12" + ], + "icon": "moon.png", + "script": "/moon(?:\\.min)?\\.js$", + "website": "http://moonjs.ga/" + }, "Motion-httpd": { "cats": [ "22" @@ -6182,6 +6144,17 @@ }, "website": "http://planetplanet.org" }, + "Play": { + "cats": [ + "18" + ], + "headers": { + "Set-Cookie": "PLAY_SESSION" + }, + "icon": "Play.svg", + "implies": "Scala", + "website": "https://www.playframework.com" + }, "Plentymarkets": { "cats": [ "6" @@ -7013,6 +6986,18 @@ "icon": "Salesforce.svg", "website": "https://www.salesforce.com" }, + "Salesforce Commerce Cloud": { + "cats": [ + "6" + ], + "env": "^dwAnalytics$", + "headers": { + "Server": "Demandware eCommerce Server" + }, + "html": "<[^>]+demandware\\.edgesuite", + "icon": "Salesforce.svg", + "website": "http://demandware.com" + }, "Sarka-SPIP": { "cats": [ "1" @@ -7086,9 +7071,9 @@ "cats": [ "12" ], + "icon": "Select2.png", "implies": "jQuery", "script": "select2.*\\.js", - "icon": "Select2.png", "website": "http://select2.github.io" }, "Semantic-ui": { @@ -7164,6 +7149,16 @@ "implies": "PHP", "website": "http://shadow-technologies.co.uk" }, + "Shapecss": { + "cats": [ + "18" + ], + "env": "^Shapecss$", + "html": "]* href=\"[^\"]*shapecss(?:\\.min)?\\.css", + "icon": "Shapecss.svg", + "script": "shapecss(?:\\.min)?\\.js", + "website": "https://shapecss.com" + }, "ShareThis": { "cats": [ "5" @@ -7511,12 +7506,12 @@ "SonarQube" ], - "script": "^/js/bundles/sonar\\.js?v=([\\d.]+)$\\;version:\\1", "icon": "sonar.png", "implies": "Java", "meta": { "application-name": "^SonarQubes$" }, + "script": "^/js/bundles/sonar\\.js?v=([\\d.]+)$\\;version:\\1", "website": "https://www.sonarqube.org/" }, "SoundManager": { @@ -7680,7 +7675,7 @@ "icon": "Store Systems.png", "website": "http://store-systems.de" }, - "Storyblok": { + "Storyblok": { "cats": [ "1" ], @@ -8111,7 +8106,6 @@ "PHP", "jQuery" ], - "icon": "translucide.svg", "script": "lucide\\.init(?:\\.min)?\\.js", "website": "http://www.translucide.net" }, @@ -8611,6 +8605,15 @@ "script": "w3counter\\.com/tracker\\.js", "website": "http://www.w3counter.com" }, + "WEBXPAY": { + "cats": [ + "6" + ], + "env": "^WEBXPAY$", + "html": "Powered by WEBXPAY<", + "icon": "WEBXPAY.png", + "website": "https://webxpay.com" + }, "WHMCS": { "cats": [ "6" @@ -9532,6 +9535,19 @@ "script": "static/gitweb.js$", "website": "http://git-scm.com" }, + "govCMS": { + "cats": [ + "1" + ], + "icon": "govCMS.svg", + "implies": [ + "Drupal" + ], + "meta": { + "generator": "Drupal ([\\d]+) \\(http:\\/\\/drupal\\.org\\) \\+ govCMS\\;version:\\1" + }, + "website": "https://www.govcms.gov.au" + }, "gunicorn": { "cats": [ "22" @@ -10101,15 +10117,6 @@ "icon": "swift.engine.png", "website": "http://mittec.ru/default" }, - "WEBXPAY": { - "cats": [ - "6" - ], - "env": "^WEBXPAY$", - "html": "Powered by WEBXPAY<", - "icon": "WEBXPAY.png", - "website": "https://webxpay.com" - }, "three.js": { "cats": [ "25" @@ -10271,14 +10278,6 @@ "icon": "xui.png", "script": "[^a-z]xui.*\\.js", "website": "http://xuijs.com" - }, - "Moon": { - "cats": [ - "12" - ], - "icon": "moon.png", - "script": "/moon(?:\\.min)?\\.js$", - "website": "http://moonjs.ga/" } }, "categories": { @@ -10495,4 +10494,4 @@ "priority": "9" } } -} +} \ No newline at end of file diff --git a/src/drivers/phantomjs/package.json b/src/drivers/phantomjs/package.json index eed2410c6..a6d0d33ac 100644 --- a/src/drivers/phantomjs/package.json +++ b/src/drivers/phantomjs/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "3.0.10", + "version": "4.1.0", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 79d8409e9..c761c022e 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://wappalyzer.com/", "description": "Identify web technologies", - "version": "4.0.1", + "version": "4.1.0", "default_locale": "en", "manifest_version": 2, "icons": { From 1985fbc81aac7c3f8a0fb8e2d564fd1a8364be2c Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 14 May 2017 15:05:58 +1000 Subject: [PATCH 09/63] Replace Vagrant with Docker --- .gitignore | 14 +- .travis.yml | 16 +- CONTRIBUTING.md | 3 - Dockerfile | 32 + bin/{wappalyzer-build => build} | 71 +- bin/{wappalyzer-help => help} | 2 +- bin/links | 14 + bin/run | 11 + bin/validate | 17 + bin/validate-icons | 43 + ...ppalyzer-validate-regex => validate-regex} | 3 +- bin/wappalyzer | 12 - bin/wappalyzer-links | 45 - bin/wappalyzer-validate | 35 - bin/wappalyzer-validate-icons | 55 - docker/Dockerfile | 72 - docker/node/package.json | 27 - docker/ssh/insecure.key | 27 - docker/ssh/insecure.key.pub | 1 - package.json | 8 + run | 19 + src/drivers/{phantomjs => npm}/.gitignore | 0 src/drivers/{phantomjs => npm}/Dockerfile | 0 src/drivers/{phantomjs => npm}/README.md | 0 src/drivers/{phantomjs => npm}/driver.js | 0 src/drivers/{phantomjs => npm}/index.js | 0 src/drivers/{phantomjs => npm}/package.json | 0 src/drivers/webextension/.gitignore | 13 +- src/drivers/webextension/images/icons | 1 + .../webextension/images/icons/.gitkeep | 0 .../images/icons/converted/.gitkeep | 0 src/icons/3dCart.png | Bin 1831 -> 1776 bytes src/icons/ActOn.png | Bin 609 -> 608 bytes src/icons/Amazon-Cloudfront.svg | 24 +- src/icons/AngularJS.svg | 75 +- src/icons/Apache Traffic Server.png | Bin 8307 -> 5838 bytes src/icons/Apache.svg | 4 +- src/icons/Aurelia.svg | 65 +- src/icons/Bootstrap Table.svg | 5 +- src/icons/Clipboard.js.svg | 4 +- src/icons/Comandia.svg | 10 +- src/icons/Express.png | Bin 4552 -> 2362 bytes src/icons/Fastly.svg | 32 +- src/icons/Firebase.png | Bin 1698 -> 1690 bytes src/icons/FlexSlider.png | Bin 754 -> 740 bytes src/icons/ForkCMS.png | Bin 2032 -> 1836 bytes src/icons/Froala.svg | 2 +- src/icons/Google Search Appliance.png | Bin 1509 -> 1508 bytes src/icons/Homeland.png | Bin 19700 -> 11831 bytes src/icons/Kamva.svg | 213 +-- src/icons/Klarna.svg | 13 +- src/icons/Medium.svg | 10 +- src/icons/Netlify.svg | 10 +- src/icons/Neto.svg | 37 +- src/icons/PHP.svg | 2 +- src/icons/Play.svg | 2 +- src/icons/Plotly.png | Bin 713 -> 646 bytes src/icons/Raspbian.svg | 18 +- src/icons/Revel.png | Bin 1506 -> 1362 bytes src/icons/RockRMS.svg | 13 +- src/icons/Salesforce.svg | 160 +-- src/icons/Scholica.svg | 25 +- src/icons/Shapecss.svg | 28 +- src/icons/ShellInABox.png | Bin 368 -> 234 bytes src/icons/SpinCMS.png | Bin 6917 -> 3838 bytes src/icons/SumoMe.png | Bin 15418 -> 15334 bytes src/icons/SweetAlert2.png | Bin 3508 -> 3505 bytes src/icons/Vinala.png | Bin 1777 -> 1664 bytes src/icons/YouTrack.png | Bin 1674 -> 1522 bytes src/icons/adminer.png | Bin 1127 -> 742 bytes src/icons/apostrophecms.svg | 13 +- src/icons/aws-ec2.svg | 14 +- src/icons/aws-s3.svg | 18 +- src/icons/cloudcart.svg | 25 +- src/icons/default.svg | 20 +- src/icons/eCommercePy.png | Bin 721 -> 717 bytes src/icons/ebis.png | Bin 54841 -> 54631 bytes src/icons/ec-cube.png | Bin 53579 -> 53369 bytes src/icons/etherpad.png | Bin 1009 -> 468 bytes src/icons/gerrit.svg | 9 +- src/icons/gogs.png | Bin 4174 -> 4004 bytes src/icons/gravityforms.svg | 2 +- src/icons/iPresta.png | Bin 22212 -> 22125 bytes src/icons/infusionsoft.svg | 2 +- src/icons/kibana.svg | 20 +- src/icons/mailchimp.svg | 2 +- src/icons/mattermost.png | Bin 1345 -> 1195 bytes src/icons/meliscmsv2.png | Bin 4635 -> 4422 bytes src/icons/moon.png | Bin 2056 -> 1386 bytes src/icons/octopress.png | Bin 400 -> 267 bytes src/icons/pygments.png | Bin 1931 -> 1789 bytes src/icons/storyblok.png | Bin 1899 -> 1896 bytes src/icons/translucide.svg | 37 +- src/icons/typecho.svg | 11 +- src/icons/wp_super_cache.png | Bin 925 -> 785 bytes src/utils/iframe.js | 1166 ----------------- src/utils/network.js | 784 ----------- 97 files changed, 216 insertions(+), 3200 deletions(-) delete mode 100644 CONTRIBUTING.md create mode 100644 Dockerfile rename bin/{wappalyzer-build => build} (51%) rename bin/{wappalyzer-help => help} (84%) create mode 100755 bin/links create mode 100755 bin/run create mode 100755 bin/validate create mode 100755 bin/validate-icons rename bin/{wappalyzer-validate-regex => validate-regex} (94%) delete mode 100755 bin/wappalyzer delete mode 100755 bin/wappalyzer-links delete mode 100755 bin/wappalyzer-validate delete mode 100755 bin/wappalyzer-validate-icons delete mode 100644 docker/Dockerfile delete mode 100644 docker/node/package.json delete mode 100644 docker/ssh/insecure.key delete mode 100644 docker/ssh/insecure.key.pub create mode 100644 package.json create mode 100755 run rename src/drivers/{phantomjs => npm}/.gitignore (100%) rename src/drivers/{phantomjs => npm}/Dockerfile (100%) rename src/drivers/{phantomjs => npm}/README.md (100%) rename src/drivers/{phantomjs => npm}/driver.js (100%) rename src/drivers/{phantomjs => npm}/index.js (100%) rename src/drivers/{phantomjs => npm}/package.json (100%) create mode 120000 src/drivers/webextension/images/icons delete mode 100644 src/drivers/webextension/images/icons/.gitkeep delete mode 100644 src/drivers/webextension/images/icons/converted/.gitkeep mode change 100755 => 100644 src/icons/FlexSlider.png mode change 100755 => 100644 src/icons/ForkCMS.png delete mode 100644 src/utils/iframe.js delete mode 100644 src/utils/network.js diff --git a/.gitignore b/.gitignore index 7d65964c0..b604acc93 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,11 @@ -.vagrant - -build/* -src/icons/converted/* - -node_modules -npm-debug.log - -tags +/build/* +/src/icons/converted/* +/node_modules +/npm-debug.log !.gitkeep +# Junk files Thumbs.db Desktop.ini *.DS_Store diff --git a/.travis.yml b/.travis.yml index d9239161a..ca6c98893 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,17 +1,9 @@ -language: node_js -node_js: - - "node" sudo: false -dist: trusty -before_install: - - export WAPPALYZER_ROOT=$TRAVIS_BUILD_DIR - - export WAPPALYZER_NODE_PATH=$TRAVIS_BUILD_DIR - - export PATH=$PATH:$TRAVIS_BUILD_DIR/bin - - ln -s docker/node/package.json package.json -before_script: npm i -g manifoldjs +services: docker after_success: - sha256sum build/* > build/SHA256SUMS - cat build/SHA256SUMS +script: ./run build deploy: provider: releases api_key: @@ -22,9 +14,5 @@ deploy: on: repo: AliasIO/Wappalyzer tags: true -after_script: ls -l --block-size=kB build -cache: - directories: - - node_modules env: - CXX=g++-4.8 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index bffe6a2e1..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,3 +0,0 @@ -# Contributing - -You can find our contribution guide [in our wiki](https://github.com/AliasIO/Wappalyzer/wiki/Contributing). diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..e10b84532 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +FROM alpine + +MAINTAINER Elbert Alias + +ENV WAPPALYZER_DIR=/opt/wappalyzer + +RUN apk add --no-cache \ + bash \ + curl \ + fontconfig \ + nodejs \ + optipng \ + zip + +RUN mkdir -p /usr/share && \ + cd /usr/share \ + && curl -L https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 | tar xj \ + && ln -s /usr/share/phantomjs/phantomjs /usr/bin/phantomjs + +RUN apk del \ + curl + +RUN npm i -g \ + jsonlint-cli \ + manifoldjs \ + svg2png-many + +RUN mkdir -p $WAPPALYZER_DIR + +WORKDIR $WAPPALYZER_DIR + +CMD [ "./bin/run" ] diff --git a/bin/wappalyzer-build b/bin/build similarity index 51% rename from bin/wappalyzer-build rename to bin/build index a07a85b59..af6a94195 100755 --- a/bin/wappalyzer-build +++ b/bin/build @@ -1,82 +1,57 @@ #!/bin/bash -if [ -z $WAPPALYZER_ROOT ] -then - echo "\$WAPPALYZER_ROOT not set" +cd "$(dirname $0)/.." - exit 1 -fi - -if [ -z $WAPPALYZER_NODE_PATH ] -then - echo "\$WAPPALYZER_NODE_PATH not set" - - exit 1 -fi - -set -eu - -wappalyzer validate +./bin/validate echo "Prettifying apps.json..." -node $WAPPALYZER_NODE_PATH/node_modules/jsonlint/lib/cli.js -ist $'\t' $WAPPALYZER_ROOT/src/apps.json - -echo "Compressing PNG and SVG icons..." - -node $WAPPALYZER_NODE_PATH/node_modules/imagemin-cli/cli.js $WAPPALYZER_ROOT/src/icons/* --out-dir $WAPPALYZER_ROOT/src/icons 2>&1 > /dev/null +jsonlint-cli -ist $'\t' src/apps.json echo "Converting SVG icons to PNG..." -OIFS="$IFS" -IFS=$'\n' - -for svg in $(find $WAPPALYZER_ROOT/src/icons -type f -name "*.svg") -do - echo " Converting $(basename "$svg")..." - - dest="$WAPPALYZER_ROOT/src/icons/converted/$(basename "$svg").png" - - if [[ -f "$dest" ]]; then - rm "$dest" - fi +#svg2png-many -i src/icons/ -o src/icons/converted/ --width=32 --height=32 - node $WAPPALYZER_NODE_PATH/node_modules/svg2png/bin/svg2png-cli "$svg" --width=32 --height=32 --output "$dest" || true -done +echo "Compressing PNG icons..." -IFS="$OIFS" +optipng -quiet "src/icons/*.png" +optipng -quiet "src/icons/converted/*.png" -echo "Compressing converted PNG icons..." - -node $WAPPALYZER_NODE_PATH/node_modules/imagemin-cli/cli.js $WAPPALYZER_ROOT/src/icons/converted/* $WAPPALYZER_ROOT/src/icons/converted - -wappalyzer links # WebExtension -echo "Building WebExtension driver..." +echo "Building WebExtension..." -webextension_dir=$WAPPALYZER_ROOT/src/drivers/webextension +webextension_dir=src/drivers/webextension pushd $webextension_dir > /dev/null -zip -qr $WAPPALYZER_ROOT/build/wappalyzer_webextension.zip . +zip -qr ../../../build/wappalyzer_webextension.zip . popd > /dev/null # Edge +echo "Building Edge application..." -pushd $WAPPALYZER_ROOT/build > /dev/null +pushd build > /dev/null + +webextension_dir="../$webextension_dir" +manifest_dir="Wappalyzer/edgeextension/manifest" mv $webextension_dir/manifest.json $webextension_dir/manifest.webextension.json mv $webextension_dir/manifest.edge.json $webextension_dir/manifest.json manifoldjs -l debug -p edgeextension -f edgeextension -m $webextension_dir/manifest.json +# Replace symlinks with actual files +rm $manifest_dir/Extension/images/icons + +cp ../src/apps.json $manifest_dir/Extension +cp ../src/wappalyzer.js $manifest_dir/Extension/js +cp -r ../src/icons $manifest_dir/Extension/images + mv $webextension_dir/manifest.json $webextension_dir/manifest.edge.json mv $webextension_dir/manifest.webextension.json $webextension_dir/manifest.json -manifest_dir="Wappalyzer/edgeextension/manifest" - sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-NAME-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-PUBLISHER-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml sed -i 's/INSERT-YOUR-PACKAGE-PROPERTIES-PUBLISHERDISPLAYNAME-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml @@ -94,4 +69,4 @@ rm -rf Wappalyzer popd > /dev/null -echo "Done. Builds have been created in $WAPPALYZER_ROOT/build." +echo "Done." diff --git a/bin/wappalyzer-help b/bin/help similarity index 84% rename from bin/wappalyzer-help rename to bin/help index d832f88c1..736fc925f 100755 --- a/bin/wappalyzer-help +++ b/bin/help @@ -1,7 +1,7 @@ #!/bin/bash cat << 'EOF' -usage: wappalyzer [] +usage: ./run [] The following commands are available: build Package drivers diff --git a/bin/links b/bin/links new file mode 100755 index 000000000..c7905c0c4 --- /dev/null +++ b/bin/links @@ -0,0 +1,14 @@ +#!/bin/bash + +cd "$(dirname $0)/../src" + +echo "Creating links..." + +ln -nsf ../../apps.json drivers/npm +ln -nsf ../../wappalyzer.js drivers/npm + +ln -nsf ../../apps.json drivers/webextension +ln -nsf ../../../wappalyzer.js drivers/webextension/js +ln -nsf ../../../icons/ drivers/webextension/images/icons + +echo "Done." diff --git a/bin/run b/bin/run new file mode 100755 index 000000000..f7a29c820 --- /dev/null +++ b/bin/run @@ -0,0 +1,11 @@ +#!/bin/bash + +cd "$(dirname $0)" + +if [[ -f "$1" ]]; then + ./$1 $@ +else + ./help + + exit 1 +fi diff --git a/bin/validate b/bin/validate new file mode 100755 index 000000000..1d6587600 --- /dev/null +++ b/bin/validate @@ -0,0 +1,17 @@ +#!/bin/bash + +cd "$(dirname $0)/.." + +set -eu + +echo "Validating apps.json..." + +jsonlint-cli -s schema.json src/apps.json + +echo "Validating regular expressions..." + +./bin/validate-regex + +echo "Validating icons..." + +./bin/validate-icons diff --git a/bin/validate-icons b/bin/validate-icons new file mode 100755 index 000000000..e1e629bbe --- /dev/null +++ b/bin/validate-icons @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +var + app, + fs = require('fs'), + fileType = require('../node_modules/file-type'), + readChunk = require('../node_modules/read-chunk') + isSvg = require('../node_modules/is-svg') + json = require('../src/apps.json'); + +for (app in json.apps) { + (function(app) { + var + basePath = 'src/icons/'; + iconPath = json.apps[app].icon || 'default.svg'; + path = basePath + iconPath, + ext = iconPath.substr(iconPath.length - 4); + + if ( ext !== '.png' && ext !== '.svg' ) { + throw err = new Error('Icon file extension specified for app "' + app + '" is not ".png" or ".svg": src/icons/' + iconPath); + } + + fs.exists(path, function(exists) { + if ( exists ) { + if ( ext === '.png' ) { + var buffer = fileType(readChunk.sync(path, 0, 262)); + + if ( buffer === null ) { + throw new Error('Unknown mimetype or bad file for "' + app + '": src/icons/' + iconPath); + } else if ( buffer.mime !== 'image/png' ) { + throw new Error('Incorrect mimetype "' + buffer.mime + '" when expected PNG for app "' + app + '": src/icons/' + iconPath); + } + } else if ( type === 'svg' ) { + if ( !isSvg(fs.readFileSync(path)) ) { + throw new Error('Incorrect mimetype when expected SVG for app "' + app + '": src/icons/' + iconPath); + } + } + } else { + throw Error('Missing file for app "' + app + '": src/icons/' + iconPath); + } + }); + }(app)); +} diff --git a/bin/wappalyzer-validate-regex b/bin/validate-regex similarity index 94% rename from bin/wappalyzer-validate-regex rename to bin/validate-regex index f7976c116..423aa2c69 100755 --- a/bin/wappalyzer-validate-regex +++ b/bin/validate-regex @@ -2,8 +2,7 @@ var app, - modulesPath = process.env.WAPPALYZER_NODE_PATH !== undefined ? process.env.WAPPALYZER_NODE_PATH + '/node_modules/' : '', - json = require(process.env.WAPPALYZER_ROOT + '/src/apps.json'); + json = require('../src/apps.json'); for ( app in json.apps ) { ['headers', 'html', 'env', 'meta', 'script'].forEach(function(type) { diff --git a/bin/wappalyzer b/bin/wappalyzer deleted file mode 100755 index 5c1cb8261..000000000 --- a/bin/wappalyzer +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -if [ -f "$0-$1" ] -then - $0-$1 ${*:2} -else - $0-help - - exit 1 -fi - -exit diff --git a/bin/wappalyzer-links b/bin/wappalyzer-links deleted file mode 100755 index ae75f4432..000000000 --- a/bin/wappalyzer-links +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -path=$1 - -if [ -z $path ] -then - if [ -z $WAPPALYZER_ROOT ] - then - echo "-$(basename $0): No path specified" - - exit 1 - fi - - path=$WAPPALYZER_ROOT -fi - -set -eu - -if [ ! -d $path/src ] -then - echo "-$(basename $0): Incorrect path" - - exit 1 -fi - -path="$path/src" - -echo "Creating hard links..." - -ln -f $path/wappalyzer.js $path/drivers/phantomjs -ln -f $path/apps.json $path/drivers/phantomjs - -ln -f $path/wappalyzer.js $path/drivers/webextension/js -ln -f $path/apps.json $path/drivers/webextension -ln -f $path/icons/*.png $path/drivers/webextension/images/icons -ln -f $path/icons/*.svg $path/drivers/webextension/images/icons -ln -f $path/utils/*.js $path/drivers/webextension/js - -if [ "$(compgen -G "$path/icons/converted/*.png" | head -n1)" ]; then - ln -f $path/icons/converted/*.png $path/drivers/webextension/images/icons/converted -fi - -echo "OK" - -exit 0 diff --git a/bin/wappalyzer-validate b/bin/wappalyzer-validate deleted file mode 100755 index 0106c4d18..000000000 --- a/bin/wappalyzer-validate +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -path="$1" - -if [ -z "$path" ]; then - if [ -z "$WAPPALYZER_ROOT" ]; then - echo "-$(basename $0): No path specified" - - exit 1 - fi - - path="$WAPPALYZER_ROOT" -fi - -set -eu - -if [ ! -d "$path/src" ]; then - echo "-$(basename $0): Incorrect path" - - exit 1 -fi - -path="$path/src" - -echo "Validating apps.json..." - -node "$WAPPALYZER_NODE_PATH/node_modules/jsonlint/lib/cli.js" --quiet -V "$WAPPALYZER_ROOT/schema.json" "$path/apps.json" - -echo "Validating regular expressions..." - -wappalyzer validate-regex - -echo "Validating icons..." - -wappalyzer validate-icons diff --git a/bin/wappalyzer-validate-icons b/bin/wappalyzer-validate-icons deleted file mode 100755 index 185511826..000000000 --- a/bin/wappalyzer-validate-icons +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env node - -var - app, - modulesPath = process.env.WAPPALYZER_NODE_PATH !== undefined ? process.env.WAPPALYZER_NODE_PATH + '/node_modules/' : '', - fs = require('fs'), - fileType = require(modulesPath + 'file-type'), - readChunk = require(modulesPath + 'read-chunk') - isSvg = require(modulesPath + 'is-svg') - json = require(process.env.WAPPALYZER_ROOT + '/src/apps.json'); - -for (app in json.apps) { - (function(app) { - var basePath = process.env.WAPPALYZER_ROOT + '/src/icons/'; - var iconPath = json.apps[app].icon || 'default.svg'; - var path = basePath + iconPath; - - var type; - if (path.substr(path.length - 4) === '.png') { - type = "PNG"; - } - else if (path.substr(path.length - 4) === '.svg') { - type = "SVG"; - } - else { - var err = new Error('Icon file extension specified for app "' + app + '" is not ".png" or ".svg": src/icons/' + iconPath); - throw err; - } - - fs.exists(path, function(exists) { - if (exists) { - if (type === "PNG") { - var buffer = fileType(readChunk.sync(path, 0, 262)); - if (buffer === null) { - var err = new Error('Unknown mimetype or bad file for "' + app + '": src/icons/' + iconPath); - throw err; - } - else if (buffer.mime !== 'image/png') { - var err = new Error('Incorrect mimetype "' + buffer.mime + '" when expected PNG for app "' + app + '": src/icons/' + iconPath); - throw err; - } - } - else if (type === "SVG") { - if (!isSvg(fs.readFileSync(path))) { - var err = new Error('Incorrect mimetype when expected SVG for app "' + app + '": src/icons/' + iconPath); - throw err; - } - } - } else { - var err = new Error('Missing file for app "' + app + '": src/icons/' + iconPath); - throw err; - } - }); - }(app)); -}; diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index c35776024..000000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,72 +0,0 @@ -FROM phusion/baseimage - -MAINTAINER Elbert Alias - -ENV DEBIAN_FRONTEND noninteractive - -ENV WAPPALYZER_ROOT /home/wappalyzer/synced -ENV WAPPALYZER_NODE_PATH /home/wappalyzer/node - -# Install packages -RUN sed -i 's/^deb-src\ /\#deb-src\ /g' /etc/apt/sources.list -RUN sed -i 's/archive\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list -RUN sed -i 's/security\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list -RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - && \ - apt-get install -y \ - nodejs \ - bzip2 \ - zip \ - libfreetype6 \ - libfontconfig \ - rsync && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - - -# Add user -RUN useradd -ms /bin/bash wappalyzer && usermod -a -G docker_env wappalyzer && echo "wappalyzer:wappalyzer" | chpasswd -RUN echo 'wappalyzer ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers - -WORKDIR /home/wappalyzer - -RUN su wappalyzer -c "mkdir bin synced" -RUN su wappalyzer -c "echo \"export PATH=\$PATH:/home/wappalyzer/bin:\\$WAPPALYZER_ROOT/bin\" | cat - .profile > /tmp/profile && mv /tmp/profile .profile" - -RUN echo "cd \$WAPPALYZER_ROOT" >> .bashrc -RUN echo "wappalyzer" >> .bashrc - - -# PhantomJS -# RUN su wappalyzer -c "\ -# mkdir phantomjs && \ -# curl -L https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 | tar xvjC phantomjs && \ -# ln -s /home/wappalyzer/phantomjs/phantomjs-*-linux-x86_64/bin/phantomjs /usr/bin/phantomjs" - - -# Node JS -RUN su wappalyzer -c "mkdir $WAPPALYZER_NODE_PATH" - -ADD node/package.json $WAPPALYZER_NODE_PATH/package.json - -RUN su wappalyzer -c "cd $WAPPALYZER_NODE_PATH && npm i" - -RUN npm i -g manifoldjs - - -# SSH -RUN rm -f /etc/service/sshd/down -RUN su wappalyzer -c "mkdir .ssh && chmod 700 .ssh" - -ADD ssh/insecure.key.pub /tmp/insecure.key.pub - -RUN su wappalyzer -c "cat /tmp/insecure.key.pub >> .ssh/authorized_keys && chmod 600 .ssh/authorized_keys" && rm -f /tmp/insecure.key.pub - - -# Fix the `stdin: is not a tty` error in Vagrant -RUN sed -i 's/^mesg n$/tty -s \&\& mesg n/g' /root/.profile - -EXPOSE 22 - -RUN echo "/usr/sbin/sshd -D" > /etc/my_init.d/sshd.sh - -CMD ["/sbin/my_init"] diff --git a/docker/node/package.json b/docker/node/package.json deleted file mode 100644 index cbfe4c39e..000000000 --- a/docker/node/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "wappalyzer-test", - "private": true, - "license": "GPLv3", - "bugs": { - "url": "https://github.com/AliasIO/Wappalyzer/issues" - }, - "homepage": "https://github.com/AliasIO/Wappalyzer", - "description": "Build test for Wappalyzer", - "repository": "AliasIO/Wappalyzer", - "scripts": { - "test": "./bin/wappalyzer build" - }, - "devDependencies": { - "file-type": "3.8.*", - "is-svg": "2.0.*", - "read-chunk": "2.0.*", - "jsonlint": "*", - "jpm": "*", - "imagemin-cli": "2.*.*", - "phantomjs-prebuilt": "*", - "svg2png": "3.*.*" - }, - "engines": { - "node": ">= 4" - } -} diff --git a/docker/ssh/insecure.key b/docker/ssh/insecure.key deleted file mode 100644 index bf599e805..000000000 --- a/docker/ssh/insecure.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAqVo54bv3J4K62IDCUIVY7gF2iBOR8fub5c9t6j4MbsRQDmU0 -yxhN1+7fMCERcoMSelAb/SYSzKE8azLugP7hsq4t+/xJijCB22uriFhKMpu4ySoA -6PVNbfbIptaVo6holVIMRKPXTg1hU6lr2DWMKB5AlGmz7ZHmQgX9iBoV8PmMYOF5 -UpiwfokcNnIwDiCCpd19G/lT6FlCVZHZdeZh41FWke8oQgWevM8fdGJkZ+a7Lgdm -6A3WlvI0AIz9KWfXlXAOvthi4QlB4SvSCwRQbKdHbW5UBRShucjlce3hZO9Q6ROC -Ta1zgvscleKd63yHSQ18Z2+j1t5T3HJzhOn1ywIDAQABAoIBAFdbcWwd15oL93Hi -yVlbz8nF+2yqG6ilT3+2Bk7EfwlMPreOQTNacB0o3PwosqVNM2Tgme91ilEAAviR -JzJnR+kxrArF0vFzoCidW7hTQsLkTOeHwTxp/OzyVgKpwjrPjlMoJafqlA9xG3la -dYTr6kZvhISKGgQ8NHhuOp/QRO0uFaQD8l0kVCEufgqbs6gBY7aAkNf2iogSms9w -139zwsXeSg2Vm7Img1PVrRsRM5qbTNBMIim+9q4fSrqP+rYF9lU1p68IzmG/wY2o -0ElwRoatVVV9Rvk00a1qBGNaT39oVEtryIiAlXPno+KW5dyVx53o9vjWHDz44yBN -G8/EgEECgYEA3UJtj5ikEdhquzy1WfbZwZVmTCJLMefiVui00RLV4Q/r/4Uojdsb -L/QCAplpbHUrj7O8Lp9CuXSnUNa4CkrTidj2wkDWDFl1EBLJNz1zhJjs6Aaw2u1t -SV6ULgx9Y25oiStygkJhon+wlNF9HRSCFeNkBNNjpkD2gEifxnHIDLsCgYEAw/Fi -OHFvVPx0/DS3FD/MEJAAZaGdg8Zb2TCmCIVjoj0tZOTDvwKIEYCQ41vADDLlCSGg -XOgNXvosSZtezmJxnkzO3NYXE4XZ7bPVMamuqbKXXzaee3tPmiFaeZfiB4tj7uxh -tWQdUicSMQ8WPqyTB5wmcF7k3L4TzrjSLOi5MjECgYEAnsLYfI3pREjGpN01v3zp -2QbLZVvCGugpN3U4sUBTqW9URn+Ujt0mD+2FN7o+tC0K+czc/ZMXPJ1gpRe87N2u -Fh5RSSder3PNFKB2MyXr6rwUWZTbd+ufXGL57mTV3+/MIIjFXIQnLIN1AAOlQ6WA -hhYooXHQ8e1xMrFpu+nOwpsCgYAanYEf9ZiPzLL/RxHPOFM5tLW5GFjS+3Cicc87 -vRKpiPHPkJteKLPe3L3RhDbz8T3XHbAwrnySeBzn6qjYE9snC3vV12bPChFuDk1Z -L5lAB7g0ALFKSJepcfpeJdlX+QEcBRPIlc69x/zamRgGb16RXA6EmP8xVMhP/h7e -ZsYxIQKBgBqOaZNHwaG6PqP2HCjc1keH4wQVx9eTV5y4/B5FJbMeK05vV2rBHoxA -P/dXE85olj8D/9E88xJ1V716kBeONcKFdbd3VfY5bo2VBz+piOaG3EBQOLIbd4/C -KVtgOWqI7WTLPIgpXlG5MA801RwhVyk1phmwhvW/Kb3lWsK1vkOe ------END RSA PRIVATE KEY----- diff --git a/docker/ssh/insecure.key.pub b/docker/ssh/insecure.key.pub deleted file mode 100644 index 48f46c871..000000000 --- a/docker/ssh/insecure.key.pub +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCpWjnhu/cngrrYgMJQhVjuAXaIE5Hx+5vlz23qPgxuxFAOZTTLGE3X7t8wIRFygxJ6UBv9JhLMoTxrMu6A/uGyri37/EmKMIHba6uIWEoym7jJKgDo9U1t9sim1pWjqGiVUgxEo9dODWFTqWvYNYwoHkCUabPtkeZCBf2IGhXw+Yxg4XlSmLB+iRw2cjAOIIKl3X0b+VPoWUJVkdl15mHjUVaR7yhCBZ68zx90YmRn5rsuB2boDdaW8jQAjP0pZ9eVcA6+2GLhCUHhK9ILBFBsp0dtblQFFKG5yOVx7eFk71DpE4JNrXOC+xyV4p3rfIdJDXxnb6PW3lPccnOE6fXL elbert@home diff --git a/package.json b/package.json new file mode 100644 index 000000000..2148f0f67 --- /dev/null +++ b/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "file-type": "3.8.*", + "is-svg": "2.0.*", + "read-chunk": "2.0.*" + } +} + diff --git a/run b/run new file mode 100755 index 000000000..237565872 --- /dev/null +++ b/run @@ -0,0 +1,19 @@ +#!/bin/bash + +cd "$(dirname $0)" + +if [[ -z "$(which docker)" ]]; then + echo "Please install Docker from https://www.docker.com" + + exit 1 +fi + +docker="docker run --rm -v "$(pwd):/opt/wappalyzer" -it wappalyzer/dev" + +if [[ ! -d "node_modules" ]]; then + $docker ./bin/run links + + $docker npm i +fi + +$docker ./bin/run $@ diff --git a/src/drivers/phantomjs/.gitignore b/src/drivers/npm/.gitignore similarity index 100% rename from src/drivers/phantomjs/.gitignore rename to src/drivers/npm/.gitignore diff --git a/src/drivers/phantomjs/Dockerfile b/src/drivers/npm/Dockerfile similarity index 100% rename from src/drivers/phantomjs/Dockerfile rename to src/drivers/npm/Dockerfile diff --git a/src/drivers/phantomjs/README.md b/src/drivers/npm/README.md similarity index 100% rename from src/drivers/phantomjs/README.md rename to src/drivers/npm/README.md diff --git a/src/drivers/phantomjs/driver.js b/src/drivers/npm/driver.js similarity index 100% rename from src/drivers/phantomjs/driver.js rename to src/drivers/npm/driver.js diff --git a/src/drivers/phantomjs/index.js b/src/drivers/npm/index.js similarity index 100% rename from src/drivers/phantomjs/index.js rename to src/drivers/npm/index.js diff --git a/src/drivers/phantomjs/package.json b/src/drivers/npm/package.json similarity index 100% rename from src/drivers/phantomjs/package.json rename to src/drivers/npm/package.json diff --git a/src/drivers/webextension/.gitignore b/src/drivers/webextension/.gitignore index 602df1590..3e368c431 100644 --- a/src/drivers/webextension/.gitignore +++ b/src/drivers/webextension/.gitignore @@ -1,7 +1,6 @@ -apps.json -images/icons/converted/*.png -images/icons/*.png -images/icons/*.svg -js/wappalyzer.js -js/iframe.js -js/network.js +/apps.json +/images/icons/converted/* +/images/icons/* +/js/wappalyzer.js +/js/iframe.js +/js/network.js diff --git a/src/drivers/webextension/images/icons b/src/drivers/webextension/images/icons new file mode 120000 index 000000000..f7467b9a7 --- /dev/null +++ b/src/drivers/webextension/images/icons @@ -0,0 +1 @@ +../../../icons/ \ No newline at end of file diff --git a/src/drivers/webextension/images/icons/.gitkeep b/src/drivers/webextension/images/icons/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/drivers/webextension/images/icons/converted/.gitkeep b/src/drivers/webextension/images/icons/converted/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/icons/3dCart.png b/src/icons/3dCart.png index a8fc574678a7e4f3a84247f0c2638c978f916bf3..64ca4abc8b98d0a30c26066534ef0258b756a381 100644 GIT binary patch delta 1008 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 diff --git a/src/icons/Amazon-Cloudfront.svg b/src/icons/Amazon-Cloudfront.svg index a28de1faa..7454c8e58 100755 --- a/src/icons/Amazon-Cloudfront.svg +++ b/src/icons/Amazon-Cloudfront.svg @@ -1,23 +1 @@ - - NetworkingContentDelivery - - - - - - - - - - - - - - - - - - - - - +NetworkingContentDelivery \ No newline at end of file diff --git a/src/icons/AngularJS.svg b/src/icons/AngularJS.svg index 649c9f92f..003deea80 100644 --- a/src/icons/AngularJS.svg +++ b/src/icons/AngularJS.svg @@ -1,74 +1 @@ - - - -image/svg+xml \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/Apache Traffic Server.png b/src/icons/Apache Traffic Server.png index f5cca2ecbe971998b00adabd002f679a60ce7f9c..0faf78e0f6eb3e7955c6112f1da9c2fb8ae7675c 100644 GIT binary patch literal 5838 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 F{tuGkPB#Dm diff --git a/src/icons/Apache.svg b/src/icons/Apache.svg index 2494ae756..775665d1c 100644 --- a/src/icons/Apache.svg +++ b/src/icons/Apache.svg @@ -1,3 +1 @@ - - -image/svg+xml + \ No newline at end of file diff --git a/src/icons/Aurelia.svg b/src/icons/Aurelia.svg index 3bf9ad8fd..3d157b859 100644 --- a/src/icons/Aurelia.svg +++ b/src/icons/Aurelia.svg @@ -1,64 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/Bootstrap Table.svg b/src/icons/Bootstrap Table.svg index 2f05ef1f4..a5d95e778 100644 --- a/src/icons/Bootstrap Table.svg +++ b/src/icons/Bootstrap Table.svg @@ -1,4 +1 @@ - - - BT - +BT \ No newline at end of file diff --git a/src/icons/Clipboard.js.svg b/src/icons/Clipboard.js.svg index 007a950a7..aa2c564d3 100644 --- a/src/icons/Clipboard.js.svg +++ b/src/icons/Clipboard.js.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/src/icons/Comandia.svg b/src/icons/Comandia.svg index 9c91aef7e..24a7be8df 100644 --- a/src/icons/Comandia.svg +++ b/src/icons/Comandia.svg @@ -1,9 +1 @@ - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/Express.png b/src/icons/Express.png index e89a824d9cbce16cfbff7c59fa0cd858bdc6ad38..8f3461e69e92bd52061a573462093ae878df7ec8 100644 GIT binary patch literal 2362 zcmZ|R`8yP98^CeNmJUfOg+q17G9sMQDWYU&?544eu^TeRzDzWXu^VI?+bAPr?E5++ zyD+v%WNZf+BqU^wcg_#*Pw(}9ug`No*YgkD*Ar`OsLjKDlbeNwg-2IM!<2a^Fi#@a zdFC`#cObE_u+|tGm}@HQn5*boJk|rLGU-28GXOsUf}a8{pBh@J8(BRwveq!R(KNBq zG_}<-g=m{Wbj2jcJ#D#f?GLzS-T)?m|VSW-FzT0A3K<@ox2~@!_VHs-{D1o zqi294JkSXq$(MhP7a|xup!V-L8 zN&dUix5V;-;)()N1%XsqSW@+_l&QL?tcF-#L#n7Nsj4rnYACC2D645KuWhQRZK|wq zsj6?OX(ZP+F;VK8+v;1|8d}>M$?Z*)j%G?{b6aQ2`>xjZZgP7!rK6{hUwik5 zj-LL`-hr+@rorwH)SiB7@4!&sz;NH-@CWKhKXr6qXmntBY;c4|9ia`4ejFMbAEtd8 z{Wvi;K1uuZd3XL#?tc27skpmV|96Djj_76vi5a#ZGH9Y`r7)puj?D@-!|4aHot9dZES9BZhhbS zzWsgs$M%n%A3IFDJG*n}aVfO3aPESwI&dwUaDbH9~ zIG*WhJT(uZZ)6`@n_CF>shvL`(_be2YkF|?Bb4Cy~5ZRn*_MH!2C5a9nU%a&SaAj^paX&Zka4!C* znu0(=go!-2R)?e@I|2H?k27wA;KMW4qM*I*-HL_LLNj{Pp-0&1CHs5t^E93bRkcwO zj6*6l7+#uboA;1WBT%#|g-Wj54lZrjk^*NdD)jSy))xIMTZJ72CT~J;vM0_1zUW&H z->|LtwxKR`xKtp8_ z52m96&NT!fD;wSr18a(P-q@1L@Q1vrSH_jmf^c$eEhTq^-$oKpp+)NvM;)fU;a@6l z2Ci7KZ(Wq3&?U$cq?;bM!LDhpW-(2)b~8b$TO%JsQ26?%svEy;o2c!T?;X5X!XEg* zcyf&j&DeG%WO;rezpLz3EJWsByZ)s=A=6@?^Pi%HcGeNTYT+&-jMohA*!mlTS6E&c zQAk^S>K{PW${<@D^2cEkjULSX`Fqn`T-ve4c=?21d0JPQSTTevwS!Ic&hZ&ZE)RV{ z`TCP95AuUx`naB@wy0~Js=$vwh7>9m4t|H+EdTmM_MFOYat`MDClA+Gjp+>FN^ z1mKCFvXorhkP{Mrp+}4A72ct-196mo8u*B|6eM_FMy0snskW|JX}TZ z(>I4|WTW%4i-7OXw0~2Kyr0;O5|vAik+G+s0GZAzj!- z`ms=a&wbRYP?8dvMK30h%Ug+`s`4WGvE%&B`_x;1PyY>2UXZ=yDb-bFbU(V8M|2Q= zv@%hyMbR^1>w0XBe;rUqku48*%({!7;^8>gP{O$(6p*C$dCwu{74C9jKNKQ9VGQSb zNb)VmU=~5*CvummV)*TV3PpF0-eBp93@EmX_kzByq&_A0u6j_%KV$yH!>gAQS_$H| zQ)YKRSMH}b5RvKIMVl6~?k79d^OxHV#7aPNT|9&}al5|I*IbO-0$^7up5?0)uh^}- zc^8E=9ZW=zz>^xF2ngYkn zz_wW&)?L#204)Vqr#hbjDqxV1Eeztkw?$=(Ux7unzu?9*w^y@rgH9h{t0e~GMD07r zQs2ge^kgc7K()u9^f1P8$B>sM|qAoCgv^R})% z@p^7eBdN0xW(Qace6e2#YLConZ=*7IZ|3<*0_Cg>?;!2dtXT*!&c$;MJ|NFyhB|55 zGGzG+{$v*+rgThB`B@E2-njnw0MzlLk*}W9rCVk6afGO}m`KJA;rUQ`eN)bdid7<4 zJKVAv($w{7i7)50jTaMSO<@yB{b~#nK-KqPbj?nB#)^=0#L)YH`})6|{O0T_$F<6@ V#>k9|e9S))i>{`jMuj>w;y=8-#!vtN literal 4552 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 diff --git a/src/icons/Fastly.svg b/src/icons/Fastly.svg index 05ae7d05d..bb7a0ded2 100644 --- a/src/icons/Fastly.svg +++ b/src/icons/Fastly.svg @@ -1,31 +1 @@ - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/Firebase.png b/src/icons/Firebase.png index 41e5de9ea11e86599e5f43bcf8b86611de1c4aea..4cfb7b3af70968424624a9fd3b3cfb63e9e19ad7 100644 GIT binary patch delta 1325 zcmV+|1=9MW4Vn#*V3Bese*gwzOGiWi{{a60|De66lK=n&`AI}UR9M5km*0RF&KXzujJ8gG%*{-`~q0mTco2Y0^+n`8d(lkU6dVz@&H5Jf!W8xp6;SV4tmJ3aa z-k_n0sZ}JAOApSf%y~ZF=Xt(w z-gzA>gpS`0F5ZjmKH~gQpydv|&PGPG+ygtgA37HxseOZ__H&Y}_tQE{cusH|?toI~^iA~X&6Q7cRv_bZ@pB0d8M*{N)NNa~^pTqw260J4`vf~5n4y&lOG}* z14UT+1InM7a_#fjsUx_LUchxvA0YkkB>uw9l)%Ex=h1a9cptrEmrCwS^TStO>pVnT)VPIf^!q z9LBs`0tYmP!fnXjTZ0Eu`Y&npngNAx3iX5rhIEOMe>OzOjSx*u;Bw9_F4;xl41>)= z${GdO45+XGw-iEMXi0JfL8eT!t%}RJ#m+2&1B$@r2yN`tW49KdmmYw$PJa)O>nDZK z6xLe;H{r(0p7u^{~_eFHhtwKQaEH?Q-gmn8tLi55m_<#7`38LX!!22DX ziQ1=%e|`7fY6QN8tG`+7&#j-pH$aK5gXdNa2Vlx6tvIE(7T`h;7m_ig$)&Tu5gxA| z4rnv7305NjOF(`CQ~}}ZLVi7P07}SakY9xWr68LIm8{n{pTfG}AjQb$2wm)rhn5#$ zFWnEm+us93Caw3K?<(tpFMPVAb?<2imsjXOfAf8K#RHlPJrU}I%J)>)3kS5l`1-v? zth<5$-+`~s^)1T~QbYsjvcPCfRdbjQK z`JLHP5C|sOt3u%XKUBElcWXy(BzcD delta 1331 zcmV-3178B!yiCQEEk#-y+K10 zQ>#cKmn4c{f<_B8SW9iEEwpFO_ugy0KQGRi=}bGH&V+SyKGxpv^SmEB>m0`_OQ-J# z7av6Se-LruB+zun-efCRw9fjeRj(P+)5kz%`~8KLg!Va`#?bS z8o6zcBD)HL%)oX~fj_-!E=R{_O@%;rK3Hu1m6Y|M-kPU+(Ed4f> ze~(SL)@AJ63EYP-;X3D!kbZEM^x6qJ7l_||Y6C5>80s~U-Ms)8^ef>)qx=1&5spdp z_rd{u^Eg-D$6b99%AYxcHBX}C<0w5~rM)q&OB)dA&Z5x=vI_$9AcRbW8(}citQgY1 zl;p7FDMs&_qO$K0)_flMJ^hkRN9kF-}O|UlLjI`y52f;ZZ zv-?%bKO0%|6ASR(z2nGNf!ewSoOJ=W12noAt^mF^|3nCDfG2K50EKS|b%pu^=@KKYi;y2Ani#|7om+Th7sMF=n}&2Fe?ypp zYzkDIhg%9^PH0hZ1wp1lv}+WXcMFwS1P2s>%@A7HxhK~a&?}EXI!Esekn077&=A&L z1UKP^D-`yP5*1d2_g{2x7&;WuzO)X3#zk!WkqGJT`GDqyuX88-;26=s8t`5Pr=r%m zQg3?KYJqR!=Kfjg^{p4c*FlMvf57wWh66C+lvbV6wFO-0;zBZvG`_g^x5MN0!vSqa zHpY4cumt4CKvfWaPRMTt4nP^%6!Pm3Pzth1P}#b@;ZxWY9Hbc8455R)_1MY+_R7QH zJH0bNWYW3bqC9JcG zfN#SWr}C2R_BREC{mjeJX5oM)oTWp~l2rsk8`Rq78`@>rGWmm}#O2LqzVPKv6h?0! z#3cfuo#JbL#4?qgx&2#_`I2iYplOt1e?PjgyW}+V10!IroEgt|wkGpipUu>^VCC4g z>E388UxB1rr8O|}dK&Zz$o@a~k{l`BmeuDKNigU$~c> z7roo{$->@j(LEh!`Dzrg13;#^km|Q-ThHCNkp8te9Ea-T@2o5Cx&`LfhcE5Hca$xU p#GlXP+zFr%Qu}%96$3kyExGpK(YH4g?|)3NJqPEMSv8ZK1^#4~s^kCw diff --git a/src/icons/FlexSlider.png b/src/icons/FlexSlider.png old mode 100755 new mode 100644 index 9c264278f0ee44cbb846fc9f5e6bfa235c093470..b1cb7fcb7c915728c07c0af839727c423062e6bf GIT binary patch delta 331 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 WLgh~l_MrgJHs z>2!Lhg@Q#c!D4_SR4^nO(I!3^FVSdxGA2HNK!g`VM2MjY`k=-j(cmSRXi|ibfP_*4 zWRTmmrL>)PIzu~`b~@8DmvheEYkfYfJu_!It)Z@$efBzQuYdplyMLd^ga1$()}ohB zu#CugPsoB2bn#7Agkr%FPYGEF)UynCiFiv^Bany?6buj$8pRQ5JgbO6!Px}@7nNKU zRB28ei7{lVOlJY_14w=|psFZw3o+Q4Nwio-jYUKd1Rp{?U$27(q*#gsmVk#4fq~U6 zC3bD=VaLV}%74yK%>oBT&+)hSPH}Lof=Y$f7#AqWAG97sopprs9x z5^gEDVh_KE86Ct2*m>7>9>4oe9{AN?dHT7%80Roq#y_8YfH%gf-1qPkU=7(#Ux*|` zV0scp24TZi2#TU`b_8kf0-vG%`;lvJ1=S1tfcOlu41ZBLHZ;QDU+HE4v5%RYnnkQd zvy4}I`&iY{iVZ1V&0;;yOo8`Ni6T&$Kt@jz+Pff4k=iUFH?JeNn>7Y&3DcP#zD7(%T|m>fln!FF^#g{vc2+(1Z_-*C0g@urs!*>&Az2_L z0<%*PJh%d=VuC7x7^A96<^$C@n~D3EQx6Fu0A?AwEcoZQe6=-z~0 zd4K(Un7g?jI+sv_GS&Y+OjjrixXV^!x;Amo_8!!@Jf#I%XD7I`yPq)9k0MxWDPS?V zADZQD)UMlsRwm%kJK!9;tV3Hnpj3uJ5r4P59aY6Q`t|ufiz>!iva&J>>MkTge(M7ADBw(pipdW z=l0EA>>TPt#ZgmX(hFmC;idi4+}zy*K5EW4YG4`4UG3BC-ZV_7t3%thO#4948g(Cw zsu5vXl8_jK)bGL?CU za`&$p);0g=FAA*cIz=t(}yt!y1!U-KA-C-Va3LeT5RIH}B+;58vW=En&hJ zsMr#%6Vn_To1&-1F;s6ujGfOL?!N9(s$K{gob`rBjxFPsWQ=d#w)&!g|9@+(S+|i& z#~Jzt&VUF;mC5lbZupDRbN!9Xs-ZbCOxJyEUXIK<41o|b4vp7%dbovOJhg|BvGMjtUwAA%BF}8L5&ui}|Qp9+*AjLey@E%3PH_A3GptNJBqfGs zGM@P3^Xz{5Ic~o0N+^hR=XRQ#%8M?n`@r#u88ETT zH?q(R5hyr^s3HW$GRJoYx4`58#5NL)1q_r5D29`naPs{DUVP(8wr%L*w~zja8?V`d z$qUT>(Q~|ZWHb_psDFrtoWN3T86|H>G%}o>nqgvmlEfJVrQq^@PYhU#xB^ltL0db0 zC(m;4&wj^|fm8Dr?m0Njz`5#Dq>JPc6MPmM5+G!C(sy4Y@im-@lT7eF*P((2G?xZr zVOcZ#J{;sX&pb~SloyYT@%XDp2^R#D3$=teC5DGgoF*K47k?cd#2beVN>D+?M6fyF zAXqDuN(mt-Gu0v=^q*qyz&Q84Z~zrUv0%u2pzi%r#3cmw{66;XwQ5w8iM^Wl9>m6J zVs4_zCCRctwHC)Pk^*m@n&zv|^iof=c+AJJvm*El8NQJKm5JQGE~;rxQk7^Jm7Iiv z(YPmuEY0TqVrFJVCnn7hRa7B_@QH`qhJIkKA8I5JRi2l`xw$KzGx_<}6-du|v;p)| zCT!Q}U_h>F#pHvhEf_)&j5GM4gn3`cp*CzLBndL7>bx?3QWF0Kj6BaE?#BA~00000 LNkvXXu0mjfy^hni diff --git a/src/icons/Froala.svg b/src/icons/Froala.svg index 725e7ff3c..dfd7d0421 100644 --- a/src/icons/Froala.svg +++ b/src/icons/Froala.svg @@ -1 +1 @@ -Froala \ No newline at end of file +Froala \ No newline at end of file diff --git a/src/icons/Google Search Appliance.png b/src/icons/Google Search Appliance.png index 2e1f97ecef5475ec662564d82814157513ff3e5b..71bb47077e7397b70c02e2cc19218a7e3eb3f7c9 100644 GIT binary patch delta 349 zcmV-j0iyop3*-y1tpf`pNklLZfo<-=?x7H(<_?huyj_ngA_32>P@~n_14slo~#lw-1{q=c2)qv zZjgTgRRYw?lpB@30q zIXDyuADZ%$N!oC7As9cz7J$ v_3;x-A<<>xs@@eVR!yv3XUG)H($ZL7 zS~6uyecATC`{s9aq%bhZN35OHf4YBC?Z&lX3{vyv?0MKwT3R}7`mUC_3#vMW7=S7) zYirM4m^^i|t_(xg+}7ru(;FHZrdKr0Vd<=D2Pt64)th{E>aD38Jy|7Wxc65!?W_QT z-G3khst!Pcg4tDd^X3O;d|twg9zW()zM3^_R#WA?`Be)$wd5dSRV>CD!z#?o&d3nA z^uVG0b7s$OWocj7wP_iY(?^VC_wFU#M}K}+x8UXF7huLzz$n4w$H&9t w=*I6Oz{FgLEqyU6va^Ycr?IgET`(vB0BR%Nm%<#KiU0rr07*qoM6N<$g1jEE_y7O^ diff --git a/src/icons/Homeland.png b/src/icons/Homeland.png index a269934c4dba63a1cca807535b5f18438300a762..e8ca492f03fea5c542e2d79c342484fb1ce007e3 100644 GIT binary patch delta 11456 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 b5K;R=p5t03#)bL&po1cvw>Eu+CrAGW2jUrm diff --git a/src/icons/Kamva.svg b/src/icons/Kamva.svg index 8bbf89c96..0304de60a 100644 --- a/src/icons/Kamva.svg +++ b/src/icons/Kamva.svg @@ -1,212 +1 @@ - - - -image/svg+xml + \ No newline at end of file diff --git a/src/icons/Klarna.svg b/src/icons/Klarna.svg index e611627af..0bb061c85 100644 --- a/src/icons/Klarna.svg +++ b/src/icons/Klarna.svg @@ -1,12 +1 @@ - - - - klarna - Created with Sketch. - - - - - - - \ No newline at end of file +klarna \ No newline at end of file diff --git a/src/icons/Medium.svg b/src/icons/Medium.svg index f85a5519f..afaa40a70 100755 --- a/src/icons/Medium.svg +++ b/src/icons/Medium.svg @@ -1,9 +1 @@ - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/Netlify.svg b/src/icons/Netlify.svg index 370591793..fa36dd539 100644 --- a/src/icons/Netlify.svg +++ b/src/icons/Netlify.svg @@ -1,9 +1 @@ - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/Neto.svg b/src/icons/Neto.svg index a4fabcbe3..4ed0473bf 100644 --- a/src/icons/Neto.svg +++ b/src/icons/Neto.svg @@ -1,36 +1 @@ - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/PHP.svg b/src/icons/PHP.svg index e5799b153..894c7f342 100644 --- a/src/icons/PHP.svg +++ b/src/icons/PHP.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/Play.svg b/src/icons/Play.svg index 10925d767..098d6b665 100644 --- a/src/icons/Play.svg +++ b/src/icons/Play.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/Plotly.png b/src/icons/Plotly.png index 20f7b24d82a7b723e9de858cd93c02b5a63fadf7..b970858cb2a1ed7bf8f8ae3f9cdabe774421df93 100644 GIT binary patch delta 594 zcmV-Y0F>Ti}ZrC$!*fek0HE`HAaoIO<**9|8IC9xIbJ;m_**bICJ$BkZciKXE+d_KV zLwegvf80%h-B^j=S&H9dkl|yI;bf8FWs>1&l;UWW;%}McaGKoCjIQa9uj!h%?4G*pqP^{;zwV{K?xn!)rois0!tboa@2iOgA z`tI}m@bvug_5AYo{POnw_4xhv_<#NR`~Ld-{`&m>`~3d={r>*`|Nj5~|NsBAv$$da z0004EOGiW)n`wm}0002{NklvbLbeD1w-`fA~5}Ew||!y=vpL^ zp8!1ofF2D6XD2}4YCsV1A$U8KjxK~z}7 z?Uy}h6hRn;js?zsD87JzzxQ@C-az;GecJ%HE>uRoMf3d%Ld)sus%m0(=}NK?$%wH$9LzLAZ zN!dD90!`wD<*EgsFEnlUb6Wttq2d0sIi9~=1YrDdKNpV=bk~G`O0CMgUb)jZq56IE z{=Ku{j|W(5$gj2Mbqc^UiplrOEG${96ZVaS?B1U39)RyDCSEP@ai&JKA>2BrJ@7VzlWaCZR^Xs#&W z+y;CH1kfsZ(o$c4ex<;j$FqDdS?W#4_0t8SK&763ql{wuOO1yw=gIn-e2?Mwg)Ird zyU!KoiZPYCUE==;G`u}hE&jb7b+Xmg{d!Pci00000NkvXXu0mjf4pBPb diff --git a/src/icons/Raspbian.svg b/src/icons/Raspbian.svg index 2131cf097..ceed5e799 100644 --- a/src/icons/Raspbian.svg +++ b/src/icons/Raspbian.svg @@ -1,17 +1 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/Revel.png b/src/icons/Revel.png index f8e9b6ef5790e99bd54368208f02eab3cca52dcc..89494132da8c6b7490b4c2c9f8563d68ea0e96f4 100644 GIT binary patch literal 1362 zcmb7^drVVj7>5g}2(AOSF>YZ|w_vB6qKIka5(b5eGEiGEKBxFPfv65o%cM??>lMc zg&-`_(!mmeKp+FoVnX12z;Ns}gKrEO&x4c2jkA$IAQ1cBHXJ4hBFPRen%@lg)X#j( z#NNsTHIhV`j^Z5dS0QBMMB9W-Qy}hHO14Lvp zS$B6gU>F&OhK7JaE|-stj2KB23dQ*NIKWIzO@SluXf&GH*;$~14i^^}mzS5pTCdk{ zZEbCDZv!6eNK#TVBqb#UkH_cc<`xwd0VIV&h3$Z1q43huGN6TqD=RCjs;Z34_4W0@ z+z5Rc@^@oKel8d4=Ya(j___!*X>@^o0T-zB)y^1npwHKJpjB{zVvRb`?Zm{y-62on!TvaschJ$J87R>R@&jSGBtDPG<-ho7 zRzy(puM<5|BlbPv6U->twyBR)bhM_Gk$UjQg7lxy@K0B`E>K*uLJLooOAf8NzQIq& zsLx?Z`>(`EPdgqtVRepi-0YsORLy@WJf98PvjZyEnO>QS`(PS46Qr3_`+qs=zI$QHF-n)=T4AI z>E7c#cfLKLdvf`>`MB-N!Vl37lZR0c?SE27bBIJgb4i~=zE5aJOvT3ix@!NTw_L1q zo|nb?W@%-i4iY=37YSPJ6-&jnK%955RfJcZ1YMB$`!RxrdOc&#KiI|18AU5haPY?u z)Y=G9;xjkYf!`pn<(>D~o0v`L-gJ$7tYzmpb05(ADy_28I!t%Ds}S$*c6(^8@roD7 zlaG)hX}9b?Yrv&$e5DXM^}Qn!cz!=E68H+g;3vki#7y^FHoDl)fAiwhI>J9>Cr^C+ T(CB14ya0#*zaUJRPjuQ}Q`>jP delta 1461 zcmV;m1xotT3gQcp85#xv0047(dh`GQ00v@9M??Ss00000`9r&Zks&I71#d}2K~z}7 z#aGWy6I&Gi&Yc-LP^_iWszW&LVq%O7U25Wr_ZPT(?0q{o{tGT$8eN)5 z2=derqe;;a2|t4TsL+-U4KQWe(wVvUZG@oK@-E}^NJL?biAW^E{&NO6=SZbeP!t86b1W|} z%c`nUAP|5MLJ$!hv;gM1Ej(tT6Viq^hb?u~?*2r%r*0_}bbU2_aaqSj3SdM|R@2wzjacvV!U9Y3RDn zL!l7!`~4sy|XYY-0~K4d}&ap%q*+NRjHZPzdimQJV9*w`q#y1I6#vTYlZBw=@Q0BCAz zqC%m-rlzLQ-rf$6$3w%z!%jFHmT7Wwl53hqmSyqRuU}JtGMR*`s*WT{%DZ>(+#5G; zNK;c&uBK^hTdMD2W@bjjpCu7x>V1Y>K543(<5BhWj#GT0Kfo1Rul!{a2S5S zUos2>!C+8-(liYKU|AMaRYgZf2bD^to$K1y*H<&anKNgQ$z-^uX*Er0eSKZ|x&a0N z-QC@E;=~Cg5($JtAvlf$0B~Iw08p(~1puL{D$3LW16P?`G(atw|a-haU5PMm7r-FmCI#(`0xRPgM;G1g9jp!NYM4`*QJ4hzr?3c zpD;9kG{j8Pbie41NSd9Uwd>`m%Rsfdg^`heM6tMuY&OHMT)6_D&&LXd0?wa5zkM); z*XyNdG%DV|e@~sAo$z|SNT<_0o6VxPx0ls&)qNH4^yyP{c6RPqX@7q|zjo~!6$%AG zMC|6xn{F@|l(vn>wrwmdEC^YaX?1ng?(OY=RrZ`OwHAdCc=6&T-oAZ{cs$N#XJ@%( zS-5xa9y}fob$55OL?VH$tu1M{>nVx?S(Y(3HwW9c_ciKk7C=O3Ytwiv_L~5J3l}ah z$8mTx8fCX`-Qq1RE%5n#ZgX?}0mG)=L%xF{^k+F3h&`ZO+IzAO$U!EPKob_}bltD;mYeUCw8 zG8tjpwwRop+-1wZV|{&tepG@T3=a=G2a#ZDX-RBsZ2YhUyALKa3}fGa2+OjBBuV&T z3ASQzikOzivNxv;Q6Ua$A(6#!s=Uma~v&q}4jE0xMm{THyt#zq04E(?W10psK2 z)Y=-PVzCHSRdMK9@HO7Nd4q5`ELvMzNl_Fq#^Aaxs?{o%mX_UYHp~9_;}R)~vhS|w zpr6xBCWEG?COm&WfL4vT|2oN1cw;NYP6S)gD2J^vS|O!zMlcA81& P00000NkvXXu0mjfz;41W diff --git a/src/icons/RockRMS.svg b/src/icons/RockRMS.svg index 1a782b9bb..6b352f6ca 100644 --- a/src/icons/RockRMS.svg +++ b/src/icons/RockRMS.svg @@ -1,12 +1 @@ - - - - rock-logo - Created with Sketch. - - - - - \ No newline at end of file +rock-logo \ No newline at end of file diff --git a/src/icons/Salesforce.svg b/src/icons/Salesforce.svg index c5635099f..8209a8af9 100644 --- a/src/icons/Salesforce.svg +++ b/src/icons/Salesforce.svg @@ -1,159 +1 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/Scholica.svg b/src/icons/Scholica.svg index b35216915..d136a5b2c 100644 --- a/src/icons/Scholica.svg +++ b/src/icons/Scholica.svg @@ -1,24 +1 @@ - - - - logo-green-icon - Created with Sketch. - - - - - - - - - \ No newline at end of file +logo-green-icon \ No newline at end of file diff --git a/src/icons/Shapecss.svg b/src/icons/Shapecss.svg index 8d577bec6..71026cd91 100644 --- a/src/icons/Shapecss.svg +++ b/src/icons/Shapecss.svg @@ -1,27 +1 @@ - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/ShellInABox.png b/src/icons/ShellInABox.png index 036151609ec0516ff81d869e2f3224ac8fc14b07..3bb29f8c61efbbec8fa8f79b492da91433859db8 100644 GIT binary patch delta 217 zcmV;~04D$N0_p*f8Gir(0034IB`5#@0I^9#K~y-)t&cbTyNKyYWlThWjtT!T=k@7=v4uSc4dl`A~xp3{nElt`>NYM@s1pzYESe zi2jxn>-NApi)TK+Pzx;OKio&5RblJ~j5WX{4W+LOnKhKD{8B1^!BuSoA}S-2LqVF> zptUZmf?`0O+HjiNFv~Vb(FVZ<69Xd`3}YJx28O;3eb>eZ9TyxK{|F9k=$POG=VC~F TVWjqE00000NkvXXu0mjfA;nnY delta 352 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 R@{gef^|XvN^EK>F{~x=K<+cC- diff --git a/src/icons/SumoMe.png b/src/icons/SumoMe.png index b70b8f9356a22cdf36f88b0cb05077ffbab94d29..10f30c3bd73dbf40c773b478a5b69d97f73ee84b 100644 GIT binary patch delta 872 zcmdm0@vMA;BnLAC1B1(wu45Y&%Pr~|s{(vNT-#P3Xf)5#m# zPv6{r=GLBbxAy|k`P&CB-8*#U!Qrb9k6e9t`qtw!x1OB6`RMHJC+BWHy8h_Z%_pyK zKY4Zg$?JRd&)@$1{pa_ezkmP!`~M$^{$IHL_`>ZcOZQ(~ap1zr0~e~796WvF(P5xj zS02pU1$4yOeU~0|tvk`R{=~e!m*yY1HvizYIs2}*Z8%%L^k~Jhqs?oMcW=McwB~r$ z{6j!wUBAYreofc5i|v~)6fQkpxa4^2rVHKMF9T7~q&@L->yHIY-XAyjm}%QC)An6f zt=pB#H`sUYwe8+x)VP(sa0_3_R;lvMN;TV*Yq!Z&Zb#GbzqsFx#uBS+Cz&Vo&xMO(OvwsIG5>!^DpU2Q(%;&lmz(&18EWfGc!9E7azZbq>7%txw%zjWI|d-Mp;>T zU43I?V@q3mdq?N&EnBzl+I8go`3sk?U3>T8!{@KRrH;0KV_;x(@^ov+VbvkauS|dB&R81XKYuuJ zq5UzbW=0G1k10+sc@CPs&^WSd=RAig=MJbXTk0fvzJ&3CVaC+%Uk?3x`|Z|G*vIcu zl>LG8fTz`~h?w_`TsyPZhMnzQAr}!}U*vN6IKwyluH5;ReGinLoV+A)Ig;NgC+XUo zZ1Ma23^_lz*E;>k$YrcFzTlX$C!_AG0nhn5Rff*ZJ%xH@X*C}IN(4?;KhD%?FTAPA zsIcLPw8Zt<>(4r}GfuZU*1N-%Az_m6iUY~ZPd&JAc$II?REBh}2DjH<4<~x>+#<#B zN;f3BN$%>)mfT=ohlRKJrn)r-Wwc=5Z3}91X_pkcCY^VFl#rzPRTE7o znNFITWT2$!fY71{;z82%*@N4e)J3UK*gfR%TxQ8&qu9uXtK`XEpL1X5usk+`7B^2o`+0%119Fh zGu@6r?)%5jI1S*9tzJ81nZx4_^5#*baQ&}D9+HLie*t!PKf*6NTl*O_(;S*<4qN*f z9O0LpyHDX$K(eq7PZN1~6e(Ok?jUatS?16iUA?9O5-XK&PW{BcHCkEhpa_3neGqz> zDOS72`Ah@g<2!Q`>8`=z$99^-&Vi5BPIG9m_|Z+IySwXl0pnZ-GR11w)d!)69TY*M zmBsEK`L~Ic%C{OITdKm9(FM+EC1|EOG+GH>@`R)jfBJkltH8v34iFKB8Od$v-5b6K z(d)-yMsgz}jL&BwlvQBlY5ITsB~M6doPA|q$0?zK@Ip16O*zn=_dPy1rB z4!9Rc!5B$H&#;g*+1Nb;I|evBN^#h+k8rJr{-@`Y>n0nEJ;OqBjHKayAf*FJ>K3fM zdJP^ywzpUU`wsfrYOw^+Bgpo(SFfR@Zs~xR)lE>;Er`gKv&Zagt(`vj@OGNRV|KO{ zkt=5vbrW7zH+8^LSp|PlQ9)8R43|CO+~Iz5;DE#Z1TTBSIZ06sqN2i5S=9kic@3iS z8i=JT*rro1W5d^QP-X06&^DEFi>0cTrvaGfMPQy6L0BroWLWO$qRCesy8Rr=E}GzE zSnd%rC1BD;VA4e$Fcp!snu$tn=iI@d$;PgB4sZujCL6nY&J`&P`l3=>V^;Hjpb2OK fnt=ZW;O_wdo}JLeK)F^700000NkvXXu0mjf*TB+l diff --git a/src/icons/SweetAlert2.png b/src/icons/SweetAlert2.png index 1d7edfcf1bd93266e9dbe3fb076c8a3ff93ffb9c..bba68625d99e81bc9f4bc1509b00a95f2ac92e12 100644 GIT binary patch delta 43 ycmdlYy-|9D4jV^-r;B4q#jUrSP1rKnMfvAkUh$G`;?|!GK;Y@>=d#Wzp$PzFQxFaS delta 46 zcmdley+wM14jV_Yr;B4q#jQ7+P1rKnCHxy08RlGG@lua{+ad-a@O1TaS?83{1OS8+ B5F7vi diff --git a/src/icons/Vinala.png b/src/icons/Vinala.png index 8aa46505e9e9fc5b63a7c91fc4cb40e976c112f9..b453eb1883670371998bc28336cdc9162c0c0dbd 100644 GIT binary patch delta 1597 zcmV-D2EzIA4S)@hR(};qL_t&-8O6bUjMsGm!14Fz;rsOa-6NdxkZ^(t1r8{qIYc+I zbg{*DGh0gk)K-veLN(i*Bw=VGThgpG_#@X8*Fad}k}NG)iZUpta-On@&OkWeg1g_t z_xJsNKM&m>_s8va!0%|Q*Ngu*!4*1w?UwF9sKvQ+3#Hd{OMfm72YutYIVaaW!zJ`x zy>)E?zh7`>T|dJF!%p9}YGrPGIP<{vr?`j@Zg^ly;!2-$UfzL|H+d%(w$YL(uQ5&# z`H<7aVCKSP%5}$A4Kj|t>AzeuS5ANJLv!YhmruWS>ngSvnqf-1>#u2P-Eel<_ZJmT z?9(nh&n~r!2>XHz*8ikUBR2NaPjZq{MBt_9PxvV3ra#UbRMI9^h7Z`^M{ExM^ zcva9Ih7_u?KttB|%q0hFgF)u2n|6H;)>$MWq$__ z7)Cks<-4yB0)Nk-uc5TSiVQE!&$$Rmlfp1t&=UJ;xyX^)P|(0f*5t1gU$ShQe2W3biPtB(%uS#YfWRy?7zG7Y}_ID4t8al98nd5?N zJ(nP9k`DbXC}5cIYEU419O#H-FpP)RL-A zi9$!+rN#%v12jR>1kpGrP);B%gbt+nCnHXN@5WLTv)Pe@GQ=f8CK_9>etO?AnjmRH zM@P9Xq^S}(kOrmP>x^hE@kqH%%xt)fQUcYYcCz2657Q(`6U4@Mb0^$KL=L=R(3lep z8~WjbrAb+=Es6$8TV!OhvVZu&XMcOJLX#xTl5QuF2kp>-sr27FuO%w`XLR6%#Spa$ z>RI|y$FE-B#RN#2bYZCSJ5$NtrtE2p{V&?P+^b)Z%e*TxvZ<_h}`XjS%-gYAa|Aqemdltja;S|9t00000NkvXXu0mjfY;YAY delta 1711 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 diff --git a/src/icons/apostrophecms.svg b/src/icons/apostrophecms.svg index d71a5b5db..ca5fc0d41 100644 --- a/src/icons/apostrophecms.svg +++ b/src/icons/apostrophecms.svg @@ -1,12 +1 @@ - - - - 256 - Created with Sketch. - - - - - - - \ No newline at end of file +256 \ No newline at end of file diff --git a/src/icons/aws-ec2.svg b/src/icons/aws-ec2.svg index f6da9f51d..bb4f86907 100755 --- a/src/icons/aws-ec2.svg +++ b/src/icons/aws-ec2.svg @@ -1,13 +1 @@ - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/aws-s3.svg b/src/icons/aws-s3.svg index 70a784357..3c8c386a2 100755 --- a/src/icons/aws-s3.svg +++ b/src/icons/aws-s3.svg @@ -1,17 +1 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/cloudcart.svg b/src/icons/cloudcart.svg index 5d5c41cf9..e7029a935 100644 --- a/src/icons/cloudcart.svg +++ b/src/icons/cloudcart.svg @@ -1,24 +1 @@ - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/default.svg b/src/icons/default.svg index af0f6be0c..fbbd408a7 100644 --- a/src/icons/default.svg +++ b/src/icons/default.svg @@ -1,19 +1 @@ - - - - Favicon - Created with Sketch. - - - - - - - - - - - - - - \ No newline at end of file +Favicon \ No newline at end of file diff --git a/src/icons/eCommercePy.png b/src/icons/eCommercePy.png index 16fb0d0b9c711bded9e29975577a2f645dbcee59..ae9d304fb38b2bf0495e94d2d1ffe653bc251ea5 100644 GIT binary patch delta 365 zcmV-z0h0dF1qX_}W z@ja|5jdPBM?KF$ZA-3^S+{?Ad6KwIwR1qRg-9wmg(pJOT*MKZr(7I(dHNfZ`ln@xw zm%2iil{U?ci+2o24iGqI;0Ok(+XWbn9W+Qf2o$FD)rD8#t_Od#*m0@2SSe|z4iy&; zY1wU>XFZZT0wH@O4d&H1GKa7el6nzv?ZeX&##9OjyDF3HVzzn9HqyUT=a=Zs7I$N8WD-^K6^8yF__3n+%kvW7UF zc$pqq>B>QDh_DLQg?#wbXMJVU#O2@+{0>AsfH-WgxTrMW?jb_O^#5_nTYx!&7 z^-?gYOwMjb0)O@iWgSX5n{%ca00000 LNkvXXu0mjf6i%u@ delta 369 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 BAt(R< delta 849 zcmV-X1Frn}paaXI1CSXQ1^@s6b9#F800004b3#c}2nYxWdVXG9*7i33UKcq4OQB0! zQ;S#n<(2dojV<23v(M-H#7o&P0`|GRO}+_xb51Hp{;hS!tNj}IUTR@7)~ zfUH<1W0NKp7MFFG*v-o5WcIVSA6z4mbNWRn2@WKo8<;?iI;QhPf0TK7-B5UKzWi!t z$bGN0sxER)TZC$~wW!frkL&OdX#&~Hz_)j~m8j7+rqFqm_5hYb7xGWbX-t6A(E3K2 zK0xPSt~b>HbFxVv;OBH^DAfS-f8ziE413L~b1s`$--!P5YXEvjvQq}oH*SqNt^w%z zks5&YjWoula}Edaf6GR`4&)^rpvzqlGyPEj0L`CoGA|pG=6q~An|_`2YXB;4&*lTH zh7B~d+E@)o@7bejUN-TmzeqFou-sR>bDT#2NJ8!XyVI?^gPvIvk6x9YXjk-)U#I0u zX;kV>>6=!-wR5y%KoT54+rb6=vXQ56N~pXuL$%#UL9YIBe;cVkeluO}0wx0DVWw?J zLeKy-#k1-h%%gKKj~p>fd0~Kp++{50u*PO?@gmOed5lhF6AZ<#AB(7Yw#mTG$(Lc= z!Xk!s3(zkc`PgHPACrzUjGI)I%urqKBS#Bh6_g>m0ehsQVXv8CugLEi6Q0@V&u5~t zh+!UAcql9Mf0JR{ie=&ylp%@$CpsO^YS^#`H0&`a1XNZSpxQpct$aD2SrD+RJ)tBN z0UadRh`79>3gr>^c1oNy$C3|lU{l=tO{pYgqBfuP9I^lN%$l%>YkFypR1jzenz1QM zpw|^kLJi>9xsss{paYxo{@_F+ZFv!Dk!G=9tacr1D`&(#2sp7R?s&@|@6RZSI`f~? bGY9w&v+g4fe#Df_00000NkvXXu0mjfvsI9< diff --git a/src/icons/etherpad.png b/src/icons/etherpad.png index 8cf4ddebf024ffd073e1f39d2e8ea02ae651493d..58211c95f363c8ecf0169ba0ac8faeae48cb716e 100644 GIT binary patch delta 453 zcmV;$0XqKi2h;ugK~y-)ebY@SL{St6@FyV_^06QvAtgd7 zL!ubsHO62=ge)v4B?~rol7;e-k7P9|NtCjbtyxH+?-m~AO`@+!2#byH$wn5P=Dk;m45+z=WW}|njbq10cszT zugfJRfNvmpt9U4^0mM{vD`5oyoz0P%p+S1A@?-%30KUYSggIg8`ahVB$uI1n9FQbh zM-+D*N&Eo74469O*hoBv6ab*VswJnh#v>qaQpdQjKdkZ9P79#HWm|6Y78O&M?*o{z z$a;FslQ1sK`+snsv$U&aZN>uV(>s_9bAR4DELKi$JgZ)DZI@iwOaOoRvU8uP@~t*q zGlGxc@A0a_<)_NW!L$Wg34x`(K;@9#lYesKgscS00z&Ii>_MFchEe@xp!2jLA}S>< zymWi?PDsE@a#7qo9Nf&b<*iGAHj%XYET~evZ)KFoGCrI)cl$||pu1r=C>fOCfm-+A vWUp%%fNYXN<9>U5lUL|M{x<=Fm;4uB7^jYRp&B^+00000NkvXXu0mjfQIyXK delta 998 zcmVt_(MY05 zC?Y`&L&!|6gieKr4t2BcMg0p=&>?S$P#p}4Ac8UyiH$;%4uytN2nJ?~X{G7z%=``u zB3Zi0?;RF*WcSVIect=*Ktc%M0YV6b5MvA>`VOLdf&;Gk*ZU>2#J>_<-VRA&l|f-kv}pI6gkE6tEr_l?#Y5rYOqm^&*7)en0pV zs!PQEW?7aHB9qA)8yf)t>2$iXNq?58JO>m-1%ts{F2}O0SS;S%-TjvTZ=v~vL?xV` zpXc-W_V)I+wlgwZg+2Q@72{6_b*ppsnBl%)UJSYi_7J5 zI2VyaHO6>-eH}t*x7&-w;>*j6$z=L}hMmXb5sSsc!^5qutz%2#X=t`R~$K0XWvgMUmWV;H7(1;t{KVVK|OqtU2DB2g-p z2%*wqp-|}W?B7_jeczb*M=H@1o$qWq*t*or*^?Ik%+0)Y#3WZ{^n8jkL zX{2frVT?5zO(v5;2r&#ZJ39*i(ChVuLV+9LDwV2a2ux2;i$o%;)k@PeLWpHqKBuD^XVcOKx$D!@6Zs?l17v#6 UVo7^g$N&HU07*qoM6N<$f)Xp^MgRZ+ diff --git a/src/icons/gerrit.svg b/src/icons/gerrit.svg index 160dd52e3..1b8d4e217 100644 --- a/src/icons/gerrit.svg +++ b/src/icons/gerrit.svg @@ -1,8 +1 @@ - - - - - - - - + \ No newline at end of file diff --git a/src/icons/gogs.png b/src/icons/gogs.png index e64bfcc2e4abd2fc0360a1989a0b5f37f0f521f2..dcc329ca7e990bdc0e5a90923afdd8520424ec8a 100644 GIT binary patch delta 1300 zcmV+v1?&3GAfz9#e+rY43MYR624YJ`L;(K){{a7>y{D4^00h=aL_t(o!>yMIP*ims z$3e&g#z-KRZbFO@(2%#6BCwedFCkoW0Xi^ziNWd%FeR7u$CoKwbpg?n@QW%9 z9PSHnedc`klWx;QKuF<3L0-&EuTvTvwG*PGHz6!Yhp09WqO^EmUoa*weh9(OpFkWF zq@Dnu>!T%%@O_?k99(}iILsH~6S0{7_ZoyFb(q`44{w6soQtu>EC{Y7OREtXAcg1u zj?xPBhInHj#E0;fPp~KYzC4Tv^%qFs7hq;$Hk`R?RVBH!{VMqPFX3k9@xc=ttZGl% z+thwwXH$>pz>UiCx3yD13&-PWg51#(<&VMoLX7wQgZ{f$G0}gVGf$whvJ(7(Mv1^o zcM+OuF2vH9YY06;UzPc{RgpmJK`ur*Yi7f4l$2q#wGyJCTXQb}rXQ3^F3n@qz2%=4 zpfhg`^1!{Hj$wLyXg12t%?({mf1vQY_mG|xheth?6kd$!fs%PlP1WpCc(+CPDHrID zkAY~o3?1dElG1%8r|!qSsvL;;ohXgvs zidj%b%h7-P8;L|)>1niR&9x~jj%9vwsz#~mlV zHuv>jOGbBol3YeB&SB=yEC~O~M#ZOx(9NM^gXMoi}=iu@N7={i9BReQOtUpNmOwi`a1GalwET*g;1x#2tu6KA;(2_0>1oyi{Dy29& zIx^@GYX~D^y`!|b+1lEMt#OHjrkRFp z_9Y{>S%Hz6SrKtv(zDI-*O{_&4Opf>tTi$D!qD8}eJ3ZUXgZF=oCM)Om=gxXN_hec ztHD_6%B1vV2O1NmvVklKE5cgVGvCb!maKvXvg20D#?h9S_dkyGVQ1HPd<_5q000O{ KMNUMnLSTZHHhIJV delta 1469 zcmV;u1w#6yAI>1Ke+mx3MzjEfJsC_R9M5cmsxC7*BQru z=iIsDS!`pQ0fz*$$WUXOAjg0~B&JQAJd`Mf)@l+ZrBX{a3d}D25;j<0ng^#Z44LzpXL1)KtSvK0l3Xg486Ah4uf%;}6FOXuRqEkf(~Jxs#U1Fym=su=;I1#h@+={uvjQmEdyxJoemY>`nJ|NL z^LRaG?Q$X*tfHF9C8ZRH_kY0J>M)6kaoR@42KPlfJC&s|g1xiuC;M}`VD&`GkdidY zMWBB;z^p&MLg9T&iCyl*iH~7V5jk||5D!$BL*jb^!9wONUA%Q?$N7JI*`wZS?~3Kh zf>b5}wID*-+dGKV|AKINH7EOnB&~Zf!{1HHtY6!~gXR4riM_TSTU>Lihx4TQ_9Z)V@sb{ZaflxH^7Q!yvR#(Qe;?>lyDy%I4v zZerTK;IeLMU6{2OXd?`*uBLn1WGE1Up+_n|Mu|bEf2G_;c==TSjT^X z*I(h$q?^vV!D%jq1=aUe=resiCZh|KrTOIJ1NcG#LPdp$q`27j5nZi+9$nmOv9-Zy*A2~h9x|*aUGII#`amvnp;j`S=n_ETC@LyFR1$L7_NUx?;ZtJ zm7gE!m{H%XD=Vh+v#%JrI+}LfaZ?OlxPX&%aU7SF<6w-*b?n-yF`xpL#?~q=3-H?| z^ZEE6pIi#Wlh`BUX*qVb3pF?lgTn;k34BW9Qz|`c_25(&)ck4LqW9ifUinbg0MZ%~ zPUZnkqJZD&@r z^bUN>?Zc*}R3v2SZQne$_IHcIfs$P5lrN1qF3-2M*L~D`>C~jo+tOp)*1GlWj`Qw= zWhIrB#i7z43&e=y^5Tj1`VV_AoxJ7J(<0i40gmnJzBo{z)%?b}rSpG(D2Nf)<>gZy ztNzn{v29vW%Chgf)`6k+wxN;PPtGr2rq!MOH5heMymqo<%|Flgf0dyg#*6`@-gp)Vl7NXuqqp<|<@JVur@R;_ z0cQFA{=y}T7a!c*(KldFA+1$Vp$bsgUNJKWNh6XlB5@-oX50S0drM1t#F&V8uJYQH z@i=*VGm>aDng9~DwY5Xu!P>Km5Ae;4L~QTfnzBCi;FQNM;EExL3ph8{qS2__W^w)x XR{t^XoYt{r00000NkvXXu0mjfu3zSu diff --git a/src/icons/gravityforms.svg b/src/icons/gravityforms.svg index b2c4ee7c6..43130e50a 100644 --- a/src/icons/gravityforms.svg +++ b/src/icons/gravityforms.svg @@ -1 +1 @@ -gravityforms +gravityforms \ No newline at end of file diff --git a/src/icons/iPresta.png b/src/icons/iPresta.png index f493a4650f9814b00771571b0f81917865a1dcc2..7ab9809ed3d54eff6c0005c3724d11aa59256979 100644 GIT binary patch delta 1845 zcmV-52g>-wtpV+<0kBX{e+WrLK~z}7#g}Ajf)v;&KYD z6>;Qt4k*@YD@;*f>qbm$jJ6uvMw_OriejOzm0K(nWR)PSf(3NlSc-tOwnfFRY^!q4 zz;}P|%g*2kDC|Ez$tQ0z^FF`t=Q%UO0I=r?d+q}B=gY?7M!1OOf6T&8&X~D^`7VVG)DaaD3=~VyS0q7y@meC1h|thZY$FW+Zvig~H?@}AF7T9neeDk-f0w&-l$<5>T!#Lmpb+clWwqguj+)bge=sn_%fir#>s@4(t%ajG&-DS*4 zD0j7>j6Z#$Mjeerb+U671Q z6h*v0B>@k2*-QfqdH3#(QsB}G4CZ=c=-N?Crwz7_;O_ct{N%X`k1{1tH-}@el0*t3 z)<08Vj!>2_633%E=QW_z2dd7h2}3$NZ=<2%I+~ikM|b!A3E$~Ts>F9}9sV7kfWh+; zs4j-1zc9jye`aH10h<2hW;O~aV`%Ej7XlrnbUn?l)1Rdr1-@(1&@wLL){cs+h0PVg+$R9qvzgD_IG2ec;qB61==%o3jO~3 zBSb}QryFA_UV146PEL^!iDGyh9V1|5 zF?=N~Slt-Lc)nfD!wCq5^W?C1h(_ZlA=LGku{9l3(Wp}>+?yY*hlc|6z7C$A3SNq_ zMdKvCtNRw!`Vw@_NXHHRG~C}7f4(O}&hEYS2K)7$Q8AiI%VIF{U~Kvi9XbttfBipADO>}$FJ{eJjqBGtwRQekRfhv6 zfw*a@#7}}PTsVFZq}*>8q*yfCDtUpQ1%lNG4oVss9#)TNI&R&15GK@dIs$I4Qka}&=SKC^U;uwgcS#kK;CY2jKI*EtYso3kZaStcZ#mzuakP>ROTHEpMxA$S@ z%;0GWxbgx)IB}v8xgsl2te*Jzb!sf8__f z_+khwEmuw|!7UMY2XL2Afd6KwR4Q%%OaHn8efrt?nf)5%iloRCMwVrYq%3c4A}g7@ ziPg|&kYE>G4EV+%z9W@h^09qbDaD9`LKgNRx zy*hn9&HS9i7*YlPI4w@ZVPVY2M}#qqgG3l7@|h@NVu7ZnCiL|5j1#G;xq^cS^RRvU zU$JxN5oBeR^2_vOD=#bO!>tX>QRte8=jFOSl6PZs`| z0A0mF$s{n$7b`3%)E46K_VGbR#txi3`4yU*o6*tHfwmiMsH&>M{{0^zBqVg~eLV)p zKiDAGMfTn)7X>>cjDDuTf9)p)3jQ|(28Kq^dqH1EhOrqiGB%+NXsrAB3_X~bn}Zp$ z28CmgZ-qw^ZMLU}YXmTvfWCntOiaySVrEX5@j{G_l_r#vl_1F$^4D%*fYX40!K-pj06fvpn%WM%P*vWLVW|HA}Xw*m^l3yD`$u@B8!M897uq1 j0+85U}nOU;FGOYt4gveC0;bX{4wGc+|V zQxX1G2TFU$lw7Rr`G}M}FzlfTUJ%{UfY3~uf{hn;2M%=IA3S9M6VAgLP{K!2F>hZ2pYdp32FpnB0uUcq|!8+S}-ZobZi z3oW#@bz_>6e}sg%(ZwbU{7)=k;GdIe+u48_^y4fFW2AUbs6M$LxQVz+3WQ*JN1uG= zJEdXLCwD;pPcXAr-!^dn{tC*=D`{@NN-!8k2uV^>JoD$zV)N#wC@Cq5jm_Azh923@ zmETm5_Kz$k?YM@oF!)aNid~8aw}LRz(+km>-*pejf1K|wZD#)Z)sVX-HlVk6fK8ir z^6IPa(ACw0&u8N}HkM@&3Pm`1@*L&ml?VZ)rK2Dc*3F~&@CoetJ_e5kFf$`r@rwsP zkx5>&k?dh4DU4)=k)B?d8}Y>JHX*+Em?C5S&w(TWA`zD-pZp;oeDDdgXXlWTl7wj* z7{<_Rf7=#mX_K&Ri}&8E!m{ib2n)eLK`O0(s3Z_cyt_i-U@PLMFO4nS($dD>y?oRv?NDM3KNO?S?TD16Y$E zj!mwpsG+sBi=?CkCc>DWr^w7qFi0whRyUqR{(sgOVh ze_j~vOVc_b5c72Y{ADc5yf0?6Oq1T;0U8=E#cXbhkE=-@?Q#&u8|ozjQU(0E!|;$p zJEhUW&`OW8b9Z+Swr$=wy=tuqg~Fp{mYhJuXK>9JAR;w#m@cO%V^zKBzB2qRKx-*b zu?mfgbMAWR#&td%pJ9x4&7QtqLj8mEf7mYFMhIIOC?Kj8t0T^{V+xY#(*lG-(ff>E z;qzH!WK53PuC-q0#?2dG8?>4s;*=y#3C{bx1N}B-WA1Tj*#aEL!gbx-A{tX#NkM04 zKUrA;mMxnbvp1b@B;*ZZ8x}W>FukSC$yff76)I z4z#s(@Z59jh>LS#wxjP?kSY_gG3YTu`qRXL;(pWFm+VQT*5hl!*IwI<&u4S>YR8x$ zgb)~pq@kgiveHFt+qNfGG0oAezOa28=}5AZ(+O)A3-e_| zM`)GZw98&PWbeII@!GY^IDUK&D_1V2wY7`J#w%R9bd`%2zoe<@3c+B6ty`br!w>h| zcKCkv<{O;-=mgIOR^WOr3U+JsNr5C@`#?vzYIJkgLwM@cDROdhNJ&Wnf1s#n7KaY) zrn>qJb#+a&wRK}z2GgcZVfpfT6co(3ZT{gyhuOYmE9sV>Jp7a35SA1!5Sux;~<34TI;_lrG5*d+(i>oQ6vIy z0vD5gKmZ7h@QK!1jNTR)Q6s`MO?gY5j|iIUTI-L2YM=!`>4}q=c+l7L{|o>s4D=-h TnmRZD0000infusionsoft \ No newline at end of file +infusionsoft \ No newline at end of file diff --git a/src/icons/kibana.svg b/src/icons/kibana.svg index 419dcbd87..595a80598 100644 --- a/src/icons/kibana.svg +++ b/src/icons/kibana.svg @@ -1,19 +1 @@ - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/mailchimp.svg b/src/icons/mailchimp.svg index 2456a7208..5831b880a 100644 --- a/src/icons/mailchimp.svg +++ b/src/icons/mailchimp.svg @@ -1 +1 @@ -mailchimp +mailchimp \ No newline at end of file diff --git a/src/icons/mattermost.png b/src/icons/mattermost.png index 7375f3e6192a48e42fc41a320651f2b2ca43d279..cca83f7a0924118cb2146031538abbc5a20d4bd3 100644 GIT binary patch literal 1195 zcmah{eNfY793PAtkZ70*_&ykeF$Np2V-R~`V;gKRgjz`0vVk(tNVuRFgqU~nV&Zg) zZUrhv@?zew>&yeAK}{+nE`mrXEe;qKgj^gb&}aSb`nT`h^Laks&-dl|KF>YXsuZb* z`xbW+iR2-diFae)8WQN%ZYT}>_nf_--o(@x zt@9+3)2d35Awh^tCcC(}P$(2%U*FKsP!5L^78VvB9v%@95fv2`9UUDL6T{>2Vq;_Z ze7;a96p2I$2?=7cI59C%DwQTBB`FjNl}e>nt1~k*v$C?v%gb9@S}YdJ(9qE6=;+$o zT17=gV`F1iS65$OA6zskDJiM1uQwPBadC0&?d<}AfWcsdgoKz(rog~JaP)zw*Xy-f zEd~n;3PKc9ak*TSV}P`@w19vBl*?o?Hk++fDp@QRF)$FLMn*=0AfF(}gouH0J6z4r z&o4MQn8{?KGZ2TOKMXGbL_-iXBsenRLWB`H|G7|zC=iAy5QUhHAVBm75(k0fc0ht4 z&EMZ2hymzyIyejj3J_IjNGRy}Z_ojF5E_jJf?E&>0tH8a5ak3R5cx=h4wp)$!Ucgc zB9}Ph2Ygt(J0%_a|Cp1*oMHGd_%5!luI}sBZ+v#Mm(SMiR9}C300S?H%ZK2lqImI= z^o$qxWM%EuXmfIN^K?30etyBhL$4JU9xf^=tE@Wu?s0>`c-~}cx^VH*<+hG%*RNZ9 zZ})%m-N4NEBrfBZqlaJOwdeB(K4zs+^{1J9gUBa7Mg%VO!-)k(X# z?6lXw!-1~eSH`ZU7aduBEZuR%dT=l%Q4#1TtV%ijQ6A@JdTiH*M?0-?yxWXC_H%ox zJB6v5vWMD>`yyof>72?PwfvEyk%HkVrTF+XeMvBXVZk#uzLTu=kbh!JcDB|YN?z_^ zzfk^GINhvcu}%%Tw9>MhE7PuNzOM19d-9H{ z)$O!={>=Tl6FuHdljctc6Ge^wV~xCe0sl_YEnDlUqF1*(QOsp9lm`yjkC|JN>GzrD zG1_$Y^e)Ta4clhNr#srBhsJeAEv4G_n}ye~s%!T0ywRstc>c&e_V$Ej@v`XS#qT9` vKb(xp(evYL^`F&Pm$yq#{Lx;?9qZqjv9JIG*$lq`8 delta 1298 zcmV+t1?~E)3Bd}G85#xv0047(dh`GQ00v@9M??Vs0RI60puMM)ks&I71kOoBK~z}7 z?N(h#99Ibg zJkQhe^75Y)MLFBt+)Q*`2LMDOk#n*vC+xKy9UZ~{9DHPCgpnkFX@KW>DhL78vy_u z$DyvSt|Sx+{l)V78cIts-^Mq@$Uh^vMg5DbuBA_<>lpwLu6(;oi<&< z1Ix07o0ijmp%VbOdGjV1hM|NI0Kn4Hl9H7G%d)#1&)&kq!aP?H#+7E&nJplK}wue7;w+5^!Z3Twh;*#r=MAa`G#`-~TnkFosQv5c12^)YN%5wymv= z-;C^*1TvY-pUys~l)euDCr_RP0JOKa0|4&cz56bI$8n`)Wo1nzB_*QI=W7Ijo}Qi! z{t}7A1)IRy+SN=r+BfAr{o(MwB9OWNw{Y73?G^-L!7vXfMPe*T5& z>FLjNK8mZVsxUDz0a=!>t*oq^$=7p7@K)3me8%ga|R%i5L8`OmWKgZ%t$ z{7>WY_|>e~?IumrM0IsFVzJmYLdd>gF!%u>#Mp+g6$}P15kmIGt<807*qo IM6N<$f}r?#ZvX%Q diff --git a/src/icons/meliscmsv2.png b/src/icons/meliscmsv2.png index 39ec358a6a4db8bf2b9c0474bd2b7bdb12478baa..c545b2882c111dc67729a114e3d8e7e8377e7b13 100644 GIT binary patch delta 1731 zcmV;!20ZzjB*r3;83+OZ008_L?W3_FQVNrW3MZ3t3KD+?gh@m}R7l6IR$Yi)R~7!g zwe~*e-aB`aOp-QfP@kXL4bgy&1AF(^@i>6~Y=t9tx>({$k8`Xo;ZKzw0rLL zXLHk8Umq@?IKA@L`AIrE=|&QX%qjJPg@DLuFu;Tu`0m-Rx7kK-zHUtI&i;SQ{NeKY z+5aBgz3bq0b_EsnYm%g zOiiRTwVXGJnf`1icluV}K68JnYwf{Lf99OEiAnDm%nE7oV)w>?TY|3Z56t@ z)LQ_w4w{B-hpDmDVQ!;I=C<1QXBeBVl$*29Ji{68zwyYG-mY8cZ~Vu@KV2OJ*Vkry zJ$3tSx2H`@jCcchT_l zOAD#NXt>d~ZAGZbR*NL*JsW^|Zml=d>-M{y*UVZj{ z;*L~|V?;FsP$AYyFT<+Ci$W_9C4vsdh@)0yID`>oTyHDKzy{DDi{tl4AxSF0+#n<+ATYjGjFBc`d1rHV`(#WHCbn270!l#WTHdZj zFiG8a{MuCkny7#EuC~)!AP^rE$;>5i>y^01nr+^stM9LkY4a)^yV=~KTR6i17apdB zCdKRx^LFd;dsmvI&Bq$`uS}N(t-N)_vL-XHw{CDt99)bl{;bm&6emKh&sldj_ zqdJg(?)wiOzWsJa#PZ6@$(LU|_4MB^pM9;wc$=0VP8lab5|Ue<+cSULZSzNu-E`B< Z{{vneiaM#sP$d8W002ovPDHLkV1l#sM|J=J delta 1957 zcmV;W2U_^XBAXa zebI-$2=>VbmHJSNB9xjuXiIHtDR=>EnUFMfa%-E|PA)TNX3p7j*7`ml_MS^8iC7DM zunxmM>+Ju3{nvN-kC?lYYW{!xlOJ>PsV5non?)xz;=<-|ftu#I0~yBwcSz=#H_siI zc);7=)#e~hkb>^+kMOZC9p#IUeUD;#8nNX5%ZDFg=?}*Vr6LYNt_NR@WQK{81>6NU zAt7XQT!iF;c>|ps93i=3IN2T7ij}%19{4!lfB9wN*;kG;e)c$VIwF4ts&Z2T4g^(1 z91*ZAxHd#Y!D#=+$$&a!7X$%!1jAj?2=Vj@{`8BV5-+^)BD%GM21iv;KvxNPBQYWf z;O@9PB8{YiVlD&(vF6ml1!MzZmqsZZP^y#}_WOiny#D-)#I(GGS5>oJnwM*Pc_JDB?=MT0lo#5d;w@gg{h{xC*L@B8aTsUUPr7AA6$oU57$f3NP$i;5EMki(Es6CUz!MAQ7LKt( z3W@9$+mrE`ZXkb*#|VwoGu!q*>vg3#&Gq2R6KzhnNH zrwN6kCU~1mF(}tAUtu_Rm0Nf2AtC`SD%^4l4l3)d$6bGk9bw1qy9s?|;L3_^rN3`K z!#8Ir>9DMc!S4O+zGWAAGQohsRF}D~6NyX;p+c$an)$acva~oP21VUbi2*AE5=$f& zNKv9i(XJ9HOKOKLTes2ebQztSr5^*gJamMl0Tbg==yK%C4`Wy6$n#g}bOsEjr;(yV z=yr*Pa_xW09G7O#u)MU0IM`&hf>iJrAVxey2ocxyWg(J6VC(b_s;L39ue^$G>$ByP z_tWc5;Zqgw)R{XE9OUg&C%JU)3?UTs22&JehvnrF^C!=+@XjR^Uz;^Sn~IAf1u^z8 zNlniaS{CchK~QdUq_P?mUAkwZYVL{Y+I#CzvY)1#t) z@DT4#j0YZkke-ZLdhY^dQ2MdUjvd=sSQsJNl;9eouManYCI_fm@K_+R#9~}uMZtckN=Rxp&`pl zO!azrcRyaHhAFh=ec@nhULrGm`s}fk4B1KhtTgJ=B*dFam0UA zkCfC9xd;L?uCHV-zNt@zf7ll=YI@6iCE?Sf&$rb!gG-L@OG%y4nYZ~|7s?6bdR z_?>T2XylonKS3qRiW?mn;n|Q7i2Z-QKh_jm#sH4HjrDrD)+{!{Rf;n@}4ebkL^MP*=n_yZ79|YW6&nHQk1VyL!-Hp`z z-y)de5z1&x-M$yS=g3hO%7}fNueHqocKt7rM39Lymm&uaA3<;1x0kOz{Tm1!iV;Wx z%@ET1iuuE>B124|6DaD;&;y_S_G9e7?>@xLe12hpQzu^I^mBjY>iM%In_T~2>4yl% ro5mHCVtNOA@4c732M=-Qopp`j0=M=j4nbp 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 M07*qoM6N<$f)owYo&W#< diff --git a/src/icons/octopress.png b/src/icons/octopress.png index 0f25067305947ef363e54c54e41f8db853be0a1e..d65b4ba96c3f5140f4bdda35a2cf43e4358329f1 100644 GIT binary patch delta 214 zcmV;{04e{F1B(KX83+IX0026epuLeHD1WUpX0W)IQbqeJ%X>$7!7R>(H(S(;ZX*}7}3DIt^o((m^XN{}xAqZI()9~~f5yBh~c Qc>n+a07*qoM6N<$f|2W9#{d8T delta 348 zcmV-i0i*tl0+0ic83+Ra001a04^xpLD1VJmOjJcpO-e$H&9N!@9b<&d$!izrVP+xYpLzySuwEFfb@6C}?PCBqSt1KR-J=J2W&jhK7c~ zz`#R8L)qEcI5;>+NJvjlPcJVoHa0d)OiXlibc>6Nfq{X2eSJbgLM$vSyu7?2A%7vy z&(Bg)Qn$Ca#KgqG!NI=1z9r#KX#fBKnMp)JRCwBC&&L*mFaShR6k`f4i6->kLH+;F zb69eCt2uW!j&sR91-P98JkVY)OSvBl5Qbq=y-<~40tg{msjgE>V*)(StEYyLW~wm( zlzye`Dea}ClmZz0SvxQ`Sj!j#a7q3d^NsT@A35g$-}hT%;@FrL6A(p_DBh?Ln1CP% uW}(wmiy0H}L}JadRU8X&KXpC-7hnLdE(<&}JL)3<0000-{i9CWVWL3 z*$tmO&nkI#=F%i_%Hl+SaLFPW#M<9zi*dc>K7fEx0qN`bAsH@U``wjbfA$h^reO8% zxMClfA(KAwP9yEZ1#!v+^W)O9=fr|P7XA*dEK353E3c*``rnz-cYSn8G--F{Y}m0S z)A8k=EDI2kV-8N{nSz)CGYi7UtNr=Y$g5_bCvCM~+7|*=!pUNPqjMnt+Zd2JFAk(F zOX8=lxoJ-LFT17oi`$zUOxk@pj@J(5u)2=reh1Fx8-T>Z8QnPoCk?`PpTB5u@=gIp z+FDlZ=nCUA>x8A4Mm_3o)gs8%ze^5z(Zx-z16>+_&TvRC>pvn>8 z`P4{IuYJ6r-ZGI%`0KZ3eNr9WLB1hv0oNcD5`%&g1}G|_gJMMH-DAGCGbutezkd*J z5;+#v`!Nbt+6PePeu#qrRgI{WE;vgTUE{8-A$1a4xRBZ$XVQh@5*m1f&_D?ZMr&oI zwGrVf<*QPEi<_)|qf5=Ayin#2NW2qb7eH0^Hsdp+{0Tp1bYj?ZgqRN;j{H3Yl5={% zW6O%lD_M%l1d?xr&pxyp)7pBwH@I7W+BPEc$_lFYMSM*I0ejS20Te)i z-Ynux_MlQRN7jj1*s#d!1X@%L2u)c};B&8p z#1#;g2;+^IH|5Cth22$kG~75u1y%LwM44VtgeMf?)rD#LUL0xq>xIT&R_5}2VaaaNz6gkBG?;I*LRAO>?i5siJ=<}Upk3sc9cByGapifnkhlh-ngCZ` zgx9Q->+w?yUtPOT4Wn5>WAGW@hoa22P=Fi68h}o9tHEckw;j&zC0xbCX9%sk4iZ0w zs6`kpQn8!6r^#|kd& zoc!Rs1V)YPjw%tT!mZ1s$i*!k1eJKv!G-Lu@YcvcAdDM)0Phw zU1L0>oh@6~iqPM^fW(aiIC3?w(I~kg5jQNOI9k>p8--~(hY-6*nKlrX0M)Rr#tc?j z_Fey`+LhWpdtCHOg#Nk>61PA!vqyC`^Hs?suSIM>#NE%PCRpS0O_MM^*9)kBvNaU2 z0-$Ou05;7sbfB1599bR|0NNpWD|<9(E!A;&EnYbMA@U+1k}AsSt93DT+bmQW3edEA zjp^HY4=8{wo6*rDpp7H9qm4a&H2Hgd*vJnQ=>k7psp;BqshNjQljlzPzP`70)C*~+ z&{*}AK=W`1UwwUNwF^luiT?~Or&(KMT)*!vK|c-L2{rxyFm?6_`%hng1HIdk1?1rZ Q^8f$<07*qoM6N<$f_T(01ONa4 delta 1878 zcmV-c2dVh|4T}$uBo78+OGiWi{{a60|De66laV1Re+L*zL_t(o!|hjXP*m3$e$KgH zyTF2FSwIu{48$bFB8f>9(`Zm*Q^QzeCX+Vf*QDw+lFUd9U@e-| zwvmY@1~X!$wxTEmM3O3sXkcOa+68y--h0mJkA+rdkbwN@kDg!mp7Wmfea?N}_qp!@ z{y%#w>fiwM8YdFY{1Oe*^A)4~Mkc-CUagu8 zs>z@+(HtzWb^iX$G5}ay)Sp+a*VEfGe-17Rl8m!f$tNsShk`EJ-Tn8k03iLr6SoJ@ zHn$L3N)&_;MDqG4tGYj5F-&L%gOzg@s*wDd$Cm879hV!Y?!x8P(;$Sf1Y5$wVA*K0 zQZFn-hf2B=N-JWH4oZRkSp@)~IeB}uLo58y0-G57=878Hg`5-TEJ zJzC}_6lOxBI29ZhwvG^j>#vs}ZQuMstLC-Y-{VL{8lHOSpQr4W=o~B2p;A9oVo-?A z_1{$Avv6GUQPkB<=`TbrsarMpf6U+UPW^Qd8o(yYm!!Dx7aS*7l(lUrfqm2LAuH&) z+Q*T0|JOKsKH@{pTrU#R7mRwsLZ6(HlytcILiO0dT>G3n!a6#hXII+`0%ioDQYVeD zOP2)VM-cAWF>^gg~Rv3zT>O?u?sq~mVl%GdLu7E#0*+ zSm5N8`st|PJ&_mQdZiYTxF0Pe`k!2DcrLWF{nJLlJ)r^K38#{+^nq0OOv;+tDev^` zfZ+pR0>t3NB928~c6CZ z!xsq{0Q>;_Jw#!L0igBKe;h~-+lT-pC7-}Qjsg}f`Jzm%<-OSj2}B{njHSdT2@))w zf-nFWfY5Ec$Mb62yiGBV)7!wC+D8Py+3*r3JpmXu%U>p}d$QCEfB;@qiz%ay>K#Ig zv#&>pQU}2R2!NT%<~Q~EJzt!$($V2?O?nx8udPr zL_3_Arq2fe>YDKeq=d0hCy#5AVG5Bw-p0TT-((0KnxtEJ5L~KS71x+Q&VW zLN3|D7cc2u59omRf6ryGW~HNLLbeLsT**7ScLE|nheR5vJ!DN})$Zcq0%)oX-N%`G zF$ZYC8+8YbTJ)GBvFKtyDYj;%<2q&_@_eqJ+C%n`P|HVweBb~#V@0Ru?Uo74#{)pe zi(3W_+F6?d0C3gBy+N60F$HKK@d#8cZiyqY=wkD?(+A$%f10{7khv+#qn$}h&o@VB ziRRHi6U}3u7S6;)U$}E}!vVlGJ$u0Y?kYzB#D(PPt_pIqr2@iP0nt>~-f(Xi;l%v;OBvddI;M0T#;xB!Ww} zLs6-o1;gqIetl}fyeaLIw%cp z2#bF67sKiaU9$r*)JIZ|Kp|@a${`>Ozsh|#S2-Ve`pH}E{Z|$N0K5$=-XlU!BM^iD zphRX=4$rVe=k#=4UNCe35hcGz>%^B3w)-_xPP}VBe+jkj0qLy@&f?(pCf{nW#vcgq zNklpTjQ}7-fuzM}S%cym0U#{#)8Vz{jx%}aT(K4QFL$^g%xy%Gjs;|l>d;j8z=e;d zzN8{V{SDD?d}c}f8s6*cMt(DD%~+lculIQO(?_YlZ4gMVi+!1qR Qg#Z8m07*qoM6N<$f`2!Y0ssI2 diff --git a/src/icons/storyblok.png b/src/icons/storyblok.png index daf5882d125f704c90965af069124161951ae726..404358d949562924deca45ce65cb2ac5d9e0077d 100644 GIT binary patch delta 1599 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/icons/typecho.svg b/src/icons/typecho.svg index b447bb51b..e43dcb1f9 100644 --- a/src/icons/typecho.svg +++ b/src/icons/typecho.svg @@ -1,10 +1 @@ - - - typecho-logo - Created with Sketch (http://www.bohemiancoding.com/sketch) - - - - - - \ No newline at end of file +typecho-logo \ No newline at end of file diff --git a/src/icons/wp_super_cache.png b/src/icons/wp_super_cache.png index 87e8d17eda109bc113f39a44690fd66c82628861..819cab29f4db4cbbbb4533f069c2a4b7e0b00c97 100644 GIT binary patch delta 734 zcmV<40wMjK2ayJl83+Ra002a!ipG&MDt`f1P)t-s7a}SeA0-|#+A0#OsCoUi*Dj+8D<8IV5g6Byl<;bvq+{0;9-~GbrAHmANPiuzNgT6E9J92xyi6Otzrevw8pKW-$4?o@$jQgZ z%F4^k%upH6(9zJ*($Uh>(oz`HQW(`z7}Zl4)z#P6QyAD&7}--7*;E(WR2SP+7u{4A z-c=Xp=;`R_>Hq)#OFrVw00001VoOIvajyql;s5{vK}keGR5;6HP$d8u=zpL<0|r!q z2)6=lxH3!yswzr~3QDSK+S=OKlrV@QfRrM{B%BI>Ktd604sHcNActxSrUFq>MPx&; zDG(J$G6ST5!^2(}iy;UFx`l}>=!VF^RDcxd7sg{K5S4_gKvp0uj70^q0viKVTQor` zkQ8vabD_Burof;u0i;0C3V$lW!Utu5JPT6573(F4q)|T27pg)G=nQZ`vGXCx%N7)d z@*ph12uYxPG%Jwi)iD8Eg04WmpfCpLAZ~O2Tnms-&=oM|gXH;*0`fxizyexm3YgNu zSwxh5a#Ebwpsql-f`yCIH8saiT?Ceb&=oM-MP-Cp3K+u$P!;f-21{oqIWV|6>SI+P zBJG`>?Fq66Db|n_usJ7Z1sMvV*$G#`X&sRsY0HL@E?^4G0<+^>*s!Ee0CypPM2>)L Q!vFvP07*qoM6N<$f@ delta 875 zcmV-x1C;!c2Av0x85#xv0047(dh`GQ00v@9M??Vs0RI60puMM)ks&I711d>GK~z}7 z?U&n&Rb?2)f8Y15LwmMcEp>0lLpPyDITsP8(4U}?BvOH92Mk08vHAzP3ksoI|AnA1 zx|vdfQgAdQ9Mg*|L1r*)kGSWwU5D>`y|5W)&Fs@!d(fL+Sg-&o{R#Ei7maKzg9$ng|0++)SG|+^B@Ye(it_D66;45 zFNvd`4=b(FTBEf=DYXFH4-qfVVQ~)Y9F`QN6xtY!@%qY%S5!I?!KNuTP0_~Sd43^9 zR%8sFwZzc_oU?7i`$YDDO;h3}nd(L&Lm*BPj(+$)yID!~T|xHhBKyY_w`hXXX0OQ|DI166Y*Q9CuVg=S_ZIYeZZ} z61fNr?R=SXxm+L?jx!gz^8Fb;J~7;pM3O|AJY-g}@B18h z>k!6hj4{2Bo6-DyZiHH`%HOwcbq=b4wJBPg))@!_KR5U<=YF78t8#Jl632#5;(3qz zN<~r9!Uo^Aw4$$7Y>Zh1ewl;s93~8dM^cMoYnbxc^Y=M_^U_@gw6x4a;kRM4`G6~< z=NEw=A`C;UKsB%o4^H#?nwURkefD3kGUwE?sqpZM6Hp57P2S`BjT;>K;3I-C#8blX zrWy7=*Ccj|FUKo zCRA|+0K|WPhCQnzPHz5}XFXv&GJJk}6*rR-wRLN$*C)HK_Cf@#z+hncbjuVw2NEJt zd^NF(Z|(-XdvHJ7=9-+paG^IV^H?B&0geq$vu|A!fN$$1PXANM*b)Rm&!6o*D-b!w zo9pK|x^ad;3%}0Xh^U3BZs)1uN(VUv7aA`Uu)RF-& z{A1FtYQE+8rfGInVy05f={semOy^$;cqU<4T+Qg;9V002ovPDHLkV1gF{ Boz(yU diff --git a/src/utils/iframe.js b/src/utils/iframe.js deleted file mode 100644 index d37f91ef1..000000000 --- a/src/utils/iframe.js +++ /dev/null @@ -1,1166 +0,0 @@ -'use strict'; - -(function(win) { - -var exports = {}; - -(function(exports) { - - var utils = { - normalizeUrl: function(url) { - - return this.hashUrl(url) || null; - - }, - - getReferrer: function() { - return this.normalizeUrl(document.referrer); - }, - - getPageUrl: function() { - return this.normalizeUrl(window.location.href); - }, - hashUrl: function(url) { - var a, - result; - - if ( !url || url.indexOf('http') !== 0 ) { - return null; - } - - a = document.createElement('a'); - a.href = url; - - result = a.protocol + '//' + a.hostname + '/'; - - if ( a.pathname && a.pathname !== '/' ) { - result += this.hashCode(a.pathname); - } - - if ( a.search ) { - result += '?' + this.hashCode(a.search); - } - - if ( a.hash ) { - result += '#' + this.hashCode(a.hash); - } - - return result; - }, - - hashCode: function(str) { - var hash = 0, - kar, - i; - - if ( str.length === 0 ) { - return hash; - } - - for ( i = 0; i < str.length; i++ ) { - kar = str.charCodeAt(i); - hash = ((hash << 5) - hash) + kar; - hash = hash & hash; - } - - return hash + Math.pow(2, 32); - }, - - realArray: function(a) { - return Array.prototype.slice.apply(a); - }, - - onDocLoaded: function(doc, callback) { - if ( doc.readyState === 'loading' ) { - doc.addEventListener('DOMContentLoaded', callback); - } else { - callback(); - } - }, - - SCRIPT_IN_WINDOW_TOP: window === window.top, - - isFriendlyWindow: function(win) { - - var href; - try { - href = win.location.href; - } catch(e) { - return false; - } - return true; - }, - - elementWindow: function(el) { - return el.ownerDocument.defaultView; - }, - - viewport: function(win) { - return {width: win.innerWidth, height: win.innerHeight}; - }, - - parseQS: function(qs) { - if ( qs.indexOf('http') === 0 ) { - qs = qs.split('?')[1]; - } - var i, kvs, key, val; - var dict = {}; - qs = qs.split('&'); - for ( i = 0; i < qs.length; i++ ) { - kvs = qs[i].split('='); - key = kvs[0]; - val = kvs.slice(1).join('='); - try { - dict[key] = window.decodeURIComponent(val); - } catch (e) { - - continue; - } - } - return dict; - }, - sendToBackground: function(message, event, responseMessage, onResponse) { - if ( typeof browser !== 'undefined' ) { - var response = browser.runtime.sendMessage(message); - response.then(onResponse); - } else if ( typeof chrome !== 'undefined' ) { - chrome.runtime.sendMessage(message, onResponse); - } else if ( window.self.port ) { - window.self.port.on(responseMessage, onResponse); - window.self.port.emit(event, message); - } - }, - - ifTrackingEnabled: function(callback, elseCallback) { - - this.sendToBackground( - 'is_tracking_enabled', - '', - 'tracking_enabled_response', - function(message) { - if ( message.tracking_enabled ) { - - callback(); - } else { - - elseCallback(); - } - } - ); - - } - }; - - utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent); - utils.SCRIPT_IN_HOSTILE_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && !utils.SCRIPT_IN_FRIENDLY_IFRAME; - - function LogGenerator() { - this.msgNum = 0; - this.pageMeta = { - 'url': utils.getPageUrl(), - 'isHP': window.location.pathname === '/', - 'referrer': utils.getReferrer(), - 'rand': Math.floor(Math.random() * 10e12), - 'startTime': new Date().getTime() - }; - } - - LogGenerator.prototype = { - log: function(event, opt_assets, opt_pageTags) { - var opt_video_assets; - if ( event === 'video' || event === 'invalid-video' ) { - opt_video_assets = opt_assets || []; - opt_assets = []; - } else { - opt_video_assets = []; - opt_assets = opt_assets || []; - } - var result = { - doc: this.pageMeta, - event: event, - video_assets: opt_video_assets, - assets: opt_assets, - version: '3', - mrev: '9c4d5b3-c', - msgNum: this.msgNum, - timestamp: new Date().getTime(), - pageVis: document.visibilityState, - pageFoc: document.hasFocus(), - pageTags: opt_pageTags || [] - }; - this.msgNum++; - return result; - } - }; - - utils.LogGenerator = LogGenerator; - - exports.utils = utils; -})(exports); - -(function(exports) { - - var SizeMatcher = { - VALID_AD_SIZES: [ - [300, 50], - [320, 50], - [160, 600], - [300, 250], - [300, 600], - [300, 1050], - [336, 280], - [336, 850], - [468, 60], - [728, 90], - [728, 250], - [728, 270], - [970, 66], - [970, 90], - [970, 125], - [970, 250], - [970, 400], - [970, 415], - [1280, 100] - ], - - PX_SIZE_TOL: 10, - - getMatchedAdSize: function(width, height) { - - if ( !this.set ) { - this.set = this._makeSizeSet(); - } - - return this.set[Math.round(width) + 'x' + Math.round(height)]; - }, - - elementIsAdShaped: function(el) { - return !!this.getMatchedAdSizeForElement(el); - }, - - getMatchedAdSizeForElement: function(el) { - var rect = el.getBoundingClientRect(); - return this.getMatchedAdSize(rect.width, rect.height); - }, - - _makeSizeSet: function() { - var set = {}; - var i; - var xfuz; - var yfuz; - var size; - var width; - var height; - - for ( i = 0; i < this.VALID_AD_SIZES.length; i++ ) { - for ( xfuz = -this.PX_SIZE_TOL; xfuz <= this.PX_SIZE_TOL; xfuz++ ) { - for ( yfuz = -this.PX_SIZE_TOL; yfuz <= this.PX_SIZE_TOL; yfuz++ ) { - size = this.VALID_AD_SIZES[i]; - width = size[0] + xfuz; - height = size[1] + yfuz; - set[width + 'x' + height] = size; - } - } - } - return set; - } - }; - - var Throttler = { - MAX_SEARCHES_PER_WINDOW: 10, - MAX_SEARCHES_PER_ELEMENT: 2, - - countSearch: function(el) { - if ( typeof el.searches !== 'number' ) { - el.searches = 0; - } - - el.searches += 1; - }, - - throttle: function(el, max) { - if ( typeof el.searches === 'number' && el.searches >= max ) { - return true; - } - return false; - }, - - throttleElement: function(el) { - return this.throttle(el, this.MAX_SEARCHES_PER_ELEMENT); - }, - - throttleWin: function(win) { - return this.throttle(win, this.MAX_SEARCHES_PER_WINDOW); - }, - - getCount: function(el) { - return el.searches || 0; - } - }; - - function TopSearcher(win) { - this.win = win; - this.doc = win.document; - } - - TopSearcher.prototype.search = function() { - var candidates = exports.utils.realArray(this.doc.querySelectorAll('img, object, embed')), - html5Ad, - ads = []; - - ads = ads.concat(candidates.filter(function(el) { - if ( !el.mpAdFound && !Throttler.throttleElement(el) ) { - Throttler.countSearch(el); - if ( (el.tagName !== 'IMG' || isStandardImage(el)) && SizeMatcher.elementIsAdShaped(el) ) { - el.mpAdFound = true; - return true; - } - } - return false; - })); - - html5Ad = this._mainGetHTMLAd(); - if ( html5Ad ) { - html5Ad.html5 = true; - html5Ad.mpAdFound = true; - ads.push(html5Ad); - } - - return ads; - }; - - TopSearcher.prototype._mainGetHTMLAd = function() { - var styles = this.doc.querySelectorAll('div > style, div > link[rel="stylesheet"]'), - i, div; - for ( i = 0; i < styles.length; i++ ) { - div = styles[i].parentNode; - if ( !div.mpAdFound && SizeMatcher.elementIsAdShaped(div) && this._jumpedOut(div) ) { - return div; - } - } - }; - - TopSearcher.prototype._jumpedOut = function(el) { - var siblings, ifrs; - siblings = exports.utils.realArray(el.parentNode.children); - ifrs = siblings.filter(function(el) { - return el.tagName === 'IFRAME' && el.offsetWidth === 0 && el.offsetHeight === 0; - }); - return ifrs.length > 0; - }; - - function IframeSearcher(win) { - this.MIN_AD_AREA = 14000; - this.MIN_WINDOW_PX = 10; - - this.win = win; - this.doc = win.document; - this.body = win.document.body; - this.winClickTag = win.clickTag; - this.adSizeMeta = this._getAdSizeMeta(); - this.numElementsInBody = (this.body && this.body.querySelectorAll('*').length) || 0; - - this.shouldSearchWindow = false; - if ( !this.win.mpAdFound && this.body && !Throttler.throttleWin(this.win) ) { - this.winWidth = this.win.innerWidth; - this.winHeight = this.win.innerHeight; - if ( this._meetsMinAdSize(this.winWidth, this.winHeight) && !this._containsLargeIframes() ) { - this.shouldSearchWindow = true; - } - } - - } - - IframeSearcher.prototype.search = function() { - var ad; - - if ( this.shouldSearchWindow ) { - ad = this._search(); - if ( ad ) { - ad.mpAdFound = true; - win.mpAdFound = true; - return ad; - } - Throttler.countSearch(this.win); - } - - return null; - }; - - IframeSearcher.prototype._search = function() { - var _this = this, - stdCandidates, - html5Candidates, - stdEl, - html5El; - - stdCandidates = this.body.querySelectorAll('img, object, embed'); - - stdEl = getFirst(stdCandidates, function(el) { - if ( !el.mpAdFound && - !Throttler.throttleElement(el) && - (el.tagName !== 'IMG' || isStandardImage(el)) && - _this._elementIsAtLeastAsBigAsWindow(el)) - { - return true; - } - Throttler.countSearch(el); - return false; - }); - - if ( stdEl ) { - return stdEl; - } - - if ( this._isHTML5Iframe() ) { - html5Candidates = this.doc.querySelectorAll('body, canvas, button, video, svg, div'); - html5El = getFirst(html5Candidates, function(el) { - - if ( _this._elementIsAtLeastAsBigAsWindow(el) ) { - return true; - } - Throttler.countSearch(el); - return false; - }); - } - - if ( html5El ) { - html5El.html5 = true; - html5El.winClickTag = this.winClickTag; - html5El.adSizeMeta = this.adSizeMeta; - return html5El; - } - - return null; - }; - - IframeSearcher.prototype._isHTML5Iframe = function() { - if ( this.winClickTag || this.adSizeMeta ) { - return true; - } - - if ( this.doc.querySelectorAll('canvas', 'button', 'video', 'svg').length > 0 ) { - return true; - } - - if ( this.numElementsInBody >= 5 && Throttler.getCount(this.win) > 0 && this.doc.querySelectorAll('div').length > 0 ) { - return true; - } - - return false; - }; - - IframeSearcher.prototype._elementIsAtLeastAsBigAsWindow = function(el) { - var rect = el.getBoundingClientRect(), - tol = 0.95; - - return rect.width >= (tol * this.winWidth) && rect.height >= (tol * this.winHeight); - }; - - IframeSearcher.prototype._meetsMinAdSize = function(width, height) { - return (width * height) >= this.MIN_AD_AREA; - }; - - IframeSearcher.prototype._containsLargeIframes = function() { - var iframes = this.doc.querySelectorAll('iframe'); - var rect; - var i; - for ( i = 0; i < iframes.length; i++ ) { - rect = iframes[i].getBoundingClientRect(); - if ( rect.width > this.MIN_WINDOW_PX || rect.height > this.MIN_WINDOW_PX ) { - return true; - } - } - return false; - }; - - IframeSearcher.prototype._getAdSizeMeta = function() { - var adSizeMeta = this.doc.querySelectorAll('meta[name="ad.size"]'); - if ( adSizeMeta.length > 0 ) { - return adSizeMeta[0].content; - } else { - return null; - } - }; - - function getFirst(arr, testFn) { - var i, el; - for ( i = 0; i < arr.length; i++ ) { - el = arr[i]; - if ( testFn(el) ) { - return el; - } - } - return null; - } - - function isStandardImage(img) { - - return img.src && (img.parentNode.tagName === 'A' || img.getAttribute('onclick')); - } - - function getFriendlyIframes(win) { - var iframes = win.document.querySelectorAll('iframe'); - iframes = exports.utils.realArray(iframes); - var friendlyIframes = iframes.filter(function(ifr) { - return exports.utils.isFriendlyWindow(ifr.contentWindow); - }); - return friendlyIframes; - } - - function findAds(win) { - var i, - iframes, - searcher, - ad, - ads = []; - - if ( win === win.top ) { - searcher = new TopSearcher(win); - ads = ads.concat(searcher.search()); - } else { - searcher = new IframeSearcher(win); - ad = searcher.search(); - if ( ad ) { - ads.push(ad); - } - } - - iframes = getFriendlyIframes(win); - for ( i = 0; i < iframes.length; i++ ) { - ads = ads.concat(findAds(iframes[i].contentWindow)); - } - - return ads; - } - - exports.adfinder = { - getMatchedAdSize: SizeMatcher.getMatchedAdSize.bind(SizeMatcher), - findAds: findAds - }; -})(exports); - -(function(exports) { - - var parser = { - TAGS_WITH_SRC_ATTR: { - 'IMG': true, - 'SCRIPT': true, - 'IFRAME': true, - 'EMBED': true - }, - - MAX_ATTR_LEN: 100, - - getUrl: function(el, params) { - var url; - - if ( this.TAGS_WITH_SRC_ATTR.hasOwnProperty(el.tagName) ) { - url = el.src; - - } else if ( el.tagName === 'OBJECT' ) { - url = el.data || (params && params.movie) || null; - - } else if ( el.tagName === 'A' ) { - url = el.href; - } - - if ( url && url.indexOf('http') === 0 ) { - return url; - } else { - return null; - } - }, - - getParams: function(el) { - if ( el.tagName !== 'OBJECT' ) { - return null; - } - - var i, child; - var params = {}; - var children = el.children; - for ( i = 0; i < children.length; i++ ) { - child = children[i]; - if ( child.tagName === 'PARAM' && child.name ) { - - params[child.name.toLowerCase()] = child.value; - } - } - return params; - }, - - getPosition: function(el) { - var rect = el.getBoundingClientRect(); - var win = exports.utils.elementWindow(el); - - return { - width: Math.round(rect.width), - height: Math.round(rect.height), - left: Math.round(rect.left + win.pageXOffset), - top: Math.round(rect.top + win.pageYOffset) - }; - }, - - getFlashvars: function(el, params, url) { - var flashvars; - var urlQS = url && url.split('?')[1]; - - if ( el.tagName === 'EMBED' ) { - flashvars = el.getAttribute('flashvars') || urlQS; - - } else if ( el.tagName === 'OBJECT' ) { - flashvars = params.flashvars || el.getAttribute('flashvars') || urlQS; - } - - return (flashvars && exports.utils.parseQS(flashvars)) || null; - }, - - findClickThru: function(el, flashvars) { - var key; - if ( el.tagName === 'IMG' && el.parentElement.tagName === 'A' ) { - return el.parentElement.href; - } else if ( flashvars ) { - for ( key in flashvars ) { - if ( flashvars.hasOwnProperty(key) ) { - - if ( key.toLowerCase().indexOf('clicktag') === 0 ) { - return flashvars[key]; - } - } - } - } - return null; - }, - - getAttr: function(el, name) { - var val = el.getAttribute(name); - - if ( val && val.slice && val.toString ) { - - return val.slice(0, this.MAX_ATTR_LEN).toString(); - } else { - return null; - } - }, - - putPropIfExists: function(obj, name, val) { - if ( val ) { - obj[name] = val; - } - }, - - putAttrIfExists: function(obj, el, name) { - var val = this.getAttr(el, name); - this.putPropIfExists(obj, name, val); - }, - - elementToJSON: function(el, opt_findClickThru) { - var pos = this.getPosition(el); - var params = this.getParams(el); - var url = this.getUrl(el, params); - var flashvars = this.getFlashvars(el, params, url); - var clickThru = opt_findClickThru && this.findClickThru(el, flashvars); - var json = { - tagName: el.tagName, - width: pos.width, - height: pos.height, - left: pos.left, - top: pos.top, - children: [] - }; - - if ( params ) { - - delete params.flashvars; - } - - this.putAttrIfExists(json, el, 'id'); - this.putAttrIfExists(json, el, 'class'); - this.putAttrIfExists(json, el, 'name'); - - this.putPropIfExists(json, 'flashvars', flashvars); - this.putPropIfExists(json, 'url', url); - this.putPropIfExists(json, 'params', params); - this.putPropIfExists(json, 'clickThru', clickThru); - - return json; - } - }; - - exports.parser = { elementToJSON: parser.elementToJSON.bind(parser) }; -})(exports); - -(function(exports) { - - var ContextManager = function(adData) { - this.adData = adData; - }; - - ContextManager.prototype = { - CONTAINER_SIZE_TOL: 0.4, - ASPECT_RATIO_FOR_LEADERBOARDS: 2, - - isValidContainer: function(el, opt_curWin) { - - var cWidth = el.clientWidth; - var cHeight = el.clientHeight; - - var adWidth = this.adData.width; - var adHeight = this.adData.height; - - var winWidth = opt_curWin && opt_curWin.innerWidth; - var winHeight = opt_curWin && opt_curWin.innerHeight; - var similarWin = opt_curWin && this.withinTol(adWidth, winWidth) && this.withinTol(adHeight, winHeight); - - var similarSizeX = this.withinTol(adWidth, cWidth); - var similarSizeY = this.withinTol(adHeight, cHeight); - var adAspect = adWidth / adHeight; - - return similarWin || el.tagName === 'A' || (adAspect >= this.ASPECT_RATIO_FOR_LEADERBOARDS && similarSizeY) || (similarSizeX && similarSizeY); - }, - - withinTol: function(adlen, conlen) { - var pct = (conlen - adlen) / adlen; - - return pct <= this.CONTAINER_SIZE_TOL; - }, - - serializeElements: function(el) { - if ( !el ) { - return; - } - var i; - var ifrWin; - var adId = this.adData.adId; - var elIsAd = false; - - if ( adId && el[adId] && el[adId].isAd === true ) { - elIsAd = true; - } - - var json = exports.parser.elementToJSON(el, elIsAd); - var childJSON; - - if ( elIsAd ) { - json.adId = adId; - this.adData.element = {}; - - var keys = Object.keys(json); - for ( i = 0; i < keys.length; i++ ) { - var key = keys[i]; - if ( key !== 'children' && key !== 'contents' ) { - this.adData.element[key] = json[key]; - } - } - } - - var children = exports.utils.realArray(el.children).filter(function(el) { - var param = el.tagName === 'PARAM'; - var inlineScript = el.tagName === 'SCRIPT' && !(el.src && el.src.indexOf('http') >= 0); - var noScript = el.tagName === 'NOSCRIPT'; - return !(param || inlineScript || noScript); - }); - - for ( i = 0; i < children.length; i++ ) { - childJSON = this.serializeElements(children[i]); - if ( childJSON ) { - json.children.push(childJSON); - } - } - - if ( el.tagName === 'IFRAME' ) { - ifrWin = el.contentWindow; - - if ( adId && el[adId] && el[adId].needsWindow ) { - - json.contents = this.adData.serializedIframeContents; - el[adId].needsWindow = false; - delete this.adData.serializedIframeContents; - - } else if ( exports.utils.isFriendlyWindow(ifrWin) ) { - - childJSON = this.serializeElements(ifrWin.document.documentElement); - if ( childJSON ) { - json.contents = childJSON; - } - } - } - - if ( json.children.length > 0 || json.adId || json.tagName === 'IFRAME' || json.url ) { - return json; - } else { - return null; - } - }, - - captureHTML: function(containerEl) { - this.adData.context = this.serializeElements(containerEl); - }, - - nodeCount: function(el) { - return el.getElementsByTagName('*').length + 1; - }, - - highestContainer: function(curWin, referenceElement) { - var curContainer = referenceElement; - var docEl = curWin.document.documentElement; - var parentContainer; - - if ( curWin !== curWin.top && this.isValidContainer(docEl, curWin) ) { - return docEl; - } - - while ( true ) { - parentContainer = curContainer.parentElement; - if ( parentContainer && this.isValidContainer(parentContainer) ) { - curContainer = parentContainer; - } else { - return curContainer; - } - } - } - }; - - var tagfinder = { - - setPositions: function(adData, opt_el, opt_winPos) { - var el = opt_el || adData.context; - var winPos = opt_winPos || {left: 0, top: 0}; - var ifrPos; - - el.left += winPos.left; - el.top += winPos.top; - - if ( el.children ) { - el.children.forEach(function(child) { - this.setPositions(adData, child, winPos); - }, this); - } - - if ( el.contents ) { - ifrPos = {left: el.left, top: el.top}; - this.setPositions(adData, el.contents, ifrPos); - } - - if ( el.adId === adData.adId ) { - adData.element.left = el.left; - adData.element.top = el.top; - } - }, - - appendTags: function(adData, referenceElement) { - var mgr = new ContextManager(adData); - var curWin = exports.utils.elementWindow(referenceElement); - var highestContainer; - - while ( true ) { - highestContainer = mgr.highestContainer(curWin, referenceElement); - mgr.captureHTML(highestContainer); - if ( curWin === curWin.top ) { - break; - } else { - - curWin.mpAdFound = true; - - mgr.adData.serializedIframeContents = mgr.adData.context; - - if ( exports.utils.isFriendlyWindow(curWin.parent) ) { - referenceElement = curWin.frameElement; - referenceElement[mgr.adData.adId] = {needsWindow: true}; - curWin = curWin.parent; - } else { - break; - } - } - } - return { - referenceElement:referenceElement, - highestContainer: highestContainer - }; - } - }; - - exports.tagfinder = tagfinder; -})(exports); - -(function(exports) { - var _onAdFound; - var _logGen = new exports.utils.LogGenerator(); - var _pageTags; - var INIT_MS_BW_SEARCHES = 2000; - var PAGE_TAG_RE = new RegExp('gpt|oascentral'); - var POST_MSG_ID = '1490888598-28717-31700-14775-21098'; - var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)'); - - function getPageTags(doc) { - var scripts = doc.getElementsByTagName('script'); - var pageTags = []; - scripts = exports.utils.realArray(scripts); - scripts.forEach(function(script) { - if ( PAGE_TAG_RE.exec(script.src) ) { - pageTags.push({'tagName': 'SCRIPT', 'url': script.src}); - } - }); - return pageTags; - } - - function messageAllParentFrames(adData) { - - adData.postMessageId = POST_MSG_ID; - - adData = JSON.stringify(adData); - - var win = window; - while ( win !== win.top ) { - win = win.parent; - win.postMessage(adData, '*'); - } - } - - function appendTagsAndSendToParent(adData, referenceElement) { - var results = exports.tagfinder.appendTags(adData, referenceElement); - if ( exports.utils.SCRIPT_IN_HOSTILE_IFRAME ) { - messageAllParentFrames(adData); - - } else if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { - - exports.tagfinder.setPositions(adData); - - adData.matchedSize = exports.adfinder.getMatchedAdSize(adData.width, adData.height); - if ( !adData.matchedSize ) { - - if ( AD_SERVER_RE.exec(results.referenceElement.id) ) { - adData.matchedSize = [adData.width, adData.height]; - adData.oddSize = true; - } else { - - return; - } - } - delete adData.width; - delete adData.height; - adData.curPageUrl = exports.utils.getPageUrl(); - _pageTags = _pageTags || getPageTags(document); - var log = _logGen.log('ad', [adData], _pageTags); - - if ( _onAdFound ) { - - _onAdFound(log, results.referenceElement); - - } - } - } - - function extractAdsWrapper() { - if ( exports.utils.SCRIPT_IN_WINDOW_TOP || document.readyState === 'complete' ) { - extractAds(); - } - setTimeout( - function() { extractAdsWrapper(); }, INIT_MS_BW_SEARCHES - ); - } - - function extractAds() { - var ads = exports.adfinder.findAds(window); - ads.forEach(function(ad) { - - var startTime = new Date().getTime(); - var adId = startTime + '-' + Math.floor(Math.random() * 10e12); - - var adData = { - width: Math.round(ad.offsetWidth), - height: Math.round(ad.offsetHeight), - startTime: startTime, - adId: adId, - html5: ad.html5 || false - }; - - if ( ad.html5 ) { - adData.adSizeMeta = ad.adSizeMeta || null; - adData.winClickTag = ad.winClickTag || null; - } - - ad[adId] = { isAd: true }; - - appendTagsAndSendToParent(adData, ad); - }); - } - - function isChildWin(myWin, otherWin) { - var parentWin = otherWin.parent; - while ( parentWin !== otherWin ) { - if ( parentWin === myWin ) { - return true; - } - otherWin = parentWin; - parentWin = parentWin.parent; - } - return false; - } - - function iframeFromWindow(win, winToMatch) { - var i, ifr, ifrWin, - iframes = win.document.querySelectorAll('iframe'); - - for ( i = 0; i < iframes.length; i++ ) { - ifr = iframes[i]; - if ( ifr.contentWindow === winToMatch ) { - return ifr; - } - } - - for ( i = 0; i < iframes.length; i++ ) { - ifrWin = iframes[i].contentWindow; - if ( exports.utils.isFriendlyWindow(ifrWin) ) { - ifr = iframeFromWindow(ifrWin, winToMatch); - if ( ifr ) { - return ifr; - } - } - } - } - - function onPostMessage(event) { - var adData, - ifrWin = event.source, - - myWin = window.document.defaultView, - ifrTag; - - try { - - adData = JSON.parse(event.data); - } catch(e) { - - return; - } - - if ( adData.postMessageId === POST_MSG_ID ) { - - delete adData.postMessageId; - - event.stopImmediatePropagation(); - - if ( isChildWin(myWin, ifrWin) ) { - if ( exports.utils.isFriendlyWindow(ifrWin) ) { - ifrTag = ifrWin.frameElement; - } else { - ifrTag = iframeFromWindow(myWin, ifrWin); - } - - if ( ifrTag ) { - ifrTag[adData.adId] = {needsWindow: true}; - appendTagsAndSendToParent(adData, ifrTag); - } - } - } - } - - function onVideoMessage(msg, sender, callback) { - var log; - if ( msg.event === 'new-video-ad' ) { - msg.assets.forEach(function(asset) { - - }); - log = _logGen.log('video', msg.assets); - } else { - log = _logGen.log('invalid-video', msg.assets); - } - - msg.assets.forEach(function(a) {delete a.isVideo;}); - log.displayAdFound = msg.displayAdFound; - log.requests = msg.requests; - log.data = msg.event_data; - - log.doc.finalPageUrl = log.doc.url; - log.doc.url = exports.utils.normalizeUrl(msg.origUrl); - - _onAdFound(log); - } - - function addBackgroundListener(event, callback) { - if ( typeof browser !== 'undefined' ) { - browser.runtime.onMessage.addListener(function(msg) { - if ( msg.event === event ) { - callback(msg); - } - }); - } else if ( typeof chrome !== 'undefined' ) { - chrome.runtime.onMessage.addListener(function(msg) { - if ( msg.event === event ) { - callback(msg); - } - }); - } else if ( window.self.port ) { - window.self.port.on(event, callback); - } - } - - exports.coordinator = { - addPostMessageListener: function() { - if ( !exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { - window.addEventListener('message', onPostMessage, false); - } - }, - - init: function(onAdFound) { - - if ( exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { - return false; - } - - _onAdFound = onAdFound; - if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { - var log = _logGen.log('page'); - onAdFound(log); - - window.addEventListener('beforeunload', function(event) { - var log = _logGen.log('unload'); - log.timing = window.performance.timing; - onAdFound(log); - }); - - addBackgroundListener('new-video-ad', onVideoMessage); - addBackgroundListener('new-invalid-video-ad', onVideoMessage); - - } - - exports.utils.onDocLoaded(document, extractAdsWrapper); - } - }; - -})(exports); - -if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { - window.adparser = { - init: exports.coordinator.init, - addPostMessageListener: exports.coordinator.addPostMessageListener, - ifTrackingEnabled: exports.utils.ifTrackingEnabled, - sendToBackground: exports.utils.sendToBackground - }; -} else { - exports.coordinator.addPostMessageListener(); - exports.utils.ifTrackingEnabled( - function() { - exports.coordinator.init(function() {}); - }, - function() {} - ); -} -})(window); -(function(adparser) { - function onAdFound(log) { - adparser.sendToBackground({ id: 'ad_log', subject: log }, 'ad_log', '', function(){}); - } - - if ( window === window.top ) { - adparser.addPostMessageListener(); - adparser.ifTrackingEnabled( - function() { - adparser.init(onAdFound); - }, - function() {} - ) - } -})(window.adparser); diff --git a/src/utils/network.js b/src/utils/network.js deleted file mode 100644 index b2f2ea018..000000000 --- a/src/utils/network.js +++ /dev/null @@ -1,784 +0,0 @@ -'use strict'; -(function() { - - function isChrome() { - return (typeof chrome !== 'undefined' && - window.navigator.userAgent.match(/Chrom(?:e|ium)\/([0-9\.]+)/)); - } - - var browserProxy; - if ( isChrome() ) { - browserProxy = chrome; - } else { - browserProxy = browser; - } - - var MIN_FF_MAJOR_VERSION = 51; - - var requiredBrowserApis = [ - browserProxy.webNavigation, - browserProxy.tabs, - browserProxy.webRequest, - browserProxy.runtime - ]; - var areListenersRegistered = false; - var secBefore = 2000; - var secAfter = 5000; - var secBetweenDupAssets = 10e3; - var minVidSize = 500e3; - var maxVidSize = 25e6; - var maxContentRange = 25e6; - var videoExtensions = [ - 'af', '3gp', 'asf', 'avchd', 'avi', 'cam', 'dsh', 'flv', 'm1v', 'm2v', - 'fla', 'flr', 'sol', 'm4v', 'mkv', 'wrap', 'mng', 'mov', 'mpeg', 'mpg', - 'mpe', 'mp4', 'mxf', 'nsv', 'ogg', 'rm', 'svi', 'smi', 'wmv', 'webm' - ]; - var extensionsReg = new RegExp('\\.' + videoExtensions.join('$|\\.') + '$'); - var videoContentTypesPrefixes = ['binary/octet-stream', 'video/', 'flv-application/', 'media']; - - var bannedContentTypes = ['video/mp2t','video/f4m','video/f4f']; - var bannedFiletypes = ['ts']; - var bannedFiletypesReg = new RegExp('\\.' + bannedFiletypes.join('$|\\.') + '$'); - var whitelistReqTypes = ['object', 'xmlhttprequest', 'other']; - - var topVideoAssetDomains = [ - '2mdn.net', - 'adap.tv', - 'adnxs.com', - 'adsrvr.org', - 'btrll.com', - 'celtra.com', - 'flashtalking.com', - 'flite.com', - 'innovid.com', - 'jivox.com', - 'mixpo.com', - 'nytimes.com', - 'playwire.com', - 'selectmedia.asia', - 'serving-sys.com', - 'solvemedia.com', - 'spotible.com', - 'teads.tv', - 'tribalfusion.com', - 'tubemogul.com', - 'videologygroup.com', - 'washingtonpost.com' - ]; - - if ( !String.prototype.endsWith ) { - String.prototype.endsWith = function(searchString, position) { - var subjectString = this.toString(); - if ( typeof position !== 'number' || !isFinite(position) || - Math.floor(position) !== position || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - var lastIndex = subjectString.indexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; - }; - } - - function getFrame(getFrameDetails, callback) { - if ( typeof chrome !== 'undefined' ) { - chrome.webNavigation.getFrame(getFrameDetails, callback); - } else if ( typeof browser !== 'undefined' ) { - var gettingFrame = browser.webNavigation.getFrame(getFrameDetails); - gettingFrame.then(callback); - } - } - - function ifBrowserValid(callback, elseCallback) { - if ( isChrome() ) { - - callback(); - } else if ( typeof browser !== 'undefined' ) { - try { - var gettingInfo = browser.runtime.getBrowserInfo(); - gettingInfo.then(function(browserInfo) { - var browserVersion = parseInt(browserInfo.version.split('.')[0]); - - if ( browserInfo.name === 'Firefox' && - browserVersion >= MIN_FF_MAJOR_VERSION) { - callback(); - } else { - elseCallback(); - } - }); - } catch (err) { - - elseCallback(); - } - } else { - elseCallback(); - } - } - - function isTrackingEnabled() { - - return parseInt(localStorage.tracking, 10); - - } - - function isPixelRequest(request) { - return (request.type === 'image' || request.responseStatus === 204) && - request.size <= 1000; - } - - function isVpaidOrVastRequest(request) { - var lowerCaseUrl = request.url.toLowerCase(); - return lowerCaseUrl.indexOf('vpaid') !== -1 || lowerCaseUrl.indexOf('vast') !== -1; - } - - function hasValidRequestType(request) { - return whitelistReqTypes.indexOf(request.type) >= 0; - } - - function stripQueryParams(url) { - return url.split('?', 1)[0]; - } - - function parseHostnameFromUrl(url) { - var parser = document.createElement('a'); - parser.href = url; - return parser.hostname; - } - - function hasDomain(url, domain) { - return parseHostnameFromUrl(url).endsWith(domain); - } - - function findHeader(headers, key) { - var header; - for ( var i = 0; i < headers.length; i += 1 ) { - header = headers[i]; - if ( header.name.toLowerCase() === key ) { - return header; - } - } - return null; - } - - function validVideoType(vtype) { - var goodType = videoContentTypesPrefixes.some(function(prefix) { - return vtype.indexOf(prefix) === 0; - }); - return goodType; - } - - function assetMsgKey(assetReq) { - var url = stripQueryParams(assetReq.url); - var key = assetReq.frameId + '-' + url; - return key; - } - - var PageNetworkTrafficCollector = function(tabId) { - this.tabId = tabId; - this.displayAdFound = false; - this.requests = {}; - this.msgsBeingSent = {}; - this.assetsSeen = {}; - this.allRedirects = {}; - }; - - var globalPageContainer = { - collectors: {}, - dyingCollectors: {}, - - cleanupCollector: function(tabId) { - if ( tabId in this.collectors ) { - delete globalPageContainer.collectors[tabId]; - } - }, - - onNewNavigation: function(details) { - var tabId = details.tabId; - this.cleanupCollector(tabId); - - if ( isTrackingEnabled() ) { - if ( !areListenersRegistered ) { - - registerListeners(); - } - this.collectors[tabId] = new PageNetworkTrafficCollector(tabId); - } else { - if ( areListenersRegistered ) { - - unregisterListeners(); - } - } - }, - - onNavigationCommitted: function(details) { - - }, - - onNavigationCompleted: function(details) { - - }, - - onTabClose: function(tabId, closeInfo) { - - this.cleanupCollector(tabId); - delete this.collectors[tabId]; - }, - - onDisplayAdFound: function(tabId) { - this.collectors[tabId].displayAdFound = true; - }, - - getRandId: function() { - return String(Math.floor(Math.random() * 1e9)); - }, - - getCollector: function(tabId) { - if ( this.collectors.hasOwnProperty(tabId) ) { - return this.collectors[tabId]; - } - return null; - }, - - forwardCall: function(details, collectorMemberFunction) { - var collector = this.getCollector(details.tabId); - if ( collector !== null ) { - collectorMemberFunction.apply(collector, [details]); - } - } - }; - - PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function() { - var logMessage = Array.from(arguments).join(' '); - var message = {message: logMessage, event: 'console-log-message'}; - browserProxy.tabs.sendMessage(this.tabId, message); - }; - - PageNetworkTrafficCollector.prototype.sendToTab = function(assetReq, reqs, curPageUrl, isValidAd) { - var msg = {}; - msg.assets = []; - msg.event_data = {}; - if ( isValidAd ) { - msg.event = 'new-video-ad'; - msg.requests = reqs; - msg.requests.sort(function(reqA, reqB) {return reqA.requestTimestamp - reqB.requestTimestamp;}); - if ( assetReq ) { - msg.assets = [assetReq]; - } - } else { - msg.requests = reqs.map(function(request) { - return parseHostnameFromUrl(request.url); - }); - msg.assets = [{ - - url: parseHostnameFromUrl(assetReq.url), - - contentType: assetReq.contentType, - size: assetReq.size - }]; - msg.event = 'new-invalid-video-ad'; - } - msg.origUrl = curPageUrl; - msg.displayAdFound = this.displayAdFound; - - browserProxy.tabs.sendMessage(this.tabId, msg); - }; - - PageNetworkTrafficCollector.prototype.getRedirKey = function(url, frameId) { - return url + ':' + frameId; - }; - - PageNetworkTrafficCollector.prototype.seenBefore = function(request) { - var oldTime = this.assetsSeen[assetMsgKey(request)]; - if ( oldTime && (request.requestTimestamp-oldTime < secBetweenDupAssets)){ - - return true; - } - return false; - }; - - PageNetworkTrafficCollector.prototype.recordSeenAsset = function(request) { - this.assetsSeen[assetMsgKey(request)] = request.requestTimestamp; - }; - - PageNetworkTrafficCollector.prototype.onBeforeRequest = function(details) { - var req = { - url: details.url, - type: details.type, - httpMethod: details.method, - frameId: details.frameId, - parentFrameId: details.parentFrameId, - requestTimestamp: details.timeStamp, - }; - this.requests[details.requestId] = req; - }; - - PageNetworkTrafficCollector.prototype.onSendHeaders = function(details) { - var request, header; - request = this.requests[details.requestId]; - header = request && findHeader(details.requestHeaders, 'x-requested-with'); - if ( header && header.value.toLowerCase().indexOf('flash') > -1 ) { - request.from_flash = true; - } - }; - - PageNetworkTrafficCollector.prototype.onHeadersReceived = function(details) { - var getFrameDetails = { - tabId: details.tabId, - processId: null, - frameId: details.frameId - }; - var pageNetworkTrafficController = this; - getFrame(getFrameDetails, function(frameDetails) { - if ( frameDetails && frameDetails.url ) { - pageNetworkTrafficController._onHeadersReceived(details, frameDetails); - } - }); - }; - - PageNetworkTrafficCollector.prototype._onHeadersReceived = function(details, frameDetails) { - var contentSize, contentRange; - - var request = this.requests[details.requestId]; - if ( request ) { - var redirParent = this.allRedirects[this.getRedirKey(details.url, details.frameId)]; - var header = request && findHeader(details.responseHeaders, 'content-type'); - var contentType = header && header.value.toLowerCase(); - - if ( contentType){ - request.contentType = contentType; - } - header = request && findHeader(details.responseHeaders, 'content-length'); - contentSize = header && header.value; - if ( contentSize ) { - request.size = request.size || 0; - request.size += parseInt(contentSize); - } - header = request && findHeader(details.responseHeaders, 'content-range'); - contentRange = header && header.value; - if ( contentRange ) { - request.contentRange = parseInt(contentRange.split('/')[1]); - } - - var frameUrl = null; - if ( frameDetails && frameDetails.url ) { - frameUrl = frameDetails.url; - } - if ( !this.bannedRequest(request) && - (this.isVideoReq(frameUrl, request) || (redirParent && redirParent.isVideo))) { - request.isVideo = true; - } - } - }; - - PageNetworkTrafficCollector.prototype.onBeforeRedirect = function(details) { - var request = this.requests[details.requestId]; - if ( request ) { - if ( request.redirects ) { - request.redirects.push(details.redirectUrl); - } else { - request.redirects = [details.redirectUrl]; - } - this.allRedirects[this.getRedirKey(details.redirectUrl, details.frameId)] = request; - } - }; - - PageNetworkTrafficCollector.prototype.isYoutubeMastheadRequest = function(url) { - var re = /video_masthead/; - return this.hasYoutubeDomain(url) && re.test(url); - }; - PageNetworkTrafficCollector.prototype.isYoutubeVideoRequest = function(srcUrl, destUrl) { - if ( !this.hasYoutubeDomain(srcUrl) ) { - return false; - } - - var re = /https?:\/\/r.*?\.googlevideo\.com\/videoplayback\?/; - return re.test(destUrl); - }; - PageNetworkTrafficCollector.prototype.processResponse = function(requestDetails, frameDetails) { - var request; - if ( requestDetails ) { - request = this.requests[requestDetails.requestId]; - if ( request ) { - request.responseStatus = requestDetails.statusCode; - request.responseTimestamp = requestDetails.timeStamp; - - var frameUrl = null; - if ( frameDetails && frameDetails.url ) { - frameUrl = frameDetails.url; - } - - var requestUrl = null; - if ( request.url ) { - requestUrl = request.url; - } - - if ( this.isYoutubeAdReq(frameUrl, requestUrl) ) { - var videoId = this.parseYoutubeVideoIdFromUrl(requestUrl); - if ( videoId ) { - request.isYoutubeAd = true; - request.isVideo = true; - request.url = 'https://www.youtube.com/watch?v=' + this.parseYoutubeVideoIdFromUrl(requestUrl); - } - } else if ( !this.bannedRequest(request) && - (this.isVideo || this.isVideoReq(frameUrl, request))) { - request.isVideo = true; - } - - if ( request.isVideo ) { - - var msgKey = assetMsgKey(request); - this.msgsBeingSent[msgKey] = request; - if ( !this.seenBefore(request) ) { - this.sendMsgWhenQuiet(msgKey); - } - this.recordSeenAsset(request); - } - } - } - }; - - PageNetworkTrafficCollector.prototype.onResponseStarted = function(responseDetails) { - if ( responseDetails.frameId < 0 ) { - responseDetails.frameId = 99999; - - } - var getFrameDetails = { - tabId: responseDetails.tabId, - processId: null, - frameId: responseDetails.frameId - }; - var pageNetworkTrafficController = this; - getFrame(getFrameDetails, function(frameDetails) { - if ( frameDetails && frameDetails.url ) { - pageNetworkTrafficController.processResponse(responseDetails, frameDetails); - } - }); - }; - - PageNetworkTrafficCollector.prototype.hasBannedFiletype = function(request) { - var url = stripQueryParams(request.url); - if ( bannedFiletypesReg.exec(url) ) { - return true; - } else { - return false; - } - }; - - PageNetworkTrafficCollector.prototype.checkContentHeaders = function(request) { - if ( request.contentType && validVideoType(request.contentType) ) { - return true; - } - return false; - }; - - PageNetworkTrafficCollector.prototype.checkUrlExtension = function(request) { - var url = stripQueryParams(request.url); - if ( extensionsReg.exec(url) ) { - return true; - } else { - return false; - } - }; - - PageNetworkTrafficCollector.prototype.isVideoReq = function(srcUrl, request) { - if ( this.isYoutubeVideoRequest(srcUrl, request.url) ) { - return false; - } - return this.checkUrlExtension(request) || this.checkContentHeaders(request); - }; - PageNetworkTrafficCollector.prototype.hasYoutubeDomain = function(url) { - var hostname = parseHostnameFromUrl(url) ; - if ( hostname === 'www.youtube.com' ) { - return true; - } - return false; - }; - PageNetworkTrafficCollector.prototype.parseYoutubeVideoIdFromUrl = function(url) { - var re = /^https?:\/\/www\.youtube\.com\/get_video_info.*(?:\?|&)video_id=(.*?)(?:$|&)/; - var match = re.exec(url); - if ( match && match.length > 1 ) { - return match[1]; - } - - re = /^https?:\/\/www\.youtube\.com\/embed\/(.*?)(?:$|\?)/; - match = re.exec(url); - if ( match && match.length > 1 ) { - return match[1]; - } - - re = /^https?:\/\/www\.youtube\.com\/watch\?v=(.*$)/; - match = re.exec(url); - if ( match && match.length > 1 ) { - return match[1]; - } - return null; - }; - - PageNetworkTrafficCollector.prototype.isYoutubeGetVideoInfoReq = function(url) { - var re = /^https?:\/\/www\.youtube\.com\/get_video_info\?/; - return re.test(url); - }; - PageNetworkTrafficCollector.prototype.isYoutubeAdReq = function(srcUrl, destUrl) { - - if ( !this.hasYoutubeDomain(srcUrl) || - !this.isYoutubeGetVideoInfoReq(destUrl)) { - return false; - } - if ( this.parseYoutubeVideoIdFromUrl(srcUrl) === - this.parseYoutubeVideoIdFromUrl(destUrl) && - !this.isYoutubeMastheadRequest(destUrl)) { - return false; - } - return true; - }; - - PageNetworkTrafficCollector.prototype.bannedRequest = function(request) { - return this.bannedVideoType(request) || this.hasBannedFiletype(request) || this.bannedVideoSize(request); - }; - - PageNetworkTrafficCollector.prototype.bannedVideoType = function(request) { - var badType = false; - if ( request.contentType ) { - badType = bannedContentTypes.some(function(prefix) { - return request.contentType.indexOf(prefix) >= 0; - }); - } - return badType; - }; - - PageNetworkTrafficCollector.prototype.bannedVideoSize = function(request) { - if ( request.size !== null ) { - if ( request.size < minVidSize || request.size > maxVidSize || request.contentRange > maxContentRange ) { - return true; - } - } - return false; - }; - - PageNetworkTrafficCollector.prototype.grabTagReqs = function(tabRequests, assetRequest) { - var minTimestamp, maxTimestamp; - minTimestamp = assetRequest.requestTimestamp - secBefore; - maxTimestamp = assetRequest.requestTimestamp + secAfter; - - var filteredRequests = tabRequests.filter(function(request) { - return (request.requestTimestamp > minTimestamp && - request.requestTimestamp < maxTimestamp && - request.frameId === assetRequest.frameId && - request.url !== assetRequest.url && - (hasValidRequestType(request) || - isPixelRequest(request))); - }); - - return filteredRequests; - }; - - PageNetworkTrafficCollector.prototype.isValidVideoAd = function(assetRequest, tagRequests) { - var hasVpaidOrVastRequest = tagRequests.some(function(tagRequest) { - return isVpaidOrVastRequest(tagRequest); - }); - - if ( assetRequest.isYoutubeAd ) { - return true; - } - if ( hasVpaidOrVastRequest ) { - return true; - } - var hasTopVideoAssetDomain = topVideoAssetDomains.some(function(assetDomain) { - return hasDomain(assetRequest.url, assetDomain); - }); - - return hasTopVideoAssetDomain; - }; - - PageNetworkTrafficCollector.prototype.sendMsgWhenQuiet = function(msgKey) { - var _this = this, - origPageUrl, msgAssetReq; - msgAssetReq = this.msgsBeingSent[msgKey]; - browserProxy.tabs.get(this.tabId, function(tab) {origPageUrl = tab.url;}); - - setTimeout(function() { - var rawRequests = []; - if ( globalPageContainer.collectors[_this.tabId] === _this ) { - for ( var reqId in _this.requests ) { - rawRequests.push(_this.requests[reqId]); - } - var tagReqs = _this.grabTagReqs(rawRequests, msgAssetReq); - - if ( _this.isValidVideoAd(msgAssetReq, tagReqs) ) { - _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, true); - } else { - - _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, false); - } - - } else { - - } - delete _this.msgsBeingSent[msgKey]; - }, secAfter+secBefore); - }; - - PageNetworkTrafficCollector.prototype.existingMessage = function(candidateRequest) { - var frameMsg = this.msgsBeingSent[candidateRequest.frameId]; - if ( frameMsg ) { - return frameMsg; - } else { - return null; - } - }; - - function onBeforeRequestListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest); - } - - function onSendHeadersListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders); - } - - function onHeadersReceivedListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived); - } - - function onBeforeRedirectListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect); - } - - function onResponseStartedListener(details) { - globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onResponseStarted); - } - - function onCommittedListener(details) { - if ( details.frameId === 0 ) { - globalPageContainer.onNavigationCommitted(details); - } - } - - function onCompletedListener(details) { - if ( details.frameId === 0 ) { - globalPageContainer.onNavigationCompleted(details); - } - } - - function onRemovedListener(tabId, closeInfo) { - globalPageContainer.onTabClose(tabId, closeInfo); - } - - function onMessageListener(message, sender, sendResponse) { - if ( message.event === 'new-ad' && message.data.event === 'ad' ) { - var tabId = sender.tab.id; - if ( tabId ) { - globalPageContainer.onDisplayAdFound(tabId); - } - } - } - - function registerListeners() { - - browserProxy.webRequest.onBeforeRequest.addListener( - onBeforeRequestListener, - {urls: ['http://*/*', 'https://*/*']}, - [] - ); - - browserProxy.webRequest.onSendHeaders.addListener( - onSendHeadersListener, - {urls: ['http://*/*', 'https://*/*']}, - ['requestHeaders'] - ); - - browserProxy.webRequest.onHeadersReceived.addListener( - onHeadersReceivedListener, - {urls: ['http://*/*', 'https://*/*']}, - ['responseHeaders'] - ); - - browserProxy.webRequest.onBeforeRedirect.addListener( - onBeforeRedirectListener, - {urls: ['http://*/*', 'https://*/*']}, - [] - ); - - browserProxy.webRequest.onResponseStarted.addListener( - onResponseStartedListener, - {urls: ['http://*/*', 'https://*/*']}, - ['responseHeaders'] - ); - - browserProxy.webNavigation.onCommitted.addListener(onCommittedListener); - browserProxy.webNavigation.onCompleted.addListener(onCompletedListener); - browserProxy.tabs.onRemoved.addListener(onRemovedListener); - browserProxy.runtime.onMessage.addListener(onMessageListener); - - areListenersRegistered = true; - } - - function unregisterListeners() { - - browserProxy.webRequest.onBeforeRequest.removeListener( - onBeforeRequestListener - ); - - browserProxy.webRequest.onSendHeaders.removeListener( - onSendHeadersListener - ); - - browserProxy.webRequest.onHeadersReceived.removeListener( - onHeadersReceivedListener - ); - - browserProxy.webRequest.onBeforeRedirect.removeListener( - onBeforeRedirectListener - ); - - browserProxy.webRequest.onResponseStarted.removeListener( - onResponseStartedListener - ); - - browserProxy.webNavigation.onCommitted.removeListener(onCommittedListener); - browserProxy.webNavigation.onCompleted.removeListener(onCompletedListener); - browserProxy.tabs.onRemoved.removeListener(onRemovedListener); - browserProxy.runtime.onMessage.removeListener(onMessageListener); - - areListenersRegistered = false; - } - - function areRequiredBrowserApisAvailable() { - return requiredBrowserApis.every(function(api) { - return typeof api !== 'undefined'; - }); - } - - if ( areRequiredBrowserApisAvailable() ) { - ifBrowserValid( - function() { - browserProxy.webNavigation.onBeforeNavigate.addListener( - function(details) { - if ( details.frameId === 0 ) { - globalPageContainer.onNewNavigation(details); - } - }, - { - url: [{urlMatches: 'http://*/*'}, {urlMatches: 'https://*/*'}] - } - ); - }, function() { - - } - ); - } - - browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) { - if ( request === 'is_browser_valid' ) { - ifBrowserValid( - sendResponse({'browser_valid': true}), - sendResponse({'browser_valid': false}) - ); - } - }); - - browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) { - if ( request === 'is_tracking_enabled' ) { - sendResponse({'tracking_enabled': isTrackingEnabled()}); - } - }); - -})(); From 1ca28b0039f287a878d4a4775e721e715bf0dace Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 14 May 2017 15:11:38 +1000 Subject: [PATCH 10/63] Fix Travis CI config --- .travis.yml | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index ca6c98893..c6d5ebf3a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,15 @@ -sudo: false -services: docker +sudo: required + +services: + - docker + after_success: - - sha256sum build/* > build/SHA256SUMS - - cat build/SHA256SUMS -script: ./run build + - sha256sum build/* > build/SHA256SUMS + - cat build/SHA256SUMS + +script: + - ./run build + deploy: provider: releases api_key: @@ -14,5 +20,6 @@ deploy: on: repo: AliasIO/Wappalyzer tags: true + env: - CXX=g++-4.8 From 520b84ad4a44beef92b185af1dccc11ecb731402 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 14 May 2017 15:38:34 +1000 Subject: [PATCH 11/63] Update README --- README.md | 28 ++++++++-------------------- bin/build | 2 ++ bin/links | 4 ++-- 3 files changed, 12 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index dbc8eaa5c..1fcef6cba 100644 --- a/README.md +++ b/README.md @@ -20,28 +20,16 @@ Refer to the [wiki](https://github.com/AliasIO/Wappalyzer/wiki) for ## Getting Started -This section describes how to set up a development environment. Everything you -need is contained in a [Docker image](https://registry.hub.docker.com/u/wappalyzer/dev/) -which is managed by Vagrant. - -Running this environment is optional but recommended as it provides some helpful tools. - -First, install [Docker](https://www.docker.com/) and [Vagrant](https://www.vagrantup.com/) -on your system. - -Clone the Wappalyzer repository and open the newly created directory in a -terminal. Run `vagrant up` to start the environment. - -Run `vagrant ssh` to access the environment and read usage instructions. +Install [Docker](https://www.docker.com/) on your system first. ```shell -$ git clone https://github.com/AliasIO/Wappalyzer.git wappalyzer -$ cd wappalyzer -$ vagrant up -$ vagrant ssh +$ git clone https://github.com/AliasIO/Wappalyzer.git +$ cd Wappalyzer +$ ./run links ``` -To stop the environment, run `vagrant halt`. +The `links` command creates symlinks for files that shared between the various +drivers (i.e. different platforms). If your file system does not support +symlinks, you need to manually copy these files (see `bin/links`). -If a new Docker image becomes available, rebuild the environment with -`vagrant destroy -y && vagrant up`. +Please run `./run validate` before submitting a pull request. diff --git a/bin/build b/bin/build index af6a94195..44f875379 100755 --- a/bin/build +++ b/bin/build @@ -2,6 +2,8 @@ cd "$(dirname $0)/.." +set -eu + ./bin/validate echo "Prettifying apps.json..." diff --git a/bin/links b/bin/links index c7905c0c4..368ce0e66 100755 --- a/bin/links +++ b/bin/links @@ -4,8 +4,8 @@ cd "$(dirname $0)/../src" echo "Creating links..." -ln -nsf ../../apps.json drivers/npm -ln -nsf ../../wappalyzer.js drivers/npm +ln -nsf ../../apps.json drivers/npm +ln -nsf ../../wappalyzer.js drivers/npm ln -nsf ../../apps.json drivers/webextension ln -nsf ../../../wappalyzer.js drivers/webextension/js From f26481897ccfd042b4db5ed06b12fa6f03e58ccd Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 14 May 2017 15:41:51 +1000 Subject: [PATCH 12/63] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1fcef6cba..ae5627f3d 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,6 @@ $ ./run links The `links` command creates symlinks for files that shared between the various drivers (i.e. different platforms). If your file system does not support -symlinks, you need to manually copy these files (see `bin/links`). +symlinks, you need to manually copy these files (see [`bin/links`](https://github.com/AliasIO/Wappalyzer/blob/master/bin/links)). Please run `./run validate` before submitting a pull request. From 22a4ceef55246b49028069f25daf71e9461e5728 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 14 May 2017 15:54:29 +1000 Subject: [PATCH 13/63] Ignore optipng error exit code --- bin/build | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/build b/bin/build index 44f875379..7fa8816d0 100755 --- a/bin/build +++ b/bin/build @@ -16,9 +16,12 @@ echo "Converting SVG icons to PNG..." echo "Compressing PNG icons..." +set +e + optipng -quiet "src/icons/*.png" optipng -quiet "src/icons/converted/*.png" +set -e # WebExtension echo "Building WebExtension..." From 93f80b402b658335923f4064e667774fec65341c Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 14 May 2017 15:59:58 +1000 Subject: [PATCH 14/63] Remove Vagrantfile --- Vagrantfile | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 Vagrantfile diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index b4d0f218c..000000000 --- a/Vagrantfile +++ /dev/null @@ -1,20 +0,0 @@ -ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker' - -SYNCED_FOLDER = "/home/wappalyzer/synced" - -Vagrant.configure("2") do |config| - config.vm.synced_folder ".", SYNCED_FOLDER - - config.vm.provider "docker" do |d| - d.image = "wappalyzer/dev" - d.has_ssh = true - d.remains_running = true - end - - config.ssh.port = "22" - config.ssh.username = "wappalyzer" - config.ssh.private_key_path = "docker/ssh/insecure.key" - - config.vm.provision "shell", inline: "su - wappalyzer -c 'wappalyzer links'" - config.vm.provision "shell", inline: "echo Finished. Run \\`vagrant ssh\\` to access the environment." -end From b2b77a665d522322e9652cdd5268a65091fb8c87 Mon Sep 17 00:00:00 2001 From: Limon Monte Date: Sun, 14 May 2017 11:29:30 +0300 Subject: [PATCH 15/63] Add "excludes": "SweetAlert" to SweetAlert2 configuration --- src/apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 40cb8cd92..6529c94ec 100755 --- a/src/apps.json +++ b/src/apps.json @@ -7791,6 +7791,7 @@ "cats": [ "12" ], + "excludes": "SweetAlert", "html": "]+?href=\"[^\"]+sweetalert2(?:\\.min)?\\.css", "icon": "SweetAlert2.png", "script": "sweetalert2(?:\\.min)?\\.js", @@ -10494,4 +10495,4 @@ "priority": "9" } } -} \ No newline at end of file +} From 7e6b07234bb8da99e1d6fd391307afa144459e0c Mon Sep 17 00:00:00 2001 From: MicroDreamIT Date: Sun, 14 May 2017 21:35:21 +0600 Subject: [PATCH 16/63] updating shapecss for unminified version --- src/apps.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index 40cb8cd92..fe862117e 100755 --- a/src/apps.json +++ b/src/apps.json @@ -7156,7 +7156,11 @@ "env": "^Shapecss$", "html": "]* href=\"[^\"]*shapecss(?:\\.min)?\\.css", "icon": "Shapecss.svg", - "script": "shapecss(?:\\.min)?\\.js", + "script": [ + "shapecss(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "/([\\d.]+)/shapecss(?:\\.min)?\\.js\\;version:\\1", + "shapecss.*\\.js" + ], "website": "https://shapecss.com" }, "ShareThis": { @@ -10494,4 +10498,4 @@ "priority": "9" } } -} \ No newline at end of file +} From b74ee150c7c28b87eaca629ba43178cb7e4c18ef Mon Sep 17 00:00:00 2001 From: MicroDreamIT Date: Sun, 14 May 2017 23:09:39 +0600 Subject: [PATCH 17/63] Update apps.json replacing (?:\\-|\\.) with [-.] --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index fe862117e..f74ac5a5a 100755 --- a/src/apps.json +++ b/src/apps.json @@ -7157,7 +7157,7 @@ "html": "]* href=\"[^\"]*shapecss(?:\\.min)?\\.css", "icon": "Shapecss.svg", "script": [ - "shapecss(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "shapecss[-.]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "/([\\d.]+)/shapecss(?:\\.min)?\\.js\\;version:\\1", "shapecss.*\\.js" ], From 6d051a41d86909fe9832eac0b69ca68d4553b86a Mon Sep 17 00:00:00 2001 From: Nguyen Van Thao Date: Wed, 17 May 2017 21:54:46 +0800 Subject: [PATCH 18/63] Add Haravan detector --- src/apps.json | 11 ++++++++++- src/icons/Haravan.png | Bin 0 -> 1002217 bytes 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/icons/Haravan.png diff --git a/src/apps.json b/src/apps.json index 40cb8cd92..9f31f418b 100755 --- a/src/apps.json +++ b/src/apps.json @@ -3352,6 +3352,15 @@ "implies": "OmniTouch 8660 My Teamwork", "website": "http://example.com" }, + "Haravan": { + "cats": [ + "6" + ], + "env": "^Haravan$", + "icon": "Haravan.png", + "script": "haravan.*\\.js", + "website": "https://www.haravan.com" + }, "Haskell": { "cats": [ "27" @@ -10494,4 +10503,4 @@ "priority": "9" } } -} \ No newline at end of file +} diff --git a/src/icons/Haravan.png b/src/icons/Haravan.png new file mode 100644 index 0000000000000000000000000000000000000000..e5d48e6b20a41b124dff59e71e2f711f2a5500d6 GIT binary patch literal 1002217 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 literal 0 HcmV?d00001 From dc2b03b95d3f7349483ea49fab4704b4dd8ada0b Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 15:40:14 +0200 Subject: [PATCH 19/63] updated virtuoso recognition updated virtuoso recognition: adjusted Server header regex --- src/apps.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 9d2f99f3e..d4091bfe8 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8442,7 +8442,9 @@ "Copyright": "^Copyright © \\d{4} OpenLink Software" }, "url": "^https?://(?:[^\\/]+\\.)?.*?/sparql\\;confidence:20", - "Server": "Virtuoso:*?\\;version:\\1" + "headers": { + "Server": "^.*Virtuoso\/(\d{2}.\d{2}.\d{4}).*$;version:\\1" + } }, "Visual WebGUI": { "cats": [ From abb41d3156efc14a57667ffcfbfa368a491b0dc0 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 15:42:50 +0200 Subject: [PATCH 20/63] updated virtuoso recognition updated virtuoso recognition: changed regex for "Server" header, which is more reliable than using `/sparql` --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index d4091bfe8..081fbaef7 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8443,7 +8443,7 @@ }, "url": "^https?://(?:[^\\/]+\\.)?.*?/sparql\\;confidence:20", "headers": { - "Server": "^.*Virtuoso\/(\d{2}.\d{2}.\d{4}).*$;version:\\1" + "Server": "^.*Virtuoso\\/(\\d{2}\\.\\d{2}\\.\\d{4}).*$;version:\\1" } }, "Visual WebGUI": { From a55a71feadc9fa8a7573ce180e7884464b369689 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 16:07:33 +0200 Subject: [PATCH 21/63] updates on virtuoso detection updates on virtuoso detection: updating regex for avoiding issues with travis CI --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 081fbaef7..4000881c5 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8443,7 +8443,7 @@ }, "url": "^https?://(?:[^\\/]+\\.)?.*?/sparql\\;confidence:20", "headers": { - "Server": "^.*Virtuoso\\/(\\d{2}\\.\\d{2}\\.\\d{4}).*$;version:\\1" + "Server": "^.*?Virtuoso\\/(\\d{2}\\.\\d{2}\\.\\d{4}).*?$;version:\\1" } }, "Visual WebGUI": { From 4149446b5286d52d4d21a24bee313eb504a549bd Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 16:11:59 +0200 Subject: [PATCH 22/63] updated regex for virtuoso detection updated regex for virtuoso detection --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 4000881c5..bee1fe559 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8443,7 +8443,7 @@ }, "url": "^https?://(?:[^\\/]+\\.)?.*?/sparql\\;confidence:20", "headers": { - "Server": "^.*?Virtuoso\\/(\\d{2}\\.\\d{2}\\.\\d{4}).*?$;version:\\1" + "Server": "^(?:.*)Virtuoso\\/(\\d{2}\\.\\d{2}\\.\\d{4})(?:.*)$;version:\\1" } }, "Visual WebGUI": { From 76b964ca8ee9872afcb257a59c3f4c95df009e4d Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 16:15:54 +0200 Subject: [PATCH 23/63] updated virtuoso detection regex updated virtuoso detection regex --- src/apps.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index bee1fe559..a7b68b85d 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8443,7 +8443,9 @@ }, "url": "^https?://(?:[^\\/]+\\.)?.*?/sparql\\;confidence:20", "headers": { - "Server": "^(?:.*)Virtuoso\\/(\\d{2}\\.\\d{2}\\.\\d{4})(?:.*)$;version:\\1" + "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1" + + "Server": "Virtuoso\\/?(\\d{2}\\.\\d{2}\\.\\d{4})?\\;version:\\1" } }, "Visual WebGUI": { From 0c205c95d8cb81ad93627528372d89038da87df1 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 16:19:20 +0200 Subject: [PATCH 24/63] updated regex for virtuoso version detection updated regex for virtuoso version detection --- src/apps.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index a7b68b85d..583c18f51 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8443,8 +8443,6 @@ }, "url": "^https?://(?:[^\\/]+\\.)?.*?/sparql\\;confidence:20", "headers": { - "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1" - "Server": "Virtuoso\\/?(\\d{2}\\.\\d{2}\\.\\d{4})?\\;version:\\1" } }, From 4aa28571c0a11eaf5c181ef1b8f46e941e9e3984 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 16:27:48 +0200 Subject: [PATCH 25/63] updating virtuoso detection updating virtuoso detection: the `/sparql` endpoint should be found, but it could be provided by other vendors, so we can use a low confidence value --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 583c18f51..98abd0414 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8441,7 +8441,7 @@ "Keywords": "^OpenLink Virtuoso Sparql", "Copyright": "^Copyright © \\d{4} OpenLink Software" }, - "url": "^https?://(?:[^\\/]+\\.)?.*?/sparql\\;confidence:20", + "url": "(?:)[^\/]+\/sparql\\;confidence:20", "headers": { "Server": "Virtuoso\\/?(\\d{2}\\.\\d{2}\\.\\d{4})?\\;version:\\1" } From 961011c4e6b2bcbf51c7bcbc8d25b79c3b1c19f2 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 16:35:24 +0200 Subject: [PATCH 26/63] updating virtuoso detection updating virtuoso detection --- src/apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps.json b/src/apps.json index 98abd0414..3af8188a3 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8437,6 +8437,7 @@ "cats": [ "34" ], + "website": "https://virtuoso.openlinksw.com/", "meta": { "Keywords": "^OpenLink Virtuoso Sparql", "Copyright": "^Copyright © \\d{4} OpenLink Software" From 1db2e7da3c03ddecafadf032ddaed86917e6a6d3 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 16:46:47 +0200 Subject: [PATCH 27/63] updated CKAN detection updated CKAN detection --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index c0224dd1c..a1dd630a5 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1367,7 +1367,7 @@ "PostgreSQL\\;confidence:80" ], "meta": { - "generator": "^ckan\\s+(\\d{1,}\\.\\d{1,}\\.\\d{1,})$" + "generator": "(?:)ckan\s+(\d{1,}\.\d{1,}\.\d{1,})(?:)" }, "website": "http://ckan.org/" }, From 4c3732e4896d02d862cc26f3db61fe8e5dfbf205 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 16:47:46 +0200 Subject: [PATCH 28/63] updated CKAN detection updated CKAN detection --- src/apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index a1dd630a5..963a57a2d 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1364,10 +1364,10 @@ "Python", "Solr", "Java", - "PostgreSQL\\;confidence:80" + "PostgreSQL" ], "meta": { - "generator": "(?:)ckan\s+(\d{1,}\.\d{1,}\.\d{1,})(?:)" + "generator": "(?:)ckan\s+(\\d{1,}\\.\\d{1,}\\.\\d{1,})(?:)" }, "website": "http://ckan.org/" }, From 9670e9aa5c32212e51b6f3403e7ea490568bd601 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 16:48:11 +0200 Subject: [PATCH 29/63] updated CKAN detection updated CKAN detection --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 963a57a2d..0c5e9e306 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1367,7 +1367,7 @@ "PostgreSQL" ], "meta": { - "generator": "(?:)ckan\s+(\\d{1,}\\.\\d{1,}\\.\\d{1,})(?:)" + "generator": "(?:)ckan\\s+(\\d{1,}\\.\\d{1,}\\.\\d{1,})(?:)" }, "website": "http://ckan.org/" }, From 06286eb33b31952100546bd07f3387b13f27c8ef Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 16:53:30 +0200 Subject: [PATCH 30/63] updated CKAN regex detection updated CKAN regex detection --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 0c5e9e306..12671a939 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1367,7 +1367,7 @@ "PostgreSQL" ], "meta": { - "generator": "(?:)ckan\\s+(\\d{1,}\\.\\d{1,}\\.\\d{1,})(?:)" + "generator": "(?:)ckan(?:)" }, "website": "http://ckan.org/" }, From c371e3c46dd23c9a905fd04ff6ae571ede9e16af Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Fri, 19 May 2017 17:05:31 +0200 Subject: [PATCH 31/63] added RDF/SPARQL languages added RDF/SPARQL languages, for capturing dependencies in sites exposing SPARQL endpoints or JSON-LD API --- src/apps.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 40cb8cd92..5ab43b7c4 100755 --- a/src/apps.json +++ b/src/apps.json @@ -6588,6 +6588,12 @@ "icon": "Raspbian.svg", "website": "https://www.raspbian.org/" }, + "Rdf": { + "cats": [ + "27" + ], + "website": "https://www.w3.org/RDF/" + }, "React": { "cats": [ "12" @@ -7522,6 +7528,12 @@ "icon": "SoundManager.png", "website": "http://www.schillmania.com/projects/soundmanager2" }, + "Sparql": { + "cats": [ + "27" + ], + "website": "https://www.w3.org/TR/sparql11-overview/" + }, "Sphinx": { "cats": [ "4" @@ -10494,4 +10506,4 @@ "priority": "9" } } -} \ No newline at end of file +} From fbfa4dbbb67c5117d02da65f2d0c6570a0d9be1e Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 20 May 2017 13:50:44 +1000 Subject: [PATCH 32/63] Fix parsing of meta tags --- bin/help | 2 +- src/wappalyzer.js | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/bin/help b/bin/help index 736fc925f..dc2fd3e8d 100755 --- a/bin/help +++ b/bin/help @@ -6,6 +6,6 @@ usage: ./run [] The following commands are available: build Package drivers help This help text - links Create hard links to shared files in each driver + links Create symlinks to shared files in each driver validate Validate apps.json EOF diff --git a/src/wappalyzer.js b/src/wappalyzer.js index aa7b2f03e..540ad46ec 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -470,7 +470,14 @@ var wappalyzer = (function() { regex = /]+>/ig, patterns = parsePatterns(w.apps[app.app].meta); - if ( patterns.length ) { + w.log('Function call: analyzeMeta'); + + if ( app.app === 'CloudCart' ) { + w.log('xxx'); + w.log(patterns); + } + + if ( patterns ) { while ( match = regex.exec(html) ) { for ( meta in patterns ) { if ( new RegExp('(name|property)=["\']' + meta + '["\']', 'i').test(match) ) { From 04531bdee5315204b4b6fcaea24eb566677882ca Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 21 May 2017 09:05:20 +1000 Subject: [PATCH 33/63] Fix internationalisation in WebExtension --- src/apps.json | 4 ++-- src/drivers/webextension/js/i18n.js | 12 ++++-------- src/drivers/webextension/options.html | 1 - src/wappalyzer.js | 7 ------- 4 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/apps.json b/src/apps.json index 40cb8cd92..2e8ee4c79 100755 --- a/src/apps.json +++ b/src/apps.json @@ -10070,7 +10070,7 @@ "html": "(?:]+id=\"recaptcha_image|]+recaptcha|document\\.getElementById\\('recaptcha')", "icon": "reCAPTCHA.png", "script": "(?:api-secure\\.recaptcha\\.net|recaptcha_ajax\\.js)", - "website": "http://recaptcha.net" + "website": "https://www.google.com/recaptcha/" }, "sIFR": { "cats": [ @@ -10494,4 +10494,4 @@ "priority": "9" } } -} \ No newline at end of file +} diff --git a/src/drivers/webextension/js/i18n.js b/src/drivers/webextension/js/i18n.js index 1b69f9f58..c5ea110e3 100644 --- a/src/drivers/webextension/js/i18n.js +++ b/src/drivers/webextension/js/i18n.js @@ -1,13 +1,9 @@ /** global: browser */ document.addEventListener('DOMContentLoaded', function() { - var - i, value, - nodes = document.querySelector('*'); + var nodes = document.querySelectorAll('[data-i18n]'); - for ( i = 0; i < nodes.length; i ++ ) { - if ( value = nodes[i].dataset.i18n ) { - nodes[i].innerHTML = browser.i18n.getMessage(value); - } - } + nodes.forEach(function(node) { + node.innerHTML = browser.i18n.getMessage(node.dataset.i18n); + }); }); diff --git a/src/drivers/webextension/options.html b/src/drivers/webextension/options.html index 755b909e2..caee7dcdc 100644 --- a/src/drivers/webextension/options.html +++ b/src/drivers/webextension/options.html @@ -12,7 +12,6 @@ - diff --git a/src/wappalyzer.js b/src/wappalyzer.js index 540ad46ec..093ab7c80 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -470,13 +470,6 @@ var wappalyzer = (function() { regex = /]+>/ig, patterns = parsePatterns(w.apps[app.app].meta); - w.log('Function call: analyzeMeta'); - - if ( app.app === 'CloudCart' ) { - w.log('xxx'); - w.log(patterns); - } - if ( patterns ) { while ( match = regex.exec(html) ) { for ( meta in patterns ) { From d5b727c76a70befde93da1e3ec656ffb89ab13e3 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Sun, 21 May 2017 18:34:04 +0200 Subject: [PATCH 34/63] updating ckan detection updating ckan detection - trying to remove non-capturing groups --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 12671a939..f948a91f9 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1367,7 +1367,7 @@ "PostgreSQL" ], "meta": { - "generator": "(?:)ckan(?:)" + "generator": "ckan" }, "website": "http://ckan.org/" }, From 0dbf154deed16607791903dcb4a46faf33902379 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Sun, 21 May 2017 18:40:12 +0200 Subject: [PATCH 35/63] updating ckan detection updating ckan detection --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index f948a91f9..7ad05197c 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1367,7 +1367,7 @@ "PostgreSQL" ], "meta": { - "generator": "ckan" + "generator": ".*ckan.*" }, "website": "http://ckan.org/" }, From 037dfd24d3f0e855b1921a81d7bfb93243949503 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Sun, 21 May 2017 18:48:52 +0200 Subject: [PATCH 36/63] updatd virtuoso detection updatd virtuoso detection --- src/apps.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 3af8188a3..4a2f93dee 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8442,7 +8442,6 @@ "Keywords": "^OpenLink Virtuoso Sparql", "Copyright": "^Copyright © \\d{4} OpenLink Software" }, - "url": "(?:)[^\/]+\/sparql\\;confidence:20", "headers": { "Server": "Virtuoso\\/?(\\d{2}\\.\\d{2}\\.\\d{4})?\\;version:\\1" } From 009a186cdc113d572dcd4650f852fb001dc730c4 Mon Sep 17 00:00:00 2001 From: Alfredo Serafini Date: Sun, 21 May 2017 19:07:12 +0200 Subject: [PATCH 37/63] updating virtuoso detection updating virtuoso detection --- src/apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps.json b/src/apps.json index 4a2f93dee..345f4097f 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8442,6 +8442,7 @@ "Keywords": "^OpenLink Virtuoso Sparql", "Copyright": "^Copyright © \\d{4} OpenLink Software" }, + "url": ".*/sparql\\.*", "headers": { "Server": "Virtuoso\\/?(\\d{2}\\.\\d{2}\\.\\d{4})?\\;version:\\1" } From 6c64cd658b54a4977d9b0faaf3872af553eed522 Mon Sep 17 00:00:00 2001 From: wpCache Date: Mon, 22 May 2017 22:47:04 +0300 Subject: [PATCH 38/63] Delete wpCache.png --- src/icons/wpCache.png | Bin 1218 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/icons/wpCache.png diff --git a/src/icons/wpCache.png b/src/icons/wpCache.png deleted file mode 100644 index 12470ff470a18122121f503e488dc4f5f1b62686..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+081LLXypAc6gBLf2iJ$-#$ zLqmOUZ_n1&mX#}4u3NWm`t)h3smT@=W?5O8w{PG6|NsBrzkmPy`Sbnz_nw|^Jw2U> zi15dcAFp1$Dlac5Jw3I(z3t4IGm922jEah=s;Y2taWXM6vbVR*%uFvXE^>6V&(F^- zE-tLBEbr~@$;->Nv9U5XHk>+jik+Q}hlg8pb5l=Gm#(gMNJ#L#d-oPDT;S*D^Zfbq zbLY+m1o-{?_wU!QUpsc}xO3xYir8~4<5L=xwf^nc6D_) zIXOIh_~7HmkCl}bM~)nsIdg`mr~8W+FDxz1mn~cR^XJd9vXT=gjswB-=g)k7y`7yM z&CN}9bhLtk0$#s5{m(7%MA_Z{NO^loTf?Cp~=lFe4*<>((s`7A*Mv`}fYBJIl+<3JUUO&6>Gn z$>N5F`mV0d!-o$)cyQm#%QG%6_Uzd+6&2+U4))d6m9@3ij~+d|ckk}Ri4$heo>f?w zKV{0~88fEW*4Fs@`<^*-y1u^7)YSMz^!IPT=wwXtc6Z_Zwk7c^ki%Kv5m^jO9@jyb z(Me-=1yGQ^#M9T6{UNgqw~+FzR5@VOGX{IQIEGl9PEL?u6=8H!OG{Hzv-za6Cg+XJ zoR}R?X6~%4`1zxfl||CAt93>ri-55qBQGmc8k<|9AY-6mA*ZM20)x$4dUQ6+blYs6 z)3j*Prmj`9cCjs9rm=q790B3U+xRXpsKwgZ)-pRQrzHyq8#@=<#c_K_s%mFTPk4Cd zjDmE|+c&aTDrD!*IU5^u_l~8FP37J_wLY~IW1c*h7dUZRUrcOcwdUo?=GxXB=63EHmgbX8 z_2+MIFl<`BVa1LmSJv?)xmd1W>CBqHR6n^$biJkh{B%>}WMAF=J1y6H%0@62*E;hi z7cDk0E-nf#_Fmm16fh-l<=VZAH+u_9<@xmRoN;oPlXG`26PLyY2?2ve>;*+RYxSA! z9^4kb&}~2Iqw9wcYz%KVn8!V{lMeufxLAp6M2T}zYGO%dex5=|W^O8jfw8`kg}$M= zxSi4jpbAxxij>5XRI6l=vQ!2m14DCN17lqyix5LYD?D9TUE%t=)!sVqoU$Sf#HW?-n8^Y{}FM`4(T#wq{PXFQ(m_pw zD+_y17GV}vaA`0(oWiWUIYi;~jVmXPoH-(Mg#C1b#{w@shF9W(C7+y3rvj~D@O1Ta JS?83{1OWF^^40(V From 683b1a850d113d15707adb6f03f718f16c468f58 Mon Sep 17 00:00:00 2001 From: wpCache Date: Mon, 22 May 2017 22:48:32 +0300 Subject: [PATCH 39/63] Add files via upload re-make logo Thanks! --- src/icons/wpCache.png | Bin 0 -> 751 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/icons/wpCache.png diff --git a/src/icons/wpCache.png b/src/icons/wpCache.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a21e3437a6165c8bc1c5e6d6bb0a7c4e6d819a GIT binary patch literal 751 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKpuOE zr>`sfLsl^nBSY@{yMh@Q7^ir;IEHu}e|yzFBREim?ZbWUOed|kj~*nj2Ra7MDJj}e zwrbJhlqpssj)MOi^;(_Sn-@4QwBm407wl?kRthN)5MP;hbYWA8VAQH5zLTe$=$Te- zJwJV!Xvv4!=WM^-%PDya@=nGPEzz( zzPzzmr#heQyy`c*`c@cUopz_v`P)vBr5WuFbLO=B?YcB&Uf$!XljY{EUFWJ^I{#)V z*7H&Q)0X`jF%=%?{}N?`PNm7gZp=#;(KkX_nw8VRI=0WI8FIx#;TG`i0{Egk4TY6rTuq zl#ppxb>Y-`*ODz?w@T#tPVt>}KkH3Bmp#Mf;|Uuy-v)dFMwx1fYeY#(Vo9o1a#1Rf zVlXl=G}kpS)ip8-F*2|+HLxnd*LvDUbW?Cg~4H}$W2|x|uRUr{2 zL5bxG1x5L3nK`KnC6xuK3Yi5Z$qWn?a~^-<;V2B#&^YCP`i$q(AO>b-ZoOn~VP#?O z$s)|c3N8&Mhf|o9H-{*kzH#NmkuyhRj Date: Wed, 24 May 2017 00:35:35 -0300 Subject: [PATCH 40/63] Added Navegg --- src/apps.json | 9 +++++++++ src/icons/Navegg.png | Bin 0 -> 862 bytes 2 files changed, 9 insertions(+) create mode 100644 src/icons/Navegg.png diff --git a/src/apps.json b/src/apps.json index 1bd29ec82..fc380fec9 100755 --- a/src/apps.json +++ b/src/apps.json @@ -5356,6 +5356,15 @@ "script": "nv\\.d3(?:\\.min)?\\.js", "website": "http://nvd3.org" }, + "Navegg": { + "cats": [ + "10" + ], + "env": "^nvg[0-9]$", + "icon": "Navegg.png", + "script": "tag.navdmp.com", + "website": "https://www.navegg.com/" + }, "Nedstat": { "cats": [ "10" diff --git a/src/icons/Navegg.png b/src/icons/Navegg.png new file mode 100644 index 0000000000000000000000000000000000000000..037dc61f515cd80427d79dc24614bae57830c03a GIT binary patch literal 862 zcmV-k1EKthP)`bA1=e)(3+q>`Hd6el*ujX5~Zol98 z-SfHU+~573V*>=x$d4RFpUxe50?_Pva;&T9J4Ou+4Rm&PVz=A5y1F7Bk6YRm7Z(!_ zhbb>FH;jLLe6YE>NivzVT&I%$4op{FU7hUi?n)|^lHYZHelCGPz+^u$F(KJBJw0vZ zL(Q53zu(XC@iC!L2%F7jm}_Zi;qdT~_V#wexYz5=_Bc~iGO`3HEiEM)jZ#xngNU%Y zx=JV%VsLPf<>h5Wgo=s^Ha0dWDJe0ne|mZ%7z`2&201%B%L<9g_(rlw4x z8y+6k=f}pz^zpg5IS~=Lxw+BD_V@QiL?jZ4d_M)fy}bZjTwE|eKM#P@=|oW!0M^&n ziN#_73=Iu^`G$X!B|sn$03a5Np=lb5qHukEO(Kz?s;UZrXfz5yb8~a<0o-mk0FRH4 z0Qh`9>g((Acs#np=jUetTrOAc0WuO10K+c$b4UDCdH)j@015yFfC9k(3-J2-3ZzfT z%-Io-#}N@uPEK^Y%F0S0U6$n(;P&=bzwhem0$^)v3!l%&=;$Z_)z#Iswzit=a{_RA zdCA?~9RRblvwF$(@bG}9rQ3{!g$0~WCvR_W?CtI4764#oW(I)9#zu~gj_B|2$Lsad z-QCU3&JN*l7=XpaMg91;lBpz1CX*r}GC4UZfcX7>y#(v&=`q-@t*vFPghfP7PftZr z6w9jn)3+HQkw}P$$jHcu0OIj@L{(K05ou~_GT1sC4v9n}^8WsAaGXk|WMySVTrO8O z=K`pOMri<{P%`7^4y;P0*0BfO%=gYmH+?%07*qoM6N<$f^~t2sQ>@~ literal 0 HcmV?d00001 From d882aca41df6bebcab2caf61deb52c94c3fa7708 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 27 May 2017 14:17:52 +1000 Subject: [PATCH 41/63] Replace innerHTML with jsonToDOM --- .../webextension/_locales/en/messages.json | 2 +- src/drivers/webextension/js/i18n.js | 2 +- src/drivers/webextension/js/jsontodom.js | 63 ++++++++++++++ src/drivers/webextension/js/popup.js | 83 ++++++++++++++----- src/drivers/webextension/popup.html | 1 + 5 files changed, 126 insertions(+), 25 deletions(-) create mode 100644 src/drivers/webextension/js/jsontodom.js diff --git a/src/drivers/webextension/_locales/en/messages.json b/src/drivers/webextension/_locales/en/messages.json index 3edc49047..94a1db7d8 100644 --- a/src/drivers/webextension/_locales/en/messages.json +++ b/src/drivers/webextension/_locales/en/messages.json @@ -18,7 +18,7 @@ "categoryName6": { "message": "Ecommerce" }, "categoryName7": { "message": "Photo Galleries" }, "categoryName8": { "message": "Wikis" }, - "categoryName9": { "message": "Hostin Panels" }, + "categoryName9": { "message": "Hosting Panels" }, "categoryName10": { "message": "Analytics" }, "categoryName11": { "message": "Blog" }, "categoryName12": { "message": "JavaScript Framework" }, diff --git a/src/drivers/webextension/js/i18n.js b/src/drivers/webextension/js/i18n.js index c5ea110e3..6921c0f0f 100644 --- a/src/drivers/webextension/js/i18n.js +++ b/src/drivers/webextension/js/i18n.js @@ -4,6 +4,6 @@ document.addEventListener('DOMContentLoaded', function() { var nodes = document.querySelectorAll('[data-i18n]'); nodes.forEach(function(node) { - node.innerHTML = browser.i18n.getMessage(node.dataset.i18n); + node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n); }); }); diff --git a/src/drivers/webextension/js/jsontodom.js b/src/drivers/webextension/js/jsontodom.js new file mode 100644 index 000000000..d77df83f8 --- /dev/null +++ b/src/drivers/webextension/js/jsontodom.js @@ -0,0 +1,63 @@ +jsonToDOM.namespaces = { + html: "http://www.w3.org/1999/xhtml", + xul: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" +}; + +jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html; + +function jsonToDOM(jsonTemplate, doc, nodes) { + function namespace(name) { + var reElemNameParts = /^(?:(.*):)?(.*)$/.exec(name); + return { namespace: jsonToDOM.namespaces[reElemNameParts[1]], shortName: reElemNameParts[2] }; + } + + // Note that 'elemNameOrArray' is: either the full element name (eg. [html:]div) or an array of elements in JSON notation + function tag(elemNameOrArray, elemAttr) { + // Array of elements? Parse each one... + if (Array.isArray(elemNameOrArray)) { + var frag = doc.createDocumentFragment(); + Array.forEach(arguments, function(thisElem) { + frag.appendChild(tag.apply(null, thisElem)); + }); + return frag; + } + + // Single element? Parse element namespace prefix (if none exists, default to defaultNamespace), and create element + var elemNs = namespace(elemNameOrArray); + var elem = doc.createElementNS(elemNs.namespace || jsonToDOM.defaultNamespace, elemNs.shortName); + + // Set element's attributes and/or callback functions (eg. onclick) + for (var key in elemAttr) { + var val = elemAttr[key]; + if (nodes && key == "key") { + nodes[val] = elem; + continue; + } + + var attrNs = namespace(key); + if (typeof val == "function") { + // Special case for function attributes; don't just add them as 'on...' attributes, but as events, using addEventListener + elem.addEventListener(key.replace(/^on/, ""), val, false); + } + else { + // Note that the default namespace for XML attributes is, and should be, blank (ie. they're not in any namespace) + elem.setAttributeNS(attrNs.namespace || "", attrNs.shortName, val); + } + } + + // Create and append this element's children + var childElems = Array.slice(arguments, 2); + childElems.forEach(function(childElem) { + if (childElem != null) { + elem.appendChild( + childElem instanceof doc.defaultView.Node ? childElem : + Array.isArray(childElem) ? tag.apply(null, childElem) : + doc.createTextNode(childElem)); + } + }); + + return elem; + } + + return tag.apply(null, jsonTemplate); +} diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js index eb760d34c..88fcf6eb8 100644 --- a/src/drivers/webextension/js/popup.js +++ b/src/drivers/webextension/js/popup.js @@ -9,7 +9,9 @@ if ( /complete|interacrive|loaded/.test(document.readyState) ) { popup.displayApps(response) } else { - document.addEventListener('DOMContentLoaded', function() { popup.displayApps(response) }); + document.addEventListener('DOMContentLoaded', function() { + popup.displayApps(response) + }); } }); }; @@ -26,45 +28,80 @@ displayApps: function(response) { var appName, confidence, version, - detectedApps = document.querySelector('#detected-apps'); - html = ''; + detectedApps = document.querySelector('#detected-apps'), + categories = [], + json = []; if ( response.tabCache && response.tabCache.count > 0 ) { for ( appName in response.tabCache.appsDetected ) { confidence = response.tabCache.appsDetected[appName].confidenceTotal; version = response.tabCache.appsDetected[appName].version; - html += - ''; + json.push( + [ + 'div', { + class: 'detected-app' + }, [ + 'a', { + target: '_blank', + href: 'https://wappalyzer.com/applications/' + popup.slugify(appName) + }, [ + 'img', { + src: 'images/icons/' + ( response.apps[appName].icon || 'default.svg' ) + } + ], [ + 'span', { + class: 'label' + }, [ + 'span', { + class: 'name' + }, + appName + ], + ( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' ) + ] + ], + categories + ] + ); } } else { - html = '
' + browser.i18n.getMessage('noAppsDetected') + '
'; + json = [ + 'div', { + class: 'empty' + }, + browser.i18n.getMessage('noAppsDetected') + ]; } - detectedApps.innerHTML = html; + detectedApps.appendChild(jsonToDOM(json, document, {})); // Force redraw after popup animation on Mac OS setTimeout(function() { - document.body.innerHTML += ' '; - }, 600); + document.body.appendChild(jsonToDOM([ 'span', { style: 'line-height: 1px;' }], document, {})); + }, 800); }, slugify: function(string) { diff --git a/src/drivers/webextension/popup.html b/src/drivers/webextension/popup.html index afa6e0976..72b598cda 100644 --- a/src/drivers/webextension/popup.html +++ b/src/drivers/webextension/popup.html @@ -7,6 +7,7 @@ + From 8df949c8cdc175b05ae760cec8d78208d55194fb Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 27 May 2017 14:33:42 +1000 Subject: [PATCH 42/63] Fix jsonToDOM in Chrome --- .gitignore | 2 + package.json | 3 +- src/drivers/webextension/.gitignore | 2 - src/drivers/webextension/js/iframe.js | 975 +++++++++++++++++++++++ src/drivers/webextension/js/jsontodom.js | 4 +- src/drivers/webextension/js/network.js | 785 ++++++++++++++++++ 6 files changed, 1766 insertions(+), 5 deletions(-) create mode 100644 src/drivers/webextension/js/iframe.js create mode 100644 src/drivers/webextension/js/network.js diff --git a/.gitignore b/.gitignore index b604acc93..22170b159 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ Thumbs.db Desktop.ini *.DS_Store ._* +tags +tags.* diff --git a/package.json b/package.json index 2148f0f67..dd2dbe93d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,8 @@ "dependencies": { "file-type": "3.8.*", "is-svg": "2.0.*", - "read-chunk": "2.0.*" + "read-chunk": "2.0.*", + "svg2png-many": "*" } } diff --git a/src/drivers/webextension/.gitignore b/src/drivers/webextension/.gitignore index 3e368c431..33d24a6d7 100644 --- a/src/drivers/webextension/.gitignore +++ b/src/drivers/webextension/.gitignore @@ -2,5 +2,3 @@ /images/icons/converted/* /images/icons/* /js/wappalyzer.js -/js/iframe.js -/js/network.js diff --git a/src/drivers/webextension/js/iframe.js b/src/drivers/webextension/js/iframe.js new file mode 100644 index 000000000..2bd1fe04b --- /dev/null +++ b/src/drivers/webextension/js/iframe.js @@ -0,0 +1,975 @@ +'use strict'; + +(function(win) { + +var exports = {}; + +(function(exports) { + + var utils = { + getReferrer: function() { + + return this.hashUrl(document.referrer) || null; + + }, + + getPageUrl: function() { + + return this.hashUrl(window.location.href) || null; + + }, + + hashUrl: function(url) { + var a, + result; + + if ( !url || url.indexOf('http') !== 0 ) { + return null; + } + + a = document.createElement('a'); + a.href = url; + + result = a.protocol + '//' + a.hostname + '/'; + + if ( a.pathname && a.pathname !== '/' ) { + result += this.hashCode(a.pathname); + } + + if ( a.search ) { + result += '?' + this.hashCode(a.search); + } + + if ( a.hash ) { + result += '#' + this.hashCode(a.hash); + } + + return result; + }, + + hashCode: function(str) { + var hash = 0, + kar, + i; + + if ( str.length === 0 ) { + return hash; + } + + for ( i = 0; i < str.length; i++ ) { + kar = str.charCodeAt(i); + hash = ((hash << 5) - hash) + kar; + hash = hash & hash; + } + + return hash + Math.pow(2, 32); + }, + + realArray: function(a) { + return Array.prototype.slice.apply(a); + }, + onDocLoaded: function(doc, callback) { + if ( doc.readyState === 'loading' ) { + doc.addEventListener('DOMContentLoaded', callback); + } else { + callback(); + } + }, + + SCRIPT_IN_WINDOW_TOP: window === window.top, + + isFriendlyWindow: function(win) { + + var href; + try { + href = win.location.href; + } catch(e) { + return false; + } + return true; + }, + + elementWindow: function(el) { + return el.ownerDocument.defaultView; + }, + + viewport: function(win) { + return {width: win.innerWidth, height: win.innerHeight}; + }, + + parseQS: function(qs) { + if ( qs.indexOf('http') === 0 ) { + qs = qs.split('?')[1]; + } + var i, kvs, key, val; + var dict = {}; + qs = qs.split('&'); + for ( i = 0; i < qs.length; i++ ) { + kvs = qs[i].split('='); + key = kvs[0]; + val = kvs.slice(1).join('='); + try { + dict[key] = window.decodeURIComponent(val); + } catch (e) { + + continue; + } + } + return dict; + }, + }; + + utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent); + utils.SCRIPT_IN_HOSTILE_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && !utils.SCRIPT_IN_FRIENDLY_IFRAME; + function LogGenerator() { + this.msgNum = 0; + this.pageMeta = { + 'url': utils.getPageUrl(), + 'isHP': window.location.pathname === '/', + 'referrer': utils.getReferrer(), + 'rand': Math.floor(Math.random() * 10e12), + 'startTime': new Date().getTime() + }; + } + + LogGenerator.prototype = { + log: function(event, opt_assets, opt_pageTags) { + var result = { + doc: this.pageMeta, + event: event, + assets: opt_assets || [], + version: '3', + msgNum: this.msgNum, + timestamp: new Date().getTime(), + pageVis: document.visibilityState, + pageFoc: document.hasFocus(), + pageTags: opt_pageTags || [] + }; + this.msgNum++; + return result; + } + }; + + utils.LogGenerator = LogGenerator; + + exports.utils = utils; +})(exports); + +(function(exports) { + + var VALID_AD_SIZES = [ + [160, 600], + + [300, 250], + [300, 600], + [300, 1050], + + [336, 280], + [336, 850], + [468, 60], + [728, 90], + [728, 270], + [970, 66], + [970, 90], + [970, 125], + [970, 250], + [970, 400], + [970, 415], + [1280, 100] + ]; + + var PX_SIZE_TOL = 10; + var MIN_WINDOW_PX = 10; + var MAX_SEARCHES_PER_WINDOW = 10; + var MAX_SEARCHES_PER_ELEMENT = 2; + + function makeSizeSet(validAdSizes, sizeTol) { + var set = {}; + var i; + var xfuz; + var yfuz; + var size; + var width; + var height; + + for ( i = 0; i < validAdSizes.length; i++ ) { + for ( xfuz = -sizeTol; xfuz <= sizeTol; xfuz++ ) { + for ( yfuz = -sizeTol; yfuz <= sizeTol; yfuz++ ) { + size = validAdSizes[i]; + width = size[0] + xfuz; + height = size[1] + yfuz; + set[width + 'x' + height] = size; + } + } + } + return set; + } + + var SIZE_SET = makeSizeSet(VALID_AD_SIZES, PX_SIZE_TOL); + + function elementIsAd(el) { + if ( typeof el.searches !== 'number' ) { + el.searches = 0; + } + + if ( el.searches >= MAX_SEARCHES_PER_ELEMENT ) { + return false; + } + + el.searches += 1; + + var isImgWithoutSrc = el.tagName === 'IMG' && !el.src; + var isImgWithoutAnchor = el.tagName === 'IMG' && !(el.parentNode.tagName === 'A' || el.getAttribute('onclick')); + + return elementIsAdShaped(el) && !isImgWithoutSrc && !isImgWithoutAnchor; + } + + function isNewAd(el, win) { + return !el.mp_adFound && (win === win.top || !win.mp_adFound); + } + + function getFriendlyIframes(win) { + var iframes = win.document.querySelectorAll('iframe'); + iframes = exports.utils.realArray(iframes); + var friendlyIframes = iframes.filter(function(ifr) { + return exports.utils.isFriendlyWindow(ifr.contentWindow); + }); + return friendlyIframes; + } + + function getMatchedAdSize(width, height) { + return SIZE_SET[width + 'x' + height]; + } + + function elementIsAdShaped(el) { + return !!getMatchedAdSizeForElement(el); + } + + function getMatchedAdSizeForElement(el) { + var rect = el.getBoundingClientRect(); + return getMatchedAdSize(rect.width, rect.height); + } + + function containsLargeIframes(win) { + var iframes = win.document.querySelectorAll('iframe'); + var rect; + var i; + for ( i = 0; i < iframes.length; i++ ) { + rect = iframes[i].getBoundingClientRect(); + if ( rect.width > 10 || rect.height > 10 ) { + return true; + } + } + return false; + } + + function isValidHTML5Div(div, winSize) { + var elSize = getMatchedAdSizeForElement(div); + + if ( typeof div.checks !== 'number' ) { + div.checks = 1; + } else { + div.checks += 1; + } + + return (elSize && + elSize[0] === winSize[0] && elSize[1] === winSize[1] && + div.checks > 1); + } + + var HTML5_SIGNAL_ELEMENTS = 'canvas, button, video, svg, img'; + function iframeGetHTMLAd(win) { + var body = win.document.body, + elements, i, el, divs, div, numElements, + winSize, elSize; + + if ( !body ) { + return null; + } + winSize = getMatchedAdSize(win.innerWidth, win.innerHeight); + + if ( !winSize ) { + return null; + } + + elements = body.querySelectorAll(HTML5_SIGNAL_ELEMENTS); + + for ( i = 0; i < elements.length; i++ ) { + el = elements[i]; + elSize = getMatchedAdSizeForElement(el); + if ( elSize && elSize[0] === winSize[0] && elSize[1] === winSize[1] ) { + return el; + } + } + + numElements = body.querySelectorAll('*').length; + if ( numElements < 5 ) { + return null; + } + + divs = body.querySelectorAll('div'); + + for ( i = 0; i < divs.length; i++ ) { + div = divs[i]; + if ( isValidHTML5Div(div, winSize) ) { + return div; + } + } + + return null; + } + + function jumpedOut(el) { + var siblings, ifrs; + siblings = exports.utils.realArray(el.parentNode.children); + ifrs = siblings.filter(function(el) { + return el.tagName === 'IFRAME' && el.offsetWidth === 0 && el.offsetHeight === 0; + }); + return ifrs.length > 0; + } + + function mainGetHTMLAd(win) { + var styles = win.document.querySelectorAll('div > style, div > link[rel="stylesheet"]'), + i, div; + for ( i = 0; i < styles.length; i++ ) { + div = styles[i].parentNode; + if ( elementIsAdShaped(div) && jumpedOut(div) ) { + return div; + } + } + } + + function findAds(win, opt_ads) { + + if ( typeof win.searches !== 'number' ) { + win.searches = 0; + } + + var ads = opt_ads || []; + var adsFound = 0; + + if ( win.innerWidth <= MIN_WINDOW_PX || win.innerHeight <= MIN_WINDOW_PX ) { + win.searches++; + return ads; + } + + if ( exports.utils.SCRIPT_IN_WINDOW_TOP || win.searches < MAX_SEARCHES_PER_WINDOW ) { + var adCandidates = win.document.querySelectorAll('img, object, embed'); + adCandidates = exports.utils.realArray(adCandidates); + + adCandidates.forEach(function(el) { + if ( elementIsAd(el) && isNewAd(el, win) ) { + el.mp_adFound = true; + el.inIframe = win !== win.top; + win.mp_adFound = true; + ads.push(el); + adsFound += 1; + } + }); + + var htmlAd, adSizeMeta; + if ( win === win.top ) { + htmlAd = mainGetHTMLAd(win); + } else { + if ( adsFound === 0 && !containsLargeIframes(win) ) { + htmlAd = iframeGetHTMLAd(win); + } + } + + if ( htmlAd && isNewAd(htmlAd, win) ) { + htmlAd.html5 = true; + htmlAd.inIframe = win !== win.top; + if ( htmlAd.inIframe ) { + adSizeMeta = win.document.querySelectorAll('meta[name="ad.size"]'); + if ( adSizeMeta.length > 0 ) { + htmlAd.adSizeMeta = adSizeMeta[0].content; + } + if ( win.clickTag ) { + htmlAd.winClickTag = win.clickTag; + } + } + htmlAd.mp_adFound = true; + win.mp_adFound = true; + ads.push(htmlAd); + } + + win.searches += 1; + } + + var iframes = getFriendlyIframes(win); + iframes.forEach(function(ifr) { + findAds(ifr.contentWindow, ads); + }); + + return ads; + } + + exports.adfinder = { + getMatchedAdSize: getMatchedAdSize, + findAds: findAds + }; +})(exports); + +(function(exports) { + + var parser = { + TAGS_WITH_SRC_ATTR: { + 'IMG': true, + 'SCRIPT': true, + 'IFRAME': true, + 'EMBED': true + }, + + MAX_ATTR_LEN: 100, + + getUrl: function(el, params) { + var url; + + if ( this.TAGS_WITH_SRC_ATTR.hasOwnProperty(el.tagName) ) { + url = el.src; + + } else if ( el.tagName === 'OBJECT' ) { + url = el.data || (params && params.movie) || null; + + } else if ( el.tagName === 'A' ) { + url = el.href; + } + + if ( url && url.indexOf('http') === 0 ) { + return url; + } else { + return null; + } + }, + + getParams: function(el) { + if ( el.tagName !== 'OBJECT' ) { + return null; + } + + var i, child; + var params = {}; + var children = el.children; + for ( i = 0; i < children.length; i++ ) { + child = children[i]; + if ( child.tagName === 'PARAM' && child.name ) { + + params[child.name.toLowerCase()] = child.value; + } + } + return params; + }, + + getPosition: function(el) { + var rect = el.getBoundingClientRect(); + var win = exports.utils.elementWindow(el); + return { + width: rect.width, + height: rect.height, + left: rect.left + win.pageXOffset, + top: rect.top + win.pageYOffset + }; + }, + + getFlashvars: function(el, params, url) { + var flashvars; + var urlQS = url && url.split('?')[1]; + + if ( el.tagName === 'EMBED' ) { + flashvars = el.getAttribute('flashvars') || urlQS; + + } else if ( el.tagName === 'OBJECT' ) { + flashvars = params.flashvars || el.getAttribute('flashvars') || urlQS; + } + + return (flashvars && exports.utils.parseQS(flashvars)) || null; + }, + + findClickThru: function(el, flashvars) { + var key; + if ( el.tagName === 'IMG' && el.parentElement.tagName === 'A' ) { + return el.parentElement.href; + } else if ( flashvars ) { + for ( key in flashvars ) { + if ( flashvars.hasOwnProperty(key) ) { + + if ( key.toLowerCase().indexOf('clicktag') === 0 ) { + return flashvars[key]; + } + } + } + } + return null; + }, + + getAttr: function(el, name) { + var val = el.getAttribute(name); + + if ( val && val.slice && val.toString ) { + + return val.slice(0, this.MAX_ATTR_LEN).toString(); + } else { + return null; + } + }, + + putPropIfExists: function(obj, name, val) { + if ( val ) { + obj[name] = val; + } + }, + + putAttrIfExists: function(obj, el, name) { + var val = this.getAttr(el, name); + this.putPropIfExists(obj, name, val); + }, + + elementToJSON: function(el, opt_findClickThru) { + var pos = this.getPosition(el); + var params = this.getParams(el); + var url = this.getUrl(el, params); + var flashvars = this.getFlashvars(el, params, url); + var clickThru = opt_findClickThru && this.findClickThru(el, flashvars); + var json = { + tagName: el.tagName, + width: pos.width, + height: pos.height, + left: pos.left, + top: pos.top, + children: [] + }; + + if ( params ) { + + delete params.flashvars; + } + + this.putAttrIfExists(json, el, 'id'); + this.putAttrIfExists(json, el, 'class'); + this.putAttrIfExists(json, el, 'name'); + + this.putPropIfExists(json, 'flashvars', flashvars); + this.putPropIfExists(json, 'url', url); + this.putPropIfExists(json, 'params', params); + this.putPropIfExists(json, 'clickThru', clickThru); + + return json; + } + }; + + exports.parser = { elementToJSON: parser.elementToJSON.bind(parser) }; +})(exports); + +(function(exports) { + + var ContextManager = function(adData) { + this.adData = adData; + }; + + ContextManager.prototype = { + CONTAINER_SIZE_TOL: 0.4, + ASPECT_RATIO_FOR_LEADERBOARDS: 2, + + isValidContainer: function(el, opt_curWin) { + + var cWidth = el.clientWidth; + var cHeight = el.clientHeight; + + var adWidth = this.adData.width; + var adHeight = this.adData.height; + + var winWidth = opt_curWin && opt_curWin.innerWidth; + var winHeight = opt_curWin && opt_curWin.innerHeight; + var similarWin = opt_curWin && this.withinTol(adWidth, winWidth) && this.withinTol(adHeight, winHeight); + + var similarSizeX = this.withinTol(adWidth, cWidth); + var similarSizeY = this.withinTol(adHeight, cHeight); + var adAspect = adWidth / adHeight; + + return similarWin || el.tagName === 'A' || (adAspect >= this.ASPECT_RATIO_FOR_LEADERBOARDS && similarSizeY) || (similarSizeX && similarSizeY); + }, + + withinTol: function(adlen, conlen) { + var pct = (conlen - adlen) / adlen; + + return pct <= this.CONTAINER_SIZE_TOL; + }, + + serializeElements: function(el) { + if ( !el ) { + return; + } + var i; + var ifrWin; + var adId = this.adData.adId; + var elIsAd = false; + + if ( adId && el[adId] && el[adId].isAd === true ) { + elIsAd = true; + } + + var json = exports.parser.elementToJSON(el, elIsAd); + var childJSON; + + if ( elIsAd ) { + json.adId = adId; + this.adData.element = {}; + + var keys = Object.keys(json); + for ( i = 0; i < keys.length; i++ ) { + var key = keys[i]; + if ( key !== 'children' && key !== 'contents' ) { + this.adData.element[key] = json[key]; + } + } + } + + var children = exports.utils.realArray(el.children).filter(function(el) { + var param = el.tagName === 'PARAM'; + var inlineScript = el.tagName === 'SCRIPT' && !(el.src && el.src.indexOf('http') >= 0); + var noScript = el.tagName === 'NOSCRIPT'; + return !(param || inlineScript || noScript); + }); + + for ( i = 0; i < children.length; i++ ) { + childJSON = this.serializeElements(children[i]); + if ( childJSON ) { + json.children.push(childJSON); + } + } + + if ( el.tagName === 'IFRAME' ) { + ifrWin = el.contentWindow; + + if ( adId && el[adId] && el[adId].needsWindow ) { + + json.contents = this.adData.serializedIframeContents; + el[adId].needsWindow = false; + delete this.adData.serializedIframeContents; + + } else if ( exports.utils.isFriendlyWindow(ifrWin) ) { + + childJSON = this.serializeElements(ifrWin.document.documentElement); + if ( childJSON ) { + json.contents = childJSON; + } + } + } + + if ( json.children.length > 0 || json.adId || json.tagName === 'IFRAME' || json.url ) { + return json; + } else { + return null; + } + }, + + captureHTML: function(containerEl) { + this.adData.context = this.serializeElements(containerEl); + }, + + nodeCount: function(el) { + return el.getElementsByTagName('*').length + 1; + }, + + highestContainer: function(curWin, referenceElement) { + var curContainer = referenceElement; + var docEl = curWin.document.documentElement; + var parentContainer; + + if ( curWin !== curWin.top && this.isValidContainer(docEl, curWin) ) { + return docEl; + } + + while ( true ) { + parentContainer = curContainer.parentElement; + if ( this.isValidContainer(parentContainer) ) { + curContainer = parentContainer; + } else { + return curContainer; + } + } + } + }; + + var tagfinder = { + + prepToSend: function(adData) { + adData.matchedSize = exports.adfinder.getMatchedAdSize(adData.width, adData.height); + delete adData.width; + delete adData.height; + }, + + setPositions: function(adData, opt_el, opt_winPos) { + var el = opt_el || adData.context; + var winPos = opt_winPos || {left: 0, top: 0}; + var ifrPos; + + el.left += winPos.left; + el.top += winPos.top; + + if ( el.children ) { + el.children.forEach(function(child) { + this.setPositions(adData, child, winPos); + }, this); + } + + if ( el.contents ) { + ifrPos = {left: el.left, top: el.top}; + this.setPositions(adData, el.contents, ifrPos); + } + + if ( el.adId === adData.adId ) { + adData.element.left = el.left; + adData.element.top = el.top; + } + }, + + appendTags: function(adData, referenceElement) { + var mgr = new ContextManager(adData); + var curWin = exports.utils.elementWindow(referenceElement); + var highestContainer; + + while ( true ) { + highestContainer = mgr.highestContainer(curWin, referenceElement); + mgr.captureHTML(highestContainer); + + if ( curWin === curWin.top ) { + break; + } else { + mgr.adData.serializedIframeContents = mgr.adData.context; + + if ( exports.utils.isFriendlyWindow(curWin.parent) ) { + referenceElement = curWin.frameElement; + referenceElement[mgr.adData.adId] = {needsWindow: true}; + curWin = curWin.parent; + } else { + break; + } + } + } + return { + referenceElement:referenceElement, + highestContainer: highestContainer + }; + } + }; + + exports.tagfinder = tagfinder; +})(exports); + +(function(exports) { + var _onAdFound; + var _logGen = new exports.utils.LogGenerator(); + var _pageTags; + var INIT_MS_BW_SEARCHES = 2000; + var PAGE_TAG_RE = new RegExp('gpt|oascentral'); + + function getPageTags(doc) { + var scripts = doc.getElementsByTagName('script'); + var pageTags = []; + scripts = exports.utils.realArray(scripts); + scripts.forEach(function(script) { + if ( PAGE_TAG_RE.exec(script.src) ) { + pageTags.push({'tagName': 'SCRIPT', 'url': script.src}); + } + }); + return pageTags; + } + + function messageAllParentFrames(adData) { + + adData.dummyId = true; + + adData = JSON.stringify(adData); + + var win = window; + while ( win !== win.top ) { + win = win.parent; + win.postMessage(adData, '*'); + } + } + + function appendTagsAndSendToParent(adData, referenceElement) { + var results = exports.tagfinder.appendTags(adData, referenceElement); + if ( exports.utils.SCRIPT_IN_HOSTILE_IFRAME ) { + messageAllParentFrames(adData); + + } else if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { + exports.tagfinder.setPositions(adData); + exports.tagfinder.prepToSend(adData); + + adData.curPageUrl = exports.utils.getPageUrl(); + _pageTags = _pageTags || getPageTags(document); + var log = _logGen.log('ad', [adData], _pageTags); + if ( _onAdFound ) { + _onAdFound(log, results.referenceElement); + } + + } + } + + function extractAdsWrapper() { + if ( exports.utils.SCRIPT_IN_WINDOW_TOP || document.readyState === 'complete' ) { + extractAds(); + } + setTimeout(function() { + extractAdsWrapper(); + }, INIT_MS_BW_SEARCHES); + } + + function extractAds() { + var ads = exports.adfinder.findAds(window); + + if ( !ads ) { + return; + } + + ads.forEach(function(ad) { + + var startTime = new Date().getTime(); + var adId = startTime + '-' + Math.floor(Math.random() * 10e12); + + var adData = { + width: ad.offsetWidth, + height: ad.offsetHeight, + startTime: startTime, + adId: adId, + html5: ad.html5 || false, + inIframe: ad.inIframe + }; + + if ( ad.html5 && ad.inIframe ) { + adData.adSizeMeta = ad.adSizeMeta || null; + adData.winClickTag = ad.winClickTag || null; + } + + ad[adId] = { isAd: true }; + + appendTagsAndSendToParent(adData, ad); + }); + } + + function isChildWin(myWin, otherWin) { + var parentWin = otherWin.parent; + while ( parentWin !== otherWin ) { + if ( parentWin === myWin ) { + return true; + } + otherWin = parentWin; + parentWin = parentWin.parent; + } + return false; + } + + function iframeFromWindow(win, winToMatch) { + var i, ifr, ifrWin, + iframes = win.document.querySelectorAll('iframe'); + + for ( i = 0; i < iframes.length; i++ ) { + ifr = iframes[i]; + if ( ifr.contentWindow === winToMatch ) { + return ifr; + } + } + + for ( i = 0; i < iframes.length; i++ ) { + ifrWin = iframes[i].contentWindow; + if ( exports.utils.isFriendlyWindow(ifrWin) ) { + ifr = iframeFromWindow(ifrWin, winToMatch); + if ( ifr ) { + return ifr; + } + } + } + } + + function onPostMessage(event) { + var adData, + ifrWin = event.source, + + myWin = window.document.defaultView, + ifrTag; + + try { + + adData = JSON.parse(event.data); + } catch(e) { + + return; + } + + if ( adData.dummyId ) { + + delete adData.dummyId; + + if ( isChildWin(myWin, ifrWin) ) { + if ( exports.utils.isFriendlyWindow(ifrWin) ) { + ifrTag = ifrWin.frameElement; + } else { + ifrTag = iframeFromWindow(myWin, ifrWin); + } + + if ( ifrTag ) { + ifrTag[adData.adId] = {needsWindow: true}; + appendTagsAndSendToParent(adData, ifrTag); + } + } + } + } + + exports.coordinator = { + init: function(onAdFound) { + + if ( exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { + return false; + } + + _onAdFound = onAdFound; + + if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { + var log = _logGen.log('page'); + onAdFound(log); + } + + window.addEventListener('message', onPostMessage, false); + if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { + window.addEventListener('beforeunload', function(event) { + var log = _logGen.log('unload'); + log.timing = window.performance.timing; + onAdFound(log); + }); + } + + exports.utils.onDocLoaded(document, extractAdsWrapper); + } + }; + +})(exports); + +if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { + window.adparser = { + init: exports.coordinator.init, + }; +} else { + exports.coordinator.init(function() {}); +} + +})(window); +(function(adparser) { + function sendToBackground(event, message) { + if ( window.self.port ) { + window.self.port.emit(event, message); + } else if ( typeof chrome !== 'undefined' ) { + chrome.extension.sendRequest(message); + } + } + + function onAdFound(log) { + sendToBackground('ad_log', { id: 'ad_log', subject: log }); + } + + if ( window === window.top ) { + adparser.init(onAdFound); + } +})(window.adparser); + diff --git a/src/drivers/webextension/js/jsontodom.js b/src/drivers/webextension/js/jsontodom.js index d77df83f8..c6506c4fb 100644 --- a/src/drivers/webextension/js/jsontodom.js +++ b/src/drivers/webextension/js/jsontodom.js @@ -16,7 +16,7 @@ function jsonToDOM(jsonTemplate, doc, nodes) { // Array of elements? Parse each one... if (Array.isArray(elemNameOrArray)) { var frag = doc.createDocumentFragment(); - Array.forEach(arguments, function(thisElem) { + Array.prototype.forEach.call(arguments, function(thisElem) { frag.appendChild(tag.apply(null, thisElem)); }); return frag; @@ -46,7 +46,7 @@ function jsonToDOM(jsonTemplate, doc, nodes) { } // Create and append this element's children - var childElems = Array.slice(arguments, 2); + var childElems = Array.prototype.slice.call(arguments, 2); childElems.forEach(function(childElem) { if (childElem != null) { elem.appendChild( diff --git a/src/drivers/webextension/js/network.js b/src/drivers/webextension/js/network.js new file mode 100644 index 000000000..0b77c1721 --- /dev/null +++ b/src/drivers/webextension/js/network.js @@ -0,0 +1,785 @@ +'use strict'; +(function() { + + function isChrome() { + return (typeof chrome !== 'undefined' && + window.navigator.userAgent.match(/Chrom(?:e|ium)\/([0-9\.]+)/)); + } + + var browserProxy; + if ( isChrome() ) { + browserProxy = chrome; + } else { + browserProxy = browser; + } + + var MIN_FF_MAJOR_VERSION = 51; + + var requiredBrowserApis = [ + browserProxy.webNavigation, + browserProxy.tabs, + browserProxy.webRequest, + browserProxy.runtime + ]; + var areListenersRegistered = false; + var secBefore = 2000; + var secAfter = 5000; + var secBetweenDupAssets = 10e3; + var minVidSize = 500e3; + var maxVidSize = 25e6; + var maxContentRange = 25e6; + var videoExtensions = [ + 'af', '3gp', 'asf', 'avchd', 'avi', 'cam', 'dsh', 'flv', 'm1v', 'm2v', + 'fla', 'flr', 'sol', 'm4v', 'mkv', 'wrap', 'mng', 'mov', 'mpeg', 'mpg', + 'mpe', 'mp4', 'mxf', 'nsv', 'ogg', 'rm', 'svi', 'smi', 'wmv', 'webm' + ]; + var extensionsReg = new RegExp('\\.' + videoExtensions.join('$|\\.') + '$'); + var videoContentTypesPrefixes = ['binary/octet-stream', 'video/', 'flv-application/', 'media']; + + var bannedContentTypes = ['video/mp2t','video/f4m','video/f4f']; + var bannedFiletypes = ['ts']; + var bannedFiletypesReg = new RegExp('\\.' + bannedFiletypes.join('$|\\.') + '$'); + var whitelistReqTypes = ['object', 'xmlhttprequest', 'other']; + + var topVideoAssetDomains = [ + '2mdn.net', + 'adap.tv', + 'adnxs.com', + 'adsrvr.org', + 'btrll.com', + 'celtra.com', + 'flashtalking.com', + 'flite.com', + 'innovid.com', + 'jivox.com', + 'mixpo.com', + 'nytimes.com', + 'playwire.com', + 'selectmedia.asia', + 'serving-sys.com', + 'solvemedia.com', + 'spotible.com', + 'teads.tv', + 'tribalfusion.com', + 'tubemogul.com', + 'videologygroup.com', + 'washingtonpost.com' + ]; + + if ( !String.prototype.endsWith ) { + String.prototype.endsWith = function(searchString, position) { + var subjectString = this.toString(); + if ( typeof position !== 'number' || !isFinite(position) || + Math.floor(position) !== position || position > subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + var lastIndex = subjectString.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; + }; + } + + function getFrame(getFrameDetails, callback) { + if ( typeof chrome !== 'undefined' ) { + chrome.webNavigation.getFrame(getFrameDetails, callback); + } else if ( typeof browser !== 'undefined' ) { + var gettingFrame = browser.webNavigation.getFrame(getFrameDetails); + gettingFrame.then(callback); + } + } + + function ifBrowserValid(callback, elseCallback) { + if ( isChrome() ) { + + callback(); + } else if ( typeof browser !== 'undefined' ) { + try { + var gettingInfo = browser.runtime.getBrowserInfo(); + gettingInfo.then(function(browserInfo) { + var browserVersion = parseInt(browserInfo.version.split('.')[0]); + + if ( browserInfo.name === 'Firefox' && + browserVersion >= MIN_FF_MAJOR_VERSION) { + callback(); + } else { + elseCallback(); + } + }); + } catch (err) { + + elseCallback(); + } + } else { + elseCallback(); + } + } + + function isTrackingEnabled() { + + return parseInt(localStorage.tracking, 10); + + } + + function isPixelRequest(request) { + return (request.type === 'image' || request.responseStatus === 204) && + request.size <= 1000; + } + + function isVpaidOrVastRequest(request) { + var lowerCaseUrl = request.url.toLowerCase(); + return lowerCaseUrl.indexOf('vpaid') !== -1 || lowerCaseUrl.indexOf('vast') !== -1; + } + + function hasValidRequestType(request) { + return whitelistReqTypes.indexOf(request.type) >= 0; + } + + function stripQueryParams(url) { + return url.split('?', 1)[0]; + } + + function parseHostnameFromUrl(url) { + var parser = document.createElement('a'); + parser.href = url; + return parser.hostname; + } + + function hasDomain(url, domain) { + return parseHostnameFromUrl(url).endsWith(domain); + } + + function findHeader(headers, key) { + var header; + for ( var i = 0; i < headers.length; i += 1 ) { + header = headers[i]; + if ( header.name.toLowerCase() === key ) { + return header; + } + } + return null; + } + + function validVideoType(vtype) { + var goodType = videoContentTypesPrefixes.some(function(prefix) { + return vtype.indexOf(prefix) === 0; + }); + return goodType; + } + + function assetMsgKey(assetReq) { + var url = stripQueryParams(assetReq.url); + var key = assetReq.frameId + '-' + url; + return key; + } + + var PageNetworkTrafficCollector = function(tabId) { + this.tabId = tabId; + this.displayAdFound = false; + this.requests = {}; + this.msgsBeingSent = {}; + this.assetsSeen = {}; + this.allRedirects = {}; + }; + + var globalPageContainer = { + collectors: {}, + dyingCollectors: {}, + + cleanupCollector: function(tabId) { + if ( tabId in this.collectors ) { + delete globalPageContainer.collectors[tabId]; + } + }, + + onNewNavigation: function(details) { + var tabId = details.tabId; + this.cleanupCollector(tabId); + + if ( isTrackingEnabled() ) { + if ( !areListenersRegistered ) { + + registerListeners(); + } + this.collectors[tabId] = new PageNetworkTrafficCollector(tabId); + } else { + if ( areListenersRegistered ) { + + unregisterListeners(); + } + } + }, + + onNavigationCommitted: function(details) { + + }, + + onNavigationCompleted: function(details) { + + }, + + onTabClose: function(tabId, closeInfo) { + + this.cleanupCollector(tabId); + delete this.collectors[tabId]; + }, + + onDisplayAdFound: function(tabId) { + this.collectors[tabId].displayAdFound = true; + }, + + getRandId: function() { + return String(Math.floor(Math.random() * 1e9)); + }, + + getCollector: function(tabId) { + if ( this.collectors.hasOwnProperty(tabId) ) { + return this.collectors[tabId]; + } + return null; + }, + + forwardCall: function(details, collectorMemberFunction) { + var collector = this.getCollector(details.tabId); + if ( collector !== null ) { + collectorMemberFunction.apply(collector, [details]); + } + } + }; + + PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function() { + var logMessage = Array.from(arguments).join(' '); + var message = {message: logMessage, event: 'console-log-message'}; + browserProxy.tabs.sendMessage(this.tabId, message); + }; + + PageNetworkTrafficCollector.prototype.sendToTab = function(assetReq, reqs, curPageUrl, isValidAd) { + var msg = {}; + msg.assets = []; + msg.event_data = {}; + if ( isValidAd ) { + msg.event = 'new-video-ad'; + msg.requests = reqs; + msg.requests.sort(function(reqA, reqB) {return reqA.requestTimestamp - reqB.requestTimestamp;}); + if ( assetReq ) { + msg.assets = [assetReq]; + } + } else { + msg.requests = reqs.map(function(request) { + return parseHostnameFromUrl(request.url); + }); + msg.assets = [{ + + url: parseHostnameFromUrl(assetReq.url), + + contentType: assetReq.contentType, + size: assetReq.size + }]; + msg.event = 'new-invalid-video-ad'; + } + msg.origUrl = curPageUrl; + msg.displayAdFound = this.displayAdFound; + + browserProxy.tabs.sendMessage(this.tabId, msg); + }; + + PageNetworkTrafficCollector.prototype.getRedirKey = function(url, frameId) { + return url + ':' + frameId; + }; + + PageNetworkTrafficCollector.prototype.seenBefore = function(request) { + var oldTime = this.assetsSeen[assetMsgKey(request)]; + if ( oldTime && (request.requestTimestamp-oldTime < secBetweenDupAssets)){ + + return true; + } + return false; + }; + + PageNetworkTrafficCollector.prototype.recordSeenAsset = function(request) { + this.assetsSeen[assetMsgKey(request)] = request.requestTimestamp; + }; + + PageNetworkTrafficCollector.prototype.onBeforeRequest = function(details) { + var req = { + url: details.url, + type: details.type, + httpMethod: details.method, + frameId: details.frameId, + parentFrameId: details.parentFrameId, + requestTimestamp: details.timeStamp, + }; + this.requests[details.requestId] = req; + }; + + PageNetworkTrafficCollector.prototype.onSendHeaders = function(details) { + var request, header; + request = this.requests[details.requestId]; + header = request && findHeader(details.requestHeaders, 'x-requested-with'); + if ( header && header.value.toLowerCase().indexOf('flash') > -1 ) { + request.from_flash = true; + } + }; + + PageNetworkTrafficCollector.prototype.onHeadersReceived = function(details) { + var getFrameDetails = { + tabId: details.tabId, + processId: null, + frameId: details.frameId + }; + var pageNetworkTrafficController = this; + getFrame(getFrameDetails, function(frameDetails) { + if ( frameDetails && frameDetails.url ) { + pageNetworkTrafficController._onHeadersReceived(details, frameDetails); + } + }); + }; + + PageNetworkTrafficCollector.prototype._onHeadersReceived = function(details, frameDetails) { + var contentSize, contentRange; + + var request = this.requests[details.requestId]; + if ( request ) { + var redirParent = this.allRedirects[this.getRedirKey(details.url, details.frameId)]; + var header = request && findHeader(details.responseHeaders, 'content-type'); + var contentType = header && header.value.toLowerCase(); + + if ( contentType){ + request.contentType = contentType; + } + header = request && findHeader(details.responseHeaders, 'content-length'); + contentSize = header && header.value; + if ( contentSize ) { + request.size = request.size || 0; + request.size += parseInt(contentSize); + } + header = request && findHeader(details.responseHeaders, 'content-range'); + contentRange = header && header.value; + if ( contentRange ) { + request.contentRange = parseInt(contentRange.split('/')[1]); + } + + var frameUrl = null; + if ( frameDetails && frameDetails.url ) { + frameUrl = frameDetails.url; + } + if ( !this.bannedRequest(request) && + (this.isVideoReq(frameUrl, request) || (redirParent && redirParent.isVideo))) { + request.isVideo = true; + } + } + }; + + PageNetworkTrafficCollector.prototype.onBeforeRedirect = function(details) { + var request = this.requests[details.requestId]; + if ( request ) { + if ( request.redirects ) { + request.redirects.push(details.redirectUrl); + } else { + request.redirects = [details.redirectUrl]; + } + this.allRedirects[this.getRedirKey(details.redirectUrl, details.frameId)] = request; + } + }; + + PageNetworkTrafficCollector.prototype.isYoutubeMastheadRequest = function(url) { + var re = /video_masthead/; + return this.hasYoutubeDomain(url) && re.test(url); + }; + PageNetworkTrafficCollector.prototype.isYoutubeVideoRequest = function(srcUrl, destUrl) { + if ( !this.hasYoutubeDomain(srcUrl) ) { + return false; + } + + var re = /https?:\/\/r.*?\.googlevideo\.com\/videoplayback\?/; + return re.test(destUrl); + }; + PageNetworkTrafficCollector.prototype.processResponse = function(requestDetails, frameDetails) { + var request; + if ( requestDetails ) { + request = this.requests[requestDetails.requestId]; + if ( request ) { + request.responseStatus = requestDetails.statusCode; + request.responseTimestamp = requestDetails.timeStamp; + + var frameUrl = null; + if ( frameDetails && frameDetails.url ) { + frameUrl = frameDetails.url; + } + + var requestUrl = null; + if ( request.url ) { + requestUrl = request.url; + } + + if ( this.isYoutubeAdReq(frameUrl, requestUrl) ) { + var videoId = this.parseYoutubeVideoIdFromUrl(requestUrl); + if ( videoId ) { + request.isYoutubeAd = true; + request.isVideo = true; + request.url = 'https://www.youtube.com/watch?v=' + this.parseYoutubeVideoIdFromUrl(requestUrl); + } + } else if ( !this.bannedRequest(request) && + (this.isVideo || this.isVideoReq(frameUrl, request))) { + request.isVideo = true; + } + + if ( request.isVideo ) { + + var msgKey = assetMsgKey(request); + this.msgsBeingSent[msgKey] = request; + if ( !this.seenBefore(request) ) { + this.sendMsgWhenQuiet(msgKey); + } + this.recordSeenAsset(request); + } + } + } + }; + + PageNetworkTrafficCollector.prototype.onResponseStarted = function(responseDetails) { + if ( responseDetails.frameId < 0 ) { + responseDetails.frameId = 99999; + + } + var getFrameDetails = { + tabId: responseDetails.tabId, + processId: null, + frameId: responseDetails.frameId + }; + var pageNetworkTrafficController = this; + getFrame(getFrameDetails, function(frameDetails) { + if ( frameDetails && frameDetails.url ) { + pageNetworkTrafficController.processResponse(responseDetails, frameDetails); + } + }); + }; + + PageNetworkTrafficCollector.prototype.hasBannedFiletype = function(request) { + var url = stripQueryParams(request.url); + if ( bannedFiletypesReg.exec(url) ) { + return true; + } else { + return false; + } + }; + + PageNetworkTrafficCollector.prototype.checkContentHeaders = function(request) { + if ( request.contentType && validVideoType(request.contentType) ) { + return true; + } + return false; + }; + + PageNetworkTrafficCollector.prototype.checkUrlExtension = function(request) { + var url = stripQueryParams(request.url); + if ( extensionsReg.exec(url) ) { + return true; + } else { + return false; + } + }; + + PageNetworkTrafficCollector.prototype.isVideoReq = function(srcUrl, request) { + if ( this.isYoutubeVideoRequest(srcUrl, request.url) ) { + return false; + } + return this.checkUrlExtension(request) || this.checkContentHeaders(request); + }; + PageNetworkTrafficCollector.prototype.hasYoutubeDomain = function(url) { + var hostname = parseHostnameFromUrl(url) ; + if ( hostname === 'www.youtube.com' ) { + return true; + } + return false; + }; + PageNetworkTrafficCollector.prototype.parseYoutubeVideoIdFromUrl = function(url) { + var re = /^https?:\/\/www\.youtube\.com\/get_video_info.*(?:\?|&)video_id=(.*?)(?:$|&)/; + var match = re.exec(url); + if ( match && match.length > 1 ) { + return match[1]; + } + + re = /^https?:\/\/www\.youtube\.com\/embed\/(.*?)(?:$|\?)/; + match = re.exec(url); + if ( match && match.length > 1 ) { + return match[1]; + } + + re = /^https?:\/\/www\.youtube\.com\/watch\?v=(.*$)/; + match = re.exec(url); + if ( match && match.length > 1 ) { + return match[1]; + } + return null; + }; + + PageNetworkTrafficCollector.prototype.isYoutubeGetVideoInfoReq = function(url) { + var re = /^https?:\/\/www\.youtube\.com\/get_video_info\?/; + return re.test(url); + }; + PageNetworkTrafficCollector.prototype.isYoutubeAdReq = function(srcUrl, destUrl) { + + if ( !this.hasYoutubeDomain(srcUrl) || + !this.isYoutubeGetVideoInfoReq(destUrl)) { + return false; + } + if ( this.parseYoutubeVideoIdFromUrl(srcUrl) === + this.parseYoutubeVideoIdFromUrl(destUrl) && + !this.isYoutubeMastheadRequest(destUrl)) { + return false; + } + return true; + }; + + PageNetworkTrafficCollector.prototype.bannedRequest = function(request) { + return this.bannedVideoType(request) || this.hasBannedFiletype(request) || this.bannedVideoSize(request); + }; + + PageNetworkTrafficCollector.prototype.bannedVideoType = function(request) { + var badType = false; + if ( request.contentType ) { + badType = bannedContentTypes.some(function(prefix) { + return request.contentType.indexOf(prefix) >= 0; + }); + } + return badType; + }; + + PageNetworkTrafficCollector.prototype.bannedVideoSize = function(request) { + if ( request.size !== null ) { + if ( request.size < minVidSize || request.size > maxVidSize || request.contentRange > maxContentRange ) { + return true; + } + } + return false; + }; + + PageNetworkTrafficCollector.prototype.grabTagReqs = function(tabRequests, assetRequest) { + var minTimestamp, maxTimestamp; + minTimestamp = assetRequest.requestTimestamp - secBefore; + maxTimestamp = assetRequest.requestTimestamp + secAfter; + + var filteredRequests = tabRequests.filter(function(request) { + return (request.requestTimestamp > minTimestamp && + request.requestTimestamp < maxTimestamp && + request.frameId === assetRequest.frameId && + request.url !== assetRequest.url && + (hasValidRequestType(request) || + isPixelRequest(request))); + }); + + return filteredRequests; + }; + + PageNetworkTrafficCollector.prototype.isValidVideoAd = function(assetRequest, tagRequests) { + var hasVpaidOrVastRequest = tagRequests.some(function(tagRequest) { + return isVpaidOrVastRequest(tagRequest); + }); + + if ( assetRequest.isYoutubeAd ) { + return true; + } + if ( hasVpaidOrVastRequest ) { + return true; + } + var hasTopVideoAssetDomain = topVideoAssetDomains.some(function(assetDomain) { + return hasDomain(assetRequest.url, assetDomain); + }); + + return hasTopVideoAssetDomain; + }; + + PageNetworkTrafficCollector.prototype.sendMsgWhenQuiet = function(msgKey) { + var _this = this, + origPageUrl, msgAssetReq; + msgAssetReq = this.msgsBeingSent[msgKey]; + browserProxy.tabs.get(this.tabId, function(tab) {origPageUrl = tab.url;}); + + setTimeout(function() { + var rawRequests = []; + if ( globalPageContainer.collectors[_this.tabId] === _this ) { + for ( var reqId in _this.requests ) { + rawRequests.push(_this.requests[reqId]); + } + var tagReqs = _this.grabTagReqs(rawRequests, msgAssetReq); + + if ( _this.isValidVideoAd(msgAssetReq, tagReqs) ) { + _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, true); + } else { + + _this.sendToTab(msgAssetReq, tagReqs, origPageUrl, false); + } + + } else { + + } + delete _this.msgsBeingSent[msgKey]; + }, secAfter+secBefore); + }; + + PageNetworkTrafficCollector.prototype.existingMessage = function(candidateRequest) { + var frameMsg = this.msgsBeingSent[candidateRequest.frameId]; + if ( frameMsg ) { + return frameMsg; + } else { + return null; + } + }; + + function onBeforeRequestListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest); + } + + function onSendHeadersListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders); + } + + function onHeadersReceivedListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived); + } + + function onBeforeRedirectListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect); + } + + function onResponseStartedListener(details) { + globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onResponseStarted); + } + + function onCommittedListener(details) { + if ( details.frameId === 0 ) { + globalPageContainer.onNavigationCommitted(details); + } + } + + function onCompletedListener(details) { + if ( details.frameId === 0 ) { + globalPageContainer.onNavigationCompleted(details); + } + } + + function onRemovedListener(tabId, closeInfo) { + globalPageContainer.onTabClose(tabId, closeInfo); + } + + function onMessageListener(message, sender, sendResponse) { + if ( message.event === 'new-ad' && message.data.event === 'ad' ) { + var tabId = sender.tab.id; + if ( tabId ) { + globalPageContainer.onDisplayAdFound(tabId); + } + } + } + + function registerListeners() { + + browserProxy.webRequest.onBeforeRequest.addListener( + onBeforeRequestListener, + {urls: ['http://*/*', 'https://*/*']}, + [] + ); + + browserProxy.webRequest.onSendHeaders.addListener( + onSendHeadersListener, + {urls: ['http://*/*', 'https://*/*']}, + ['requestHeaders'] + ); + + browserProxy.webRequest.onHeadersReceived.addListener( + onHeadersReceivedListener, + {urls: ['http://*/*', 'https://*/*']}, + ['responseHeaders'] + ); + + browserProxy.webRequest.onBeforeRedirect.addListener( + onBeforeRedirectListener, + {urls: ['http://*/*', 'https://*/*']}, + [] + ); + + browserProxy.webRequest.onResponseStarted.addListener( + onResponseStartedListener, + {urls: ['http://*/*', 'https://*/*']}, + ['responseHeaders'] + ); + + browserProxy.webNavigation.onCommitted.addListener(onCommittedListener); + browserProxy.webNavigation.onCompleted.addListener(onCompletedListener); + browserProxy.tabs.onRemoved.addListener(onRemovedListener); + browserProxy.runtime.onMessage.addListener(onMessageListener); + + areListenersRegistered = true; + } + + function unregisterListeners() { + + browserProxy.webRequest.onBeforeRequest.removeListener( + onBeforeRequestListener + ); + + browserProxy.webRequest.onSendHeaders.removeListener( + onSendHeadersListener + ); + + browserProxy.webRequest.onHeadersReceived.removeListener( + onHeadersReceivedListener + ); + + browserProxy.webRequest.onBeforeRedirect.removeListener( + onBeforeRedirectListener + ); + + browserProxy.webRequest.onResponseStarted.removeListener( + onResponseStartedListener + ); + + browserProxy.webNavigation.onCommitted.removeListener(onCommittedListener); + browserProxy.webNavigation.onCompleted.removeListener(onCompletedListener); + browserProxy.tabs.onRemoved.removeListener(onRemovedListener); + browserProxy.runtime.onMessage.removeListener(onMessageListener); + + areListenersRegistered = false; + } + + function areRequiredBrowserApisAvailable() { + return requiredBrowserApis.every(function(api) { + return typeof api !== 'undefined'; + }); + } + + if ( areRequiredBrowserApisAvailable() ) { + ifBrowserValid( + function() { + browserProxy.webNavigation.onBeforeNavigate.addListener( + function(details) { + if ( details.frameId === 0 ) { + globalPageContainer.onNewNavigation(details); + } + }, + { + url: [{urlMatches: 'http://*/*'}, {urlMatches: 'https://*/*'}] + } + ); + }, function() { + + } + ); + } + + browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) { + if ( request === 'is_browser_valid' ) { + ifBrowserValid( + sendResponse({'browser_valid': true}), + sendResponse({'browser_valid': false}) + ); + } + }); + + browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) { + if ( request === 'is_tracking_enabled' ) { + sendResponse({'tracking_enabled': isTrackingEnabled()}); + } + }); + +})(); + From d3520ac1475f9cc6ac04ba627e76265cd3f70a60 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 27 May 2017 14:35:11 +1000 Subject: [PATCH 43/63] Increment version number --- src/drivers/npm/package.json | 4 ++-- src/drivers/webextension/manifest.json | 20 +++++++++---------- ...t.edge.json => manifest.webextension.json} | 20 ++++++++++--------- 3 files changed, 22 insertions(+), 22 deletions(-) rename src/drivers/webextension/{manifest.edge.json => manifest.webextension.json} (84%) diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index a6d0d33ac..12c513e6d 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -1,8 +1,8 @@ { - "name": "wappalyzer", + "name": "Wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "4.1.0", + "version": "4.1.2", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index c761c022e..15696315c 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://wappalyzer.com/", "description": "Identify web technologies", - "version": "4.1.0", + "version": "4.1.2", "default_locale": "en", "manifest_version": 2, "icons": { @@ -26,8 +26,8 @@ "default_popup": "popup.html" }, "background": { - "page": "background.html" - + "page": "background.html", + "persistent": true }, "content_scripts": [ { @@ -43,7 +43,7 @@ }, { "matches": [ - "http://*/*", + "http://*/*", "https://*/*" ], "js": [ @@ -58,18 +58,16 @@ "js/inject.js" ], "options_page": "options.html", - "options_ui": { - "page": "options.html", - "open_in_tab": false - }, "permissions": [ - "storage", "tabs", "webRequest", "webNavigation", "http://*/*", "https://*/*" ], - "content_security_policy": "script-src 'self'; object-src 'self'" + "content_security_policy": "script-src 'self'; object-src 'self'", + "-ms-preload": { + "backgroundScript": "js/ms_background_scripts_api_bridge.js", + "contentScript": "js/ms_content_scripts_api_bridge.js" + } } - diff --git a/src/drivers/webextension/manifest.edge.json b/src/drivers/webextension/manifest.webextension.json similarity index 84% rename from src/drivers/webextension/manifest.edge.json rename to src/drivers/webextension/manifest.webextension.json index 9e9faf3a6..c761c022e 100644 --- a/src/drivers/webextension/manifest.edge.json +++ b/src/drivers/webextension/manifest.webextension.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://wappalyzer.com/", "description": "Identify web technologies", - "version": "4.0.1", + "version": "4.1.0", "default_locale": "en", "manifest_version": 2, "icons": { @@ -26,8 +26,8 @@ "default_popup": "popup.html" }, "background": { - "page": "background.html", - "persistent": true + "page": "background.html" + }, "content_scripts": [ { @@ -43,7 +43,7 @@ }, { "matches": [ - "http://*/*", + "http://*/*", "https://*/*" ], "js": [ @@ -58,16 +58,18 @@ "js/inject.js" ], "options_page": "options.html", + "options_ui": { + "page": "options.html", + "open_in_tab": false + }, "permissions": [ + "storage", "tabs", "webRequest", "webNavigation", "http://*/*", "https://*/*" ], - "content_security_policy": "script-src 'self'; object-src 'self'", - "-ms-preload": { - "backgroundScript": "js/ms_background_scripts_api_bridge.js", - "contentScript": "js/ms_content_scripts_api_bridge.js" - } + "content_security_policy": "script-src 'self'; object-src 'self'" } + From 147c030f2bf69cdbd349358ee283b9ee54127c1c Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 27 May 2017 14:37:40 +1000 Subject: [PATCH 44/63] Revert WebExtension manifest.json --- ...t.webextension.json => manifest.edge.json} | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) rename src/drivers/webextension/{manifest.webextension.json => manifest.edge.json} (84%) diff --git a/src/drivers/webextension/manifest.webextension.json b/src/drivers/webextension/manifest.edge.json similarity index 84% rename from src/drivers/webextension/manifest.webextension.json rename to src/drivers/webextension/manifest.edge.json index c761c022e..80f4f7066 100644 --- a/src/drivers/webextension/manifest.webextension.json +++ b/src/drivers/webextension/manifest.edge.json @@ -4,7 +4,7 @@ "author": "Elbert Alias", "homepage_url": "https://wappalyzer.com/", "description": "Identify web technologies", - "version": "4.1.0", + "version": "4.1.2", "default_locale": "en", "manifest_version": 2, "icons": { @@ -26,8 +26,8 @@ "default_popup": "popup.html" }, "background": { - "page": "background.html" - + "page": "background.html", + "persistent": true }, "content_scripts": [ { @@ -43,7 +43,7 @@ }, { "matches": [ - "http://*/*", + "http://*/*", "https://*/*" ], "js": [ @@ -58,18 +58,17 @@ "js/inject.js" ], "options_page": "options.html", - "options_ui": { - "page": "options.html", - "open_in_tab": false - }, "permissions": [ - "storage", "tabs", "webRequest", "webNavigation", "http://*/*", "https://*/*" ], - "content_security_policy": "script-src 'self'; object-src 'self'" + "content_security_policy": "script-src 'self'; object-src 'self'", + "-ms-preload": { + "backgroundScript": "js/ms_background_scripts_api_bridge.js", + "contentScript": "js/ms_content_scripts_api_bridge.js" + } } From bc20282bf88e26e902d6a60e1410a570e1238e93 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 27 May 2017 15:34:24 +1000 Subject: [PATCH 45/63] Fix manfifest.json --- src/drivers/webextension/js/driver.js | 6 +- src/drivers/webextension/js/iframe.js | 685 +++++++++++++------- src/drivers/webextension/js/network.js | 1 - src/drivers/webextension/manifest.edge.json | 1 + src/drivers/webextension/manifest.json | 19 +- 5 files changed, 451 insertions(+), 261 deletions(-) diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index b6b1e1d2e..eb71205e6 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -101,11 +101,7 @@ // Do nothing } - if ( typeof chrome === 'undefined' ) { - browser.runtime.onMessage.addListener(w.driver.onMessage); - } else { - chrome.runtime.onMessage.addListener(w.driver.onMessage); - } + ( chrome || browser ).runtime.onMessage.addListener(w.driver.onMessage); var callback = function(tabs) { tabs.forEach(function(tab) { diff --git a/src/drivers/webextension/js/iframe.js b/src/drivers/webextension/js/iframe.js index 2bd1fe04b..d37f91ef1 100644 --- a/src/drivers/webextension/js/iframe.js +++ b/src/drivers/webextension/js/iframe.js @@ -7,18 +7,19 @@ var exports = {}; (function(exports) { var utils = { - getReferrer: function() { + normalizeUrl: function(url) { - return this.hashUrl(document.referrer) || null; + return this.hashUrl(url) || null; }, - getPageUrl: function() { - - return this.hashUrl(window.location.href) || null; - + getReferrer: function() { + return this.normalizeUrl(document.referrer); }, + getPageUrl: function() { + return this.normalizeUrl(window.location.href); + }, hashUrl: function(url) { var a, result; @@ -68,6 +69,7 @@ var exports = {}; realArray: function(a) { return Array.prototype.slice.apply(a); }, + onDocLoaded: function(doc, callback) { if ( doc.readyState === 'loading' ) { doc.addEventListener('DOMContentLoaded', callback); @@ -117,10 +119,41 @@ var exports = {}; } return dict; }, + sendToBackground: function(message, event, responseMessage, onResponse) { + if ( typeof browser !== 'undefined' ) { + var response = browser.runtime.sendMessage(message); + response.then(onResponse); + } else if ( typeof chrome !== 'undefined' ) { + chrome.runtime.sendMessage(message, onResponse); + } else if ( window.self.port ) { + window.self.port.on(responseMessage, onResponse); + window.self.port.emit(event, message); + } + }, + + ifTrackingEnabled: function(callback, elseCallback) { + + this.sendToBackground( + 'is_tracking_enabled', + '', + 'tracking_enabled_response', + function(message) { + if ( message.tracking_enabled ) { + + callback(); + } else { + + elseCallback(); + } + } + ); + + } }; utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent); utils.SCRIPT_IN_HOSTILE_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && !utils.SCRIPT_IN_FRIENDLY_IFRAME; + function LogGenerator() { this.msgNum = 0; this.pageMeta = { @@ -134,11 +167,21 @@ var exports = {}; LogGenerator.prototype = { log: function(event, opt_assets, opt_pageTags) { + var opt_video_assets; + if ( event === 'video' || event === 'invalid-video' ) { + opt_video_assets = opt_assets || []; + opt_assets = []; + } else { + opt_video_assets = []; + opt_assets = opt_assets || []; + } var result = { doc: this.pageMeta, event: event, - assets: opt_assets || [], + video_assets: opt_video_assets, + assets: opt_assets, version: '3', + mrev: '9c4d5b3-c', msgNum: this.msgNum, timestamp: new Date().getTime(), pageVis: document.visibilityState, @@ -157,255 +200,342 @@ var exports = {}; (function(exports) { - var VALID_AD_SIZES = [ - [160, 600], - - [300, 250], - [300, 600], - [300, 1050], - - [336, 280], - [336, 850], - [468, 60], - [728, 90], - [728, 270], - [970, 66], - [970, 90], - [970, 125], - [970, 250], - [970, 400], - [970, 415], - [1280, 100] - ]; - - var PX_SIZE_TOL = 10; - var MIN_WINDOW_PX = 10; - var MAX_SEARCHES_PER_WINDOW = 10; - var MAX_SEARCHES_PER_ELEMENT = 2; - - function makeSizeSet(validAdSizes, sizeTol) { - var set = {}; - var i; - var xfuz; - var yfuz; - var size; - var width; - var height; - - for ( i = 0; i < validAdSizes.length; i++ ) { - for ( xfuz = -sizeTol; xfuz <= sizeTol; xfuz++ ) { - for ( yfuz = -sizeTol; yfuz <= sizeTol; yfuz++ ) { - size = validAdSizes[i]; - width = size[0] + xfuz; - height = size[1] + yfuz; - set[width + 'x' + height] = size; - } + var SizeMatcher = { + VALID_AD_SIZES: [ + [300, 50], + [320, 50], + [160, 600], + [300, 250], + [300, 600], + [300, 1050], + [336, 280], + [336, 850], + [468, 60], + [728, 90], + [728, 250], + [728, 270], + [970, 66], + [970, 90], + [970, 125], + [970, 250], + [970, 400], + [970, 415], + [1280, 100] + ], + + PX_SIZE_TOL: 10, + + getMatchedAdSize: function(width, height) { + + if ( !this.set ) { + this.set = this._makeSizeSet(); } - } - return set; - } - - var SIZE_SET = makeSizeSet(VALID_AD_SIZES, PX_SIZE_TOL); - function elementIsAd(el) { - if ( typeof el.searches !== 'number' ) { - el.searches = 0; - } - - if ( el.searches >= MAX_SEARCHES_PER_ELEMENT ) { - return false; - } - - el.searches += 1; - - var isImgWithoutSrc = el.tagName === 'IMG' && !el.src; - var isImgWithoutAnchor = el.tagName === 'IMG' && !(el.parentNode.tagName === 'A' || el.getAttribute('onclick')); + return this.set[Math.round(width) + 'x' + Math.round(height)]; + }, - return elementIsAdShaped(el) && !isImgWithoutSrc && !isImgWithoutAnchor; - } + elementIsAdShaped: function(el) { + return !!this.getMatchedAdSizeForElement(el); + }, - function isNewAd(el, win) { - return !el.mp_adFound && (win === win.top || !win.mp_adFound); - } + getMatchedAdSizeForElement: function(el) { + var rect = el.getBoundingClientRect(); + return this.getMatchedAdSize(rect.width, rect.height); + }, - function getFriendlyIframes(win) { - var iframes = win.document.querySelectorAll('iframe'); - iframes = exports.utils.realArray(iframes); - var friendlyIframes = iframes.filter(function(ifr) { - return exports.utils.isFriendlyWindow(ifr.contentWindow); - }); - return friendlyIframes; - } + _makeSizeSet: function() { + var set = {}; + var i; + var xfuz; + var yfuz; + var size; + var width; + var height; + + for ( i = 0; i < this.VALID_AD_SIZES.length; i++ ) { + for ( xfuz = -this.PX_SIZE_TOL; xfuz <= this.PX_SIZE_TOL; xfuz++ ) { + for ( yfuz = -this.PX_SIZE_TOL; yfuz <= this.PX_SIZE_TOL; yfuz++ ) { + size = this.VALID_AD_SIZES[i]; + width = size[0] + xfuz; + height = size[1] + yfuz; + set[width + 'x' + height] = size; + } + } + } + return set; + } + }; - function getMatchedAdSize(width, height) { - return SIZE_SET[width + 'x' + height]; - } + var Throttler = { + MAX_SEARCHES_PER_WINDOW: 10, + MAX_SEARCHES_PER_ELEMENT: 2, - function elementIsAdShaped(el) { - return !!getMatchedAdSizeForElement(el); - } + countSearch: function(el) { + if ( typeof el.searches !== 'number' ) { + el.searches = 0; + } - function getMatchedAdSizeForElement(el) { - var rect = el.getBoundingClientRect(); - return getMatchedAdSize(rect.width, rect.height); - } + el.searches += 1; + }, - function containsLargeIframes(win) { - var iframes = win.document.querySelectorAll('iframe'); - var rect; - var i; - for ( i = 0; i < iframes.length; i++ ) { - rect = iframes[i].getBoundingClientRect(); - if ( rect.width > 10 || rect.height > 10 ) { + throttle: function(el, max) { + if ( typeof el.searches === 'number' && el.searches >= max ) { return true; } - } - return false; - } - - function isValidHTML5Div(div, winSize) { - var elSize = getMatchedAdSizeForElement(div); - - if ( typeof div.checks !== 'number' ) { - div.checks = 1; - } else { - div.checks += 1; - } - - return (elSize && - elSize[0] === winSize[0] && elSize[1] === winSize[1] && - div.checks > 1); - } + return false; + }, - var HTML5_SIGNAL_ELEMENTS = 'canvas, button, video, svg, img'; - function iframeGetHTMLAd(win) { - var body = win.document.body, - elements, i, el, divs, div, numElements, - winSize, elSize; + throttleElement: function(el) { + return this.throttle(el, this.MAX_SEARCHES_PER_ELEMENT); + }, - if ( !body ) { - return null; - } - winSize = getMatchedAdSize(win.innerWidth, win.innerHeight); + throttleWin: function(win) { + return this.throttle(win, this.MAX_SEARCHES_PER_WINDOW); + }, - if ( !winSize ) { - return null; + getCount: function(el) { + return el.searches || 0; } + }; - elements = body.querySelectorAll(HTML5_SIGNAL_ELEMENTS); + function TopSearcher(win) { + this.win = win; + this.doc = win.document; + } - for ( i = 0; i < elements.length; i++ ) { - el = elements[i]; - elSize = getMatchedAdSizeForElement(el); - if ( elSize && elSize[0] === winSize[0] && elSize[1] === winSize[1] ) { - return el; + TopSearcher.prototype.search = function() { + var candidates = exports.utils.realArray(this.doc.querySelectorAll('img, object, embed')), + html5Ad, + ads = []; + + ads = ads.concat(candidates.filter(function(el) { + if ( !el.mpAdFound && !Throttler.throttleElement(el) ) { + Throttler.countSearch(el); + if ( (el.tagName !== 'IMG' || isStandardImage(el)) && SizeMatcher.elementIsAdShaped(el) ) { + el.mpAdFound = true; + return true; + } } - } + return false; + })); - numElements = body.querySelectorAll('*').length; - if ( numElements < 5 ) { - return null; + html5Ad = this._mainGetHTMLAd(); + if ( html5Ad ) { + html5Ad.html5 = true; + html5Ad.mpAdFound = true; + ads.push(html5Ad); } - divs = body.querySelectorAll('div'); + return ads; + }; - for ( i = 0; i < divs.length; i++ ) { - div = divs[i]; - if ( isValidHTML5Div(div, winSize) ) { + TopSearcher.prototype._mainGetHTMLAd = function() { + var styles = this.doc.querySelectorAll('div > style, div > link[rel="stylesheet"]'), + i, div; + for ( i = 0; i < styles.length; i++ ) { + div = styles[i].parentNode; + if ( !div.mpAdFound && SizeMatcher.elementIsAdShaped(div) && this._jumpedOut(div) ) { return div; } } + }; - return null; - } - - function jumpedOut(el) { + TopSearcher.prototype._jumpedOut = function(el) { var siblings, ifrs; siblings = exports.utils.realArray(el.parentNode.children); ifrs = siblings.filter(function(el) { return el.tagName === 'IFRAME' && el.offsetWidth === 0 && el.offsetHeight === 0; }); return ifrs.length > 0; - } + }; - function mainGetHTMLAd(win) { - var styles = win.document.querySelectorAll('div > style, div > link[rel="stylesheet"]'), - i, div; - for ( i = 0; i < styles.length; i++ ) { - div = styles[i].parentNode; - if ( elementIsAdShaped(div) && jumpedOut(div) ) { - return div; + function IframeSearcher(win) { + this.MIN_AD_AREA = 14000; + this.MIN_WINDOW_PX = 10; + + this.win = win; + this.doc = win.document; + this.body = win.document.body; + this.winClickTag = win.clickTag; + this.adSizeMeta = this._getAdSizeMeta(); + this.numElementsInBody = (this.body && this.body.querySelectorAll('*').length) || 0; + + this.shouldSearchWindow = false; + if ( !this.win.mpAdFound && this.body && !Throttler.throttleWin(this.win) ) { + this.winWidth = this.win.innerWidth; + this.winHeight = this.win.innerHeight; + if ( this._meetsMinAdSize(this.winWidth, this.winHeight) && !this._containsLargeIframes() ) { + this.shouldSearchWindow = true; } } + } - function findAds(win, opt_ads) { + IframeSearcher.prototype.search = function() { + var ad; - if ( typeof win.searches !== 'number' ) { - win.searches = 0; + if ( this.shouldSearchWindow ) { + ad = this._search(); + if ( ad ) { + ad.mpAdFound = true; + win.mpAdFound = true; + return ad; + } + Throttler.countSearch(this.win); } - var ads = opt_ads || []; - var adsFound = 0; + return null; + }; + + IframeSearcher.prototype._search = function() { + var _this = this, + stdCandidates, + html5Candidates, + stdEl, + html5El; + + stdCandidates = this.body.querySelectorAll('img, object, embed'); + + stdEl = getFirst(stdCandidates, function(el) { + if ( !el.mpAdFound && + !Throttler.throttleElement(el) && + (el.tagName !== 'IMG' || isStandardImage(el)) && + _this._elementIsAtLeastAsBigAsWindow(el)) + { + return true; + } + Throttler.countSearch(el); + return false; + }); - if ( win.innerWidth <= MIN_WINDOW_PX || win.innerHeight <= MIN_WINDOW_PX ) { - win.searches++; - return ads; + if ( stdEl ) { + return stdEl; } - if ( exports.utils.SCRIPT_IN_WINDOW_TOP || win.searches < MAX_SEARCHES_PER_WINDOW ) { - var adCandidates = win.document.querySelectorAll('img, object, embed'); - adCandidates = exports.utils.realArray(adCandidates); + if ( this._isHTML5Iframe() ) { + html5Candidates = this.doc.querySelectorAll('body, canvas, button, video, svg, div'); + html5El = getFirst(html5Candidates, function(el) { - adCandidates.forEach(function(el) { - if ( elementIsAd(el) && isNewAd(el, win) ) { - el.mp_adFound = true; - el.inIframe = win !== win.top; - win.mp_adFound = true; - ads.push(el); - adsFound += 1; + if ( _this._elementIsAtLeastAsBigAsWindow(el) ) { + return true; } + Throttler.countSearch(el); + return false; }); + } - var htmlAd, adSizeMeta; - if ( win === win.top ) { - htmlAd = mainGetHTMLAd(win); - } else { - if ( adsFound === 0 && !containsLargeIframes(win) ) { - htmlAd = iframeGetHTMLAd(win); - } - } + if ( html5El ) { + html5El.html5 = true; + html5El.winClickTag = this.winClickTag; + html5El.adSizeMeta = this.adSizeMeta; + return html5El; + } - if ( htmlAd && isNewAd(htmlAd, win) ) { - htmlAd.html5 = true; - htmlAd.inIframe = win !== win.top; - if ( htmlAd.inIframe ) { - adSizeMeta = win.document.querySelectorAll('meta[name="ad.size"]'); - if ( adSizeMeta.length > 0 ) { - htmlAd.adSizeMeta = adSizeMeta[0].content; - } - if ( win.clickTag ) { - htmlAd.winClickTag = win.clickTag; - } - } - htmlAd.mp_adFound = true; - win.mp_adFound = true; - ads.push(htmlAd); + return null; + }; + + IframeSearcher.prototype._isHTML5Iframe = function() { + if ( this.winClickTag || this.adSizeMeta ) { + return true; + } + + if ( this.doc.querySelectorAll('canvas', 'button', 'video', 'svg').length > 0 ) { + return true; + } + + if ( this.numElementsInBody >= 5 && Throttler.getCount(this.win) > 0 && this.doc.querySelectorAll('div').length > 0 ) { + return true; + } + + return false; + }; + + IframeSearcher.prototype._elementIsAtLeastAsBigAsWindow = function(el) { + var rect = el.getBoundingClientRect(), + tol = 0.95; + + return rect.width >= (tol * this.winWidth) && rect.height >= (tol * this.winHeight); + }; + + IframeSearcher.prototype._meetsMinAdSize = function(width, height) { + return (width * height) >= this.MIN_AD_AREA; + }; + + IframeSearcher.prototype._containsLargeIframes = function() { + var iframes = this.doc.querySelectorAll('iframe'); + var rect; + var i; + for ( i = 0; i < iframes.length; i++ ) { + rect = iframes[i].getBoundingClientRect(); + if ( rect.width > this.MIN_WINDOW_PX || rect.height > this.MIN_WINDOW_PX ) { + return true; } + } + return false; + }; - win.searches += 1; + IframeSearcher.prototype._getAdSizeMeta = function() { + var adSizeMeta = this.doc.querySelectorAll('meta[name="ad.size"]'); + if ( adSizeMeta.length > 0 ) { + return adSizeMeta[0].content; + } else { + return null; } + }; - var iframes = getFriendlyIframes(win); - iframes.forEach(function(ifr) { - findAds(ifr.contentWindow, ads); + function getFirst(arr, testFn) { + var i, el; + for ( i = 0; i < arr.length; i++ ) { + el = arr[i]; + if ( testFn(el) ) { + return el; + } + } + return null; + } + + function isStandardImage(img) { + + return img.src && (img.parentNode.tagName === 'A' || img.getAttribute('onclick')); + } + + function getFriendlyIframes(win) { + var iframes = win.document.querySelectorAll('iframe'); + iframes = exports.utils.realArray(iframes); + var friendlyIframes = iframes.filter(function(ifr) { + return exports.utils.isFriendlyWindow(ifr.contentWindow); }); + return friendlyIframes; + } + + function findAds(win) { + var i, + iframes, + searcher, + ad, + ads = []; + + if ( win === win.top ) { + searcher = new TopSearcher(win); + ads = ads.concat(searcher.search()); + } else { + searcher = new IframeSearcher(win); + ad = searcher.search(); + if ( ad ) { + ads.push(ad); + } + } + + iframes = getFriendlyIframes(win); + for ( i = 0; i < iframes.length; i++ ) { + ads = ads.concat(findAds(iframes[i].contentWindow)); + } return ads; } exports.adfinder = { - getMatchedAdSize: getMatchedAdSize, + getMatchedAdSize: SizeMatcher.getMatchedAdSize.bind(SizeMatcher), findAds: findAds }; })(exports); @@ -463,11 +593,12 @@ var exports = {}; getPosition: function(el) { var rect = el.getBoundingClientRect(); var win = exports.utils.elementWindow(el); + return { - width: rect.width, - height: rect.height, - left: rect.left + win.pageXOffset, - top: rect.top + win.pageYOffset + width: Math.round(rect.width), + height: Math.round(rect.height), + left: Math.round(rect.left + win.pageXOffset), + top: Math.round(rect.top + win.pageYOffset) }; }, @@ -682,7 +813,7 @@ var exports = {}; while ( true ) { parentContainer = curContainer.parentElement; - if ( this.isValidContainer(parentContainer) ) { + if ( parentContainer && this.isValidContainer(parentContainer) ) { curContainer = parentContainer; } else { return curContainer; @@ -693,12 +824,6 @@ var exports = {}; var tagfinder = { - prepToSend: function(adData) { - adData.matchedSize = exports.adfinder.getMatchedAdSize(adData.width, adData.height); - delete adData.width; - delete adData.height; - }, - setPositions: function(adData, opt_el, opt_winPos) { var el = opt_el || adData.context; var winPos = opt_winPos || {left: 0, top: 0}; @@ -732,10 +857,12 @@ var exports = {}; while ( true ) { highestContainer = mgr.highestContainer(curWin, referenceElement); mgr.captureHTML(highestContainer); - if ( curWin === curWin.top ) { break; } else { + + curWin.mpAdFound = true; + mgr.adData.serializedIframeContents = mgr.adData.context; if ( exports.utils.isFriendlyWindow(curWin.parent) ) { @@ -763,6 +890,8 @@ var exports = {}; var _pageTags; var INIT_MS_BW_SEARCHES = 2000; var PAGE_TAG_RE = new RegExp('gpt|oascentral'); + var POST_MSG_ID = '1490888598-28717-31700-14775-21098'; + var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)'); function getPageTags(doc) { var scripts = doc.getElementsByTagName('script'); @@ -778,7 +907,7 @@ var exports = {}; function messageAllParentFrames(adData) { - adData.dummyId = true; + adData.postMessageId = POST_MSG_ID; adData = JSON.stringify(adData); @@ -795,16 +924,31 @@ var exports = {}; messageAllParentFrames(adData); } else if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { + exports.tagfinder.setPositions(adData); - exports.tagfinder.prepToSend(adData); + adData.matchedSize = exports.adfinder.getMatchedAdSize(adData.width, adData.height); + if ( !adData.matchedSize ) { + + if ( AD_SERVER_RE.exec(results.referenceElement.id) ) { + adData.matchedSize = [adData.width, adData.height]; + adData.oddSize = true; + } else { + + return; + } + } + delete adData.width; + delete adData.height; adData.curPageUrl = exports.utils.getPageUrl(); _pageTags = _pageTags || getPageTags(document); var log = _logGen.log('ad', [adData], _pageTags); + if ( _onAdFound ) { - _onAdFound(log, results.referenceElement); - } + _onAdFound(log, results.referenceElement); + + } } } @@ -812,33 +956,27 @@ var exports = {}; if ( exports.utils.SCRIPT_IN_WINDOW_TOP || document.readyState === 'complete' ) { extractAds(); } - setTimeout(function() { - extractAdsWrapper(); - }, INIT_MS_BW_SEARCHES); + setTimeout( + function() { extractAdsWrapper(); }, INIT_MS_BW_SEARCHES + ); } function extractAds() { var ads = exports.adfinder.findAds(window); - - if ( !ads ) { - return; - } - ads.forEach(function(ad) { var startTime = new Date().getTime(); var adId = startTime + '-' + Math.floor(Math.random() * 10e12); var adData = { - width: ad.offsetWidth, - height: ad.offsetHeight, + width: Math.round(ad.offsetWidth), + height: Math.round(ad.offsetHeight), startTime: startTime, adId: adId, - html5: ad.html5 || false, - inIframe: ad.inIframe + html5: ad.html5 || false }; - if ( ad.html5 && ad.inIframe ) { + if ( ad.html5 ) { adData.adSizeMeta = ad.adSizeMeta || null; adData.winClickTag = ad.winClickTag || null; } @@ -898,9 +1036,11 @@ var exports = {}; return; } - if ( adData.dummyId ) { + if ( adData.postMessageId === POST_MSG_ID ) { + + delete adData.postMessageId; - delete adData.dummyId; + event.stopImmediatePropagation(); if ( isChildWin(myWin, ifrWin) ) { if ( exports.utils.isFriendlyWindow(ifrWin) ) { @@ -917,7 +1057,53 @@ var exports = {}; } } + function onVideoMessage(msg, sender, callback) { + var log; + if ( msg.event === 'new-video-ad' ) { + msg.assets.forEach(function(asset) { + + }); + log = _logGen.log('video', msg.assets); + } else { + log = _logGen.log('invalid-video', msg.assets); + } + + msg.assets.forEach(function(a) {delete a.isVideo;}); + log.displayAdFound = msg.displayAdFound; + log.requests = msg.requests; + log.data = msg.event_data; + + log.doc.finalPageUrl = log.doc.url; + log.doc.url = exports.utils.normalizeUrl(msg.origUrl); + + _onAdFound(log); + } + + function addBackgroundListener(event, callback) { + if ( typeof browser !== 'undefined' ) { + browser.runtime.onMessage.addListener(function(msg) { + if ( msg.event === event ) { + callback(msg); + } + }); + } else if ( typeof chrome !== 'undefined' ) { + chrome.runtime.onMessage.addListener(function(msg) { + if ( msg.event === event ) { + callback(msg); + } + }); + } else if ( window.self.port ) { + window.self.port.on(event, callback); + } + } + exports.coordinator = { + addPostMessageListener: function() { + if ( !exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { + window.addEventListener('message', onPostMessage, false); + } + }, + init: function(onAdFound) { if ( exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { @@ -925,19 +1111,19 @@ var exports = {}; } _onAdFound = onAdFound; - if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { var log = _logGen.log('page'); onAdFound(log); - } - window.addEventListener('message', onPostMessage, false); - if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { window.addEventListener('beforeunload', function(event) { var log = _logGen.log('unload'); log.timing = window.performance.timing; onAdFound(log); }); + + addBackgroundListener('new-video-ad', onVideoMessage); + addBackgroundListener('new-invalid-video-ad', onVideoMessage); + } exports.utils.onDocLoaded(document, extractAdsWrapper); @@ -949,27 +1135,32 @@ var exports = {}; if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { window.adparser = { init: exports.coordinator.init, + addPostMessageListener: exports.coordinator.addPostMessageListener, + ifTrackingEnabled: exports.utils.ifTrackingEnabled, + sendToBackground: exports.utils.sendToBackground }; } else { - exports.coordinator.init(function() {}); + exports.coordinator.addPostMessageListener(); + exports.utils.ifTrackingEnabled( + function() { + exports.coordinator.init(function() {}); + }, + function() {} + ); } - })(window); (function(adparser) { - function sendToBackground(event, message) { - if ( window.self.port ) { - window.self.port.emit(event, message); - } else if ( typeof chrome !== 'undefined' ) { - chrome.extension.sendRequest(message); - } - } - function onAdFound(log) { - sendToBackground('ad_log', { id: 'ad_log', subject: log }); + adparser.sendToBackground({ id: 'ad_log', subject: log }, 'ad_log', '', function(){}); } - if ( window === window.top ) { - adparser.init(onAdFound); + if ( window === window.top ) { + adparser.addPostMessageListener(); + adparser.ifTrackingEnabled( + function() { + adparser.init(onAdFound); + }, + function() {} + ) } })(window.adparser); - diff --git a/src/drivers/webextension/js/network.js b/src/drivers/webextension/js/network.js index 0b77c1721..b2f2ea018 100644 --- a/src/drivers/webextension/js/network.js +++ b/src/drivers/webextension/js/network.js @@ -782,4 +782,3 @@ }); })(); - diff --git a/src/drivers/webextension/manifest.edge.json b/src/drivers/webextension/manifest.edge.json index 80f4f7066..57acb0f96 100644 --- a/src/drivers/webextension/manifest.edge.json +++ b/src/drivers/webextension/manifest.edge.json @@ -59,6 +59,7 @@ ], "options_page": "options.html", "permissions": [ + "storage", "tabs", "webRequest", "webNavigation", diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 15696315c..dae47859d 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -26,8 +26,8 @@ "default_popup": "popup.html" }, "background": { - "page": "background.html", - "persistent": true + "page": "background.html" + }, "content_scripts": [ { @@ -43,7 +43,7 @@ }, { "matches": [ - "http://*/*", + "http://*/*", "https://*/*" ], "js": [ @@ -58,16 +58,19 @@ "js/inject.js" ], "options_page": "options.html", + "options_ui": { + "page": "options.html", + "open_in_tab": false + }, "permissions": [ + "storage", "tabs", "webRequest", "webNavigation", "http://*/*", "https://*/*" ], - "content_security_policy": "script-src 'self'; object-src 'self'", - "-ms-preload": { - "backgroundScript": "js/ms_background_scripts_api_bridge.js", - "contentScript": "js/ms_content_scripts_api_bridge.js" - } + "content_security_policy": "script-src 'self'; object-src 'self'" } + + From 6bf5d82db45714e333094ae82a2c0e8d0c39686d Mon Sep 17 00:00:00 2001 From: Brandon Kelly Date: Thu, 1 Jun 2017 06:04:18 -0700 Subject: [PATCH 46/63] Updated Craft CMS website URL --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index b9f39994c..3c0e139ea 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1689,7 +1689,7 @@ }, "icon": "Craft CMS.png", "implies": "Yii", - "website": "http://buildwithcraft.com" + "website": "https://craftcms.com" }, "Crazy Egg": { "cats": [ From d92fb26735306d86c5433d8d03834551ded0310b Mon Sep 17 00:00:00 2001 From: Michal Barla Date: Thu, 1 Jun 2017 18:02:29 +0200 Subject: [PATCH 47/63] =?UTF-8?q?Add=20Luigi=E2=80=99s=20Box=20application?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apps.json | 9 +++++++++ src/icons/Luigisbox.svg | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/icons/Luigisbox.svg diff --git a/src/apps.json b/src/apps.json index b9f39994c..474dae89e 100755 --- a/src/apps.json +++ b/src/apps.json @@ -4593,6 +4593,15 @@ "implies": "Java", "website": "http://lucene.apache.org/core/" }, + "Luigiā€™s Box": { + "cats": [ + "10", + "29" + ], + "env": "^Luigis$", + "icon": "Luigisbox.svg", + "website": "https://www.luigisbox.com" + }, "M.R. Inc BoxyOS": { "cats": [ "28" diff --git a/src/icons/Luigisbox.svg b/src/icons/Luigisbox.svg new file mode 100644 index 000000000..3a7dc2388 --- /dev/null +++ b/src/icons/Luigisbox.svg @@ -0,0 +1,25 @@ + +image/svg+xml \ No newline at end of file From b33e70da84ce7ed7e2ada330d1b769d595e051b9 Mon Sep 17 00:00:00 2001 From: branchard Date: Sat, 3 Jun 2017 03:02:15 +0200 Subject: [PATCH 48/63] fix Meteor in apps.json (Meteor does not imply jQuery) --- src/apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index b9f39994c..123f19f06 100755 --- a/src/apps.json +++ b/src/apps.json @@ -4912,8 +4912,7 @@ "icon": "Meteor.png", "implies": [ "MongoDB", - "Node.js", - "jQuery" + "Node.js" ], "website": "http://meteor.com" }, From f14e45c431ad4123a38a4710584669a6df3d4440 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 3 Jun 2017 11:30:05 +1000 Subject: [PATCH 49/63] Add Prebid application --- bin/build | 4 ++-- src/apps.json | 15 +++++++++++++++ src/drivers/webextension/js/driver.js | 2 +- src/icons/Prebid.png | Bin 0 -> 995 bytes 4 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 src/icons/Prebid.png diff --git a/bin/build b/bin/build index 7fa8816d0..2c2941ba6 100755 --- a/bin/build +++ b/bin/build @@ -57,8 +57,8 @@ cp -r ../src/icons $manifest_dir/Extension/images mv $webextension_dir/manifest.json $webextension_dir/manifest.edge.json mv $webextension_dir/manifest.webextension.json $webextension_dir/manifest.json -sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-NAME-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml -sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-PUBLISHER-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml +sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-NAME-HERE/1591Wappalyzer.Wappalyzer/' $manifest_dir/appxmanifest.xml +sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-PUBLISHER-HERE/D240C22F-A6C1-45DF-BF7B-4C835064DF51/' $manifest_dir/appxmanifest.xml sed -i 's/INSERT-YOUR-PACKAGE-PROPERTIES-PUBLISHERDISPLAYNAME-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml sed -i 's/Version="0.\([^"]\+\)/Version="\1.0/' $manifest_dir/appxmanifest.xml diff --git a/src/apps.json b/src/apps.json index b9f39994c..83d78d398 100755 --- a/src/apps.json +++ b/src/apps.json @@ -161,6 +161,21 @@ "icon": "ActOn.png", "website": "http://act-on.com" }, + "Prebid": { + "cats": [ + "36" + ], + "icon": "Prebid.png", + "env": [ + "pbjs", + "PREBID_TIMEOUT" + ], + "script": [ + "/prebid\\.js", + "adnxs\\.com/[^\"]*(?:prebid|/pb\\.js)" + ], + "website": "http://prebid.org" + }, "AdInfinity": { "cats": [ "36" diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index eb71205e6..8cf460772 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -257,7 +257,7 @@ if ( cat === match && !found ) { if ( /\.svg$/i.test(icon) ) { - icon = 'converted/' + icon + '.png'; + icon = 'converted/' + icon.replace(/\.svg$/, '.png'); } browser.pageAction.setIcon({ diff --git a/src/icons/Prebid.png b/src/icons/Prebid.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9ab86c6c6307eca0cc8878a4a7ebb10b19731d GIT binary patch literal 995 zcmV<9104K`P)X7@ZwZU18c-3bu66#yJ;sP?Ub3O6DDD0MxQNbfyXYgNwWK*|^*1t7A! zSDoqmR)BZ98>zK+{t#mM6iAH&$yWkV^2Not;NZrWsoUq~wT){un(pkhvw^Xo{Qab? zuRWrI#>94*WS@crxHHL|-G@t}<7X<)hLs;b@=B*4CMC_0`t#gCdt+szqX6F0ry{s= z?k>4`*<|1&we<-KD)gp03SbwC)UIBLm~g;UJYuzPLSzb2M**zc4mMKm`dg~)9h1#f zh2aX!9pO%vrS?3q2#rRggU}5E5RaN`yj5N9-^7R@CZ}N+4#b>`Z3|%H28$O#dEr%W z`LoB{jn$a-$@vKcV=Tw*owFYj(Fcq%>WKicU*F+hoPXKBG(SV6`no-3jljST$IYu{ z0AKe+0OeK@`!%RI1nYC(Cl!IBFh_`{dR78vVYY7A+4rsdfj3ER+5J2Kap5pCzxRxh z%752W6AUU#j{Lp!pmeW}0n|4E#CU-@yYBtLy0uu*{YsNSuI9HO=baBI-6N>$rMSY4WpLpKG$Pki5HiciD5Wgo!A zfEKoZnV&)Wjw9RW0j-PQyb)A?dQOGzpk0+Q#(2Y;+V^he;4_~v#=^t}_)7!}fI|cL zQotA#fUWI1L25Lk8iXin=OVwBr&x~80+|7BkJpUUM6;s+-Y;Ji!s^d&tH3=1L~4Zo zF@s^BPw#*1#MsP3-`+F`$@*{4w=T^;E4^z-CfW`NMBsMzXzW(b0=T&VD!iUjaRkPU z(Gq|Gh+2@%a_1!IOwTP_Q~S5TN9z?B0IZ$&Ab0;O+VM3SjYgx Date: Sat, 3 Jun 2017 11:38:56 +1000 Subject: [PATCH 50/63] Fix false detection of Blogger, Perl --- src/apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index 83d78d398..44bdd882a 100755 --- a/src/apps.json +++ b/src/apps.json @@ -942,7 +942,7 @@ ], "icon": "Blogger.png", "meta": { - "generator": "blogger" + "generator": "^Blogger$" }, "url": "\\.blogspot\\.com", "website": "http://www.blogger.com" @@ -6060,7 +6060,6 @@ "Server": "\bPerl\b(?: ?/?v?([\\d.]+))?\\;version:\\1" }, "icon": "Perl.png", - "url": "\\.pl(?:$|\\?)", "website": "http://perl.org" }, "Petrojs": { From 17942fa3718b42904405c143ac0c13e0fa11cdff Mon Sep 17 00:00:00 2001 From: Carlos Duran Date: Sun, 4 Jun 2017 17:30:42 -0500 Subject: [PATCH 51/63] Fix false positive in Twitter Bootstrap Many frameworks use that pattern for their grid system. https://github.com/AliasIO/Wappalyzer/issues/1589 --- src/apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index 76638b5c3..96e8ab671 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8227,8 +8227,7 @@ "env": "^Twipsy$\\;confidence:50", "html": [ "
' + - '' + - '' + - '' + - '' + appName + '' + - ( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' ) + - '' + - ''; + categories = []; response.apps[appName].cats.forEach(function(cat) { - html += - '' + - '' + browser.i18n.getMessage('categoryName' + cat) + '' + - ''; + categories.push( + [ + 'a', { + target: '_blank', + href: 'https://wappalyzer.com/categories/' + popup.slugify(response.categories[cat].name) + }, [ + 'span', { + class: 'category' + }, [ + 'span', { + class: 'name' + }, + browser.i18n.getMessage('categoryName' + cat) + ] + ] + ] + ); }); - html += - '' + - '

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