diff --git a/bin/wappalyzer-build b/bin/wappalyzer-build
index 215525196..686134a10 100755
--- a/bin/wappalyzer-build
+++ b/bin/wappalyzer-build
@@ -16,6 +16,10 @@ then
exit 1
fi
+echo "Prettifying apps.json..."
+
+jsonlint -ist $'\t' $WAPPALYZER_ROOT/src/apps.json
+
wappalyzer links
# Mozilla Firefox
diff --git a/bin/wappalyzer-validate b/bin/wappalyzer-validate
index 97bdf40a2..df05aeb83 100755
--- a/bin/wappalyzer-validate
+++ b/bin/wappalyzer-validate
@@ -31,7 +31,7 @@ echo "Validating apps.json..."
echo -en "${color_err}"
-jsonlint --quiet $path/apps.json
+jsonlint --quiet -V $WAPPALYZER_ROOT/schema.json $path/apps.json
if [ $? -eq 0 ]
then
diff --git a/schema.json b/schema.json
new file mode 100644
index 000000000..8ac030fc8
--- /dev/null
+++ b/schema.json
@@ -0,0 +1,82 @@
+{
+ "title": "Wappalyzer Schema",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "categories": {
+ "type": "object",
+ "required": true,
+ "additionalProperties": false,
+ "patternProperties": {
+ "^[0-9]+$": {
+ "type": "string"
+ }
+ }
+ },
+ "apps": {
+ "type": "object",
+ "required": true,
+ "additionalProperties": {
+ "additionalProperties": false,
+ "properties": {
+ "cats": {
+ "type": "array",
+ "items": {
+ "type": "number"
+ },
+ "required": true
+ },
+ "env": {
+ "type": [ "string", "array" ],
+ "items": {
+ "type": "string"
+ }
+ },
+ "headers": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "html": {
+ "type": [ "string", "array" ],
+ "items": {
+ "type": "string"
+ }
+ },
+ "excludes": {
+ "type": [ "string", "array" ],
+ "items": {
+ "type": "string"
+ }
+ },
+ "implies": {
+ "type": [ "string", "array" ],
+ "items": {
+ "type": "string"
+ }
+ },
+ "meta": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "script": {
+ "type": [ "string", "array" ],
+ "items": {
+ "type": "string"
+ }
+ },
+ "url": {
+ "type": "string"
+ },
+ "website": {
+ "type": "string",
+ "required": true
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/apps.json b/src/apps.json
index caa0f2286..96aa9224b 100755
--- a/src/apps.json
+++ b/src/apps.json
@@ -1,4374 +1,7061 @@
{
- "categories": {
- "1": "cms",
- "2": "message-boards",
- "3": "database-managers",
- "4": "documentation-tools",
- "5": "widgets",
- "6": "ecommerce",
- "7": "photo-galleries",
- "8": "wikis",
- "9": "hosting-panels",
- "10": "analytics",
- "11": "blogs",
- "12": "javascript-frameworks",
- "13": "issue-trackers",
- "14": "video-players",
- "15": "comment-systems",
- "16": "captchas",
- "17": "font-scripts",
- "18": "web-frameworks",
- "19": "miscellaneous",
- "20": "editors",
- "21": "lms",
- "22": "web-servers",
- "23": "cache-tools",
- "24": "rich-text-editors",
- "25": "javascript-graphics",
- "26": "mobile-frameworks",
- "27": "programming-languages",
- "28": "operating-systems",
- "29": "search-engines",
- "30": "web-mail",
- "31": "cdn",
- "32": "marketing-automation",
- "33": "web-server-extensions",
- "34": "databases",
- "35": "maps",
- "36": "advertising-networks",
- "37": "network-devices",
- "38": "media-servers",
- "39": "webcams",
- "40": "printers",
- "41": "payment-processors",
- "42": "tag-managers",
- "43": "paywalls",
- "44": "build-ci-systems",
- "45": "control-systems",
- "46": "remote-access",
- "47": "dev-tools",
- "48": "network-storage",
- "49": "feed-readers",
- "50": "document-management-systems"
- },
"apps": {
"1C-Bitrix": {
- "website": "www.1c-bitrix.ru",
- "cats": [ 1 ],
- "headers": { "X-Powered-CMS": "Bitrix Site Manager", "Set-Cookie": "BITRIX_" },
+ "cats": [
+ 1
+ ],
+ "headers": {
+ "Set-Cookie": "BITRIX_",
+ "X-Powered-CMS": "Bitrix Site Manager"
+ },
"html": "(?:]+components/bitrix|(?:src|href)=\"/bitrix/(?:js|templates))",
+ "implies": "PHP",
"script": "1c-bitrix",
- "implies": "PHP"
+ "website": "www.1c-bitrix.ru"
},
"1und1": {
- "website": "1und1.de",
- "cats": [ 6 ],
+ "cats": [
+ 6
+ ],
+ "implies": "PHP",
"url": "/shop/catalog/browse\\?sessid=",
- "implies": "PHP"
+ "website": "1und1.de"
},
"2z Project": {
- "website": "2zproject-cms.ru",
- "cats": [ 1 ],
- "meta": { "generator": "2z project ([\\d.]+)\\;version:\\1" }
- },
- "3dCart": {
- "website": "www.3dcart.com",
- "cats": [ 1, 6 ],
- "headers": { "X-Powered-By": "3DCART" },
- "script": "(?:twlh(?:track)?\\.asp|3d_upsell\\.js)"
+ "cats": [
+ 1
+ ],
+ "meta": {
+ "generator": "2z project ([\\d.]+)\\;version:\\1"
+ },
+ "website": "2zproject-cms.ru"
},
"3DM": {
- "website": "www.3ware.com",
- "cats": [ 19 ],
+ "cats": [
+ 19
+ ],
"html": "
3ware 3DM([\\d\\.]+)?\\;version:\\1",
- "implies": "3ware"
+ "implies": "3ware",
+ "website": "www.3ware.com"
+ },
+ "3dCart": {
+ "cats": [
+ 1,
+ 6
+ ],
+ "headers": {
+ "X-Powered-By": "3DCART"
+ },
+ "script": "(?:twlh(?:track)?\\.asp|3d_upsell\\.js)",
+ "website": "www.3dcart.com"
},
"3ware": {
- "website": "www.3ware.com",
- "cats": [ 22 ],
- "headers": { "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1" }
+ "cats": [
+ 22
+ ],
+ "headers": {
+ "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1"
+ },
+ "website": "www.3ware.com"
+ },
+ "AMPcms": {
+ "cats": [
+ 1
+ ],
+ "env": "^amp_js_init$",
+ "headers": {
+ "Set-Cookie": "^AMP=",
+ "X-AMP-Version": "([\\d.]+)\\;version:\\1"
+ },
+ "implies": "PHP",
+ "website": "www.ampcms.org"
+ },
+ "AOLserver": {
+ "cats": [
+ 22
+ ],
+ "headers": {
+ "Server": "AOLserver/?([\\d.]+)?\\;version:\\1"
+ },
+ "website": "aolserver.com"
+ },
+ "AT Internet Analyzer": {
+ "cats": [
+ 10
+ ],
+ "env": "^xtsite$",
+ "website": "atinternet.com/en"
+ },
+ "AT Internet XiTi": {
+ "cats": [
+ 10
+ ],
+ "env": "^Xt_",
+ "script": "xiti\\.com/hit\\.xiti",
+ "website": "atinternet.com/en"
+ },
+ "ATEN": {
+ "cats": [
+ 22
+ ],
+ "headers": {
+ "Server": "ATEN HTTP Server(?:\\(?V?([\\d\\.]+)\\)?)?\\;version:\\1"
+ },
+ "website": "www.aten.com"
+ },
+ "ATG Web Commerce": {
+ "cats": [
+ 6
+ ],
+ "headers": {
+ "X-ATG-Version": "(?:ATGPlatform/([\\d.]+))?\\;version:\\1"
+ },
+ "html": "<[^>]+_DARGS",
+ "website": "oracle.com/us/products/applications/web-commerce/atg"
+ },
+ "AWStats": {
+ "cats": [
+ 10
+ ],
+ "implies": "Perl",
+ "meta": {
+ "generator": "AWStats ([\\d.]+(?: \\(build [\\d.]+\\))?)\\;version:\\1"
+ },
+ "website": "awstats.sourceforge.net"
},
"Accessible Portal": {
- "website": "www.accessibleportal.com",
- "cats": [ 1 ],
- "meta": { "generator": "Accessible Portal" },
- "implies": "PHP"
+ "cats": [
+ 1
+ ],
+ "implies": "PHP",
+ "meta": {
+ "generator": "Accessible Portal"
+ },
+ "website": "www.accessibleportal.com"
+ },
+ "AdInfinity": {
+ "cats": [
+ 36
+ ],
+ "script": "adinfinity\\.com\\.au",
+ "website": "adinfinity.com.au"
+ },
+ "AdRiver": {
+ "cats": [
+ 36
+ ],
+ "env": "^adriver$",
+ "html": "(?: