@ -1,11 +1,12 @@
|
||||
.vagrant
|
||||
|
||||
build/*
|
||||
src/icons/converted/*
|
||||
|
||||
node_modules
|
||||
npm-debug.log
|
||||
|
||||
tags
|
||||
/build/*
|
||||
/src/icons/converted/*
|
||||
/node_modules
|
||||
/npm-debug.log
|
||||
|
||||
!.gitkeep
|
||||
|
||||
# Junk files
|
||||
Thumbs.db
|
||||
Desktop.ini
|
||||
*.DS_Store
|
||||
._*
|
||||
|
@ -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,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
|
||||
|
||||
cat << 'EOF'
|
||||
usage: wappalyzer <command> [<args>]
|
||||
usage: ./run <command> [<args>]
|
||||
|
||||
The following commands are available:
|
||||
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));
|
||||
}
|
@ -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.*"
|
||||
}
|
||||
}
|
||||
|
@ -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 $@
|
@ -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;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 665 B |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.9 KiB |
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
|
Before Width: | Height: | Size: 1.9 KiB |
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
|
||||
]
|
||||
};
|
||||
}());
|
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 613 B |
Before Width: | Height: | Size: 634 B |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 4.3 KiB |
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 = 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,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
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
/apps.json
|
||||
/images/icons/converted/*
|
||||
/images/icons/*
|
||||
/js/wappalyzer.js
|
||||
/js/iframe.js
|
||||
/js/network.js
|
@ -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" }
|
||||
}
|
@ -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; }
|
||||
}
|
Before Width: | Height: | Size: 281 B After Width: | Height: | Size: 281 B |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 5.6 KiB |
After Width: | Height: | Size: 5.6 KiB |
After Width: | Height: | Size: 555 B |
After Width: | Height: | Size: 643 B |