diff --git a/bin/wappalyzer-build b/bin/wappalyzer-build
index 9c4989728..b526af24b 100755
--- a/bin/wappalyzer-build
+++ b/bin/wappalyzer-build
@@ -41,7 +41,7 @@ do
rm "$dest"
fi
- #node $WAPPALYZER_NODE_PATH/node_modules/svg2png/bin/svg2png-cli "$svg" --width=32 --height=32 --output "$dest" || true
+ node $WAPPALYZER_NODE_PATH/node_modules/svg2png/bin/svg2png-cli "$svg" --width=32 --height=32 --output "$dest" || true
done
IFS="$OIFS"
@@ -52,22 +52,6 @@ node $WAPPALYZER_NODE_PATH/node_modules/imagemin-cli/cli.js $WAPPALYZER_ROOT/src
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 .
-
# WebExtension
echo "Building WebExtension driver..."
diff --git a/bin/wappalyzer-links b/bin/wappalyzer-links
index 251cebbf2..ae75f4432 100755
--- a/bin/wappalyzer-links
+++ b/bin/wappalyzer-links
@@ -30,26 +30,11 @@ 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
-
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
diff --git a/src/apps.json b/src/apps.json
index e63cd6347..7577301b1 100755
--- a/src/apps.json
+++ b/src/apps.json
@@ -10161,4 +10161,4 @@
"priority": "9"
}
}
-}
+}
\ No newline at end of file
diff --git a/src/drivers/chrome/.gitignore b/src/drivers/chrome/.gitignore
deleted file mode 100644
index 602df1590..000000000
--- a/src/drivers/chrome/.gitignore
+++ /dev/null
@@ -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
diff --git a/src/drivers/chrome/_locales/el/messages.json b/src/drivers/chrome/_locales/el/messages.json
deleted file mode 100644
index 8b63568f5..000000000
--- a/src/drivers/chrome/_locales/el/messages.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
- "github": { "message": "Κάνε fork το Wappalyzer στο GitHub!" },
- "twitter": { "message": "Ακολούθησε το Wappalyzer στο Twitter" },
- "website": { "message": "Πήγαινε στο wappalyzer.com" },
- "options": { "message": "Ρυθμίσεις Wappalyzer" },
- "optionsSave": { "message": "Ρυθμίσεις αποθήκευσης" },
- "optionsSaved": { "message": "Αποθηκεύτηκε" },
- "optionUpgradeMessage": { "message": "Ενημερώστε με για αναβαθμίσεις" },
- "optionTracking": { "message": "Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα" },
- "nothingToDo": { "message": "Καμία ενέργεια." },
- "noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },
- "categoryName1": { "message": "CMS" },
- "categoryName2": { "message": "Διαδικτυακό Φόρουμ" },
- "categoryName3": { "message": "Διαχειριστής Βάσης Δεδομένων" },
- "categoryName4": { "message": "Εργαλείο Τεκμηρίωσης" },
- "categoryName5": { "message": "Widget" },
- "categoryName10": { "message": "Analytics" },
- "categoryName11": { "message": "Blog" },
- "categoryName12": { "message": "Framework της JavaScript" },
- "categoryName13": { "message": "Issue Tracker" },
- "categoryName14": { "message": "Πρόγραμμα αναπαραγωγής Βίντεο" },
- "categoryName15": { "message": "Σύστημα Σχολίων" },
- "categoryName16": { "message": "Captcha" },
- "categoryName17": { "message": "Script Γραμματοσειράς" },
- "categoryName18": { "message": "Framework Διαδικτύου" },
- "categoryName19": { "message": "Διάφορα" },
- "categoryName20": { "message": "Επεξεργαστής Κειμένου" },
- "categoryName21": { "message": "LMS" },
- "categoryName22": { "message": "Διακομιστής Διαδικτύου" },
- "categoryName23": { "message": "Εργαλείο Μνήμης Cache" },
- "categoryName24": { "message": "Επεξεργαστής Εμπλουτισμένου Κειμένου" },
- "categoryName25": { "message": "Γραφικά JavaScript" },
- "categoryName26": { "message": "Framework για Κινητά" },
- "categoryName27": { "message": "Γλώσσα Προγραμματισμού" },
- "categoryName28": { "message": "Λειτουργικό Σύστημα" },
- "categoryName29": { "message": "Μηχανή Αναζήτησης" },
- "categoryName30": { "message": "Web Mail" },
- "categoryName31": { "message": "CDN" },
- "categoryName32": { "message": "Αυτοματοποίηση Marketing" },
- "categoryName33": { "message": "Επέκταση Διακομιστή Διαδικτύου" },
- "categoryName34": { "message": "Βάση Δεδομένων" },
- "categoryName35": { "message": "Χάρτης" },
- "categoryName36": { "message": "Δίκτυο Διαφημίσεων" },
- "categoryName37": { "message": "Υπηρεσία Δικτύου" },
- "categoryName38": { "message": "Διακομιστής Πολυμέσων" },
- "categoryName39": { "message": "Διαδικτυακή κάμερα" },
- "categoryName40": { "message": "Εκτυπωτής" },
- "categoryName41": { "message": "Σύστημα Επεξεργασίας Πληρωμών" },
- "categoryName42": { "message": "Σύστημα Διαχείρισης Tags" },
- "categoryName43": { "message": "Paywall" },
- "categoryName44": { "message": "Σύστημα Build/CI" },
- "categoryName45": { "message": "Σύστημα SCADA" },
- "categoryName46": { "message": "Απομακρυσμένη Πρόσβαση" },
- "categoryName47": { "message": "Εργαλείο Ανάπτυξης" },
- "categoryName48": { "message": "Δικτυακός Αποθηκευτικός Χώρος" },
- "categoryName49": { "message": "Feed Readers" },
- "categoryName50": { "message": "Συστήματα Διαχειρίσης Εγγράφων" },
- "categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" },
- "categoryName52": { "message": "Live Chat" }
-}
diff --git a/src/drivers/chrome/_locales/en/messages.json b/src/drivers/chrome/_locales/en/messages.json
deleted file mode 100644
index f95251750..000000000
--- a/src/drivers/chrome/_locales/en/messages.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
- "github": { "message": "Fork Wappalyzer on GitHub!" },
- "twitter": { "message": "Follow Wappalyzer on Twitter" },
- "website": { "message": "Go to wappalyzer.com" },
- "options": { "message": "Wappalyzer Options" },
- "optionsSave": { "message": "Save options" },
- "optionsSaved": { "message": "Saved" },
- "optionUpgradeMessage": { "message": "Tell me about upgrades" },
- "optionTracking": { "message": "Anonymously send reports on detected applications to wappalyzer.com for research" },
- "nothingToDo": { "message": "Nothing to do here." },
- "noAppsDetected": { "message": "No applications detected." },
- "categoryName1": { "message": "CMS" },
- "categoryName2": { "message": "Message Board" },
- "categoryName3": { "message": "Database Manager" },
- "categoryName4": { "message": "Documentation Tool" },
- "categoryName5": { "message": "Widget" },
- "categoryName10": { "message": "Analytics" },
- "categoryName11": { "message": "Blog" },
- "categoryName12": { "message": "JavaScript Framework" },
- "categoryName13": { "message": "Issue Tracker" },
- "categoryName14": { "message": "Video Player" },
- "categoryName15": { "message": "Comment System" },
- "categoryName16": { "message": "Captcha" },
- "categoryName17": { "message": "Font Script" },
- "categoryName18": { "message": "Web Framework" },
- "categoryName19": { "message": "Miscellaneous" },
- "categoryName20": { "message": "Editor" },
- "categoryName21": { "message": "LMS" },
- "categoryName22": { "message": "Web Server" },
- "categoryName23": { "message": "Cache Tool" },
- "categoryName24": { "message": "Rich Text Editor" },
- "categoryName25": { "message": "JavaScript Graphics" },
- "categoryName26": { "message": "Mobile Framework" },
- "categoryName27": { "message": "Programming Language" },
- "categoryName28": { "message": "Operating System" },
- "categoryName29": { "message": "Search Engine" },
- "categoryName30": { "message": "Web Mail" },
- "categoryName31": { "message": "CDN" },
- "categoryName32": { "message": "Marketing Automation" },
- "categoryName33": { "message": "Web Server Extension" },
- "categoryName34": { "message": "Database" },
- "categoryName35": { "message": "Map" },
- "categoryName36": { "message": "Advertising Network" },
- "categoryName37": { "message": "Network Service" },
- "categoryName38": { "message": "Media Server" },
- "categoryName39": { "message": "Webcam" },
- "categoryName40": { "message": "Printer" },
- "categoryName41": { "message": "Payment Processor" },
- "categoryName42": { "message": "Tag Manager" },
- "categoryName43": { "message": "Paywall" },
- "categoryName44": { "message": "Build/CI System" },
- "categoryName45": { "message": "SCADA System" },
- "categoryName46": { "message": "Remote Access" },
- "categoryName47": { "message": "Development Tool" },
- "categoryName48": { "message": "Network Storage" },
- "categoryName49": { "message": "Feed Readers" },
- "categoryName50": { "message": "Document Management Systems" },
- "categoryName51": { "message": "Landing Page Builder" },
- "categoryName52": { "message": "Live Chat" }
-}
diff --git a/src/drivers/chrome/_locales/es/messages.json b/src/drivers/chrome/_locales/es/messages.json
deleted file mode 100644
index 2676f4671..000000000
--- a/src/drivers/chrome/_locales/es/messages.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
- "github": { "message": "¡Forkea Wappalyzer en GitHub!" },
- "twitter": { "message": "Sigue Wappalyzer en Twitter" },
- "website": { "message": "Ir a wappalyzer.com" },
- "options": { "message": "Opciones de Wappalyzer" },
- "optionsSave": { "message": "Guardar opciones" },
- "optionsSaved": { "message": "Guardado" },
- "optionUpgradeMessage": { "message": "Indicarme actualizaciones" },
- "optionTracking": { "message": "Enviar informes anónimos sobre las aplicaciones detectadas a wappalyzer.com para análisis" },
- "nothingToDo": { "message": "Nada que hacer aquí." },
- "noAppsDetected": { "message": "Aplicaciones no detectadas." },
- "categoryName1": { "message": "Gestor de Contenido" },
- "categoryName2": { "message": "Foro" },
- "categoryName3": { "message": "Gestor de Bases de Datos" },
- "categoryName4": { "message": "Herramienta de Documentación" },
- "categoryName5": { "message": "Widget" },
- "categoryName6": { "message": "Tienda Web" },
- "categoryName7": { "message": "Galería fotográfica" },
- "categoryName8": { "message": "Wiki" },
- "categoryName9": { "message": "Panel de Hosting" },
- "categoryName10": { "message": "Analítica" },
- "categoryName11": { "message": "Blog" },
- "categoryName12": { "message": "Framework JavaScript" },
- "categoryName13": { "message": "Gestor de Incidencias" },
- "categoryName14": { "message": "Reproductor de Vídeo" },
- "categoryName15": { "message": "Sistema de Comentarios" },
- "categoryName16": { "message": "Captcha" },
- "categoryName17": { "message": "Tipografía" },
- "categoryName18": { "message": "Framework Web" },
- "categoryName19": { "message": "Miscelánea" },
- "categoryName20": { "message": "Editor" },
- "categoryName21": { "message": "LMS" },
- "categoryName22": { "message": "Servidor Web" },
- "categoryName23": { "message": "Herramienta de Cache" },
- "categoryName24": { "message": "Editor de Texto Enriquecido" },
- "categoryName25": { "message": "Gráficos JavaScript" },
- "categoryName26": { "message": "Framework Móvil" },
- "categoryName27": { "message": "Lenguaje de programación" },
- "categoryName28": { "message": "Sistema Operativo" },
- "categoryName29": { "message": "Motor de Búsqueda" },
- "categoryName30": { "message": "Correo Web" },
- "categoryName31": { "message": "CDN" },
- "categoryName32": { "message": "Automatización de Marketing" },
- "categoryName33": { "message": "Extensión de Servidor Web" },
- "categoryName34": { "message": "Base de Datos" },
- "categoryName35": { "message": "Mapa" },
- "categoryName36": { "message": "Red de Publicidad" },
- "categoryName37": { "message": "Network Sevice" },
- "categoryName38": { "message": "Media Server" },
- "categoryName39": { "message": "Webcam" },
- "categoryName40": { "message": "Printer" },
- "categoryName41": { "message": "Payment Processor" },
- "categoryName42": { "message": "Tag Manager" },
- "categoryName43": { "message": "Paywall" },
- "categoryName44": { "message": "Build/CI System" },
- "categoryName45": { "message": "SCADA System" },
- "categoryName46": { "message": "Remote Access" },
- "categoryName47": { "message": "Development Tool" },
- "categoryName48": { "message": "Network Storage" },
- "categoryName49": { "message": "Feed Readers" },
- "categoryName50": { "message": "Document Management Systems" },
- "categoryName51": { "message": "Landing Page Builder" },
- "categoryName52": { "message": "Live Chat" }
-}
diff --git a/src/drivers/chrome/_locales/fr/messages.json b/src/drivers/chrome/_locales/fr/messages.json
deleted file mode 100644
index 122d43020..000000000
--- a/src/drivers/chrome/_locales/fr/messages.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
- "github": { "message": "Forker Wappalyzer sur GitHub !" },
- "noAppsDetected": { "message": "Aucune application détectée." },
- "nothingToDo": { "message": "Rien à faire ici." },
- "optionTracking": { "message": "Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour recherche" },
- "optionUpgradeMessage": { "message": "M'informer des mises à jour" },
- "options": { "message": "Options de Wappalyzer" },
- "optionsSave": { "message": "Sauvegarder les options" },
- "optionsSaved": { "message": "Sauvegardé" },
- "twitter": { "message": "Suivre Wappalyzer sur Twitter" },
- "website": { "message": "Aller sur wappalyzer.com" },
- "categoryName1": { "message": "CMS" },
- "categoryName2": { "message": "Forum" },
- "categoryName3": { "message": "Gestionnaire de base de données" },
- "categoryName4": { "message": "Outil de documentation" },
- "categoryName5": { "message": "Widget" },
- "categoryName6": { "message": "Boutique en ligne" },
- "categoryName7": { "message": "Galerie photo" },
- "categoryName8": { "message": "Wiki" },
- "categoryName9": { "message": "Gestionnaires de serveur" },
- "categoryName10": { "message": "Outil de statistiques" },
- "categoryName11": { "message": "Blog" },
- "categoryName12": { "message": "Framework JavaScript" },
- "categoryName13": { "message": "Outil de suivi de problèmes" },
- "categoryName14": { "message": "Lecteur de vidéos" },
- "categoryName15": { "message": "Système de commentaires" },
- "categoryName16": { "message": "Captcha" },
- "categoryName17": { "message": "Script de police" },
- "categoryName18": { "message": "Framework web" },
- "categoryName19": { "message": "Divers" },
- "categoryName20": { "message": "Editeur" },
- "categoryName21": { "message": "LMS" },
- "categoryName22": { "message": "Serveur web" },
- "categoryName23": { "message": "Outil de cache" },
- "categoryName24": { "message": "Editeur WYSIWYG" },
- "categoryName25": { "message": "Graphismes JavaScript" },
- "categoryName26": { "message": "Framework pour mobiles" },
- "categoryName27": { "message": "Language de programmation" },
- "categoryName28": { "message": "Système d'exploitation" },
- "categoryName29": { "message": "Moteur de recherche" },
- "categoryName30": { "message": "Web Mail" },
- "categoryName31": { "message": "CDN" },
- "categoryName32": { "message": "Logiciel de marketing" },
- "categoryName33": { "message": "Extension de serveur web" },
- "categoryName34": { "message": "Base de données" },
- "categoryName35": { "message": "Carte" },
- "categoryName36": { "message": "Réseau publicitaire" },
- "categoryName37": { "message": "Périphérique réseau" },
- "categoryName38": { "message": "Serveur multimédia" },
- "categoryName39": { "message": "Webcam" },
- "categoryName40": { "message": "Imprimante" },
- "categoryName41": { "message": "Service de paiement" },
- "categoryName42": { "message": "Tag Manager" },
- "categoryName43": { "message": "Paywall" },
- "categoryName44": { "message": "Système CI" },
- "categoryName45": { "message": "Système SCADA" },
- "categoryName46": { "message": "Accès à distance" },
- "categoryName47": { "message": "Outil de développement" },
- "categoryName48": { "message": "Stockage réseau" },
- "categoryName49": { "message": "Lecteur RSS" },
- "categoryName50": { "message": "Système de gestion de documents" },
- "categoryName51": { "message": "Landing Page Builder" },
- "categoryName52": { "message": "Chat en direct" }
-}
diff --git a/src/drivers/chrome/_locales/gr/messages.json b/src/drivers/chrome/_locales/gr/messages.json
deleted file mode 100644
index 8b63568f5..000000000
--- a/src/drivers/chrome/_locales/gr/messages.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
- "github": { "message": "Κάνε fork το Wappalyzer στο GitHub!" },
- "twitter": { "message": "Ακολούθησε το Wappalyzer στο Twitter" },
- "website": { "message": "Πήγαινε στο wappalyzer.com" },
- "options": { "message": "Ρυθμίσεις Wappalyzer" },
- "optionsSave": { "message": "Ρυθμίσεις αποθήκευσης" },
- "optionsSaved": { "message": "Αποθηκεύτηκε" },
- "optionUpgradeMessage": { "message": "Ενημερώστε με για αναβαθμίσεις" },
- "optionTracking": { "message": "Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα" },
- "nothingToDo": { "message": "Καμία ενέργεια." },
- "noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },
- "categoryName1": { "message": "CMS" },
- "categoryName2": { "message": "Διαδικτυακό Φόρουμ" },
- "categoryName3": { "message": "Διαχειριστής Βάσης Δεδομένων" },
- "categoryName4": { "message": "Εργαλείο Τεκμηρίωσης" },
- "categoryName5": { "message": "Widget" },
- "categoryName10": { "message": "Analytics" },
- "categoryName11": { "message": "Blog" },
- "categoryName12": { "message": "Framework της JavaScript" },
- "categoryName13": { "message": "Issue Tracker" },
- "categoryName14": { "message": "Πρόγραμμα αναπαραγωγής Βίντεο" },
- "categoryName15": { "message": "Σύστημα Σχολίων" },
- "categoryName16": { "message": "Captcha" },
- "categoryName17": { "message": "Script Γραμματοσειράς" },
- "categoryName18": { "message": "Framework Διαδικτύου" },
- "categoryName19": { "message": "Διάφορα" },
- "categoryName20": { "message": "Επεξεργαστής Κειμένου" },
- "categoryName21": { "message": "LMS" },
- "categoryName22": { "message": "Διακομιστής Διαδικτύου" },
- "categoryName23": { "message": "Εργαλείο Μνήμης Cache" },
- "categoryName24": { "message": "Επεξεργαστής Εμπλουτισμένου Κειμένου" },
- "categoryName25": { "message": "Γραφικά JavaScript" },
- "categoryName26": { "message": "Framework για Κινητά" },
- "categoryName27": { "message": "Γλώσσα Προγραμματισμού" },
- "categoryName28": { "message": "Λειτουργικό Σύστημα" },
- "categoryName29": { "message": "Μηχανή Αναζήτησης" },
- "categoryName30": { "message": "Web Mail" },
- "categoryName31": { "message": "CDN" },
- "categoryName32": { "message": "Αυτοματοποίηση Marketing" },
- "categoryName33": { "message": "Επέκταση Διακομιστή Διαδικτύου" },
- "categoryName34": { "message": "Βάση Δεδομένων" },
- "categoryName35": { "message": "Χάρτης" },
- "categoryName36": { "message": "Δίκτυο Διαφημίσεων" },
- "categoryName37": { "message": "Υπηρεσία Δικτύου" },
- "categoryName38": { "message": "Διακομιστής Πολυμέσων" },
- "categoryName39": { "message": "Διαδικτυακή κάμερα" },
- "categoryName40": { "message": "Εκτυπωτής" },
- "categoryName41": { "message": "Σύστημα Επεξεργασίας Πληρωμών" },
- "categoryName42": { "message": "Σύστημα Διαχείρισης Tags" },
- "categoryName43": { "message": "Paywall" },
- "categoryName44": { "message": "Σύστημα Build/CI" },
- "categoryName45": { "message": "Σύστημα SCADA" },
- "categoryName46": { "message": "Απομακρυσμένη Πρόσβαση" },
- "categoryName47": { "message": "Εργαλείο Ανάπτυξης" },
- "categoryName48": { "message": "Δικτυακός Αποθηκευτικός Χώρος" },
- "categoryName49": { "message": "Feed Readers" },
- "categoryName50": { "message": "Συστήματα Διαχειρίσης Εγγράφων" },
- "categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" },
- "categoryName52": { "message": "Live Chat" }
-}
diff --git a/src/drivers/chrome/_locales/it/messages.json b/src/drivers/chrome/_locales/it/messages.json
deleted file mode 100644
index 7be8c396b..000000000
--- a/src/drivers/chrome/_locales/it/messages.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "github": { "message": "Fork Wappalyzer su GitHub!" },
- "twitter": { "message": "Follow Wappalyzer su Twitter" },
- "website": { "message": "Vai su wappalyzer.com" },
- "options": { "message": "Opzioni Wappalyzer" },
- "optionsSave": { "message": "Salva opzioni" },
- "optionsSaved": { "message": "Salvato" },
- "optionUpgradeMessage": { "message": "Parlami dell'upgrade" },
- "optionTracking": { "message": "Inviare anonimamente un report sulle applicazioni rilevate a wappalyzer.com per l'analisi" },
- "nothingToDo": { "message": "Niente da fare qui." },
- "noAppsDetected": { "message": "Nessuna applicazione rilevata." },
- "categoryName1": { "message": "CMS" },
- "categoryName2": { "message": "Forum" },
- "categoryName3": { "message": "Gestore di Database" },
- "categoryName4": { "message": "Strumento di documentazione" },
- "categoryName5": { "message": "Widget" },
- "categoryName6": { "message": "eCommerce" },
- "categoryName7": { "message": "Galleria fotografica" },
- "categoryName8": { "message": "Wiki" },
- "categoryName9": { "message": "Pannello Hosting" },
- "categoryName10": { "message": "Analytics" },
- "categoryName11": { "message": "Blog" },
- "categoryName12": { "message": "Framework JavaScript" },
- "categoryName13": { "message": "Issue Tracker" },
- "categoryName14": { "message": "Player Video" },
- "categoryName15": { "message": "Sistema di commenti" },
- "categoryName16": { "message": "Captcha" },
- "categoryName17": { "message": "Font Script" },
- "categoryName18": { "message": "Framework Web" },
- "categoryName19": { "message": "Miscellanea" },
- "categoryName20": { "message": "Editor" },
- "categoryName21": { "message": "LMS" },
- "categoryName22": { "message": "Web Server" },
- "categoryName23": { "message": "Cache Tool" },
- "categoryName24": { "message": "Editor di Testo Ricco" },
- "categoryName25": { "message": "JavaScript Graphics" },
- "categoryName26": { "message": "Framework Mobile" },
- "categoryName27": { "message": "Linguaggio di programmazione" },
- "categoryName28": { "message": "Sistema Operativo" },
- "categoryName29": { "message": "Motore di Ricerca" },
- "categoryName30": { "message": "Web Mail" },
- "categoryName31": { "message": "CDN" },
- "categoryName32": { "message": "Marketing Automation" },
- "categoryName33": { "message": "Estensione Web Server" },
- "categoryName34": { "message": "Database" },
- "categoryName35": { "message": "Mappa" },
- "categoryName36": { "message": "Network Pubblicitario" },
- "categoryName37": { "message": "Network Service" },
- "categoryName38": { "message": "Media Server" },
- "categoryName39": { "message": "Webcam" },
- "categoryName40": { "message": "Stampante" },
- "categoryName41": { "message": "Payment Processor" },
- "categoryName42": { "message": "Tag Manager" },
- "categoryName43": { "message": "Paywall" },
- "categoryName44": { "message": "Sistema Build/CI" },
- "categoryName45": { "message": "SCADA System" },
- "categoryName46": { "message": "Accesso" },
- "categoryName47": { "message": "Strumenti di Sviluppo" },
- "categoryName48": { "message": "Network Storage" },
- "categoryName49": { "message": "Lettore di Feed" },
- "categoryName50": { "message": "Sistema di Gestione Documenti" },
- "categoryName51": { "message": "Landing Page Builder" },
- "categoryName52": { "message": "Live Chat" }
-}
-
diff --git a/src/drivers/chrome/_locales/ro/messages.json b/src/drivers/chrome/_locales/ro/messages.json
deleted file mode 100644
index 851974d2b..000000000
--- a/src/drivers/chrome/_locales/ro/messages.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
- "github": { "message": "Fork-uiește Wappalyzer pe GitHub!" },
- "twitter": { "message": "Urmărește Wappalyzer pe Twitter" },
- "website": { "message": "Mergi la wappalyzer.com" },
- "options": { "message": "Opțiuni Wappalyzer" },
- "optionsSave": { "message": "Salvează opțiuni" },
- "optionsSaved": { "message": "Salvat" },
- "optionUpgradeMessage": { "message": "Anunță-mă dacă sunt actualizări" },
- "optionTracking": { "message": "Trimite rapoarte anonime despre aplicațiile detectate către wappalyzer.com pentru cercetare" },
- "nothingToDo": { "message": "Nimic de făcut pe pagina curentă." },
- "noAppsDetected": { "message": "Nici o aplicație detectată." },
- "categoryName1": { "message": "CMS" },
- "categoryName2": { "message": "Forum de discuții" },
- "categoryName3": { "message": "Manager baze de date" },
- "categoryName4": { "message": "Unealtă pentru documentare" },
- "categoryName5": { "message": "Widget" },
- "categoryName10": { "message": "Analiză trafic web" },
- "categoryName11": { "message": "Blog" },
- "categoryName12": { "message": "Framework JavaScript" },
- "categoryName13": { "message": "Tracker probleme" },
- "categoryName14": { "message": "Player Video" },
- "categoryName15": { "message": "Sistem de comentarii" },
- "categoryName16": { "message": "Verificare Captcha" },
- "categoryName17": { "message": "Script pentru fonturi" },
- "categoryName18": { "message": "Framework Web" },
- "categoryName19": { "message": "Divers" },
- "categoryName20": { "message": "Editor" },
- "categoryName21": { "message": "LMS" },
- "categoryName22": { "message": "Server Web" },
- "categoryName23": { "message": "Unealtă Cache" },
- "categoryName24": { "message": "Editor Texte Rich" },
- "categoryName25": { "message": "Grafică JavaScript" },
- "categoryName26": { "message": "Framework Mobile" },
- "categoryName27": { "message": "Limbaj de programare" },
- "categoryName28": { "message": "Sistem de operare" },
- "categoryName29": { "message": "Motor de căutare" },
- "categoryName30": { "message": "Poștă electronică" },
- "categoryName31": { "message": "CDN" },
- "categoryName32": { "message": "Automatizare marketing" },
- "categoryName33": { "message": "Extensie server web" },
- "categoryName34": { "message": "Bază de date" },
- "categoryName35": { "message": "Hartă" },
- "categoryName36": { "message": "Rețea de advertising" },
- "categoryName37": { "message": "Serviciu rețea" },
- "categoryName38": { "message": "Server Media" },
- "categoryName39": { "message": "Webcam" },
- "categoryName40": { "message": "Imprimantă" },
- "categoryName41": { "message": "Sistem de plată" },
- "categoryName42": { "message": "Manager cuvinte cheie" },
- "categoryName43": { "message": "Paywall" },
- "categoryName44": { "message": "Build/CI System" },
- "categoryName45": { "message": "SCADA System" },
- "categoryName46": { "message": "Remote Access" },
- "categoryName47": { "message": "Development Tool" },
- "categoryName48": { "message": "Network Storage" },
- "categoryName49": { "message": "Feed Readers" },
- "categoryName50": { "message": "Document Management Systems" },
- "categoryName51": { "message": "Landing Page Builder" },
- "categoryName52": { "message": "Live Chat" }
-}
diff --git a/src/drivers/chrome/_locales/ru/messages.json b/src/drivers/chrome/_locales/ru/messages.json
deleted file mode 100644
index 6338d320e..000000000
--- a/src/drivers/chrome/_locales/ru/messages.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
- "categoryName1" : { "message" : "CMS" },
- "categoryName2" : { "message" : "Форум" },
- "categoryName3" : { "message" : "Менеджер БД" },
- "categoryName4" : { "message" : "Документация" },
- "categoryName5" : { "message" : "Виджет" },
- "categoryName10" : { "message" : "Аналитика" },
- "categoryName11" : { "message" : "Блог" },
- "categoryName12" : { "message" : "JS фреймворк" },
- "categoryName13" : { "message" : "Баг трекер" },
- "categoryName14" : { "message" : "Видео плеер" },
- "categoryName15" : { "message" : "Система комментариев" },
- "categoryName16" : { "message" : "Капча" },
- "categoryName17" : { "message" : "Шрифт" },
- "categoryName18" : { "message" : "Веб фреймворк" },
- "categoryName19" : { "message" : "Прочее" },
- "categoryName20" : { "message" : "HTML редактор" },
- "categoryName21" : { "message" : "LMS" },
- "categoryName22" : { "message" : "Веб сервер" },
- "categoryName23" : { "message" : "Кеширование" },
- "categoryName24" : { "message" : "WYSIWYG редактор" },
- "categoryName25" : { "message" : "JS графика" },
- "categoryName26" : { "message" : "Мобильный фреймворк" },
- "categoryName27" : { "message" : "Язык программирования" },
- "categoryName28" : { "message" : "Операционная система" },
- "categoryName29" : { "message" : "Поисковый движок" },
- "categoryName30" : { "message" : "Веб почта" },
- "categoryName31" : { "message" : "CDN" },
- "categoryName32" : { "message" : "Управление маркетингом" },
- "categoryName33" : { "message" : "Расширение Веб сервера" },
- "categoryName34" : { "message" : "База данных" },
- "categoryName35" : { "message" : "Карта" },
- "categoryName36" : { "message" : "Рекламная сеть" },
- "categoryName37" : { "message" : "Сетевая служба" },
- "categoryName38" : { "message" : "Медиа сервер" },
- "categoryName39" : { "message" : "Вебкамера" },
- "categoryName40" : { "message" : "Принтер" },
- "categoryName41" : { "message" : "Провайдер платежей" },
- "categoryName42" : { "message" : "Менеджер тэгов" },
- "categoryName43" : { "message" : "Paywall" },
- "categoryName44" : { "message" : "Система непрерывной интеграции" },
- "categoryName45" : { "message" : "Система SCADA" },
- "categoryName46" : { "message" : "Удаленное управление" },
- "categoryName47" : { "message" : "Утилита для разработчиков" },
- "categoryName48" : { "message" : "Сетевое хранилище" },
- "categoryName49" : { "message" : "Граббер контента" },
- "categoryName50" : { "message" : "Управление документами" },
- "categoryName51" : { "message": "Генератор лендингов" },
- "categoryName52" : { "message": "Live Chat" },
- "github" : { "message" : "Форкнуть на GitHub!" },
- "noAppsDetected" : { "message" : "Нет данных о сайте" },
- "nothingToDo" : { "message" : "Тут нечего искать" },
- "optionTracking" : { "message" : "Анонимно отправлять статистику распознанных данных на сервер (для улучшения расширения)" },
- "optionUpgradeMessage" : { "message" : "Оповещать меня о новых обновлениях" },
- "options" : { "message" : "Настройки Wappalyzer" },
- "optionsSave" : { "message" : "Сохранить" },
- "optionsSaved" : { "message" : "Успешно сохранено!" },
- "twitter" : { "message" : "Следите за новостями в Твиттере" },
- "website" : { "message" : "Перейти на Wappalyzer.com" }
-}
diff --git a/src/drivers/chrome/background.html b/src/drivers/chrome/background.html
deleted file mode 100644
index 3aaa6249f..000000000
--- a/src/drivers/chrome/background.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
- Background
-
-
-
-
-
-
-
-
-
-
diff --git a/src/drivers/chrome/css/options.css b/src/drivers/chrome/css/options.css
deleted file mode 100644
index 9fb9bf253..000000000
--- a/src/drivers/chrome/css/options.css
+++ /dev/null
@@ -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; }
-}
\ No newline at end of file
diff --git a/src/drivers/chrome/css/popup.css b/src/drivers/chrome/css/popup.css
deleted file mode 100644
index 0c2fbf65c..000000000
--- a/src/drivers/chrome/css/popup.css
+++ /dev/null
@@ -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;
-}
diff --git a/src/drivers/chrome/css/widgets.css b/src/drivers/chrome/css/widgets.css
deleted file mode 100644
index 9322e4635..000000000
--- a/src/drivers/chrome/css/widgets.css
+++ /dev/null
@@ -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:
- *
- *
- *
- *
- */
-
-.checkbox,
-.radio {
- margin: 0.65em 0;
-}
-
-.checkbox label,
-.radio label {
- /* Don't expand horizontally: . */
- 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;
-}
-
diff --git a/src/drivers/chrome/images/github.png b/src/drivers/chrome/images/github.png
deleted file mode 100644
index 037d0c336..000000000
Binary files a/src/drivers/chrome/images/github.png and /dev/null differ
diff --git a/src/drivers/chrome/images/icon_128.png b/src/drivers/chrome/images/icon_128.png
deleted file mode 100644
index 05ad20d8f..000000000
Binary files a/src/drivers/chrome/images/icon_128.png and /dev/null differ
diff --git a/src/drivers/chrome/images/icon_19.png b/src/drivers/chrome/images/icon_19.png
deleted file mode 100644
index 9668bc65a..000000000
Binary files a/src/drivers/chrome/images/icon_19.png and /dev/null differ
diff --git a/src/drivers/chrome/images/icon_32.png b/src/drivers/chrome/images/icon_32.png
deleted file mode 100644
index cc9d30b15..000000000
Binary files a/src/drivers/chrome/images/icon_32.png and /dev/null differ
diff --git a/src/drivers/chrome/images/icon_38.png b/src/drivers/chrome/images/icon_38.png
deleted file mode 100644
index 95f220ff3..000000000
Binary files a/src/drivers/chrome/images/icon_38.png and /dev/null differ
diff --git a/src/drivers/chrome/images/icon_hot.png b/src/drivers/chrome/images/icon_hot.png
deleted file mode 100644
index 31e9b7c86..000000000
Binary files a/src/drivers/chrome/images/icon_hot.png and /dev/null differ
diff --git a/src/drivers/chrome/images/icons/.gitkeep b/src/drivers/chrome/images/icons/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/src/drivers/chrome/images/icons/converted/.gitkeep b/src/drivers/chrome/images/icons/converted/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/src/drivers/chrome/images/twitter.png b/src/drivers/chrome/images/twitter.png
deleted file mode 100644
index e20284ddf..000000000
Binary files a/src/drivers/chrome/images/twitter.png and /dev/null differ
diff --git a/src/drivers/chrome/js/content.js b/src/drivers/chrome/js/content.js
deleted file mode 100644
index 9b8e9b935..000000000
--- a/src/drivers/chrome/js/content.js
+++ /dev/null
@@ -1,63 +0,0 @@
-(function() {
- var c = {
- init: function() {
- var html = document.documentElement.outerHTML;
-
- c.log('init');
-
- if ( html.length > 50000 ) {
- html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
- }
-
- chrome.extension.sendRequest({ id: 'analyze', subject: { html: html } });
-
- c.getEnvironmentVars();
- },
-
- log: function(message) {
- chrome.extension.sendRequest({ id: 'log', message: '[ content.js ] ' + message });
- },
-
- getEnvironmentVars: function() {
- var container, script;
-
- c.log('getEnvironmentVars');
-
- if ( typeof document.documentElement.innerHTML === 'undefined' ) {
- return;
- }
-
- try {
- container = document.createElement('wappalyzerData');
-
- container.setAttribute('id', 'wappalyzerData');
- container.setAttribute('style', 'display: none');
-
- script = document.createElement('script');
-
- script.setAttribute('id', 'wappalyzerEnvDetection');
- script.setAttribute('src', chrome.extension.getURL('js/inject.js'));
-
- container.addEventListener('wappalyzerEvent', (function(event) {
- var environmentVars = event.target.childNodes[0].nodeValue;
-
- document.documentElement.removeChild(container);
- document.documentElement.removeChild(script);
-
- //c.log('getEnvironmentVars: ' + environmentVars);
-
- environmentVars = environmentVars.split(' ').slice(0, 500);
-
- chrome.extension.sendRequest({ id: 'analyze', subject: { env: environmentVars } });
- }), true);
-
- document.documentElement.appendChild(container);
- document.documentElement.appendChild(script);
- } catch(e) {
- c.log('Error: ' + e);
- }
- }
- }
-
- c.init();
-}());
diff --git a/src/drivers/chrome/js/defaults.js b/src/drivers/chrome/js/defaults.js
deleted file mode 100644
index 3ec2d3e09..000000000
--- a/src/drivers/chrome/js/defaults.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defaults = {
- autoAnalyzeHeaders: 0,
- upgradeMessage: 1,
- tracking: 1
-};
diff --git a/src/drivers/chrome/js/driver.js b/src/drivers/chrome/js/driver.js
deleted file mode 100644
index d2ec6ae29..000000000
--- a/src/drivers/chrome/js/driver.js
+++ /dev/null
@@ -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 ( var 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 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/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();
-}());
diff --git a/src/drivers/chrome/js/i18n.js b/src/drivers/chrome/js/i18n.js
deleted file mode 100644
index 2f11efbc5..000000000
--- a/src/drivers/chrome/js/i18n.js
+++ /dev/null
@@ -1,12 +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);
- }
- }
-});
diff --git a/src/drivers/chrome/js/inject.js b/src/drivers/chrome/js/inject.js
deleted file mode 100644
index 2a8856596..000000000
--- a/src/drivers/chrome/js/inject.js
+++ /dev/null
@@ -1,15 +0,0 @@
-(function() {
- try {
- var i, environmentVars,
- e = document.createEvent('Events');
-
- e.initEvent('wappalyzerEvent', true, false);
-
- for ( i in window ) {
- environmentVars += i + ' ';
- }
-
- document.getElementById('wappalyzerData').appendChild(document.createComment(environmentVars));
- document.getElementById('wappalyzerData').dispatchEvent(e);
- } catch(e) { }
-}());
diff --git a/src/drivers/chrome/js/options.js b/src/drivers/chrome/js/options.js
deleted file mode 100644
index 92d1fe3f7..000000000
--- a/src/drivers/chrome/js/options.js
+++ /dev/null
@@ -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 ( var option in options.opts ) {
- if ( localStorage[option] ) {
- options.opts[option] = localStorage[option];
- }
- }
-
- 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();
-});
diff --git a/src/drivers/chrome/js/popup.js b/src/drivers/chrome/js/popup.js
deleted file mode 100644
index e3afa610a..000000000
--- a/src/drivers/chrome/js/popup.js
+++ /dev/null
@@ -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(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
- };
-
- 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 = '' + chrome.i18n.getMessage('noAppsDetected') + '
';
- } else {
- detectedApps.innerHTML = '' + chrome.i18n.getMessage('nothingToDo') + '
';
- }
- });
-
- 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;
-
- var html =
- '';
-
- detectedApps.innerHTML = detectedApps.innerHTML + html;
- }
- }
- });
- });
- }
- };
-
- popup.init();
-});
diff --git a/src/drivers/chrome/manifest.json b/src/drivers/chrome/manifest.json
deleted file mode 100644
index 2542cc790..000000000
--- a/src/drivers/chrome/manifest.json
+++ /dev/null
@@ -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.52",
- "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'"
-}
diff --git a/src/drivers/chrome/options.html b/src/drivers/chrome/options.html
deleted file mode 100644
index 1df81d498..000000000
--- a/src/drivers/chrome/options.html
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
- Wappalyzer Options
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/drivers/chrome/popup.html b/src/drivers/chrome/popup.html
deleted file mode 100644
index 2412d04ac..000000000
--- a/src/drivers/chrome/popup.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
Popup
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/drivers/firefox b/src/drivers/firefox
new file mode 100644
index 000000000..8eb4f289f
--- /dev/null
+++ b/src/drivers/firefox
@@ -0,0 +1,524 @@
+/**
+ * Wappalyzer v2
+ *
+ * Created by Elbert Alias
+ *
+ * License: GPLv3 http://www.gnu.org/licenses/gpl-3.0.txt
+ */
+
+var wappalyzer = (function() {
+ //'use strict';
+
+ /**
+ * Application class
+ */
+ var Application = function(app, detected) {
+ this.app = app;
+ this.confidence = {};
+ this.confidenceTotal = 0;
+ this.detected = Boolean(detected);
+ this.excludes = [];
+ this.version = '';
+ this.versions = [];
+ };
+
+ Application.prototype = {
+ /**
+ * Calculate confidence total
+ */
+ getConfidence: function() {
+ var total = 0, id;
+
+ for ( id in this.confidence ) {
+ total += this.confidence[id];
+ }
+
+ return this.confidenceTotal = Math.min(total, 100);
+ },
+
+ /**
+ * Resolve version number (find the longest version number that contains all shorter detected version numbers)
+ */
+ getVersion: function() {
+ var i, resolved;
+
+ if ( !this.versions.length ) {
+ return;
+ }
+
+ this.versions.sort(function(a, b) {
+ return a.length - b.length;
+ });
+
+ resolved = this.versions[0];
+
+ for ( i = 1; i < this.versions.length; i++ ) {
+ if ( this.versions[i].indexOf(resolved) === -1 ) {
+ break;
+ }
+
+ resolved = this.versions[i];
+ }
+
+ return this.version = resolved;
+ },
+
+ setDetected: function(pattern, type, value, key) {
+ this.detected = true;
+
+ // Set confidence level
+ this.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100;
+
+ // Detect version number
+ if ( pattern.version ) {
+ var
+ version = pattern.version,
+ matches = pattern.regex.exec(value);
+
+ if ( matches ) {
+ matches.forEach(function(match, i) {
+ // Parse ternary operator
+ var ternary = new RegExp('\\\\' + i + '\\?([^:]+):(.*)$').exec(version);
+
+ if ( ternary && ternary.length === 3 ) {
+ w.log({ match: match, i: i, ternary: ternary });
+
+ version = version.replace(ternary[0], match ? ternary[1] : ternary[2]);
+
+ w.log({ version: version });
+ }
+
+ // Replace back references
+ version = version.replace(new RegExp('\\\\' + i, 'g'), match ? match : '');
+ });
+
+ if ( version && this.versions.indexOf(version) < 0 ) {
+ this.versions.push(version);
+ }
+
+ this.getVersion();
+ }
+ }
+ }
+ };
+
+ var Profiler = function() {
+ this.regexCount = 0;
+ this.startTime = new Date().getTime();
+ this.lastTime = new Date().getTime();
+ this.slowest = { duration: null, app: '', type: '', pattern: '' };
+ this.timedOut = false;
+ };
+
+ Profiler.prototype = {
+ checkPoint: function(app, type, regex) {
+ var duration = new Date().getTime() - this.lastTime;
+
+ if ( !this.slowest.duration || duration > this.slowest.duration ) {
+ this.slowest.duration = duration;
+ this.slowest.app = app;
+ this.slowest.type = type;
+ this.slowest.regex = regex;
+ }
+
+ this.regexCount++;
+
+ this.lastTime = new Date().getTime();
+
+ this.timedOut = this.lastTime - this.startTime > w.driver.timeout;
+ }
+ };
+
+ /**
+ * Call driver functions
+ */
+ var driver = function(func, args) {
+ if ( typeof w.driver[func] !== 'function' ) {
+ w.log('not implemented: w.driver.' + func, 'warn');
+
+ return;
+ }
+
+ if ( func !== 'log' ) {
+ w.log('w.driver.' + func);
+ }
+
+ return w.driver[func](args);
+ };
+
+ /**
+ * Parse apps.json patterns
+ */
+ var parse = function(patterns) {
+ var
+ attrs,
+ parsed = [];
+
+ // Convert single patterns to an array
+ if ( typeof patterns === 'string' ) {
+ patterns = [ patterns ];
+ }
+
+ patterns.forEach(function(pattern) {
+ attrs = {};
+
+ pattern.split('\\;').forEach(function(attr, i) {
+ if ( i ) {
+ // Key value pairs
+ attr = attr.split(':');
+
+ if ( attr.length > 1 ) {
+ attrs[attr.shift()] = attr.join(':');
+ }
+ } else {
+ attrs.string = attr;
+
+ try {
+ attrs.regex = new RegExp(attr.replace('/', '\/'), 'i'); // Escape slashes in regular expression
+ } catch (e) {
+ attrs.regex = new RegExp();
+
+ w.log(e + ': ' + attr, 'error');
+ }
+ }
+ });
+
+ parsed.push(attrs);
+ });
+
+ return parsed;
+ };
+
+ /**
+ * Main script
+ */
+ var w = {
+ apps: {},
+ cats: null,
+ ping: { hostnames: {} },
+ adCache: [],
+ detected: {},
+
+ config: {
+ websiteURL: 'https://wappalyzer.com/',
+ twitterURL: 'https://twitter.com/Wappalyzer',
+ githubURL: 'https://github.com/AliasIO/Wappalyzer',
+ },
+
+ /**
+ * Log messages to console
+ */
+ log: function(message, type) {
+ if ( type === undefined ) {
+ type = 'debug';
+ }
+
+ if ( typeof message === 'object' ) {
+ message = JSON.stringify(message);
+ }
+
+ driver('log', { message: message, type: type });
+ },
+
+ /**
+ * Initialize
+ */
+ init: function() {
+ w.log('w.init');
+
+ // Checks
+ if ( w.driver === undefined ) {
+ w.log('no driver, exiting');
+
+ return;
+ }
+
+ // Initialize driver
+ driver('init');
+ },
+
+ /**
+ * Analyze the request
+ */
+ analyze: function(hostname, url, data) {
+ var
+ i, app, confidence, type, regexMeta, regexScript, match, content, meta, header, version, id,
+ profiler = new Profiler(),
+ apps = {},
+ excludes = [],
+ checkImplies = true;
+
+ w.log('w.analyze');
+
+ // Remove hash from URL
+ data.url = url = url.split('#')[0];
+
+ if ( w.apps === undefined || w.categories === undefined ) {
+ w.log('apps.json not loaded, check for syntax errors');
+
+ return;
+ }
+
+ if ( w.detected[url] === undefined ) {
+ w.detected[url] = {};
+ }
+
+ for ( app in w.apps ) {
+ // Exit loop after one second to prevent CPU hogging
+ // Remaining patterns will not be evaluated
+ if ( profiler.timedOut ) {
+ w.log('Timeout, exiting loop');
+
+ break;
+ }
+
+ apps[app] = w.detected[url] && w.detected[url][app] ? w.detected[url][app] : new Application(app);
+
+ for ( type in w.apps[app] ) {
+ switch ( type ) {
+ case 'url':
+ parse(w.apps[app][type]).forEach(function(pattern) {
+ if ( pattern.regex.test(url) ) {
+ apps[app].setDetected(pattern, type, url);
+ }
+
+ profiler.checkPoint(app, type, pattern.regex);
+ });
+
+ break;
+ case 'html':
+ if ( typeof data[type] !== 'string' || !data.html ) {
+ break;
+ }
+
+ parse(w.apps[app][type]).forEach(function(pattern) {
+ if ( pattern.regex.test(data[type]) ) {
+ apps[app].setDetected(pattern, type, data[type]);
+ }
+
+ profiler.checkPoint(app, type, pattern.regex);
+ });
+
+ break;
+ case 'script':
+ if ( typeof data.html !== 'string' || !data.html ) {
+ break;
+ }
+
+ regexScript = new RegExp('