diff --git a/.travis.yml b/.travis.yml index c6d5ebf3a..7009b2ce8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,8 +7,8 @@ after_success: - sha256sum build/* > build/SHA256SUMS - cat build/SHA256SUMS -script: - - ./run build +script: |- + version=$(grep '"version":' src/drivers/webextension/manifest.json | sed 's/^.*"version": "\(.*\)".*$/\1/'); ./run build $version deploy: provider: releases diff --git a/Dockerfile b/Dockerfile index 79d7c0f38..f2a28e638 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,10 +13,9 @@ RUN apk update && apk add --no-cache \ 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 +# Fixes PhantomJS +# https://github.com/dustinblackman/phantomized +RUN curl -Ls "https://github.com/dustinblackman/phantomized/releases/download/2.1.1a/dockerized-phantomjs.tar.gz" | tar xz -C / RUN apk del \ curl diff --git a/bin/build b/bin/build index 2c2941ba6..9f38e3454 100755 --- a/bin/build +++ b/bin/build @@ -2,17 +2,31 @@ cd "$(dirname $0)/.." +version="$2" + +if [[ -z "$version" ]]; then + current=$(grep '"version":' src/drivers/webextension/manifest.json | sed 's/^.*"version": "\(.*\)".*$/\1/') + + echo "No version specified. Current version is $current." + + exit 1; +fi + set -eu ./bin/validate +echo "Deleting junk files..." + +find . -name ".DS_Store" -exec rm {} \; + echo "Prettifying apps.json..." jsonlint-cli -ist $'\t' src/apps.json echo "Converting SVG icons to PNG..." -#svg2png-many -i src/icons/ -o src/icons/converted/ --width=32 --height=32 +svg2png-many -i src/icons/ -o src/icons/converted/ --width=32 --height=32 echo "Compressing PNG icons..." @@ -23,6 +37,9 @@ optipng -quiet "src/icons/converted/*.png" set -e +# NPM +sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"$version\"/" src/drivers/npm/package.json + # WebExtension echo "Building WebExtension..." @@ -30,6 +47,8 @@ webextension_dir=src/drivers/webextension pushd $webextension_dir > /dev/null +sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"$version\"/" manifest.json + zip -qr ../../../build/wappalyzer_webextension.zip . popd > /dev/null @@ -45,6 +64,8 @@ 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 +sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"$version\"/" $webextension_dir/manifest.json + manifoldjs -l debug -p edgeextension -f edgeextension -m $webextension_dir/manifest.json # Replace symlinks with actual files @@ -74,4 +95,4 @@ rm -rf Wappalyzer popd > /dev/null -echo "Done." +echo "Done (v$version)." diff --git a/package.json b/package.json index dd2dbe93d..2148f0f67 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,7 @@ "dependencies": { "file-type": "3.8.*", "is-svg": "2.0.*", - "read-chunk": "2.0.*", - "svg2png-many": "*" + "read-chunk": "2.0.*" } } diff --git a/src/apps.json b/src/apps.json index 317d016e3..521e5b39f 100755 --- a/src/apps.json +++ b/src/apps.json @@ -2580,7 +2580,7 @@ ], "icon": "FancyBox.png", "implies": "jQuery", - "script": "jquery\\.fancybox\\.pack\\.js(?:\\?v=([\\d.]+))?$\\;version:\\1", + "script": "jquery\\.fancybox(\\.pack|\\.min)?\\.js(\\?v=([\\d.]+))?$\\;version:\\3", "website": "http://fancyapps.com/fancybox" }, "Fastly": { @@ -3109,7 +3109,7 @@ "19" ], "env": "^prettyPrint$", - "icon": "Google Code Prettify.png", + "icon": "Google.svg", "website": "http://code.google.com/p/google-code-prettify" }, "Google Font API": { @@ -3202,7 +3202,7 @@ "headers": { "Server": "gws" }, - "icon": "Google Web Server.png", + "icon": "Google.svg", "website": "http://en.wikipedia.org/wiki/Google_Web_Server" }, "Google Web Toolkit": { @@ -3661,6 +3661,16 @@ "url": "/wps/", "website": "http://ibm.com/software/websphere/portal" }, + "Ideasoft": { + "cats": [ + "6" + ], + "icon": "Ideasoft.png", + "script": [ + "\\.myideasoft\\.com/" + ], + "website": "https://www.ideasoft.com" + }, "IIS": { "cats": [ "22" @@ -3934,6 +3944,16 @@ "icon": "JC-HTTPD.png", "implies": "Canon", "website": "http://canon.com" + }, + "JET Enterprise": { + "cats": [ + "6" + ], + "headers": { + "powered": "jet-enterprise" + }, + "icon": "JET Enterprise.svg", + "website": "http://www.jetecommerce.com.br/" }, "JS Charts": { "cats": [ @@ -4289,6 +4309,18 @@ }, "website": "http://koala-framework.org" }, + "KobiMaster": { + "cats": [ + "6" + ], + "icon": "Kobimaster.png", + "implies": "Microsoft ASP.NET", + "env": [ + "^kmPageInfo$", + "^kmGetSession$" + ], + "website": "http://www.kobimaster.com.tr/" + }, "Koego": { "cats": [ "10" @@ -4894,6 +4926,15 @@ "script": "munchkin\\.marketo\\.net/munchkin\\.js", "website": "http://www.marketo.com" }, + "Material Design Lite": { + "cats": [ + "18" + ], + "html": "]* href=\"[^\"]*material(?:\\.[\\w]+-[\\w]+)?(?:\\.min)?\\.css", + "icon": "Material Design Lite.png", + "script": "material(?:\\.min)?\\.js", + "website": "https://getmdl.io" + }, "Materialize CSS": { "cats": [ "18" @@ -5247,7 +5288,7 @@ "cats": [ "12" ], - "icon": "Moment.js.png", + "icon": "Moment.js.svg", "implies": "Moment.js", "script": "moment-timezone(?:\\-data)?(?:\\.min)?\\.js", "website": "http://momentjs.com/timezone/" @@ -5257,7 +5298,7 @@ "12" ], "env": "^moment$", - "icon": "Moment.js.png", + "icon": "Moment.js.svg", "script": "moment(?:\\.min)?\\.js", "website": "http://momentjs.com" }, @@ -5501,6 +5542,16 @@ "env": "^sitestat$", "icon": "Nedstat.png", "website": "http://www.nedstat.com" + }, + "NEO - Omnichannel Commerce Platform": { + "cats": [ + "6" + ], + "headers": { + "powered": "jet-neo" + }, + "icon": "Plataforma NEO.svg", + "website": "http://www.jetecommerce.com.br/" }, "Neonclear": { "cats": [ @@ -5619,9 +5670,8 @@ "headers": { "x-powered-by": "^Next.js ?([0-9.]+)?\\;version:\\1" }, - "html": "<[^>]+__next", - "env": "^__NEXT_DATA__$", - "icon": "zeit.svg", + "env": "^__NEXT_DATA__$", + "icon": "zeit.svg", "implies": [ "React", "webpack", @@ -5844,7 +5894,7 @@ "headers": { "Server": "GSE" }, - "icon": "OpenGSE.png", + "icon": "Google.svg", "implies": "Java", "website": "http://code.google.com/p/opengse" }, @@ -6795,6 +6845,19 @@ "icon": "Raspbian.svg", "website": "https://www.raspbian.org/" }, + "Rayo": { + "cats": [ + "6" + ], + "env": "^Rayo", + "icon": "Rayo.png", + "implies": [ "AngularJS", "Microsoft ASP.NET", "Twitter Bootstrap", "jQuery", "Underscore.js", "Moment.js", + "Font Awesome", "Google Maps", "Modernizr", "Semantic-ui" ], + "meta": { + "generator": "^Rayo" + }, + "website": "http://www.rayo.ir" + }, "Rdf": { "cats": [ "27" @@ -7521,6 +7584,16 @@ }, "website": "http://www.silverstripe.org" }, + "Simplébo": { + "cats": [ + "1" + ], + "headers": { + "X-ServedBy": "simplebo" + }, + "icon": "Simplebo.png", + "website": "https://www.simplebo.fr" + }, "SimpleHTTP": { "cats": [ "22" @@ -8202,6 +8275,16 @@ "icon": "Tengine.png", "website": "http://tengine.taobao.org" }, + "Textalk": { + "cats": [ + "6" + ], + "meta": { + "generator": "Textalk Webshop" + }, + "icon": "textalk.png", + "website": "https://www.textalk.se" + }, "Textpattern CMS": { "cats": [ "1" @@ -8240,6 +8323,26 @@ "implies": "PHP", "website": "http://www.thinkphp.cn" }, + "Ticimax": { + "cats": [ + "6" + ], + "icon": "Ticimax.png", + "script": [ + "cdn\\.ticimax\\.com/" + ], + "website": "https://www.ticimax.com" + }, + "Tictail": { + "cats": [ + "6" + ], + "script": [ + "https:\\/\\/tictail\\.com" + ], + "icon": "tictail.png", + "website": "https://tictail.com" + }, "TiddlyWiki": { "cats": [ "1", @@ -8366,6 +8469,16 @@ "script": "lucide\\.init(?:\\.min)?\\.js", "website": "http://www.translucide.net" }, + "T-Soft": { + "cats": [ + "6" + ], + "icon": "Tsoft.png", + "meta": { + "copyright": "T-Soft E-Ticaret Sistemleri" + }, + "website": "http://www.tsoft.com.tr/" + }, "Tumblr": { "cats": [ "11" @@ -9040,6 +9153,16 @@ "url": "/websale7/", "website": "http://websale.de" }, + "WebSite X5": { + "cats": [ + "20" + ], + "meta": { + "generator": "Incomedia WebSite X5 (\\w+ [\\d.]+)\\;version:\\1" + }, + "icon": "WebSite X5.png", + "website": "http://websitex5.com" + }, "WebsiteBaker": { "cats": [ "1" @@ -9079,6 +9202,16 @@ "script": "cdn\\d+\\.editmysite\\.com", "website": "http://www.weebly.com" }, + "Wikinggruppen": { + "cats": [ + "6" + ], + "html": [ + " + + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/textalk.png b/src/icons/textalk.png new file mode 100644 index 000000000..f2cd02094 Binary files /dev/null and b/src/icons/textalk.png differ diff --git a/src/icons/tictail.png b/src/icons/tictail.png new file mode 100644 index 000000000..9ca29b6d8 Binary files /dev/null and b/src/icons/tictail.png differ diff --git a/src/icons/wikinggruppen.png b/src/icons/wikinggruppen.png new file mode 100644 index 000000000..b9f7c5e39 Binary files /dev/null and b/src/icons/wikinggruppen.png differ diff --git a/src/icons/wpCache.png b/src/icons/wpCache.png index e8a21e343..7f24b9d35 100644 Binary files a/src/icons/wpCache.png and b/src/icons/wpCache.png differ diff --git a/src/wappalyzer.js b/src/wappalyzer.js index 093f1b0bb..6fed51ec9 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -116,11 +116,7 @@ class Wappalyzer { this.driver.getRobotsTxt(parsed.host, parsed.protocol === 'https:') .then(robotsTxt => { - robotsTxt.forEach(disallow => { - if ( parsed.pathname.indexOf(disallow) === 0 ) { - reject(); - } - }); + robotsTxt.forEach(disallow => parsed.pathname.indexOf(disallow) === 0 && reject()); resolve(); }); @@ -270,7 +266,7 @@ class Wappalyzer { Object.keys(apps).forEach(appName => { var app = apps[appName]; - if ( app && app.implies ) { + if ( app && app.props.implies ) { this.asArray(app.props.implies).forEach(implied => { implied = this.parsePatterns(implied)[0]; @@ -281,7 +277,7 @@ class Wappalyzer { } if ( !( implied.string in apps ) ) { - apps[implied.string] = this.detected[url] && this.detected[url][implied.string] ? this.detected[url][implied.string] : new Application(implied.string, true); + apps[implied.string] = this.detected[url] && this.detected[url][implied.string] ? this.detected[url][implied.string] : new Application(implied.string, this.apps[implied.string], true); checkImplies = true; } @@ -300,10 +296,6 @@ class Wappalyzer { * Cache detected applications */ cacheDetectedApps(apps, url) { - if ( !( this.driver.ping instanceof Function ) ) { - return; - } - Object.keys(apps).forEach(appName => { var app = apps[appName]; @@ -315,7 +307,9 @@ class Wappalyzer { }); }) - this.ping(); + if ( this.driver.ping instanceof Function ) { + this.ping(); + } } /** @@ -352,7 +346,7 @@ class Wappalyzer { this.hostnameCache[hostname].applications[appName].version = app.version; } }) - .catch(() => console.log('Disallowed in robots.txt: ' + url)) + .catch(() => this.log('Disallowed in robots.txt: ' + url), 'core') } } });