"""B8 — CMP-Provider-Fingerprint-Check. Findings wenn: - Cookie-Banner wurde erkannt (banner_result.detected=True) - Aber CMP-Provider/Vendor nicht ableitbar (provider in {Generic, "", "?"}) Das ist nach EDPB-Taskforce-Methodik MEDIUM: ohne klare CMP-Identität ist schwer zu beurteilen, welches Consent-Storage-Format greift, ob TCF unterstützt wird, und wie der DSB mit dem CMP-Anbieter kommunizieren kann (Audit-Trail / DPA). Provider-Detection läuft schon im consent-tester. Hier nur die Lückenmeldung wenn der Banner zwar steht aber der Anbieter offen bleibt. """ from __future__ import annotations import logging logger = logging.getLogger(__name__) _KNOWN_PROVIDERS = ( "usercentrics", "onetrust", "cookiebot", "cookiepro", "sourcepoint", "consentmanager", "klaro!", "borlabs", "iubenda", "didomi", "trustarc", "complianz", ) def check_cmp_fingerprint(state: dict) -> dict | None: br = state.get("banner_result") or {} detected = br.get("detected") or br.get("banner_detected") if not detected: return None provider = (br.get("provider") or br.get("banner_provider") or "").lower() is_known = any(k in provider for k in _KNOWN_PROVIDERS) if is_known: return None # Banner steht, aber CMP-Provider ist generisch oder leer. finding = { "check_id": "COOKIE-CONSENT-UX-002", "severity": "MEDIUM", "severity_reason": "incomplete", "title": "Cookie-Banner erkannt, aber CMP-Provider nicht eindeutig", "norm": "EDPB Cookie Banner Taskforce-Report (Transparenz CMP)", "detected_provider": provider or "—", "action": ( "CMP-Provider in der DSE benennen (Auftragsverarbeiter), " "Consent-Storage-Format dokumentieren (TCF / proprietär), " "und Audit-Trail-Zugang für den DSB sicherstellen." ), } logger.info("B8 CMP-fingerprint: detected_provider=%r is generic", provider) return finding