Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions plugins/waf_detector/metadata.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"id": "waf_detector",
"name": "WAF Detector",
"name": "WAF Detection Scanner",
"version": "1.0.0",
"description": "Automatically identify Web Application Firewalls protecting targets.",
"long_description": "Automatically identify Web Application Firewalls protecting targets.",
Expand All @@ -10,7 +10,7 @@
"email": "dev@secuscan.local"
},
"license": "MIT",
"icon": "\ud83d\udee0\ufe0f",
"icon": "🛠️",
"engine": {
"type": "cli",
"binary": "wafw00f"
Expand Down Expand Up @@ -54,5 +54,5 @@
"python_packages": [],
"system_packages": []
},
"checksum": "1e3dfcf6d4ba7847e398b9d9a4709dc275092f52a5f405e63d65cea0f8389cc0"
"checksum": "60b54af15ff7bad498a02cdbf08ee8611622e117944a3a65301cb3cae1582bb2"
}
37 changes: 37 additions & 0 deletions testing/backend/unit/test_plugin_integrity.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import asyncio
import json
from collections import defaultdict
from pathlib import Path

import pytest

from backend.secuscan.plugins import PluginManager
from backend.secuscan.config import settings

Expand All @@ -18,3 +21,37 @@ def test_plugins_have_checksums():
for path in metadata_files:
data = json.loads(path.read_text(encoding="utf-8"))
assert data.get("checksum"), f"Missing checksum in {path}"


def test_plugin_metadata_ids_and_names_are_unique():
metadata_files = list(Path(settings.plugins_dir).glob("*/metadata.json"))
assert metadata_files, "Expected plugin metadata files"

ids = defaultdict(list)
names = defaultdict(list)

for path in metadata_files:
data = json.loads(path.read_text(encoding="utf-8"))
plugin_id = data.get("id")
plugin_name = data.get("name")
assert plugin_id, f"Missing plugin id in {path}"
assert plugin_name, f"Missing plugin name in {path}"

ids[plugin_id].append(path.parent.name)
names[plugin_name].append(path.parent.name)

duplicate_ids = {plugin_id: folders for plugin_id, folders in ids.items() if len(folders) > 1}
duplicate_names = {plugin_name: folders for plugin_name, folders in names.items() if len(folders) > 1}

if duplicate_ids or duplicate_names:
messages = []
if duplicate_ids:
messages.append("Duplicate plugin IDs found:")
for plugin_id, folders in sorted(duplicate_ids.items()):
messages.append(f" {plugin_id}: {', '.join(sorted(folders))}")
if duplicate_names:
messages.append("Duplicate plugin display names found:")
for plugin_name, folders in sorted(duplicate_names.items()):
messages.append(f" {plugin_name}: {', '.join(sorted(folders))}")

pytest.fail("\n".join(messages))
Loading