feat(banner): Consent-Historie/Widerruf live erkennen (Borlabs-Stil, #62)

consent_history.detect_consent_history: erkennt CMP-Anbieter (Borlabs/
Usercentrics/OneTrust/Cookiebot/…) aus Storage+Cookies, versionierten Consent
(historie-fähig) + dauerhaftes Widerruf-/Einstellungs-Widget. consent_scanner
ruft es in Phase A; scan_matrix_summary surft summary.consent_history;
browser_cross_finding: positiver Befund wenn vorhanden, sonst Best-Practice-LOW
(„Nutzer sehen, wann sie welcher Version zugestimmt haben"); BrowserBehaviorView
zeigt es im Engine-Detail. Tests: 7 (classify/versioned) + 2 Cross-Finding.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-13 16:38:38 +02:00
parent 8d0da710d5
commit d92dd3b5fc
7 changed files with 208 additions and 4 deletions
@@ -81,6 +81,9 @@ class ConsentTestResult:
# Backend embedded das als <img> in der Mail — visueller Beweis
# "so sah das Banner zum Audit-Zeitpunkt aus".
banner_screenshot_b64: str = ""
# #62: Consent-Historie/Widerruf (Borlabs-Stil) — Provider, versionierter
# Consent (historie-fähig), dauerhaftes Widerruf-Widget.
consent_history: dict = field(default_factory=dict)
def _apply_edge_case_findings(result, url: str = "") -> None:
@@ -274,6 +277,13 @@ async def run_consent_test(
except Exception as _se:
logger.warning("P85: banner screenshot failed: %s", _se)
# #62: Consent-Historie/Widerruf (Borlabs-Stil) erkennen.
try:
from services.consent_history import detect_consent_history
result.consent_history = await detect_consent_history(page_a)
except Exception as _che:
logger.warning("consent-history detection failed: %s", _che)
await ctx_a.close()
if not banner.detected: