@ -1,16 +1,14 @@
|
|||||||
.vagrant
|
/build/*
|
||||||
|
/src/icons/converted/*
|
||||||
build/*
|
/node_modules
|
||||||
src/icons/converted/*
|
/npm-debug.log
|
||||||
|
|
||||||
node_modules
|
|
||||||
npm-debug.log
|
|
||||||
|
|
||||||
tags
|
|
||||||
|
|
||||||
!.gitkeep
|
!.gitkeep
|
||||||
|
|
||||||
|
# Junk files
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
Desktop.ini
|
Desktop.ini
|
||||||
*.DS_Store
|
*.DS_Store
|
||||||
._*
|
._*
|
||||||
|
tags
|
||||||
|
tags.*
|
||||||
|
@ -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/1591Wappalyzer.Wappalyzer/' $manifest_dir/appxmanifest.xml
|
||||||
|
sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-PUBLISHER-HERE/D240C22F-A6C1-45DF-BF7B-4C835064DF51/' $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,11 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
cat << 'EOF'
|
cat << 'EOF'
|
||||||
usage: wappalyzer <command> [<args>]
|
usage: ./run <command> [<args>]
|
||||||
|
|
||||||
The following commands are available:
|
The following commands are available:
|
||||||
build Package drivers
|
build Package drivers
|
||||||
help This help text
|
help This help text
|
||||||
links Create hard links to shared files in each driver
|
links Create symlinks to shared files in each driver
|
||||||
validate Validate apps.json
|
validate Validate apps.json
|
||||||
EOF
|
EOF
|
@ -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,97 +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 2>&1 > /dev/null
|
|
||||||
|
|
||||||
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
|
|
||||||
rm "$dest"
|
|
||||||
fi
|
|
||||||
|
|
||||||
node $WAPPALYZER_NODE_PATH/node_modules/svg2png/bin/svg2png-cli "$svg" --width=32 --height=32 --output "$dest" || true
|
|
||||||
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
|
|
||||||
|
|
||||||
# WebExtension
|
|
||||||
echo "Building WebExtension driver..."
|
|
||||||
|
|
||||||
webextension_dir=$WAPPALYZER_ROOT/src/drivers/webextension
|
|
||||||
|
|
||||||
pushd $webextension_dir > /dev/null
|
|
||||||
|
|
||||||
zip -qr $WAPPALYZER_ROOT/build/wappalyzer_webextension.zip .
|
|
||||||
|
|
||||||
popd > /dev/null
|
|
||||||
|
|
||||||
# Edge
|
|
||||||
|
|
||||||
pushd $WAPPALYZER_ROOT/build > /dev/null
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
mv $webextension_dir/manifest.json $webextension_dir/manifest.edge.json
|
|
||||||
mv $webextension_dir/manifest.webextension.json $webextension_dir/manifest.json
|
|
||||||
|
|
||||||
manifest_dir="Wappalyzer/edgeextension/manifest"
|
|
||||||
|
|
||||||
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. Builds have been created in $WAPPALYZER_ROOT/build."
|
|
@ -1,45 +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/webextension/js
|
|
||||||
ln -f $path/apps.json $path/drivers/webextension
|
|
||||||
ln -f $path/icons/*.png $path/drivers/webextension/images/icons
|
|
||||||
ln -f $path/icons/*.svg $path/drivers/webextension/images/icons
|
|
||||||
ln -f $path/utils/*.js $path/drivers/webextension/js
|
|
||||||
|
|
||||||
if [ "$(compgen -G "$path/icons/converted/*.png" | head -n1)" ]; then
|
|
||||||
ln -f $path/icons/converted/*.png $path/drivers/webextension/images/icons/converted
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "OK"
|
|
||||||
|
|
||||||
exit 0
|
|
@ -1,35 +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 || 'default.svg';
|
|
||||||
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,72 +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/^deb-src\ /\#deb-src\ /g' /etc/apt/sources.list
|
|
||||||
RUN sed -i 's/archive\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list
|
|
||||||
RUN sed -i 's/security\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list
|
|
||||||
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - && \
|
|
||||||
apt-get install -y \
|
|
||||||
nodejs \
|
|
||||||
bzip2 \
|
|
||||||
zip \
|
|
||||||
libfreetype6 \
|
|
||||||
libfontconfig \
|
|
||||||
rsync && \
|
|
||||||
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"
|
|
||||||
|
|
||||||
RUN npm i -g manifoldjs
|
|
||||||
|
|
||||||
|
|
||||||
# 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,9 @@
|
|||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"file-type": "3.8.*",
|
||||||
|
"is-svg": "2.0.*",
|
||||||
|
"read-chunk": "2.0.*",
|
||||||
|
"svg2png-many": "*"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "wappalyzer",
|
"name": "Wappalyzer",
|
||||||
"description": "Uncovers the technologies used on websites",
|
"description": "Uncovers the technologies used on websites",
|
||||||
"homepage": "https://github.com/AliasIO/Wappalyzer",
|
"homepage": "https://github.com/AliasIO/Wappalyzer",
|
||||||
"version": "3.0.10",
|
"version": "4.1.4",
|
||||||
"author": "Elbert Alias",
|
"author": "Elbert Alias",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"repository": {
|
"repository": {
|
@ -1,7 +1,4 @@
|
|||||||
apps.json
|
/apps.json
|
||||||
images/icons/converted/*.png
|
/images/icons/converted/*
|
||||||
images/icons/*.png
|
/images/icons/*
|
||||||
images/icons/*.svg
|
/js/wappalyzer.js
|
||||||
js/wappalyzer.js
|
|
||||||
js/iframe.js
|
|
||||||
js/network.js
|
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
../../../icons/
|
@ -1,13 +1,9 @@
|
|||||||
/** global: browser */
|
/** global: browser */
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
var
|
var nodes = document.querySelectorAll('[data-i18n]');
|
||||||
i, value,
|
|
||||||
nodes = document.querySelector('*');
|
|
||||||
|
|
||||||
for ( i = 0; i < nodes.length; i ++ ) {
|
Array.prototype.forEach.call(nodes, function (node) {
|
||||||
if ( value = nodes[i].dataset.i18n ) {
|
node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n);
|
||||||
nodes[i].innerHTML = browser.i18n.getMessage(value);
|
});
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
jsonToDOM.namespaces = {
|
||||||
|
html: "http://www.w3.org/1999/xhtml",
|
||||||
|
xul: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||||
|
};
|
||||||
|
|
||||||
|
jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html;
|
||||||
|
|
||||||
|
function jsonToDOM(jsonTemplate, doc, nodes) {
|
||||||
|
function namespace(name) {
|
||||||
|
var reElemNameParts = /^(?:(.*):)?(.*)$/.exec(name);
|
||||||
|
return { namespace: jsonToDOM.namespaces[reElemNameParts[1]], shortName: reElemNameParts[2] };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note that 'elemNameOrArray' is: either the full element name (eg. [html:]div) or an array of elements in JSON notation
|
||||||
|
function tag(elemNameOrArray, elemAttr) {
|
||||||
|
// Array of elements? Parse each one...
|
||||||
|
if (Array.isArray(elemNameOrArray)) {
|
||||||
|
var frag = doc.createDocumentFragment();
|
||||||
|
Array.prototype.forEach.call(arguments, function(thisElem) {
|
||||||
|
frag.appendChild(tag.apply(null, thisElem));
|
||||||
|
});
|
||||||
|
return frag;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Single element? Parse element namespace prefix (if none exists, default to defaultNamespace), and create element
|
||||||
|
var elemNs = namespace(elemNameOrArray);
|
||||||
|
var elem = doc.createElementNS(elemNs.namespace || jsonToDOM.defaultNamespace, elemNs.shortName);
|
||||||
|
|
||||||
|
// Set element's attributes and/or callback functions (eg. onclick)
|
||||||
|
for (var key in elemAttr) {
|
||||||
|
var val = elemAttr[key];
|
||||||
|
if (nodes && key == "key") {
|
||||||
|
nodes[val] = elem;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var attrNs = namespace(key);
|
||||||
|
if (typeof val == "function") {
|
||||||
|
// Special case for function attributes; don't just add them as 'on...' attributes, but as events, using addEventListener
|
||||||
|
elem.addEventListener(key.replace(/^on/, ""), val, false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Note that the default namespace for XML attributes is, and should be, blank (ie. they're not in any namespace)
|
||||||
|
elem.setAttributeNS(attrNs.namespace || "", attrNs.shortName, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create and append this element's children
|
||||||
|
var childElems = Array.prototype.slice.call(arguments, 2);
|
||||||
|
childElems.forEach(function(childElem) {
|
||||||
|
if (childElem != null) {
|
||||||
|
elem.appendChild(
|
||||||
|
childElem instanceof doc.defaultView.Node ? childElem :
|
||||||
|
Array.isArray(childElem) ? tag.apply(null, childElem) :
|
||||||
|
doc.createTextNode(childElem));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tag.apply(null, jsonTemplate);
|
||||||
|
}
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 609 B After Width: | Height: | Size: 608 B |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 703 B |
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 9.7 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 319 B After Width: | Height: | Size: 285 B |
Before Width: | Height: | Size: 534 B After Width: | Height: | Size: 524 B |
Before Width: | Height: | Size: 751 B After Width: | Height: | Size: 493 B |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 754 B After Width: | Height: | Size: 740 B |
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 979 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 9.8 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 649 B |
After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 855 B |
After Width: | Height: | Size: 862 B |
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 540 B After Width: | Height: | Size: 493 B |
Before Width: | Height: | Size: 713 B After Width: | Height: | Size: 646 B |
After Width: | Height: | Size: 995 B |
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 923 B |
Before Width: | Height: | Size: 368 B After Width: | Height: | Size: 234 B |
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 742 B |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 641 B |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 326 B |
Before Width: | Height: | Size: 721 B After Width: | Height: | Size: 717 B |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 53 KiB |