Merge branch 'master' into master

main
pilievwm 8 years ago committed by GitHub
commit 2c11e18385

19
.gitignore vendored

@ -1,11 +1,12 @@
.vagrant /build/*
/src/icons/converted/*
build/* /node_modules
src/icons/converted/* /npm-debug.log
node_modules
npm-debug.log
tags
!.gitkeep !.gitkeep
# Junk files
Thumbs.db
Desktop.ini
*.DS_Store
._*

@ -1,21 +1,25 @@
language: node_js sudo: required
node_js:
- "node" services:
sudo: false - docker
before_install:
- export WAPPALYZER_ROOT=$TRAVIS_BUILD_DIR after_success:
- export WAPPALYZER_NODE_PATH=$TRAVIS_BUILD_DIR - sha256sum build/* > build/SHA256SUMS
- export PATH=$PATH:$TRAVIS_BUILD_DIR/bin - cat build/SHA256SUMS
- ln -s docker/node/package.json package.json
after_script: ls -l --block-size=kB build script:
cache: - ./run build
directories:
- node_modules 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: env:
- CXX=g++-4.8 - CXX=g++-4.8
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8

@ -1,3 +0,0 @@
# Contributing
You can find our contribution guide [in our wiki](https://github.com/AliasIO/Wappalyzer/wiki/Contributing).

@ -0,0 +1,32 @@
FROM alpine
MAINTAINER Elbert Alias <elbert@alias.io>
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" ]

@ -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 [Wappalyzer](https://wappalyzer.com/) is a
[cross-platform](https://github.com/AliasIO/Wappalyzer/wiki/Drivers) utility that uncovers the [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 ## Getting Started
This section describes how to set up a development environment. Everything you Install [Docker](https://www.docker.com/) on your system first.
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.
```shell ```shell
$ git clone https://github.com/AliasIO/Wappalyzer.git wappalyzer $ git clone https://github.com/AliasIO/Wappalyzer.git
$ cd wappalyzer $ cd Wappalyzer
$ vagrant up $ ./run links
$ vagrant ssh
``` ```
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 Please run `./run validate` before submitting a pull request.
`vagrant destroy -y && vagrant up`.

20
Vagrantfile vendored

@ -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

@ -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."

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
cat << 'EOF' cat << 'EOF'
usage: wappalyzer <command> [<args>] usage: ./run <command> [<args>]
The following commands are available: The following commands are available:
build Package drivers build Package drivers

@ -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."

@ -0,0 +1,11 @@
#!/bin/bash
cd "$(dirname $0)"
if [[ -f "$1" ]]; then
./$1 $@
else
./help
exit 1
fi

@ -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

@ -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));
}

@ -2,8 +2,7 @@
var var
app, app,
modulesPath = process.env.WAPPALYZER_NODE_PATH !== undefined ? process.env.WAPPALYZER_NODE_PATH + '/node_modules/' : '', json = require('../src/apps.json');
json = require(process.env.WAPPALYZER_ROOT + '/src/apps.json');
for ( app in json.apps ) { for ( app in json.apps ) {
['headers', 'html', 'env', 'meta', 'script'].forEach(function(type) { ['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) ) { if ( !/^https?:\/\//i.test(json.apps[app].website) ) {
throw new Error('Do not include the protocol in the website URL\n' + app + ': ' + json.apps[app].website); throw new Error('Invalid website URL\n' + app + ': ' + json.apps[app].website);
} }
} }

@ -1,12 +0,0 @@
#!/bin/bash
if [ -f "$0-$1" ]
then
$0-$1 ${*:2}
else
$0-help
exit 1
fi
exit

@ -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."

@ -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

@ -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

@ -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));
};

@ -1,62 +0,0 @@
FROM phusion/baseimage
MAINTAINER Elbert Alias <elbert@alias.io>
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"]

@ -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"
}
}

@ -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-----

@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCpWjnhu/cngrrYgMJQhVjuAXaIE5Hx+5vlz23qPgxuxFAOZTTLGE3X7t8wIRFygxJ6UBv9JhLMoTxrMu6A/uGyri37/EmKMIHba6uIWEoym7jJKgDo9U1t9sim1pWjqGiVUgxEo9dODWFTqWvYNYwoHkCUabPtkeZCBf2IGhXw+Yxg4XlSmLB+iRw2cjAOIIKl3X0b+VPoWUJVkdl15mHjUVaR7yhCBZ68zx90YmRn5rsuB2boDdaW8jQAjP0pZ9eVcA6+2GLhCUHhK9ILBFBsp0dtblQFFKG5yOVx7eFk71DpE4JNrXOC+xyV4p3rfIdJDXxnb6PW3lPccnOE6fXL elbert@home

@ -0,0 +1,8 @@
{
"dependencies": {
"file-type": "3.8.*",
"is-svg": "2.0.*",
"read-chunk": "2.0.*"
}
}

19
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 $@

@ -9,7 +9,16 @@
"additionalProperties": false, "additionalProperties": false,
"patternProperties": { "patternProperties": {
"^[0-9]+$": { "^[0-9]+$": {
"type": "object",
"required": true,
"properties": {
"priority": {
"type": "string" "type": "string"
},
"name": {
"type": "string"
}
}
} }
} }
}, },
@ -22,7 +31,7 @@
"cats": { "cats": {
"type": "array", "type": "array",
"items": { "items": {
"type": "integer" "type": "string"
}, },
"required": true "required": true
}, },
@ -76,8 +85,7 @@
"required": true "required": true
}, },
"icon": { "icon": {
"type": "string", "type": "string"
"required": true
} }
} }
} }

File diff suppressed because it is too large Load Diff

@ -1,7 +1,10 @@
/** /**
* Bookmarklet driver * WebExtension driver
*/ */
/** global: wappalyzer */
/** global: XMLHttpRequest */
(function() { (function() {
if ( typeof wappalyzer === 'undefined' ) { if ( typeof wappalyzer === 'undefined' ) {
return; return;
@ -9,11 +12,11 @@
var var
w = wappalyzer, w = wappalyzer,
debug = true debug = true,
d = window.document, d = window.document,
container = d.getElementById('wappalyzer-container'), container = d.getElementById('wappalyzer-container'),
domain = window.top.location.host, domain = window.top.location.host,
url = window.top.location.href, url = window.top.location.href.replace(/#.*$/, ''),
hasOwn = Object.prototype.hasOwnProperty; hasOwn = Object.prototype.hasOwnProperty;
w.driver = { w.driver = {
@ -112,7 +115,7 @@
'<div class="wappalyzer-app' + ( first ? ' wappalyzer-first' : '' ) + '">' + '<div class="wappalyzer-app' + ( first ? ' wappalyzer-first' : '' ) + '">' +
'<a target="_blank" class="wappalyzer-application" href="' + w.config.websiteURL + 'applications/' + app.toLowerCase().replace(/ /g, '-').replace(/[^a-z0-9-]/g, '') + '">' + '<a target="_blank" class="wappalyzer-application" href="' + w.config.websiteURL + 'applications/' + app.toLowerCase().replace(/ /g, '-').replace(/[^a-z0-9-]/g, '') + '">' +
'<strong>' + '<strong>' +
'<img src="' + w.config.websiteURL + 'images/icons/' + w.apps[app].icon + '" width="16" height="16"/> ' + app + '<img src="' + w.config.websiteURL + 'images/icons/' + (w.apps[app].icon || 'default.svg') + '" width="16" height="16"/> ' + app +
'</strong>' + '</strong>' +
'</a>'; '</a>';
@ -121,7 +124,7 @@
continue; continue;
} }
category = w.categories[w.apps[app].cats[i]]; category = w.categories[w.apps[app].cats[i]].name;
html += '<a target="_blank" class="wappalyzer-category" href="' + w.config.websiteURL + 'categories/' + w.driver.slugify(category) + '">' + category + '</a>'; html += '<a target="_blank" class="wappalyzer-category" href="' + w.config.websiteURL + 'categories/' + w.driver.slugify(category) + '">' + category + '</a>';
} }

@ -1,7 +0,0 @@
apps.json
images/icons/converted/*.png
images/icons/*.png
images/icons/*.svg
js/wappalyzer.js
js/iframe.js
js/network.js

@ -1,65 +0,0 @@
body {
color: #303942;
cursor: default;
font-family: 'DejaVu Sans', Arial, sans-serif; font-size: 75%;
margin: 0 20px;
}
p {
line-height: 1.8em;
}
h1, h2, h3 {
font-weight: normal;
line-height: 1;
}
h1 {
border-bottom: 1px solid #eee;
font-size: 1.5em;
margin: 0;
padding: 21px 0 13px;
}
h2 {
font-size: 1.3em;
margin-bottom: 0.4em;
}
h3 {
color: black;
font-size: 1.2em;
margin-bottom: 0.5em;
}
a {
color: rgb(17, 85, 204);
text-decoration: underline;
}
a:active {
color: rgb(5, 37, 119);
}
#options-saved {
display: none;
-webkit-animation: fadeout 2s;
}
#about {
border-top: 1px solid #eee;
margin-top: 21px;
}
#about img {
vertical-align: middle;
}
#about button {
line-height: 30px;
}
@-webkit-keyframes fadeout {
from { opacity: 1; }
to { opacity: 0; }
}

@ -1,93 +0,0 @@
body {
background: #fff;
color: #000;
font-family: Helvetica, Arial, sans-serif;
font-size: 13px;
line-height: 16px;
margin: 0;
min-width: 200px;
padding: 15px;
}
a:focus {
outline: 0;
}
img {
display: inline-block;
height: 16px;
margin-right: 8px;
vertical-align: top;
width: 16px;
}
.detected-app {
padding: 7px 0;
}
.detected-app:first-child {
padding-top: 0;
}
.detected-app:last-child {
border: none;
padding-bottom: 0;
}
.detected-app a {
color: #000;
display: block;
text-decoration: none;
}
.detected-app a .label .name {
border-bottom: 1px dotted #999;
}
.detected-app a:hover .label .name {
border-bottom: 1px solid #333;
}
.detected-app a .category .name {
border-bottom: 1px solid transparent;
}
.detected-app a:hover .category .name {
border-bottom: 1px solid #999;
}
.label {
font-weight: bold;
}
.category {
color: #999;
display: block;
margin: 5px 0 0 24px;
}
.empty {
color: #999;
font-style: italic;
text-align: center;
}
#footer {
border-top: 1px solid #ccc;
margin-top: 17px;
overflow: hidden;
padding-top: 11px;
}
#footer a {
color: #999;
text-decoration: none;
}
#footer a:hover {
color: #333;
}
#options {
float: right;
}

@ -1,298 +0,0 @@
/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/* This file defines styles for form controls. The order of rule blocks is
* important as there are some rules with equal specificity that rely on order
* as a tiebreaker. These are marked with OVERRIDE.
*/
/* Default state **************************************************************/
button:not(.custom-appearance):not(.link-button),
input[type='button']:not(.custom-appearance):not(.link-button),
input[type='submit']:not(.custom-appearance):not(.link-button),
select,
input[type='checkbox'],
input[type='radio'] {
-webkit-appearance: none;
-webkit-user-select: none;
background-image: -webkit-linear-gradient(#ededed, #ededed 38%, #dedede);
border: 1px solid rgba(0, 0, 0, 0.25);
border-radius: 2px;
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08),
inset 0 1px 2px rgba(255, 255, 255, 0.75);
color: #444;
font: inherit;
margin: 0 1px 0 0;
text-shadow: 0 1px 0 rgb(240, 240, 240);
}
button:not(.custom-appearance):not(.link-button),
input[type='button']:not(.custom-appearance):not(.link-button),
input[type='submit']:not(.custom-appearance):not(.link-button),
select {
min-height: 2em;
min-width: 4em;
}
button:not(.custom-appearance):not(.link-button),
input[type='button']:not(.custom-appearance):not(.link-button),
input[type='submit']:not(.custom-appearance):not(.link-button) {
-webkit-padding-end: 10px;
-webkit-padding-start: 10px;
}
select {
-webkit-appearance: none;
-webkit-padding-end: 20px;
-webkit-padding-start: 6px;
/* OVERRIDE */
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAYAAAAbQcSUAAAAWklEQVQokWNgoAOIAuI0PDiKaJMSgYCZmfkbkPkfHYPEQfJEG/b//3+FBQsWLGRjY/uJbBCIDxIHyRNtGDYDyTYI3UA+Pr4vFBmEbODbt2+bKDYIyUBWYtQBAIRzRP/XKJ//AAAAAElFTkSuQmCC"),
-webkit-linear-gradient(#ededed, #ededed 38%, #dedede);
background-position: right center;
background-repeat: no-repeat;
}
html[dir='rtl'] select {
background-position: center left;
}
input[type='checkbox'] {
bottom: 2px;
height: 13px;
position: relative;
vertical-align: middle;
width: 13px;
}
input[type='radio'] {
/* OVERRIDE */
border-radius: 100%;
bottom: 3px;
height: 15px;
position: relative;
vertical-align: middle;
width: 15px;
}
/* TODO(estade): add more types here? */
input[type='password'],
input[type='search'],
input[type='text'],
input[type='url'],
input:not([type]) {
border: 1px solid #bfbfbf;
border-radius: 2px;
box-sizing: border-box;
color: #444;
font: inherit;
margin: 0;
/* Use min-height to accommodate addditional padding for touch as needed. */
min-height: 2em;
padding: 3px;
}
input[type='search'] {
-webkit-appearance: textfield;
/* NOTE: Keep a relatively high min-width for this so we don't obscure the end
* of the default text in relatively spacious languages (i.e. German). */
min-width: 160px;
}
/* Checked ********************************************************************/
input[type='checkbox']:checked::before {
-webkit-user-select: none;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wDBhYcG79aGIsAAACbSURBVBjTjdFBCkFhFAXgj4fp24PBy0SZ2ICRXRgYGb2xlKzBSEo2YgsiKWVoZgFKMjD5X/2Ux6lb99bpnNO5lKMR5i8MsEQHkhJiEzlS9HCqfiFWMUIt3AfsC3KKLCL30Qr7HfM4Ro4h6rhiEqmusIMKuphGqo+ogSPGcbYLzh91vdkXSHDDBk+0gxussS3rNcMCs+D6E18/9gLPPhbDshfzLgAAAABJRU5ErkJggg==");
background-size: 100% 100%;
content: '';
display: block;
height: 100%;
width: 100%;
}
html[dir='rtl'] input[type='checkbox']:checked::before {
-webkit-transform: scaleX(-1);
}
input[type='radio']:checked::before {
background-color: #666;
border-radius: 100%;
bottom: 25%;
content: '';
display: block;
left: 25%;
position: absolute;
right: 25%;
top: 25%;
}
/* Hover **********************************************************************/
button:not(.custom-appearance):not(.link-button):enabled:hover,
input[type='button']:not(.custom-appearance):not(.link-button):enabled:hover,
input[type='submit']:not(.custom-appearance):not(.link-button):enabled:hover,
select:enabled:hover,
input[type='checkbox']:enabled:hover,
input[type='radio']:enabled:hover {
background-image: -webkit-linear-gradient(#f0f0f0, #f0f0f0 38%, #e0e0e0);
border-color: rgba(0, 0, 0, 0.3);
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.12),
inset 0 1px 2px rgba(255, 255, 255, 0.95);
color: black;
}
select:enabled:hover {
/* OVERRIDE */
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAYAAAAbQcSUAAAAWklEQVQokWNgoAOIAuI0PDiKaJMSgYCZmfkbkPkfHYPEQfJEG/b//3+FBQsWLGRjY/uJbBCIDxIHyRNtGDYDyTYI3UA+Pr4vFBmEbODbt2+bKDYIyUBWYtQBAIRzRP/XKJ//AAAAAElFTkSuQmCC"),
-webkit-linear-gradient(#f0f0f0, #f0f0f0 38%, #e0e0e0);
}
/* Active *********************************************************************/
button:not(.custom-appearance):not(.link-button):enabled:active,
input[type='button']:not(.custom-appearance):not(.link-button):enabled:active,
input[type='submit']:not(.custom-appearance):not(.link-button):enabled:active,
select:enabled:active,
input[type='checkbox']:enabled:active,
input[type='radio']:enabled:active {
background-image: -webkit-linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7);
box-shadow: none;
text-shadow: none;
}
select:enabled:active {
/* OVERRIDE */
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAYAAAAbQcSUAAAAWklEQVQokWNgoAOIAuI0PDiKaJMSgYCZmfkbkPkfHYPEQfJEG/b//3+FBQsWLGRjY/uJbBCIDxIHyRNtGDYDyTYI3UA+Pr4vFBmEbODbt2+bKDYIyUBWYtQBAIRzRP/XKJ//AAAAAElFTkSuQmCC"),
-webkit-linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7);
}
/* Disabled *******************************************************************/
button:not(.custom-appearance):not(.link-button):disabled,
input[type='button']:not(.custom-appearance):not(.link-button):disabled,
input[type='submit']:not(.custom-appearance):not(.link-button):disabled,
select:disabled {
background-image: -webkit-linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6);
border-color: rgba(80, 80, 80, 0.2);
box-shadow: 0 1px 0 rgba(80, 80, 80, 0.08),
inset 0 1px 2px rgba(255, 255, 255, 0.75);
color: #aaa;
}
select:disabled {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAYAAAAbQcSUAAAAAXNSR0IArs4c6QAAAAd0SU1FB9sLAxYEBKriBmwAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAABLSURBVCiRY2CgA4gC4jQ8OIpokxKBoKGh4T8uDJIn2rD///8rLFiwYCE2g0DiIHkSfIndQLIMwmYgRQYhG/j27dsmig1CMpCVGHUAo8FcsHfxfXQAAAAASUVORK5CYII="),
-webkit-linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6);
}
input[type='checkbox']:disabled,
input[type='radio']:disabled {
opacity: .75;
}
input[type='password']:disabled,
input[type='search']:disabled,
input[type='text']:disabled,
input[type='url']:disabled,
input:not([type]):disabled {
color: #999;
}
/* Focus **********************************************************************/
button:not(.custom-appearance):not(.link-button):enabled:focus,
input[type='button']:not(.custom-appearance):enabled:focus,
input[type='checkbox']:enabled:focus,
input[type='password']:enabled:focus,
input[type='radio']:enabled:focus,
input[type='search']:enabled:focus,
input[type='submit']:not(.custom-appearance):enabled:focus,
input[type='text']:enabled:focus,
input[type='url']:enabled:focus,
input:not([type]):enabled:focus,
select:enabled:focus {
/* OVERRIDE */
-webkit-transition: border-color 200ms;
/* We use border color because it follows the border radius (unlike outline).
* This is particularly noticeable on mac. */
border-color: rgb(77, 144, 254);
outline: none;
}
/* Link buttons ***************************************************************/
.link-button {
-webkit-box-shadow: none;
background: transparent none;
border: none;
color: rgb(17, 85, 204);
cursor: pointer;
/* Input elements have -webkit-small-control which can override the body font.
* Resolve this by using 'inherit'. */
font: inherit;
margin: 0;
padding: 0 4px;
}
.link-button:hover {
text-decoration: underline;
}
.link-button:active {
color: rgb(5, 37, 119);
text-decoration: underline;
}
.link-button[disabled] {
color: #999;
cursor: default;
text-decoration: none;
}
/* Checkbox/radio helpers ******************************************************
*
* .checkbox and .radio classes wrap labels. Checkboxes and radios should use
* these classes with the markup structure:
*
* <div class="checkbox">
* <label>
* <input type="checkbox"></input>
* <span>
* </label>
* </div>
*/
.checkbox,
.radio {
margin: 0.65em 0;
}
.checkbox label,
.radio label {
/* Don't expand horizontally: <http://crbug.com/112091>. */
display: -webkit-inline-box;
}
.checkbox label input ~ span,
.radio label input ~ span {
-webkit-margin-start: 0.6em;
/* Make sure long spans wrap at the same horizontal position they start. */
display: block;
}
.checkbox label:hover,
.radio label:hover {
color: black;
}
label > input[type=checkbox]:disabled ~ span,
label > input[type=radio]:disabled ~ span {
color: #999;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 665 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 634 B

@ -1,5 +0,0 @@
var defaults = {
autoAnalyzeHeaders: 0,
upgradeMessage: 1,
tracking: 1
};

@ -1,301 +0,0 @@
/**
* Chrome driver
*/
(function() {
if ( wappalyzer == null ) {
return;
}
var w = wappalyzer,
firstRun = false,
upgraded = false,
tab,
tabCache = {},
headersCache = {};
w.driver = {
timeout: 1000,
/**
* Log messages to console
*/
log: function(args) {
console.log('[wappalyzer ' + args.type + '] ' + args.message);
},
/**
* Initialize
*/
init: function() {
w.log('init');
// Load apps.json
var xhr = new XMLHttpRequest();
xhr.open('GET', 'apps.json', true);
xhr.overrideMimeType('application/json');
xhr.onload = function() {
var json = JSON.parse(xhr.responseText);
w.categories = json.categories;
w.apps = json.apps;
};
xhr.send(null);
// Version check
try {
var version = chrome.app.getDetails().version;
if ( localStorage['version'] == null ) {
firstRun = true;
// Set defaults
for ( option in defaults ) {
localStorage[option] = defaults[option];
}
} else if ( version !== localStorage['version'] && parseInt(localStorage['upgradeMessage'], 10) ) {
upgraded = true;
}
localStorage['version'] = version;
} catch(e) { }
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
var
hostname,
a = document.createElement('a');
if ( typeof request.id != 'undefined' ) {
w.log('request: ' + request.id);
switch ( request.id ) {
case 'log':
w.log(request.message);
break;
case 'analyze':
tab = sender.tab;
a.href = tab.url.replace(/#.*$/, '');
hostname = a.hostname;
if ( headersCache[a.href] !== undefined ) {
request.subject.headers = headersCache[a.href];
}
w.analyze(hostname, a.href, request.subject);
break;
case 'ad_log':
w.adCache.push(request.subject);
break;
case 'get_apps':
sendResponse({
tabCache: tabCache[request.tab.id],
apps: w.apps,
categories: w.categories
});
break;
}
}
});
chrome.tabs.query({}, function(tabs) {
tabs.forEach(function(tab) {
if ( tab.url.match(/^https?:\/\//) ) {
chrome.tabs.executeScript(tab.id, { file: 'js/content.js' });
}
})
});
chrome.tabs.onRemoved.addListener(function(tabId) {
w.log('remove tab');
tabCache[tabId] = null;
});
// Live intercept headers using webRequest API
chrome.webRequest.onCompleted.addListener(function(details) {
var responseHeaders = {};
if ( details.responseHeaders ) {
var uri = details.url.replace(/#.*$/, ''); // Remove hash
details.responseHeaders.forEach(function(header) {
responseHeaders[header.name.toLowerCase()] = header.value || '' + header.binaryValue;
});
if ( headersCache.length > 50 ) {
headersCache = {};
}
if ( /text\/html/.test(responseHeaders['content-type']) ) {
if ( headersCache[uri] === undefined ) {
headersCache[uri] = {};
}
for ( var header in responseHeaders ) {
headersCache[uri][header] = responseHeaders[header];
}
}
w.log(JSON.stringify({ uri: uri, headers: responseHeaders }));
}
}, { urls: [ 'http://*/*', 'https://*/*' ], types: [ 'main_frame' ] }, [ 'responseHeaders' ]);
if ( firstRun ) {
w.driver.goToURL({ url: w.config.websiteURL + 'installed', medium: 'install' });
firstRun = false;
}
if ( upgraded ) {
w.driver.goToURL({ url: w.config.websiteURL + 'upgraded', medium: 'upgrade', background: true });
upgraded = false;
}
},
goToURL: function(args) {
var url = args.url + ( typeof args.medium === 'undefined' ? '' : '?pk_campaign=chrome&pk_kwd=' + args.medium);
chrome.tabs.create({ url: url, active: args.background === undefined || !args.background });
},
/**
* Display apps
*/
displayApps: function() {
var
url = tab.url.replace(/#.*$/, ''),
count = w.detected[url] ? Object.keys(w.detected[url]).length.toString() : '0';
if ( tabCache[tab.id] == null ) {
tabCache[tab.id] = {
count: 0,
appsDetected: []
};
}
tabCache[tab.id].count = count;
tabCache[tab.id].appsDetected = w.detected[url];
if ( count > 0 ) {
// Find the main application to display
var i, appName, found = false;
w.driver.categoryOrder.forEach(function(match) {
for ( appName in w.detected[url] ) {
w.apps[appName].cats.forEach(function(cat) {
var icon = w.apps[appName].icon;
if ( cat == match && !found ) {
if ( /\.svg$/i.test(icon) ) {
icon = 'converted/' + icon + '.png';
}
chrome.pageAction.setIcon({ tabId: tab.id, path: 'images/icons/' + icon });
found = true;
}
});
}
});
chrome.pageAction.show(tab.id);
};
},
/**
* Anonymously track detected applications for research purposes
*/
ping: function() {
if ( Object.keys(w.ping.hostnames).length && parseInt(localStorage['tracking'], 10) ) {
w.driver.post('http://ping.wappalyzer.com/ping/v2/', w.ping);
w.log('w.driver.ping: ' + JSON.stringify(w.ping));
w.ping = { hostnames: {} };
w.driver.post('https://ad.wappalyzer.com/log/wp/', w.adCache);
w.adCache = [];
}
},
/**
* Make POST request
*/
post: function(url, data) {
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function(e) {
if ( xhr.readyState == 4 ) {
w.log('w.driver.post: status ' + xhr.status + ' (' + url + ')');
}
};
xhr.send('json=' + encodeURIComponent(JSON.stringify(data)));
},
categoryOrder: [ // Used to pick the main application
1, // CMS
11, // Blog
6, // Web Shop
2, // Message Board
51, // Landing Page Builder
8, // Wiki
13, // Issue Tracker
30, // Web Mail
18, // Web Framework
21, // LMS
7, // Photo Gallery
38, // Media Server
3, // Database Manager
34, // Database
4, // Documentation Tool
9, // Hosting Panel
29, // Search Engine
12, // JavaScript Framework
26, // Mobile Framework
25, // JavaScript Graphics
22, // Web Server
27, // Programming Language
28, // Operating System
15, // Comment System
20, // Editor
41, // Payment Processor
10, // Analytics
32, // Marketing Automation
31, // CDN
23, // Cache Tool
17, // Font Script
24, // Rich Text Editor
35, // Map
5, // Widget
14, // Video Player
16, // Captcha
33, // Web Server Extension
37, // Network Device
39, // Webcam
40, // Printer
36, // Advertising Network
42, // Tag Managers
43, // Paywalls
19 // Miscellaneous
]
};
w.init();
}());

@ -1,13 +0,0 @@
document.addEventListener('DOMContentLoaded', function() {
var
i, value,
d = document
nodes = d.getElementsByTagName('*')
;
for ( i = 0; i < nodes.length; i ++ ) {
if ( attr = nodes[i].dataset.i18n ) {
nodes[i].innerHTML = chrome.i18n.getMessage(attr);
}
}
});

@ -1,55 +0,0 @@
document.addEventListener('DOMContentLoaded', function() {
var d = document;
var options = {
opts: defaults,
init: function() {
options.load();
d.getElementById('github' ).addEventListener('click', function() { window.open(wappalyzer.config.githubURL); });
d.getElementById('twitter' ).addEventListener('click', function() { window.open(wappalyzer.config.twitterURL); });
d.getElementById('wappalyzer').addEventListener('click', function() { window.open(wappalyzer.config.websiteURL + '?pk_campaign=chrome&pk_kwd=options'); });
d.getElementById('options-save').addEventListener('click', options.save);
},
load: function() {
for ( option in options.opts ) {
if ( value = localStorage[option] ) {
options.opts[option] = value;
}
}
if ( options.opts.autoAnalyzeHeaders === "0" || options.opts.autoAnalyzeHeaders === "1" ) {
//Remove old stored option from localStorage because it's no longer needed. This can be entirely removed in future versions
delete localStorage['autoAnalyzeHeaders'];
}
if ( parseInt(options.opts.upgradeMessage) ) {
d.getElementById('option-upgrade-message').setAttribute('checked', 'checked');
}
if ( parseInt(options.opts.tracking) ) {
d.getElementById('option-tracking').setAttribute('checked', 'checked');
}
},
save: function() {
options.opts.upgradeMessage = d.getElementById('option-upgrade-message' ).checked ? 1 : 0;
options.opts.tracking = d.getElementById('option-tracking' ).checked ? 1 : 0;
for ( option in options.opts ) {
localStorage[option] = options.opts[option];
}
d.getElementById('options-saved').style.display = 'inline';
setTimeout(function(){
d.getElementById('options-saved').style.display = 'none';
}, 2000);
}
};
options.init();
});

@ -1,67 +0,0 @@
document.addEventListener('DOMContentLoaded', function() {
var
slugify, popup,
d = document,
detectedApps = d.getElementById('detected-apps');
slugify = function(string) {
return string.toLowerCase().replace(/ /g, '-').replace(/[^\w-]/g, '');
};
popup = {
init: function() {
d.getElementById('options').addEventListener('click', function() {
window.open(chrome.extension.getURL('options.html'));
});
chrome.tabs.getSelected(null, function(tab) {
if ( tab.url.match(/https?:\/\//) ) {
detectedApps.innerHTML = '<div class="empty">' + chrome.i18n.getMessage('noAppsDetected') + '</div>';
} else {
detectedApps.innerHTML = '<div class="empty">' + chrome.i18n.getMessage('nothingToDo') + '</div>';
}
});
popup.displayApps();
},
displayApps: function() {
var appName, confidence, version;
chrome.tabs.getSelected(null, function(tab) {
chrome.extension.sendRequest({ id: 'get_apps', tab: tab }, function(response) {
if ( response.tabCache && response.tabCache.count > 0 ) {
detectedApps.innerHTML = '';
for ( appName in response.tabCache.appsDetected ) {
confidence = response.tabCache.appsDetected[appName].confidenceTotal;
version = response.tabCache.appsDetected[appName].version;
html =
'<div class="detected-app">' +
'<a target="_blank" href="https://wappalyzer.com/applications/' + slugify(appName) + '?pk_campaign=chrome&pk_kwd=popup">' +
'<img src="images/icons/' + response.apps[appName].icon + '"/>' +
'<span class="label"><span class="name">' + appName + '</span>' + ( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' ) + '</span>' +
'</a>';
response.apps[appName].cats.forEach(function(cat) {
html +=
'<a target="_blank" href="https://wappalyzer.com/categories/' + slugify(response.categories[cat]) + '?pk_campaign=chrome&pk_kwd=popup">' +
'<span class="category"><span class="name">' + chrome.i18n.getMessage('categoryName' + cat) + '</span></span>' +
'</a>';
});
html +=
'</a>' +
'</div>';
detectedApps.innerHTML = detectedApps.innerHTML + html;
}
}
});
});
}
};
popup.init();
});

@ -1,34 +0,0 @@
{ "name": "Wappalyzer",
"homepage_url": "https://wappalyzer.com?pk_campaign=chrome&pk_kwd=context",
"description": "Identifies software on the web",
"version": "2.50",
"default_locale": "en",
"manifest_version": 2,
"icons": {
"16": "images/icon_hot.png",
"32": "images/icon_32.png",
"128": "images/icon_128.png"
},
"page_action": {
"default_icon": "images/icon_32.png",
"default_title": "Wappalyzer - click for details",
"default_popup": "popup.html"
},
"background": { "page": "background.html" },
"content_scripts": [{
"matches": [ "http://*/*", "https://*/*" ],
"js": [ "js/content.js" ],
"run_at": "document_idle"
}, {
"matches": [ "http://*/*", "https://*/*" ],
"js": [ "js/iframe.js" ],
"run_at": "document_start",
"all_frames": true
}],
"web_accessible_resources": [
"js/inject.js"
],
"options_page": "options.html",
"permissions": [ "tabs", "webRequest", "webNavigation", "http://*/*", "https://*/*" ],
"content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'"
}

@ -1,40 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title data-i18n="options">Wappalyzer Options</title>
<link rel="icon" href="images/icon_hot.png">
<link rel="stylesheet" href="css/widgets.css">
<link rel="stylesheet" href="css/options.css">
<script src="js/ga.js"></script>
<script src="js/wappalyzer.js"></script>
<script src="js/defaults.js"></script>
<script src="js/options.js"></script>
<script src="js/i18n.js"></script>
</head>
<body>
<h1 data-i18n="options"></h1>
<p>
<label for="option-upgrade-message"><input id="option-upgrade-message" type="checkbox"> <span data-i18n="optionUpgradeMessage"></span></label>
</p>
<p>
<label for="option-tracking"><input id="option-tracking" type="checkbox"> <span data-i18n="optionTracking"></span></label>
</p>
<p>
<button id="options-save" data-i18n="optionsSave"></button> <span id="options-saved" data-i18n="optionsSaved"></span>
</p>
<div id="about">
<p>
<button id="github" ><img src="images/github.png" width="16" height="16" alt=""/> <span data-i18n="github" ></span></button>
<button id="twitter" ><img src="images/twitter.png" width="16" height="16" alt=""/> <span data-i18n="twitter"></span></button>
<button id="wappalyzer"><img src="images/icon_hot.png" width="16" height="16" alt=""/> <span data-i18n="website"></span></button>
</p>
</body>
</html>

@ -1,5 +0,0 @@
data/apps.json
data/images/icons/*.png
data/images/icons/*.svg
data/js/iframe.js
wappalyzer.js

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

@ -1,96 +0,0 @@
(function() {
self.port.on('displayApps', function(message) {
var
div, a, img, label, name, slugify,
d = document,
detectedApps = d.getElementById('detected-apps'),
empty = d.getElementById('empty');
slugify = function(string) {
return string.toLowerCase().replace(/ /g, '-').replace(/[^\w-]/g, '');
};
while ( detectedApps.firstChild ) {
detectedApps.removeChild(detectedApps.firstChild);
}
if ( message.tabs.count > 0 ) {
empty.style.display = 'none';
for ( appName in message.tabs.appsDetected ) {
div = d.createElement('div');
a = d.createElement('a');
img = d.createElement('img');
label = d.createElement('span');
name = d.createElement('span');
confidence = message.tabs.appsDetected[appName].confidenceTotal;
version = message.tabs.appsDetected[appName].version;
div.setAttribute('class', 'detected-app');
a.setAttribute('href', '#');
(function(appName) {
a.addEventListener('click', function(e) {
e.preventDefault();
self.port.emit('goToUrl', 'applications/' + slugify(appName));
});
}(appName));
img.setAttribute('src', 'images/icons/' + message.apps[appName].icon);
img.setAttribute('height', '16');
img.setAttribute('width', '16');
label.setAttribute('class', 'label');
name.setAttribute('class', 'name');
name.appendChild(d.createTextNode(appName));
label.appendChild(name);
label.appendChild(d.createTextNode(( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '')));
a.appendChild(img)
a.appendChild(label)
div.appendChild(a);
message.apps[appName].cats.forEach(function(cat) {
a = d.createElement('a');
label = d.createElement('span');
name = d.createElement('span');
a.setAttribute('href', '#');
(function(appName) {
a.addEventListener('click', function(e) {
e.preventDefault();
self.port.emit('goToUrl', 'categories/' + slugify(message.categories[cat]));
});
}(appName));
label.setAttribute('class', 'category');
name.setAttribute('class', 'name');
name.appendChild(d.createTextNode(message.categoryNames[cat]));
label.appendChild(name);
a.appendChild(label);
div.appendChild(a);
});
detectedApps.appendChild(div);
}
} else {
empty.style.display = 'inherit';
}
self.port.emit('resize', document.body.offsetHeight);
});
}());

@ -1,35 +0,0 @@
(function() {
var lastEnv = [];
try {
if ( document && document.contentType === 'text/html' ) {
var
html = new XMLSerializer().serializeToString(document)
env = [];
self.port.emit('log', html);
self.port.emit('log', 'init');
if ( html.length > 50000 ) {
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
}
self.port.emit('analyze', {
hostname: location.hostname,
url: location.href,
analyze: { html: html }
});
setTimeout(function() {
var env = Object.keys(unsafeWindow).slice(0, 500);
self.port.emit('analyze', {
hostname: location.hostname,
url: location.href,
analyze: { env: env }
});
}, 1000);
}
} catch (e) { }
}());

@ -1,16 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Panel</title>
<link rel="stylesheet" href="css/panel.css">
</head>
<body>
<div id="empty" data-l10n-id="noAppsDetected"></div>
<div id="detected-apps"></div>
</body>
</html>

@ -1,521 +0,0 @@
(function() {
'use strict';
var
w = require('wappalyzer').wappalyzer,
{Cc, Ci} = require('chrome'),
headersCache = {},
categoryNames = {},
windows = [],
Window,
Tab,
Panel,
Button,
button,
pageMod,
UrlBar;
exports.main = function(options, callbacks) {
w.log('main: ' + options.loadReason);
w.init();
};
exports.onUnload = function(reason) {
var win;
w.log('unload: ' + reason);
for each ( win in windows ) {
win.destroy();
}
};
Window = function(win) {
var
self = this,
tab;
w.log('new Window');
this.window = win;
this.tabs = {};
this.urlBar = null;
if ( button ) {
button.destroy();
}
if ( require('sdk/simple-prefs').prefs.urlbar ) {
this.urlBar = new UrlBar(this.window);
} else {
button = new Button();
}
require('sdk/simple-prefs').on('urlbar', function() {
self.destroy();
if ( button ) {
button.destroy();
}
if ( require('sdk/simple-prefs').prefs.urlbar ) {
self.urlBar = new UrlBar(this.window);
} else {
button = new Button();
}
self.displayApps();
});
for each ( tab in this.window.tabs ) {
this.tabs[tab.id] = new Tab(tab);
}
this.window.tabs
.on('open', function(tab) {
self.tabs[tab.id] = new Tab(tab);
})
.on('close', function(tab) {
self.tabs[tab.id] = null;
})
.on('activate', function(tab) {
self.displayApps();
});
self.displayApps();
};
Window.prototype.displayApps = function() {
var
self = this,
tab = this.window.tabs.activeTab,
url,
count = 0,
message = {};
w.log('Window.displayApps');
if ( !tab || require('sdk/tabs').activeTab !== tab ) {
return;
}
url = tab.url.replace(/#.*$/, '');
count = w.detected[url] ? Object.keys(w.detected[url]).length : 0;
this.tabs[tab.id].count = count;
this.tabs[tab.id].appsDetected = w.detected[url];
message = {
tabs: this.tabs[tab.id],
apps: w.apps,
categories: w.categories,
categoryNames: categoryNames
};
if ( this.urlBar ) {
this.urlBar.clear();
// Add icons
if ( count ) {
for ( appName in this.tabs[tab.id].appsDetected ) {
this.urlBar.addIcon(appName);
}
} else {
this.urlBar.addIcon();
}
this.urlBar.panel.get().port.emit('displayApps', message);
}
if ( button ) {
button.setIcon();
if ( count ) {
var
appName,
found = false;
// Find the main application to display
w.driver.categoryOrder.forEach(function(match) {
for ( appName in w.detected[url] ) {
w.apps[appName].cats.forEach(function(cat) {
if ( cat == match && !found ) {
button.setIcon(appName);
found = true;
}
});
}
});
}
button.panel.get().port.emit('displayApps', message);
}
};
Window.prototype.destroy = function() {
if ( this.urlBar ) {
this.urlBar.destroy();
this.urlBar = null;
}
};
pageMod = require('sdk/page-mod');
pageMod.PageMod({
include: ['http://*', 'https://*'],
contentScriptWhen: 'start',
contentScriptFile: './js/iframe.js',
onAttach: function(worker) {
worker.port.on('ad_log', function(message) {
w.adCache.push(message.subject);
});
}
});
Tab = function(tab) {
tab.on('ready', function(tab) {
var worker = tab.attach({
contentScriptFile: require('sdk/self').data.url('js/tab.js')
});
worker.port.on('analyze', function(message) {
var url = message.url.replace(/#.*$/, '');
if ( typeof headersCache[url] !== 'undefined' ) {
message.analyze.headers = headersCache[url];
}
w.analyze(message.hostname, url, message.analyze);
});
worker.port.on('log', function(message) {
w.log('[ tab.js ] ' + message);
});
});
};
Panel = function() {
var self = this;
this.panel = require('sdk/panel').Panel({
width: 250,
height: 50,
contentURL: require('sdk/self').data.url('panel.html'),
contentScriptFile: require('sdk/self').data.url('js/panel.js'),
position: { right: 30, top: 30 },
onHide: function() {
if ( button ) {
button.get().state('window', { checked: false });
}
}
});
this.panel.port.on('resize', function(height) {
self.panel.height = height;
});
this.panel.port.on('goToUrl', function(url) {
self.panel.hide();
w.driver.goToURL({ url: w.config.websiteURL + url, medium: 'panel' });
});
};
Panel.prototype.get = function() {
return this.panel;
};
Panel.prototype.destroy = function() {
this.panel.destroy();
};
Button = function() {
var self = this;
this.panel = new Panel();
this.button = require('sdk/ui/button/toggle').ToggleButton({
id: 'wappalyzer',
label: 'Wappalyzer',
icon: './images/icon32.png',
onChange: function(state) {
if ( state.checked ) {
self.panel.get().show({ position: self.button });
}
}
});
};
Button.prototype.setIcon = function(appName) {
var url = typeof appName === 'undefined' ? './images/icon32.png' : './images/icons/' + w.apps[appName].icon;
this.button.icon = url;
};
Button.prototype.get = function() {
return this.button;
};
Button.prototype.destroy = function() {
this.panel.destroy();
this.button.destroy();
};
UrlBar = function(window) {
var self = this;
this.panel = new Panel();
this.onClick = function() {
self.panel.get().show();
}
// Can't get document from sdk/windows. Use active window instead.
// This breaks switching between URL bar and button with multiple windows open
this.document = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator)
.getMostRecentWindow('navigator:browser').document;
if ( this.document.getElementById('wappalyzer-urlbar') ) {
this.urlBar = this.document.getElementById('wappalyzer-urlbar');
return;
}
//
this.urlBar = this.document.createElement('hbox');
this.urlBar.setAttribute('id', 'wappalyzer-urlbar');
this.urlBar.setAttribute('style', 'cursor: pointer; margin: 0 2px;');
this.urlBar.setAttribute('tooltiptext', require('sdk/l10n').get('name'));
this.urlBar.addEventListener('click', this.onClick);
this.document.getElementById('urlbar-icons').appendChild(this.urlBar);
};
UrlBar.prototype.get = function() {
return this.urlBar;
};
UrlBar.prototype.addIcon = function(appName) {
var
icon = this.document.createElement('image'),
url = typeof appName === 'undefined' ? 'images/icon32.png' : 'images/icons/' + w.apps[appName].icon,
tooltipText = ( typeof appName !== 'undefined' ? appName + ' - ' + require('sdk/l10n').get('clickForDetails') + ' - ' : '' ) + require('sdk/l10n').get('name');
icon.setAttribute('src', require('sdk/self').data.url(url));
icon.setAttribute('class', 'wappalyzer-icon');
icon.setAttribute('width', '16');
icon.setAttribute('height', '16');
icon.setAttribute('style', 'margin: 0 1px;');
icon.setAttribute('tooltiptext', tooltipText);
this.get().appendChild(icon);
return this;
};
UrlBar.prototype.clear = function() {
var icons;
do {
icons = this.get().getElementsByClassName('wappalyzer-icon');
if ( icons.length ) {
this.get().removeChild(icons[0]);
}
} while ( icons.length );
return this;
};
UrlBar.prototype.destroy = function() {
this.panel.destroy();
this.urlBar.removeEventListener('click', this.onClick);
this.urlBar.remove();
return this;
}
w.driver = {
timeout: 1000,
/**
* Log messages to console
*/
log: function(args) {
console.log('[wappalyzer ' + args.type + '] ' + args.message);
},
/**
* Initialize
*/
init: function(callback) {
var
id,
version,
win,
httpRequestObserver,
json = JSON.parse(require('sdk/self').data.load('apps.json'));
w.log('driver.init');
try {
version = require('sdk/self').version;
if ( !require('sdk/simple-storage').storage.version ) {
w.driver.goToURL({ url: w.config.websiteURL + 'installed', medium: 'install' });
} else if ( version !== require('sdk/simple-storage').storage.version ) {
w.driver.goToURL({ url: w.config.websiteURL + 'upgraded', medium: 'upgrade', background: true });
}
require('sdk/simple-storage').storage.version = version;
} catch(e) { }
w.apps = json.apps;
w.categories = json.categories;
for ( id in w.categories ) {
categoryNames[id] = require('sdk/l10n').get('cat' + id);
}
require('sdk/windows').browserWindows
.on('open', function(win) {
windows.push(new Window(win));
});
for each ( win in require('sdk/windows').browserWindows ) {
windows.push(new Window(win));
}
httpRequestObserver = {
init: function() {
var observerService = Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService);
observerService.addObserver(this, 'http-on-examine-response', false);
},
observe: function(subject, topic, data) {
if ( topic == 'http-on-examine-response' ) {
subject.QueryInterface(Ci.nsIHttpChannel);
this.onExamineResponse(subject);
}
},
onExamineResponse: function (subject) {
var uri = subject.URI.spec.replace(/#.*$/, ''); // Remove hash
if ( headersCache.length > 50 ) {
headersCache = {};
}
if ( subject.contentType === 'text/html' ) {
if ( typeof headersCache[uri] === 'undefined' ) {
headersCache[uri] = {};
}
subject.visitResponseHeaders(function(header, value) {
headersCache[uri][header.toLowerCase()] = value;
});
}
}
};
httpRequestObserver.init();
},
goToURL: function(args) {
var url = args.url + ( typeof args.medium === 'undefined' ? '' : '?pk_campaign=firefox&pk_kwd=' + args.medium);
require('sdk/tabs').open({ url: url, inBackground: typeof args.background !== 'undefined' && args.background });
},
ping: function() {
var Request = require('sdk/request').Request, post;
if ( Object.keys(w.ping.hostnames).length && require('sdk/simple-prefs').prefs.tracking ) {
post = function(url, data) {
Request({
url: url,
content: { json: JSON.stringify(data) },
onComplete: function (response) {
w.log('w.driver.ping: status ' + response.status);
}
}).post();
};
//post('http://ping.wappalyzer.com/ping/v2/', w.ping);
post('http://wappalyzer.local/ping/v3/', w.ping);
w.log('w.driver.ping: ' + JSON.stringify(w.ping));
w.ping = { hostnames: {} };
post('https://ad.wappalyzer.com/log/wp/', w.adCache);
w.adCache = [];
}
},
displayApps: function() {
var win;
for each ( win in windows ) {
win.displayApps();
}
},
categoryOrder: [ // Used to pick the main application
1, // CMS
11, // Blog
6, // Web Shop
2, // Message Board
51, // Landing Page Builder
8, // Wiki
13, // Issue Tracker
30, // Web Mail
18, // Web Framework
21, // LMS
7, // Photo Gallery
38, // Media Server
3, // Database Manager
34, // Database
4, // Documentation Tool
9, // Hosting Panel
29, // Search Engine
12, // JavaScript Framework
26, // Mobile Framework
25, // JavaScript Graphics
22, // Web Server
27, // Programming Language
28, // Operating System
15, // Comment System
20, // Editor
41, // Payment Processor
10, // Analytics
32, // Marketing Automation
31, // CDN
23, // Cache Tool
17, // Font Script
24, // Rich Text Editor
35, // Map
5, // Widget
14, // Video Player
16, // Captcha
33, // Web Server Extension
37, // Network Device
39, // Webcam
40, // Printer
36, // Advertising Network
42, // Tag Managers
43, // Paywalls
19 // Miscellaneous
]
};
}());

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 613 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 634 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Keine Applikationen erkannt
clickForDetails = Klicken für Details
preferences = Weitere Optionen ...
categories = Kategorienverwaltung
tracking_title = Tracken
tracking_description = Sende anonyme Reports über gefundene Applikationen zu Forschungszwecken an wappalyzer.com
urlbar_title = Display icons in URL bar
urlbar_description = Uncheck to display toolbar button.
feedback = Feedback
github = Github
twitter = Twitter
website = Zu wappalyzer.com browsen
cat1 = CMS
cat2 = Message Board
cat3 = Datenbank-Manager
cat4 = Dokumentationstool
cat5 = Widget
cat6 = eCommerce
cat7 = Fotogallery
cat8 = Wiki
cat9 = Hosting Panel
cat10 = Analytics
cat11 = Blog
cat12 = JavaScript Framework
cat13 = Issue Tracker
cat14 = Video Player
cat15 = Kommentarsystem
cat16 = CAPTCHA
cat17 = Font Script
cat18 = Web Framework
cat19 = Diverses
cat20 = Editor
cat21 = LMS
cat22 = Web-Server
cat23 = Cache Tool
cat24 = Rich Text Editor
cat25 = JavaScript Graphics
cat26 = Mobile Framework
cat27 = Programmiersprache
cat28 = Betriebssystem
cat29 = Such-Engine
cat30 = Web mail
cat31 = CDN
cat32 = Marketing Automation
cat33 = Web-Server-Erweiterung
cat34 = Datenbank
cat35 = Karte
cat36 = Werbenetzwerk
cat37 = Netzwerkgerät
cat38 = Medienserver
cat39 = Webcam
cat40 = Drucker
cat41 = Payment Processor
cat42 = Tag Manager
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Fernzugriff
cat47 = Development Tool
cat48 = Netzwerkspeicher
cat49 = Feed-Leser
cat50 = Document Management Systems
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Δεν ανιχνεύθηκαν εφαρμογές
clickForDetails = Κάντε κλικ για λεπτομέρειες
preferences = Ρυθμίσεις
categories = Κατηγορίες
tracking_title = Παρακολούθηση
tracking_description = Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα
urlbar_title = Προβολή εικονιδίων στη μπάρα διεύθυνσης
urlbar_description = Αποεπιλέξτε για να εμφανίσετε το κουμπί της εργαλειοθήκης.
feedback = Feedback
github = Github
twitter = Twitter
website = Πήγαινε στο wappalyzer.com
cat1 = CMS
cat2 = Διαδικτυακό Φόρουμ
cat3 = Διαχειριστής Βάσης Δεδομένων
cat4 = Εργαλείο Τεκμηρίωσης
cat5 = Widget
cat6 = eCommerce
cat7 = Gallery Φωτογραφιών
cat8 = Wiki
cat9 = Hosting Panel
cat10 = Analytics
cat11 = Blog
cat12 = Framework της JavaScript
cat13 = Πρόγραμμα Παρακολούθησης Προβλημάτων
cat14 = Πρόγραμμα αναπαραγωγής Βίντεο
cat15 = Σύστημα Σχολίων
cat16 = CAPTCHA
cat17 = Script Γραμματοσειράς
cat18 = Framework Διαδικτύου
cat19 = Διάφορα
cat20 = Επεξεργαστής Κειμένου
cat21 = LMS
cat22 = Διακομιστής Διαδικτύου
cat23 = Εργαλείο Μνήμης Cache
cat24 = Επεξεργαστής Εμπλουτισμένου Κειμένου
cat25 = Γραφικά JavaScript
cat26 = Framework για Κινητά
cat27 = Γλώσσα Προγραμματισμού
cat28 = Λειτουργικό Σύστημα
cat29 = Μηχανή Αναζήτησης
cat30 = Web Mail
cat31 = CDN
cat32 = Αυτοματοποίηση Marketing
cat33 = Επέκταση Διακομιστή Διαδικτύου
cat34 = Βάση Δεδομένων
cat35 = Χάρτης
cat36 = Δίκτυο Διαφημίσεων
cat37 = Υπηρεσία Δικτύου
cat38 = Διακομιστής Πολυμέσων
cat39 = Διαδικτυακή κάμερα
cat40 = Εκτυπωτής
cat41 = Σύστημα Επεξεργασίας Πληρωμών
cat42 = Σύστημα Διαχείρισης Tags
cat43 = Paywall
cat44 = Σύστημα Build/CI
cat45 = Σύστημα SCADA
cat46 = Απομακρυσμένη Πρόσβαση
cat47 = Εργαλείο Ανάπτυξης
cat48 = Δικτυακός Αποθηκευτικός Χώρος
cat49 = Feed Readers
cat50 = Συστήματα Διαχειρίσης Εγγράφων
cat51 = Σύστημα Κατασκευής Σελίδων Υποδοχής
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = No applications detected
clickForDetails = Click for details
preferences = Options
categories = Categories
tracking_title = Tracking
tracking_description = Anonymously send reports on detected applications to wappalyzer.com for analysis
urlbar_title = Display icons in URL bar
urlbar_description = Uncheck to display toolbar button.
feedback = Feedback
github = Github
twitter = Twitter
website = Go to wappalyzer.com
cat1 = CMS
cat2 = Message Board
cat3 = Database Manager
cat4 = Documentation Tool
cat5 = Widget
cat6 = eCommerce
cat7 = Photo Gallery
cat8 = Wiki
cat9 = Hosting Panel
cat10 = Analytics
cat11 = Blog
cat12 = JavaScript Framework
cat13 = Issue Tracker
cat14 = Video Player
cat15 = Comment System
cat16 = CAPTCHA
cat17 = Font Script
cat18 = Web Framework
cat19 = Miscellaneous
cat20 = Editor
cat21 = LMS
cat22 = Web Server
cat23 = Cache Tool
cat24 = Rich Text Editor
cat25 = JavaScript Graphics
cat26 = Mobile Framework
cat27 = Programming Language
cat28 = Operating System
cat29 = Search Engine
cat30 = Web Mail
cat31 = CDN
cat32 = Marketing Automation
cat33 = Web Server Extension
cat34 = Database
cat35 = Map
cat36 = Advertising Network
cat37 = Network Device
cat38 = Media Server
cat39 = Webcam
cat40 = Printer
cat41 = Payment Processor
cat42 = Tag Manager
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Remote Access
cat47 = Development Tool
cat48 = Network Storage
cat49 = Feed Readers
cat50 = Document Management Systems
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = No applications detected
clickForDetails = Click for details
preferences = Options
categories = Categories
tracking_title = Tracking
tracking_description = Anonymously send reports on detected applications to wappalyzer.com for analysis
urlbar_title = Display icons in URL bar
urlbar_description = Uncheck to display toolbar button.
feedback = Feedback
github = Github
twitter = Twitter
website = Go to wappalyzer.com
cat1 = CMS
cat2 = Message Board
cat3 = Database Manager
cat4 = Documentation Tool
cat5 = Widget
cat6 = eCommerce
cat7 = Photo Gallery
cat8 = Wiki
cat9 = Hosting Panel
cat10 = Analytics
cat11 = Blog
cat12 = JavaScript Framework
cat13 = Issue Tracker
cat14 = Video Player
cat15 = Comment System
cat16 = CAPTCHA
cat17 = Font Script
cat18 = Web Framework
cat19 = Miscellaneous
cat20 = Editor
cat21 = LMS
cat22 = Web Server
cat23 = Cache Tool
cat24 = Rich Text Editor
cat25 = JavaScript Graphics
cat26 = Mobile Framework
cat27 = Programming Language
cat28 = Operating System
cat29 = Search Engine
cat30 = Web Mail
cat31 = CDN
cat32 = Marketing Automation
cat33 = Web Server Extension
cat34 = Database
cat35 = Map
cat36 = Advertising Network
cat37 = Network Device
cat38 = Media Server
cat39 = Webcam
cat40 = Printer
cat41 = Payment Processor
cat42 = Tag Manager
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Remote Access
cat47 = Development Tool
cat48 = Network Storage
cat49 = Feed Readers
cat50 = Document Management Systems
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Aplicaciones no detectadas
clickForDetail = Clic para detalles
preferences = Opciones
categories = Categorías
tracking_title = Seguimiento
tracking_description = Enviar informes anónimos sobre las aplicaciones detectadas a wappalyzer.com para análisis
urlbar_title = Display icons in URL bar
urlbar_description = Uncheck to display toolbar button.
feedback = Opinión
github = Github
twitter = Twitter
website = Ir a wappalyzer.com
cat1 = Gestor de Contenido
cat2 = Foro
cat3 = estor de Bases de Datos
cat4 = Herramienta de Documentación
cat5 = Widget
cat6 = Tienda Web
cat7 = Galería fotográfica
cat8 = Wiki
cat9 = Panel de Hosting
cat10 = Analítica
cat11 = Blog
cat12 = Framework JavaScript
cat13 = Gestor de Incidencias
cat14 = Reproductor de Vídeo
cat15 = Sistema de Comentarios
cat16 = CAPTCHA
cat17 = Tipografía
cat18 = Framework Web
cat19 = Miscelánea
cat20 = Editor
cat21 = LMS
cat22 = Servidor Web
cat23 = Herramienta de Cache
cat24 = Editor de Texto Enriquecido
cat25 = Gráficos JavaScript
cat26 = Framework Móvil
cat27 = Lenguaje de programación
cat28 = Sistema Operativo
cat29 = Motor de Búsqueda
cat30 = Correo Web
cat31 = CDN
cat32 = Automatización de Marketing
cat33 = Extensión de Servidor Web
cat34 = Base de Datos
cat35 = Mapa
cat36 = Red de Publicidad
cat37 = Dispositivo de Red
cat38 = Servidores de Contenido
cat39 = Webcam
cat40 = Impresora
cat41 = Payment Processor
cat42 = Tag Manager
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Remote Access
cat47 = Development Tool
cat48 = Network Storage
cat49 = Feed Readers
cat50 = Document Management Systems
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Pas d'applications détectées
clickForDetails = Cliquer pour plus de détails
preferences = Plus d'options...
categories = Gérer les catégories
tracking_title = Traçage
tracking_description = Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour la recherche
urlbar_title = Afficher les icônes dans la barre d'adresse
urlbar_description = Décocher pour afficher le bouton dans la barre des modules
feedback = Donner votre avis
github = Github
twitter = Twitter
website = Aller sur wappalyzer.com
cat1 = CMS
cat2 = Forum
cat3 = Gestionnaire de base de données
cat4 = Outil de documentation
cat5 = Widget
cat6 = Boutique en ligne
cat7 = Galerie photo
cat8 = Wiki
cat9 = Gestionnaire de serveur
cat10 = Outil de statistiques
cat11 = Blog
cat12 = Framework JavaScript
cat13 = Outils de suivi de problèmes
cat14 = Lecteur de vidéos
cat15 = Système de commentaires
cat16 = CAPTCHA
cat17 = Script de police
cat18 = Framework web
cat19 = Divers
cat20 = Editeur
cat21 = LMS
cat22 = Serveur web
cat23 = Outil de cache
cat24 = Editeur WYSIWYG
cat25 = Graphismes JavaScript
cat26 = Framework pour mobiles
cat27 = Language de programmation
cat28 = Système d'exploitation
cat29 = Moteur de recherche
cat30 = Web Mail
cat31 = CDN
cat32 = Logiciel de marketing
cat33 = Extension de serveur web
cat34 = Base de données
cat35 = Carte
cat36 = Réseau publicitaire
cat37 = Périphérique réseau
cat38 = Serveur multimédia
cat39 = Webcam
cat40 = Imprimante
cat41 = Service de paiement
cat42 = Tag Manager
cat43 = Paywall
cat44 = Système CI
cat45 = Système SCADA
cat46 = Accès à distance
cat47 = Outil de développement
cat48 = Stockage réseau
cat49 = Lecteur RSS
cat50 = Système de gestion de documents
cat51 = Landing Page Builder
cat52 = Chat en direct

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Nessuna applicazione rilevata
clickForDetails = Clicca per i dettagli
preferences = Opzioni
categories = Categorie
tracking_title = Tracking
tracking_description = Inviare anonimamente un report sulle applicazioni rilevate a wappalyzer.com per l'analisi
urlbar_title = Mostra le icone nella barra delle URL
urlbar_description = Deselezionare per visualizzare il pulsante nella barra degli strumenti.
feedback = Feedback
github = Github
twitter = Twitter
website = Vai su wappalyzer.com
cat1 = CMS
cat2 = Forum
cat3 = Gestore di database
cat4 = Strumento di documentazione
cat5 = Widget
cat6 = eCommerce
cat7 = Galleria fotografica
cat8 = Wiki
cat9 = Pannello Hosting
cat10 = Analytics
cat11 = Blog
cat12 = Framework JavaScript
cat13 = Issue Tracker
cat14 = Player Video
cat15 = Sistema di commenti
cat16 = CAPTCHA
cat17 = Font Script
cat18 = Framework Web
cat19 = Miscellanea
cat20 = Editor
cat21 = LMS
cat22 = Web Server
cat23 = Cache Tool
cat24 = Editor di Testo Ricco
cat25 = JavaScript Graphics
cat26 = Framework Mobile
cat27 = Linguaggio di Programmazione
cat28 = Sistema Operativo
cat29 = Motore di Ricerca
cat30 = Web Mail
cat31 = CDN
cat32 = Marketing Automation
cat33 = Estensione Web Server
cat34 = Database
cat35 = Mappa
cat36 = Network Pubblicitario
cat37 = Network Device
cat38 = Media Server
cat39 = Webcam
cat40 = Stampante
cat41 = Payment Processor
cat42 = Tag Manager
cat43 = Paywall
cat44 = Sistema Build/CI
cat45 = SCADA System
cat46 = Accesso Remoto
cat47 = Strumenti di Sviluppo
cat48 = Network Storage
cat49 = Lettore di Feed
cat50 = Sistema di Gestione Documenti
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Geen applicaties gedetecteerd
clickForDetails = Klik voor details
preferences = Meer opties…
categories = Beheer categoriën
tracking_title = Tracking
tracking_description = Verzend anonieme informatie over applicaties naar wappalyzer.com voor onderzoek
urlbar_title = Laat iconen in de adresbalk zien
urlbar_description = Uncheck to display toolbar button.
feedback = Feedback
github = Github
twitter = Twitter
website = Ga naar wappalyzer.com
cat1 = CMS
cat2 = Forum
cat3 = Database Manager
cat4 = Documentatie Tool
cat5 = Widget
cat6 = Webwinkel
cat7 = Fotogalerij
cat8 = Wiki
cat9 = Hosting Paneel
cat10 = Analytics
cat11 = Blog
cat12 = JavaScript Framework
cat13 = Issue Tracker
cat14 = Videospeler
cat15 = Reactiesysteem
cat16 = CAPTCHA
cat17 = Font Script
cat18 = Web Framework
cat19 = Overige
cat20 = Editor
cat21 = LMS
cat22 = Webserver
cat23 = Cache Tool
cat24 = Rich Text Editor
cat25 = JavaScript Graphics
cat26 = Mobiel Framework
cat27 = Programmeertaal
cat28 = Besturingssysteem
cat29 = Zoekmachine
cat30 = Webmail
cat31 = CDN
cat32 = Marketing Automatisering
cat33 = Web Server Extensie
cat34 = Database
cat35 = Landkaart
cat36 = Advertentienetwerk
cat37 = Netwerk Apparaat
cat38 = Media Server
cat39 = Webcam
cat40 = Printer
cat41 = Betalingsverwerker
cat42 = Tag Manager
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Remote Access
cat47 = Development Tool
cat48 = Network Storage
cat49 = Feed Readers
cat50 = Document Management Systems
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,65 +0,0 @@
name = Wappalyzer
noAppsDetected = Nici o aplicație detectată
clickForDetails = Click pentru detalii
preferences = Opțiuni
categories = Categorii
tracking_title = Analiză
tracking_description = Trimite rapoarte anonime despre aplicațiile detectate către wappalyzer.com pentru cercetare
urlbar_title = Afișează iconițe în bara URL
urlbar_description = Debifează pentru a arăta butonul în toolbar.
feedback = Părere
github = Github
twitter = Twitter
website = Mergi la wappalyzer.com
cat1 = CMS
cat2 = Forum de discuții
cat3 = Manager baze de date
cat4 = Unealtă pentru documentare
cat5 = Widget
cat10 = Analiză trafic web
cat11 = Blog
cat12 = Framework JavaScript
cat13 = Tracker probleme
cat14 = Player Video
cat15 = Sistem de comentarii
cat16 = Verificare Captcha
cat17 = Script pentru fonturi
cat18 = Framework Web
cat19 = Divers
cat20 = Editor
cat21 = LMS
cat22 = Server Web
cat23 = Unealtă Cache
cat24 = Editor Texte Rich
cat25 = Grafică JavaScript
cat26 = Framework Mobile
cat27 = Limbaj de programare
cat28 = Sistem de operare
cat29 = Motor de căutare
cat30 = Poștă electronică
cat31 = CDN
cat32 = Automatizare marketing
cat33 = Extensie server web
cat34 = Bază de date
cat35 = Hartă
cat36 = Rețea de advertising
cat37 = Serviciu rețea
cat38 = Server Media
cat39 = Webcam
cat40 = Imprimantă
cat41 = Sistem de plată
cat42 = Manager cuvinte cheie
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Remote Access
cat47 = Development Tool
cat48 = Network Storage
cat49 = Feed Readers
cat50 = Document Management Systems
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Нет данных о сайте
clickForDetails = Щелкните, чтобы посмотреть детально
preferences = Настройки Wappalyzer
categories = Категории
tracking_title = Слежение
tracking_description = Анонимно отправлять статистику распознанных данных на сервер (для улучшения расширения)
urlbar_title = Отображать иконку в строке URL
urlbar_description = Снимите галочку, чтобы отображать кнопку на панели
feedback = Обратная связь
github = Форкнуть на GitHub!
twitter = Следите за новостями в Твиттере
website = Перейти на Wappalyzer.com
cat1 = CMS
cat2 = Форум
cat3 = Менеджер БД
cat4 = Документация
cat5 = Виджет
cat6 = Электронная коммерция
cat7 = Фотогалерея
cat8 = Wiki
cat9 = Панель хостинга
cat10 = Аналитика
cat11 = Блог
cat12 = JS фреймворк
cat13 = Баг трекер
cat14 = Видео плеер
cat15 = Система комментариев
cat16 = Капча
cat17 = Шрифт
cat18 = Веб фреймворк
cat19 = Прочее
cat20 = HTML редактор
cat21 = LMS
cat22 = Веб сервер
cat23 = Кеширование
cat24 = WYSIWYG редактор
cat25 = JS графика
cat26 = Мобильный фреймворк
cat27 = Язык программирования
cat28 = Операционная система
cat29 = Поисковый движок
cat30 = Веб почта
cat31 = CDN
cat32 = Управление маркетингом
cat33 = Расширение Веб сервера
cat34 = База данных
cat35 = Карта
cat36 = Рекламная сеть
cat37 = Сетевая служба
cat38 = Медиа сервер
cat39 = Вебкамера
cat40 = Принтер
cat41 = Провайдер платежей
cat42 = Менеджер тэгов
cat43 = Paywall
cat44 = Система непрерывной интеграции
cat45 = Система SCADA
cat46 = Удаленное управление
cat47 = Утилита для разработчиков
cat48 = Сетевое хранилище
cat49 = Граббер контента
cat50 = Управление документами
cat51 = Генератор лендингов
cat52 = Live Chat

@ -1,29 +0,0 @@
{
"name": "wappalyzer",
"title": "Wappalyzer",
"homepage": "https://wappalyzer.com",
"icon": "images/icon48_hot.png",
"icon64": "images/icon64_hot.png",
"id": "wappalyzer@crunchlabz.com",
"description": "Identifies software on the web",
"author": "Elbert Alias",
"license": "GPLv3",
"version": "3.2.8",
"main": "driver.js",
"preferences": [{
"name": "tracking",
"title": "Tracking",
"description": "Anonymously send reports on detected applications to wappalyzer.com for analysis",
"type": "bool",
"value": true
}, {
"name": "urlbar",
"title": "Display icons in URL bar",
"description": "Uncheck to display toolbar button.",
"type": "bool",
"value": true
}],
"permissions": {
"private-browsing": true
}
}

@ -1,3 +1,10 @@
/**
* PhantomJS driver
*/
/** global: phantom */
/** global: wappalyzer */
(function() { (function() {
var var
url, url,
@ -5,8 +12,8 @@
scriptDir, scriptDir,
scriptPath = require('fs').absolute(require('system').args[0]), scriptPath = require('fs').absolute(require('system').args[0]),
resourceTimeout = 9000, resourceTimeout = 9000,
args = [], args = [], // TODO: Not used, maybe should be `arg`
debug = false; // Output debug messages debug = false, // Output debug messages
quiet = false; // Don't output errors quiet = false; // Don't output errors
try { try {
@ -15,8 +22,10 @@
require('fs').changeWorkingDirectory(scriptDir); require('fs').changeWorkingDirectory(scriptDir);
require('system').args.forEach(function(arg, i) { require('system').args.forEach(function(arg) {
var arr = /^(--[^=]+)=(.+)$/.exec(arg); var
value,
arr = /^(--[^=]+)=(.+)$/.exec(arg);
if ( arr && arr.length === 3 ) { if ( arr && arr.length === 3 ) {
arg = arr[1]; arg = arr[1];
@ -35,7 +44,9 @@
break; break;
case '--resource-timeout': case '--resource-timeout':
if ( value ) {
resourceTimeout = value; resourceTimeout = value;
}
break; break;
default: default:
@ -73,30 +84,28 @@
displayApps: function() { displayApps: function() {
var var
app, cats, app, cats,
apps = [], apps = [];
count = wappalyzer.detected[url] ? Object.keys(wappalyzer.detected[url]).length : 0;
wappalyzer.log('driver.displayApps'); wappalyzer.log('driver.displayApps');
if ( count ) {
for ( app in wappalyzer.detected[url] ) { for ( app in wappalyzer.detected[url] ) {
cats = []; cats = [];
wappalyzer.apps[app].cats.forEach(function(cat) { wappalyzer.apps[app].cats.forEach(function(cat) {
cats.push(wappalyzer.categories[cat]); cats.push(wappalyzer.categories[cat].name);
}); });
apps.push({ apps.push({
name: app, name: app,
confidence: wappalyzer.detected[url][app].confidenceTotal, confidence: wappalyzer.detected[url][app].confidenceTotal.toString(),
version: wappalyzer.detected[url][app].version, version: wappalyzer.detected[url][app].version,
icon: wappalyzer.apps[app].icon, icon: wappalyzer.apps[app].icon || 'default.svg',
website: wappalyzer.apps[app].website,
categories: cats categories: cats
}); });
} }
wappalyzer.driver.sendResponse(apps); wappalyzer.driver.sendResponse(apps);
}
}, },
/** /**
@ -114,7 +123,7 @@
init: function() { init: function() {
var var
page, hostname, page, hostname,
headers = {}; headers = {},
a = document.createElement('a'), a = document.createElement('a'),
json = JSON.parse(require('fs').read('apps.json')); json = JSON.parse(require('fs').read('apps.json'));
@ -166,7 +175,7 @@
}; };
page.open(url, function(status) { page.open(url, function(status) {
var html, environmentVars; var html, environmentVars = '';
if ( status === 'success' ) { if ( status === 'success' ) {
html = page.content; html = page.content;
@ -177,7 +186,7 @@
// Collect environment variables // Collect environment variables
environmentVars = page.evaluate(function() { environmentVars = page.evaluate(function() {
var i, environmentVars; var i, environmentVars = '';
for ( i in window ) { for ( i in window ) {
environmentVars += i + ' '; environmentVars += i + ' ';

@ -6,7 +6,7 @@ const
phantomjs = require('phantomjs-prebuilt'); phantomjs = require('phantomjs-prebuilt');
exports.run = function(args, callback) { exports.run = function(args, callback) {
args.unshift.apply(args, ['driver.js', '--web-security=false', '--load-images=false', '--ignore-ssl-errors=yes', '--ssl-protocol=any']); args.unshift.apply(args, [path.join(__dirname, 'driver.js'), '--web-security=false', '--load-images=false', '--ignore-ssl-errors=yes', '--ssl-protocol=any']);
var driver = phantomjs.exec.apply(this, args); var driver = phantomjs.exec.apply(this, args);

@ -2,7 +2,7 @@
"name": "wappalyzer", "name": "wappalyzer",
"description": "Uncovers the technologies used on websites", "description": "Uncovers the technologies used on websites",
"homepage": "https://github.com/AliasIO/Wappalyzer", "homepage": "https://github.com/AliasIO/Wappalyzer",
"version": "3.0.7", "version": "4.1.0",
"author": "Elbert Alias", "author": "Elbert Alias",
"license": "GPL-3.0", "license": "GPL-3.0",
"repository": { "repository": {

@ -0,0 +1,6 @@
/apps.json
/images/icons/converted/*
/images/icons/*
/js/wappalyzer.js
/js/iframe.js
/js/network.js

@ -6,6 +6,7 @@
"optionsSave": { "message": "Ρυθμίσεις αποθήκευσης" }, "optionsSave": { "message": "Ρυθμίσεις αποθήκευσης" },
"optionsSaved": { "message": "Αποθηκεύτηκε" }, "optionsSaved": { "message": "Αποθηκεύτηκε" },
"optionUpgradeMessage": { "message": "Ενημερώστε με για αναβαθμίσεις" }, "optionUpgradeMessage": { "message": "Ενημερώστε με για αναβαθμίσεις" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα" }, "optionTracking": { "message": "Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα" },
"nothingToDo": { "message": "Καμία ενέργεια." }, "nothingToDo": { "message": "Καμία ενέργεια." },
"noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." }, "noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },
@ -56,5 +57,6 @@
"categoryName49": { "message": "Feed Readers" }, "categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Συστήματα Διαχειρίσης Εγγράφων" }, "categoryName50": { "message": "Συστήματα Διαχειρίσης Εγγράφων" },
"categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" }, "categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" },
"categoryName52": { "message": "Live Chat" } "categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }
} }

@ -2,10 +2,11 @@
"github": { "message": "Fork Wappalyzer on GitHub!" }, "github": { "message": "Fork Wappalyzer on GitHub!" },
"twitter": { "message": "Follow Wappalyzer on Twitter" }, "twitter": { "message": "Follow Wappalyzer on Twitter" },
"website": { "message": "Go to wappalyzer.com" }, "website": { "message": "Go to wappalyzer.com" },
"options": { "message": "Wappalyzer Options" }, "options": { "message": "Options" },
"optionsSave": { "message": "Save options" }, "optionsSave": { "message": "Save options" },
"optionsSaved": { "message": "Saved" }, "optionsSaved": { "message": "Saved" },
"optionUpgradeMessage": { "message": "Tell me about upgrades" }, "optionUpgradeMessage": { "message": "Tell me about upgrades" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Anonymously send reports on detected applications to wappalyzer.com for research" }, "optionTracking": { "message": "Anonymously send reports on detected applications to wappalyzer.com for research" },
"nothingToDo": { "message": "Nothing to do here." }, "nothingToDo": { "message": "Nothing to do here." },
"noAppsDetected": { "message": "No applications detected." }, "noAppsDetected": { "message": "No applications detected." },
@ -14,6 +15,10 @@
"categoryName3": { "message": "Database Manager" }, "categoryName3": { "message": "Database Manager" },
"categoryName4": { "message": "Documentation Tool" }, "categoryName4": { "message": "Documentation Tool" },
"categoryName5": { "message": "Widget" }, "categoryName5": { "message": "Widget" },
"categoryName6": { "message": "Ecommerce" },
"categoryName7": { "message": "Photo Galleries" },
"categoryName8": { "message": "Wikis" },
"categoryName9": { "message": "Hostin Panels" },
"categoryName10": { "message": "Analytics" }, "categoryName10": { "message": "Analytics" },
"categoryName11": { "message": "Blog" }, "categoryName11": { "message": "Blog" },
"categoryName12": { "message": "JavaScript Framework" }, "categoryName12": { "message": "JavaScript Framework" },
@ -56,5 +61,6 @@
"categoryName49": { "message": "Feed Readers" }, "categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Document Management Systems" }, "categoryName50": { "message": "Document Management Systems" },
"categoryName51": { "message": "Landing Page Builder" }, "categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" } "categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }
} }

@ -2,10 +2,11 @@
"github": { "message": "¡Forkea Wappalyzer en GitHub!" }, "github": { "message": "¡Forkea Wappalyzer en GitHub!" },
"twitter": { "message": "Sigue Wappalyzer en Twitter" }, "twitter": { "message": "Sigue Wappalyzer en Twitter" },
"website": { "message": "Ir a wappalyzer.com" }, "website": { "message": "Ir a wappalyzer.com" },
"options": { "message": "Opciones de Wappalyzer" }, "options": { "message": "Opciones" },
"optionsSave": { "message": "Guardar opciones" }, "optionsSave": { "message": "Guardar opciones" },
"optionsSaved": { "message": "Guardado" }, "optionsSaved": { "message": "Guardado" },
"optionUpgradeMessage": { "message": "Indicarme actualizaciones" }, "optionUpgradeMessage": { "message": "Indicarme actualizaciones" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Enviar informes anónimos sobre las aplicaciones detectadas a wappalyzer.com para análisis" }, "optionTracking": { "message": "Enviar informes anónimos sobre las aplicaciones detectadas a wappalyzer.com para análisis" },
"nothingToDo": { "message": "Nada que hacer aquí." }, "nothingToDo": { "message": "Nada que hacer aquí." },
"noAppsDetected": { "message": "Aplicaciones no detectadas." }, "noAppsDetected": { "message": "Aplicaciones no detectadas." },
@ -60,5 +61,6 @@
"categoryName49": { "message": "Feed Readers" }, "categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Document Management Systems" }, "categoryName50": { "message": "Document Management Systems" },
"categoryName51": { "message": "Landing Page Builder" }, "categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" } "categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }
} }

@ -4,7 +4,8 @@
"nothingToDo": { "message": "Rien à faire ici." }, "nothingToDo": { "message": "Rien à faire ici." },
"optionTracking": { "message": "Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour la recherche" }, "optionTracking": { "message": "Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour la recherche" },
"optionUpgradeMessage": { "message": "M'afficher les mises à jour" }, "optionUpgradeMessage": { "message": "M'afficher les mises à jour" },
"options": { "message": "Options de Wappalyzer" }, "optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"options": { "message": "Options" },
"optionsSave": { "message": "Sauver les options" }, "optionsSave": { "message": "Sauver les options" },
"optionsSaved": { "message": "Sauvé" }, "optionsSaved": { "message": "Sauvé" },
"twitter": { "message": "Suivre Wappalyzer sur Twitter" }, "twitter": { "message": "Suivre Wappalyzer sur Twitter" },
@ -60,5 +61,6 @@
"categoryName49": { "message": "Lecteur RSS" }, "categoryName49": { "message": "Lecteur RSS" },
"categoryName50": { "message": "Système de gestion de documents" }, "categoryName50": { "message": "Système de gestion de documents" },
"categoryName51": { "message": "Landing Page Builder" }, "categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Chat en direct" } "categoryName52": { "message": "Chat en direct" },
"categoryName53": { "message": "CRM" }
} }

@ -2,10 +2,11 @@
"github": { "message": "Κάνε fork το Wappalyzer στο GitHub!" }, "github": { "message": "Κάνε fork το Wappalyzer στο GitHub!" },
"twitter": { "message": "Ακολούθησε το Wappalyzer στο Twitter" }, "twitter": { "message": "Ακολούθησε το Wappalyzer στο Twitter" },
"website": { "message": "Πήγαινε στο wappalyzer.com" }, "website": { "message": "Πήγαινε στο wappalyzer.com" },
"options": { "message": "Ρυθμίσεις Wappalyzer" }, "options": { "message": "Ρυθμίσεις" },
"optionsSave": { "message": "Ρυθμίσεις αποθήκευσης" }, "optionsSave": { "message": "Ρυθμίσεις αποθήκευσης" },
"optionsSaved": { "message": "Αποθηκεύτηκε" }, "optionsSaved": { "message": "Αποθηκεύτηκε" },
"optionUpgradeMessage": { "message": "Ενημερώστε με για αναβαθμίσεις" }, "optionUpgradeMessage": { "message": "Ενημερώστε με για αναβαθμίσεις" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα" }, "optionTracking": { "message": "Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα" },
"nothingToDo": { "message": "Καμία ενέργεια." }, "nothingToDo": { "message": "Καμία ενέργεια." },
"noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." }, "noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },
@ -56,5 +57,6 @@
"categoryName49": { "message": "Feed Readers" }, "categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Συστήματα Διαχειρίσης Εγγράφων" }, "categoryName50": { "message": "Συστήματα Διαχειρίσης Εγγράφων" },
"categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" }, "categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" },
"categoryName52": { "message": "Live Chat" } "categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }
} }

@ -2,10 +2,11 @@
"github": { "message": "Fork Wappalyzer su GitHub!" }, "github": { "message": "Fork Wappalyzer su GitHub!" },
"twitter": { "message": "Follow Wappalyzer su Twitter" }, "twitter": { "message": "Follow Wappalyzer su Twitter" },
"website": { "message": "Vai su wappalyzer.com" }, "website": { "message": "Vai su wappalyzer.com" },
"options": { "message": "Opzioni Wappalyzer" }, "options": { "message": "Opzioni" },
"optionsSave": { "message": "Salva opzioni" }, "optionsSave": { "message": "Salva opzioni" },
"optionsSaved": { "message": "Salvato" }, "optionsSaved": { "message": "Salvato" },
"optionUpgradeMessage": { "message": "Parlami dell'upgrade" }, "optionUpgradeMessage": { "message": "Parlami dell'upgrade" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Inviare anonimamente un report sulle applicazioni rilevate a wappalyzer.com per l'analisi" }, "optionTracking": { "message": "Inviare anonimamente un report sulle applicazioni rilevate a wappalyzer.com per l'analisi" },
"nothingToDo": { "message": "Niente da fare qui." }, "nothingToDo": { "message": "Niente da fare qui." },
"noAppsDetected": { "message": "Nessuna applicazione rilevata." }, "noAppsDetected": { "message": "Nessuna applicazione rilevata." },
@ -60,6 +61,7 @@
"categoryName49": { "message": "Lettore di Feed" }, "categoryName49": { "message": "Lettore di Feed" },
"categoryName50": { "message": "Sistema di Gestione Documenti" }, "categoryName50": { "message": "Sistema di Gestione Documenti" },
"categoryName51": { "message": "Landing Page Builder" }, "categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" } "categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }
} }

@ -0,0 +1,62 @@
{
"github": { "message": "Sforkuj Wappalyzer na GitHub!" },
"twitter": { "message": "Obserwuj Wappalyzer na Twitterze" },
"website": { "message": "Przejdź do wappalyzer.com" },
"options": { "message": "Opcje" },
"optionsSave": { "message": "Zapisz opcje" },
"optionsSaved": { "message": "Zapisano" },
"optionUpgradeMessage": { "message": "Powiadamiaj mnie o aktualizacjach" },
"optionDynamicIcon": { "message": "Używaj loga aplikacji zamiast Wappalyzer" },
"optionTracking": { "message": "Przesyłaj anonimowe statystyki aplikacji wykrytych przez Wappalyzer do twórców" },
"nothingToDo": { "message": "Nic tu nie ma." },
"noAppsDetected": { "message": "Nie wykryto żadnych aplikacji." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Menedżer baz danych" },
"categoryName4": { "message": "Narzędzia dokumentacji" },
"categoryName5": { "message": "Widżet" },
"categoryName10": { "message": "Statystyki" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Lista problemów" },
"categoryName14": { "message": "Odtwarzacz wideo" },
"categoryName15": { "message": "System komentarzy" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Skrypt czcionek" },
"categoryName18": { "message": "Framework webowy" },
"categoryName19": { "message": "Różne" },
"categoryName20": { "message": "Edytor" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Serwer internetowy" },
"categoryName23": { "message": "Narzędzia cache" },
"categoryName24": { "message": "Edytor tekstu sformatowanego" },
"categoryName25": { "message": "Grafika JavaScript" },
"categoryName26": { "message": "Framework mobilny" },
"categoryName27": { "message": "Język programowania" },
"categoryName28": { "message": "System operacyjny" },
"categoryName29": { "message": "Silnik wyszukiwarki" },
"categoryName30": { "message": "Poczta internetowa" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Automatyzacja marketingu" },
"categoryName33": { "message": "Rozszerzenie serwera WWW" },
"categoryName34": { "message": "Baza danych" },
"categoryName35": { "message": "Mapy" },
"categoryName36": { "message": "Sieć reklamowa" },
"categoryName37": { "message": "Usługa sieciowa" },
"categoryName38": { "message": "Serwer mediów" },
"categoryName39": { "message": "Kamera internetowa" },
"categoryName40": { "message": "Drukarka" },
"categoryName41": { "message": "Procesor płatności" },
"categoryName42": { "message": "Menedżer tagów" },
"categoryName43": { "message": "Menedżer płatności" },
"categoryName44": { "message": "System Build/CI" },
"categoryName45": { "message": "System SCADA" },
"categoryName46": { "message": "Dostęp zdalny" },
"categoryName47": { "message": "Narzędzia deweloperskie" },
"categoryName48": { "message": "Magazyn sieciowy" },
"categoryName49": { "message": "Czytnik" },
"categoryName50": { "message": "Systemy zarządzania dokumentami" },
"categoryName51": { "message": "Konstruktory stron" },
"categoryName52": { "message": "Czat na żywo" },
"categoryName53": { "message": "CRM" }
}

@ -2,10 +2,11 @@
"github": { "message": "Fork-uiește Wappalyzer pe GitHub!" }, "github": { "message": "Fork-uiește Wappalyzer pe GitHub!" },
"twitter": { "message": "Urmărește Wappalyzer pe Twitter" }, "twitter": { "message": "Urmărește Wappalyzer pe Twitter" },
"website": { "message": "Mergi la wappalyzer.com" }, "website": { "message": "Mergi la wappalyzer.com" },
"options": { "message": "Opțiuni Wappalyzer" }, "options": { "message": "Opțiuni" },
"optionsSave": { "message": "Salvează opțiuni" }, "optionsSave": { "message": "Salvează opțiuni" },
"optionsSaved": { "message": "Salvat" }, "optionsSaved": { "message": "Salvat" },
"optionUpgradeMessage": { "message": "Anunță-mă dacă sunt actualizări" }, "optionUpgradeMessage": { "message": "Anunță-mă dacă sunt actualizări" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Trimite rapoarte anonime despre aplicațiile detectate către wappalyzer.com pentru cercetare" }, "optionTracking": { "message": "Trimite rapoarte anonime despre aplicațiile detectate către wappalyzer.com pentru cercetare" },
"nothingToDo": { "message": "Nimic de făcut pe pagina curentă." }, "nothingToDo": { "message": "Nimic de făcut pe pagina curentă." },
"noAppsDetected": { "message": "Nici o aplicație detectată." }, "noAppsDetected": { "message": "Nici o aplicație detectată." },
@ -56,5 +57,6 @@
"categoryName49": { "message": "Feed Readers" }, "categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Document Management Systems" }, "categoryName50": { "message": "Document Management Systems" },
"categoryName51": { "message": "Landing Page Builder" }, "categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" } "categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }
} }

@ -4,6 +4,10 @@
"categoryName3" : { "message" : "Менеджер БД" }, "categoryName3" : { "message" : "Менеджер БД" },
"categoryName4" : { "message" : "Документация" }, "categoryName4" : { "message" : "Документация" },
"categoryName5" : { "message" : "Виджет" }, "categoryName5" : { "message" : "Виджет" },
"categoryName6" : { "message" : "Электронная коммерция" },
"categoryName7" : { "message" : "Фотогалерея" },
"categoryName8" : { "message" : "Вики" },
"categoryName9" : { "message" : "Панель управления хостингом" },
"categoryName10" : { "message" : "Аналитика" }, "categoryName10" : { "message" : "Аналитика" },
"categoryName11" : { "message" : "Блог" }, "categoryName11" : { "message" : "Блог" },
"categoryName12" : { "message" : "JS фреймворк" }, "categoryName12" : { "message" : "JS фреймворк" },
@ -35,7 +39,7 @@
"categoryName38" : { "message" : "Медиа сервер" }, "categoryName38" : { "message" : "Медиа сервер" },
"categoryName39" : { "message" : "Вебкамера" }, "categoryName39" : { "message" : "Вебкамера" },
"categoryName40" : { "message" : "Принтер" }, "categoryName40" : { "message" : "Принтер" },
"categoryName41" : { "message" : ровайдер платежей" }, "categoryName41" : { "message" : латёжная система" },
"categoryName42" : { "message" : "Менеджер тэгов" }, "categoryName42" : { "message" : "Менеджер тэгов" },
"categoryName43" : { "message" : "Paywall" }, "categoryName43" : { "message" : "Paywall" },
"categoryName44" : { "message" : "Система непрерывной интеграции" }, "categoryName44" : { "message" : "Система непрерывной интеграции" },
@ -47,12 +51,14 @@
"categoryName50" : { "message" : "Управление документами" }, "categoryName50" : { "message" : "Управление документами" },
"categoryName51" : { "message": "Генератор лендингов" }, "categoryName51" : { "message": "Генератор лендингов" },
"categoryName52" : { "message": "Live Chat" }, "categoryName52" : { "message": "Live Chat" },
"categoryName53" : { "message": "CRM" },
"github" : { "message" : "Форкнуть на GitHub!" }, "github" : { "message" : "Форкнуть на GitHub!" },
"noAppsDetected" : { "message" : "Нет данных о сайте" }, "noAppsDetected" : { "message" : "Нет данных о сайте" },
"nothingToDo" : { "message" : "Тут нечего искать" }, "nothingToDo" : { "message" : "Тут нечего искать" },
"optionTracking" : { "message" : "Анонимно отправлять статистику распознанных данных на сервер (для улучшения расширения)" }, "optionTracking" : { "message" : "Анонимно отправлять статистику распознанных данных на сервер (для исследований)" },
"optionUpgradeMessage" : { "message" : "Оповещать меня о новых обновлениях" }, "optionDynamicIcon" : { "message": "Использовать значок приложения вместо логотипа Wappalyzer" },
"options" : { "message" : "Настройки Wappalyzer" }, "optionUpgradeMessage" : { "message" : "Оповещать меня об обновлениях" },
"options" : { "message" : "Настройки" },
"optionsSave" : { "message" : "Сохранить" }, "optionsSave" : { "message" : "Сохранить" },
"optionsSaved" : { "message" : "Успешно сохранено!" }, "optionsSaved" : { "message" : "Успешно сохранено!" },
"twitter" : { "message" : "Следите за новостями в Твиттере" }, "twitter" : { "message" : "Следите за новостями в Твиттере" },

@ -2,11 +2,10 @@
<html> <html>
<head> <head>
<title>Background</title> <meta charset="utf-8">
<script src="js/ga.js"></script> <script src="js/browser-polyfill.js"></script>
<script src="js/wappalyzer.js"></script> <script src="js/wappalyzer.js"></script>
<script src="js/defaults.js"></script>
<script src="js/driver.js"></script> <script src="js/driver.js"></script>
<script src="js/network.js"></script> <script src="js/network.js"></script>
</head> </head>

@ -0,0 +1,106 @@
body {
color: #303942;
cursor: default;
font-family: Helvetica, Arial, sans-serif;
font-size: .8rem;
line-height: 1.4rem;
margin: 0;
}
p {
margin: 0 0 1rem 0;
}
h1, h2, h3 {
font-weight: normal;
line-height: 1;
}
h1 {
border-bottom: 1px solid #dbdbdb;
font-size: 1.5rem;
margin: 0 0 1.5rem 0;
padding: 1rem 0 1.5rem 0;
}
h2 {
font-size: 1.3em;
margin-bottom: 0.4em;
}
h3 {
color: black;
font-size: 1.2em;
margin-bottom: 0.5em;
}
a {
color: rgb(17, 85, 204);
text-decoration: underline;
}
label {
display: block;
}
button {
background: #4608ad;
border: none;
border-radius: .2rem;
color: white;
font-size: inherit;
padding: 0 .6rem;
line-height: 1.8rem;
}
a:active {
color: rgb(5, 37, 119);
}
.hero {
background: linear-gradient(160deg, #32067c, #150233);
padding: 1.5rem 0 1rem 1.5rem;
}
.hero img {
height: 3rem;
}
.container {
margin: 0 auto;
max-width: 800px;
}
.content {
padding: 1.5rem;
}
#options-saved {
display: none;
margin-left: .5rem;
-webkit-animation: fadeout 2s;
}
#about {
border-top: 1px solid #dbdbdb;
margin-top: 1.5rem;
padding: 1.5rem 0 0 0;
}
#about img {
margin-right: .2rem;
vertical-align: middle;
}
#about button {
background: white;
border: 1px solid #dbdbdb;
cursor: pointer;
color: #303942;
margin: 0 1rem .5rem 0;
}
@-webkit-keyframes fadeout {
from { opacity: 1; }
to { opacity: 0; }
}

@ -1,6 +1,6 @@
body { body {
background: #fff; background: #fff;
color: #000; color: #4a4a4a;
font-family: Helvetica, Arial, sans-serif; font-family: Helvetica, Arial, sans-serif;
font-size: 13px; font-size: 13px;
line-height: 16px; line-height: 16px;
@ -9,6 +9,14 @@ body {
padding: 15px; padding: 15px;
} }
a {
color: #4a4a4a;
}
a:focus {
outline: 0;
}
img { img {
display: inline-block; display: inline-block;
height: 16px; height: 16px;
@ -31,25 +39,26 @@ img {
} }
.detected-app a { .detected-app a {
color: #000; color: #4608ad;
display: block; display: block;
text-decoration: none; text-decoration: none;
} }
.detected-app a .label .name { .detected-app a .label .name {
border-bottom: 1px dotted #999; border-bottom: 1px solid transparent;
} }
.detected-app a:hover .label .name { .detected-app a:hover .label .name {
border-bottom: 1px solid #333; border-bottom: 1px solid #4608ad;
} }
.detected-app a .category .name { .detected-app a .category .name {
color: #4a4a4a;
border-bottom: 1px solid transparent; border-bottom: 1px solid transparent;
} }
.detected-app a:hover .category .name { .detected-app a:hover .category .name {
border-bottom: 1px solid #999; border-bottom: 1px solid #4a4a4a;
} }
.label { .label {
@ -57,12 +66,11 @@ img {
} }
.category { .category {
color: #999;
display: block; display: block;
margin: 5px 0 0 24px; margin: 5px 0 0 24px;
} }
#empty { .empty {
color: #999; color: #999;
font-style: italic; font-style: italic;
text-align: center; text-align: center;

Before

Width:  |  Height:  |  Size: 281 B

After

Width:  |  Height:  |  Size: 281 B

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="114px" height="97px" viewBox="0 0 114 97" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 41 (35326) - http://www.bohemiancoding.com/sketch -->
<title>Logo</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="wappalyzer_rebrand" transform="translate(-317.000000, -669.000000)">
<g id="Logo" transform="translate(317.000000, 669.000000)">
<g id="Logo-Mark-Purple">
<polygon id="Fill-1" fill="#1C0172" points="57.0285 74.6616 6.5385 48.4526 0.0015 53.1396 -0.0005 56.0066 57.0285 96.9046 114.0545 56.0086 114.0585 53.1426 107.5185 48.4526"></polygon>
<path d="M57.0285,0.0003 L0.0025,40.8963 L-0.0005,43.7633 L57.0285,84.6623 L114.0545,43.7653 L114.0575,40.8983 L57.0285,0.0003 Z M64.4895,40.3623 L57.5365,30.7743 L63.4645,26.4363 L75.8235,44.7273 L70.8465,48.3703 L57.5555,42.8723 L57.4985,42.9133 L65.0675,52.5983 L60.0905,56.2403 L35.0915,47.1963 L41.0385,42.8443 L54.1065,47.9333 L54.1805,47.8783 L46.9285,38.5343 L51.6075,35.1113 L64.4145,40.4173 L64.4895,40.3623 Z" id="Fill-2" fill="#4608AD"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 555 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Some files were not shown because too many files have changed in this diff Show More