diff --git a/.gitignore b/.gitignore index 8343ce16c..4c54d94c3 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ Desktop.ini ._* tags tags.* +.idea +/nbproject/private/ diff --git a/Dockerfile b/Dockerfile index d781318ad..e7c9e6806 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM alpine -MAINTAINER Elbert Alias +LABEL maintainer="elbert@alias.io" ENV WAPPALYZER_DIR=/opt/wappalyzer diff --git a/src/apps.json b/src/apps.json index 7f724d4bd..289825e20 100644 --- a/src/apps.json +++ b/src/apps.json @@ -15,6 +15,14 @@ "script": "1c-bitrix", "website": "http://www.1c-bitrix.ru" }, + "91App": { + "cats": [ + 6 + ], + "icon": "91app.png", + "script": "https\\:\\/\\/track\\.91app\\.io\\/track\\.js\\?", + "website": "https://www.91app.com/" + }, "3dCart": { "cats": [ 1, @@ -38,7 +46,7 @@ "icon": "A-Frame.svg", "implies": "three.js", "js": { - "AFRAME.version": "(.*)\\;version:\\1" + "AFRAME.version": "^(.+)$\\;version:\\1" }, "script": "/?([\\d.]+)?/aframe(?:\\.min)?\\.js\\;version:\\1", "website": "https://aframe.io" @@ -56,23 +64,6 @@ "icon": "ebis.png", "website": "http://www.ebis.ne.jp" }, - "AMPcms": { - "cats": [ - 1 - ], - "cookies": { - "AMP": "" - }, - "headers": { - "X-AMP-Version": "([\\d.]+)\\;version:\\1" - }, - "icon": "AMPcms.png", - "implies": "PHP", - "js": { - "amp_js_init": "" - }, - "website": "http://www.ampcms.org" - }, "AOLserver": { "cats": [ 22 @@ -124,26 +115,48 @@ "icon": "Accelerated-Mobile-Pages.svg", "website": "https://www.ampproject.org" }, - "Accessible Portal": { + "Azure": { "cats": [ - 1 + 62 ], - "icon": "Accessible Portal.png", - "implies": "PHP", - "meta": { - "generator": "Accessible Portal" + "headers": { + "azure-regionname": "", + "azure-sitename": "", + "azure-slotname": "", + "azure-version": "" }, - "website": "http://www.accessibleportal.com" + "cookies": { + "ARRAffinity": "", + "TiPMix": "" + }, + "icon": "azure.svg", + "website": "https://azure.microsoft.com" + }, + "Azure CDN": { + "cats": [ + 31 + ], + "headers": { + "server": "^(?:ECAcc|ECS|ECD)", + "X-EC-Debug": "" + }, + "icon": "azure.svg", + "website": "https://azure.microsoft.com/en-us/services/cdn/" }, "Acquia Cloud": { "cats": [ - 22 + 62 ], "headers": { "X-AH-Environment": "^\\w+$" }, "icon": "acquia-cloud.png", - "implies": "Drupal\\;confidence:95", + "implies": [ + "Drupal\\;confidence:95", + "Apache", + "Percona", + "Amazon EC2" + ], "website": "https://www.acquia.com/" }, "Act-On": { @@ -373,7 +386,7 @@ ], "icon": "Adyen.svg", "js": { - "adyen.encrypt.version": "(.*)\\;version:\\1" + "adyen.encrypt.version": "^(.+)$\\;version:\\1" }, "website": "https://www.adyen.com" }, @@ -425,6 +438,20 @@ "script": "shop-static\\.afterbuy\\.de", "website": "http://www.afterbuy.de" }, + "Ahoy": { + "cats": [ + 10 + ], + "js": { + "ahoy": "" + }, + "cookies": { + "ahoy_track": "", + "ahoy_visit": "", + "ahoy_visitor": "" + }, + "website": "https://github.com/ankane/ahoy" + }, "Aircall": { "cats": [ 52 @@ -486,7 +513,7 @@ "icon": "Algolia Realtime Search.svg", "js": { "AlgoliaSearch": "", - "algoliasearch.version": "(.*)\\;version:\\1" + "algoliasearch.version": "^(.+)$\\;version:\\1" }, "website": "http://www.algolia.com" }, @@ -497,7 +524,7 @@ "html": "", + "website": "https://www.docker.com/" + }, "Dojo": { "cats": [ 59 @@ -2543,7 +2690,7 @@ "icon": "Dojo.png", "js": { "dojo": "", - "dojo.version.major": "(.*)\\;version:\\1" + "dojo.version.major": "^(.+)$\\;version:\\1" }, "script": "([\\d.]+)/dojo/dojo(?:\\.xd)?\\.js\\;version:\\1", "website": "https://dojotoolkit.org" @@ -2575,10 +2722,14 @@ "cookies": { "DokuWiki": "" }, + "html": [ + "]+id=\"dokuwiki__>", + "]+href=\"#dokuwiki__" + ], "icon": "DokuWiki.png", "implies": "PHP", "meta": { - "generator": "^DokuWiki( Release [\\-\\d]+)?\\;version:\\1" + "generator": "^DokuWiki( Release [\\d-]+)?\\;version:\\1" }, "website": "https://www.dokuwiki.org" }, @@ -2654,9 +2805,14 @@ "cats": [ 20 ], - "html": "(?:", - "]*type=[\"']googleanalytics[\"']", + "html": "]*type=[\"']googleanalytics[\"']", "js": { "GoogleAnalyticsObject": "", "gaGlobal": "" @@ -3924,16 +4166,6 @@ "script": "/wp-content/plugins/gravityforms/js/[^/]+\\.js\\?ver=([\\d.]+)$\\;version:\\1", "website": "http://gravityforms.com" }, - "Gravity Insights": { - "cats": [ - 10 - ], - "icon": "Gravity Insights.png", - "js": { - "gravityInsightsParams": "" - }, - "website": "http://insights.gravity.com" - }, "Green Valley CMS": { "cats": [ 1 @@ -3946,6 +4178,32 @@ }, "website": "http://www.greenvalley.nl/Public/Producten/Content_Management/CMS" }, + "Gridsome": { + "cats": [ + 57 + ], + "icon": "Gridsome.svg", + "implies": "Vue.js", + "meta": { + "generator": "^Gridsome v([\\d.]+)$\\;version:\\1" + }, + "website": "https://gridsome.org" + }, + "GrowingIO": { + "cats": [ + 10 + ], + "js": { + "gio": "" + }, + "cookies": { + "grwng_uid": "", + "gr_user_id": "" + }, + "icon": "GrowingIO.png", + "script": "assets\\.growingio\\.com/([\\d.]+)/gio.js\\;version:\\1", + "website": "https://www.growingio.com/" + }, "HERE": { "cats": [ 35 @@ -4038,9 +4296,9 @@ ], "icon": "Hammer.js.png", "js": { - "Ha.VERSION": "(.*)\\;version:\\1", + "Ha.VERSION": "^(.+)$\\;version:\\1", "Hammer": "", - "Hammer.VERSION": "(.*)\\;version:\\1" + "Hammer.VERSION": "^(.+)$\\;version:\\1" }, "script": "hammer(?:\\.min)?\\.js", "website": "https://hammerjs.github.io" @@ -4053,7 +4311,7 @@ "icon": "Handlebars.png", "js": { "Handlebars": "", - "Handlebars.VERSION": "(.*)\\;version:\\1" + "Handlebars.VERSION": "^(.+)$\\;version:\\1" }, "script": "handlebars(?:\\.runtime)?(?:-v([\\d.]+?))?(?:\\.min)?\\.js\\;version:\\1", "website": "http://handlebarsjs.com" @@ -4141,7 +4399,7 @@ "icon": "Highcharts.png", "js": { "Highcharts": "", - "Highcharts.version": "(.*)\\;version:\\1" + "Highcharts.version": "^(.+)$\\;version:\\1" }, "script": "highcharts.*\\.js", "website": "https://www.highcharts.com" @@ -4164,7 +4422,7 @@ ], "html": "]*>Created with Highstock ([\\d.]*)\\;version:\\1", "icon": "Highcharts.png", - "script": "highstock(?:\\-|\\.)?([\\d\\.]*\\d).*\\.js\\;version:\\1", + "script": "highstock[.-]?([\\d\\.]*\\d).*\\.js\\;version:\\1", "website": "http://highcharts.com/products/highstock" }, "Hinza Advanced CMS": { @@ -4179,13 +4437,13 @@ }, "website": "http://hinzaco.com" }, - "Hippo": { + "Bloomreach": { "cats": [ 1 ], "html": "<[^>]+/binaries/(?:[^/]+/)*content/gallery/", - "icon": "Hippo.png", - "website": "http://onehippo.org" + "icon": "Bloomreach.png", + "website": "https://developers.bloomreach.com" }, "Hogan.js": { "cats": [ @@ -4196,7 +4454,7 @@ "Hogan": "" }, "script": [ - "hogan-(?:-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "hogan-[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "([\\d.]+)/hogan(?:\\.min)?\\.js\\;version:\\1" ], "website": "https://twitter.github.io/hogan.js/" @@ -4283,6 +4541,17 @@ "script": "cmdatatagutils\\.js", "website": "http://ibm.com/software/marketing-solutions/coremetrics" }, + "IBM DataPower": { + "cats": [ + 64 + ], + "headers": { + "X-Backside-Transport": "", + "X-Global-Transaction-ID": "" + }, + "icon": "DataPower.png", + "website": "https://www.ibm.com/products/datapower-gateway" + }, "IBM HTTP Server": { "cats": [ 22 @@ -4407,7 +4676,7 @@ "icon": "Immutable.js.png", "js": { "Immutable": "", - "Immutable.version": "(.*)\\;version:\\1" + "Immutable.version": "^(.+)$\\;version:\\1" }, "script": "^immutable\\.(?:min\\.)?js$", "website": "https://facebook.github.io/immutable-js/" @@ -4510,7 +4779,7 @@ "icon": "InfernoJS.png", "js": { "Inferno": "", - "Inferno.version": "(.*)\\;version:\\1" + "Inferno.version": "^(.+)$\\;version:\\1" }, "website": "https://infernojs.org" }, @@ -4542,6 +4811,21 @@ ], "website": "https://www.inspectlet.com/" }, + "Instabot": { + "cats": [ + 5, + 10, + 32, + 52, + 58 + ], + "icon": "Instabot.png", + "js": { + "Instabot": "" + }, + "script": "/rokoInstabot\\.js", + "website": "https://instabot.io/" + }, "InstantCMS": { "cats": [ 1 @@ -4616,6 +4900,18 @@ "script": "https?://cdn\\.inwemo\\.com/inwemo\\.min\\.js", "website": "https://inwemo.com/" }, + "Ionic": { + "cats": [ + 18 + ], + "icon": "ionic.png", + "implies": "Angular", + "js": { + "Ionic.config": "", + "Ionic.version": "^(.+)$\\;version:\\1" + }, + "website": "https://ionicframework.com" + }, "Ionicons": { "cats": [ 17 @@ -4686,7 +4982,7 @@ "js": { "jseMine": "" }, - "script": "^(?:https):?//load\\.jsecoin\\.com/server/load/", + "script": "^(?:https):?//load\\.jsecoin\\.com/load/", "website": "https://jsecoin.com/" }, "JTL Shop": { @@ -4747,7 +5043,7 @@ "icon": "JavaScript Infovis Toolkit.png", "js": { "$jit": "", - "$jit.version": "(.*)\\;version:\\1" + "$jit.version": "^(.+)$\\;version:\\1" }, "script": "jit(?:-yc)?\\.js", "website": "https://philogb.github.io/jit/" @@ -4989,7 +5285,7 @@ "implies": "jQuery", "js": { "kendo": "", - "kendo.version": "(.*)\\;version:\\1" + "kendo.version": "^(.+)$\\;version:\\1" }, "website": "https://www.telerik.com/kendo-ui" }, @@ -5006,6 +5302,19 @@ }, "website": "http://www.kentico.com" }, + "Kestrel": { + "cats": [ + 22 + ], + "headers": { + "Server": "^Kestrel" + }, + "implies": [ + "Microsoft ASP.NET" + ], + "icon": "kestrel.svg", + "website": "https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel" + }, "KeyCDN": { "cats": [ 31 @@ -5038,7 +5347,7 @@ "icon": "KineticJS.png", "js": { "Kinetic": "", - "Kinetic.version": "(.*)\\;version:\\1" + "Kinetic.version": "^(.+)$\\;version:\\1" }, "script": "kinetic(?:-v?([\\d.]+))?(?:\\.min)?\\.js\\;version:\\1", "website": "https://github.com/ericdrowell/KineticJS/" @@ -5061,7 +5370,7 @@ ], "icon": "Knockout.js.png", "js": { - "ko.version": "(.*)\\;version:\\1" + "ko.version": "^(.+)$\\;version:\\1" }, "website": "http://knockoutjs.com" }, @@ -5203,7 +5512,7 @@ 1 ], "headers": { - "X-KoobooCMS-Version": "(.*)\\;version:\\1" + "X-KoobooCMS-Version": "^(.+)$\\;version:\\1" }, "icon": "Kooboo CMS.png", "implies": "Microsoft ASP.NET", @@ -5269,7 +5578,7 @@ "meta": { "laterpay:connector:callbacks:on_user_has_access": "deobfuscateText" }, - "script": "https?://connectormwi\\.laterpay\\.net/([0-9.]+)[a-zA-z\\-]*/live/[\\w-]+\\.js\\;version:\\1", + "script": "https?://connectormwi\\.laterpay\\.net/([0-9.]+)[a-zA-z-]*/live/[\\w-]+\\.js\\;version:\\1", "website": "https://www.laterpay.net/" }, "Lazy.js": { @@ -5287,7 +5596,7 @@ "js": { "L.DistanceGrid": "", "L.PosAnimation": "", - "L.version": "(.*)\\;version:\\1\\;confidence:0" + "L.version": "^(.+)$\\;version:\\1\\;confidence:0" }, "script": "leaflet.*\\.js", "website": "http://leafletjs.com" @@ -5501,7 +5810,7 @@ "icon": "Livefyre.png", "js": { "FyreLoader": "", - "L.version": "(.*)\\;confidence:0\\;version:\\1", + "L.version": "^(.+)$\\;confidence:0\\;version:\\1", "LF.CommentCount": "", "fyre": "" }, @@ -5522,6 +5831,18 @@ "script": "/js/al/common\\.js\\?[0-9_]+", "website": "http://liveinternet.ru/rating/" }, + "LocalFocus": { + "cats": [ + 61 + ], + "html": "]+localfocus", + "icon": "LocalFocus.png", + "implies": [ + "Angular", + "D3" + ], + "website": "https://www.localfocus.nl/en/" + }, "Locomotive": { "cats": [ 1 @@ -5541,7 +5862,7 @@ "excludes": "Underscore.js", "icon": "Lo-dash.png", "js": { - "_.VERSION": "(.*)\\;confidence:0\\;version:\\1", + "_.VERSION": "^(.+)$\\;confidence:0\\;version:\\1", "_.differenceBy": "" }, "script": "lodash.*\\.js", @@ -5569,6 +5890,14 @@ "implies": "Java", "website": "http://www-01.ibm.com/software/lotus/products/domino" }, + "LOU": { + "cats": [ + 58 + ], + "icon": "LOU.png", + "script": "cdn\\.louassist\\.com*", + "website": "https://www.louassist.com" + }, "Lua": { "cats": [ 27 @@ -5666,12 +5995,30 @@ 6 ], "cookies": { - "botble_session": "" + "mypage_session": "" + }, + "headers": { + "CMS-Version": "^(.+)$\\;version:\\1\\;confidence:0" }, "icon": "mypage-platform.png", "implies": "Laravel", "website": "https://www.mypage.vn" }, + "Botble CMS": { + "cats": [ + 1, + 6 + ], + "cookies": { + "botble_session": "" + }, + "headers": { + "CMS-Version": "^(.+)$\\;version:\\1\\;confidence:0" + }, + "icon": "Botble-CMS.png", + "implies": "Laravel", + "website": "https://botble.com" + }, "MadAdsMedia": { "cats": [ 36 @@ -5769,6 +6116,13 @@ "script": "\\/assets\\/js\\/manycontacts\\.min\\.js", "website": "http://www.manycontacts.com" }, + "MariaDB": { + "cats": [ + 34 + ], + "icon": "mariadb.svg", + "website": "https://mariadb.org" + }, "Marionette.js": { "cats": [ 12 @@ -5780,7 +6134,7 @@ ], "js": { "Marionette": "", - "Marionette.VERSION": "(.*)\\;version:\\1" + "Marionette.VERSION": "^(.+)$\\;version:\\1" }, "script": "backbone\\.marionette.*\\.js", "website": "https://marionettejs.com" @@ -5836,7 +6190,7 @@ "icon": "MathJax.png", "js": { "MathJax": "", - "MathJax.version": "(.*)\\;version:\\1" + "MathJax.version": "^(.+)$\\;version:\\1" }, "script": "([\\d.]+)?/mathjax\\.js\\;version:\\1", "website": "https://www.mathjax.org" @@ -5935,7 +6289,7 @@ "icon": "MediaElement.js.png", "js": { "mejs": "", - "mejs.version": "(.*)\\;version:\\1" + "mejs.version": "^(.+)$\\;version:\\1" }, "website": "http://www.mediaelementjs.com" }, @@ -5953,13 +6307,20 @@ "cats": [ 8 ], - "html": "(?:]+>Powered by MediaWiki|<[^>]+id=\"t-specialpages)", + "html": [ + "]+class=\"mediawiki\"", + "<(?:a|img)[^>]+>Powered by MediaWiki", + "]+/Special:WhatLinksHere/" + ], "icon": "MediaWiki.png", "implies": "PHP", + "js": { + "mw.util.toggleToc": "" + }, "meta": { "generator": "^MediaWiki ?(.+)$\\;version:\\1" }, - "website": "http://www.mediawiki.org" + "website": "https://www.mediawiki.org" }, "Medium": { "cats": [ @@ -6105,7 +6466,7 @@ 1 ], "headers": { - "MicrosoftSharePointTeamServices": "(.*)\\;version:\\1", + "MicrosoftSharePointTeamServices": "^(.+)$\\;version:\\1", "SPRequestGuid": "", "SharePointHealthScore": "", "X-SharePointHealthScore": "" @@ -6190,6 +6551,14 @@ "script": "mint/\\?js", "website": "https://haveamint.com" }, + "Mithril": { + "cats": [ + 12 + ], + "icon": "Mithril.svg", + "script": "mithril/\\?js", + "website": "https://mithril.js.org" + }, "Mixpanel": { "cats": [ 10 @@ -6242,7 +6611,7 @@ "icon": "MochiKit.png", "js": { "MochiKit": "", - "MochiKit.MochiKit.VERSION": "(.*)\\;version:\\1" + "MochiKit.MochiKit.VERSION": "^(.+)$\\;version:\\1" }, "script": "MochiKit(?:\\.min)?\\.js", "website": "https://mochi.github.io/mochikit/" @@ -6262,7 +6631,7 @@ ], "icon": "Modernizr.svg", "js": { - "Modernizr._version": "(.*)\\;version:\\1" + "Modernizr._version": "^(.+)$\\;version:\\1" }, "script": [ "([\\d.]+)?/modernizr(?:.([\\d.]+))?.*\\.js\\;version:\\1?\\1:\\2" @@ -6284,10 +6653,11 @@ 1, 6 ], - "html": "(?:]*(?:src=|href=)[\"'][^\"]*mg-(?:core|plugins|templates)", + "html": "]+href=[\"'][^\"]+mg-(?:core|plugins|templates)/", + "script": "mg-(?:core|plugins|templates)/", "icon": "Moguta.CMS.png", "implies": "PHP", - "website": "http://moguta.ru" + "website": "https://moguta.ru" }, "MoinMoin": { "cats": [ @@ -6331,7 +6701,7 @@ ], "icon": "Moment.js.svg", "implies": "Moment.js", - "script": "moment-timezone(?:\\-data)?(?:\\.min)?\\.js", + "script": "moment-timezone(?:-data)?(?:\\.min)?\\.js", "website": "http://momentjs.com/timezone/" }, "Moment.js": { @@ -6341,7 +6711,7 @@ "icon": "Moment.js.svg", "js": { "moment": "", - "moment.version": "(.*)\\;version:\\1" + "moment.version": "^(.+)$\\;version:\\1" }, "script": "moment(?:\\.min)?\\.js", "website": "https://momentjs.com" @@ -6421,7 +6791,7 @@ "icon": "MooTools.png", "js": { "MooTools": "", - "MooTools.version": "(.*)\\;version:\\1" + "MooTools.version": "^(.+)$\\;version:\\1" }, "script": "mootools.*\\.js", "website": "https://mootools.net" @@ -6491,16 +6861,6 @@ }, "website": "http://movabletype.org" }, - "Moxa": { - "cats": [ - 37 - ], - "headers": { - "Server": "MoxaHttp(?:/([\\d.]+))?\\;version:\\1" - }, - "icon": "Moxa.png", - "website": "http://moxa.com" - }, "Mozard Suite": { "cats": [ 1 @@ -6530,7 +6890,7 @@ ], "icon": "Mustache.png", "js": { - "Mustache.version": "(.*)\\;version:\\1" + "Mustache.version": "^(.+)$\\;version:\\1" }, "script": "mustache(?:\\.min)?\\.js", "website": "https://mustache.github.io" @@ -6585,14 +6945,6 @@ "icon": "Plataforma NEO.svg", "website": "http://www.jetecommerce.com.br/" }, - "NOIX": { - "cats": [ - 19 - ], - "html": "(?:<[^>]+(?:src|href)=[^>]*/media/noix|", + "html": "", "script": "b\\.yjtag\\.jp/iframe", "icon": "yahoo.png", "website": "https://tagmanager.yahoo.co.jp/" @@ -11362,11 +11916,29 @@ "icon": "YouTube.png", "website": "http://www.youtube.com" }, + "iEXExchanger": { + "cats": [ + 1 + ], + "implies": [ + "PHP", + "Apache", + "Angular" + ], + "cookies": { + "iexexchanger_session": "" + }, + "meta": { + "generator": "iEXExchanger" + }, + "icon": "iEXExchanger.png", + "website": "https://exchanger.iexbase.com" + }, "ZK": { "cats": [ 18 ], - "html": "", + "html": "", "icon": "ZK.png", "implies": "Java", "script": "zkau/", @@ -11572,6 +12144,10 @@ "headers": { "Server": "cpsrvd/([\\d.]+)\\;version:\\1" }, + "cookies": { + "cpsession": "", + "cprelogin": "" + }, "html": " + element-logo + Created with Sketch. + + + + \ No newline at end of file diff --git a/src/icons/Elementor.png b/src/icons/Elementor.png new file mode 100644 index 000000000..87fc23e01 Binary files /dev/null and b/src/icons/Elementor.png differ diff --git a/src/icons/Envoy.png b/src/icons/Envoy.png new file mode 100644 index 000000000..5d69d481c Binary files /dev/null and b/src/icons/Envoy.png differ diff --git a/src/icons/F5.png b/src/icons/F5.png new file mode 100644 index 000000000..fba894586 Binary files /dev/null and b/src/icons/F5.png differ diff --git a/src/icons/GoJS.png b/src/icons/GoJS.png new file mode 100644 index 000000000..5a91ade54 Binary files /dev/null and b/src/icons/GoJS.png differ diff --git a/src/icons/Gravity Insights.png b/src/icons/Gravity Insights.png deleted file mode 100644 index 57aeabc13..000000000 Binary files a/src/icons/Gravity Insights.png and /dev/null differ diff --git a/src/icons/Gridsome.svg b/src/icons/Gridsome.svg new file mode 100644 index 000000000..8fa8b0d89 --- /dev/null +++ b/src/icons/Gridsome.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/GrowingIO.png b/src/icons/GrowingIO.png new file mode 100644 index 000000000..c96be59fc Binary files /dev/null and b/src/icons/GrowingIO.png differ diff --git a/src/icons/Halo.svg b/src/icons/Halo.svg new file mode 100644 index 000000000..cce2a59db --- /dev/null +++ b/src/icons/Halo.svg @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/src/icons/Hippo.png b/src/icons/Hippo.png deleted file mode 100644 index 3b2b5adbd..000000000 Binary files a/src/icons/Hippo.png and /dev/null differ diff --git a/src/icons/Instabot.png b/src/icons/Instabot.png new file mode 100644 index 000000000..3b49095d3 Binary files /dev/null and b/src/icons/Instabot.png differ diff --git a/src/icons/Ionicons.png b/src/icons/Ionicons.png index ace620764..67497c434 100644 Binary files a/src/icons/Ionicons.png and b/src/icons/Ionicons.png differ diff --git a/src/icons/Klarna.svg b/src/icons/Klarna.svg index 0bb061c85..56524058c 100644 --- a/src/icons/Klarna.svg +++ b/src/icons/Klarna.svg @@ -1 +1,15 @@ -klarna \ No newline at end of file + + + + + + + + + + + diff --git a/src/icons/LOU.png b/src/icons/LOU.png new file mode 100644 index 000000000..c2836cab4 Binary files /dev/null and b/src/icons/LOU.png differ diff --git a/src/icons/LocalFocus.png b/src/icons/LocalFocus.png new file mode 100644 index 000000000..0571a349b Binary files /dev/null and b/src/icons/LocalFocus.png differ diff --git a/src/icons/Mithril.svg b/src/icons/Mithril.svg new file mode 100644 index 000000000..04cb102f1 --- /dev/null +++ b/src/icons/Mithril.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/icons/Moxa.png b/src/icons/Moxa.png deleted file mode 100644 index 03a2e6f93..000000000 Binary files a/src/icons/Moxa.png and /dev/null differ diff --git a/src/icons/NOIX.png b/src/icons/NOIX.png deleted file mode 100644 index ae6f9fee6..000000000 Binary files a/src/icons/NOIX.png and /dev/null differ diff --git a/src/icons/Netmonitor.png b/src/icons/Netmonitor.png deleted file mode 100644 index 45da0d733..000000000 Binary files a/src/icons/Netmonitor.png and /dev/null differ diff --git a/src/icons/Nuxt.js.svg b/src/icons/Nuxt.js.svg new file mode 100644 index 000000000..e0bd713f8 --- /dev/null +++ b/src/icons/Nuxt.js.svg @@ -0,0 +1,10 @@ + + Nuxt Logo + + + + + + + + diff --git a/src/icons/PhotoShelter.png b/src/icons/PhotoShelter.png new file mode 100644 index 000000000..b8d282d2e Binary files /dev/null and b/src/icons/PhotoShelter.png differ diff --git a/src/icons/PlatformOS.svg b/src/icons/PlatformOS.svg new file mode 100644 index 000000000..d0f4281e2 --- /dev/null +++ b/src/icons/PlatformOS.svg @@ -0,0 +1 @@ + diff --git a/src/icons/Rocket.svg b/src/icons/Rocket.svg new file mode 100644 index 000000000..feadcf82b --- /dev/null +++ b/src/icons/Rocket.svg @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/src/icons/Sensors Data.svg b/src/icons/Sensors Data.svg new file mode 100644 index 000000000..7250e013c --- /dev/null +++ b/src/icons/Sensors Data.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/Shiny.png b/src/icons/Shiny.png new file mode 100644 index 000000000..612d350d3 Binary files /dev/null and b/src/icons/Shiny.png differ diff --git a/src/icons/Shopalize.png b/src/icons/Shopalize.png deleted file mode 100644 index c73389954..000000000 Binary files a/src/icons/Shopalize.png and /dev/null differ diff --git a/src/icons/Shoperfa.png b/src/icons/Shoperfa.png new file mode 100644 index 000000000..b6bc62af8 Binary files /dev/null and b/src/icons/Shoperfa.png differ diff --git a/src/icons/Strapi.png b/src/icons/Strapi.png new file mode 100644 index 000000000..065887ab7 Binary files /dev/null and b/src/icons/Strapi.png differ diff --git a/src/icons/UserEngage.png b/src/icons/UserEngage.png deleted file mode 100644 index 49f2d16af..000000000 Binary files a/src/icons/UserEngage.png and /dev/null differ diff --git a/src/icons/VTEX Enterprise.png b/src/icons/VTEX Enterprise.png deleted file mode 100644 index 767831811..000000000 Binary files a/src/icons/VTEX Enterprise.png and /dev/null differ diff --git a/src/icons/VTEX.svg b/src/icons/VTEX.svg new file mode 100644 index 000000000..08a6671cf --- /dev/null +++ b/src/icons/VTEX.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/Volusion.png b/src/icons/Volusion.png deleted file mode 100644 index 20e6d109a..000000000 Binary files a/src/icons/Volusion.png and /dev/null differ diff --git a/src/icons/Volusion.svg b/src/icons/Volusion.svg new file mode 100644 index 000000000..34dd13831 --- /dev/null +++ b/src/icons/Volusion.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/Web Optimizer.png b/src/icons/Web Optimizer.png deleted file mode 100644 index 64fe47fae..000000000 Binary files a/src/icons/Web Optimizer.png and /dev/null differ diff --git a/src/icons/WebsiteCreator.png b/src/icons/WebsiteCreator.png new file mode 100644 index 000000000..3c25e14aa Binary files /dev/null and b/src/icons/WebsiteCreator.png differ diff --git a/src/icons/Webzi.svg b/src/icons/Webzi.svg new file mode 100644 index 000000000..fe3ed90d6 --- /dev/null +++ b/src/icons/Webzi.svg @@ -0,0 +1,18 @@ + + + + + logo + + + + + + + + + diff --git a/src/icons/Weglot.png b/src/icons/Weglot.png new file mode 100644 index 000000000..33da33a8a Binary files /dev/null and b/src/icons/Weglot.png differ diff --git a/src/icons/Wikispaces.png b/src/icons/Wikispaces.png deleted file mode 100644 index 91034ccf2..000000000 Binary files a/src/icons/Wikispaces.png and /dev/null differ diff --git a/src/icons/Zipkin.png b/src/icons/Zipkin.png new file mode 100644 index 000000000..e783a2ca1 Binary files /dev/null and b/src/icons/Zipkin.png differ diff --git a/src/icons/aws-elb.png b/src/icons/aws-elb.png new file mode 100644 index 000000000..8db611796 Binary files /dev/null and b/src/icons/aws-elb.png differ diff --git a/src/icons/aws.svg b/src/icons/aws.svg new file mode 100644 index 000000000..48209aef8 --- /dev/null +++ b/src/icons/aws.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/azure.svg b/src/icons/azure.svg new file mode 100644 index 000000000..2ff63c104 --- /dev/null +++ b/src/icons/azure.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/bigbangshop.svg b/src/icons/bigbangshop.svg new file mode 100644 index 000000000..cfbeefd7b --- /dev/null +++ b/src/icons/bigbangshop.svg @@ -0,0 +1 @@ +logo_bbs diff --git a/src/icons/chevereto.png b/src/icons/chevereto.png new file mode 100644 index 000000000..81e189814 Binary files /dev/null and b/src/icons/chevereto.png differ diff --git a/src/icons/clarity.svg b/src/icons/clarity.svg new file mode 100644 index 000000000..29f217c2d --- /dev/null +++ b/src/icons/clarity.svg @@ -0,0 +1,17 @@ + + + + logo + Created with Sketch. + + + + + diff --git a/src/icons/datadome.png b/src/icons/datadome.png new file mode 100644 index 000000000..9c19fb1d7 Binary files /dev/null and b/src/icons/datadome.png differ diff --git a/src/icons/freshchat.png b/src/icons/freshchat.png new file mode 100644 index 000000000..b79a05767 Binary files /dev/null and b/src/icons/freshchat.png differ diff --git a/src/icons/iEXExchanger.png b/src/icons/iEXExchanger.png new file mode 100644 index 000000000..c237a2513 Binary files /dev/null and b/src/icons/iEXExchanger.png differ diff --git a/src/icons/ionic.png b/src/icons/ionic.png new file mode 100644 index 000000000..f1b7f2ec5 Binary files /dev/null and b/src/icons/ionic.png differ diff --git a/src/icons/kestrel.svg b/src/icons/kestrel.svg new file mode 100644 index 000000000..43a66f8c8 --- /dev/null +++ b/src/icons/kestrel.svg @@ -0,0 +1 @@ +logo_NETcore \ No newline at end of file diff --git a/src/icons/mariadb.svg b/src/icons/mariadb.svg new file mode 100644 index 000000000..119938104 --- /dev/null +++ b/src/icons/mariadb.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/icons/pantheon.svg b/src/icons/pantheon.svg new file mode 100644 index 000000000..baf01b5f8 --- /dev/null +++ b/src/icons/pantheon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/icons/percona.svg b/src/icons/percona.svg new file mode 100644 index 000000000..383ae281d --- /dev/null +++ b/src/icons/percona.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/icons/platformsh.svg b/src/icons/platformsh.svg new file mode 100644 index 000000000..2491fb8c3 --- /dev/null +++ b/src/icons/platformsh.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/icons/shopline.png b/src/icons/shopline.png new file mode 100644 index 000000000..ebdb09d14 Binary files /dev/null and b/src/icons/shopline.png differ diff --git a/src/icons/tailwindcss.svg b/src/icons/tailwindcss.svg new file mode 100644 index 000000000..5b0424030 --- /dev/null +++ b/src/icons/tailwindcss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/tessitura.svg b/src/icons/tessitura.svg new file mode 100644 index 000000000..96be0cdc1 --- /dev/null +++ b/src/icons/tessitura.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/icons/user.com.svg b/src/icons/user.com.svg new file mode 100644 index 000000000..b6defbe05 --- /dev/null +++ b/src/icons/user.com.svg @@ -0,0 +1,9 @@ + + + + logo wap + Created with Sketch. + + + + \ No newline at end of file diff --git a/src/icons/websocket.png b/src/icons/websocket.png new file mode 100644 index 000000000..7d94f1073 Binary files /dev/null and b/src/icons/websocket.png differ diff --git a/src/icons/wpengine.svg b/src/icons/wpengine.svg new file mode 100644 index 000000000..d759de179 --- /dev/null +++ b/src/icons/wpengine.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/wappalyzer.js b/src/wappalyzer.js index c8300c916..7a2c3e368 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -160,6 +160,8 @@ class Wappalyzer { this.detected[url.canonical] = {}; } + const metaTags = []; + // Additional information let language = null; @@ -168,9 +170,22 @@ class Wappalyzer { html = ''; } - const matches = data.html.match(/]*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"/i); + let matches = data.html.match(new RegExp(']*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"', 'i')); language = matches && matches.length ? matches[1] : null; + + // Meta tags + const regex = /]+>/ig; + + do { + matches = regex.exec(html); + + if (!matches) { + break; + } + + metaTags.push(matches[0]); + } while (matches); } Object.keys(this.apps).forEach((appName) => { @@ -184,7 +199,7 @@ class Wappalyzer { if (html) { promises.push(this.analyzeHtml(app, html)); - promises.push(this.analyzeMeta(app, html)); + promises.push(this.analyzeMeta(app, metaTags)); } if (scripts) { @@ -208,33 +223,32 @@ class Wappalyzer { }); } - return new Promise((resolve) => { - Promise.all(promises) - .then(() => { - Object.keys(apps).forEach((appName) => { - const app = apps[appName]; + return new Promise(async (resolve) => { + await Promise.all(promises); - if (!app.detected || !app.getConfidence()) { - delete apps[app.name]; - } - }); + Object.keys(apps).forEach((appName) => { + const app = apps[appName]; + + if (!app.detected || !app.getConfidence()) { + delete apps[app.name]; + } + }); - resolveExcludes(apps, this.detected[url]); - this.resolveImplies(apps, url.canonical); + resolveExcludes(apps, this.detected[url]); + this.resolveImplies(apps, url.canonical); - this.cacheDetectedApps(apps, url.canonical); - this.trackDetectedApps(apps, url, language); + this.cacheDetectedApps(apps, url.canonical); + this.trackDetectedApps(apps, url, language); - this.log(`Processing ${Object.keys(data).join(', ')} took ${((new Date() - startTime) / 1000).toFixed(2)}s (${url.hostname})`, 'core'); + this.log(`Processing ${Object.keys(data).join(', ')} took ${((new Date() - startTime) / 1000).toFixed(2)}s (${url.hostname})`, 'core'); - if (Object.keys(apps).length) { - this.log(`Identified ${Object.keys(apps).join(', ')} (${url.hostname})`, 'core'); - } + if (Object.keys(apps).length) { + this.log(`Identified ${Object.keys(apps).join(', ')} (${url.hostname})`, 'core'); + } - this.driver.displayApps(this.detected[url.canonical], { language }, context); + this.driver.displayApps(this.detected[url.canonical], { language }, context); - return resolve(); - }); + return resolve(); }); } @@ -249,23 +263,20 @@ class Wappalyzer { * */ robotsTxtAllows(url) { - return new Promise((resolve, reject) => { + return new Promise(async (resolve, reject) => { const parsed = this.parseUrl(url); if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') { - reject(); - - return; + return reject(); } - this.driver.getRobotsTxt(parsed.host, parsed.protocol === 'https:') - .then((robotsTxt) => { - if (robotsTxt.some(disallowedPath => parsed.pathname.indexOf(disallowedPath) === 0)) { - return reject(); - } + const robotsTxt = await this.driver.getRobotsTxt(parsed.host, parsed.protocol === 'https:'); + + if (robotsTxt.some(disallowedPath => parsed.pathname.indexOf(disallowedPath) === 0)) { + return reject(); + } - return resolve(); - }, () => resolve()); + return resolve(); }); } @@ -359,11 +370,11 @@ class Wappalyzer { attrs.string = attr; try { - attrs.regex = new RegExp(attr.replace('/', '\\/'), 'i'); // Escape slashes in regular expression - } catch (e) { + attrs.regex = new RegExp(attr.replace('/', '\/'), 'i'); // Escape slashes in regular expression + } catch (error) { attrs.regex = new RegExp(); - this.log(`${e}: ${attr}`, 'error', 'core'); + this.log(`${error.message}: ${attr}`, 'error', 'core'); } } }); @@ -556,8 +567,7 @@ class Wappalyzer { /** * Analyze meta tag */ - analyzeMeta(app, html) { - const regex = /]+>/ig; + analyzeMeta(app, metaTags) { const patterns = this.parsePatterns(app.props.meta); const promises = []; @@ -565,17 +575,7 @@ class Wappalyzer { return Promise.resolve(); } - let matches; - - do { - matches = regex.exec(html); - - if (!matches) { - break; - } - - const [match] = matches; - + metaTags.forEach((match) => { Object.keys(patterns).forEach((meta) => { const r = new RegExp(`(?:name|property)=["']${meta}["']`, 'i'); @@ -589,7 +589,7 @@ class Wappalyzer { })); } }); - } while (matches); + }); return Promise.all(promises); } diff --git a/src/wappalyzer.spec.js b/src/wappalyzer.spec.js index ea68c22e0..f51d7fb10 100644 --- a/src/wappalyzer.spec.js +++ b/src/wappalyzer.spec.js @@ -139,5 +139,140 @@ describe('Wappalyzer', () => { it('should return the version number', () => { assert.equal(apps.appHtml.version, '1'); }); + + it('should analyze html', async () => { + const html = ` + + + + Page title | Html detection + + + +

Technologies Test Page | Html detection

+ + + + + + `; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Google Tag Manager": { + "html": [ + "googletagmanager\\.com/ns\\.html[^>]+>", + "" + ] + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + await wappalyzer.analyze({ canonical: 'example.com' }, { html }); + assert.equal(applications['Google Tag Manager'].name, 'Google Tag Manager'); + }); + + it('should analyze scripts', async () => { + const scripts = [ + 'http://www.google-analytics.com/analytics.js', + 'http://example.com/assets/js/jquery.min.js' + ]; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Google Analytics": { + "cats": [ + 10 + ], + "script": "google-analytics\\.com\\/(?:ga|urchin|(analytics))\\.js\\;version:\\1?UA:" + }, + "jQuery": { + "script": [ + "jquery(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "/([\\d.]+)/jquery(?:\\.min)?\\.js\\;version:\\1", + "jquery.*\\.js(?:\\?ver(?:sion)?=([\\d.]+))?\\;version:\\1" + ] + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + await wappalyzer.analyze({ canonical: 'example.com' }, { scripts }); + assert.equal(applications['Google Analytics'].name, 'Google Analytics'); + assert.equal(applications['jQuery'].name, 'jQuery'); + }); + + it('should analyze headers', async () => { + const headers = { + 'date': [ 'Thu, 01 Feb 2018 11:34:18 GMT' ], + 'connection': [ 'keep-alive' ], + 'x-powered-by': [ 'Express'], + 'etag': [ 'W/125-1jQLmiya7mfec43xR3Eb3pjdu64s' ], + 'content-length': [ '293' ], + 'content-type': [ 'text/html; charset=utf-8' ] + }; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Express": { + "headers": { + "X-Powered-By": "^Express$" + } + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + await wappalyzer.analyze({ canonical: 'example.com' }, { headers }); + assert.equal(applications['Express'].name, 'Express'); + }); + + it('should analyze js globals', async () => { + const js = { + 'Moment.js': { 'moment': { '0': true } }, + 'Google Font API': { 'WebFonts': { '0': true } } + }; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Moment.js": { + "js": { + "moment": "", + "moment.version": "(.*)\\;version:\\1" + } + }, + "Google Font API": { + "js": { + "WebFonts": "" + } + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + wappalyzer.parseJsPatterns(); + await wappalyzer.analyze({ canonical: 'example.com' }, { js }); + + assert.equal(applications['Google Font API'].name, 'Google Font API'); + assert.equal(applications['Moment.js'].name, 'Moment.js'); + }); }); });