Upload files to "tests"
This commit is contained in:
@@ -0,0 +1,78 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import tempfile
|
||||||
|
import threading
|
||||||
|
import unittest
|
||||||
|
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
||||||
|
|
||||||
|
from redflare.core.models import Target
|
||||||
|
from redflare.core.runner import Runner
|
||||||
|
from redflare.core.storage import RunStore
|
||||||
|
from redflare.modules.base import ModuleContext
|
||||||
|
from redflare.modules.headers import HeaderModule
|
||||||
|
from redflare.modules.paths import PathDiscoveryModule
|
||||||
|
|
||||||
|
|
||||||
|
class FixtureHandler(BaseHTTPRequestHandler):
|
||||||
|
def do_GET(self):
|
||||||
|
if self.path == "/admin":
|
||||||
|
body = b"admin dashboard"
|
||||||
|
self.send_response(200)
|
||||||
|
elif self.path == "/":
|
||||||
|
body = b"fixture home"
|
||||||
|
self.send_response(200)
|
||||||
|
else:
|
||||||
|
body = b"not found"
|
||||||
|
self.send_response(404)
|
||||||
|
self.send_header("Content-Type", "text/plain")
|
||||||
|
self.send_header("Content-Length", str(len(body)))
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(body)
|
||||||
|
|
||||||
|
def log_message(self, *_):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
class IntegrationTests(unittest.TestCase):
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
cls.server = ThreadingHTTPServer(("127.0.0.1", 0), FixtureHandler)
|
||||||
|
cls.thread = threading.Thread(target=cls.server.serve_forever, daemon=True)
|
||||||
|
cls.thread.start()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
cls.server.shutdown()
|
||||||
|
cls.server.server_close()
|
||||||
|
|
||||||
|
def test_web_pipeline_and_correlation(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
url = f"http://127.0.0.1:{self.server.server_port}"
|
||||||
|
target = Target(url, "127.0.0.1", "http", self.server.server_port)
|
||||||
|
store = RunStore(directory, "run_fixture")
|
||||||
|
context = ModuleContext(store.run_id, store.artifacts, timeout=2, rate=0, max_paths=20)
|
||||||
|
results, summary = Runner(
|
||||||
|
store,
|
||||||
|
[HeaderModule(), PathDiscoveryModule()],
|
||||||
|
context,
|
||||||
|
workers=2,
|
||||||
|
).run([target])
|
||||||
|
categories = {
|
||||||
|
finding.category for result in results for finding in result.findings
|
||||||
|
}
|
||||||
|
self.assertIn("security-headers", categories)
|
||||||
|
self.assertIn("discovered-path", categories)
|
||||||
|
self.assertIn("exposed-surface", categories)
|
||||||
|
self.assertGreaterEqual(summary["findings"], 3)
|
||||||
|
self.assertTrue((store.root / "report.html").exists())
|
||||||
|
self.assertTrue((store.root / "summary.json").exists())
|
||||||
|
self.assertTrue((store.root / "attack_surface.json").exists())
|
||||||
|
self.assertTrue((store.root / "test_registry.json").exists())
|
||||||
|
report = (store.root / "report.html").read_text(encoding="utf-8")
|
||||||
|
self.assertIn("HTTP HEADERS ASSESSMENT", report)
|
||||||
|
self.assertIn("PATH DISCOVERY ASSESSMENT", report)
|
||||||
|
self.assertIn("missing_security_headers", report)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
Reference in New Issue
Block a user