diff --git a/.gitignore b/.gitignore index 19de018bb..b604acc93 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,12 @@ -.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 3f1090e37..c6d5ebf3a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,25 @@ -language: node_js -node_js: - - "node" -sudo: false -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 -after_script: ls -l --block-size=kB build -cache: - directories: - - node_modules +sudo: required + +services: + - docker + +after_success: + - sha256sum build/* > build/SHA256SUMS + - cat build/SHA256SUMS + +script: + - ./run build + +deploy: + provider: releases + api_key: + secure: mco1ycbfGXZEiBywOmM5A50Y1QPFawj4i0gdB9JDkXDvY7N2kPZyCdAeOQOMEJuetGT3HvJuTG0Ll47sithZfPqq6wx/4EeP8YQYYFIyoOlsIGi5MDR1kS5ZOqKDWGe5+x+/rUZbmuMHvgHWNSjPG8mBrp5xWmON6ETkLWfVB0c= + file_glob: true + file: build/* + skip_cleanup: true + on: + repo: AliasIO/Wappalyzer + tags: true + env: - CXX=g++-4.8 -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - 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/README.md b/README.md index 4911a745c..ae5627f3d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Wappalyzer [![Travis](https://img.shields.io/travis/AliasIO/Wappalyzer.svg?style=flat-square)](https://travis-ci.org/AliasIO/Wappalyzer/) +# Wappalyzer [![Travis](https://img.shields.io/travis/AliasIO/Wappalyzer.svg)](https://travis-ci.org/AliasIO/Wappalyzer/) [![Scrutinizer](https://scrutinizer-ci.com/g/AliasIO/Wappalyzer/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/AliasIO/Wappalyzer/?branch=master) [Wappalyzer](https://wappalyzer.com/) is a [cross-platform](https://github.com/AliasIO/Wappalyzer/wiki/Drivers) utility that uncovers the @@ -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`](https://github.com/AliasIO/Wappalyzer/blob/master/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/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 diff --git a/bin/build b/bin/build new file mode 100755 index 000000000..7fa8816d0 --- /dev/null +++ b/bin/build @@ -0,0 +1,77 @@ +#!/bin/bash + +cd "$(dirname $0)/.." + +set -eu + +./bin/validate + +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 + +echo "Compressing PNG icons..." + +set +e + +optipng -quiet "src/icons/*.png" +optipng -quiet "src/icons/converted/*.png" + +set -e + +# WebExtension +echo "Building WebExtension..." + +webextension_dir=src/drivers/webextension + +pushd $webextension_dir > /dev/null + +zip -qr ../../../build/wappalyzer_webextension.zip . + +popd > /dev/null + +# Edge +echo "Building Edge application..." + +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 + +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 +sed -i 's/Version="0.\([^"]\+\)/Version="\1.0/' $manifest_dir/appxmanifest.xml + +cp $webextension_dir/images/icon_44.png $manifest_dir/Assets/Square44x44Logo.png +cp $webextension_dir/images/icon_150.png $manifest_dir/Assets/Square150x150Logo.png +cp $webextension_dir/images/icon_50.png $manifest_dir/Assets/StoreLogo.png + +manifoldjs -l debug -p edgeextension package $manifest_dir + +mv Wappalyzer/edgeextension/package/edgeExtension.appx wappalyzer_edge.appx + +rm -rf Wappalyzer + +popd > /dev/null + +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..368ce0e66 --- /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 89% rename from bin/wappalyzer-validate-regex rename to bin/validate-regex index 36012c57a..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) { @@ -80,7 +79,7 @@ for ( app in json.apps ) { } }); - if ( /[a-z]+:\/\//i.test(json.apps[app].website) ) { - throw new Error('Do not include the protocol in the website URL\n' + app + ': ' + json.apps[app].website); + if ( !/^https?:\/\//i.test(json.apps[app].website) ) { + throw new Error('Invalid website URL\n' + app + ': ' + json.apps[app].website); } } 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-build b/bin/wappalyzer-build deleted file mode 100755 index 2b291f8dc..000000000 --- a/bin/wappalyzer-build +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash - -if [ -z $WAPPALYZER_ROOT ] -then - echo "\$WAPPALYZER_ROOT not set" - - exit 1 -fi - -if [ -z $WAPPALYZER_NODE_PATH ] -then - echo "\$WAPPALYZER_NODE_PATH not set" - - exit 1 -fi - -set -eu - -wappalyzer 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 - -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 - node $WAPPALYZER_NODE_PATH/node_modules/svg2png/bin/svg2png-cli "$svg" --width=32 --height=32 --output "$dest" || true - fi -done - -IFS="$OIFS" - -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 - -# Mozilla Firefox -echo "Building Firefox driver..." - -pushd $WAPPALYZER_ROOT/src/drivers/firefox > /dev/null - -node $WAPPALYZER_NODE_PATH/node_modules/jpm/bin/jpm xpi && mv *.xpi $WAPPALYZER_ROOT/build/wappalyzer_firefox.xpi - -popd > /dev/null - -# Google Chrome -echo "Building Chrome driver..." - -pushd $WAPPALYZER_ROOT/src/drivers/chrome > /dev/null - -zip -qr $WAPPALYZER_ROOT/build/wappalyzer_chrome.zip . - -popd > /dev/null - -echo "Done. Builds have been created in $WAPPALYZER_ROOT/build." diff --git a/bin/wappalyzer-links b/bin/wappalyzer-links deleted file mode 100755 index 25f589406..000000000 --- a/bin/wappalyzer-links +++ /dev/null @@ -1,51 +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/firefox -ln -f $path/apps.json $path/drivers/firefox/data -ln -f $path/icons/*.png $path/drivers/firefox/data/images/icons -ln -f $path/icons/*.svg $path/drivers/firefox/data/images/icons -ln -f $path/utils/iframe.js $path/drivers/firefox/data/js - -ln -f $path/wappalyzer.js $path/drivers/chrome/js -ln -f $path/apps.json $path/drivers/chrome -ln -f $path/icons/*.png $path/drivers/chrome/images/icons -ln -f $path/icons/*.svg $path/drivers/chrome/images/icons -ln -f $path/utils/*.js $path/drivers/chrome/js - -if [ "$(compgen -G "$path/icons/converted/*.png" | head -n1)" ]; then - ln -f $path/icons/converted/*.png $path/drivers/chrome/images/icons/converted -fi - -echo "OK" - -exit 0 diff --git a/bin/wappalyzer-validate b/bin/wappalyzer-validate deleted file mode 100755 index d9d09a617..000000000 --- a/bin/wappalyzer-validate +++ /dev/null @@ -1,38 +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 3ec796ac6..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; - 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 ec435c0bd..000000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,62 +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/archive\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list -RUN apt-get update && apt-get install -y sudo curl -RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - -RUN apt-get install -y nodejs bzip2 zip libfreetype6 libfontconfig rsync -RUN 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" - - -# 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/schema.json b/schema.json index 8be26af2a..ac366218f 100644 --- a/schema.json +++ b/schema.json @@ -9,7 +9,16 @@ "additionalProperties": false, "patternProperties": { "^[0-9]+$": { - "type": "string" + "type": "object", + "required": true, + "properties": { + "priority": { + "type": "string" + }, + "name": { + "type": "string" + } + } } } }, @@ -22,7 +31,7 @@ "cats": { "type": "array", "items": { - "type": "integer" + "type": "string" }, "required": true }, @@ -76,8 +85,7 @@ "required": true }, "icon": { - "type": "string", - "required": true + "type": "string" } } } diff --git a/src/apps.json b/src/apps.json index 60e2f3f55..ce997356f 100755 --- a/src/apps.json +++ b/src/apps.json @@ -2,16 +2,16 @@ "apps": { "1&1": { "cats": [ - 6 + "6" ], "icon": "1and1.svg", "implies": "PHP", "url": "/shop/catalog/browse\\?sessid=", - "website": "1and1.com" + "website": "http://1and1.com" }, "1C-Bitrix": { "cats": [ - 1 + "1" ], "headers": { "Set-Cookie": "BITRIX_", @@ -21,31 +21,31 @@ "icon": "1C-Bitrix.png", "implies": "PHP", "script": "1c-bitrix", - "website": "www.1c-bitrix.ru" + "website": "http://www.1c-bitrix.ru" }, "2z Project": { "cats": [ - 1 + "1" ], "icon": "2z Project.png", "meta": { "generator": "2z project ([\\d.]+)\\;version:\\1" }, - "website": "2zproject-cms.ru" + "website": "http://2zproject-cms.ru" }, "3DM": { "cats": [ - 19 + "19" ], "html": "3ware 3DM([\\d\\.]+)?\\;version:\\1", "icon": "3DM.png", "implies": "3ware", - "website": "www.3ware.com" + "website": "http://www.3ware.com" }, "3dCart": { "cats": [ - 1, - 6 + "1", + "6" ], "headers": { "Set-Cookie": "3dvisit", @@ -53,21 +53,21 @@ }, "icon": "3dCart.png", "script": "(?:twlh(?:track)?\\.asp|3d_upsell\\.js)", - "website": "www.3dcart.com" + "website": "http://www.3dcart.com" }, "3ware": { "cats": [ - 22 + "22" ], "headers": { "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1" }, "icon": "3ware.png", - "website": "www.3ware.com" + "website": "http://www.3ware.com" }, "AD EBiS": { "cats": [ - 10 + "10" ], "html": [ "<!-- EBiS contents tag", @@ -76,11 +76,11 @@ "<!-- EBiS common tag" ], "icon": "ebis.png", - "website": "www.ebis.ne.jp" + "website": "http://www.ebis.ne.jp" }, "AMPcms": { "cats": [ - 1 + "1" ], "env": "^amp_js_init$", "headers": { @@ -89,166 +89,166 @@ }, "icon": "AMPcms.png", "implies": "PHP", - "website": "www.ampcms.org" + "website": "http://www.ampcms.org" }, "AOLserver": { "cats": [ - 22 + "22" ], "headers": { "Server": "AOLserver/?([\\d.]+)?\\;version:\\1" }, "icon": "AOLserver.png", - "website": "aolserver.com" + "website": "http://aolserver.com" }, "AT Internet Analyzer": { "cats": [ - 10 + "10" ], "env": [ "^xtsite$", "^ATInternet$" ], - "icon": "AT Internet Analyzer.png", - "website": "atinternet.com/en" + "icon": "AT Internet.png", + "website": "http://atinternet.com/en" }, "AT Internet XiTi": { "cats": [ - 10 + "10" ], "env": "^Xt_", - "icon": "AT Internet XiTi.png", + "icon": "AT Internet.png", "script": "xiti\\.com/hit\\.xiti", - "website": "atinternet.com/en" + "website": "http://atinternet.com/en" }, "ATEN": { "cats": [ - 22 + "22" ], "headers": { "Server": "ATEN HTTP Server(?:\\(?V?([\\d\\.]+)\\)?)?\\;version:\\1" }, "icon": "ATEN.png", - "website": "www.aten.com" + "website": "http://www.aten.com" }, "AWStats": { "cats": [ - 10 + "10" ], "icon": "AWStats.png", "implies": "Perl", "meta": { "generator": "AWStats ([\\d.]+(?: \\(build [\\d.]+\\))?)\\;version:\\1" }, - "website": "awstats.sourceforge.net" + "website": "http://awstats.sourceforge.net" }, "Accessible Portal": { "cats": [ - 1 + "1" ], "icon": "Accessible Portal.png", "implies": "PHP", "meta": { "generator": "Accessible Portal" }, - "website": "www.accessibleportal.com" + "website": "http://www.accessibleportal.com" }, "Act-On": { "cats": [ - 32 + "32" ], "env": "^ActOn$", "icon": "ActOn.png", - "website": "act-on.com" + "website": "http://act-on.com" }, "AdInfinity": { "cats": [ - 36 + "36" ], "icon": "AdInfinity.png", "script": "adinfinity\\.com\\.au", - "website": "adinfinity.com.au" + "website": "http://adinfinity.com.au" }, "AdRiver": { "cats": [ - 36 + "36" ], "env": "^adriver$", "html": "(?:<embed[^>]+(?:src=\"https?://mh\\d?\\.adriver\\.ru/|flashvars=\"[^\"]*(?:http:%3A//(?:ad|mh\\d?)\\.adriver\\.ru/|adriver_banner))|<(?:(?:iframe|img)[^>]+src|a[^>]+href)=\"https?://ad\\.adriver\\.ru/)", "icon": "AdRiver.png", "script": "(?:adriver\\.core\\.\\d\\.js|https?://(?:content|ad|masterh\\d)\\.adriver\\.ru/)", - "website": "adriver.ru" + "website": "http://adriver.ru" }, "AdRoll": { "cats": [ - 36 + "36" ], "env": "^adroll_", "icon": "AdRoll.svg", "script": "(?:a|s)\\.adroll\\.com", - "website": "adroll.com" + "website": "http://adroll.com" }, "Adcash": { "cats": [ - 36 + "36" ], "env": "^(?:ac_bgclick_URL|ct_(?:siteunder|tag|n(?:SuUrl(?:Opp)?)|Su(?:Loaded|Url)))$", "icon": "Adcash.svg", "script": "^[^\\/]*//(?:[^\\/]+\\.)?adcash\\.com/(?:script|ad)/", "url": "^https?://(?:[^\\/]+\\.)?adcash\\.com/script/pop_", - "website": "adcash.com" + "website": "http://adcash.com" }, "AddShoppers": { "cats": [ - 5 + "5" ], "icon": "AddShoppers.png", "script": "cdn\\.shop\\.pe/widget/", - "website": "www.addshoppers.com" + "website": "http://www.addshoppers.com" }, "AddThis": { "cats": [ - 5 + "5" ], "env": "^addthis", "icon": "AddThis.svg", "script": "addthis\\.com/js/", - "website": "www.addthis.com" + "website": "http://www.addthis.com" }, "AddToAny": { "cats": [ - 5 + "5" ], "env": "^a2apage_init$", "icon": "AddToAny.png", "script": "addtoany\\.com/menu/page\\.js", - "website": "www.addtoany.com" + "website": "http://www.addtoany.com" }, "Adminer": { "cats": [ - 3 + "3" ], "html": [ "Adminer</a> <span class=\"version\">([\\d.]+)</span>\\;version:\\1", "onclick=\"bodyClick\\(event\\);\" onload=\"verifyVersion\\('([\\d.]+)'\\);\">\\;version:\\1" ], - "implies": "PHP", "icon": "adminer.png", - "website": "www.adminer.org" + "implies": "PHP", + "website": "http://www.adminer.org" }, "Adnegah": { "cats": [ - 36 + "36" ], "env": "^ados(?:Results)?$", "html": "<iframe [^>]*src=\"[^\"]+adnegah\\.net", "icon": "adnegah.png", "script": "[^a-z]adnegah.*\\.js", - "website": "Adnegah.net" + "website": "http://Adnegah.net" }, "Adobe ColdFusion": { "cats": [ - 18 + "18" ], "env": "^_cfEmails$", "headers": { @@ -259,11 +259,11 @@ "implies": "CFML", "script": "/cfajax/", "url": "\\.cfm(?:$|\\?)", - "website": "adobe.com/products/coldfusion-family.html" + "website": "http://adobe.com/products/coldfusion-family.html" }, "Adobe Experience Manager": { "cats": [ - 1 + "1" ], "html": [ "<div class=\"[^\"]*parbase", @@ -272,31 +272,31 @@ "icon": "Adobe Experience Manager.svg", "implies": "Java", "script": "/etc/designs/", - "website": "www.adobe.com/au/marketing-cloud/enterprise-content-management.html" + "website": "http://www.adobe.com/au/marketing-cloud/enterprise-content-management.html" }, "Adobe GoLive": { "cats": [ - 20 + "20" ], "icon": "Adobe GoLive.png", "meta": { "generator": "Adobe GoLive(?:\\s([\\d.]+))?\\;version:\\1" }, - "website": "www.adobe.com/products/golive" + "website": "http://www.adobe.com/products/golive" }, "Adobe Muse": { "cats": [ - 20 + "20" ], "icon": "Adobe Muse.svg", "meta": { "generator": "^Muse(?:$| ?/?(\\d[\\d.]+))\\;version:\\1" }, - "website": "muse.adobe.com" + "website": "http://muse.adobe.com" }, "Adobe RoboHelp": { "cats": [ - 4 + "4" ], "env": "^gbWh(?:Ver|Lang|Msg|Util|Proxy)$", "icon": "Adobe RoboHelp.svg", @@ -304,39 +304,39 @@ "generator": "^Adobe RoboHelp(?: ([\\d]+))?\\;version:\\1" }, "script": "(?:wh(?:utils|ver|proxy|lang|topic|msg)|ehlpdhtm)\\.js", - "website": "adobe.com/products/robohelp.html" + "website": "http://adobe.com/products/robohelp.html" }, "Advanced Web Stats": { "cats": [ - 10 + "10" ], "html": "aws\\.src = [^<]+caphyon-analytics", "icon": "Advanced Web Stats.png", "implies": "Java", - "website": "www.advancedwebstats.com" + "website": "http://www.advancedwebstats.com" }, "Advert Stream": { "cats": [ - 36 + "36" ], "env": "^advst_is_above_the_fold$", "icon": "Advert Stream.png", "script": "(?:ad\\.advertstream\\.com|adxcore\\.com)", - "website": "www.advertstream.com" + "website": "http://www.advertstream.com" }, "Adzerk": { "cats": [ - 36 + "36" ], "env": "^ados(?:Results)?$", "html": "<iframe [^>]*src=\"[^\"]+adzerk\\.net", "icon": "Adzerk.png", "script": "adzerk\\.net/ados\\.js", - "website": "adzerk.com" + "website": "http://adzerk.com" }, "Aegea": { "cats": [ - 11 + "11" ], "headers": { "X-Powered-By": "^E2 Aegea v(\\d+)$\\;version:\\1" @@ -346,79 +346,79 @@ "PHP", "jQuery" ], - "website": "blogengine.ru" + "website": "http://blogengine.ru" }, "AfterBuy": { "cats": [ - 6 + "6" ], "html": [ "<dd>This OnlineStore is brought to you by ViA-Online GmbH Afterbuy. Information and contribution at https://www.afterbuy.de</dd>" ], "icon": "after-buy.png", "script": "shop-static\\.afterbuy\\.de", - "website": "www.afterbuy.de" + "website": "http://www.afterbuy.de" }, "Aircall": { "cats": [ - 52 + "52" ], "icon": "aircall.png", "script": "^https?://cdn\\.aircall\\.io/", - "website": "aircall.io" + "website": "http://aircall.io" }, "Airee": { "cats": [ - 31 + "31" ], "headers": { "Server": "Airee" }, "icon": "Airee.png", - "website": "xn--80aqc2a.xn--p1ai" + "website": "http://xn--80aqc2a.xn--p1ai" }, "Akamai": { "cats": [ - 31 + "31" ], "headers": { "X-Akamai-Transformed": "" }, "icon": "Akamai.png", - "website": "akamai.com" + "website": "http://akamai.com" }, "Akka HTTP": { "cats": [ - 18, - 22 + "18", + "22" ], "headers": { "Server": "akka-http(?:/([\\d.]+))?\\;version:\\1" }, "icon": "akka-http.png", - "website": "akka.io" + "website": "http://akka.io" }, "Algolia Realtime Search": { "cats": [ - 29 + "29" ], "env": "^AlgoliaSearch$", "icon": "Algolia Realtime Search.svg", - "website": "www.algolia.com" + "website": "http://www.algolia.com" }, "Allegro RomPager": { "cats": [ - 22 + "22" ], "headers": { "Server": "Allegro-Software-RomPager(?:/([\\d.]+))?\\;version:\\1" }, "icon": "Allegro RomPager.png", - "website": "allegrosoft.com/embedded-web-server-s2" + "website": "http://allegrosoft.com/embedded-web-server-s2" }, "AlloyUI": { "cats": [ - 12 + "12" ], "env": "^AUI$", "icon": "AlloyUI.png", @@ -427,51 +427,51 @@ "YUI" ], "script": "^https?://cdn\\.alloyui\\.com/", - "website": "www.alloyui.com" + "website": "http://www.alloyui.com" }, "Amaya": { "cats": [ - 20 + "20" ], "icon": "Amaya.png", "meta": { "generator": "Amaya(?: V?([\\d.]+[a-z]))?\\;version:\\1" }, - "website": "www.w3.org/Amaya" + "website": "http://www.w3.org/Amaya" }, "Amazon Cloudfront": { "cats": [ - 31 + "31" ], "headers": { "X-Amz-Cf-Id": "" }, "icon": "Amazon-Cloudfront.svg", - "website": "aws.amazon.com/cloudfront/" - }, + "website": "http://aws.amazon.com/cloudfront/" + }, "Amazon EC2": { "cats": [ - 22 + "22" ], "headers": { "Server": "\\(Amazon\\)" }, "icon": "aws-ec2.svg", - "website": "aws.amazon.com/ec2/" - }, - "Amazon S3": { - "cats": [ - 19 - ], - "headers": { - "Server": "AmazonS3" - }, - "icon": "aws-s3.svg", - "website": "aws.amazon.com/s3/" - }, + "website": "http://aws.amazon.com/ec2/" + }, + "Amazon S3": { + "cats": [ + "19" + ], + "headers": { + "Server": "AmazonS3" + }, + "icon": "aws-s3.svg", + "website": "http://aws.amazon.com/s3/" + }, "Ametys": { "cats": [ - 1 + "1" ], "icon": "Ametys.png", "implies": "Java", @@ -479,22 +479,22 @@ "generator": "(?:Ametys|Anyware Technologies)" }, "script": "ametys\\.js", - "website": "ametys.org" + "website": "http://ametys.org" }, "Amiro.CMS": { "cats": [ - 1 + "1" ], "icon": "Amiro.CMS.png", "implies": "PHP", "meta": { "generator": "Amiro" }, - "website": "amirocms.com" + "website": "http://amirocms.com" }, "Angular Material": { "cats": [ - 18 + "18" ], "env": "^ngMaterial$", "icon": "Angular.svg", @@ -503,102 +503,122 @@ "/([\\d.]+(?:\\-?rc[.\\d]*)*)/angular-material(?:\\.min)?\\.js\\;version:\\1", "angular-material.*\\.js" ], - "website": "material.angularjs.org" + "website": "http://material.angularjs.org" }, "AngularJS": { "cats": [ - 12 + "12" ], "env": "^angular$", - "icon": "AngularJS.png", + "icon": "AngularJS.svg", "script": [ "angular(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "/([\\d.]+(?:\\-?rc[.\\d]*)*)/angular(?:\\.min)?\\.js\\;version:\\1", "angular.*\\.js" ], - "website": "angularjs.org" + "website": "http://angularjs.org" }, "Apache": { "cats": [ - 22 + "22" ], "headers": { "Server": "(?:Apache(?:$|/([\\d.]+)|[^/-])|(?:^|\b)HTTPD)\\;version:\\1" }, "icon": "Apache.svg", - "website": "apache.org" + "website": "http://apache.org" }, "Apache HBase": { "cats": [ - 34 + "34" ], "html": "<style[^>]+static/hbase", - "implies": "Java", "icon": "Apache HBase.png", - "website": "hbase.apache.org" + "implies": "Java", + "website": "http://hbase.apache.org" }, "Apache Hadoop": { "cats": [ - 34 + "34" ], "html": "<style[^>]+static/hadoop", "icon": "Apache Hadoop.svg", - "website": "hadoop.apache.org" + "website": "http://hadoop.apache.org" }, "Apache JSPWiki": { "cats": [ - 8 + "8" ], "html": "<html[^>]* xmlns:jspwiki=", "icon": "Apache JSPWiki.png", - "script": "jspwiki", "implies": "Apache Tomcat", + "script": "jspwiki", "url": "wiki\\.jsp", - "website": "jspwiki.org" + "website": "http://jspwiki.org" }, "Apache Tomcat": { "cats": [ - 22 + "22" ], "headers": { "Server": "Apache-Coyote(/1\\.1)?\\;version:\\1?4.1+:", "X-Powered-By": "\bTomcat\b(?:-([\\d.]+))?\\;version:\\1" }, - "implies": "Java", "icon": "Apache Tomcat.svg", - "website": "tomcat.apache.org" + "implies": "Java", + "website": "http://tomcat.apache.org" }, "Apache Traffic Server": { "cats": [ - 22 + "22" ], "headers": { "Server": "ATS/?([\\d.]+)?\\;version:\\1" }, "icon": "Apache Traffic Server.png", - "website": "trafficserver.apache.org/" + "website": "http://trafficserver.apache.org/" }, "Apache Wicket": { "cats": [ - 18 + "18" ], "env": "^Wicket", "icon": "Apache Wicket.svg", "implies": "Java", - "website": "wicket.apache.org" + "website": "http://wicket.apache.org" + }, + "ApexPages": { + "cats": [ + "51" + ], + "headers": { + "X-Powered-By": "Salesforce.com ApexPages" + }, + "icon": "ApexPages.png", + "implies": "Salesforce", + "website": "https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_intro.htm" + }, + "Apostrophe CMS": { + "cats": [ + "1" + ], + "html": "<[^>]+data-apos-refreshable[^>]", + "icon": "apostrophecms.svg", + "implies": "Node.js", + "website": "http://apostrophecms.org" }, "AppNexus": { "cats": [ - 36 + "36" ], "html": "<(?:iframe|img)[^>]+adnxs\\.(?:net|com)", "icon": "AppNexus.svg", "script": "adnxs\\.(?:net|com)", - "website": "appnexus.com" + "website": "http://appnexus.com" }, "Arastta": { "cats": [ - 6 + "6" ], "excludes": "OpenCart", "headers": { @@ -609,19 +629,19 @@ "icon": "Arastta.svg", "implies": "PHP", "script": "arastta\\.js", - "website": "arastta.org" + "website": "http://arastta.org" }, "Arc Forum": { "cats": [ - 2 + "2" ], "html": "ping\\.src = node\\.href;\\s+[^>]+\\s+}\\s+</script>", "icon": "Arc Forum.png", - "website": "arclanguage.org" + "website": "http://arclanguage.org" }, "Artifactory": { "cats": [ - 47 + "47" ], "env": "^ArtifactoryUpdates$", "html": [ @@ -631,11 +651,11 @@ "script": [ "wicket/resource/org\\.artifactory\\." ], - "website": "jfrog.com/open-source/#os-arti" + "website": "http://jfrog.com/open-source/#os-arti" }, "Artifactory Web Server": { "cats": [ - 22 + "22" ], "headers": { "Server": "Artifactory(?:/([\\d.]+))?\\;version:\\1" @@ -644,35 +664,35 @@ "implies": [ "Artifactory" ], - "website": "jfrog.com/open-source/#os-arti" + "website": "http://jfrog.com/open-source/#os-arti" }, "ArvanCloud": { "cats": [ - 31 + "31" ], "env": "^ArvanCloud$", "headers": { "AR-PoweredBy": "Arvan Cloud \\(arvancloud.com\\)" }, "icon": "ArvanCloud.png", - "website": "www.ArvanCloud.com" + "website": "http://www.ArvanCloud.com" }, "AsciiDoc": { "cats": [ - 1, - 20, - 27 + "1", + "20", + "27" ], "env": "^asciidoc$", "icon": "AsciiDoc.png", "meta": { "generator": "^AsciiDoc ([\\d.]+)\\;version:\\1" }, - "website": "www.methods.co.nz/asciidoc" + "website": "http://www.methods.co.nz/asciidoc" }, "Asymptix PHP Framework": { "cats": [ - 18 + "18" ], "headers": { "X-Powered-By": "Asymptix PHP Framework(?:.*)" @@ -682,11 +702,11 @@ ], "icon": "Asymptix PHP Framework.png", "implies": "PHP", - "website": "github.com/Asymptix/Framework" + "website": "http://github.com/Asymptix/Framework" }, "Atlassian Bitbucket": { "cats": [ - 47 + "47" ], "env": "^bitbucket$", "icon": "Atlassian Bitbucket.svg", @@ -694,11 +714,11 @@ "meta": { "application-name": "Bitbucket" }, - "website": "www.atlassian.com/software/bitbucket/overview/" + "website": "http://www.atlassian.com/software/bitbucket/overview/" }, "Atlassian Confluence": { "cats": [ - 8 + "8" ], "headers": { "X-Confluence-Request-Time": "" @@ -709,22 +729,22 @@ "meta": { "confluence-request-time": "" }, - "website": "www.atlassian.com/software/confluence/overview/team-collaboration-software" + "website": "http://www.atlassian.com/software/confluence/overview/team-collaboration-software" }, "Atlassian FishEye": { "cats": [ - 47 + "47" ], "headers": { "Set-cookie": "FESESSIONID" }, "html": "<title>(?:Log in to )?FishEye (?:and Crucible )?([\\d.]+)?\\;version:\\1", "icon": "Atlassian FishEye.svg", - "website": "www.atlassian.com/software/fisheye/overview/" + "website": "http://www.atlassian.com/software/fisheye/overview/" }, "Atlassian Jira": { "cats": [ - 13 + "13" ], "env": "^jira$", "html": "Powered by\\s+]+atlassian\\.com/(?:software/jira|jira-bug-tracking/)[^>]+>Atlassian\\s+JIRA(?:[^v]*v(?:ersion: )?(\\d+\\.\\d+(?:\\.\\d+)?))?\\;version:\\1", @@ -734,56 +754,56 @@ "ajs-version-number": "([\\d\\.]+)\\;version:\\1", "application-name": "JIRA" }, - "website": "www.atlassian.com/software/jira/overview/" + "website": "http://www.atlassian.com/software/jira/overview/" }, "Atlassian Jira Issue Collector": { "cats": [ - 13, - 47 + "13", + "47" ], "icon": "Atlassian Jira.svg", "script": [ "jira-issue-collector-plugin", "atlassian\\.jira\\.collector\\.plugin" ], - "website": "www.atlassian.com/software/jira/overview/" + "website": "http://www.atlassian.com/software/jira/overview/" }, "Aurelia": { "cats": [ - 12 + "12" ], - "icon": "Aurelia.svg", "html": [ "<[^>]+aurelia-app=[^>]", "<[^>]+data-main=[^>]aurelia-bootstrapper", "<[^>]+au-target-id=[^>]\\d" ], + "icon": "Aurelia.svg", "script": [ "aurelia(?:\\.min)?\\.js" ], - "website": "aurelia.io" + "website": "http://aurelia.io" }, "Avangate": { "cats": [ - 6 + "6" ], "env": "^(?:__)?avng8_", "html": "]* href=\"^https?://edge\\.avangate\\.net/", "icon": "Avangate.svg", "script": "^https?://edge\\.avangate\\.net/", - "website": "avangate.com" + "website": "http://avangate.com" }, "BEM": { "cats": [ - 12 + "12" ], "html": "<[^>]+data-bem", "icon": "BEM.png", - "website": "en.bem.info" + "website": "http://en.bem.info" }, "BIGACE": { "cats": [ - 1 + "1" ], "html": "(?:Powered by ]+BIGACE|", "icon": "Business Catalyst.png", "script": "CatalystScripts", - "website": "businesscatalyst.com" + "website": "http://businesscatalyst.com" }, "BuySellAds": { "cats": [ - 36 + "36" ], "env": "^_bsa", "html": "]*>[^<]+?bsa.src\\s*=\\s*['\"](?:https?:)?\\/{2}\\w\\d\\.buysellads\\.com\\/[\\w\\d\\/]+?bsa\\.js['\"]", "icon": "BuySellAds.png", "script": "^https?://s\\d\\.buysellads\\.com/", - "website": "buysellads.com" + "website": "http://buysellads.com" }, "C++": { "cats": [ - 27 + "27" ], "icon": "C++.png", - "website": "isocpp.org" + "website": "http://isocpp.org" }, "CFML": { "cats": [ - 27 + "27" ], "icon": "CFML.png", - "website": "adobe.com/products/coldfusion-family.html" + "website": "http://adobe.com/products/coldfusion-family.html" }, "CKEditor": { "cats": [ - 24 + "24" ], "env": "^CKEDITOR$", "icon": "CKEditor.png", - "website": "ckeditor.com" + "website": "http://ckeditor.com" }, "CMS Made Simple": { "cats": [ - 1 + "1" ], "headers": { "Set-Cookie": "^CMSSESSID" @@ -1101,30 +1139,29 @@ "meta": { "generator": "CMS Made Simple" }, - "website": "cmsmadesimple.org" + "website": "http://cmsmadesimple.org" }, "CMSimple": { "cats": [ - 1 + "1" ], - "icon": "default.png", "implies": "PHP", "meta": { "generator": "CMSimple( [\\d.]+)?\\;version:\\1" }, - "website": "www.cmsimple.org/en" + "website": "http://www.cmsimple.org/en" }, "CO2Stats": { "cats": [ - 10 + "10" ], "html": "src=[^>]+co2stats\\.com/propres\\.php", "icon": "CO2Stats.png", - "website": "co2stats.com" + "website": "http://co2stats.com" }, "CPG Dragonfly": { "cats": [ - 1 + "1" ], "headers": { "X-Powered-By": "Dragonfly CMS" @@ -1134,11 +1171,11 @@ "meta": { "generator": "CPG Dragonfly" }, - "website": "dragonflycms.org" + "website": "http://dragonflycms.org" }, "CS Cart": { "cats": [ - 6 + "6" ], "env": "^fn_compare_strings$", "html": [ @@ -1147,11 +1184,11 @@ ], "icon": "CS Cart.png", "implies": "PHP", - "website": "www.cs-cart.com" + "website": "http://www.cs-cart.com" }, "CacheFly": { "cats": [ - 31 + "31" ], "headers": { "Server": "^CFS ", @@ -1159,22 +1196,22 @@ "X-CF2": "" }, "icon": "CacheFly.png", - "website": "www.cachefly.com" + "website": "http://www.cachefly.com" }, "Caddy": { "cats": [ - 22 + "22" ], "headers": { "Server": "^Caddy$" }, - "implies": "Go", "icon": "caddy.svg", - "website": "caddyserver.com" + "implies": "Go", + "website": "http://caddyserver.com" }, "CakePHP": { "cats": [ - 18 + "18" ], "headers": { "Set-Cookie": "cakephp=" @@ -1184,49 +1221,49 @@ "meta": { "application-name": "CakePHP" }, - "website": "cakephp.org" + "website": "http://cakephp.org" }, "Canon": { "cats": [ - 40 + "40" ], "icon": "Canon.png", - "website": "www.canon.com" + "website": "http://www.canon.com" }, "Canon HTTP Server": { "cats": [ - 22 + "22" ], "headers": { "Server": "CANON HTTP Server(?:/([\\d.]+))?\\;version:\\1" }, - "icon": "Canon HTTP Server.png", + "icon": "Canon.png", "implies": "Canon", - "website": "www.canon.com" + "website": "http://www.canon.com" }, "Captch Me": { "cats": [ - 16, - 36 + "16", + "36" ], "env": "^Captchme", "icon": "Captch Me.svg", "script": "^https?://api\\.captchme\\.net/", - "website": "captchme.com" + "website": "http://captchme.com" }, "Carbon Ads": { "cats": [ - 36 + "36" ], "env": "^_carbonads", "html": "<[a-z]+ [^>]*id=\"carbonads-container\"", "icon": "Carbon Ads.png", "script": "[^\\/]*\\/\\/(?:engine|srv)\\.carbonads\\.com\\/", - "website": "carbonads.net" + "website": "http://carbonads.net" }, "Cargo": { "cats": [ - 1 + "1" ], "html": "]+Cargo feed", "icon": "Cargo.png", @@ -1235,12 +1272,12 @@ "cargo_title": "" }, "script": "/cargo\\.", - "website": "cargocollective.com" + "website": "http://cargocollective.com" }, "Catberry.js": { "cats": [ - 12, - 18 + "12", + "18" ], "env": "^catberry$", "headers": { @@ -1248,43 +1285,43 @@ }, "icon": "Catberry.js.png", "implies": "Node.js", - "website": "catberry.org" + "website": "http://catberry.org" }, "Catwalk": { "cats": [ - 22 + "22" ], "headers": { "Server": "Catwalk\\/?([\\d\\.]+)?\\;version:\\1" }, "icon": "Catwalk.png", "implies": "Canon", - "website": "www.canon.com" + "website": "http://www.canon.com" }, "CentOS": { "cats": [ - 28 + "28" ], "headers": { "Server": "CentOS", "X-Powered-By": "CentOS" }, "icon": "CentOS.png", - "website": "centos.org" + "website": "http://centos.org" }, "CenteHTTPd": { "cats": [ - 22 + "22" ], "headers": { "Server": "CenteHTTPd(?:/([\\d.]+))?\\;version:\\1" }, "icon": "CenteHTTPd.png", - "website": "cente.jp/cente/app/HTTPdc.html" + "website": "http://cente.jp/cente/app/HTTPdc.html" }, "Chameleon": { "cats": [ - 1 + "1" ], "icon": "Chameleon.png", "implies": [ @@ -1294,11 +1331,11 @@ "meta": { "generator": "chameleon-cms" }, - "website": "chameleon-system.de" + "website": "http://chameleon-system.de" }, "Chamilo": { "cats": [ - 21 + "21" ], "headers": { "X-Powered-By": "Chamilo ([\\d.]+)\\;version:\\1" @@ -1309,51 +1346,51 @@ "meta": { "generator": "Chamilo ([\\d.]+)\\;version:\\1" }, - "website": "www.chamilo.org" + "website": "http://www.chamilo.org" }, "Chartbeat": { "cats": [ - 10 + "10" ], "env": "^_sf_(?:endpt|async_config)$", "icon": "Chartbeat.png", "script": "chartbeat\\.js", - "website": "chartbeat.com" + "website": "http://chartbeat.com" }, "Cherokee": { "cats": [ - 22 + "22" ], "headers": { "Server": "Cherokee/([\\d.]+)\\;version:\\1" }, "icon": "Cherokee.png", - "website": "www.cherokee-project.com" + "website": "http://www.cherokee-project.com" }, "CherryPy": { "cats": [ - 18, - 22 + "18", + "22" ], "headers": { "Server": "CherryPy\\/?([\\d\\.]+)?\\;version:\\1" }, "icon": "CherryPy.png", "implies": "Python", - "website": "www.cherrypy.org" + "website": "http://www.cherrypy.org" }, "Chitika": { "cats": [ - 36 + "36" ], "env": "ch_c(?:lient|olor_site_link)", "icon": "Chitika.png", "script": "scripts\\.chitika\\.net/", - "website": "chitika.com" + "website": "http://chitika.com" }, "Ckan": { "cats": [ - 1 + "1" ], "headers": { "Access-Control-Allow-Headers": "X-CKAN-API-KEY", @@ -1366,57 +1403,77 @@ "Java", "PostgreSQL\\;confidence:80" ], - "website": "ckan.org/" + "website": "http://ckan.org/" }, "ClickHeat": { "cats": [ - 10 + "10" ], "env": "^clickHeat", "icon": "ClickHeat.png", "implies": "PHP", "script": "clickheat.*\\.js", - "website": "www.labsmedia.com/clickheat/index.html" + "website": "http://www.labsmedia.com/clickheat/index.html" }, "ClickTale": { "cats": [ - 10 + "10" ], "env": "^ClickTale", "icon": "ClickTale.png", - "website": "www.clicktale.com" + "website": "http://www.clicktale.com" }, "Clicky": { "cats": [ - 10 + "10" ], "env": "^clicky$", "icon": "Clicky.png", "script": "static\\.getclicky\\.com", - "website": "getclicky.com" + "website": "http://getclicky.com" }, "Clientexec": { "cats": [ - 6 + "6" ], "html": "clientexec\\.[^>]*\\s?=\\s?[^>]*;", "icon": "Clientexec.png", - "website": "www.clientexec.com" + "website": "http://www.clientexec.com" + }, + "Clipboard.js": { + "cats": [ + "19" + ], + "env": "^Clipboard$", + "icon": "Clipboard.js.svg", + "script": "clipboard(?:\\.min)?\\.js", + "website": "https://clipboardjs.com/" + }, + "CloudCart": { + "cats": [ + "6" + ], + "icon": "cloudcart.svg", + "meta": { + "author": "^CloudCart LLC$" + }, + "script": "/cloudcart-(?:assets|storage)/", + "website": "http://cloudcart.com" }, "CloudFlare": { "cats": [ - 31 + "31" ], "env": "^CloudFlare$", "headers": { "Server": "cloudflare" }, "icon": "CloudFlare.svg", - "website": "www.cloudflare.com" + "website": "http://www.cloudflare.com" }, "Cloudera": { "cats": [ - 34 + "34" ], "headers": { "Server": "cloudera" @@ -1437,7 +1494,7 @@ }, "CodeIgniter": { "cats": [ - 18 + "18" ], "headers": { "Set-Cookie": "(?:exp_last_activity|exp_tracker|ci_(?:session|(csrf_token)))\\;version:\\1?2+:" @@ -1445,49 +1502,49 @@ "html": "]+name=\"ci_csrf_token\"\\;version:2+", "icon": "CodeIgniter.png", "implies": "PHP", - "website": "codeigniter.com" + "website": "http://codeigniter.com" }, "CodeMirror": { "cats": [ - 19 + "19" ], "env": "^CodeMirror$", "icon": "CodeMirror.png", - "website": "codemirror.net" + "website": "http://codemirror.net" }, "Comandia": { "cats": [ - 6 + "6" ], "env": "^Comandia$", "html": "]+=['\"]//cdn\\.mycomandia\\.com", "icon": "Comandia.svg", - "website": "comandia.com" + "website": "http://comandia.com" }, "Commerce Server": { "cats": [ - 6 + "6" ], "headers": { "COMMERCE-SERVER-SOFTWARE": "" }, "icon": "Commerce Server.png", "implies": "Microsoft ASP.NET", - "website": "commerceserver.net" + "website": "http://commerceserver.net" }, "CompaqHTTPServer": { "cats": [ - 22 + "22" ], "headers": { "Server": "CompaqHTTPServer\\/?([\\d\\.]+)?\\;version:\\1" }, "icon": "HP.svg", - "website": "www.hp.com" + "website": "http://www.hp.com" }, "Concrete5": { "cats": [ - 1 + "1" ], "env": "^CCM_IMAGE_PATH$", "icon": "Concrete5.png", @@ -1496,22 +1553,22 @@ "generator": "concrete5 - ([\\d.ab]+)\\;version:\\1" }, "script": "concrete/js/", - "website": "concrete5.org" + "website": "http://concrete5.org" }, "Connect": { "cats": [ - 18 + "18" ], "headers": { "X-Powered-By": "^Connect$" }, "icon": "Connect.png", "implies": "Node.js", - "website": "www.senchalabs.org/connect" + "website": "http://www.senchalabs.org/connect" }, "Contao": { "cats": [ - 1 + "1" ], "html": [ "", @@ -1522,22 +1579,22 @@ "meta": { "generator": "^Contao Open Source CMS$" }, - "website": "contao.org" + "website": "http://contao.org" }, "Contenido": { "cats": [ - 1 + "1" ], "icon": "Contenido.png", "implies": "PHP", "meta": { "generator": "Contenido ([\\d.]+)\\;version:\\1" }, - "website": "contenido.org/en" + "website": "http://contenido.org/en" }, "Contens": { "cats": [ - 1 + "1" ], "icon": "Contens.png", "implies": [ @@ -1547,131 +1604,131 @@ "meta": { "generator": "Contensis CMS Version ([\\d.]+)\\;version:\\1" }, - "website": "www.contens.com/en/pub/index.cfm" + "website": "http://www.contens.com/en/pub/index.cfm" }, "ContentBox": { "cats": [ - 1, - 11 + "1", + "11" ], "icon": "ContentBox.png", "implies": "Adobe ColdFusion", "meta": { "generator": "ContentBox powered by ColdBox" }, - "website": "www.gocontentbox.org" + "website": "http://www.gocontentbox.org" }, "ConversionLab": { "cats": [ - 10 + "10" ], "icon": "ConversionLab.png", "script": "conversionlab\\.trackset\\.com/track/tsend\\.js", - "website": "www.trackset.it/conversionlab" + "website": "http://www.trackset.it/conversionlab" }, "Coppermine": { "cats": [ - 7 + "7" ], "html": "|", "icon": "InProces.png", "script": "brein/inproces/website/websitefuncties\\.js", - "website": "www.brein.nl/oplossing/product/website" + "website": "http://www.brein.nl/oplossing/product/website" }, "Incapsula": { "cats": [ - 31 + "31" ], "headers": { "X-CDN": "Incapsula" }, "icon": "Incapsula.png", - "website": "www.incapsula.com" + "website": "http://www.incapsula.com" }, "Indexhibit": { "cats": [ - 1 + "1" ], "html": "<(?:link|a href) [^>]+ndxz-studio", - "icon": "default.png", "implies": [ "PHP", "Apache", @@ -3511,43 +3681,50 @@ "meta": { "generator": "Indexhibit" }, - "website": "www.indexhibit.org" + "website": "http://www.indexhibit.org" }, "Indico": { "cats": [ - 1 + "1" ], "headers": { "Set-cookie": "MAKACSESSION" }, "html": "Powered by\\s+(?:CERN )?(?:CDS )?Indico( [\\d\\.]+)?\\;version:\\1", "icon": "Indico.png", - "website": "indico-software.org" + "website": "http://indico-software.org" }, "Indy": { "cats": [ - 22 + "22" ], "headers": { "Server": "Indy(?:/([\\d.]+))?\\;version:\\1" }, - "icon": "default.png", - "website": "indyproject.org" + "website": "http://indyproject.org" + }, + "InfernoJS": { + "cats": [ + "12" + ], + "env": "^Inferno$", + "icon": "InfernoJS.png", + "website": "https://infernojs.org/" }, "Infusionsoft": { "cats": [ - 32 + "32" ], "html": [ "]*name=\"infusionsoft_version\" [^>]*value=\"([^>]*)\" [^>]*\\/>\\;version:\\1", "]*value=\"([^>]*)\" [^>]*name=\"infusionsoft_version\" [^>]*\\/>\\;version:\\1" ], "icon": "infusionsoft.svg", - "website": "infusionsoft.com" + "website": "http://infusionsoft.com" }, "InstantCMS": { "cats": [ - 1 + "1" ], "headers": { "Set-Cookie": "InstantCMS\\[logdate\\]=" @@ -3557,87 +3734,87 @@ "meta": { "generator": "InstantCMS" }, - "website": "www.instantcms.ru" + "website": "http://www.instantcms.ru" }, "Intel Active Management Technology": { "cats": [ - 22, - 46 + "22", + "46" ], "headers": { "Server": "Intel\\(R\\) Active Management Technology(?: ([\\d.]+))?\\;version:\\1" }, "icon": "Intel Active Management Technology.png", - "website": "intel.com" + "website": "http://intel.com" }, "IntenseDebate": { "cats": [ - 15 + "15" ], "icon": "IntenseDebate.png", "script": "intensedebate\\.com", - "website": "intensedebate.com" + "website": "http://intensedebate.com" }, "Intercom": { "cats": [ - 10 + "10" ], "env": "^Intercom$", "icon": "Intercom.png", "script": "(?:api\\.intercom\\.io/api|static\\.intercomcdn\\.com/intercom\\.v1)", - "website": "intercom.io" + "website": "http://intercom.io" }, "Intershop": { "cats": [ - 6 + "6" ], "icon": "Intershop.png", "script": "(?:is-bin|INTERSHOP)", - "website": "intershop.com" + "website": "http://intershop.com" }, "Invenio": { "cats": [ - 50 + "50" ], "headers": { "Set-cookie": "INVENIOSESSION" }, "html": "(?:Powered by|System)\\s+(?:CERN )?(?:CDS )?Invenio\\s*v?([\\d\\.]+)?\\;version:\\1", "icon": "Invenio.png", - "website": "invenio-software.org" + "website": "http://invenio-software.org" }, "Ionicons": { "cats": [ - 17 + "17" ], "html": "]* href=[^>]+ionicons(?:\\.min)?\\.css", "icon": "Ionicons.png", - "website": "ionicons.com" + "website": "http://ionicons.com" }, "JAlbum": { "cats": [ - 7 + "7" ], "icon": "JAlbum.png", "implies": "Java", "meta": { "generator": "JAlbum( [\\d.]+)?\\;version:\\1" }, - "website": "jalbum.net/en" + "website": "http://jalbum.net/en" }, "JBoss Application Server": { "cats": [ - 22 + "22" ], "headers": { "X-Powered-By": "JBoss(?:-([\\d.]+))?\\;version:\\1" }, "icon": "JBoss Application Server.png", - "website": "jboss.org/jbossas.html" + "website": "http://jboss.org/jbossas.html" }, "JBoss Web": { "cats": [ - 22 + "22" ], "excludes": "Apache Tomcat", "headers": { @@ -3645,11 +3822,11 @@ }, "icon": "JBoss Web.png", "implies": "JBoss Application Server", - "website": "jboss.org/jbossweb" + "website": "http://jboss.org/jbossweb" }, "JC-HTTPD": { "cats": [ - 22 + "22" ], "excludes": "Apache", "headers": { @@ -3657,171 +3834,171 @@ }, "icon": "JC-HTTPD.png", "implies": "Canon", - "website": "canon.com" + "website": "http://canon.com" }, "JS Charts": { "cats": [ - 25 + "25" ], "env": "^JSChart$", "icon": "JS Charts.png", "script": "jscharts.*\\.js", - "website": "www.jscharts.com" + "website": "http://www.jscharts.com" }, "JTL Shop": { "cats": [ - 6 + "6" ], "headers": { "Set-Cookie": "JTLSHOP=" }, "html": "(?:]+name=\"JTLSHOP|]*\\s+href=[^>]*styles/kendo\\.common(?:\\.min)?\\.css[^>]*/>", "icon": "Kendo UI.png", "implies": "jQuery", - "website": "www.kendoui.com" + "website": "http://www.kendoui.com" }, "Kentico CMS": { "cats": [ - 1 + "1" ], "headers": { "Set-Cookie": "CMSPreferredCulture=" @@ -3923,12 +4100,22 @@ "meta": { "generator": "Kentico CMS ([\\d.R]+ \\(build [\\d.]+\\))\\;version:\\1" }, - "website": "www.kentico.com" + "website": "http://www.kentico.com" + }, + "KeyCDN": { + "cats": [ + "31" + ], + "headers": { + "Server": "^keycdn-engine$" + }, + "icon": "KeyCDN.png", + "website": "http://www.keycdn.com" }, "Kibana": { "cats": [ - 29, - 25 + "29", + "25" ], "headers": { "kbn-name": "kibana", @@ -3938,51 +4125,51 @@ "icon": "kibana.svg", "implies": "Node.js", "url": "kibana#/dashboard/", - "website": "www.elastic.co/products/kibana" + "website": "http://www.elastic.co/products/kibana" }, "KineticJS": { "cats": [ - 25 + "25" ], "env": "^Kinetic$", "icon": "KineticJS.png", "script": "kinetic(?:-v?([\\d.]+))?(?:\\.min)?\\.js\\;version:\\1", - "website": "kineticjs.com" + "website": "http://kineticjs.com" }, "Klarna Checkout": { "cats": [ - 41, - 6, - 5 + "41", + "6", + "5" ], "env": "^_klarnaCheckout$", "icon": "Klarna.svg", - "website": "klarna.com" + "website": "http://klarna.com" }, "Knockout.js": { "cats": [ - 12 + "12" ], "env": "^ko$", "icon": "Knockout.js.png", - "website": "knockoutjs.com" + "website": "http://knockoutjs.com" }, "Koa": { "cats": [ - 18, - 22 + "18", + "22" ], "headers": { "X-Powered-By": "^koa$" }, "icon": "Koa.png", "implies": "Node.js", - "website": "koajs.com" + "website": "http://koajs.com" }, "Koala Framework": { "cats": [ - 1, - 18 + "1", + "18" ], "html": "", "icon": "Lightspeed.svg", "script": "http://assets.webshopapp.com", "url": "seoshop.webshopapp.com", - "website": "www.lightspeedhq.com/products/ecommerce/" + "website": "http://www.lightspeedhq.com/products/ecommerce/" }, "Lighty": { "cats": [ - 18 + "18" ], "headers": { "Set-Cookie": "lighty_version" }, "icon": "Lighty.png", "implies": "PHP", - "website": "gitlab.com/lighty/framework" + "website": "http://gitlab.com/lighty/framework" }, "LimeSurvey": { "cats": [ - 19 + "19" ], "headers": { "generator": "LimeSurvey" }, "icon": "LimeSurvey.png", - "website": "limesurvey.org/" + "website": "http://limesurvey.org/" }, "LinkSmart": { "cats": [ - 36 + "36" ], "env": "^(?:_mb_site_guid$|LS_JSON|LinkSmart(?:_|$))", "icon": "LinkSmart.png", "script": "^https?://cdn\\.linksmart\\.com/linksmart_([\\d.]+?)(?:\\.min)?\\.js\\;version:\\1", - "website": "linksmart.com" + "website": "http://linksmart.com" }, "Linkedin": { "cats": [ - 5 + "5" ], "icon": "Linkedin.svg", "script": "//platform\\.linkedin\\.com/in\\.js", - "website": "linkedin.com" + "website": "http://linkedin.com" }, "List.js": { "cats": [ - 12 + "12" ], "env": "^List$", "icon": "List.js.png", "script": "^list\\.(?:min\\.)?js$", - "website": "www.listjs.com" + "website": "http://www.listjs.com" }, "LiteSpeed": { "cats": [ - 22 + "22" ], "headers": { "Server": "^LiteSpeed$" }, "icon": "LiteSpeed.png", - "website": "litespeedtech.com" + "website": "http://litespeedtech.com" }, "Lithium": { "cats": [ - 1 + "1" ], "env": [ "^LITHIUM$" @@ -4276,35 +4468,43 @@ "html": " ]+Powered by Lithium", "icon": "Lithium.png", "implies": "PHP", - "website": "www.lithium.com" + "website": "http://www.lithium.com" }, "LiveAgent": { "cats": [ - 52 + "52" ], "env": "^LiveAgent$", "icon": "LiveAgent.png", - "website": "www.ladesk.com" + "website": "http://www.ladesk.com" }, "LiveChat": { "cats": [ - 52 + "52" ], "icon": "LiveChat.png", "script": "cdn\\.livechatinc\\.com/.*tracking\\.js", - "website": "livechatinc.com" + "website": "http://livechatinc.com" }, "LiveJournal": { "cats": [ - 11 + "11" ], "icon": "LiveJournal.png", "url": "\\.livejournal\\.com", - "website": "www.livejournal.com" + "website": "http://www.livejournal.com" + }, + "LivePerson": { + "cats": [ + "52" + ], + "icon": "LivePerson.png", + "script": "^https?://lptag\\.liveperson\\.net/tag/tag\\.js", + "website": "https://www.liveperson.com/" }, "LiveStreet CMS": { "cats": [ - 1 + "1" ], "env": "^LIVESTREET", "headers": { @@ -4312,11 +4512,11 @@ }, "icon": "LiveStreet CMS.png", "implies": "PHP", - "website": "livestreetcms.com" + "website": "http://livestreetcms.com" }, "Livefyre": { "cats": [ - 15 + "15" ], "env": [ "^fyre$", @@ -4325,11 +4525,11 @@ "html": "<[^>]+(?:id|class)=\"livefyre", "icon": "Livefyre.png", "script": "livefyre_init\\.js", - "website": "livefyre.com" + "website": "http://livefyre.com" }, "Liveinternet": { "cats": [ - 10 + "10" ], "html": [ "]*>[^]{0,128}?src\\s*=\\s*['\"]//counter\\.yadro\\.ru/hit(?:;\\S+)?\\?(?:t\\d+\\.\\d+;)?r", @@ -4339,19 +4539,19 @@ ], "icon": "Liveinternet.png", "script": "/js/al/common.js\\?[0-9_]+", - "website": "liveinternet.ru/rating/" + "website": "http://liveinternet.ru/rating/" }, "Lo-dash": { "cats": [ - 12 + "12" ], "icon": "Lo-dash.png", "script": "lodash.*\\.js", - "website": "www.lodash.com" + "website": "http://www.lodash.com" }, "Locomotive": { "cats": [ - 1 + "1" ], "html": "]*/sites/[a-z\\d]{24}/theme/stylesheets", "icon": "Locomotive.png", @@ -4359,81 +4559,89 @@ "Ruby on Rails", "MongoDB" ], - "website": "www.locomotivecms.com" + "website": "http://www.locomotivecms.com" }, "Logitech Media Server": { "cats": [ - 22, - 38 + "22", + "38" ], "headers": { "Server": "Logitech Media Server(?: \\(([\\d\\.]+))?\\;version:\\1" }, "icon": "Logitech Media Server.png", - "website": "www.mysqueezebox.com" + "website": "http://www.mysqueezebox.com" }, "Lotus Domino": { "cats": [ - 22 + "22" ], "headers": { "Server": "Lotus-Domino" }, "icon": "Lotus Domino.png", "implies": "Java", - "website": "www-01.ibm.com/software/lotus/products/domino" + "website": "http://www-01.ibm.com/software/lotus/products/domino" }, "Lua": { "cats": [ - 27 + "27" ], "headers": { "X-Powered-By": "\bLua(?: ([\\d.]+))?\\;version:\\1" }, "icon": "Lua.png", - "website": "www.lua.org" + "website": "http://www.lua.org" }, "Lucene": { "cats": [ - 34 + "34" ], "icon": "Lucene.png", "implies": "Java", - "website": "lucene.apache.org/core/" + "website": "http://lucene.apache.org/core/" }, "M.R. Inc BoxyOS": { "cats": [ - 28 + "28" ], - "icon": "M.R. Inc BoxyOS.png", - "website": "mrincworld.com" + "icon": "M.R. Inc.png", + "website": "http://mrincworld.com" }, "M.R. Inc SiteFrame": { "cats": [ - 18 + "18" ], "headers": { "Powered-By": "M\\.R\\. Inc SiteFrame" }, - "icon": "M.R. Inc SiteFrame.png", - "website": "mrincworld.com" + "icon": "M.R. Inc.png", + "website": "http://mrincworld.com" }, "M.R. Inc Webserver": { "cats": [ - 22 + "22" ], "headers": { "Server": "M\\.R\\. Inc Webserver" }, - "icon": "M.R. Inc Webserver.png", + "icon": "M.R. Inc.png", "implies": [ "M.R. Inc BoxyOS" ], - "website": "mrincworld.com" + "website": "http://mrincworld.com" + }, + "MHonArc": { + "cats": [ + "50" + ], + "html": "\\;version:\\1", + "icon": "mhonarc.png", + "website": "http://www.mhonarc.at" }, "MOBOTIX": { "cats": [ - 39 + "39" ], "icon": "MOBOTIX.png", "meta": { @@ -4442,11 +4650,11 @@ "publisher": "MOBOTIX AG\\;confidence:40" }, "url": "control/userimage\\.html\\;confidence:70", - "website": "mobotix.com" + "website": "http://mobotix.com" }, "MODX": { "cats": [ - 1 + "1" ], "env": "^MODX_MEDIA_PATH$", "headers": { @@ -4461,20 +4669,23 @@ ], "icon": "MODX.png", "implies": "PHP", - "website": "modx.com" - }, + "meta": { + "generator": "MODX[^\\d.]*([\\d.]+)?\\;version:\\1" + }, + "website": "http://modx.com" + }, "MadAdsMedia": { "cats": [ - 36 + "36" ], "env": "^setM(?:Iframe|RefURL)$", "icon": "MadAdsMedia.png", "script": "^https?://(?:ads-by|pixel)\\.madadsmedia.com/", - "website": "madadsmedia.com" + "website": "http://madadsmedia.com" }, "Magento": { "cats": [ - 6 + "6" ], "env": [ "^(?:Mage|VarienForm)$" @@ -4494,11 +4705,11 @@ "static/_requirejs\\;confidence:50\\;version:2", "static/frontend\\;confidence:20\\;version:2" ], - "website": "www.magentocommerce.com" + "website": "http://www.magentocommerce.com" }, "Mailchimp": { "cats": [ - 32 + "32" ], "html": [ "
]*data-mailchimp-url", @@ -4512,39 +4723,39 @@ "s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js", "cdn-images.mailchimp.com/[^>]*.css" ], - "website": "mailchimp.com" + "website": "http://mailchimp.com" }, "Mambo": { "cats": [ - 1 + "1" ], "excludes": "Joomla", "icon": "Mambo.png", "meta": { "generator": "Mambo" }, - "website": "mambo-foundation.org" + "website": "http://mambo-foundation.org" }, "MantisBT": { "cats": [ - 13 + "13" ], "html": "]+ alt=\"Powered by Mantis Bugtracker", "icon": "MantisBT.png", "implies": "PHP", - "website": "www.mantisbt.org" + "website": "http://www.mantisbt.org" }, "ManyContacts": { "cats": [ - 5 + "5" ], "icon": "ManyContacts.png", "script": "\\/assets\\/js\\/manycontacts\\.min\\.js", - "website": "www.manycontacts.com" + "website": "http://www.manycontacts.com" }, "Marionette.js": { "cats": [ - 12 + "12" ], "env": "^Marionette$", "icon": "Marionette.js.svg", @@ -4553,61 +4764,76 @@ "Backbone.js" ], "script": "backbone\\.marionette.*\\.js", - "website": "marionettejs.com" + "website": "http://marionettejs.com" }, "Marketo": { "cats": [ - 32 + "32" ], "env": "^Munchkin$", "icon": "Marketo.png", "script": "munchkin\\.marketo\\.net/munchkin\\.js", - "website": "www.marketo.com" + "website": "http://www.marketo.com" }, "Materialize CSS": { "cats": [ - 18 + "18" ], "html": "]* href=\"[^\"]*materialize(?:\\.min)?\\.css", "icon": "Materialize CSS.png", "implies": "jQuery", "script": "materialize(?:\\.min)?\\.js", - "website": "materializecss.com" + "website": "http://materializecss.com" }, "MathJax": { "cats": [ - 25 + "25" ], "env": "^MathJax$", "icon": "MathJax.png", "script": "mathjax\\.js", - "website": "mathjax.org" + "website": "http://mathjax.org" + }, + "Mattermost": { + "cats": [ + "2" + ], + "env": "mm_(?:config|license|user|current_user_id)", + "html": "", + "icon": "mattermost.png", + "implies": [ + "Go", + "React", + "PostgreSQL\\;confidence:50", + "MySQL\\;confidence:50" + ], + "website": "http://about.mattermost.com" }, "MaxCDN": { "cats": [ - 31 + "31" ], "headers": { "Server": "^NetDNA", "X-CDN-Forward": "^maxcdn$" }, "icon": "MaxCDN.png", - "website": "www.maxcdn.com" + "website": "http://www.maxcdn.com" }, "MaxSite CMS": { "cats": [ - 1 + "1" ], "icon": "MaxSite CMS.png", "implies": "PHP", "meta": { "generator": "MaxSite CMS" }, - "website": "max-3000.com" + "website": "http://max-3000.com" }, "Mean.io": { "cats": [ - 12 + "12" ], "headers": { "X-Powered-CMS": "Mean\\.io" @@ -4616,32 +4842,31 @@ "implies": [ "MongoDB", "Express", - "AngularJS", - "Node.js" + "AngularJS" ], - "website": "mean.io" + "website": "http://mean.io" }, "MediaElement.js": { "cats": [ - 14 + "14" ], "env": "^mejs$", "icon": "MediaElement.js.png", - "website": "mediaelementjs.com" + "website": "http://mediaelementjs.com" }, "MediaTomb": { "cats": [ - 38 + "38" ], "headers": { "Server": "MediaTomb(?:/([\\d.]+))?\\;version:\\1" }, "icon": "MediaTomb.png", - "website": "mediatomb.cc" + "website": "http://mediatomb.cc" }, "MediaWiki": { "cats": [ - 8 + "8" ], "html": "(?:]+>Powered by MediaWiki|<[^>]+id=\"t-specialpages)", "icon": "MediaWiki.png", @@ -4649,40 +4874,60 @@ "meta": { "generator": "MediaWiki" }, - "website": "www.mediawiki.org" + "website": "http://www.mediawiki.org" + }, + "Medium": { + "cats": [ + "1" + ], + "headers": { + "X-Powered-By": "Medium" + }, + "icon": "Medium.svg", + "script": "medium\\.com", + "url": "^(?:www\\.)?medium\\.com", + "website": "https://medium.com" }, "Meebo": { "cats": [ - 5 + "5" ], "html": "(?: