From 09b5317a0cae5cedee18c9f0b7a2a4f9a1efeecc Mon Sep 17 00:00:00 2001 From: Pouzor Date: Fri, 27 Mar 2026 18:01:43 +0100 Subject: [PATCH] fix: thread-safe signature loading, clear missing-file error, restrict CORS methods --- backend/app/main.py | 4 ++-- backend/app/services/fingerprint.py | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/backend/app/main.py b/backend/app/main.py index faa61b7..9767ec6 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -30,8 +30,8 @@ app.add_middleware( CORSMiddleware, allow_origins=settings.cors_origins, allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], + allow_methods=["GET", "POST", "PUT", "PATCH", "DELETE"], + allow_headers=["Authorization", "Content-Type"], ) app.include_router(auth.router, prefix="/api/v1/auth", tags=["auth"]) diff --git a/backend/app/services/fingerprint.py b/backend/app/services/fingerprint.py index 8457eae..e6c9700 100644 --- a/backend/app/services/fingerprint.py +++ b/backend/app/services/fingerprint.py @@ -1,18 +1,28 @@ """Match nmap scan results against service_signatures.json.""" import json import re +import threading from pathlib import Path from typing import Any _SIGNATURES: list[dict[str, Any]] | None = None +_LOCK = threading.Lock() def _load() -> list[dict[str, Any]]: global _SIGNATURES if _SIGNATURES is None: - path = Path(__file__).parent.parent / "data" / "service_signatures.json" - with open(path) as f: - _SIGNATURES = json.load(f) + with _LOCK: + if _SIGNATURES is None: + path = Path(__file__).parent.parent / "data" / "service_signatures.json" + try: + with open(path) as f: + _SIGNATURES = json.load(f) + except FileNotFoundError as err: + raise FileNotFoundError( + f"service_signatures.json not found at {path}. " + "This file should be bundled with the application." + ) from err return _SIGNATURES